Maintain connection status when wifi roaming
[platform/upstream/connman.git] / src / service.c
index 794555e..356a218 100755 (executable)
@@ -3196,7 +3196,7 @@ static void disconnection_requested_changed(struct connman_service *service)
 }
 
 void connman_service_set_disconnection_requested(struct connman_service *service,
-                                                bool disconnection_requested)
+                                               bool disconnection_requested)
 {
        if (service == NULL)
                return;
@@ -3204,6 +3204,47 @@ void connman_service_set_disconnection_requested(struct connman_service *service
        service->disconnection_requested = disconnection_requested;
        disconnection_requested_changed(service);
 }
+
+static void connman_service_emit_state(struct connman_service *service,
+                                               enum connman_service_state state)
+{
+       const char *str;
+       enum connman_service_state cur_state = service->state;
+
+       if (service->state != state)
+               service->state = state;
+
+       str = state2string(service->state);
+       if (!str) {
+               service->state = cur_state;
+               return;
+       }
+
+       DBG(" %s, %s", str, service->path);
+
+       connman_dbus_property_changed_basic(service->path,
+                               CONNMAN_SERVICE_INTERFACE, "State",
+                                               DBUS_TYPE_STRING, &str);
+
+       emit_state_changed_with_properties(service);
+       service->state = cur_state;
+}
+
+void connman_service_notify_reconnection(struct connman_service *service)
+{
+       if (!service)
+               return;
+
+       if (service->state != CONNMAN_SERVICE_STATE_READY &&
+                       service->state != CONNMAN_SERVICE_STATE_ONLINE)
+               return;
+
+       connman_service_emit_state(service, CONNMAN_SERVICE_STATE_CONFIGURATION);
+       connman_service_emit_state(service, CONNMAN_SERVICE_STATE_READY);
+
+       if (service->state == CONNMAN_SERVICE_STATE_ONLINE)
+               connman_service_emit_state(service, CONNMAN_SERVICE_STATE_ONLINE);
+}
 #endif
 
 static void strength_changed(struct connman_service *service)
@@ -9147,6 +9188,50 @@ static void set_priority_connected_service(void)
 #endif
        }
 }
+
+static void emit_wifi_roaming_failure(struct connman_service *service,
+                                       enum connman_service_state new_state)
+{
+       if (connman_setting_get_bool("WifiRoaming") &&
+                       connman_network_get_bool(service->network, "WiFi.Roaming")) {
+               const char *cur_bssid;
+               const char *dst_bssid;
+               const char *ifname;
+               struct connman_device *device;
+
+               device = connman_network_get_device(service->network);
+               if (device) {
+                       ifname = connman_device_get_string(device, "Interface");
+                       cur_bssid = connman_network_get_string(service->network,
+                                               "WiFi.RoamingCurBSSID");
+                       dst_bssid = connman_network_get_string(service->network,
+                                               "WiFi.RoamingDstBSSID");
+               }
+
+               if (device && ifname && cur_bssid && dst_bssid) {
+                       switch(new_state) {
+                       case CONNMAN_SERVICE_STATE_UNKNOWN:
+                       case CONNMAN_SERVICE_STATE_ASSOCIATION:
+                       case CONNMAN_SERVICE_STATE_CONFIGURATION:
+                       case CONNMAN_SERVICE_STATE_READY:
+                       case CONNMAN_SERVICE_STATE_ONLINE:
+                               break;
+                       case CONNMAN_SERVICE_STATE_DISCONNECT:
+                       case CONNMAN_SERVICE_STATE_FAILURE:
+                       case CONNMAN_SERVICE_STATE_IDLE:
+                               __connman_technology_notify_roaming_state(ifname,
+                                               "failure", cur_bssid, dst_bssid);
+                               connman_network_set_bool(service->network,
+                                               "WiFi.Roaming", false);
+                               connman_network_set_string(service->network,
+                                               "WiFi.RoamingCurBSSID", NULL);
+                               connman_network_set_string(service->network,
+                                               "WiFi.RoamingDstBSSID", NULL);
+                               break;
+                       }
+               }
+       }
+}
 #endif
 
 static const char *get_dbus_sender(struct connman_service *service)
@@ -9353,6 +9438,8 @@ static int service_indicate_state(struct connman_service *service)
                proxy_changed(service);
 #if defined TIZEN_EXT
                }
+
+               emit_wifi_roaming_failure(service, new_state);
 #endif
 
                /*
@@ -9393,55 +9480,7 @@ static int service_indicate_state(struct connman_service *service)
 #else
        __connman_service_connect_default(service);
 #endif
-       /* Update Wi-Fi Roaming result */
-       if (connman_setting_get_bool("WifiRoaming") &&
-                       connman_network_get_bool(service->network, "WiFi.Roaming")) {
-               const char *cur_bssid;
-               const char *dst_bssid;
-               const char *ifname;
-               struct connman_device *device;
-
-               device = connman_network_get_device(service->network);
-               if (device) {
-                       ifname = connman_device_get_string(device, "Interface");
-                       cur_bssid = connman_network_get_string(service->network,
-                                               "WiFi.RoamingCurBSSID");
-                       dst_bssid = connman_network_get_string(service->network,
-                                               "WiFi.RoamingDstBSSID");
-               }
-
-               if (device && ifname && cur_bssid && dst_bssid) {
-                       switch(new_state) {
-                       case CONNMAN_SERVICE_STATE_UNKNOWN:
-                       case CONNMAN_SERVICE_STATE_ASSOCIATION:
-                       case CONNMAN_SERVICE_STATE_CONFIGURATION:
-                               break;
-                       case CONNMAN_SERVICE_STATE_READY:
-                       case CONNMAN_SERVICE_STATE_ONLINE:
-                               __connman_technology_notify_roaming_state(ifname,
-                                               "success", cur_bssid, dst_bssid);
-                               connman_network_set_bool(service->network,
-                                               "WiFi.Roaming", false);
-                               connman_network_set_string(service->network,
-                                               "WiFi.RoamingCurBSSID", NULL);
-                               connman_network_set_string(service->network,
-                                               "WiFi.RoamingDstBSSID", NULL);
-                               break;
-                       case CONNMAN_SERVICE_STATE_DISCONNECT:
-                       case CONNMAN_SERVICE_STATE_FAILURE:
-                       case CONNMAN_SERVICE_STATE_IDLE:
-                               __connman_technology_notify_roaming_state(ifname,
-                                               "failure", cur_bssid, dst_bssid);
-                               connman_network_set_bool(service->network,
-                                               "WiFi.Roaming", false);
-                               connman_network_set_string(service->network,
-                                               "WiFi.RoamingCurBSSID", NULL);
-                               connman_network_set_string(service->network,
-                                               "WiFi.RoamingDstBSSID", NULL);
-                               break;
-                       }
-               }
-       }
+       emit_wifi_roaming_failure(service, new_state);
 #endif
 
        __connman_connection_update_gateway();