Commit fa2b73bf authored by Ilan Peer's avatar Ilan Peer Committed by Johannes Berg
Browse files

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: default avatarIlan Peer <ilan.peer@intel.com>
Reviewed-by: default avatarJohannes Berg <johannes.berg@intel.com>
Signed-off-by: default avatarMiri Korenblit <miriam.rachel.korenblit@intel.com>
Link: https://patch.msgid.link/20250102161730.ac16adfa39d4.I9e28c2fcd5ca252341c817fc03ea8df7b807fcbf@changeid


Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 136a4e82
Loading
Loading
Loading
Loading
+53 −31
Original line number Diff line number Diff line
@@ -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;