From: Veerendranath Jakkam Date: Wed, 19 Oct 2022 14:14:05 +0000 (+0530) Subject: MLD STA: Support processing of M1 received before association event X-Git-Tag: hostap_2_11~1621 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=17ae988736214a1f5268048929e36a2c7c67d60b;p=thirdparty%2Fhostap.git MLD STA: Support processing of M1 received before association event EAPOL-Key msg 1/4 indication can be received before association indication from the driver. For MLO connection, the source address check of such frames should be against the AP MLD address instead of the associated link BSSID. Signed-off-by: Veerendranath Jakkam --- diff --git a/wpa_supplicant/events.c b/wpa_supplicant/events.c index f3cbe9755..f277e2163 100644 --- a/wpa_supplicant/events.c +++ b/wpa_supplicant/events.c @@ -3635,8 +3635,9 @@ static void wpa_supplicant_event_assoc(struct wpa_supplicant *wpa_s, os_get_reltime(&now); os_reltime_sub(&now, &wpa_s->pending_eapol_rx_time, &age); if (age.sec == 0 && age.usec < 200000 && - os_memcmp(wpa_s->pending_eapol_rx_src, bssid, ETH_ALEN) == - 0) { + os_memcmp(wpa_s->pending_eapol_rx_src, + wpa_s->valid_links ? wpa_s->ap_mld_addr : bssid, + ETH_ALEN) == 0) { wpa_dbg(wpa_s, MSG_DEBUG, "Process pending EAPOL " "frame that was received just before " "association notification"); diff --git a/wpa_supplicant/wpa_supplicant.c b/wpa_supplicant/wpa_supplicant.c index 3d7626aeb..2532c8382 100644 --- a/wpa_supplicant/wpa_supplicant.c +++ b/wpa_supplicant/wpa_supplicant.c @@ -5143,6 +5143,8 @@ void wpa_supplicant_rx_eapol(void *ctx, const u8 *src_addr, enum frame_encryption encrypted) { struct wpa_supplicant *wpa_s = ctx; + const u8 *connected_addr = wpa_s->valid_links ? + wpa_s->ap_mld_addr : wpa_s->bssid; wpa_dbg(wpa_s, MSG_DEBUG, "RX EAPOL from " MACSTR " (encrypted=%d)", MAC2STR(src_addr), encrypted); @@ -5168,7 +5170,7 @@ void wpa_supplicant_rx_eapol(void *ctx, const u8 *src_addr, #ifdef CONFIG_AP !wpa_s->ap_iface && #endif /* CONFIG_AP */ - os_memcmp(src_addr, wpa_s->bssid, ETH_ALEN) != 0)) { + os_memcmp(src_addr, connected_addr, ETH_ALEN) != 0)) { /* * There is possible race condition between receiving the * association event and the EAPOL frame since they are coming @@ -5181,10 +5183,11 @@ void wpa_supplicant_rx_eapol(void *ctx, const u8 *src_addr, * Authenticator uses BSSID as the src_addr (which is not the * case with wired IEEE 802.1X). */ - wpa_dbg(wpa_s, MSG_DEBUG, "Not associated - Delay processing " - "of received EAPOL frame (state=%s bssid=" MACSTR ")", + wpa_dbg(wpa_s, MSG_DEBUG, + "Not associated - Delay processing of received EAPOL frame (state=%s connected_addr=" + MACSTR ")", wpa_supplicant_state_txt(wpa_s->wpa_state), - MAC2STR(wpa_s->bssid)); + MAC2STR(connected_addr)); wpabuf_free(wpa_s->pending_eapol_rx); wpa_s->pending_eapol_rx = wpabuf_alloc_copy(buf, len); if (wpa_s->pending_eapol_rx) { @@ -5197,7 +5200,7 @@ void wpa_supplicant_rx_eapol(void *ctx, const u8 *src_addr, } wpa_s->last_eapol_matches_bssid = - os_memcmp(src_addr, wpa_s->bssid, ETH_ALEN) == 0; + os_memcmp(src_addr, connected_addr, ETH_ALEN) == 0; #ifdef CONFIG_AP if (wpa_s->ap_iface) {