mirror of
https://github.com/Telecominfraproject/wlan-ap.git
synced 2025-11-02 03:17:48 +00:00
277 lines
9.6 KiB
Diff
277 lines
9.6 KiB
Diff
From f7a2dce12232984cec2cd2bf8d3316b3208893cb Mon Sep 17 00:00:00 2001
|
|
From: Rajkumar Manoharan <rmanohar@codeaurora.org>
|
|
Date: Sun, 27 Sep 2020 23:38:14 -0700
|
|
Subject: [PATCH] AP: Extend Spatial Reuse Parameter Set
|
|
|
|
Extend SPR element to support following fields and pass all
|
|
information to kernel for driver use.
|
|
* Non-SRG OBSS PD Max Offset
|
|
* SRG BSS Color Bitmap
|
|
* SRG Partial BSSID Bitmap
|
|
|
|
Signed-off-by: Rajkumar Manoharan <rmanohar@codeaurora.org>
|
|
---
|
|
hostapd/config_file.c | 46 +++++++++++++++++++++++++++++++++++++++++++-
|
|
hostapd/hostapd.conf | 15 +++++++++++++++
|
|
src/ap/ap_config.h | 4 ++--
|
|
src/ap/beacon.c | 8 +++++++-
|
|
src/ap/ieee802_11_he.c | 5 +++++
|
|
src/drivers/driver.h | 25 ++++++++++++++++++++----
|
|
src/drivers/driver_nl80211.c | 30 ++++++++++++++++++++++-------
|
|
src/drivers/nl80211_copy.h | 11 +++++++++++
|
|
8 files changed, 129 insertions(+), 15 deletions(-)
|
|
|
|
--- a/hostapd/config_file.c
|
|
+++ b/hostapd/config_file.c
|
|
@@ -906,6 +906,32 @@ static int hostapd_parse_intlist(int **i
|
|
}
|
|
|
|
|
|
+static int hostapd_parse_he_srg_bitmap(u8 *bitmap, char *val)
|
|
+{
|
|
+ int bitpos;
|
|
+ char *pos, *end;
|
|
+
|
|
+ os_memset(bitmap, 0, 8);
|
|
+ pos = val;
|
|
+ while (*pos != '\0') {
|
|
+ end = os_strchr(pos, ' ');
|
|
+ if (end)
|
|
+ *end = '\0';
|
|
+
|
|
+ bitpos = atoi(pos);
|
|
+ if (bitpos < 0 || bitpos > 63)
|
|
+ return -1;
|
|
+
|
|
+ bitmap[bitpos / 8] |= (1 << (bitpos % 8));
|
|
+ if (!end)
|
|
+ break;
|
|
+ pos = end + 1;
|
|
+ }
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+
|
|
static int hostapd_config_bss(struct hostapd_config *conf, const char *ifname)
|
|
{
|
|
struct hostapd_bss_config **all, *bss;
|
|
@@ -3551,13 +3577,31 @@ static int hostapd_config_fill(struct ho
|
|
conf->he_mu_edca.he_mu_ac_vo_param[HE_MU_AC_PARAM_TIMER_IDX] =
|
|
atoi(pos) & 0xff;
|
|
} else if (os_strcmp(buf, "he_spr_sr_control") == 0) {
|
|
- conf->spr.sr_control = atoi(pos) & 0xff;
|
|
+ conf->spr.sr_control = atoi(pos) & 0x1f;
|
|
} else if (os_strcmp(buf, "he_spr_non_srg_obss_pd_max_offset") == 0) {
|
|
conf->spr.non_srg_obss_pd_max_offset = atoi(pos);
|
|
} else if (os_strcmp(buf, "he_spr_srg_obss_pd_min_offset") == 0) {
|
|
conf->spr.srg_obss_pd_min_offset = atoi(pos);
|
|
} else if (os_strcmp(buf, "he_spr_srg_obss_pd_max_offset") == 0) {
|
|
conf->spr.srg_obss_pd_max_offset = atoi(pos);
|
|
+ } else if (os_strcmp(buf, "he_spr_srg_bss_colors") == 0) {
|
|
+ if (hostapd_parse_he_srg_bitmap(
|
|
+ conf->spr.srg_bss_color_bitmap,
|
|
+ pos)) {
|
|
+ wpa_printf(MSG_ERROR,
|
|
+ "Line %d: Invalid srg bss colors list '%s'",
|
|
+ line, pos);
|
|
+ return 1;
|
|
+ }
|
|
+ } else if (os_strcmp(buf, "he_spr_srg_partial_bssid") == 0) {
|
|
+ if (hostapd_parse_he_srg_bitmap(
|
|
+ conf->spr.srg_partial_bssid_bitmap,
|
|
+ pos)) {
|
|
+ wpa_printf(MSG_ERROR,
|
|
+ "Line %d: Invalid srg partial bssid list '%s'",
|
|
+ line, pos);
|
|
+ return 1;
|
|
+ }
|
|
} else if (os_strcmp(buf, "he_oper_chwidth") == 0) {
|
|
conf->he_oper_chwidth = atoi(pos);
|
|
} else if (os_strcmp(buf, "he_oper_centr_freq_seg0_idx") == 0) {
|
|
--- a/hostapd/hostapd.conf
|
|
+++ b/hostapd/hostapd.conf
|
|
@@ -872,6 +872,21 @@ wmm_ac_vo_acm=0
|
|
#he_spr_non_srg_obss_pd_max_offset
|
|
#he_spr_srg_obss_pd_min_offset
|
|
#he_spr_srg_obss_pd_max_offset
|
|
+#
|
|
+# SPR SRG BSS Color
|
|
+# This config represents SRG BSS Color Bitmap field of Spatial Reuse Parameter
|
|
+# Set element that indicates the BSS color values used by members of the
|
|
+# SRG of which the transmitting STA is a member. The value is in range of 0 - 63.
|
|
+#he_spr_srg_bss_colors=1 2 10 63
|
|
+#
|
|
+# SPR SRG Partial BSSID
|
|
+# This config represents SRG Partial BSSID Bitmap field of Spatial Reuse Parameter
|
|
+# Set element that indicates the Partial BSSID values used by members of the SRG of
|
|
+# which the transmitting STA is a member. The value range corresponds to one of the 64
|
|
+# possible values of BSSID[39:44], where the lowest numbered bit corresponds to Partial
|
|
+# BSSID value 0 and the highest numbered bit corresponds to Partial BSSID value 63.
|
|
+#he_spr_srg_partial_bssid=0 1 3 63
|
|
+#
|
|
|
|
# Unsolicited broadcast probe response transmission settings, 6GHz only.
|
|
# If interval is set to non-zero, the AP schedules unsolicited
|
|
--- a/src/ap/ap_config.h
|
|
+++ b/src/ap/ap_config.h
|
|
@@ -903,8 +903,8 @@ struct spatial_reuse {
|
|
u8 non_srg_obss_pd_max_offset;
|
|
u8 srg_obss_pd_min_offset;
|
|
u8 srg_obss_pd_max_offset;
|
|
- u8 srg_obss_color_bitmap;
|
|
- u8 srg_obss_color_partial_bitmap;
|
|
+ u8 srg_bss_color_bitmap[8];
|
|
+ u8 srg_partial_bssid_bitmap[8];
|
|
};
|
|
|
|
/**
|
|
--- a/src/ap/beacon.c
|
|
+++ b/src/ap/beacon.c
|
|
@@ -1842,11 +1842,17 @@ int ieee802_11_set_beacon(struct hostapd
|
|
params.assocresp_ies = assocresp;
|
|
params.reenable = hapd->reenable_beacon;
|
|
#ifdef CONFIG_IEEE80211AX
|
|
- params.he_spr = !!hapd->iface->conf->spr.sr_control;
|
|
+ params.he_spr_ctrl = hapd->iface->conf->spr.sr_control;
|
|
+ params.he_spr_non_srg_obss_pd_max_offset =
|
|
+ hapd->iface->conf->spr.non_srg_obss_pd_max_offset;
|
|
params.he_spr_srg_obss_pd_min_offset =
|
|
hapd->iface->conf->spr.srg_obss_pd_min_offset;
|
|
params.he_spr_srg_obss_pd_max_offset =
|
|
hapd->iface->conf->spr.srg_obss_pd_max_offset;
|
|
+ os_memcpy(params.he_spr_bss_color_bitmap,
|
|
+ hapd->iface->conf->spr.srg_bss_color_bitmap, 8);
|
|
+ os_memcpy(params.he_spr_partial_bssid_bitmap,
|
|
+ hapd->iface->conf->spr.srg_partial_bssid_bitmap, 8);
|
|
params.he_bss_color_disabled =
|
|
hapd->iface->conf->he_op.he_bss_color_disabled;
|
|
params.he_bss_color_partial =
|
|
--- a/src/ap/ieee802_11_he.c
|
|
+++ b/src/ap/ieee802_11_he.c
|
|
@@ -310,6 +310,11 @@ u8 * hostapd_eid_spatial_reuse(struct ho
|
|
if (spr->sr_ctrl & SPATIAL_REUSE_SRG_INFORMATION_PRESENT) {
|
|
*spr_param++ = hapd->iface->conf->spr.srg_obss_pd_min_offset;
|
|
*spr_param++ = hapd->iface->conf->spr.srg_obss_pd_max_offset;
|
|
+ os_memcpy(spr_param,
|
|
+ hapd->iface->conf->spr.srg_bss_color_bitmap, 8);
|
|
+ spr_param += 8;
|
|
+ os_memcpy(spr_param,
|
|
+ hapd->iface->conf->spr.srg_partial_bssid_bitmap, 8);
|
|
pos += 18;
|
|
}
|
|
|
|
--- a/src/drivers/driver.h
|
|
+++ b/src/drivers/driver.h
|
|
@@ -1493,19 +1493,36 @@ struct wpa_driver_ap_params {
|
|
const struct wpabuf *civic;
|
|
|
|
/**
|
|
- * he_spr - Whether Spatial Reuse is enabled
|
|
+ * he_spr_ctrl - Spatial Reuse control field of SPR element
|
|
*/
|
|
- int he_spr;
|
|
+ u8 he_spr_ctrl;
|
|
+
|
|
+ /**
|
|
+ * he_spr_non_srg_obss_pd_max_offset - Non-SRG Maximum TX power offset
|
|
+ */
|
|
+ u8 he_spr_non_srg_obss_pd_max_offset;
|
|
|
|
/**
|
|
* he_spr_srg_obss_pd_min_offset - Minimum TX power offset
|
|
*/
|
|
- int he_spr_srg_obss_pd_min_offset;
|
|
+ u8 he_spr_srg_obss_pd_min_offset;
|
|
|
|
/**
|
|
* he_spr_srg_obss_pd_max_offset - Maximum TX power offset
|
|
*/
|
|
- int he_spr_srg_obss_pd_max_offset;
|
|
+ u8 he_spr_srg_obss_pd_max_offset;
|
|
+
|
|
+ /**
|
|
+ * he_spr_bss_color_bitmap - BSS color values used by members of the
|
|
+ * SRG.
|
|
+ */
|
|
+ u8 he_spr_bss_color_bitmap[8];
|
|
+
|
|
+ /**
|
|
+ * he_spr_partial_bssid_bitmap - Partial BSSID values used by members
|
|
+ * of the SRG.
|
|
+ */
|
|
+ u8 he_spr_partial_bssid_bitmap[8];
|
|
|
|
/**
|
|
* he_bss_color - Whether the BSS Color is disabled
|
|
--- a/src/drivers/driver_nl80211.c
|
|
+++ b/src/drivers/driver_nl80211.c
|
|
@@ -4664,17 +4664,33 @@ static int wpa_driver_nl80211_set_ap(voi
|
|
}
|
|
|
|
#ifdef CONFIG_IEEE80211AX
|
|
- if (params->he_spr) {
|
|
+ if (params->he_spr_ctrl) {
|
|
struct nlattr *spr;
|
|
|
|
spr = nla_nest_start(msg, NL80211_ATTR_HE_OBSS_PD);
|
|
- wpa_printf(MSG_DEBUG, "nl80211: he_spr=%d", params->he_spr);
|
|
+ wpa_printf(MSG_DEBUG, "nl80211: he_spr_ctrl=%x",
|
|
+ params->he_spr_ctrl);
|
|
|
|
- if (!spr ||
|
|
- nla_put_u8(msg, NL80211_HE_OBSS_PD_ATTR_MIN_OFFSET,
|
|
- params->he_spr_srg_obss_pd_min_offset) ||
|
|
- nla_put_u8(msg, NL80211_HE_OBSS_PD_ATTR_MAX_OFFSET,
|
|
- params->he_spr_srg_obss_pd_max_offset))
|
|
+ if (!spr || nla_put_u8(msg, NL80211_HE_OBSS_PD_ATTR_SR_CTRL,
|
|
+ params->he_spr_ctrl))
|
|
+ goto fail;
|
|
+
|
|
+ if ((params->he_spr_ctrl & SPATIAL_REUSE_NON_SRG_OFFSET_PRESENT) &&
|
|
+ nla_put_u8(msg, NL80211_HE_OBSS_PD_ATTR_NON_SRG_MAX_OFFSET,
|
|
+ params->he_spr_non_srg_obss_pd_max_offset))
|
|
+ goto fail;
|
|
+
|
|
+ if ((params->he_spr_ctrl & SPATIAL_REUSE_SRG_INFORMATION_PRESENT) &&
|
|
+ (nla_put_u8(msg, NL80211_HE_OBSS_PD_ATTR_MIN_OFFSET,
|
|
+ params->he_spr_srg_obss_pd_min_offset) ||
|
|
+ nla_put_u8(msg, NL80211_HE_OBSS_PD_ATTR_MAX_OFFSET,
|
|
+ params->he_spr_srg_obss_pd_max_offset) ||
|
|
+ nla_put(msg, NL80211_HE_OBSS_PD_ATTR_BSS_COLOR_BITMAP,
|
|
+ sizeof(params->he_spr_bss_color_bitmap),
|
|
+ params->he_spr_bss_color_bitmap) ||
|
|
+ nla_put(msg, NL80211_HE_OBSS_PD_ATTR_PARTIAL_BSSID_BITMAP,
|
|
+ sizeof(params->he_spr_partial_bssid_bitmap),
|
|
+ params->he_spr_partial_bssid_bitmap)))
|
|
goto fail;
|
|
|
|
nla_nest_end(msg, spr);
|
|
--- a/src/drivers/nl80211_copy.h
|
|
+++ b/src/drivers/nl80211_copy.h
|
|
@@ -6907,6 +6907,13 @@ enum nl80211_peer_measurement_ftm_resp {
|
|
*
|
|
* @NL80211_HE_OBSS_PD_ATTR_MIN_OFFSET: the OBSS PD minimum tx power offset.
|
|
* @NL80211_HE_OBSS_PD_ATTR_MAX_OFFSET: the OBSS PD maximum tx power offset.
|
|
+ * @NL80211_HE_OBSS_PD_ATTR_NON_SRG_MAX_OFFSET: the non-SRG OBSS PD maximum
|
|
+ * tx power offset.
|
|
+ * @NL80211_HE_OBSS_PD_ATTR_BSS_COLOR_BITMAP: bitmap that indicates the BSS color
|
|
+ * values used by members of the SRG.
|
|
+ * @NL80211_HE_OBSS_PD_ATTR_PARTIAL_BSSID_BITMAP: bitmap that indicates the partial
|
|
+ * BSSID values used by members of the SRG.
|
|
+ * @NL80211_HE_OBSS_PD_ATTR_SR_CTRL: The SR Control field of SRP element.
|
|
*
|
|
* @__NL80211_HE_OBSS_PD_ATTR_LAST: Internal
|
|
* @NL80211_HE_OBSS_PD_ATTR_MAX: highest OBSS PD attribute.
|
|
@@ -6916,6 +6923,10 @@ enum nl80211_obss_pd_attributes {
|
|
|
|
NL80211_HE_OBSS_PD_ATTR_MIN_OFFSET,
|
|
NL80211_HE_OBSS_PD_ATTR_MAX_OFFSET,
|
|
+ NL80211_HE_OBSS_PD_ATTR_NON_SRG_MAX_OFFSET,
|
|
+ NL80211_HE_OBSS_PD_ATTR_BSS_COLOR_BITMAP,
|
|
+ NL80211_HE_OBSS_PD_ATTR_PARTIAL_BSSID_BITMAP,
|
|
+ NL80211_HE_OBSS_PD_ATTR_SR_CTRL,
|
|
|
|
/* keep last */
|
|
__NL80211_HE_OBSS_PD_ATTR_LAST,
|