aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDmitry Shmidt <dimitrysh@google.com>2014-07-07 09:31:33 -0700
committerDmitry Shmidt <dimitrysh@google.com>2014-07-07 09:31:33 -0700
commit6aa8ae4b6139bdf5593301474277dcdbc2528190 (patch)
tree169194c48a4ad5f586f3949bcade62f20c350a58
parentc28170251eb54dbf64a9074a07fee377587425b2 (diff)
downloadandroid_external_wpa_supplicant_8-6aa8ae4b6139bdf5593301474277dcdbc2528190.tar.gz
android_external_wpa_supplicant_8-6aa8ae4b6139bdf5593301474277dcdbc2528190.tar.bz2
android_external_wpa_supplicant_8-6aa8ae4b6139bdf5593301474277dcdbc2528190.zip
Cumulative patch from commit 4ed3492206097c24aa37b4429938fec049ba1827
4ed3492 PNO: Send Probe Request frames only for hidden SSIDs 8931a36 P2P: Add explicit check for ssid->p2p_client_list != NULL c0e46bb DFS: Remove dead assignment Change-Id: I16b7d38ba8fc974391d679a43f1426eb9e4bce23 Signed-off-by: Dmitry Shmidt <dimitrysh@google.com>
-rw-r--r--src/ap/dfs.c5
-rw-r--r--wpa_supplicant/p2p_supplicant.c4
-rw-r--r--wpa_supplicant/scan.c45
3 files changed, 35 insertions, 19 deletions
diff --git a/src/ap/dfs.c b/src/ap/dfs.c
index a11b2cf8..20419f32 100644
--- a/src/ap/dfs.c
+++ b/src/ap/dfs.c
@@ -897,9 +897,8 @@ int hostapd_dfs_radar_detected(struct hostapd_iface *iface, int freq,
freq, ht_enabled, chan_offset, chan_width, cf1, cf2);
/* mark radar frequency as invalid */
- res = set_dfs_state(iface, freq, ht_enabled, chan_offset,
- chan_width, cf1, cf2,
- HOSTAPD_CHAN_DFS_UNAVAILABLE);
+ set_dfs_state(iface, freq, ht_enabled, chan_offset, chan_width,
+ cf1, cf2, HOSTAPD_CHAN_DFS_UNAVAILABLE);
/* Skip if reported radar event not overlapped our channels */
res = dfs_are_channels_overlapped(iface, freq, chan_width, cf1, cf2);
diff --git a/wpa_supplicant/p2p_supplicant.c b/wpa_supplicant/p2p_supplicant.c
index 1ad1a957..0af5e326 100644
--- a/wpa_supplicant/p2p_supplicant.c
+++ b/wpa_supplicant/p2p_supplicant.c
@@ -786,7 +786,7 @@ static void wpas_p2p_add_persistent_group_client(struct wpa_supplicant *wpa_s,
os_memcpy(n + s->num_p2p_clients * ETH_ALEN, addr, ETH_ALEN);
s->p2p_client_list = n;
s->num_p2p_clients++;
- } else if (!found) {
+ } else if (!found && s->p2p_client_list) {
/* Not enough room for an additional entry - drop the oldest
* entry */
os_memmove(s->p2p_client_list,
@@ -3188,7 +3188,7 @@ static void wpas_remove_persistent_peer(struct wpa_supplicant *wpa_s,
ETH_ALEN) == 0)
break;
}
- if (i >= ssid->num_p2p_clients) {
+ if (i >= ssid->num_p2p_clients || !ssid->p2p_client_list) {
if (ssid->mode != WPAS_MODE_P2P_GO &&
os_memcmp(ssid->bssid, peer, ETH_ALEN) == 0) {
wpa_printf(MSG_DEBUG, "P2P: Remove persistent group %d "
diff --git a/wpa_supplicant/scan.c b/wpa_supplicant/scan.c
index b13713c7..40eb8d84 100644
--- a/wpa_supplicant/scan.c
+++ b/wpa_supplicant/scan.c
@@ -1931,7 +1931,7 @@ void wpa_scan_free_params(struct wpa_driver_scan_params *params)
int wpas_start_pno(struct wpa_supplicant *wpa_s)
{
int ret, interval;
- size_t i, num_ssid;
+ size_t i, num_ssid, num_match_ssid;
struct wpa_ssid *ssid;
struct wpa_driver_scan_params params;
@@ -1960,41 +1960,58 @@ int wpas_start_pno(struct wpa_supplicant *wpa_s)
os_memset(&params, 0, sizeof(params));
- num_ssid = 0;
+ num_ssid = num_match_ssid = 0;
ssid = wpa_s->conf->ssid;
while (ssid) {
- if (!wpas_network_disabled(wpa_s, ssid))
- num_ssid++;
+ if (!wpas_network_disabled(wpa_s, ssid)) {
+ num_match_ssid++;
+ if (ssid->scan_ssid)
+ num_ssid++;
+ }
ssid = ssid->next;
}
+
+ if (num_match_ssid == 0) {
+ wpa_printf(MSG_DEBUG, "PNO: No configured SSIDs");
+ return -1;
+ }
+
+ if (num_match_ssid > num_ssid) {
+ params.num_ssids++; /* wildcard */
+ num_ssid++;
+ }
+
if (num_ssid > WPAS_MAX_SCAN_SSIDS) {
wpa_printf(MSG_DEBUG, "PNO: Use only the first %u SSIDs from "
"%u", WPAS_MAX_SCAN_SSIDS, (unsigned int) num_ssid);
num_ssid = WPAS_MAX_SCAN_SSIDS;
}
- if (num_ssid == 0) {
- wpa_printf(MSG_DEBUG, "PNO: No configured SSIDs");
- return -1;
+ if (num_match_ssid > wpa_s->max_match_sets) {
+ num_match_ssid = wpa_s->max_match_sets;
+ wpa_dbg(wpa_s, MSG_DEBUG, "PNO: Too many SSIDs to match");
}
-
- params.filter_ssids = os_malloc(sizeof(struct wpa_driver_scan_filter) *
- num_ssid);
+ params.filter_ssids = os_calloc(num_match_ssid,
+ sizeof(struct wpa_driver_scan_filter));
if (params.filter_ssids == NULL)
return -1;
i = 0;
ssid = wpa_s->conf->ssid;
while (ssid) {
if (!wpas_network_disabled(wpa_s, ssid)) {
- params.ssids[i].ssid = ssid->ssid;
- params.ssids[i].ssid_len = ssid->ssid_len;
- params.num_ssids++;
+ if (ssid->scan_ssid && params.num_ssids < num_ssid) {
+ params.ssids[params.num_ssids].ssid =
+ ssid->ssid;
+ params.ssids[params.num_ssids].ssid_len =
+ ssid->ssid_len;
+ params.num_ssids++;
+ }
os_memcpy(params.filter_ssids[i].ssid, ssid->ssid,
ssid->ssid_len);
params.filter_ssids[i].ssid_len = ssid->ssid_len;
params.num_filter_ssids++;
i++;
- if (i == num_ssid)
+ if (i == num_match_ssid)
break;
}
ssid = ssid->next;