ubus: add notifications on wireless device state changes
authorFelix Fietkau <nbd@nbd.name>
Fri, 8 Nov 2024 09:07:32 +0000 (10:07 +0100)
committerFelix Fietkau <nbd@nbd.name>
Fri, 8 Nov 2024 09:07:33 +0000 (10:07 +0100)
Provide notifications similar to interface state changes

Signed-off-by: Felix Fietkau <nbd@nbd.name>
ubus.c
ubus.h
wireless.c

diff --git a/ubus.c b/ubus.c
index e46b83da50865a752a5a7070ef1befe4bae89315..3c3a7dccb6c201d59d08a16579931370cdf35ff6 100644 (file)
--- a/ubus.c
+++ b/ubus.c
@@ -1416,6 +1416,16 @@ netifd_ubus_interface_notify(struct interface *iface, bool up)
        ubus_notify(ubus_ctx, &iface->ubus, event, b.head, -1);
 }
 
+void
+netifd_ubus_wireless_notify(struct wireless_device *wdev, bool up)
+{
+       const char *event = (up) ? "wireless.update" : "wireless.down";
+
+       blob_buf_init(&b, 0);
+       wireless_device_status(wdev, &b);
+       ubus_notify(ubus_ctx, &wireless_object, event, b.head, -1);
+}
+
 void
 netifd_ubus_add_interface(struct interface *iface)
 {
diff --git a/ubus.h b/ubus.h
index b9b4b6919a5f1cf802377f52ca95e6a73fe8024f..89534a70e37cc1cf3c80945a85e21e2ab94c808b 100644 (file)
--- a/ubus.h
+++ b/ubus.h
@@ -14,6 +14,7 @@
 #ifndef __NETIFD_UBUS_H
 #define __NETIFD_UBUS_H
 
+struct wireless_device;
 typedef void (*procd_data_cb)(struct blob_attr *data);
 
 extern struct ubus_context *ubus_ctx;
@@ -29,5 +30,6 @@ void netifd_ubus_interface_event(struct interface *iface, bool up);
 void netifd_ubus_interface_notify(struct interface *iface, bool up);
 void netifd_ubus_device_notify(const char *event, struct blob_attr *data, int timeout);
 void netifd_ubus_get_procd_data(const char *type, procd_data_cb cb);
+void netifd_ubus_wireless_notify(struct wireless_device *wdev, bool up);
 
 #endif
index c8b89453ad7d6d6c992924766102c11de15e9ac0..c05bf7dd10d5044123e396bb26f1ce7ef831d84b 100644 (file)
@@ -602,6 +602,7 @@ wireless_device_mark_down(struct wireless_device *wdev)
        wdev->state = IFS_DOWN;
        wireless_device_free_state(wdev);
        wdev_handle_config_change(wdev);
+       netifd_ubus_wireless_notify(wdev, false);
 }
 
 /* timeout callback to protect the tear down */
@@ -671,6 +672,7 @@ wireless_device_mark_up(struct wireless_device *wdev)
                vlist_for_each_element(&vif->vlans, vlan, node)
                        wireless_vlan_handle_link(vlan, true);
        }
+       netifd_ubus_wireless_notify(wdev, true);
 }
 
 static void