Always propagate scan results to all interfaces
Scan results were not propagated to all interfaces if scan results started a new operation, in order to prevent concurrent operations. But this can cause other interfaces to trigger a new scan when scan results are already available. Instead, always notify other interfaces of the scan results, but note that new operations are not allowed. Signed-off-by: Avraham Stern <avraham.stern@intel.com> Signed-off-by: Andrei Otcheretianski <andrei.otcheretianski@intel.com>
This commit is contained in:
parent
33111c910b
commit
e3e2fe3a42
1 changed files with 26 additions and 9 deletions
|
@ -1474,11 +1474,18 @@ static int wpa_supplicant_need_to_roam(struct wpa_supplicant *wpa_s,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Return != 0 if no scan results could be fetched or if scan results should not
|
/*
|
||||||
* be shared with other virtual interfaces. */
|
* Return a negative value if no scan results could be fetched or if scan
|
||||||
|
* results should not be shared with other virtual interfaces.
|
||||||
|
* Return 0 if scan results were fetched and may be shared with other
|
||||||
|
* interfaces.
|
||||||
|
* Return 1 if scan results may be shared with other virtual interfaces but may
|
||||||
|
* not trigger any operations.
|
||||||
|
* Return 2 if the interface was removed and cannot be used.
|
||||||
|
*/
|
||||||
static int _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,
|
||||||
int own_request)
|
int own_request, int update_only)
|
||||||
{
|
{
|
||||||
struct wpa_scan_results *scan_res = NULL;
|
struct wpa_scan_results *scan_res = NULL;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
@ -1528,6 +1535,11 @@ static int _wpa_supplicant_event_scan_results(struct wpa_supplicant *wpa_s,
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_NO_RANDOM_POOL */
|
#endif /* CONFIG_NO_RANDOM_POOL */
|
||||||
|
|
||||||
|
if (update_only) {
|
||||||
|
ret = 1;
|
||||||
|
goto scan_work_done;
|
||||||
|
}
|
||||||
|
|
||||||
if (own_request && wpa_s->scan_res_handler &&
|
if (own_request && wpa_s->scan_res_handler &&
|
||||||
!(data && data->scan_info.external_scan)) {
|
!(data && data->scan_info.external_scan)) {
|
||||||
void (*scan_res_handler)(struct wpa_supplicant *wpa_s,
|
void (*scan_res_handler)(struct wpa_supplicant *wpa_s,
|
||||||
|
@ -1536,7 +1548,7 @@ static int _wpa_supplicant_event_scan_results(struct wpa_supplicant *wpa_s,
|
||||||
scan_res_handler = wpa_s->scan_res_handler;
|
scan_res_handler = wpa_s->scan_res_handler;
|
||||||
wpa_s->scan_res_handler = NULL;
|
wpa_s->scan_res_handler = NULL;
|
||||||
scan_res_handler(wpa_s, scan_res);
|
scan_res_handler(wpa_s, scan_res);
|
||||||
ret = -2;
|
ret = 1;
|
||||||
goto scan_work_done;
|
goto scan_work_done;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1672,8 +1684,9 @@ static int wpas_select_network_from_last_scan(struct wpa_supplicant *wpa_s,
|
||||||
if (new_scan)
|
if (new_scan)
|
||||||
wpa_supplicant_rsn_preauth_scan_results(wpa_s);
|
wpa_supplicant_rsn_preauth_scan_results(wpa_s);
|
||||||
/*
|
/*
|
||||||
* Do not notify other virtual radios of scan results since we do not
|
* Do not allow other virtual radios to trigger operations based
|
||||||
* want them to start other associations at the same time.
|
* on these scan results since we do not want them to start
|
||||||
|
* other associations at the same time.
|
||||||
*/
|
*/
|
||||||
return 1;
|
return 1;
|
||||||
} else {
|
} else {
|
||||||
|
@ -1757,7 +1770,7 @@ static int wpa_supplicant_event_scan_results(struct wpa_supplicant *wpa_s,
|
||||||
struct wpa_supplicant *ifs;
|
struct wpa_supplicant *ifs;
|
||||||
int res;
|
int res;
|
||||||
|
|
||||||
res = _wpa_supplicant_event_scan_results(wpa_s, data, 1);
|
res = _wpa_supplicant_event_scan_results(wpa_s, data, 1, 0);
|
||||||
if (res == 2) {
|
if (res == 2) {
|
||||||
/*
|
/*
|
||||||
* Interface may have been removed, so must not dereference
|
* Interface may have been removed, so must not dereference
|
||||||
|
@ -1765,7 +1778,8 @@ static int wpa_supplicant_event_scan_results(struct wpa_supplicant *wpa_s,
|
||||||
*/
|
*/
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
if (res != 0) {
|
|
||||||
|
if (res < 0) {
|
||||||
/*
|
/*
|
||||||
* If no scan results could be fetched, then no need to
|
* If no scan results could be fetched, then no need to
|
||||||
* notify those interfaces that did not actually request
|
* notify those interfaces that did not actually request
|
||||||
|
@ -1785,7 +1799,10 @@ static int wpa_supplicant_event_scan_results(struct wpa_supplicant *wpa_s,
|
||||||
if (ifs != wpa_s) {
|
if (ifs != wpa_s) {
|
||||||
wpa_printf(MSG_DEBUG, "%s: Updating scan results from "
|
wpa_printf(MSG_DEBUG, "%s: Updating scan results from "
|
||||||
"sibling", ifs->ifname);
|
"sibling", ifs->ifname);
|
||||||
_wpa_supplicant_event_scan_results(ifs, data, 0);
|
res = _wpa_supplicant_event_scan_results(ifs, data, 0,
|
||||||
|
res > 0);
|
||||||
|
if (res < 0)
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue