summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJukka Rissanen <jukka.rissanen@linux.intel.com>2012-08-21 13:55:09 +0300
committerPatrik Flykt <patrik.flykt@linux.intel.com>2012-08-22 09:04:03 +0300
commita02340e2b7724a7b1b259dccb9480cfe472ed2f2 (patch)
tree00861372ca063749ec6732227ff6f0ad0bdb20bb
parent87759fe8b975744b3b5c49bcf938bc2809e0160f (diff)
downloadconnman-a02340e2b7724a7b1b259dccb9480cfe472ed2f2.tar.gz
connman-a02340e2b7724a7b1b259dccb9480cfe472ed2f2.tar.bz2
connman-a02340e2b7724a7b1b259dccb9480cfe472ed2f2.zip
wifi: Ignore duplicate hidden APs
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
-rw-r--r--plugins/wifi.c69
1 files changed, 46 insertions, 23 deletions
diff --git a/plugins/wifi.c b/plugins/wifi.c
index 13c4d0fb..409c060c 100644
--- a/plugins/wifi.c
+++ b/plugins/wifi.c
@@ -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);
}