cfg80211: add and expose HE 6 GHz band capabilities
authorJohannes Berg <johannes.berg@intel.com>
Thu, 28 May 2020 19:34:31 +0000 (21:34 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Sun, 31 May 2020 09:26:36 +0000 (11:26 +0200)
These capabilities cover what would otherwise be transported
in HT/VHT capabilities, but only a subset thereof that is
actually needed on 6 GHz with HE already present. Expose the
capabilities to userspace, drivers are expected to set them
as using the 6 GHz band (currently) requires HE capability.

Link: https://lore.kernel.org/r/20200528213443.244cd5cb9db8.Icd8c773277a88c837e7e3af1d4d1013cc3b66543@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
include/net/cfg80211.h
include/uapi/linux/nl80211.h
net/wireless/nl80211.c

index da734ea71b5a8ad4f0fa7f473b6d4ec657099bee..9b76be3d561a53c387f7b5af211f1be418d724d5 100644 (file)
@@ -354,10 +354,13 @@ struct ieee80211_sta_he_cap {
  *
  * @types_mask: interface types mask
  * @he_cap: holds the HE capabilities
+ * @he_6ghz_capa: HE 6 GHz capabilities, must be filled in for a
+ *     6 GHz band channel (and 0 may be valid value).
  */
 struct ieee80211_sband_iftype_data {
        u16 types_mask;
        struct ieee80211_sta_he_cap he_cap;
+       struct ieee80211_he_6ghz_capa he_6ghz_capa;
 };
 
 /**
index e42ae429383e2bc7dc309b895aa007d9f0518c51..5b350d032fa3e65e5fcb4ea946f4cbd6a1b565f4 100644 (file)
@@ -3565,6 +3565,8 @@ enum nl80211_mpath_info {
  *     defined in HE capabilities IE
  * @NL80211_BAND_IFTYPE_ATTR_MAX: highest band HE capability attribute currently
  *     defined
+ * @NL80211_BAND_IFTYPE_ATTR_HE_6GHZ_CAPA: HE 6GHz band capabilities (__le16),
+ *     given for all 6 GHz band channels
  * @__NL80211_BAND_IFTYPE_ATTR_AFTER_LAST: internal use
  */
 enum nl80211_band_iftype_attr {
@@ -3575,6 +3577,7 @@ enum nl80211_band_iftype_attr {
        NL80211_BAND_IFTYPE_ATTR_HE_CAP_PHY,
        NL80211_BAND_IFTYPE_ATTR_HE_CAP_MCS_SET,
        NL80211_BAND_IFTYPE_ATTR_HE_CAP_PPE,
+       NL80211_BAND_IFTYPE_ATTR_HE_6GHZ_CAPA,
 
        /* keep last */
        __NL80211_BAND_IFTYPE_ATTR_AFTER_LAST,
index bf8bd8268cb7096fdaa11f4a0f3852b3c5668e93..3a24e6add13e86d22b861c216d8a951328626a1c 100644 (file)
@@ -1562,6 +1562,7 @@ static int nl80211_send_coalesce(struct sk_buff *msg,
 
 static int
 nl80211_send_iftype_data(struct sk_buff *msg,
+                        const struct ieee80211_supported_band *sband,
                         const struct ieee80211_sband_iftype_data *iftdata)
 {
        const struct ieee80211_sta_he_cap *he_cap = &iftdata->he_cap;
@@ -1585,6 +1586,12 @@ nl80211_send_iftype_data(struct sk_buff *msg,
                        return -ENOBUFS;
        }
 
+       if (sband->band == NL80211_BAND_6GHZ &&
+           nla_put(msg, NL80211_BAND_IFTYPE_ATTR_HE_6GHZ_CAPA,
+                   sizeof(iftdata->he_6ghz_capa),
+                   &iftdata->he_6ghz_capa))
+               return -ENOBUFS;
+
        return 0;
 }
 
@@ -1633,7 +1640,7 @@ static int nl80211_send_band_rateinfo(struct sk_buff *msg,
                        if (!iftdata)
                                return -ENOBUFS;
 
-                       err = nl80211_send_iftype_data(msg,
+                       err = nl80211_send_iftype_data(msg, sband,
                                                       &sband->iftype_data[i]);
                        if (err)
                                return err;