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: 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>
This commit is contained in:
parent
6d4dd4ef1a
commit
1ced169cc1
@ -315,6 +315,7 @@ struct ieee80211_vif_chanctx_switch {
|
|||||||
* @BSS_CHANGED_FTM_RESPONDER: fime timing reasurement request responder
|
* @BSS_CHANGED_FTM_RESPONDER: fime timing reasurement request responder
|
||||||
* functionality changed for this BSS (AP mode).
|
* functionality changed for this BSS (AP mode).
|
||||||
* @BSS_CHANGED_TWT: TWT status changed
|
* @BSS_CHANGED_TWT: TWT status changed
|
||||||
|
* @BSS_CHANGED_HE_OBSS_PD: OBSS Packet Detection status changed.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
enum ieee80211_bss_change {
|
enum ieee80211_bss_change {
|
||||||
@ -346,6 +347,7 @@ enum ieee80211_bss_change {
|
|||||||
BSS_CHANGED_MCAST_RATE = 1<<25,
|
BSS_CHANGED_MCAST_RATE = 1<<25,
|
||||||
BSS_CHANGED_FTM_RESPONDER = 1<<26,
|
BSS_CHANGED_FTM_RESPONDER = 1<<26,
|
||||||
BSS_CHANGED_TWT = 1<<27,
|
BSS_CHANGED_TWT = 1<<27,
|
||||||
|
BSS_CHANGED_HE_OBSS_PD = 1<<28,
|
||||||
|
|
||||||
/* when adding here, make sure to change ieee80211_reconfig */
|
/* 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
|
* @profile_periodicity: the least number of beacon frames need to be received
|
||||||
* in order to discover all the nontransmitted BSSIDs in the set.
|
* in order to discover all the nontransmitted BSSIDs in the set.
|
||||||
* @he_operation: HE operation information of the AP we are connected to
|
* @he_operation: HE operation information of the AP we are connected to
|
||||||
|
* @he_obss_pd: OBSS Packet Detection parameters.
|
||||||
*/
|
*/
|
||||||
struct ieee80211_bss_conf {
|
struct ieee80211_bss_conf {
|
||||||
const u8 *bssid;
|
const u8 *bssid;
|
||||||
@ -663,6 +666,7 @@ struct ieee80211_bss_conf {
|
|||||||
bool ema_ap;
|
bool ema_ap;
|
||||||
u8 profile_periodicity;
|
u8 profile_periodicity;
|
||||||
struct ieee80211_he_operation he_operation;
|
struct ieee80211_he_operation he_operation;
|
||||||
|
struct ieee80211_he_obss_pd he_obss_pd;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -980,7 +980,8 @@ static int ieee80211_start_ap(struct wiphy *wiphy, struct net_device *dev,
|
|||||||
BSS_CHANGED_SSID |
|
BSS_CHANGED_SSID |
|
||||||
BSS_CHANGED_P2P_PS |
|
BSS_CHANGED_P2P_PS |
|
||||||
BSS_CHANGED_TXPOWER |
|
BSS_CHANGED_TXPOWER |
|
||||||
BSS_CHANGED_TWT;
|
BSS_CHANGED_TWT |
|
||||||
|
BSS_CHANGED_HE_OBSS_PD;
|
||||||
int err;
|
int err;
|
||||||
int prev_beacon_int;
|
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.enable_beacon = true;
|
||||||
sdata->vif.bss_conf.allow_p2p_go_ps = sdata->vif.p2p;
|
sdata->vif.bss_conf.allow_p2p_go_ps = sdata->vif.p2p;
|
||||||
sdata->vif.bss_conf.twt_responder = params->twt_responder;
|
sdata->vif.bss_conf.twt_responder = params->twt_responder;
|
||||||
|
memcpy(&sdata->vif.bss_conf.he_obss_pd, ¶ms->he_obss_pd,
|
||||||
|
sizeof(struct ieee80211_he_obss_pd));
|
||||||
|
|
||||||
sdata->vif.bss_conf.ssid_len = params->ssid_len;
|
sdata->vif.bss_conf.ssid_len = params->ssid_len;
|
||||||
if (params->ssid_len)
|
if (params->ssid_len)
|
||||||
|
@ -65,3 +65,27 @@ ieee80211_he_op_ie_to_bss_conf(struct ieee80211_vif *vif,
|
|||||||
|
|
||||||
vif->bss_conf.he_operation = *he_op_ie_elem;
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -1873,6 +1873,9 @@ ieee80211_he_cap_ie_to_sta_he_cap(struct ieee80211_sub_if_data *sdata,
|
|||||||
struct ieee80211_supported_band *sband,
|
struct ieee80211_supported_band *sband,
|
||||||
const u8 *he_cap_ie, u8 he_cap_len,
|
const u8 *he_cap_ie, u8 he_cap_len,
|
||||||
struct sta_info *sta);
|
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
|
void
|
||||||
ieee80211_he_op_ie_to_bss_conf(struct ieee80211_vif *vif,
|
ieee80211_he_op_ie_to_bss_conf(struct ieee80211_vif *vif,
|
||||||
|
@ -3382,6 +3382,7 @@ static bool ieee80211_assoc_success(struct ieee80211_sub_if_data *sdata,
|
|||||||
bss_conf->uora_ocw_range = elems.uora_element[0];
|
bss_conf->uora_ocw_range = elems.uora_element[0];
|
||||||
|
|
||||||
ieee80211_he_op_ie_to_bss_conf(&sdata->vif, elems.he_operation);
|
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? */
|
/* TODO: OPEN: what happens if BSS color disable is set? */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user