[PATCH] nl80211: report new station / assoc event for the correct BSS

Rafał Miłecki zajec5 at gmail.com
Sat Dec 6 10:06:35 EST 2014


drv->ctx always points to the first BSS and we should report event using
BSS related to the interface we got NL80211_CMD_NEW_STATION from.
This fixes STA association for drivers using NL80211_CMD_NEW_STATION and
multiple virtual interfaces.

Before:
nl80211: Drv Event 19 (NL80211_CMD_NEW_STATION) received for wlan0-1 (ifindex:7)
nl80211: New station 02:00:00:00:01:00
wlan0: STA 02:00:00:00:01:00 IEEE 802.11: associated

After:
nl80211: Drv Event 19 (NL80211_CMD_NEW_STATION) received for wlan0-1 (ifindex:7)
nl80211: New station 02:00:00:00:01:00
wlan0-1: STA 02:00:00:00:01:00 IEEE 802.11: associated

Signed-off-by: Rafał Miłecki <zajec5 at gmail.com>
---
Hi guys :)

I recently heard about possible problems with handling BSS-es from Arend and was
working with nl80211 / hostapd anyway, so decided to take a look at this.

I think I found some bug in handling events that can be exposed when using
multiple virtual interfaces, hardware authentication and cfg80211_new_sta (which
gets translated into NL80211_CMD_NEW_STATION).

As you can see in the log called "Before", hostapd was getting event from
wlan0-1 but then association was happening on the wlan0. This was breaking AP
mode on virtual interfaces (BSS other than the first one).

Please note, that this bug (I believe it's a bug) won't be exposed when running
mac80211_hwsim. In such case authentication is handled in hostapd and assoc
happens in handle_assoc_cb (not hostapd_notif_assoc) which handles BSS-es
correctly.

If you review this patch and it appears to be OK, I guess we will need similar
modification for other events.

P.S.
Jouni / Arent: re-sending this patch after subscribing to the ML.
---
 src/drivers/driver_nl80211_event.c | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/src/drivers/driver_nl80211_event.c b/src/drivers/driver_nl80211_event.c
index ab5208e..e2f2f3a 100644
--- a/src/drivers/driver_nl80211_event.c
+++ b/src/drivers/driver_nl80211_event.c
@@ -1122,6 +1122,7 @@ static void nl80211_new_peer_candidate(struct wpa_driver_nl80211_data *drv,
 
 
 static void nl80211_new_station_event(struct wpa_driver_nl80211_data *drv,
+				      struct i802_bss *bss,
 				      struct nlattr **tb)
 {
 	u8 *addr;
@@ -1140,7 +1141,7 @@ static void nl80211_new_station_event(struct wpa_driver_nl80211_data *drv,
 			ies_len = nla_len(tb[NL80211_ATTR_IE]);
 		}
 		wpa_hexdump(MSG_DEBUG, "nl80211: Assoc Req IEs", ies, ies_len);
-		drv_event_assoc(drv->ctx, addr, ies, ies_len, 0);
+		drv_event_assoc(bss->ctx, addr, ies, ies_len, 0);
 		return;
 	}
 
@@ -1149,7 +1150,7 @@ static void nl80211_new_station_event(struct wpa_driver_nl80211_data *drv,
 
 	os_memset(&data, 0, sizeof(data));
 	os_memcpy(data.ibss_rsn_start.peer, addr, ETH_ALEN);
-	wpa_supplicant_event(drv->ctx, EVENT_IBSS_RSN_START, &data);
+	wpa_supplicant_event(bss->ctx, EVENT_IBSS_RSN_START, &data);
 }
 
 
@@ -1822,7 +1823,7 @@ static void do_process_drv_event(struct i802_bss *bss, int cmd,
 				     &data);
 		break;
 	case NL80211_CMD_NEW_STATION:
-		nl80211_new_station_event(drv, tb);
+		nl80211_new_station_event(drv, bss, tb);
 		break;
 	case NL80211_CMD_DEL_STATION:
 		nl80211_del_station_event(drv, tb);
-- 
1.8.4.5



More information about the HostAP mailing list