aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJouni Malinen <jouni@qca.qualcomm.com>2013-03-18 15:11:15 (GMT)
committerJouni Malinen <j@w1.fi>2013-03-18 15:32:31 (GMT)
commit407be00b6ca299e04c34f385df5e538c912fc0ec (patch)
treeef5c8888a068e5d083f2b14ef8f6ca83e7d411ba
parentcfd31b5026a403ae67f88c74b036207be05b3107 (diff)
downloadhostap-407be00b6ca299e04c34f385df5e538c912fc0ec.zip
hostap-407be00b6ca299e04c34f385df5e538c912fc0ec.tar.gz
hostap-407be00b6ca299e04c34f385df5e538c912fc0ec.tar.bz2
P2P: Postpone P2P scan only if station mode scan is pending
sta_scan_pending was supposed to be accurate enough for determining whether a P2P scan needs to be postponed. However, it has turned out that there were cases where sta_scan_pending was not cleared properly. While the known cases have now been addressed, it is possible that some other cases may still exist. To avoid issues with P2P operationg getting stuck, verify more carefully that there is a real pending station mode scan (either in progress or scheduled to be requested). Signed-hostap: Jouni Malinen <jouni@qca.qualcomm.com>
-rw-r--r--wpa_supplicant/p2p_supplicant.c1
-rw-r--r--wpa_supplicant/scan.c6
-rw-r--r--wpa_supplicant/scan.h1
3 files changed, 8 insertions, 0 deletions
diff --git a/wpa_supplicant/p2p_supplicant.c b/wpa_supplicant/p2p_supplicant.c
index 76ddf0f..94a8219 100644
--- a/wpa_supplicant/p2p_supplicant.c
+++ b/wpa_supplicant/p2p_supplicant.c
@@ -151,6 +151,7 @@ static int wpas_p2p_scan(void *ctx, enum p2p_scan_type type, int freq,
for (ifs = wpa_s->global->ifaces; ifs; ifs = ifs->next) {
if (ifs->sta_scan_pending &&
+ (wpas_scan_scheduled(ifs) || ifs->scanning) &&
wpas_p2p_in_progress(wpa_s) == 2) {
wpa_printf(MSG_DEBUG, "Delaying P2P scan to allow "
"pending station mode scan to be "
diff --git a/wpa_supplicant/scan.c b/wpa_supplicant/scan.c
index 29a430c..1a4f695 100644
--- a/wpa_supplicant/scan.c
+++ b/wpa_supplicant/scan.c
@@ -1613,3 +1613,9 @@ void scan_only_handler(struct wpa_supplicant *wpa_s,
wpas_notify_scan_results(wpa_s);
wpas_notify_scan_done(wpa_s, 1);
}
+
+
+int wpas_scan_scheduled(struct wpa_supplicant *wpa_s)
+{
+ return eloop_is_timeout_registered(wpa_supplicant_scan, wpa_s, NULL);
+}
diff --git a/wpa_supplicant/scan.h b/wpa_supplicant/scan.h
index 5ecfa00..e892479 100644
--- a/wpa_supplicant/scan.h
+++ b/wpa_supplicant/scan.h
@@ -35,5 +35,6 @@ int wpa_supplicant_filter_bssid_match(struct wpa_supplicant *wpa_s,
void wpa_supplicant_update_scan_int(struct wpa_supplicant *wpa_s, int sec);
void scan_only_handler(struct wpa_supplicant *wpa_s,
struct wpa_scan_results *scan_res);
+int wpas_scan_scheduled(struct wpa_supplicant *wpa_s);
#endif /* SCAN_H */