From 5d5a0be202e5499be8b43df58109f7657995cae6 Mon Sep 17 00:00:00 2001 From: David Bauer Date: Mon, 25 Oct 2021 21:49:05 +0200 Subject: [PATCH] ubus: don't request measurement from unsupported STAs Don't request measurements from STAs which do not support the specific measurement mode. Otherwise, hostapd complains in the syslog about unsupported measurement modes. Signed-off-by: David Bauer --- sta.c | 15 +++++++++++++++ ubus.c | 5 +++++ usteer.h | 2 ++ 3 files changed, 22 insertions(+) diff --git a/sta.c b/sta.c index 54bcaeb..7bca10e 100644 --- a/sta.c +++ b/sta.c @@ -202,6 +202,21 @@ usteer_handle_sta_event(struct usteer_node *node, const uint8_t *addr, return ret; } +bool +usteer_sta_supports_beacon_measurement_mode(struct sta *sta, enum usteer_beacon_measurement_mode mode) +{ + switch (mode) { + case BEACON_MEASUREMENT_PASSIVE: + return sta->rrm & (1 << 4); + case BEACON_MEASUREMENT_ACTIVE: + return sta->rrm & (1 << 5); + case BEACON_MEASUREMENT_TABLE: + return sta->rrm & (1 << 6); + } + + return false; +} + static void __usteer_init usteer_sta_init(void) { usteer_timeout_init(&tq); diff --git a/ubus.c b/ubus.c index 2bd8ac8..fabc1a6 100644 --- a/ubus.c +++ b/ubus.c @@ -547,6 +547,11 @@ int usteer_ubus_trigger_client_scan(struct sta_info *si) { struct usteer_local_node *ln = container_of(si->node, struct usteer_local_node, node); + if (!usteer_sta_supports_beacon_measurement_mode(si->sta, BEACON_MEASUREMENT_ACTIVE)) { + MSG(DEBUG, "STA does not support beacon measurement sta=" MAC_ADDR_FMT "\n", MAC_ADDR_DATA(si->sta->addr)); + return 0; + } + si->scan_band = !si->scan_band; blob_buf_init(&b, 0); diff --git a/usteer.h b/usteer.h index 694e492..292bcc0 100644 --- a/usteer.h +++ b/usteer.h @@ -271,6 +271,8 @@ int usteer_ubus_notify_client_disassoc(struct sta_info *si); struct sta *usteer_sta_get(const uint8_t *addr, bool create); struct sta_info *usteer_sta_info_get(struct sta *sta, struct usteer_node *node, bool *create); +bool usteer_sta_supports_beacon_measurement_mode(struct sta *sta, enum usteer_beacon_measurement_mode mode); + void usteer_sta_info_update_timeout(struct sta_info *si, int timeout); void usteer_sta_info_update(struct sta_info *si, int signal, bool avg); -- 2.30.2