Do not propagate bad scan results to siblings sharing the radio
This decreases useless work and re-scans by siblings when a device gets a scan failure. Signed-off-by: Ben Greear <greearb@candelatech.com>
This commit is contained in:
parent
6603a96602
commit
e1504976f1
1 changed files with 20 additions and 12 deletions
|
@ -837,9 +837,9 @@ static int wpa_supplicant_need_to_roam(struct wpa_supplicant *wpa_s,
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Return < 0 if no scan results could be fetched. */
|
||||||
static void _wpa_supplicant_event_scan_results(struct wpa_supplicant *wpa_s,
|
static int _wpa_supplicant_event_scan_results(struct wpa_supplicant *wpa_s,
|
||||||
union wpa_event_data *data)
|
union wpa_event_data *data)
|
||||||
{
|
{
|
||||||
struct wpa_bss *selected;
|
struct wpa_bss *selected;
|
||||||
struct wpa_ssid *ssid = NULL;
|
struct wpa_ssid *ssid = NULL;
|
||||||
|
@ -858,11 +858,11 @@ static void _wpa_supplicant_event_scan_results(struct wpa_supplicant *wpa_s,
|
||||||
NULL, 1);
|
NULL, 1);
|
||||||
if (scan_res == NULL) {
|
if (scan_res == NULL) {
|
||||||
if (wpa_s->conf->ap_scan == 2 || ap)
|
if (wpa_s->conf->ap_scan == 2 || ap)
|
||||||
return;
|
return -1;
|
||||||
wpa_dbg(wpa_s, MSG_DEBUG, "Failed to get scan results - try "
|
wpa_dbg(wpa_s, MSG_DEBUG, "Failed to get scan results - try "
|
||||||
"scanning again");
|
"scanning again");
|
||||||
wpa_supplicant_req_new_scan(wpa_s, 1, 0);
|
wpa_supplicant_req_new_scan(wpa_s, 1, 0);
|
||||||
return;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef CONFIG_NO_RANDOM_POOL
|
#ifndef CONFIG_NO_RANDOM_POOL
|
||||||
|
@ -891,13 +891,13 @@ static void _wpa_supplicant_event_scan_results(struct wpa_supplicant *wpa_s,
|
||||||
scan_res_handler(wpa_s, scan_res);
|
scan_res_handler(wpa_s, scan_res);
|
||||||
|
|
||||||
wpa_scan_results_free(scan_res);
|
wpa_scan_results_free(scan_res);
|
||||||
return;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ap) {
|
if (ap) {
|
||||||
wpa_dbg(wpa_s, MSG_DEBUG, "Ignore scan results in AP mode");
|
wpa_dbg(wpa_s, MSG_DEBUG, "Ignore scan results in AP mode");
|
||||||
wpa_scan_results_free(scan_res);
|
wpa_scan_results_free(scan_res);
|
||||||
return;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
wpa_dbg(wpa_s, MSG_DEBUG, "New scan results available");
|
wpa_dbg(wpa_s, MSG_DEBUG, "New scan results available");
|
||||||
|
@ -908,18 +908,18 @@ static void _wpa_supplicant_event_scan_results(struct wpa_supplicant *wpa_s,
|
||||||
|
|
||||||
if ((wpa_s->conf->ap_scan == 2 && !wpas_wps_searching(wpa_s))) {
|
if ((wpa_s->conf->ap_scan == 2 && !wpas_wps_searching(wpa_s))) {
|
||||||
wpa_scan_results_free(scan_res);
|
wpa_scan_results_free(scan_res);
|
||||||
return;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (wpa_s->disconnected) {
|
if (wpa_s->disconnected) {
|
||||||
wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
|
wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
|
||||||
wpa_scan_results_free(scan_res);
|
wpa_scan_results_free(scan_res);
|
||||||
return;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bgscan_notify_scan(wpa_s, scan_res) == 1) {
|
if (bgscan_notify_scan(wpa_s, scan_res) == 1) {
|
||||||
wpa_scan_results_free(scan_res);
|
wpa_scan_results_free(scan_res);
|
||||||
return;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
wpa_supplicant_rsn_preauth_scan_results(wpa_s, scan_res);
|
wpa_supplicant_rsn_preauth_scan_results(wpa_s, scan_res);
|
||||||
|
@ -932,7 +932,7 @@ static void _wpa_supplicant_event_scan_results(struct wpa_supplicant *wpa_s,
|
||||||
scan_res);
|
scan_res);
|
||||||
wpa_scan_results_free(scan_res);
|
wpa_scan_results_free(scan_res);
|
||||||
if (skip)
|
if (skip)
|
||||||
return;
|
return 0;
|
||||||
wpa_supplicant_connect(wpa_s, selected, ssid);
|
wpa_supplicant_connect(wpa_s, selected, ssid);
|
||||||
} else {
|
} else {
|
||||||
wpa_scan_results_free(scan_res);
|
wpa_scan_results_free(scan_res);
|
||||||
|
@ -958,6 +958,7 @@ static void _wpa_supplicant_event_scan_results(struct wpa_supplicant *wpa_s,
|
||||||
timeout_usec);
|
timeout_usec);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -967,7 +968,14 @@ static void wpa_supplicant_event_scan_results(struct wpa_supplicant *wpa_s,
|
||||||
const char *rn, *rn2;
|
const char *rn, *rn2;
|
||||||
struct wpa_supplicant *ifs;
|
struct wpa_supplicant *ifs;
|
||||||
|
|
||||||
_wpa_supplicant_event_scan_results(wpa_s, data);
|
if (_wpa_supplicant_event_scan_results(wpa_s, data) < 0) {
|
||||||
|
/*
|
||||||
|
* If no scan results could be fetched, then no need to
|
||||||
|
* notify those interfaces that did not actually request
|
||||||
|
* this scan.
|
||||||
|
*/
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check other interfaces to see if they have the same radio-name. If
|
* Check other interfaces to see if they have the same radio-name. If
|
||||||
|
|
Loading…
Reference in a new issue