summaryrefslogtreecommitdiff
path: root/gsupplicant/supplicant.c
diff options
context:
space:
mode:
authorLeena Gunda <leena.gunda@wipro.com>2010-10-22 11:53:39 +0200
committerSamuel Ortiz <sameo@linux.intel.com>2010-10-22 11:59:01 +0200
commitace7fdcba81dc1fe26eda148acc149094260e451 (patch)
tree0fa8fc286164e0e195c1d4f0fd9d0dabb10ddb13 /gsupplicant/supplicant.c
parent9e07415df71b95191bf7a64a0a69369402a614a2 (diff)
downloadconnman-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.c60
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)