From patchwork Wed Jan 16 02:28:09 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: wpa_supplicant: Implement fast-associate on SelectNetwork Date: Tue, 15 Jan 2013 16:28:09 -0000 From: Paul Stewart X-Patchwork-Id: 212383 Message-Id: <20130116034602.F092220073F@clearcreek.mtv.corp.google.com> To: hostap@lists.shmoo.com If scan results are available when we perform a SelectNetwork, use them to make an associate decision. This can save an entire scan interval-worth of time in situations where something external to wpa_supplicant (like a connection manager) has just previously requested a scan before calling SelectNetwork. Signed-hostap: Paul Stewart --- wpa_supplicant/events.c | 32 ++++++++++++++++++++++++++++++++ wpa_supplicant/wpa_supplicant.c | 4 +++- wpa_supplicant/wpa_supplicant_i.h | 2 ++ 3 files changed, 37 insertions(+), 1 deletions(-) diff --git a/wpa_supplicant/events.c b/wpa_supplicant/events.c index 983f670..494e2f7 100644 --- a/wpa_supplicant/events.c +++ b/wpa_supplicant/events.c @@ -1308,6 +1308,38 @@ static void wpa_supplicant_event_scan_results(struct wpa_supplicant *wpa_s, #endif /* CONFIG_NO_SCAN_PROCESSING */ +int wpa_supplicant_fast_associate(struct wpa_supplicant *wpa_s, + struct wpa_ssid *ssid) +{ +#ifdef CONFIG_NO_SCAN_PROCESSING + return -1; +#else /* CONFIG_NO_SCAN_PROCESSING */ + struct wpa_bss *selected_bss; + struct wpa_ssid *selected_ssid = NULL; + + selected_bss = wpa_supplicant_pick_network(wpa_s, &selected_ssid); + + if (!selected_bss) { + wpa_dbg(wpa_s, MSG_DEBUG, "Fast associate: no suitable bss"); + return -1; + } + + if (selected_ssid != ssid) { + wpa_dbg(wpa_s, MSG_DEBUG, "Fast associate: ssid mismatch?!"); + return -1; + } + + if (wpa_supplicant_connect(wpa_s, selected_bss, ssid) < 0) { + wpa_dbg(wpa_s, MSG_DEBUG, "Fast associate: Connect failed"); + return -1; + } + + wpa_dbg(wpa_s, MSG_DEBUG, "Fast associate: Successful connect!"); + + return 0; +#endif /* CONFIG_NO_SCAN_PROCESSING */ +} + #ifdef CONFIG_WNM static void wnm_bss_keep_alive(void *eloop_ctx, void *sock_ctx) diff --git a/wpa_supplicant/wpa_supplicant.c b/wpa_supplicant/wpa_supplicant.c index 64f5c1b..cf086ab 100644 --- a/wpa_supplicant/wpa_supplicant.c +++ b/wpa_supplicant/wpa_supplicant.c @@ -1875,7 +1875,9 @@ void wpa_supplicant_select_network(struct wpa_supplicant *wpa_s, wpa_s->connect_without_scan = NULL; wpa_s->disconnected = 0; wpa_s->reassociate = 1; - wpa_supplicant_req_scan(wpa_s, 0, disconnected ? 100000 : 0); + + if (!ssid || wpa_supplicant_fast_associate(wpa_s, ssid) != 0) + wpa_supplicant_req_scan(wpa_s, 0, disconnected ? 100000 : 0); if (ssid) wpas_notify_network_selected(wpa_s, ssid); diff --git a/wpa_supplicant/wpa_supplicant_i.h b/wpa_supplicant/wpa_supplicant_i.h index ecbdedf..6b4e832 100644 --- a/wpa_supplicant/wpa_supplicant_i.h +++ b/wpa_supplicant/wpa_supplicant_i.h @@ -786,6 +786,8 @@ void wpa_supplicant_stop_countermeasures(void *eloop_ctx, void *sock_ctx); void wpa_supplicant_delayed_mic_error_report(void *eloop_ctx, void *sock_ctx); void wnm_bss_keep_alive_deinit(struct wpa_supplicant *wpa_s); int wpas_select_network_from_last_scan(struct wpa_supplicant *wpa_s); +int wpa_supplicant_fast_associate(struct wpa_supplicant *wpa_s, + struct wpa_ssid *ssid); /* eap_register.c */ int eap_register_methods(void);