From 40a972316bb02f3761dd52a4adc8a4aa91d729da Mon Sep 17 00:00:00 2001
From: nbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Date: Sat, 28 May 2011 16:27:17 +0000
Subject: [PATCH] hostapd: fix a race condition related to assoc response tx
 status processing

git-svn-id: svn://svn.openwrt.org/openwrt/trunk@27022 3c298f89-4303-0410-b956-a3cf2f4a3e73
---
 .../740-process_assoc_resp_tx_status.patch    | 48 +++++++++++++++++++
 1 file changed, 48 insertions(+)
 create mode 100644 package/hostapd/patches/740-process_assoc_resp_tx_status.patch

diff --git a/package/hostapd/patches/740-process_assoc_resp_tx_status.patch b/package/hostapd/patches/740-process_assoc_resp_tx_status.patch
new file mode 100644
index 000000000..a0d9a0ffc
--- /dev/null
+++ b/package/hostapd/patches/740-process_assoc_resp_tx_status.patch
@@ -0,0 +1,48 @@
+--- a/src/ap/ieee802_11.c
++++ b/src/ap/ieee802_11.c
+@@ -1629,13 +1629,6 @@ static void handle_assoc_cb(struct hosta
+ 	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 "
+@@ -1643,11 +1636,6 @@ static void handle_assoc_cb(struct hosta
+ 		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",
+@@ -1655,6 +1643,19 @@ static void handle_assoc_cb(struct hosta
+ 		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;
+ 
-- 
2.20.1