wifi: Ignore duplicate hidden APs
authorJukka Rissanen <jukka.rissanen@linux.intel.com>
Tue, 21 Aug 2012 10:55:09 +0000 (13:55 +0300)
committerPatrik Flykt <patrik.flykt@linux.intel.com>
Wed, 22 Aug 2012 06:04:03 +0000 (09:04 +0300)
We must not add duplicate entries to list of hidden AP.
There can be more that one service file for each AP if
we have multiple wifi cards in the system.

Fixes BMC#24779

plugins/wifi.c

index 13c4d0fb042fd48fca399ff41a152017a3499493..409c060cd21673f6ebb646554ddfde08a8ad9cf1 100644 (file)
@@ -266,9 +266,24 @@ static void wifi_remove(struct connman_device *device)
        g_free(wifi);
 }
 
+static gboolean is_duplicate(GSList *list, gchar *ssid, int ssid_len)
+{
+       GSList *iter;
+
+       for (iter = list; iter != NULL; iter = g_slist_next(iter)) {
+               struct scan_ssid *scan_ssid = iter->data;
+
+               if (ssid_len == scan_ssid->ssid_len &&
+                               memcmp(ssid, scan_ssid->ssid, ssid_len) == 0)
+                       return TRUE;
+       }
+
+       return FALSE;
+}
+
 static int add_scan_param(gchar *hex_ssid, char *raw_ssid, int ssid_len,
                        int freq, GSupplicantScanParams *scan_data,
-                       int driver_max_scan_ssids)
+                       int driver_max_scan_ssids, char *ssid_name)
 {
        unsigned int i;
        struct scan_ssid *scan_ssid;
@@ -294,6 +309,15 @@ static int add_scan_param(gchar *hex_ssid, char *raw_ssid, int ssid_len,
                        j = ssid_len;
                }
 
+               /*
+                * If we have already added hidden AP to the list,
+                * then do not do it again. This might happen if you have
+                * used or are using multiple wifi cards, so in that case
+                * you might have multiple service files for same AP.
+                */
+               if (is_duplicate(scan_data->ssids, ssid, j) == TRUE)
+                       return 0;
+
                scan_ssid = g_try_new(struct scan_ssid, 1);
                if (scan_ssid == NULL) {
                        g_free(ssid);
@@ -307,6 +331,9 @@ static int add_scan_param(gchar *hex_ssid, char *raw_ssid, int ssid_len,
 
                scan_data->num_ssids++;
 
+               DBG("SSID %s added to scanned list of %d entries", ssid_name,
+                                                       scan_data->num_ssids);
+
                if (hex_ssid != NULL)
                        g_free(ssid);
        } else
@@ -340,7 +367,7 @@ static int add_scan_param(gchar *hex_ssid, char *raw_ssid, int ssid_len,
                        break;
        }
 
-       return 0;
+       return 1;
 }
 
 static int get_hidden_connections(int max_ssids,
@@ -349,9 +376,8 @@ static int get_hidden_connections(int max_ssids,
        struct connman_config_entry **entries;
        GKeyFile *keyfile;
        gchar **services;
-       char *ssid;
-       gchar *str;
-       int i, freq;
+       char *ssid, *name;
+       int i, freq, ret;
        gboolean value;
        int num_ssids = 0, add_param_failed = 0;
 
@@ -382,17 +408,17 @@ static int get_hidden_connections(int max_ssids,
                freq = g_key_file_get_integer(keyfile, services[i],
                                        "Frequency", NULL);
 
-               if (add_scan_param(ssid, NULL, 0, freq, scan_data,
-                                                       max_ssids) < 0) {
-                       str = g_key_file_get_string(keyfile,
-                                       services[i], "Name", NULL);
-                       DBG("Cannot scan %s (%s)", ssid, str);
-                       g_free(str);
-                       add_param_failed++;
-               }
+               name = g_key_file_get_string(keyfile, services[i], "Name",
+                                                               NULL);
 
-               num_ssids++;
+               ret = add_scan_param(ssid, NULL, 0, freq, scan_data,
+                               max_ssids, name);
+               if (ret < 0)
+                       add_param_failed++;
+               else if (ret > 0)
+                       num_ssids++;
 
+               g_free(name);
                g_key_file_free(keyfile);
        }
 
@@ -417,15 +443,12 @@ static int get_hidden_connections(int max_ssids,
                if (ssid == NULL)
                        continue;
 
-               DBG("[%d]->ssid = %s", i, ssid);
-
-               if (add_scan_param(NULL, ssid, len, 0, scan_data,
-                                                       max_ssids) < 0) {
-                       DBG("Cannot scan %s (%s)", ssid, entries[i]->ident);
+               ret = add_scan_param(NULL, ssid, len, 0, scan_data,
+                                                       max_ssids, ssid);
+               if (ret < 0)
                        add_param_failed++;
-               }
-
-               num_ssids++;
+               else if (ret > 0)
+                       num_ssids++;
        }
 
        connman_config_free_entries(entries);
@@ -870,7 +893,7 @@ static int get_latest_connections(int max_ssids,
                                                entry->modified.tv_sec);
 
                add_scan_param(entry->ssid, NULL, 0, entry->freq, scan_data,
-                                                               max_ssids);
+                                               max_ssids, entry->ssid);
 
                iter = g_sequence_iter_next(iter);
        }