mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2026-03-03 18:28:01 +01:00
wifi: mac80211: Pull link space calculation to a function
Pull the calculation of the size needed for a link in an association request frame to a function, so it could also be used during the construction of other frames as well, e.g., ML link configuration request frame. Signed-off-by: Ilan Peer <ilan.peer@intel.com> Reviewed-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com> Link: https://patch.msgid.link/20250102161730.ac16adfa39d4.I9e28c2fcd5ca252341c817fc03ea8df7b807fcbf@changeid Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
@@ -1864,6 +1864,55 @@ ieee80211_assoc_add_ml_elem(struct ieee80211_sub_if_data *sdata,
|
||||
ieee80211_fragment_element(skb, ml_elem_len, WLAN_EID_FRAGMENT);
|
||||
}
|
||||
|
||||
static int
|
||||
ieee80211_link_common_elems_size(struct ieee80211_sub_if_data *sdata,
|
||||
enum nl80211_iftype iftype,
|
||||
struct cfg80211_bss *cbss,
|
||||
size_t elems_len)
|
||||
{
|
||||
struct ieee80211_local *local = sdata->local;
|
||||
const struct ieee80211_sband_iftype_data *iftd;
|
||||
struct ieee80211_supported_band *sband;
|
||||
size_t size = 0;
|
||||
|
||||
if (!cbss)
|
||||
return size;
|
||||
|
||||
sband = local->hw.wiphy->bands[cbss->channel->band];
|
||||
|
||||
/* add STA profile elements length */
|
||||
size += elems_len;
|
||||
|
||||
/* and supported rates length */
|
||||
size += 4 + sband->n_bitrates;
|
||||
|
||||
/* supported channels */
|
||||
size += 2 + 2 * sband->n_channels;
|
||||
|
||||
iftd = ieee80211_get_sband_iftype_data(sband, iftype);
|
||||
if (iftd)
|
||||
size += iftd->vendor_elems.len;
|
||||
|
||||
/* power capability */
|
||||
size += 4;
|
||||
|
||||
/* HT, VHT, HE, EHT */
|
||||
size += 2 + sizeof(struct ieee80211_ht_cap);
|
||||
size += 2 + sizeof(struct ieee80211_vht_cap);
|
||||
size += 2 + 1 + sizeof(struct ieee80211_he_cap_elem) +
|
||||
sizeof(struct ieee80211_he_mcs_nss_supp) +
|
||||
IEEE80211_HE_PPE_THRES_MAX_LEN;
|
||||
|
||||
if (sband->band == NL80211_BAND_6GHZ)
|
||||
size += 2 + 1 + sizeof(struct ieee80211_he_6ghz_capa);
|
||||
|
||||
size += 2 + 1 + sizeof(struct ieee80211_eht_cap_elem) +
|
||||
sizeof(struct ieee80211_eht_mcs_nss_supp) +
|
||||
IEEE80211_EHT_PPE_THRES_MAX_LEN;
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
static int ieee80211_send_assoc(struct ieee80211_sub_if_data *sdata)
|
||||
{
|
||||
struct ieee80211_local *local = sdata->local;
|
||||
@@ -1902,42 +1951,15 @@ static int ieee80211_send_assoc(struct ieee80211_sub_if_data *sdata)
|
||||
|
||||
for (link_id = 0; link_id < IEEE80211_MLD_MAX_NUM_LINKS; link_id++) {
|
||||
struct cfg80211_bss *cbss = assoc_data->link[link_id].bss;
|
||||
const struct ieee80211_sband_iftype_data *iftd;
|
||||
struct ieee80211_supported_band *sband;
|
||||
size_t elems_len = assoc_data->link[link_id].elems_len;
|
||||
|
||||
if (!cbss)
|
||||
continue;
|
||||
|
||||
sband = local->hw.wiphy->bands[cbss->channel->band];
|
||||
|
||||
n_links++;
|
||||
/* add STA profile elements length */
|
||||
size += assoc_data->link[link_id].elems_len;
|
||||
/* and supported rates length */
|
||||
size += 4 + sband->n_bitrates;
|
||||
/* supported channels */
|
||||
size += 2 + 2 * sband->n_channels;
|
||||
|
||||
iftd = ieee80211_get_sband_iftype_data(sband, iftype);
|
||||
if (iftd)
|
||||
size += iftd->vendor_elems.len;
|
||||
|
||||
/* power capability */
|
||||
size += 4;
|
||||
|
||||
/* HT, VHT, HE, EHT */
|
||||
size += 2 + sizeof(struct ieee80211_ht_cap);
|
||||
size += 2 + sizeof(struct ieee80211_vht_cap);
|
||||
size += 2 + 1 + sizeof(struct ieee80211_he_cap_elem) +
|
||||
sizeof(struct ieee80211_he_mcs_nss_supp) +
|
||||
IEEE80211_HE_PPE_THRES_MAX_LEN;
|
||||
|
||||
if (sband->band == NL80211_BAND_6GHZ)
|
||||
size += 2 + 1 + sizeof(struct ieee80211_he_6ghz_capa);
|
||||
|
||||
size += 2 + 1 + sizeof(struct ieee80211_eht_cap_elem) +
|
||||
sizeof(struct ieee80211_eht_mcs_nss_supp) +
|
||||
IEEE80211_EHT_PPE_THRES_MAX_LEN;
|
||||
size += ieee80211_link_common_elems_size(sdata, iftype, cbss,
|
||||
elems_len);
|
||||
|
||||
/* non-inheritance element */
|
||||
size += 2 + 2 + PRESENT_ELEMS_MAX;
|
||||
|
||||
Reference in New Issue
Block a user