From fe4e8ee4be3e071561e8df12dc7e36311ed95c71 Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Tue, 21 Jul 2009 11:25:38 +0200 Subject: [PATCH] Fix the problems with scan result from unknown triggers --- plugins/supplicant.c | 69 ++++++++++++++++++++++++---------------------------- src/device.c | 2 -- 2 files changed, 32 insertions(+), 39 deletions(-) diff --git a/plugins/supplicant.c b/plugins/supplicant.c index a94893e..9dbe2dd 100644 --- a/plugins/supplicant.c +++ b/plugins/supplicant.c @@ -182,7 +182,7 @@ struct supplicant_task { char *netpath; gboolean created; enum supplicant_state state; - gboolean noscan; + gboolean scanning; GSList *scan_results; struct iw_range *range; gboolean disconnecting; @@ -1373,8 +1373,10 @@ static void get_properties(struct supplicant_task *task) return; noscan: - if (task->noscan == FALSE) + if (task->scanning == TRUE) { connman_device_set_scanning(task->device, FALSE); + task->scanning = FALSE; + } } static void scan_results_reply(DBusPendingCall *call, void *user_data) @@ -1431,8 +1433,10 @@ done: dbus_message_unref(reply); noscan: - if (task->noscan == FALSE) + if (task->scanning == TRUE) { connman_device_set_scanning(task->device, FALSE); + task->scanning = FALSE; + } } static void scan_results_available(struct supplicant_task *task) @@ -1456,14 +1460,14 @@ static void scan_results_available(struct supplicant_task *task) goto done; } - if (task->noscan == FALSE) - connman_device_set_scanning(task->device, TRUE); - if (call == NULL) { connman_error("D-Bus connection not available"); goto done; } + if (task->scanning == TRUE) + connman_device_set_scanning(task->device, TRUE); + dbus_pending_call_set_notify(call, scan_results_reply, task, NULL); done: @@ -1497,6 +1501,7 @@ static int task_connect(struct supplicant_task *task) const char *address, *security, *passphrase; const void *ssid; unsigned int ssid_len; + int err; address = connman_network_get_string(task->network, "Address"); security = connman_network_get_string(task->network, "WiFi.Security"); @@ -1520,7 +1525,9 @@ static int task_connect(struct supplicant_task *task) set_network(task, ssid, ssid_len, address, security, passphrase); - enable_network(task); + err = enable_network(task); + if (err < 0) + return err; return -EINPROGRESS; } @@ -1552,31 +1559,13 @@ static void state_change(struct supplicant_task *task, DBusMessage *msg) if (state == WPA_INVALID) return; - task->state = state; - - switch (task->state) { - case WPA_SCANNING: - task->noscan = TRUE; - connman_device_set_scanning(task->device, TRUE); - break; - case WPA_ASSOCIATING: - case WPA_ASSOCIATED: - case WPA_4WAY_HANDSHAKE: - case WPA_GROUP_HANDSHAKE: - task->noscan = TRUE; - break; - case WPA_COMPLETED: - case WPA_DISCONNECTED: - task->noscan = FALSE; - break; - case WPA_INACTIVE: - task->noscan = FALSE; + if (task->scanning == TRUE && state != WPA_SCANNING) { connman_device_set_scanning(task->device, FALSE); - break; - case WPA_INVALID: - break; + task->scanning = FALSE; } + task->state = state; + if (task->network == NULL) return; @@ -1588,14 +1577,15 @@ static void state_change(struct supplicant_task *task, DBusMessage *msg) /* carrier on */ connman_network_set_connected(task->network, TRUE); - connman_device_set_scanning(task->device, FALSE); break; case WPA_DISCONNECTED: disable_network(task); + /* carrier off */ + connman_network_set_connected(task->network, FALSE); + if (task->disconnecting == TRUE) { - connman_network_set_connected(task->network, FALSE); connman_network_unref(task->network); task->disconnecting = FALSE; @@ -1604,10 +1594,6 @@ static void state_change(struct supplicant_task *task, DBusMessage *msg) task->pending_network = NULL; task_connect(task); } - } else { - /* carrier off */ - connman_network_set_connected(task->network, FALSE); - connman_device_set_scanning(task->device, FALSE); } break; @@ -1618,8 +1604,9 @@ static void state_change(struct supplicant_task *task, DBusMessage *msg) case WPA_INACTIVE: remove_network(task); + connman_network_set_connected(task->network, FALSE); + if (task->disconnecting == TRUE) { - connman_network_set_connected(task->network, FALSE); connman_network_unref(task->network); task->disconnecting = FALSE; @@ -1701,7 +1688,7 @@ int supplicant_start(struct connman_device *device) task->device = connman_device_ref(device); task->created = FALSE; - task->noscan = FALSE; + task->scanning = FALSE; task->state = WPA_INVALID; task->disconnecting = FALSE; task->pending_network = NULL; @@ -1764,7 +1751,15 @@ int supplicant_scan(struct connman_device *device) break; } + task->scanning = TRUE; + err = initiate_scan(task); + if (err < 0) { + task->scanning = FALSE; + return err; + } + + connman_device_set_scanning(task->device, TRUE); return 0; } diff --git a/src/device.c b/src/device.c index 60a0468..53a6bd6 100644 --- a/src/device.c +++ b/src/device.c @@ -71,8 +71,6 @@ static gboolean device_scan_trigger(gpointer user_data) DBG("device %p", device); - connman_device_set_scanning(device, FALSE); - if (device->driver == NULL) { device->scan_timeout = 0; return FALSE; -- 2.7.4