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>
This commit is contained in:
Jouni Malinen 2013-03-18 17:11:15 +02:00 committed by Jouni Malinen
parent cfd31b5026
commit 407be00b6c
3 changed files with 8 additions and 0 deletions

View file

@ -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) { for (ifs = wpa_s->global->ifaces; ifs; ifs = ifs->next) {
if (ifs->sta_scan_pending && if (ifs->sta_scan_pending &&
(wpas_scan_scheduled(ifs) || ifs->scanning) &&
wpas_p2p_in_progress(wpa_s) == 2) { wpas_p2p_in_progress(wpa_s) == 2) {
wpa_printf(MSG_DEBUG, "Delaying P2P scan to allow " wpa_printf(MSG_DEBUG, "Delaying P2P scan to allow "
"pending station mode scan to be " "pending station mode scan to be "

View file

@ -1613,3 +1613,9 @@ void scan_only_handler(struct wpa_supplicant *wpa_s,
wpas_notify_scan_results(wpa_s); wpas_notify_scan_results(wpa_s);
wpas_notify_scan_done(wpa_s, 1); 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);
}

View file

@ -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 wpa_supplicant_update_scan_int(struct wpa_supplicant *wpa_s, int sec);
void scan_only_handler(struct wpa_supplicant *wpa_s, void scan_only_handler(struct wpa_supplicant *wpa_s,
struct wpa_scan_results *scan_res); struct wpa_scan_results *scan_res);
int wpas_scan_scheduled(struct wpa_supplicant *wpa_s);
#endif /* SCAN_H */ #endif /* SCAN_H */