diff mbox series

[07/12] mac80211: S1G capabilities information element in probe request

Message ID 20220711010816.45927-8-kieran.frewen@morsemicro.com
State New
Headers show
Series Additional support for 802.11ah (S1G) | expand

Commit Message

Kieran Frewen July 11, 2022, 1:08 a.m. UTC
Add the missing S1G capabilities information element to probe requests.

Signed-off-by: Kieran Frewen <kieran.frewen@morsemicro.com>
Signed-off-by: Bassem Dawood <bassem@morsemicro.com>
---
 net/mac80211/util.c | 37 +++++++++++++++++++++++++++++++++++++
 1 file changed, 37 insertions(+)

Comments

Jeff Johnson July 12, 2022, 10:23 p.m. UTC | #1
On 7/10/2022 6:08 PM, Kieran Frewen wrote:
> Add the missing S1G capabilities information element to probe requests.
> 
> Signed-off-by: Kieran Frewen <kieran.frewen@morsemicro.com>
> Signed-off-by: Bassem Dawood <bassem@morsemicro.com>
> ---
>   net/mac80211/util.c | 37 +++++++++++++++++++++++++++++++++++++
>   1 file changed, 37 insertions(+)
> 
> diff --git a/net/mac80211/util.c b/net/mac80211/util.c
> index bccc3a309ed0..51a2c1dee360 100644
> --- a/net/mac80211/util.c
> +++ b/net/mac80211/util.c
> @@ -1832,6 +1832,43 @@ static int ieee80211_build_preq_ies_band(struct ieee80211_sub_if_data *sdata,
>   	rate_flags = ieee80211_chandef_rate_flags(chandef);
>   	shift = ieee80211_chandef_get_shift(chandef);
>   
> +	/* For direct mac80211 scan (probe request), add S1G IE and consider its override bits */
> +	if (band == NL80211_BAND_S1GHZ) {
> +		struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
> +		struct ieee80211_s1g_cap s1g_capab;
> +
> +		*pos++ = WLAN_EID_S1G_CAPABILITIES;
> +		*pos++ = sizeof(s1g_capab);
> +

why create s1g_capab on the stack and then copy into place?
why not create it directly in place and avoid the copy?

> +		memcpy(s1g_capab.capab_info,
> +		       sband->s1g_cap.cap,
> +		       sizeof(sband->s1g_cap.cap));
> +		memcpy(s1g_capab.supp_mcs_nss,
> +		       sband->s1g_cap.nss_mcs,
> +		       sizeof(sband->s1g_cap.nss_mcs));
> +
> +		/* override the capability info */
> +		for (i = 0; i < sizeof(ifmgd->s1g_capa.capab_info); i++) {
> +			u8 mask = ifmgd->s1g_capa_mask.capab_info[i];
> +
> +			s1g_capab.capab_info[i] &= ~mask;
> +			s1g_capab.capab_info[i] |= ifmgd->s1g_capa.capab_info[i] & mask;
> +		}
> +
> +		/* then MCS and NSS set */
> +		for (i = 0; i < sizeof(ifmgd->s1g_capa.supp_mcs_nss); i++) {
> +			u8 mask = ifmgd->s1g_capa_mask.supp_mcs_nss[i];
> +
> +			s1g_capab.supp_mcs_nss[i] &= ~mask;
> +			s1g_capab.supp_mcs_nss[i] |= ifmgd->s1g_capa.supp_mcs_nss[i] & mask;
> +		}
> +
> +		memcpy(pos, &s1g_capab, sizeof(s1g_capab));
> +		pos += sizeof(s1g_capab);
> +		/* No more IEs relevant for S1G */
> +		goto done;
> +	}
> +
>   	num_rates = 0;
>   	for (i = 0; i < sband->n_bitrates; i++) {
>   		if ((BIT(i) & rate_mask) == 0)
diff mbox series

Patch

diff --git a/net/mac80211/util.c b/net/mac80211/util.c
index bccc3a309ed0..51a2c1dee360 100644
--- a/net/mac80211/util.c
+++ b/net/mac80211/util.c
@@ -1832,6 +1832,43 @@  static int ieee80211_build_preq_ies_band(struct ieee80211_sub_if_data *sdata,
 	rate_flags = ieee80211_chandef_rate_flags(chandef);
 	shift = ieee80211_chandef_get_shift(chandef);
 
+	/* For direct mac80211 scan (probe request), add S1G IE and consider its override bits */
+	if (band == NL80211_BAND_S1GHZ) {
+		struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
+		struct ieee80211_s1g_cap s1g_capab;
+
+		*pos++ = WLAN_EID_S1G_CAPABILITIES;
+		*pos++ = sizeof(s1g_capab);
+
+		memcpy(s1g_capab.capab_info,
+		       sband->s1g_cap.cap,
+		       sizeof(sband->s1g_cap.cap));
+		memcpy(s1g_capab.supp_mcs_nss,
+		       sband->s1g_cap.nss_mcs,
+		       sizeof(sband->s1g_cap.nss_mcs));
+
+		/* override the capability info */
+		for (i = 0; i < sizeof(ifmgd->s1g_capa.capab_info); i++) {
+			u8 mask = ifmgd->s1g_capa_mask.capab_info[i];
+
+			s1g_capab.capab_info[i] &= ~mask;
+			s1g_capab.capab_info[i] |= ifmgd->s1g_capa.capab_info[i] & mask;
+		}
+
+		/* then MCS and NSS set */
+		for (i = 0; i < sizeof(ifmgd->s1g_capa.supp_mcs_nss); i++) {
+			u8 mask = ifmgd->s1g_capa_mask.supp_mcs_nss[i];
+
+			s1g_capab.supp_mcs_nss[i] &= ~mask;
+			s1g_capab.supp_mcs_nss[i] |= ifmgd->s1g_capa.supp_mcs_nss[i] & mask;
+		}
+
+		memcpy(pos, &s1g_capab, sizeof(s1g_capab));
+		pos += sizeof(s1g_capab);
+		/* No more IEs relevant for S1G */
+		goto done;
+	}
+
 	num_rates = 0;
 	for (i = 0; i < sband->n_bitrates; i++) {
 		if ((BIT(i) & rate_mask) == 0)