diff options
author | Johannes Berg <johannes.berg@intel.com> | 2022-07-12 13:38:07 +0200 |
---|---|---|
committer | Johannes Berg <johannes.berg@intel.com> | 2022-07-15 11:43:21 +0200 |
commit | 8ec9a96b83bd69a8735f2a532105a62eb2e05309 (patch) | |
tree | 63f42e67827fb9dbe3332fc0d6e8a1b9e062af90 /net/mac80211/util.c | |
parent | 64f4b93afaf18f471724268bbb2d43262a9e0334 (diff) | |
download | linux-8ec9a96b83bd69a8735f2a532105a62eb2e05309.tar.gz linux-8ec9a96b83bd69a8735f2a532105a62eb2e05309.tar.bz2 linux-8ec9a96b83bd69a8735f2a532105a62eb2e05309.zip |
wifi: mac80211: add multi-link element to AUTH frames
When sending an authentication frame from an MLD, include
the multi-link element with the MLD address and use the
link address for transmission.
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'net/mac80211/util.c')
-rw-r--r-- | net/mac80211/util.c | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/net/mac80211/util.c b/net/mac80211/util.c index 8cb93d65b80e..18e1ba8ffee6 100644 --- a/net/mac80211/util.c +++ b/net/mac80211/util.c @@ -1714,11 +1714,28 @@ void ieee80211_send_auth(struct ieee80211_sub_if_data *sdata, struct ieee80211_local *local = sdata->local; struct sk_buff *skb; struct ieee80211_mgmt *mgmt; + bool multi_link = sdata->vif.valid_links; + struct { + u8 id; + u8 len; + u8 ext_id; + struct ieee80211_multi_link_elem ml; + struct ieee80211_mle_basic_common_info basic; + } __packed mle = { + .id = WLAN_EID_EXTENSION, + .len = sizeof(mle) - 2, + .ext_id = WLAN_EID_EXT_EHT_MULTI_LINK, + .ml.control = cpu_to_le16(IEEE80211_ML_CONTROL_TYPE_BASIC), + .basic.len = sizeof(mle.basic), + }; int err; + memcpy(mle.basic.mld_mac_addr, sdata->vif.addr, ETH_ALEN); + /* 24 + 6 = header + auth_algo + auth_transaction + status_code */ skb = dev_alloc_skb(local->hw.extra_tx_headroom + IEEE80211_WEP_IV_LEN + - 24 + 6 + extra_len + IEEE80211_WEP_ICV_LEN); + 24 + 6 + extra_len + IEEE80211_WEP_ICV_LEN + + multi_link * sizeof(mle)); if (!skb) return; @@ -1735,6 +1752,8 @@ void ieee80211_send_auth(struct ieee80211_sub_if_data *sdata, mgmt->u.auth.status_code = cpu_to_le16(status); if (extra) skb_put_data(skb, extra, extra_len); + if (multi_link) + skb_put_data(skb, &mle, sizeof(mle)); if (auth_alg == WLAN_AUTH_SHARED_KEY && transaction == 3) { mgmt->frame_control |= cpu_to_le16(IEEE80211_FCTL_PROTECTED); |