[openwrt/openwrt] wpa_supplicant: pass control events on the per-interface ubus object

LEDE Commits lede-commits at lists.infradead.org
Thu Nov 6 03:53:56 PST 2025


nbd pushed a commit to openwrt/openwrt.git, branch main:
https://git.openwrt.org/6bb30afe2f505851b816dd3f80102b28f0a5939f

commit 6bb30afe2f505851b816dd3f80102b28f0a5939f
Author: Felix Fietkau <nbd at nbd.name>
AuthorDate: Sat Nov 1 05:19:23 2025 +0000

    wpa_supplicant: pass control events on the per-interface ubus object
    
    Events are passed in the same format as they would be sent on the control
    socket.
    
    Signed-off-by: Felix Fietkau <nbd at nbd.name>
---
 .../services/hostapd/files/wpa_supplicant.uc        | 12 ++++++++++++
 .../hostapd/patches/601-ucode_support.patch         | 18 ++++++++++++++++++
 .../services/hostapd/src/wpa_supplicant/ucode.c     | 21 +++++++++++++++++++++
 .../services/hostapd/src/wpa_supplicant/ucode.h     |  5 +++++
 4 files changed, 56 insertions(+)

diff --git a/package/network/services/hostapd/files/wpa_supplicant.uc b/package/network/services/hostapd/files/wpa_supplicant.uc
index 2f0279d069..94a0c533dc 100644
--- a/package/network/services/hostapd/files/wpa_supplicant.uc
+++ b/package/network/services/hostapd/files/wpa_supplicant.uc
@@ -732,6 +732,15 @@ function iface_ubus_remove(ifname)
 	delete wpas.data.iface_ubus[ifname];
 }
 
+function iface_ubus_notify(ifname, event)
+{
+	let obj = wpas.data.iface_ubus[ifname];
+	if (!obj)
+		return;
+
+	obj.notify('ctrl-event', { event }, null, null, null, -1);
+}
+
 function iface_ubus_add(ifname)
 {
 	let ubus = wpas.data.ubus;
@@ -813,6 +822,9 @@ return {
 		iface_event("remove", name);
 		iface_ubus_remove(name);
 	},
+	ctrl_event: function(name, iface, ev) {
+		iface_ubus_notify(name, ev);
+	},
 	state: function(ifname, iface, state) {
 		let event_data = iface.status();
 		event_data.name = ifname;
diff --git a/package/network/services/hostapd/patches/601-ucode_support.patch b/package/network/services/hostapd/patches/601-ucode_support.patch
index f72f2601c3..835e856ff6 100644
--- a/package/network/services/hostapd/patches/601-ucode_support.patch
+++ b/package/network/services/hostapd/patches/601-ucode_support.patch
@@ -995,3 +995,21 @@ as adding/removing interfaces.
  	switch (event) {
  	case EVENT_AUTH:
  #ifdef CONFIG_FST
+--- a/wpa_supplicant/ctrl_iface_unix.c
++++ b/wpa_supplicant/ctrl_iface_unix.c
+@@ -28,6 +28,7 @@
+ #include "config.h"
+ #include "wpa_supplicant_i.h"
+ #include "ctrl_iface.h"
++#include "ucode.h"
+ 
+ /* Per-interface ctrl_iface */
+ 
+@@ -436,6 +437,7 @@ static void wpa_supplicant_ctrl_iface_ms
+ 	if (wpa_s == NULL)
+ 		return;
+ 
++	wpas_ucode_ctrl_event(wpa_s, txt, len);
+ 	gpriv = wpa_s->global->ctrl_iface;
+ 
+ 	if (type != WPA_MSG_NO_GLOBAL && gpriv &&
diff --git a/package/network/services/hostapd/src/wpa_supplicant/ucode.c b/package/network/services/hostapd/src/wpa_supplicant/ucode.c
index fd0d3405c9..35345323c3 100644
--- a/package/network/services/hostapd/src/wpa_supplicant/ucode.c
+++ b/package/network/services/hostapd/src/wpa_supplicant/ucode.c
@@ -157,6 +157,27 @@ void wpas_ucode_event(struct wpa_supplicant *wpa_s, int event, union wpa_event_d
 	ucv_put(wpa_ucode_call(4));
 }
 
+void wpas_ucode_ctrl_event(struct wpa_supplicant *wpa_s, const char *str, size_t len)
+{
+	uc_value_t *val;
+
+#define _EV_PREFIX "CTRL-EVENT-"
+	if (strncmp(str, _EV_PREFIX, sizeof(_EV_PREFIX) - 1) != 0)
+		return;
+
+	val = wpa_ucode_registry_get(iface_registry, wpa_s->ucode.idx);
+	if (!val)
+		return;
+
+	if (wpa_ucode_call_prepare("ctrl_event"))
+		return;
+
+	uc_value_push(ucv_string_new(wpa_s->ifname));
+	uc_value_push(ucv_get(val));
+	uc_value_push(ucv_string_new_length(str, len));
+	ucv_put(wpa_ucode_call(3));
+}
+
 void wpas_ucode_wps_complete(struct wpa_supplicant *wpa_s,
 			     const struct wps_credential *cred)
 {
diff --git a/package/network/services/hostapd/src/wpa_supplicant/ucode.h b/package/network/services/hostapd/src/wpa_supplicant/ucode.h
index de9930bec5..1b9ef50f1b 100644
--- a/package/network/services/hostapd/src/wpa_supplicant/ucode.h
+++ b/package/network/services/hostapd/src/wpa_supplicant/ucode.h
@@ -22,6 +22,7 @@ void wpas_ucode_add_bss(struct wpa_supplicant *wpa_s);
 void wpas_ucode_free_bss(struct wpa_supplicant *wpa_s);
 void wpas_ucode_update_state(struct wpa_supplicant *wpa_s);
 void wpas_ucode_event(struct wpa_supplicant *wpa_s, int event, union wpa_event_data *data);
+void wpas_ucode_ctrl_event(struct wpa_supplicant *wpa_s, const char *str, size_t len);
 bool wpas_ucode_bss_allowed(struct wpa_supplicant *wpa_s, struct wpa_bss *bss);
 void wpas_ucode_wps_complete(struct wpa_supplicant *wpa_s,
 			     const struct wps_credential *cred);
@@ -49,6 +50,10 @@ static inline void wpas_ucode_event(struct wpa_supplicant *wpa_s, int event, uni
 {
 }
 
+static inline void wpas_ucode_ctrl_event(struct wpa_supplicant *wpa_s, const char *str, size_t len)
+{
+}
+
 static inline bool wpas_ucode_bss_allowed(struct wpa_supplicant *wpa_s, struct wpa_bss *bss)
 {
 	return true;




More information about the lede-commits mailing list