From b3c148e9f8a172ec19df810ecb07362315ea7b3d Mon Sep 17 00:00:00 2001 From: Avraham Stern Date: Sun, 11 Jun 2017 15:41:19 +0300 Subject: [PATCH] RRM: Send reject/refuse response only to unicast measurement request IEEE Std 802.11-2016, 11.11.6 specifies that a station that is unable to make a requested measurement or refuses to make a measurement shall respond only if the measurement request was received within an individually addressed radio measurement request frame, but shall not respond if such a request was received in a group addressed frame. Signed-off-by: Avraham Stern --- wpa_supplicant/events.c | 1 + wpa_supplicant/rrm.c | 28 +++++++++++++++++----------- wpa_supplicant/wpa_supplicant_i.h | 5 ++++- 3 files changed, 22 insertions(+), 12 deletions(-) diff --git a/wpa_supplicant/events.c b/wpa_supplicant/events.c index 7059dac0c..db7de89ed 100644 --- a/wpa_supplicant/events.c +++ b/wpa_supplicant/events.c @@ -3582,6 +3582,7 @@ static void wpas_event_rx_mgmt_action(struct wpa_supplicant *wpa_s, if (category == WLAN_ACTION_RADIO_MEASUREMENT && payload[0] == WLAN_RRM_RADIO_MEASUREMENT_REQUEST) { wpas_rrm_handle_radio_measurement_request(wpa_s, mgmt->sa, + mgmt->da, payload + 1, plen - 1); return; diff --git a/wpa_supplicant/rrm.c b/wpa_supplicant/rrm.c index 6b297d06f..12c256ceb 100644 --- a/wpa_supplicant/rrm.c +++ b/wpa_supplicant/rrm.c @@ -355,7 +355,8 @@ wpas_rrm_build_lci_report(struct wpa_supplicant *wpa_s, return 0; reject: - if (wpas_rrm_report_elem(buf, req->token, + if (!is_multicast_ether_addr(wpa_s->rrm.dst_addr) && + wpas_rrm_report_elem(buf, req->token, MEASUREMENT_REPORT_MODE_REJECT_INCAPABLE, req->type, NULL, 0) < 0) { wpa_printf(MSG_DEBUG, "RRM: Failed to add report element"); @@ -871,19 +872,22 @@ static void wpas_beacon_rep_table(struct wpa_supplicant *wpa_s, static void wpas_rrm_refuse_request(struct wpa_supplicant *wpa_s) { - struct wpabuf *buf = NULL; + if (!is_multicast_ether_addr(wpa_s->rrm.dst_addr)) { + struct wpabuf *buf = NULL; - if (wpas_rrm_report_elem(&buf, wpa_s->beacon_rep_data.token, - MEASUREMENT_REPORT_MODE_REJECT_REFUSED, - MEASURE_TYPE_BEACON, NULL, 0)) { - wpa_printf(MSG_ERROR, "RRM: Memory allocation failed"); + if (wpas_rrm_report_elem(&buf, wpa_s->beacon_rep_data.token, + MEASUREMENT_REPORT_MODE_REJECT_REFUSED, + MEASURE_TYPE_BEACON, NULL, 0)) { + wpa_printf(MSG_ERROR, "RRM: Memory allocation failed"); + wpabuf_free(buf); + return; + } + + wpas_rrm_send_msr_report(wpa_s, buf); wpabuf_free(buf); - return; } - wpas_rrm_send_msr_report(wpa_s, buf); wpas_clear_beacon_rep_data(wpa_s); - wpabuf_free(buf); } @@ -1164,7 +1168,8 @@ wpas_rrm_handle_msr_req_element( } reject: - if (wpas_rrm_report_elem(buf, req->token, + if (!is_multicast_ether_addr(wpa_s->rrm.dst_addr) && + wpas_rrm_report_elem(buf, req->token, MEASUREMENT_REPORT_MODE_REJECT_INCAPABLE, req->type, NULL, 0) < 0) { wpa_printf(MSG_DEBUG, "RRM: Failed to add report element"); @@ -1225,7 +1230,7 @@ out: void wpas_rrm_handle_radio_measurement_request(struct wpa_supplicant *wpa_s, - const u8 *src, + const u8 *src, const u8 *dst, const u8 *frame, size_t len) { struct wpabuf *report; @@ -1249,6 +1254,7 @@ void wpas_rrm_handle_radio_measurement_request(struct wpa_supplicant *wpa_s, } wpa_s->rrm.token = *frame; + os_memcpy(wpa_s->rrm.dst_addr, dst, ETH_ALEN); /* Number of repetitions is not supported */ diff --git a/wpa_supplicant/wpa_supplicant_i.h b/wpa_supplicant/wpa_supplicant_i.h index 31c992114..db39d1056 100644 --- a/wpa_supplicant/wpa_supplicant_i.h +++ b/wpa_supplicant/wpa_supplicant_i.h @@ -428,6 +428,9 @@ struct rrm_data { /* token - Dialog token of the current radio measurement */ u8 token; + + /* destination address of the current radio measurement request */ + u8 dst_addr[ETH_ALEN]; }; enum wpa_supplicant_test_failure { @@ -1308,7 +1311,7 @@ int wpas_rrm_send_neighbor_rep_request(struct wpa_supplicant *wpa_s, struct wpabuf *neighbor_rep), void *cb_ctx); void wpas_rrm_handle_radio_measurement_request(struct wpa_supplicant *wpa_s, - const u8 *src, + const u8 *src, const u8 *dst, const u8 *frame, size_t len); void wpas_rrm_handle_link_measurement_request(struct wpa_supplicant *wpa_s, const u8 *src,