Add generic signal strength property
[platform/upstream/connman.git] / plugins / wifi.c
index ed3a68e..70e19e9 100644 (file)
@@ -182,6 +182,33 @@ static gboolean inactive_scan(gpointer user_data)
        return FALSE;
 }
 
+static void connect_known_networks(struct connman_element *device)
+{
+       struct wifi_data *data = connman_element_get_data(device);
+       GSList *list;
+
+       DBG("");
+
+       if (data->inactive_timer > 0) {
+               g_source_remove(data->inactive_timer);
+               data->inactive_timer = 0;
+       }
+
+       for (list = data->current; list; list = list->next) {
+               struct connman_element *element = list->data;
+
+               if (element->policy == CONNMAN_ELEMENT_POLICY_AUTO &&
+                                               element->remember == TRUE &&
+                                               element->available == TRUE) {
+                       if (network_enable(element) == 0)
+                               return;
+               }
+       }
+
+       data->inactive_timer = g_timeout_add_seconds(INACTIVE_TIMEOUT,
+                                                       inactive_scan, device);
+}
+
 static void state_change(struct connman_element *device,
                                                enum supplicant_state state)
 {
@@ -190,24 +217,21 @@ static void state_change(struct connman_element *device,
 
        DBG("state %d", state);
 
-       if (state == STATE_INACTIVE && data->inactive_timer == 0)
-               data->inactive_timer = g_timeout_add_seconds(INACTIVE_TIMEOUT,
-                                                       inactive_scan, device);
-
        if (data == NULL)
                return;
 
        if (data->identifier == NULL)
-               return;
+               goto reconnect;
 
        element = find_current_element(data, data->identifier);
        if (element == NULL)
-               return;
+               goto reconnect;
 
        if (state == STATE_COMPLETED) {
                struct connman_element *dhcp;
 
                data->connected = TRUE;
+               connman_element_set_enabled(element, TRUE);
 
                dhcp = connman_element_create(NULL);
 
@@ -215,8 +239,18 @@ static void state_change(struct connman_element *device,
                dhcp->index = element->index;
 
                connman_element_register(dhcp, element);
-       } else if (state == STATE_DISCONNECTED || state == STATE_INACTIVE)
+       } else if (state == STATE_INACTIVE || state == STATE_DISCONNECTED) {
                data->connected = FALSE;
+               connman_element_set_enabled(element, FALSE);
+
+               connman_element_unregister_children(element);
+       }
+
+reconnect:
+       if (state == STATE_INACTIVE || state == STATE_DISCONNECTED) {
+               data->connected = FALSE;
+               connect_known_networks(device);
+       }
 }
 
 static gboolean cleanup_pending(gpointer user_data)
@@ -265,6 +299,7 @@ static void scan_result(struct connman_element *device,
 {
        struct wifi_data *data = connman_element_get_data(device);
        struct connman_element *element;
+       guint8 strength = network->quality;
        gchar *temp;
        int i;
 
@@ -290,8 +325,6 @@ static void scan_result(struct connman_element *device,
 
        element = find_pending_element(data, network->identifier);
        if (element == NULL) {
-               guint8 strength;
-
                element = connman_element_create(temp);
 
                element->type = CONNMAN_ELEMENT_TYPE_NETWORK;
@@ -318,21 +351,20 @@ static void scan_result(struct connman_element *device,
                        element->wifi.security = g_strdup(security);
                }
 
-               strength = network->quality;
-
-               connman_element_add_static_property(element, "WiFi.Strength",
+               connman_element_add_static_property(element, "Strength",
                                                DBUS_TYPE_BYTE, &strength);
 
-               //connman_element_add_static_property(element, "WiFi.Noise",
-               //                      DBUS_TYPE_INT32, &network->noise);
-
                DBG("%s (%s) strength %d", network->identifier,
                                        element->wifi.security, strength);
 
                connman_element_register(element, device);
-       } else
+       } else {
                data->pending = g_slist_remove(data->pending, element);
 
+               connman_element_set_static_property(element, "Strength",
+                                               DBUS_TYPE_BYTE, &strength);
+       }
+
        data->current = g_slist_append(data->current, element);
 
        element->available = TRUE;