]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
AP: Match received Management frames against MLD address
authorIlan Peer <ilan.peer@intel.com>
Mon, 22 May 2023 19:33:40 +0000 (22:33 +0300)
committerJouni Malinen <j@w1.fi>
Wed, 7 Jun 2023 17:23:21 +0000 (20:23 +0300)
Once a station is added to the underlying driver, the driver is expected
to do address translation and use MLD addresses. Thus, when handling a
received Management frame, match it against the MLD address.

Signed-off-by: Ilan Peer <ilan.peer@intel.com>
src/ap/drv_callbacks.c
src/ap/ieee802_11.c

index 7da5c524cf31210fea037999d6f8f667f3ce00cb..0cd8ce744892ff4ada2019ddbdb01a9ab55abf4f 100644 (file)
@@ -1459,6 +1459,7 @@ static int hostapd_mgmt_rx(struct hostapd_data *hapd, struct rx_mgmt *rx_mgmt)
        const u8 *bssid;
        struct hostapd_frame_info fi;
        int ret;
+       bool is_mld = false;
 
 #ifdef CONFIG_TESTING_OPTIONS
        if (hapd->ext_mgmt_frame_handling) {
@@ -1480,8 +1481,16 @@ static int hostapd_mgmt_rx(struct hostapd_data *hapd, struct rx_mgmt *rx_mgmt)
        if (bssid == NULL)
                return 0;
 
-       hapd = get_hapd_bssid(iface, bssid);
-       if (hapd == NULL) {
+#ifdef CONFIG_IEEE80211BE
+       if (hapd->conf->mld_ap &&
+           os_memcmp(hapd->mld_addr, bssid, ETH_ALEN) == 0)
+               is_mld = true;
+#endif /* CONFIG_IEEE80211BE */
+
+       if (!is_mld)
+               hapd = get_hapd_bssid(iface, bssid);
+
+       if (!hapd) {
                u16 fc = le_to_host16(hdr->frame_control);
 
                /*
index a289b26af2c0d058f815d124dcb863ff3bfd7f08..1436bd4e0ff5b37a146398ac23f20b9551441783 100644 (file)
@@ -5495,6 +5495,10 @@ int ieee802_11_mgmt(struct hostapd_data *hapd, const u8 *buf, size_t len,
 #ifdef CONFIG_MESH
            !(hapd->conf->mesh & MESH_ENABLED) &&
 #endif /* CONFIG_MESH */
+#ifdef CONFIG_IEEE80211BE
+           !(hapd->conf->mld_ap &&
+             os_memcmp(hapd->mld_addr, mgmt->bssid, ETH_ALEN) == 0) &&
+#endif /* CONFIG_IEEE80211BE */
            os_memcmp(mgmt->bssid, hapd->own_addr, ETH_ALEN) != 0) {
                wpa_printf(MSG_INFO, "MGMT: BSSID=" MACSTR " not our address",
                           MAC2STR(mgmt->bssid));
@@ -5514,6 +5518,10 @@ int ieee802_11_mgmt(struct hostapd_data *hapd, const u8 *buf, size_t len,
 
        if ((!is_broadcast_ether_addr(mgmt->da) ||
             stype != WLAN_FC_STYPE_ACTION) &&
+#ifdef CONFIG_IEEE80211BE
+           !(hapd->conf->mld_ap &&
+             os_memcmp(hapd->mld_addr, mgmt->bssid, ETH_ALEN) == 0) &&
+#endif /* CONFIG_IEEE80211BE */
            os_memcmp(mgmt->da, hapd->own_addr, ETH_ALEN) != 0) {
                hostapd_logger(hapd, mgmt->sa, HOSTAPD_MODULE_IEEE80211,
                               HOSTAPD_LEVEL_DEBUG,