mac80211: allow setting spatial reuse parameters from bss_conf
authorJohn Crispin <john@phrozen.org>
Tue, 30 Jul 2019 16:37:01 +0000 (18:37 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Wed, 31 Jul 2019 09:00:52 +0000 (11:00 +0200)
Store the OBSS PD parameters inside bss_conf when bringing up an AP and/or
when a station connects to an AP. This allows the driver to configure the
HW accordingly.

Signed-off-by: John Crispin <john@phrozen.org>
Link: https://lore.kernel.org/r/20190730163701.18836-3-john@phrozen.org
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
include/net/mac80211.h
net/mac80211/cfg.c
net/mac80211/he.c
net/mac80211/ieee80211_i.h
net/mac80211/mlme.c

index bd91388..6781d46 100644 (file)
@@ -315,6 +315,7 @@ struct ieee80211_vif_chanctx_switch {
  * @BSS_CHANGED_FTM_RESPONDER: fime timing reasurement request responder
  *     functionality changed for this BSS (AP mode).
  * @BSS_CHANGED_TWT: TWT status changed
+ * @BSS_CHANGED_HE_OBSS_PD: OBSS Packet Detection status changed.
  *
  */
 enum ieee80211_bss_change {
@@ -346,6 +347,7 @@ enum ieee80211_bss_change {
        BSS_CHANGED_MCAST_RATE          = 1<<25,
        BSS_CHANGED_FTM_RESPONDER       = 1<<26,
        BSS_CHANGED_TWT                 = 1<<27,
+       BSS_CHANGED_HE_OBSS_PD          = 1<<28,
 
        /* when adding here, make sure to change ieee80211_reconfig */
 };
@@ -601,6 +603,7 @@ struct ieee80211_ftm_responder_params {
  * @profile_periodicity: the least number of beacon frames need to be received
  *     in order to discover all the nontransmitted BSSIDs in the set.
  * @he_operation: HE operation information of the AP we are connected to
+ * @he_obss_pd: OBSS Packet Detection parameters.
  */
 struct ieee80211_bss_conf {
        const u8 *bssid;
@@ -663,6 +666,7 @@ struct ieee80211_bss_conf {
        bool ema_ap;
        u8 profile_periodicity;
        struct ieee80211_he_operation he_operation;
+       struct ieee80211_he_obss_pd he_obss_pd;
 };
 
 /**
index 10b99b2..ed56b0c 100644 (file)
@@ -980,7 +980,8 @@ static int ieee80211_start_ap(struct wiphy *wiphy, struct net_device *dev,
                      BSS_CHANGED_SSID |
                      BSS_CHANGED_P2P_PS |
                      BSS_CHANGED_TXPOWER |
-                     BSS_CHANGED_TWT;
+                     BSS_CHANGED_TWT |
+                     BSS_CHANGED_HE_OBSS_PD;
        int err;
        int prev_beacon_int;
 
@@ -1051,6 +1052,8 @@ static int ieee80211_start_ap(struct wiphy *wiphy, struct net_device *dev,
        sdata->vif.bss_conf.enable_beacon = true;
        sdata->vif.bss_conf.allow_p2p_go_ps = sdata->vif.p2p;
        sdata->vif.bss_conf.twt_responder = params->twt_responder;
+       memcpy(&sdata->vif.bss_conf.he_obss_pd, &params->he_obss_pd,
+              sizeof(struct ieee80211_he_obss_pd));
 
        sdata->vif.bss_conf.ssid_len = params->ssid_len;
        if (params->ssid_len)
index f910f73..a02abfc 100644 (file)
@@ -65,3 +65,27 @@ ieee80211_he_op_ie_to_bss_conf(struct ieee80211_vif *vif,
 
        vif->bss_conf.he_operation = *he_op_ie_elem;
 }
+
+void
+ieee80211_he_spr_ie_to_bss_conf(struct ieee80211_vif *vif,
+                               const struct ieee80211_he_spr *he_spr_ie_elem)
+{
+       struct ieee80211_he_obss_pd *he_obss_pd =
+                                       &vif->bss_conf.he_obss_pd;
+       const u8 *data = he_spr_ie_elem->optional;
+
+       memset(he_obss_pd, 0, sizeof(*he_obss_pd));
+
+       if (!he_spr_ie_elem)
+               return;
+
+       if (he_spr_ie_elem->he_sr_control &
+           IEEE80211_HE_SPR_NON_SRG_OFFSET_PRESENT)
+               data++;
+       if (he_spr_ie_elem->he_sr_control &
+           IEEE80211_HE_SPR_SRG_INFORMATION_PRESENT) {
+               he_obss_pd->max_offset = *data++;
+               he_obss_pd->min_offset = *data++;
+               he_obss_pd->enable = true;
+       }
+}
index 38769f5..791ce58 100644 (file)
@@ -1873,6 +1873,9 @@ ieee80211_he_cap_ie_to_sta_he_cap(struct ieee80211_sub_if_data *sdata,
                                  struct ieee80211_supported_band *sband,
                                  const u8 *he_cap_ie, u8 he_cap_len,
                                  struct sta_info *sta);
+void
+ieee80211_he_spr_ie_to_bss_conf(struct ieee80211_vif *vif,
+                               const struct ieee80211_he_spr *he_spr_ie_elem);
 
 void
 ieee80211_he_op_ie_to_bss_conf(struct ieee80211_vif *vif,
index 2b8a742..225633d 100644 (file)
@@ -3382,6 +3382,7 @@ static bool ieee80211_assoc_success(struct ieee80211_sub_if_data *sdata,
                        bss_conf->uora_ocw_range = elems.uora_element[0];
 
                ieee80211_he_op_ie_to_bss_conf(&sdata->vif, elems.he_operation);
+               ieee80211_he_spr_ie_to_bss_conf(&sdata->vif, elems.he_spr);
                /* TODO: OPEN: what happens if BSS color disable is set? */
        }