]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
wlantest: Search for FT Target AP using MLD MAC address as well
authorJouni Malinen <quic_jouni@quicinc.com>
Thu, 10 Aug 2023 08:42:06 +0000 (11:42 +0300)
committerJouni Malinen <j@w1.fi>
Thu, 10 Aug 2023 09:37:43 +0000 (12:37 +0300)
When FT over-the-DS is used with MLO, the Target AP Address field is
expected to identify the AP MLD using its MLD MAC address.

Signed-off-by: Jouni Malinen <quic_jouni@quicinc.com>
wlantest/bss.c
wlantest/rx_mgmt.c
wlantest/wlantest.h

index 5b7a2e49fa09913dcb1cf8a924750ffee2eb2844..f34f674dd1959589c0de10f579454a0ba22ed3ab 100644 (file)
@@ -29,6 +29,19 @@ struct wlantest_bss * bss_find(struct wlantest *wt, const u8 *bssid)
 }
 
 
+struct wlantest_bss * bss_find_mld(struct wlantest *wt, const u8 *mld_mac_addr)
+{
+       struct wlantest_bss *bss;
+
+       dl_list_for_each(bss, &wt->bss, struct wlantest_bss, list) {
+               if (os_memcmp(bss->mld_mac_addr, mld_mac_addr, ETH_ALEN) == 0)
+                       return bss;
+       }
+
+       return NULL;
+}
+
+
 struct wlantest_bss * bss_get(struct wlantest *wt, const u8 *bssid)
 {
        struct wlantest_bss *bss;
index 3a0755ccf6d5877a4d934fb9e87160484a14fff8..941158018a0764970bd5073374942c6df0141818 100644 (file)
@@ -2084,7 +2084,7 @@ static void rx_mgmt_action_ft_response(struct wlantest *wt,
                                       const struct ieee80211_mgmt *mgmt,
                                       size_t len)
 {
-       struct wlantest_bss *bss;
+       struct wlantest_bss *bss, *bss2;
        struct wlantest_sta *new_sta;
        const u8 *ies;
        size_t ies_len;
@@ -2113,7 +2113,16 @@ static void rx_mgmt_action_ft_response(struct wlantest *wt,
                return;
        }
 
-       bss = bss_get(wt, mgmt->u.action.u.ft_action_resp.target_ap_addr);
+       bss = bss_find(wt, mgmt->u.action.u.ft_action_resp.target_ap_addr);
+       bss2 = bss_find_mld(wt, mgmt->u.action.u.ft_action_resp.target_ap_addr);
+       if (!bss)
+               bss = bss2;
+       if (bss && bss2 && bss != bss2 && !sta_find(bss, sta->addr))
+               bss = bss2;
+       if (!bss)
+               bss = bss_get(wt,
+                             mgmt->u.action.u.ft_action_resp.target_ap_addr);
+
        if (!bss) {
                add_note(wt, MSG_INFO, "No BSS entry for Target AP");
                return;
index 068cf3efb5bf626636991ecbee581ea31126053e..befe09f87b583c610707b8ed57ea70b713f21947 100644 (file)
@@ -294,6 +294,7 @@ void rx_data_80211_encap(struct wlantest *wt, const u8 *bssid,
                         const u8 *data, size_t len);
 
 struct wlantest_bss * bss_find(struct wlantest *wt, const u8 *bssid);
+struct wlantest_bss * bss_find_mld(struct wlantest *wt, const u8 *mld_mac_addr);
 struct wlantest_bss * bss_get(struct wlantest *wt, const u8 *bssid);
 void bss_deinit(struct wlantest_bss *bss);
 void bss_update(struct wlantest *wt, struct wlantest_bss *bss,