Patchwork [1/3] nl80211: register for IBSS auth frames before eloop

login
register
mail settings
Submitter Johannes Berg
Date Oct. 26, 2013, 10:23 a.m.
Message ID <1382783032-26302-1-git-send-email-johannes@sipsolutions.net>
Download mbox | patch
Permalink /patch/286271/
State Accepted
Commit e8d1168b731593abdbc6b9331cc681084dd694e7
Headers show

Comments

Johannes Berg - Oct. 26, 2013, 10:23 a.m.
From: Johannes Berg <johannes.berg@intel.com>

The IBSS code registers the bss nl_mgmt socket for auth
frames when the join event happens, but that is too late
as then the socket is already on the eloop, which could
cause problems when other events are received at the
same time as the registration is done.

Move the auth frame registration to the initial setup
before the socket is put onto the eloop.

Signed-hostap: Johannes Berg <johannes.berg@intel.com>
---
 src/drivers/driver_nl80211.c | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)
Jouni Malinen - Oct. 26, 2013, 2:54 p.m.
Thanks, all three patches applied. The ELOOP_SOCKET_INVALID type casts
required some changes to avoid compiler warnings at least on 32-bit with
a recent gcc release (i.e., use intptr_t).

Patch

diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c
index e7d3d20..ed8afdb 100644
--- a/src/drivers/driver_nl80211.c
+++ b/src/drivers/driver_nl80211.c
@@ -1830,8 +1830,6 @@  static void mlme_event_michael_mic_failure(struct i802_bss *bss,
 static void mlme_event_join_ibss(struct wpa_driver_nl80211_data *drv,
 				 struct nlattr *tb[])
 {
-	u16 type = (WLAN_FC_TYPE_MGMT << 2) | (WLAN_FC_STYPE_AUTH << 4);
-
 	if (tb[NL80211_ATTR_MAC] == NULL) {
 		wpa_printf(MSG_DEBUG, "nl80211: No address in IBSS joined "
 			   "event");
@@ -1839,10 +1837,6 @@  static void mlme_event_join_ibss(struct wpa_driver_nl80211_data *drv,
 	}
 	os_memcpy(drv->bssid, nla_data(tb[NL80211_ATTR_MAC]), ETH_ALEN);
 
-	/* register for any AUTH message */
-	nl80211_register_frame(&drv->first_bss, drv->first_bss.nl_mgmt,
-			       type, NULL, 0);
-
 	drv->associated = 1;
 	wpa_printf(MSG_DEBUG, "nl80211: IBSS " MACSTR " joined",
 		   MAC2STR(drv->bssid));
@@ -3805,6 +3799,13 @@  static int nl80211_mgmt_subscribe_non_ap(struct i802_bss *bss)
 	wpa_printf(MSG_DEBUG, "nl80211: Subscribe to mgmt frames with non-AP "
 		   "handle %p", bss->nl_mgmt);
 
+	if (drv->nlmode == NL80211_IFTYPE_ADHOC) {
+		u16 type = (WLAN_FC_TYPE_MGMT << 2) | (WLAN_FC_STYPE_AUTH << 4);
+
+		/* register for any AUTH message */
+		nl80211_register_frame(bss, bss->nl_mgmt, type, NULL, 0);
+	}
+
 #ifdef CONFIG_INTERWORKING
 	/* QoS Map Configure */
 	if (nl80211_register_action_frame(bss, (u8 *) "\x01\x04", 2) < 0)