network: Change the service disconnect state when necessary
authorJukka Rissanen <jukka.rissanen@linux.intel.com>
Wed, 24 Aug 2011 14:01:57 +0000 (17:01 +0300)
committerSamuel Ortiz <sameo@linux.intel.com>
Mon, 12 Sep 2011 09:40:46 +0000 (11:40 +0200)
If we are in idle or failure states, then we should not change to
disconnect state when the service is disconnected. This is because we
were not connected in the first place.

src/network.c

index d360282..5fdc43c 100644 (file)
@@ -1058,6 +1058,7 @@ static gboolean set_connected(gpointer user_data)
 
        } else {
                struct connman_service *service;
+               enum connman_service_state state;
 
                __connman_device_set_network(network->device, NULL);
 
@@ -1075,11 +1076,24 @@ static gboolean set_connected(gpointer user_data)
                        break;
                }
 
-               __connman_service_ipconfig_indicate_state(service,
+               /*
+                * We only set the disconnect state if we were not in idle
+                * or in failure. It does not make sense to go to disconnect
+                * state if we were not connected.
+                */
+               state = __connman_service_ipconfig_get_state(service,
+                                               CONNMAN_IPCONFIG_TYPE_IPV4);
+               if (state != CONNMAN_SERVICE_STATE_IDLE &&
+                                       state != CONNMAN_SERVICE_STATE_FAILURE)
+                       __connman_service_ipconfig_indicate_state(service,
                                        CONNMAN_SERVICE_STATE_DISCONNECT,
                                        CONNMAN_IPCONFIG_TYPE_IPV4);
 
-               __connman_service_ipconfig_indicate_state(service,
+               state = __connman_service_ipconfig_get_state(service,
+                                               CONNMAN_IPCONFIG_TYPE_IPV6);
+               if (state != CONNMAN_SERVICE_STATE_IDLE &&
+                                       state != CONNMAN_SERVICE_STATE_FAILURE)
+                       __connman_service_ipconfig_indicate_state(service,
                                        CONNMAN_SERVICE_STATE_DISCONNECT,
                                        CONNMAN_IPCONFIG_TYPE_IPV6);