hostapd: provide BSS-transition-queries to ubus subscribers
[openwrt/staging/dedeckeh.git] / package / network / services / hostapd / src / src / ap / ubus.c
index 3e5456e695e92ce8a7bf19f4f5b399ef04161ed7..20ee7c90e7d6d3380d3c473d7f3f94396a7e21a6 100644 (file)
@@ -1850,13 +1850,30 @@ void hostapd_ubus_notify_radar_detected(struct hostapd_iface *iface, int frequen
        }
 }
 
+#ifdef CONFIG_WNM_AP
+static void hostapd_ubus_notify_bss_transition_add_candidate_list(
+       const u8 *candidate_list, u16 candidate_list_len)
+{
+       char *cl_str;
+       int i;
+
+       if (candidate_list_len == 0)
+               return;
+
+       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);
+
+}
+#endif
+
 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)
@@ -1872,13 +1889,45 @@ void hostapd_ubus_notify_bss_transition_response(
        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);
-       }
+       
+       hostapd_ubus_notify_bss_transition_add_candidate_list(candidate_list, candidate_list_len);
 
        ubus_notify(ctx, &hapd->ubus.obj, "bss-transition-response", b.head, -1);
 #endif
 }
+
+int hostapd_ubus_notify_bss_transition_query(
+       struct hostapd_data *hapd, const u8 *addr, u8 dialog_token, u8 reason,
+       const u8 *candidate_list, u16 candidate_list_len)
+{
+#ifdef CONFIG_WNM_AP
+       struct ubus_event_req ureq = {};
+       char *cl_str;
+       u16 i;
+
+       if (!hapd->ubus.obj.has_subscribers)
+               return 0;
+
+       if (!addr)
+               return 0;
+
+       blob_buf_init(&b, 0);
+       blobmsg_add_macaddr(&b, "address", addr);
+       blobmsg_add_u8(&b, "dialog-token", dialog_token);
+       blobmsg_add_u8(&b, "reason", reason);
+       hostapd_ubus_notify_bss_transition_add_candidate_list(candidate_list, candidate_list_len);
+
+       if (!hapd->ubus.notify_response) {
+               ubus_notify(ctx, &hapd->ubus.obj, "bss-transition-query", b.head, -1);
+               return 0;
+       }
+
+       if (ubus_notify_async(ctx, &hapd->ubus.obj, "bss-transition-query", b.head, &ureq.nreq))
+               return 0;
+
+       ureq.nreq.status_cb = ubus_event_cb;
+       ubus_complete_request(ctx, &ureq.nreq.req, 100);
+
+       return ureq.resp;
+#endif
+}
\ No newline at end of file