[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