cfg80211/mac80211: Support disabling HE mode
authorBen Greear <greearb@candelatech.com>
Thu, 4 Feb 2021 14:46:10 +0000 (06:46 -0800)
committerJohannes Berg <johannes.berg@intel.com>
Fri, 12 Feb 2021 08:33:34 +0000 (09:33 +0100)
Allow user to disable HE mode, similar to how VHT and HT
can be disabled.  Useful for testing.

Signed-off-by: Ben Greear <greearb@candelatech.com>
Link: https://lore.kernel.org/r/20210204144610.25971-1-greearb@candelatech.com
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
include/net/cfg80211.h
include/uapi/linux/nl80211.h
net/mac80211/mlme.c
net/wireless/nl80211.c

index 4cdd754..911fae4 100644 (file)
@@ -2583,12 +2583,14 @@ struct cfg80211_auth_request {
  *     authentication capability. Drivers can offload authentication to
  *     userspace if this flag is set. Only applicable for cfg80211_connect()
  *     request (connect callback).
+ * @ASSOC_REQ_DISABLE_HE:  Disable HE
  */
 enum cfg80211_assoc_req_flags {
        ASSOC_REQ_DISABLE_HT                    = BIT(0),
        ASSOC_REQ_DISABLE_VHT                   = BIT(1),
        ASSOC_REQ_USE_RRM                       = BIT(2),
        CONNECT_REQ_EXTERNAL_AUTH_SUPPORT       = BIT(3),
+       ASSOC_REQ_DISABLE_HE                    = BIT(4),
 };
 
 /**
index 40832d1..5188fe5 100644 (file)
@@ -3045,6 +3045,8 @@ enum nl80211_attrs {
 
        NL80211_ATTR_SAR_SPEC,
 
+       NL80211_ATTR_DISABLE_HE,
+
        /* add attributes here, update the policy in nl80211.c */
 
        __NL80211_ATTR_AFTER_LAST,
index 0e4d950..2e33a12 100644 (file)
@@ -5754,6 +5754,9 @@ int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata,
        if (req->flags & ASSOC_REQ_DISABLE_VHT)
                ifmgd->flags |= IEEE80211_STA_DISABLE_VHT;
 
+       if (req->flags & ASSOC_REQ_DISABLE_HE)
+               ifmgd->flags |= IEEE80211_STA_DISABLE_HE;
+
        err = ieee80211_prep_connection(sdata, req->bss, true, override);
        if (err)
                goto err_clear;
index 3b45a95..521d36b 100644 (file)
@@ -752,6 +752,7 @@ static const struct nla_policy nl80211_policy[NUM_NL80211_ATTR] = {
                                 NL80211_SAE_PWE_BOTH),
        [NL80211_ATTR_RECONNECT_REQUESTED] = { .type = NLA_REJECT },
        [NL80211_ATTR_SAR_SPEC] = NLA_POLICY_NESTED(sar_policy),
+       [NL80211_ATTR_DISABLE_HE] = { .type = NLA_FLAG },
 };
 
 /* policy for the key attributes */
@@ -10019,6 +10020,9 @@ static int nl80211_associate(struct sk_buff *skb, struct genl_info *info)
        if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_VHT]))
                req.flags |= ASSOC_REQ_DISABLE_VHT;
 
+       if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HE]))
+               req.flags |= ASSOC_REQ_DISABLE_HE;
+
        if (info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK])
                memcpy(&req.vht_capa_mask,
                       nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]),
@@ -10802,6 +10806,9 @@ static int nl80211_connect(struct sk_buff *skb, struct genl_info *info)
        if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_VHT]))
                connect.flags |= ASSOC_REQ_DISABLE_VHT;
 
+       if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HE]))
+               connect.flags |= ASSOC_REQ_DISABLE_HE;
+
        if (info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK])
                memcpy(&connect.vht_capa_mask,
                       nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]),