[PATCH 06/19] hostapd: Extend the configuration of RRM capabilities
Ilan Peer
ilan.peer at intel.com
Tue Apr 5 06:07:59 PDT 2016
From: David Spinadel <david.spinadel at intel.com>
Extend the radio_measurements parameter to save all the supported
RRM capabilities as it's used in RM enabled capabilities element.
Make this parameter not directly configurable via config file.
Instead, Add a configuration option to enable neighbor report via
radio measurements. Other features can be added later as well.
Signed-off-by: David Spinadel <david.spinadel at intel.com>
---
hostapd/config_file.c | 6 ++++--
hostapd/hostapd.conf | 3 +++
src/ap/ap_config.h | 2 +-
src/ap/beacon.c | 21 ++++++++++++---------
src/ap/ieee802_11.c | 9 +++++++--
src/common/ieee802_11_defs.h | 2 ++
tests/hwsim/test_wpas_ctrl.py | 2 +-
7 files changed, 30 insertions(+), 15 deletions(-)
diff --git a/hostapd/config_file.c b/hostapd/config_file.c
index 3e8130b..47a71b9 100644
--- a/hostapd/config_file.c
+++ b/hostapd/config_file.c
@@ -3320,8 +3320,6 @@ static int hostapd_config_fill(struct hostapd_config *conf,
pos++;
WPA_PUT_LE16(&bss->bss_load_test[3], atoi(pos));
bss->bss_load_test_set = 1;
- } else if (os_strcmp(buf, "radio_measurements") == 0) {
- bss->radio_measurements = atoi(pos);
} else if (os_strcmp(buf, "own_ie_override") == 0) {
struct wpabuf *tmp;
size_t len = os_strlen(pos) / 2;
@@ -3468,6 +3466,10 @@ static int hostapd_config_fill(struct hostapd_config *conf,
} else if (os_strcmp(buf, "civic") == 0) {
wpabuf_free(conf->civic);
conf->civic = wpabuf_parse_bin(pos);
+ } else if (os_strcmp(buf, "rrm_neighbor_report") == 0) {
+ if (atoi(pos))
+ bss->radio_measurements[0] |=
+ WLAN_RRM_CAPS_NEIGHBOR_REPORT;
} else {
wpa_printf(MSG_ERROR,
"Line %d: unknown configuration item '%s'",
diff --git a/hostapd/hostapd.conf b/hostapd/hostapd.conf
index 621a645..47d7584 100644
--- a/hostapd/hostapd.conf
+++ b/hostapd/hostapd.conf
@@ -1952,3 +1952,6 @@ own_ip_addr=127.0.0.1
# lci=<Binary data of the LCI report>
# The content of a location civic measurement subelement
# civic=<Binary data of the location civic report>
+
+# Enable Neighbor report via radio measurements
+# rrm_neighbor_report=1
diff --git a/src/ap/ap_config.h b/src/ap/ap_config.h
index a78d0b2..4c4659a 100644
--- a/src/ap/ap_config.h
+++ b/src/ap/ap_config.h
@@ -572,7 +572,7 @@ struct hostapd_bss_config {
#define MESH_ENABLED BIT(0)
int mesh;
- int radio_measurements;
+ u8 radio_measurements[RRM_CAPABILITIES_IE_LEN];
int vendor_vht;
diff --git a/src/ap/beacon.c b/src/ap/beacon.c
index 19bff7b..113d2a9 100644
--- a/src/ap/beacon.c
+++ b/src/ap/beacon.c
@@ -36,18 +36,21 @@
static u8 * hostapd_eid_rm_enabled_capab(struct hostapd_data *hapd, u8 *eid,
size_t len)
{
- if (!hapd->conf->radio_measurements || len < 2 + 4)
+ size_t i;
+
+ for (i = 0; i < RRM_CAPABILITIES_IE_LEN; i++)
+ if (hapd->conf->radio_measurements[i])
+ break;
+
+ if (i == RRM_CAPABILITIES_IE_LEN || len < 2 + RRM_CAPABILITIES_IE_LEN)
return eid;
*eid++ = WLAN_EID_RRM_ENABLED_CAPABILITIES;
- *eid++ = 5;
- *eid++ = (hapd->conf->radio_measurements & BIT(0)) ?
- WLAN_RRM_CAPS_NEIGHBOR_REPORT : 0x00;
- *eid++ = 0x00;
- *eid++ = 0x00;
- *eid++ = 0x00;
- *eid++ = 0x00;
- return eid;
+ *eid++ = RRM_CAPABILITIES_IE_LEN;
+ os_memcpy(eid, hapd->conf->radio_measurements,
+ RRM_CAPABILITIES_IE_LEN);
+
+ return eid + RRM_CAPABILITIES_IE_LEN;
}
diff --git a/src/ap/ieee802_11.c b/src/ap/ieee802_11.c
index 6a373c5..b1ce56d 100644
--- a/src/ap/ieee802_11.c
+++ b/src/ap/ieee802_11.c
@@ -140,6 +140,7 @@ u16 hostapd_own_capab_info(struct hostapd_data *hapd)
int capab = WLAN_CAPABILITY_ESS;
int privacy;
int dfs;
+ int i;
/* Check if any of configured channels require DFS */
dfs = hostapd_is_dfs_required(hapd->iface);
@@ -187,8 +188,12 @@ u16 hostapd_own_capab_info(struct hostapd_data *hapd)
(hapd->iconf->spectrum_mgmt_required || dfs))
capab |= WLAN_CAPABILITY_SPECTRUM_MGMT;
- if (hapd->conf->radio_measurements)
- capab |= IEEE80211_CAP_RRM;
+ for (i = 0; i < RRM_CAPABILITIES_IE_LEN; i++) {
+ if (hapd->conf->radio_measurements[i]) {
+ capab |= IEEE80211_CAP_RRM;
+ break;
+ }
+ }
return capab;
}
diff --git a/src/common/ieee802_11_defs.h b/src/common/ieee802_11_defs.h
index f473f4b..5b410bf 100644
--- a/src/common/ieee802_11_defs.h
+++ b/src/common/ieee802_11_defs.h
@@ -1492,6 +1492,8 @@ struct tpc_report {
u8 link_margin;
} STRUCT_PACKED;
+#define RRM_CAPABILITIES_IE_LEN 5
+
/* IEEE Std 802.11-2012, 8.5.7.4 - Link Measurement Request frame format */
struct rrm_link_measurement_request {
u8 dialog_token;
diff --git a/tests/hwsim/test_wpas_ctrl.py b/tests/hwsim/test_wpas_ctrl.py
index 48421d3..dc8ecad 100644
--- a/tests/hwsim/test_wpas_ctrl.py
+++ b/tests/hwsim/test_wpas_ctrl.py
@@ -1272,7 +1272,7 @@ def test_wpas_ctrl_neighbor_rep_req(dev, apdev):
"""wpa_supplicant ctrl_iface NEIGHBOR_REP_REQUEST"""
params = { "ssid": "test" }
hostapd.add_ap(apdev[0], params)
- params = { "ssid": "test2", "radio_measurements": "1" }
+ params = { "ssid": "test2", "rrm_neighbor_report": "1" }
hostapd.add_ap(apdev[1], params)
dev[0].connect("test", key_mgmt="NONE", scan_freq="2412")
--
1.9.1
More information about the Hostap
mailing list