diff options
author | Leena Gunda <leena.gunda@wipro.com> | 2010-10-22 11:53:39 +0200 |
---|---|---|
committer | Samuel Ortiz <sameo@linux.intel.com> | 2010-10-22 11:59:01 +0200 |
commit | ace7fdcba81dc1fe26eda148acc149094260e451 (patch) | |
tree | 0fa8fc286164e0e195c1d4f0fd9d0dabb10ddb13 /gsupplicant/supplicant.c | |
parent | 9e07415df71b95191bf7a64a0a69369402a614a2 (diff) | |
download | connman-ace7fdcba81dc1fe26eda148acc149094260e451.tar.gz connman-ace7fdcba81dc1fe26eda148acc149094260e451.tar.bz2 connman-ace7fdcba81dc1fe26eda148acc149094260e451.zip |
gsupplicant: Get all BSSs when scan is done
After a scan, all BSSs need to be refreshed and passed back to the device
layer or else the WiFi device networks list is emptied.
Fixes BMC#8324
Fixes BMC#8363
Diffstat (limited to 'gsupplicant/supplicant.c')
-rw-r--r-- | gsupplicant/supplicant.c | 60 |
1 files changed, 52 insertions, 8 deletions
diff --git a/gsupplicant/supplicant.c b/gsupplicant/supplicant.c index 2670c94c..322b63da 100644 --- a/gsupplicant/supplicant.c +++ b/gsupplicant/supplicant.c @@ -1300,6 +1300,45 @@ static void interface_property(const char *key, DBusMessageIter *iter, key, dbus_message_iter_get_arg_type(iter)); } +static void scan_network_update(DBusMessageIter *iter, void *user_data) +{ + GSupplicantInterface *interface = user_data; + GSupplicantNetwork *network; + char *path; + + if (iter == NULL) + return; + + dbus_message_iter_get_basic(iter, &path); + + if (path == NULL) + return; + + if (g_strcmp0(path, "/") == 0) + return; + + /* Update the network details based on scan BSS data */ + network = g_hash_table_lookup(interface->bss_mapping, path); + if (network != NULL) + callback_network_added(network); +} + +static void scan_bss_data(const char *key, DBusMessageIter *iter, + void *user_data) +{ + GSupplicantInterface *interface = user_data; + + if (iter) + supplicant_dbus_array_foreach(iter, scan_network_update, + interface); + + if (interface->scan_callback != NULL) + interface->scan_callback(0, interface, interface->scan_data); + + interface->scan_callback = NULL; + interface->scan_data = NULL; +} + static GSupplicantInterface *interface_alloc(const char *path) { GSupplicantInterface *interface; @@ -1511,18 +1550,23 @@ static void signal_scan_done(const char *path, DBusMessageIter *iter) dbus_message_iter_get_basic(iter, &success); - if (interface->scan_callback != NULL) { - int result = 0; + /* + * If scan is unsuccessful return -EIO else get the scanned BSSs + * and update the network details accordingly + */ + if (success == FALSE) { + if (interface->scan_callback != NULL) + interface->scan_callback(-EIO, interface, + interface->scan_data); - if (success == FALSE) - result = -EIO; + interface->scan_callback = NULL; + interface->scan_data = NULL; - interface->scan_callback(result, interface, - interface->scan_data); + return; } - interface->scan_callback = NULL; - interface->scan_data = NULL; + supplicant_dbus_property_get(path, SUPPLICANT_INTERFACE ".Interface", + "BSSs", scan_bss_data, interface); } static void signal_bss_added(const char *path, DBusMessageIter *iter) |