Patchwork [3/5] hostapd: clear WLAN_STA_ASSOC_REQ_OK if sending the assoc response failed

login
register
mail settings
Submitter Felix Fietkau
Date Sept. 14, 2012, 1:12 p.m.
Message ID <1347628349-34362-3-git-send-email-nbd@openwrt.org>
Download mbox | patch
Permalink /patch/183921/
State Accepted
Commit 22b42372d081eb8e310742f718ebe9abcfacb51c
Headers show

Comments

Felix Fietkau - Sept. 14, 2012, 1:12 p.m.
As long as WLAN_STA_ASSOC_REQ_OK is set in sta->flags, Class 3 frames do not
trigger a disassoc/deauth. If it is still set even after the assoc response
tx has already failed, it may take somewhat longer for clients to realize
that the connection wasn't fully established.

Signed-hostap: Felix Fietkau <nbd@openwrt.org>
---
 src/ap/ieee802_11.c |   25 +++++++++++++------------
 1 file changed, 13 insertions(+), 12 deletions(-)
Jouni Malinen - Sept. 23, 2012, 10:24 a.m.
On Fri, Sep 14, 2012 at 03:12:27PM +0200, Felix Fietkau wrote:
> As long as WLAN_STA_ASSOC_REQ_OK is set in sta->flags, Class 3 frames do not
> trigger a disassoc/deauth. If it is still set even after the assoc response
> tx has already failed, it may take somewhat longer for clients to realize
> that the connection wasn't fully established.

Thanks, applied.

Patch

diff --git a/src/ap/ieee802_11.c b/src/ap/ieee802_11.c
index 211ee1b..4b6e9d7 100644
--- a/src/ap/ieee802_11.c
+++ b/src/ap/ieee802_11.c
@@ -1506,13 +1506,6 @@  static void handle_assoc_cb(struct hostapd_data *hapd,
 	int new_assoc = 1;
 	struct ieee80211_ht_capabilities ht_cap;
 
-	if (!ok) {
-		hostapd_logger(hapd, mgmt->da, HOSTAPD_MODULE_IEEE80211,
-			       HOSTAPD_LEVEL_DEBUG,
-			       "did not acknowledge association response");
-		return;
-	}
-
 	if (len < IEEE80211_HDRLEN + (reassoc ? sizeof(mgmt->u.reassoc_resp) :
 				      sizeof(mgmt->u.assoc_resp))) {
 		printf("handle_assoc_cb(reassoc=%d) - too short payload "
@@ -1520,11 +1513,6 @@  static void handle_assoc_cb(struct hostapd_data *hapd,
 		return;
 	}
 
-	if (reassoc)
-		status = le_to_host16(mgmt->u.reassoc_resp.status_code);
-	else
-		status = le_to_host16(mgmt->u.assoc_resp.status_code);
-
 	sta = ap_get_sta(hapd, mgmt->da);
 	if (!sta) {
 		printf("handle_assoc_cb: STA " MACSTR " not found\n",
@@ -1532,6 +1520,19 @@  static void handle_assoc_cb(struct hostapd_data *hapd,
 		return;
 	}
 
+	if (!ok) {
+		hostapd_logger(hapd, mgmt->da, HOSTAPD_MODULE_IEEE80211,
+			       HOSTAPD_LEVEL_DEBUG,
+			       "did not acknowledge association response");
+		sta->flags &= ~WLAN_STA_ASSOC_REQ_OK;
+		return;
+	}
+
+	if (reassoc)
+		status = le_to_host16(mgmt->u.reassoc_resp.status_code);
+	else
+		status = le_to_host16(mgmt->u.assoc_resp.status_code);
+
 	if (status != WLAN_STATUS_SUCCESS)
 		goto fail;