From 0629eeb4904d4b66ce911cc7127aead1013ddf67 Mon Sep 17 00:00:00 2001 From: Jouni Malinen Date: Fri, 12 Dec 2014 20:45:31 +0200 Subject: [PATCH] RRM: Add AP mode minimal advertisement support for testing The new hostapd.conf radio_measurements parameter can now be used to configure a test build to advertise support for radio measurements with neighbor report enabled. There is no real functionality that would actually process the request, i.e., this only for the purpose of minimal STA side testing for now. Signed-off-by: Jouni Malinen --- hostapd/config_file.c | 2 ++ src/ap/ap_config.h | 2 ++ src/ap/beacon.c | 24 ++++++++++++++++++++++++ src/ap/ieee802_11.c | 3 +++ 4 files changed, 31 insertions(+) diff --git a/hostapd/config_file.c b/hostapd/config_file.c index c9ff3ec51..e30efbe31 100644 --- a/hostapd/config_file.c +++ b/hostapd/config_file.c @@ -3129,6 +3129,8 @@ 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); #endif /* CONFIG_TESTING_OPTIONS */ } else if (os_strcmp(buf, "vendor_elements") == 0) { struct wpabuf *elems; diff --git a/src/ap/ap_config.h b/src/ap/ap_config.h index 64df60d34..58af6cb19 100644 --- a/src/ap/ap_config.h +++ b/src/ap/ap_config.h @@ -549,6 +549,8 @@ struct hostapd_bss_config { #define MESH_ENABLED BIT(0) int mesh; + + int radio_measurements; }; diff --git a/src/ap/beacon.c b/src/ap/beacon.c index f73f83af2..4a8703acc 100644 --- a/src/ap/beacon.c +++ b/src/ap/beacon.c @@ -32,6 +32,24 @@ #ifdef NEED_AP_MLME +static u8 * hostapd_eid_rm_enabled_capab(struct hostapd_data *hapd, u8 *eid, + size_t len) +{ + if (!hapd->conf->radio_measurements || len < 2 + 4) + 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; +} + + static u8 * hostapd_eid_bss_load(struct hostapd_data *hapd, u8 *eid, size_t len) { if (len < 2 + 5) @@ -409,6 +427,8 @@ static u8 * hostapd_gen_probe_resp(struct hostapd_data *hapd, pos = hostapd_eid_bss_load(hapd, pos, epos - pos); + pos = hostapd_eid_rm_enabled_capab(hapd, pos, epos - pos); + #ifdef CONFIG_IEEE80211N pos = hostapd_eid_ht_capabilities(hapd, pos); pos = hostapd_eid_ht_operation(hapd, pos); @@ -819,6 +839,10 @@ int ieee802_11_build_ap_params(struct hostapd_data *hapd, tailpos = hostapd_eid_wpa(hapd, tailpos, tail + BEACON_TAIL_BUF_SIZE - tailpos); + tailpos = hostapd_eid_rm_enabled_capab(hapd, tailpos, + tail + BEACON_TAIL_BUF_SIZE - + tailpos); + tailpos = hostapd_eid_bss_load(hapd, tailpos, tail + BEACON_TAIL_BUF_SIZE - tailpos); diff --git a/src/ap/ieee802_11.c b/src/ap/ieee802_11.c index 1dbd996cd..8a51b33be 100644 --- a/src/ap/ieee802_11.c +++ b/src/ap/ieee802_11.c @@ -199,6 +199,9 @@ u16 hostapd_own_capab_info(struct hostapd_data *hapd, struct sta_info *sta, (hapd->iconf->spectrum_mgmt_required || dfs)) capab |= WLAN_CAPABILITY_SPECTRUM_MGMT; + if (hapd->conf->radio_measurements) + capab |= IEEE80211_CAP_RRM; + return capab; }