hostapd: add ubus link-measurements notifications
authorDavid Bauer <mail@david-bauer.net>
Thu, 31 Mar 2022 20:39:04 +0000 (22:39 +0200)
committerDavid Bauer <mail@david-bauer.net>
Sun, 24 Apr 2022 21:26:04 +0000 (23:26 +0200)
Notify external ubus subscribers of received link-measurement reports.

Signed-off-by: David Bauer <mail@david-bauer.net>
(cherry picked from commit f6445cfa1acb32676723c49da3e3158b64a4b3d2)

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 eaf1e420ada679c8b588ea466372e00c8b8edb84..ddcd926fad0d92b72b97a299bc51cd927bfb20a6 100644 (file)
  }
  
  
+@@ -352,6 +355,9 @@ void hostapd_handle_radio_measurement(st
+                  mgmt->u.action.u.rrm.action, MAC2STR(mgmt->sa));
+       switch (mgmt->u.action.u.rrm.action) {
++      case WLAN_RRM_LINK_MEASUREMENT_REPORT:
++              hostapd_ubus_handle_link_measurement(hapd, buf, len);
++              break;
+       case WLAN_RRM_RADIO_MEASUREMENT_REPORT:
+               hostapd_handle_radio_msmt_report(hapd, buf, len);
+               break;
 --- a/src/ap/wnm_ap.c
 +++ b/src/ap/wnm_ap.c
 @@ -463,7 +463,7 @@ static void ieee802_11_rx_bss_trans_mgmt
index ea7366f7866f2a9d1e6c48d7aff44b3bc29a62ef..a8b8599b544e3f07272806ddc42db307f05ed8af 100644 (file)
@@ -1313,6 +1313,34 @@ hostapd_rrm_lm_req(struct ubus_context *ctx, struct ubus_object *obj,
 }
 
 
+void hostapd_ubus_handle_link_measurement(struct hostapd_data *hapd, const u8 *data, size_t len)
+{
+       const struct ieee80211_mgmt *mgmt = (const struct ieee80211_mgmt *) data;
+       const u8 *pos, *end;
+       u8 token;
+
+       end = data + len;
+       token = mgmt->u.action.u.rrm.dialog_token;
+       pos = mgmt->u.action.u.rrm.variable;
+
+       if (end - pos < 8)
+               return;
+
+       if (!hapd->ubus.obj.has_subscribers)
+               return;
+
+       blob_buf_init(&b, 0);
+       blobmsg_add_macaddr(&b, "address", mgmt->sa);
+       blobmsg_add_u16(&b, "dialog-token", token);
+       blobmsg_add_u16(&b, "rx-antenna-id", pos[4]);
+       blobmsg_add_u16(&b, "tx-antenna-id", pos[5]);
+       blobmsg_add_u16(&b, "rcpi", pos[6]);
+       blobmsg_add_u16(&b, "rsni", pos[7]);
+
+       ubus_notify(ctx, &hapd->ubus.obj, "link-measurement-report", b.head, -1);
+}
+
+
 #ifdef CONFIG_WNM_AP
 
 static int
index 8398d6badad4c8b2fe7b73d7182a15dc2e830878..006798dcc7923b86cab66a7224005e1bda5f3616 100644 (file)
@@ -45,6 +45,7 @@ void hostapd_ubus_add_bss(struct hostapd_data *hapd);
 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_handle_link_measurement(struct hostapd_data *hapd, const u8 *data, size_t len);
 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,
@@ -83,6 +84,10 @@ static inline int hostapd_ubus_handle_event(struct hostapd_data *hapd, struct ho
        return 0;
 }
 
+static inline void hostapd_ubus_handle_link_measurement(struct hostapd_data *hapd, const u8 *data, size_t len)
+{
+}
+
 static inline void hostapd_ubus_notify(struct hostapd_data *hapd, const char *type, const u8 *mac)
 {
 }