diff --git a/wpa_supplicant/events.c b/wpa_supplicant/events.c index 64a555452..17db4082d 100644 --- a/wpa_supplicant/events.c +++ b/wpa_supplicant/events.c @@ -1030,7 +1030,7 @@ 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 +/* Return != 0 if no scan results could be fetched or if scan results should not * be shared with other virtual interfaces. */ static int _wpa_supplicant_event_scan_results(struct wpa_supplicant *wpa_s, union wpa_event_data *data) @@ -1175,6 +1175,11 @@ int wpas_select_network_from_last_scan(struct wpa_supplicant *wpa_s) return -1; } wpa_supplicant_rsn_preauth_scan_results(wpa_s); + /* + * Do not notify other virtual radios of scan results since we do not + * want them to start other associations at the same time. + */ + return 1; } else { wpa_dbg(wpa_s, MSG_DEBUG, "No suitable network found"); ssid = wpa_supplicant_pick_new_network(wpa_s); @@ -1211,7 +1216,7 @@ int wpas_select_network_from_last_scan(struct wpa_supplicant *wpa_s) wpa_s->network_select = 1; wpa_s->auto_network_select = 1; interworking_start_fetch_anqp(wpa_s); - return 0; + return 1; } #endif /* CONFIG_INTERWORKING */ if (wpa_supplicant_req_sched_scan(wpa_s)) @@ -1229,11 +1234,13 @@ static void wpa_supplicant_event_scan_results(struct wpa_supplicant *wpa_s, const char *rn, *rn2; struct wpa_supplicant *ifs; - if (_wpa_supplicant_event_scan_results(wpa_s, data) < 0) { + 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. + * this scan. Similarly, if scan results started a new operation on this + * interface, do not notify other interfaces to avoid concurrent + * operations during a connection attempt. */ return; } diff --git a/wpa_supplicant/interworking.c b/wpa_supplicant/interworking.c index b362bcba3..22f709f81 100644 --- a/wpa_supplicant/interworking.c +++ b/wpa_supplicant/interworking.c @@ -59,7 +59,7 @@ static void interworking_reconnect(struct wpa_supplicant *wpa_s) if (now.sec - wpa_s->last_scan.sec <= 5) { wpa_printf(MSG_DEBUG, "Interworking: Old scan results " "are fresh - connect without new scan"); - if (wpas_select_network_from_last_scan(wpa_s) == 0) + if (wpas_select_network_from_last_scan(wpa_s) >= 0) return; } }