Ignore any scanning happen from supplicant, this usually happen
when supplicant start association steps which include scanning,
In this step we don't want to update network list or run
auto connect after scan since we are already in process of
connection.
---
plugins/wifi.c | 40 ++++++++++++++++++++++++++++++----------
1 files changed, 30 insertions(+), 10 deletions(-)
diff --git a/plugins/wifi.c b/plugins/wifi.c
index 6319bfa..5fe6a41 100644
--- a/plugins/wifi.c
+++ b/plugins/wifi.c
@@ -53,6 +53,12 @@
#define CLEANUP_TIMEOUT 8 /* in seconds */
#define INACTIVE_TIMEOUT 12 /* in seconds */
+enum wifi_scan_status {
+ WIFI_SCAN_STOP = 0,
+ WIFI_SCAN_REQUSTED = 1,
+ WIFI_SCAN_STARTED = 2,
+};
+
struct wifi_data {
char *identifier;
struct connman_device *device;
@@ -61,6 +67,7 @@ struct wifi_data {
GSupplicantInterface *interface;
connman_bool_t connected;
connman_bool_t disconnecting;
+ enum wifi_scan_status scan_status;
int index;
unsigned flags;
unsigned int watch;
@@ -144,6 +151,7 @@ static int wifi_probe(struct connman_device *device)
wifi->connected = FALSE;
wifi->disconnecting = FALSE;
+ wifi->scan_status = WIFI_SCAN_STOP;
connman_device_set_data(device, wifi);
wifi->device = connman_device_ref(device);
@@ -230,6 +238,7 @@ static int wifi_disable(struct connman_device *device)
wifi->connected = FALSE;
wifi->disconnecting = FALSE;
+ wifi->scan_status = WIFI_SCAN_STOP;
if (wifi->pending_network != NULL) {
connman_network_unref(wifi->pending_network);
@@ -245,20 +254,33 @@ static void scan_callback(int result,
GSupplicantInterface *interface,
void *user_data)
{
struct connman_device *device = user_data;
+ struct wifi_data *wifi = connman_device_get_data(device);
DBG("result %d", result);
- connman_device_set_scanning(device, FALSE);
+ if (wifi == NULL)
+ return;
+
+ if (wifi->scan_status == WIFI_SCAN_STARTED)
+ connman_device_set_scanning(device, FALSE);
+
+ wifi->scan_status = WIFI_SCAN_STOP;
}
static int wifi_scan(struct connman_device *device)
{
struct wifi_data *wifi = connman_device_get_data(device);
+ int err;
DBG("device %p %p", device, wifi->interface);
- return g_supplicant_interface_scan(wifi->interface, scan_callback,
+ err = g_supplicant_interface_scan(wifi->interface, scan_callback,
device);
+
+ if (err == 0)
+ wifi->scan_status = WIFI_SCAN_REQUSTED;
+
+ return err;
}
static struct connman_device_driver wifi_ng_driver = {
@@ -330,7 +352,6 @@ static void interface_state(GSupplicantInterface *interface)
switch (state) {
case G_SUPPLICANT_STATE_SCANNING:
- connman_device_set_scanning(device, TRUE);
break;
case G_SUPPLICANT_STATE_AUTHENTICATING:
@@ -395,20 +416,19 @@ static void scan_started(GSupplicantInterface *interface)
if (wifi == NULL)
return;
+ if (wifi->scan_status != WIFI_SCAN_REQUSTED)
+ return;
+
if (wifi->device)
connman_device_set_scanning(wifi->device, TRUE);
+
+ wifi->scan_status = WIFI_SCAN_STARTED;
+
}
static void scan_finished(GSupplicantInterface *interface)
{
- struct wifi_data *wifi;
-
DBG("");
-
- wifi = g_supplicant_interface_get_data(interface);
-
- if (wifi == NULL)
- return;
}
static unsigned char calculate_strength(GSupplicantNetwork *supplicant_network)
--
1.7.2.3
_______________________________________________
connman mailing list
[email protected]
http://lists.connman.net/listinfo/connman