From: David Spinadel <david.spinadel@xxxxxxxxx> 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@xxxxxxxxx> --- 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 _______________________________________________ Hostap mailing list Hostap@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/hostap