hostapd: expose beacon reports through ubus
authorNick Hainke <vincent@systemli.org>
Fri, 6 Dec 2019 17:17:06 +0000 (18:17 +0100)
committerDavid Bauer <mail@david-bauer.net>
Sun, 29 Mar 2020 23:46:50 +0000 (01:46 +0200)
Subscribe to beacon reports through ubus.
Can be used for hearing map and client steering purposes.

First enable rrm:
    ubus call hostapd.wlan0 bss_mgmt_enable '{"beacon_report":True}'

Subscribe to the hostapd notifications via ubus.

Request beacon report:
    ubus call hostapd.wlan0 rrm_beacon_req
'{"addr":"00:xx:xx:xx:xx:xx", "op_class":0, "channel":1,
"duration":1,"mode":2,"bssid":"ff:ff:ff:ff:ff:ff", "ssid":""}'

Signed-off-by: Nick Hainke <vincent@systemli.org>
[rework identation]
Signed-off-by: David Bauer <mail@david-bauer.net>
package/network/services/hostapd/patches/600-ubus_support.patch
package/network/services/hostapd/src/src/ap/ubus.c
package/network/services/hostapd/src/src/ap/ubus.h

index 6842c0e63e6abc15cd52b917580700aee7771da3..b2860780eb25d2456431ce13abf06bb222a730cc 100644 (file)
                case 'o':
                        params.override_driver = optarg;
                        break;
+--- a/src/ap/rrm.c
++++ b/src/ap/rrm.c
+@@ -89,6 +89,9 @@ static void hostapd_handle_beacon_report
+               return;
+       wpa_msg(hapd->msg_ctx, MSG_INFO, BEACON_RESP_RX MACSTR " %u %02x %s",
+               MAC2STR(addr), token, rep_mode, report);
++      if (len < sizeof(struct rrm_measurement_beacon_report))
++              return;
++      hostapd_ubus_notify_beacon_report(hapd, addr, token, rep_mode, (struct rrm_measurement_beacon_report*) pos, len);
+ }
index 988cc7011313307596abfc26d1b04ecc609391ab..5b168125482954b18f195ffb23595fbf7e92da3b 100644 (file)
@@ -1271,3 +1271,29 @@ void hostapd_ubus_notify(struct hostapd_data *hapd, const char *type, const u8 *
 
        ubus_notify(ctx, &hapd->ubus.obj, type, b.head, -1);
 }
+
+void hostapd_ubus_notify_beacon_report(
+       struct hostapd_data *hapd, const u8 *addr, u8 token, u8 rep_mode,
+       struct rrm_measurement_beacon_report *rep, size_t len)
+{
+       if (!hapd->ubus.obj.has_subscribers)
+               return;
+
+       if (!addr || !rep)
+               return;
+
+       blob_buf_init(&b, 0);
+       blobmsg_add_macaddr(&b, "address", addr);
+       blobmsg_add_u16(&b, "op-class", rep->op_class);
+       blobmsg_add_u16(&b, "channel", rep->channel);
+       blobmsg_add_u64(&b, "start-time", rep->start_time);
+       blobmsg_add_u16(&b, "duration", rep->duration);
+       blobmsg_add_u16(&b, "report-info", rep->report_info);
+       blobmsg_add_u16(&b, "rcpi", rep->rcpi);
+       blobmsg_add_u16(&b, "rsni", rep->rsni);
+       blobmsg_add_macaddr(&b, "bssid", rep->bssid);
+       blobmsg_add_u16(&b, "antenna-id", rep->antenna_id);
+       blobmsg_add_u16(&b, "parent-tsf", rep->parent_tsf);
+
+       ubus_notify(ctx, &hapd->ubus.obj, "beacon-report", b.head, -1);
+}
index 27acd32659d5465cb78b4b2b9b590bc20257336b..e16017394fd8a0fb2093a3fd0ede3783577f0af5 100644 (file)
@@ -26,6 +26,7 @@ struct hostapd_ubus_request {
 struct hostapd_iface;
 struct hostapd_data;
 struct hapd_interfaces;
+struct rrm_measurement_beacon_report;
 
 #ifdef UBUS_SUPPORT
 
@@ -45,6 +46,10 @@ void hostapd_ubus_free_bss(struct hostapd_data *hapd);
 
 int hostapd_ubus_handle_event(struct hostapd_data *hapd, struct hostapd_ubus_request *req);
 void hostapd_ubus_notify(struct hostapd_data *hapd, const char *type, const u8 *mac);
+void hostapd_ubus_notify_beacon_report(struct hostapd_data *hapd,
+                                      const u8 *addr, u8 token, u8 rep_mode,
+                                      struct rrm_measurement_beacon_report *rep,
+                                      size_t len);
 
 void hostapd_ubus_add(struct hapd_interfaces *interfaces);
 void hostapd_ubus_free(struct hapd_interfaces *interfaces);
@@ -78,6 +83,14 @@ static inline void hostapd_ubus_notify(struct hostapd_data *hapd, const char *ty
 {
 }
 
+static inline void hostapd_ubus_notify_beacon_report(struct hostapd_data *hapd,
+                                                    const u8 *addr, u8 token,
+                                                    u8 rep_mode,
+                                                    struct rrm_measurement_beacon_report *rep,
+                                                    size_t len)
+{
+}
+
 static inline void hostapd_ubus_add(struct hapd_interfaces *interfaces)
 {
 }