From patchwork Wed Oct 24 16:55:13 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: EAPOL issue when switching between SSIDs Date: Wed, 24 Oct 2012 06:55:13 -0000 From: David Bird X-Patchwork-Id: 193862 Message-Id: <1351097713.6771.5.camel@david-laptop> To: hostap@lists.shmoo.com Greetings, There is an issue with associating to SSIDs using WPA when there are multiple SSIDs being controlled by hostapd and when you are switching between SSIDs. When processing the EAPOL packet, the array of virtual APs (iface->bss) is searched looking for the station that sent the packet in order to identify which signal context should be used during processing. The first signal with the station in it's list gets used in the ieee802_1x_receive() function. However, even after a station has disassociated from a signal, it remains in that signals list of stations pending an inactivity timeout. This leads to the wrong signal context (one where the station had already disassociated) being used in some cases (if the current/active bss entry appears in the list AFTER one where the station has just disassociated from) for EAPOL processing. The attached patch checks for the WLAN_STA_ASSOC flag before assuming it found the 'right' signal context for the given station. Signed-hostap: David Bird diff --git a/src/ap/drv_callbacks.c b/src/ap/drv_callbacks.c index 23fa241..0200435 100644 --- a/src/ap/drv_callbacks.c +++ b/src/ap/drv_callbacks.c @@ -672,12 +673,15 @@ static void hostapd_event_eapol_rx(struct hostapd_data *hapd, const u8 *src, const u8 *data, size_t data_len) { struct hostapd_iface *iface = hapd->iface; + struct sta_info *sta; size_t j; for (j = 0; j < iface->num_bss; j++) { - if (ap_get_sta(iface->bss[j], src)) { - hapd = iface->bss[j]; - break; + if ((sta = ap_get_sta(iface->bss[j], src))) { + if (sta->flags & WLAN_STA_ASSOC) { + hapd = iface->bss[j]; + break; + } } }