hostapd: send ubus event on BSS update
authorDavid Bauer <mail@david-bauer.net>
Thu, 17 Sep 2020 23:11:13 +0000 (01:11 +0200)
committerDavid Bauer <mail@david-bauer.net>
Mon, 21 Sep 2020 19:26:12 +0000 (21:26 +0200)
hostapd will emit a ubus event with the eventname hostapd.<ifname>.<event>
when adding, removing or reloading a BSS.

This way, services which install state (for example the RMM neighbor
list) can on-demand reinstall this information for the BSS without
polling this state.

Signed-off-by: David Bauer <mail@david-bauer.net>
package/network/services/hostapd/Makefile
package/network/services/hostapd/src/src/ap/ubus.c

index 8c264854d70c7029df6e8db6752cab1f51104f43..e273e9e7d31498d02fedcff41f252e3f77edc5f2 100644 (file)
@@ -7,7 +7,7 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=hostapd
-PKG_RELEASE:=6
+PKG_RELEASE:=7
 
 PKG_SOURCE_URL:=http://w1.fi/hostap.git
 PKG_SOURCE_PROTO:=git
index aeea3105946fb267a1a19137caa3f34c463364ca..4753ff43881776f1344ae42c78f99cdc51cc0cb6 100644 (file)
@@ -108,6 +108,21 @@ void hostapd_ubus_free_iface(struct hostapd_iface *iface)
                return;
 }
 
+static void hostapd_send_ubus_event(char *bssname, char *event)
+{
+       char *name;
+
+       if (!ctx)
+               return;
+
+       if (asprintf(&name, "hostapd.%s.%s", bssname, event) < 0)
+               return;
+
+       blob_buf_init(&b, 0);
+       ubus_send_event(ctx, name, b.head);
+       free(name);
+}
+
 static void
 hostapd_bss_del_ban(void *eloop_data, void *user_ctx)
 {
@@ -152,7 +167,10 @@ hostapd_bss_reload(struct ubus_context *ctx, struct ubus_object *obj,
                   struct blob_attr *msg)
 {
        struct hostapd_data *hapd = container_of(obj, struct hostapd_data, ubus.obj);
-       return hostapd_reload_config(hapd->iface, 1);
+       int ret = hostapd_reload_config(hapd->iface, 1);
+
+       hostapd_send_ubus_event(hapd->conf->iface, "reload");
+       return ret;
 }
 
 static int
@@ -1086,6 +1104,8 @@ void hostapd_ubus_add_bss(struct hostapd_data *hapd)
        obj->n_methods = bss_object_type.n_methods;
        ret = ubus_add_object(ctx, obj);
        hostapd_ubus_ref_inc();
+
+       hostapd_send_ubus_event(hapd->conf->iface, "add");
 }
 
 void hostapd_ubus_free_bss(struct hostapd_data *hapd)
@@ -1096,6 +1116,8 @@ void hostapd_ubus_free_bss(struct hostapd_data *hapd)
        if (!ctx)
                return;
 
+       hostapd_send_ubus_event(hapd->conf->iface, "remove");
+
        if (obj->id) {
                ubus_remove_object(ctx, obj);
                hostapd_ubus_ref_dec();