From: Marcel Holtmann Date: Sat, 13 Dec 2008 19:36:07 +0000 (+0100) Subject: Add support for automatically connecting known networks X-Git-Tag: 0.3~11 X-Git-Url: https://vcs.maemo.org/git/?a=commitdiff_plain;h=1e826f42422e54cc92935119d6a6a9abf060d961;hp=7b19cffd7e92e8efdc6a26cb566abc73a009934c;p=connman Add support for automatically connecting known networks --- diff --git a/plugins/wifi.c b/plugins/wifi.c index 67ac993..7599063 100644 --- a/plugins/wifi.c +++ b/plugins/wifi.c @@ -182,6 +182,32 @@ 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) { + 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,25 +216,21 @@ static void state_change(struct connman_element *device, DBG("state %d", state); - if ((state == STATE_INACTIVE || state == STATE_DISCONNECTED) && - 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); @@ -216,8 +238,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)