nl80211: Parse NL80211_ATTR_HE_BSS_COLOR as a part of nl80211_parse_beacon
authorRameshkumar Sundaram <quic_ramess@quicinc.com>
Wed, 13 Apr 2022 16:28:14 +0000 (21:58 +0530)
committerJohannes Berg <johannes.berg@intel.com>
Mon, 16 May 2022 07:45:21 +0000 (09:45 +0200)
NL80211_ATTR_HE_BSS_COLOR attribute can be included in both
NL80211_CMD_START_AP and NL80211_CMD_SET_BEACON commands.

Move he_bss_color from cfg80211_ap_settings to cfg80211_beacon_data
and parse NL80211_ATTR_HE_BSS_COLOR as a part of nl80211_parse_beacon()
to have bss color settings parsed for both start ap and set beacon
commands.
Add a new flag he_bss_color_valid to indicate whether
NL80211_ATTR_HE_BSS_COLOR attribute is included.

Signed-off-by: Rameshkumar Sundaram <quic_ramess@quicinc.com>
Link: https://lore.kernel.org/r/1649867295-7204-2-git-send-email-quic_ramess@quicinc.com
[fix build ...]
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
include/net/cfg80211.h
net/mac80211/cfg.c
net/wireless/nl80211.c

index 6a3e3f0a86154f270b33ed0b8653b17f6acdbb1c..97a5804ccdcfa9436a68001c9e8f301aa5468587 100644 (file)
@@ -1183,6 +1183,9 @@ struct cfg80211_mbssid_elems {
  *     Token (measurement type 11)
  * @lci_len: LCI data length
  * @civicloc_len: Civic location data length
+ * @he_bss_color: BSS Color settings
+ * @he_bss_color_valid: indicates whether bss color
+       attribute is present in beacon data or not.
  */
 struct cfg80211_beacon_data {
        const u8 *head, *tail;
@@ -1202,6 +1205,8 @@ struct cfg80211_beacon_data {
        size_t probe_resp_len;
        size_t lci_len;
        size_t civicloc_len;
+       struct cfg80211_he_bss_color he_bss_color;
+       bool he_bss_color_valid;
 };
 
 struct mac_address {
@@ -1292,7 +1297,6 @@ struct cfg80211_unsol_bcast_probe_resp {
  * @sae_h2e_required: stations must support direct H2E technique in SAE
  * @flags: flags, as defined in enum cfg80211_ap_settings_flags
  * @he_obss_pd: OBSS Packet Detection settings
- * @he_bss_color: BSS Color settings
  * @he_oper: HE operation IE (or %NULL if HE isn't enabled)
  * @fils_discovery: FILS discovery transmission parameters
  * @unsol_bcast_probe_resp: Unsolicited broadcast probe response parameters
@@ -1326,7 +1330,6 @@ struct cfg80211_ap_settings {
        bool twt_responder;
        u32 flags;
        struct ieee80211_he_obss_pd he_obss_pd;
-       struct cfg80211_he_bss_color he_bss_color;
        struct cfg80211_fils_discovery fils_discovery;
        struct cfg80211_unsol_bcast_probe_resp unsol_bcast_probe_resp;
        struct cfg80211_mbssid_config mbssid_config;
index f817cf7630699ef6abc2eb247a84491e89f515d5..555db74d62743c324359e099f7e57e3aa9543b72 100644 (file)
@@ -1174,7 +1174,7 @@ static int ieee80211_start_ap(struct wiphy *wiphy, struct net_device *dev,
                              IEEE80211_HE_OPERATION_RTS_THRESHOLD_MASK);
                changed |= BSS_CHANGED_HE_OBSS_PD;
 
-               if (params->he_bss_color.enabled)
+               if (params->beacon.he_bss_color.enabled)
                        changed |= BSS_CHANGED_HE_BSS_COLOR;
        }
 
@@ -1231,7 +1231,7 @@ static int ieee80211_start_ap(struct wiphy *wiphy, struct net_device *dev,
        sdata->vif.bss_conf.allow_p2p_go_ps = sdata->vif.p2p;
        sdata->vif.bss_conf.twt_responder = params->twt_responder;
        sdata->vif.bss_conf.he_obss_pd = params->he_obss_pd;
-       sdata->vif.bss_conf.he_bss_color = params->he_bss_color;
+       sdata->vif.bss_conf.he_bss_color = params->beacon.he_bss_color;
        sdata->vif.bss_conf.s1g = params->chandef.chan->band ==
                                  NL80211_BAND_S1GHZ;
 
index 2c64baae9863801d2ce8572ef52e1529e158e58c..842f82fb3ced1015beb905159b17f94f0ad66201 100644 (file)
@@ -5173,6 +5173,30 @@ nl80211_parse_mbssid_elems(struct wiphy *wiphy, struct nlattr *attrs)
        return elems;
 }
 
+static int nl80211_parse_he_bss_color(struct nlattr *attrs,
+                                     struct cfg80211_he_bss_color *he_bss_color)
+{
+       struct nlattr *tb[NL80211_HE_BSS_COLOR_ATTR_MAX + 1];
+       int err;
+
+       err = nla_parse_nested(tb, NL80211_HE_BSS_COLOR_ATTR_MAX, attrs,
+                              he_bss_color_policy, NULL);
+       if (err)
+               return err;
+
+       if (!tb[NL80211_HE_BSS_COLOR_ATTR_COLOR])
+               return -EINVAL;
+
+       he_bss_color->color =
+               nla_get_u8(tb[NL80211_HE_BSS_COLOR_ATTR_COLOR]);
+       he_bss_color->enabled =
+               !nla_get_flag(tb[NL80211_HE_BSS_COLOR_ATTR_DISABLED]);
+       he_bss_color->partial =
+               nla_get_flag(tb[NL80211_HE_BSS_COLOR_ATTR_PARTIAL]);
+
+       return 0;
+}
+
 static int nl80211_parse_beacon(struct cfg80211_registered_device *rdev,
                                struct nlattr *attrs[],
                                struct cfg80211_beacon_data *bcn)
@@ -5253,6 +5277,14 @@ static int nl80211_parse_beacon(struct cfg80211_registered_device *rdev,
                bcn->ftm_responder = -1;
        }
 
+       if (attrs[NL80211_ATTR_HE_BSS_COLOR]) {
+               err = nl80211_parse_he_bss_color(attrs[NL80211_ATTR_HE_BSS_COLOR],
+                                                &bcn->he_bss_color);
+               if (err)
+                       return err;
+               bcn->he_bss_color_valid = true;
+       }
+
        if (attrs[NL80211_ATTR_MBSSID_ELEMS]) {
                struct cfg80211_mbssid_elems *mbssid =
                        nl80211_parse_mbssid_elems(&rdev->wiphy,
@@ -5311,30 +5343,6 @@ static int nl80211_parse_he_obss_pd(struct nlattr *attrs,
        return 0;
 }
 
-static int nl80211_parse_he_bss_color(struct nlattr *attrs,
-                                     struct cfg80211_he_bss_color *he_bss_color)
-{
-       struct nlattr *tb[NL80211_HE_BSS_COLOR_ATTR_MAX + 1];
-       int err;
-
-       err = nla_parse_nested(tb, NL80211_HE_BSS_COLOR_ATTR_MAX, attrs,
-                              he_bss_color_policy, NULL);
-       if (err)
-               return err;
-
-       if (!tb[NL80211_HE_BSS_COLOR_ATTR_COLOR])
-               return -EINVAL;
-
-       he_bss_color->color =
-               nla_get_u8(tb[NL80211_HE_BSS_COLOR_ATTR_COLOR]);
-       he_bss_color->enabled =
-               !nla_get_flag(tb[NL80211_HE_BSS_COLOR_ATTR_DISABLED]);
-       he_bss_color->partial =
-               nla_get_flag(tb[NL80211_HE_BSS_COLOR_ATTR_PARTIAL]);
-
-       return 0;
-}
-
 static int nl80211_parse_fils_discovery(struct cfg80211_registered_device *rdev,
                                        struct nlattr *attrs,
                                        struct cfg80211_ap_settings *params)
@@ -5726,14 +5734,6 @@ static int nl80211_start_ap(struct sk_buff *skb, struct genl_info *info)
                        goto out;
        }
 
-       if (info->attrs[NL80211_ATTR_HE_BSS_COLOR]) {
-               err = nl80211_parse_he_bss_color(
-                                       info->attrs[NL80211_ATTR_HE_BSS_COLOR],
-                                       &params->he_bss_color);
-               if (err)
-                       goto out;
-       }
-
        if (info->attrs[NL80211_ATTR_FILS_DISCOVERY]) {
                err = nl80211_parse_fils_discovery(rdev,
                                                   info->attrs[NL80211_ATTR_FILS_DISCOVERY],