]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: mac80211: Pull link space calculation to a function
authorIlan Peer <ilan.peer@intel.com>
Thu, 2 Jan 2025 14:19:57 +0000 (16:19 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Mon, 13 Jan 2025 14:34:08 +0000 (15:34 +0100)
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>
net/mac80211/mlme.c

index 3447f29d61723ea1575e65157b9ffb33fec4becc..d6252515fa70b6675c2b61bfc0bd85713e2a9f1b 100644 (file)
@@ -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;