Defer scan if connection is in progress on any of the shared interfaces

Scanning can delay concurrent operations considerably, so it is better
to avoid that while trying to connect on any of the virtual interfaces
that share the same radio.

Signed-hostap: Jouni Malinen <jouni@qca.qualcomm.com>
This commit is contained in:
Deepthi Gowri 2013-05-10 16:10:50 +03:00 committed by Jouni Malinen
parent 7c0e1e2757
commit 36b9883d84
3 changed files with 41 additions and 1 deletions

View file

@ -569,7 +569,7 @@ static void wpa_supplicant_scan(void *eloop_ctx, void *timeout_ctx)
}
#ifdef CONFIG_P2P
if (wpas_p2p_in_progress(wpa_s)) {
if (wpas_p2p_in_progress(wpa_s) || wpas_wpa_is_in_progress(wpa_s)) {
if (wpa_s->sta_scan_pending &&
wpas_p2p_in_progress(wpa_s) == 2 &&
wpa_s->global->p2p_cb_on_scan_complete) {

View file

@ -3843,3 +3843,42 @@ void wpas_request_connection(struct wpa_supplicant *wpa_s)
if (wpa_supplicant_fast_associate(wpa_s) != 1)
wpa_supplicant_req_scan(wpa_s, 0, 0);
}
/**
* wpas_wpa_is_in_progress - Check whether a connection is in progress
* @wpa_s: Pointer to wpa_supplicant data
*
* This function is to check if the wpa state is in beginning of the connection
* during 4-way handshake or group key handshake with WPA on any shared
* interface.
*/
int wpas_wpa_is_in_progress(struct wpa_supplicant *wpa_s)
{
const char *rn, *rn2;
struct wpa_supplicant *ifs;
if (!wpa_s->driver->get_radio_name)
return 0;
rn = wpa_s->driver->get_radio_name(wpa_s->drv_priv);
if (rn == NULL || rn[0] == '\0')
return 0;
for (ifs = wpa_s->global->ifaces; ifs; ifs = ifs->next) {
if (ifs == wpa_s || !ifs->driver->get_radio_name)
continue;
rn2 = ifs->driver->get_radio_name(ifs->drv_priv);
if (!rn2 || os_strcmp(rn, rn2) != 0)
continue;
if (ifs->wpa_state >= WPA_AUTHENTICATING &&
ifs->wpa_state != WPA_COMPLETED) {
wpa_dbg(wpa_s, MSG_DEBUG, "Connection is in progress "
"on interface %s - defer scan", ifs->ifname);
return 1;
}
}
return 0;
}

View file

@ -782,6 +782,7 @@ int disallowed_ssid(struct wpa_supplicant *wpa_s, const u8 *ssid,
size_t ssid_len);
void wpas_request_connection(struct wpa_supplicant *wpa_s);
int wpas_build_ext_capab(struct wpa_supplicant *wpa_s, u8 *buf);
int wpas_wpa_is_in_progress(struct wpa_supplicant *wpa_s);
/**
* wpa_supplicant_ctrl_iface_ctrl_rsp_handle - Handle a control response