Commit 1ced169c authored by John Crispin's avatar John Crispin Committed by Johannes Berg
Browse files

mac80211: allow setting spatial reuse parameters from bss_conf



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: default avatarJohn Crispin <john@phrozen.org>
Link: https://lore.kernel.org/r/20190730163701.18836-3-john@phrozen.org


Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 6d4dd4ef
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -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;
};

/**
+4 −1
Original line number Diff line number Diff line
@@ -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)
+24 −0
Original line number Diff line number Diff line
@@ -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;
	}
}
+3 −0
Original line number Diff line number Diff line
@@ -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,
+1 −0
Original line number Diff line number Diff line
@@ -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? */
	}