Message ID | 1640163883-12696-4-git-send-email-quic_vjakkam@quicinc.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Johannes Berg |
Headers | show |
Series | cfg80211/nl80211: add support for EHT | expand |
On Wed, 2021-12-22 at 14:34 +0530, Veerendranath Jakkam wrote: > > +#define NL80211_EHT_MIN_CAPABILITY_LEN 10 > +#define NL80211_EHT_MAX_CAPABILITY_LEN 81 > How did you get to 81? I calculate only 51, based on the assumption that we can only have NSS==8. Even if you think NSS==16 (which I doubt), I get to 80 only? johannes
On Wed, 2021-12-22 at 14:34 +0530, Veerendranath Jakkam wrote: > > +#define NL80211_EHT_MIN_CAPABILITY_LEN 10 > And that's 13, no? You have to support 80 MHz. johannes
On 2/3/22 6:15 PM, Johannes Berg wrote: > On Wed, 2021-12-22 at 14:34 +0530, Veerendranath Jakkam wrote: >> >> +#define NL80211_EHT_MIN_CAPABILITY_LEN 10 >> +#define NL80211_EHT_MAX_CAPABILITY_LEN 81 >> > How did you get to 81? > > I calculate only 51, based on the assumption that we can only have > NSS==8. Even if you think NSS==16 (which I doubt), I get to 80 only? > > johannes I considered max values for NSS and RU Index Bitmask sub-fields in PPE threshold field. i.e. NSS=16, RU Index Bitmask = 0x11111 with this max PPE threshold info sub-field length is 60 bytes Max PPE thresholds field length = 4 bits (for NSS) + 5 bits (for RU Index Bitmask) + 480 bits (PPE info) + 7 bits (PPE pad)= 62 bytes EHT fixed fields length = 10 bytes Max MCS-NSS Set field length = 9 bytes So total max length would be 81 bytes
On 2/3/22 6:17 PM, Johannes Berg wrote: > On Wed, 2021-12-22 at 14:34 +0530, Veerendranath Jakkam wrote: >> +#define NL80211_EHT_MIN_CAPABILITY_LEN 10 >> > And that's 13, no? You have to support 80 MHz. > > johannes I considered fixed fields lengths only for minimum length. But I agree that we can include minimum possible length of MCS-NSS Set field also.
On Fri, 2022-02-04 at 12:42 +0530, Veerendranath Jakkam wrote: > > > > I calculate only 51, based on the assumption that we can only have > > NSS==8. Even if you think NSS==16 (which I doubt), I get to 80 only? > > So total max length would be 81 bytes > Right. Now I don't know how I got to 80... Regardless, I don't think NSS>8 is actually valid, the PHY spec always says it's max of 8, so I think we can safely limit to 51? johannes
On 2/4/22 1:41 PM, Johannes Berg wrote: > On Fri, 2022-02-04 at 12:42 +0530, Veerendranath Jakkam wrote: >>> I calculate only 51, based on the assumption that we can only have >>> NSS==8. Even if you think NSS==16 (which I doubt), I get to 80 only? >> So total max length would be 81 bytes >> > Right. Now I don't know how I got to 80... > > Regardless, I don't think NSS>8 is actually valid, the PHY spec always > says it's max of 8, so I think we can safely limit to 51? > > johannes There are some references for NSS > 8, ex: Table 9-33a, P802.11be_D1.3 hence I used 81. Please let me know if you would like this to be changed to 51
On Fri, 2022-02-04 at 20:07 +0530, Veerendranath Jakkam wrote: > > There are some references for NSS > 8, ex: Table 9-33a, P802.11be_D1.3 > hence I used 81. Right, the spec confuses me. In a lot of places it reserves enough space for 8 < NSS <= 16, but then it has e.g. Table 36-40 with 4 bits, but saying "for up to 8 spatial streams" (MU-MIMO). And even for OFDMA it states in a lot of places that the maximum is only 8. > Please let me know if you would like this to be changed to 51 > Nah, don't worry. I think it probably doesn't even really *matter*, we can safely leave it at 81 anyway (I had evidently miscalculated as 80 before, so I was confused). We also already had some patches in this area, and I'm just working on a combination - e.g. in your first patch I don't like the use of FIELD_GET so much, preferring uXX_get_bits(), but Ilan already had patches here that deal with that. For many of the other patches, Ilan and you arrived at a literally bit- identical version of things! So I think I'm going to pick a couple of things from him and a couple of things from you, and send out a combined series. Perhaps later today, if I manage to get it done. Also in your later nl80211 patch I'm thinking we should combine the HE/EHT GI settings etc., there's no point duplicating all the enums, though we might want to do some renaming. Sounds OK? johannes
On 2/4/22 8:13 PM, Johannes Berg wrote: > On Fri, 2022-02-04 at 20:07 +0530, Veerendranath Jakkam wrote: >> There are some references for NSS > 8, ex: Table 9-33a, P802.11be_D1.3 >> hence I used 81. > Right, the spec confuses me. In a lot of places it reserves enough space > for 8 < NSS <= 16, but then it has e.g. Table 36-40 with 4 bits, but > saying "for up to 8 spatial streams" (MU-MIMO). And even for OFDMA it > states in a lot of places that the maximum is only 8. > >> Please let me know if you would like this to be changed to 51 >> > Nah, don't worry. I think it probably doesn't even really *matter*, we > can safely leave it at 81 anyway (I had evidently miscalculated as 80 > before, so I was confused). > > We also already had some patches in this area, and I'm just working on a > combination - e.g. in your first patch I don't like the use of FIELD_GET > so much, preferring uXX_get_bits(), but Ilan already had patches here > that deal with that. > > For many of the other patches, Ilan and you arrived at a literally bit- > identical version of things! > > So I think I'm going to pick a couple of things from him and a couple of > things from you, and send out a combined series. Perhaps later today, if > I manage to get it done. Sure, Thanks for the update. > Also in your later nl80211 patch I'm thinking we should combine the > HE/EHT GI settings etc., there's no point duplicating all the enums, > though we might want to do some renaming. > > Sounds OK? > > johannes Yeah, This looks fine for me. meanwhile I will upload new patch set with the suggested changes in last patch.
On Fri, 2022-02-04 at 23:13 +0530, Veerendranath Jakkam wrote: > > > > Also in your later nl80211 patch I'm thinking we should combine the > > HE/EHT GI settings etc., there's no point duplicating all the enums, > > though we might want to do some renaming. I actually just decided against that ... it gets messy because we still need the attributes, and the GI is the only one that's entirely the same, so I think probably duplicating that is more understandable (all the EHT stuff belongs together)... > > meanwhile I will upload new patch set with the suggested changes in last > patch. No need. I'm doing rework on this, and we also have mac80211 assoc patches, STA capabilities, etc. I'll send it all out soon. johannes
On 2/4/22 11:15 PM, Johannes Berg wrote: > On Fri, 2022-02-04 at 23:13 +0530, Veerendranath Jakkam wrote: >> >>> Also in your later nl80211 patch I'm thinking we should combine the >>> HE/EHT GI settings etc., there's no point duplicating all the enums, >>> though we might want to do some renaming. > I actually just decided against that ... it gets messy because we still > need the attributes, and the GI is the only one that's entirely the > same, so I think probably duplicating that is more understandable (all > the EHT stuff belongs together)... > >> meanwhile I will upload new patch set with the suggested changes in last >> patch. > No need. I'm doing rework on this, and we also have mac80211 assoc > patches, STA capabilities, etc. I'll send it all out soon. > > johannes Thank a lot for your assistance. Looking forward to see your patches.. :) veeru
diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h index df197c6..ce34dd7 100644 --- a/include/net/cfg80211.h +++ b/include/net/cfg80211.h @@ -1271,6 +1271,7 @@ struct cfg80211_unsol_bcast_probe_resp { * @ht_cap: HT capabilities (or %NULL if HT isn't enabled) * @vht_cap: VHT capabilities (or %NULL if VHT isn't enabled) * @he_cap: HE capabilities (or %NULL if HE isn't enabled) + * @eht_cap: EHT capabilities (or %NULL if EHT isn't enabled) * @ht_required: stations must support HT * @vht_required: stations must support VHT * @twt_responder: Enable Target Wait Time @@ -1308,6 +1309,7 @@ struct cfg80211_ap_settings { const struct ieee80211_vht_cap *vht_cap; const struct ieee80211_he_cap_elem *he_cap; const struct ieee80211_he_operation *he_oper; + const struct ieee80211_eht_cap_elem *eht_cap; bool ht_required, vht_required, he_required, sae_h2e_required; bool twt_responder; u32 flags; @@ -1473,6 +1475,8 @@ struct sta_txpwr { * @airtime_weight: airtime scheduler weight for this station * @txpwr: transmit power for an associated station * @he_6ghz_capa: HE 6 GHz Band capabilities of station + * @eht_capa: EHT capabilities of station + * @eht_capa_len: the length of the EHT capabilities */ struct station_parameters { const u8 *supported_rates; @@ -1506,6 +1510,8 @@ struct station_parameters { u16 airtime_weight; struct sta_txpwr txpwr; const struct ieee80211_he_6ghz_capa *he_6ghz_capa; + const struct ieee80211_eht_cap_elem *eht_capa; + u8 eht_capa_len; }; /** diff --git a/include/uapi/linux/nl80211.h b/include/uapi/linux/nl80211.h index a709f5c..c221322 100644 --- a/include/uapi/linux/nl80211.h +++ b/include/uapi/linux/nl80211.h @@ -2659,6 +2659,8 @@ enum nl80211_commands { * enumerated in &enum nl80211_ap_settings_flags. This attribute shall be * used with %NL80211_CMD_START_AP request. * + * @NL80211_ATTR_EHT_CAPABILITY: EHT Capability information element. + * * @NUM_NL80211_ATTR: total number of nl80211_attrs available * @NL80211_ATTR_MAX: highest attribute number currently defined * @__NL80211_ATTR_AFTER_LAST: internal use @@ -3169,6 +3171,8 @@ enum nl80211_attrs { NL80211_ATTR_AP_SETTINGS_FLAGS, + NL80211_ATTR_EHT_CAPABILITY, + /* add attributes here, update the policy in nl80211.c */ __NL80211_ATTR_AFTER_LAST, @@ -3225,6 +3229,9 @@ enum nl80211_attrs { #define NL80211_MAX_NR_CIPHER_SUITES 5 #define NL80211_MAX_NR_AKM_SUITES 2 +#define NL80211_EHT_MIN_CAPABILITY_LEN 10 +#define NL80211_EHT_MAX_CAPABILITY_LEN 81 + #define NL80211_MIN_REMAIN_ON_CHANNEL_TIME 10 /* default RSSI threshold for scan results if none specified. */ diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index 0ece4d3..dba4002 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c @@ -778,6 +778,10 @@ static const struct nla_policy nl80211_policy[NUM_NL80211_ATTR] = { [NL80211_ATTR_MBSSID_ELEMS] = { .type = NLA_NESTED }, [NL80211_ATTR_RADAR_BACKGROUND] = { .type = NLA_FLAG }, [NL80211_ATTR_AP_SETTINGS_FLAGS] = { .type = NLA_U32 }, + [NL80211_ATTR_EHT_CAPABILITY] = + NLA_POLICY_RANGE(NLA_BINARY, + NL80211_EHT_MIN_CAPABILITY_LEN, + NL80211_EHT_MAX_CAPABILITY_LEN), }; /* policy for the key attributes */ @@ -5414,6 +5418,9 @@ static void nl80211_calculate_ap_params(struct cfg80211_ap_settings *params) cap = cfg80211_find_ext_elem(WLAN_EID_EXT_HE_OPERATION, ies, ies_len); if (cap && cap->datalen >= sizeof(*params->he_oper) + 1) params->he_oper = (void *)(cap->data + 1); + cap = cfg80211_find_ext_elem(WLAN_EID_EXT_EHT_CAPABILITY, ies, ies_len); + if (cap && cap->datalen >= sizeof(*params->eht_cap) + 1) + params->eht_cap = (void *)(cap->data + 1); } static bool nl80211_get_ap_channel(struct cfg80211_registered_device *rdev, @@ -6382,7 +6389,7 @@ int cfg80211_check_station_change(struct wiphy *wiphy, if (params->supported_rates) return -EINVAL; if (params->ext_capab || params->ht_capa || params->vht_capa || - params->he_capa) + params->he_capa || params->eht_capa) return -EINVAL; } @@ -6567,6 +6574,17 @@ static int nl80211_parse_sta_channel_info(struct genl_info *info, return 0; } +static void nl80211_parse_sta_eht_capa(struct genl_info *info, + struct station_parameters *params) +{ + if (info->attrs[NL80211_ATTR_EHT_CAPABILITY]) { + params->eht_capa = + nla_data(info->attrs[NL80211_ATTR_EHT_CAPABILITY]); + params->eht_capa_len = + nla_len(info->attrs[NL80211_ATTR_EHT_CAPABILITY]); + } +} + static int nl80211_set_station_tdls(struct genl_info *info, struct station_parameters *params) { @@ -6587,6 +6605,8 @@ static int nl80211_set_station_tdls(struct genl_info *info, nla_len(info->attrs[NL80211_ATTR_HE_CAPABILITY]); } + nl80211_parse_sta_eht_capa(info, params); + err = nl80211_parse_sta_channel_info(info, params); if (err) return err; @@ -6848,6 +6868,8 @@ static int nl80211_new_station(struct sk_buff *skb, struct genl_info *info) params.he_6ghz_capa = nla_data(info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]); + nl80211_parse_sta_eht_capa(info, ¶ms); + if (info->attrs[NL80211_ATTR_OPMODE_NOTIF]) { params.opmode_notif_used = true; params.opmode_notif = @@ -6891,8 +6913,9 @@ static int nl80211_new_station(struct sk_buff *skb, struct genl_info *info) params.ht_capa = NULL; params.vht_capa = NULL; - /* HE requires WME */ - if (params.he_capa_len || params.he_6ghz_capa) + /* HE and EHT requires WME */ + if (params.he_capa_len || params.he_6ghz_capa || + params.eht_capa_len) return -EINVAL; }