]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
wifi: cfg80211: generate an ML element for per-STA profiles
authorBenjamin Berg <benjamin.berg@intel.com>
Mon, 11 Dec 2023 07:05:27 +0000 (09:05 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Tue, 12 Dec 2023 09:37:01 +0000 (10:37 +0100)
The specification says that this information should not be explicitly
included in the per-STA profile. However, we need this information
readily available in the BSS for userspace and also internally when
associating. As such, append the appropriate element before
adding/updating the BSS.

Signed-off-by: Benjamin Berg <benjamin.berg@intel.com>
Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
Link: https://msgid.link/20231211085121.abde63d9cc6d.I3d346be0f84f51dccf4f4f92a3e997e6102b9456@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/wireless/scan.c

index 2f8c9b6f7ebcc11014065145dd3abbb058a74538..3e3ba0ddb83efba821ea4a4553e4ceab50652a62 100644 (file)
@@ -2621,6 +2621,7 @@ static void cfg80211_parse_ml_sta_data(struct wiphy *wiphy,
        const struct element *elem;
        struct cfg80211_mle *mle;
        u16 control;
+       u8 ml_common_len;
        u8 *new_ie;
        struct cfg80211_bss *bss;
        int mld_id;
@@ -2651,6 +2652,8 @@ static void cfg80211_parse_ml_sta_data(struct wiphy *wiphy,
            !(control & IEEE80211_MLC_BASIC_PRES_MLD_CAPA_OP))
                return;
 
+       ml_common_len = ml_elem->variable[0];
+
        /* length + MLD MAC address + link ID info + BSS Params Change Count */
        pos = ml_elem->variable + 1 + 6 + 1 + 1;
 
@@ -2767,6 +2770,34 @@ static void cfg80211_parse_ml_sta_data(struct wiphy *wiphy,
                if (!data.ielen)
                        continue;
 
+               /* The generated elements do not contain:
+                *  - Basic ML element
+                *  - A TBTT entry in the RNR for the transmitting AP
+                *
+                * This information is needed both internally and in userspace
+                * as such, we should append it here.
+                */
+               if (data.ielen + 3 + sizeof(*ml_elem) + ml_common_len >
+                   IEEE80211_MAX_DATA_LEN)
+                       continue;
+
+               /* Copy the Basic Multi-Link element including the common
+                * information, and then fix up the link ID.
+                * Note that the ML element length has been verified and we
+                * also checked that it contains the link ID.
+                */
+               new_ie[data.ielen++] = WLAN_EID_EXTENSION;
+               new_ie[data.ielen++] = 1 + sizeof(*ml_elem) + ml_common_len;
+               new_ie[data.ielen++] = WLAN_EID_EXT_EHT_MULTI_LINK;
+               memcpy(new_ie + data.ielen, ml_elem,
+                      sizeof(*ml_elem) + ml_common_len);
+
+               new_ie[data.ielen + sizeof(*ml_elem) + 1 + ETH_ALEN] = link_id;
+
+               data.ielen += sizeof(*ml_elem) + ml_common_len;
+
+               /* TODO: Add an RNR containing only the reporting AP */
+
                bss = cfg80211_inform_single_bss_data(wiphy, &data, gfp);
                if (!bss)
                        break;