Please ignore this patch, Sent the patch with wrong subject(PATCHv3 instead of PATCH v3) , will update the and send v4 Thanks, Ramesh > -----Original Message----- > From: Rameshkumar Sundaram (QUIC) <quic_ramess@xxxxxxxxxxx> > Sent: Tuesday, February 8, 2022 7:29 PM > To: johannes@xxxxxxxxxxxxxxxx > Cc: linux-wireless@xxxxxxxxxxxxxxx; Lavanya Suresh > <lavaks@xxxxxxxxxxxxxx>; Rameshkumar Sundaram (QUIC) > <quic_ramess@xxxxxxxxxxx> > Subject: [PATCHv3] mac80211: disable BSS color collision detection in case of > no free colors > > From: Lavanya Suresh <lavaks@xxxxxxxxxxxxxx> > > AP may run out of BSS color after color collision detection event from driver. > Disable BSS color collision detection if no free colors are available based on > bss color disabled bit sent as a part of NL80211_ATTR_HE_BSS_COLOR > attribute sent in NL80211_CMD_SET_BEACON. > > It can be reenabled once new color is available. > > Signed-off-by: Lavanya Suresh <lavaks@xxxxxxxxxxxxxx> > Signed-off-by: Rameshkumar Sundaram <quic_ramess@xxxxxxxxxxx> > --- > Changes since v1: > - Moved the logic to ieee80211_change_beacon() to have this > BSS color enabled unset only during set_beacon case based > on NL80211_ATTR_HE_BSS_COLOR attribute sent by hostapd. > - Removed the relocation and parsing changes done on v1 and moved > he_bss_color to cfg80211_beacon_data and parsed > NL80211_ATTR_HE_BSS_COLOR in nl80211_parse_beacon() > > Changes since v1: > - Relocated ap params to cfg80211_beacon_data and > nl80211_calculate_ap_params() to nl80211_parse_beacon() > to have them parsed for all (start_ap and change beacon) commands. > --- > include/net/cfg80211.h | 4 ++-- > net/mac80211/cfg.c | 11 +++++++-- > net/wireless/nl80211.c | 62 ++++++++++++++++++++++++------------------------- > - > 3 files changed, 41 insertions(+), 36 deletions(-) > > diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h index > a887086..08b795d 100644 > --- a/include/net/cfg80211.h > +++ b/include/net/cfg80211.h > @@ -1113,6 +1113,7 @@ 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 > */ > struct cfg80211_beacon_data { > const u8 *head, *tail; > @@ -1132,6 +1133,7 @@ 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; > }; > > struct mac_address { > @@ -1233,7 +1235,6 @@ enum cfg80211_ap_settings_flags { > * @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 @@ -1267,7 +1268,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; diff --git > a/net/mac80211/cfg.c b/net/mac80211/cfg.c index 26cc762..f54aaf1 100644 > --- a/net/mac80211/cfg.c > +++ b/net/mac80211/cfg.c > @@ -1133,7 +1133,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; > } > > @@ -1190,7 +1190,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; > > @@ -1272,6 +1272,7 @@ static int ieee80211_change_beacon(struct wiphy > *wiphy, struct net_device *dev, > struct cfg80211_beacon_data *params) { > struct ieee80211_sub_if_data *sdata; > + struct ieee80211_bss_conf *bss_conf; > struct beacon_data *old; > int err; > > @@ -1291,6 +1292,12 @@ static int ieee80211_change_beacon(struct wiphy > *wiphy, struct net_device *dev, > err = ieee80211_assign_beacon(sdata, params, NULL, NULL); > if (err < 0) > return err; > + > + bss_conf = &sdata->vif.bss_conf; > + if (params->he_bss_color.enabled != bss_conf- > >he_bss_color.enabled) { > + bss_conf->he_bss_color.enabled = params- > >he_bss_color.enabled; > + err |= BSS_CHANGED_HE_BSS_COLOR; > + } > ieee80211_bss_info_change_notify(sdata, err); > return 0; > } > diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index > bfa5d74..df609e4 100644 > --- a/net/wireless/nl80211.c > +++ b/net/wireless/nl80211.c > @@ -5124,6 +5124,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) > @@ -5204,6 +5228,12 @@ 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; > + } > if (attrs[NL80211_ATTR_MBSSID_ELEMS]) { > struct cfg80211_mbssid_elems *mbssid = > nl80211_parse_mbssid_elems(&rdev->wiphy, > @@ -5262,30 +5292,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) > @@ -5677,14 +5683,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], > - ¶ms->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], > -- > 2.7.4