WNM: Use recent scan results on BSS transition request
If the last scans are recent (for now, less than ten seconds old), use them instead of triggering a new scan when a BSS Transition Management Request frame is received. As a fallback, allow a new scan to be triggered if no matches were found. Signed-off-by: Jouni Malinen <j@w1.fi>
This commit is contained in:
parent
e1117c1c01
commit
75d65857d5
3 changed files with 24 additions and 5 deletions
|
@ -1314,7 +1314,7 @@ static int _wpa_supplicant_event_scan_results(struct wpa_supplicant *wpa_s,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (wnm_scan_process(wpa_s) > 0)
|
if (wnm_scan_process(wpa_s, 1) > 0)
|
||||||
goto scan_work_done;
|
goto scan_work_done;
|
||||||
|
|
||||||
if (sme_proc_obss_scan(wpa_s) > 0)
|
if (sme_proc_obss_scan(wpa_s) > 0)
|
||||||
|
|
|
@ -576,7 +576,7 @@ static void wnm_send_bss_transition_mgmt_resp(
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int wnm_scan_process(struct wpa_supplicant *wpa_s)
|
int wnm_scan_process(struct wpa_supplicant *wpa_s, int reply_on_fail)
|
||||||
{
|
{
|
||||||
struct wpa_bss *bss;
|
struct wpa_bss *bss;
|
||||||
struct wpa_ssid *ssid = wpa_s->current_ssid;
|
struct wpa_ssid *ssid = wpa_s->current_ssid;
|
||||||
|
@ -628,8 +628,12 @@ int wnm_scan_process(struct wpa_supplicant *wpa_s)
|
||||||
wnm_deallocate_memory(wpa_s);
|
wnm_deallocate_memory(wpa_s);
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
/* Send reject response for all the failures */
|
|
||||||
send_bss_resp_fail:
|
send_bss_resp_fail:
|
||||||
|
if (!reply_on_fail)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
/* Send reject response for all the failures */
|
||||||
|
|
||||||
if (wpa_s->wnm_reply) {
|
if (wpa_s->wnm_reply) {
|
||||||
wpa_s->wnm_reply = 0;
|
wpa_s->wnm_reply = 0;
|
||||||
wnm_send_bss_transition_mgmt_resp(wpa_s,
|
wnm_send_bss_transition_mgmt_resp(wpa_s,
|
||||||
|
@ -874,6 +878,20 @@ static void ieee802_11_rx_bss_trans_mgmt_req(struct wpa_supplicant *wpa_s,
|
||||||
wpa_s->wnm_cand_valid_until.usec %= 1000000;
|
wpa_s->wnm_cand_valid_until.usec %= 1000000;
|
||||||
os_memcpy(wpa_s->wnm_cand_from_bss, wpa_s->bssid, ETH_ALEN);
|
os_memcpy(wpa_s->wnm_cand_from_bss, wpa_s->bssid, ETH_ALEN);
|
||||||
|
|
||||||
|
if (wpa_s->last_scan_res_used > 0) {
|
||||||
|
struct os_reltime now;
|
||||||
|
|
||||||
|
os_get_reltime(&now);
|
||||||
|
if (!os_reltime_expired(&now, &wpa_s->last_scan, 10)) {
|
||||||
|
wpa_printf(MSG_DEBUG,
|
||||||
|
"WNM: Try to use recent scan results");
|
||||||
|
if (wnm_scan_process(wpa_s, 0) > 0)
|
||||||
|
return;
|
||||||
|
wpa_printf(MSG_DEBUG,
|
||||||
|
"WNM: No match in previous scan results - try a new scan");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
wnm_set_scan_freqs(wpa_s);
|
wnm_set_scan_freqs(wpa_s);
|
||||||
wpa_supplicant_req_scan(wpa_s, 0, 0);
|
wpa_supplicant_req_scan(wpa_s, 0, 0);
|
||||||
} else if (reply) {
|
} else if (reply) {
|
||||||
|
|
|
@ -62,11 +62,12 @@ void wnm_deallocate_memory(struct wpa_supplicant *wpa_s);
|
||||||
|
|
||||||
#ifdef CONFIG_WNM
|
#ifdef CONFIG_WNM
|
||||||
|
|
||||||
int wnm_scan_process(struct wpa_supplicant *wpa_s);
|
int wnm_scan_process(struct wpa_supplicant *wpa_s, int reply_on_fail);
|
||||||
|
|
||||||
#else /* CONFIG_WNM */
|
#else /* CONFIG_WNM */
|
||||||
|
|
||||||
static inline int wnm_scan_process(struct wpa_supplicant *wpa_s)
|
static inline int wnm_scan_process(struct wpa_supplicant *wpa_s,
|
||||||
|
int reply_on_fail)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue