SME: Fix processing of Authentication timeout and failure

Submitted by Eyal Shapira on Jan. 10, 2012, 3:56 p.m.

Details

Message ID 1326211018-29318-1-git-send-email-eyal@wizery.com
State Accepted
Commit 1193dc8fd7a9d67d84492141457a7a5ffc541728
Headers show

Commit Message

Eyal Shapira Jan. 10, 2012, 3:56 p.m.
current_bss and pending_bssid weren't cleaned up so BSS
kept appearing in the scan results even when it was actually gone.
Use wpa_supplicant_mark_disassoc() to cleanup the wpa_s context
instead of just dropping wpa_state back to DISCONNECTED.

Reported-by: Vishal Mahaveer <vishalm@ti.com>
Signed-hostap: Eyal Shapira <eyal@wizery.com>
---

The problematic flow encountered is as follows:
1. Associated AP is turned off
2. WPAS is notified and attempts to reconnect
by starting a normal scan almost immediately
3. Sometimes the remote AP is still returned in the results
4. WPAS tries to authenticate with the AP
5. This times out because the AP is down
6. However wpa_s->current_bss and pending_bssid were set
at the beginning of the authentication and aren't cleared up
7. This prevents later on the bss from being cleared
from the scan results

 wpa_supplicant/sme.c |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

Comments

Jouni Malinen Jan. 29, 2012, 3:45 p.m.
On Tue, Jan 10, 2012 at 05:56:58PM +0200, Eyal Shapira wrote:
> current_bss and pending_bssid weren't cleaned up so BSS
> kept appearing in the scan results even when it was actually gone.
> Use wpa_supplicant_mark_disassoc() to cleanup the wpa_s context
> instead of just dropping wpa_state back to DISCONNECTED.

Thanks! Applied.

Patch hide | download patch | download mbox

diff --git a/wpa_supplicant/sme.c b/wpa_supplicant/sme.c
index c5e47d1..fc28347 100644
--- a/wpa_supplicant/sme.c
+++ b/wpa_supplicant/sme.c
@@ -265,8 +265,8 @@  void sme_authenticate(struct wpa_supplicant *wpa_s,
 	if (wpa_drv_authenticate(wpa_s, &params) < 0) {
 		wpa_msg(wpa_s, MSG_INFO, "SME: Authentication request to the "
 			"driver failed");
-		wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
 		wpas_connection_failed(wpa_s, bss->bssid);
+		wpa_supplicant_mark_disassoc(wpa_s);
 		return;
 	}
 
@@ -503,8 +503,8 @@  void sme_event_auth_timed_out(struct wpa_supplicant *wpa_s,
 			      union wpa_event_data *data)
 {
 	wpa_dbg(wpa_s, MSG_DEBUG, "SME: Authentication timed out");
-	wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
 	wpas_connection_failed(wpa_s, wpa_s->pending_bssid);
+	wpa_supplicant_mark_disassoc(wpa_s);
 }