]> Git Repo - linux.git/commitdiff
wifi: cfg80211: parse all ML elements in an ML probe response
authorBenjamin Berg <[email protected]>
Tue, 2 Jan 2024 19:35:31 +0000 (21:35 +0200)
committerJohannes Berg <[email protected]>
Wed, 3 Jan 2024 14:35:36 +0000 (15:35 +0100)
A probe response from a transmitting AP in an Multi-BSSID setup will
contain more than one Multi-Link element. Most likely, only one of these
elements contains per-STA profiles.

Fixes: 2481b5da9c6b ("wifi: cfg80211: handle BSS data contained in ML probe responses")
Signed-off-by: Benjamin Berg <[email protected]>
Signed-off-by: Miri Korenblit <[email protected]>
Link: https://msgid.link/20240102213313.6635eb152735.I94289002d4a2f7b6b44dfa428344854e37b0b29c@changeid
Signed-off-by: Johannes Berg <[email protected]>
net/wireless/scan.c

index 4c01127fccc4d8fd90f3005f3970f00551b6aa31..2249b1a89d1c4cee36bda840d64dda612d367c5f 100644 (file)
@@ -2617,10 +2617,12 @@ cfg80211_tbtt_info_for_mld_ap(const u8 *ie, size_t ielen, u8 mld_id, u8 link_id,
        return 0;
 }
 
-static void cfg80211_parse_ml_sta_data(struct wiphy *wiphy,
-                                      struct cfg80211_inform_single_bss_data *tx_data,
-                                      struct cfg80211_bss *source_bss,
-                                      gfp_t gfp)
+static void
+cfg80211_parse_ml_elem_sta_data(struct wiphy *wiphy,
+                               struct cfg80211_inform_single_bss_data *tx_data,
+                               struct cfg80211_bss *source_bss,
+                               const struct element *elem,
+                               gfp_t gfp)
 {
        struct cfg80211_inform_single_bss_data data = {
                .drv_data = tx_data->drv_data,
@@ -2629,7 +2631,6 @@ static void cfg80211_parse_ml_sta_data(struct wiphy *wiphy,
                .bss_source = BSS_SOURCE_STA_PROFILE,
        };
        struct ieee80211_multi_link_elem *ml_elem;
-       const struct element *elem;
        struct cfg80211_mle *mle;
        u16 control;
        u8 ml_common_len;
@@ -2640,15 +2641,7 @@ static void cfg80211_parse_ml_sta_data(struct wiphy *wiphy,
        const u8 *pos;
        u8 i;
 
-       if (!source_bss)
-               return;
-
-       if (tx_data->ftype != CFG80211_BSS_FTYPE_PRESP)
-               return;
-
-       elem = cfg80211_find_ext_elem(WLAN_EID_EXT_EHT_MULTI_LINK,
-                                     tx_data->ie, tx_data->ielen);
-       if (!elem || !ieee80211_mle_size_ok(elem->data + 1, elem->datalen - 1))
+       if (!ieee80211_mle_size_ok(elem->data + 1, elem->datalen - 1))
                return;
 
        ml_elem = (void *)elem->data + 1;
@@ -2823,6 +2816,25 @@ out:
        kfree(mle);
 }
 
+static void cfg80211_parse_ml_sta_data(struct wiphy *wiphy,
+                                      struct cfg80211_inform_single_bss_data *tx_data,
+                                      struct cfg80211_bss *source_bss,
+                                      gfp_t gfp)
+{
+       const struct element *elem;
+
+       if (!source_bss)
+               return;
+
+       if (tx_data->ftype != CFG80211_BSS_FTYPE_PRESP)
+               return;
+
+       for_each_element_extid(elem, WLAN_EID_EXT_EHT_MULTI_LINK,
+                              tx_data->ie, tx_data->ielen)
+               cfg80211_parse_ml_elem_sta_data(wiphy, tx_data, source_bss,
+                                               elem, gfp);
+}
+
 struct cfg80211_bss *
 cfg80211_inform_bss_data(struct wiphy *wiphy,
                         struct cfg80211_inform_bss *data,
This page took 0.055746 seconds and 4 git commands to generate.