hostapd: ubus: add notification for BSS transition response
[openwrt/staging/mkresin.git] / package / network / services / hostapd / src / src / ap / ubus.c
index 367e1b652b138d090d904f3e22b73c47885df0c6..30bb353953592109a2efe29dfaa02a3e6947372d 100644 (file)
@@ -1757,3 +1757,36 @@ void hostapd_ubus_notify_radar_detected(struct hostapd_iface *iface, int frequen
                ubus_notify(ctx, &hapd->ubus.obj, "radar-detected", b.head, -1);
        }
 }
+
+void hostapd_ubus_notify_bss_transition_response(
+       struct hostapd_data *hapd, const u8 *addr, u8 dialog_token, u8 status_code,
+       u8 bss_termination_delay, const u8 *target_bssid,
+       const u8 *candidate_list, u16 candidate_list_len)
+{
+#ifdef CONFIG_WNM_AP
+       char *cl_str;
+       u16 i;
+
+       if (!hapd->ubus.obj.has_subscribers)
+               return;
+
+       if (!addr)
+               return;
+
+       blob_buf_init(&b, 0);
+       blobmsg_add_macaddr(&b, "address", addr);
+       blobmsg_add_u8(&b, "dialog-token", dialog_token);
+       blobmsg_add_u8(&b, "status-code", status_code);
+       blobmsg_add_u8(&b, "bss-termination-delay", bss_termination_delay);
+       if (target_bssid)
+               blobmsg_add_macaddr(&b, "target-bssid", target_bssid);
+       if (candidate_list_len > 0) {
+               cl_str = blobmsg_alloc_string_buffer(&b, "candidate-list", candidate_list_len * 2 + 1);
+               for (i = 0; i < candidate_list_len; i++)
+                       snprintf(&cl_str[i*2], 3, "%02X", candidate_list[i]);
+               blobmsg_add_string_buffer(&b);
+       }
+
+       ubus_notify(ctx, &hapd->ubus.obj, "bss-transition-response", b.head, -1);
+#endif
+}