wifi: cfg80211: generate an ML element for per-STA profiles

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>
This commit is contained in:
Benjamin Berg 2023-12-11 09:05:27 +02:00 committed by Johannes Berg
parent f6289e5d31
commit 5f478adf1f

View 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;