]> git.ipfire.org Git - thirdparty/openwrt.git/commitdiff
wifi-scripts: refactor iwinfo.uc to support dynamic data updates
authorJohn Crispin <john@phrozen.org>
Fri, 19 Sep 2025 15:05:30 +0000 (17:05 +0200)
committerFelix Fietkau <nbd@nbd.name>
Thu, 22 Jan 2026 10:24:17 +0000 (11:24 +0100)
Moved interface discovery and data population into an exported update()
function that can be called on-demand to refresh wireless interface
information. This allows using iwinfo.uc as a library inside daemons.

Signed-off-by: John Crispin <john@phrozen.org>
package/network/config/wifi-scripts/files-ucode/usr/share/ucode/iwinfo.uc

index 554ed71d3b4d39c2cf537fc73ed4878b80465208..4bc04134a69eff4e5fcbd3178cd2d03a4feee070 100644 (file)
@@ -8,11 +8,11 @@ let wifi_devices = json(readfile('/usr/share/wifi_devices.json'));
 let countries = json(readfile('/usr/share/iso3166.json'));
 let board_data = json(readfile('/etc/board.json'));
 
-export let phys = nl80211.request(nl80211.const.NL80211_CMD_GET_WIPHY, nl80211.const.NLM_F_DUMP, { split_wiphy_dump: true });
-let interfaces = nl80211.request(nl80211.const.NL80211_CMD_GET_INTERFACE, nl80211.const.NLM_F_DUMP);
-
 let ubus = libubus.connect();
-let wireless_status = ubus.call('network.wireless', 'status');
+
+export let phys;
+let interfaces;
+let wireless_status;
 
 function find_phy(wiphy) {
        for (let k,  phy in phys)
@@ -93,39 +93,47 @@ const iftypes = [
 ];
 
 export let ifaces = {};
-for (let k, v in interfaces) {
-       let iface = ifaces[v.ifname] = v;
-
-       iface.mode = iftypes[iface.iftype] ?? 'unknown',
-       iface.noise = get_noise(iface);
-       iface.country = get_country(iface);
-       iface.max_power = get_max_power(iface);
-       iface.assoclist = nl80211.request(nl80211.const.NL80211_CMD_GET_STATION, nl80211.const.NLM_F_DUMP, { dev: v.ifname }) ?? [];
-       iface.hardware = get_hardware_id(iface);
-
-       iface.bss_info = ubus.call('hostapd', 'bss_info', { iface: v.ifname });
-       if (!iface.bss_info)
-               iface.bss_info = ubus.call('wpa_supplicant', 'bss_info', { iface: v.ifname });
-}
 
-for (let radio, data in wireless_status)
-       for (let k, v in data.interfaces) {
-               if (!v.ifname || !ifaces[v.ifname])
-                       continue;
+export function update() {
+       phys = nl80211.request(nl80211.const.NL80211_CMD_GET_WIPHY, nl80211.const.NLM_F_DUMP, { split_wiphy_dump: true });
+       interfaces = nl80211.request(nl80211.const.NL80211_CMD_GET_INTERFACE, nl80211.const.NLM_F_DUMP);
+       wireless_status = ubus.call('network.wireless', 'status');
+
+       ifaces = {};
+       for (let k, v in interfaces) {
+               let iface = ifaces[v.ifname] = v;
+
+               iface.mode = iftypes[iface.iftype] ?? 'unknown',
+               iface.noise = get_noise(iface);
+               iface.country = get_country(iface);
+               iface.max_power = get_max_power(iface);
+               iface.assoclist = nl80211.request(nl80211.const.NL80211_CMD_GET_STATION, nl80211.const.NLM_F_DUMP, { dev: v.ifname }) ?? [];
+               iface.hardware = get_hardware_id(iface);
+
+               iface.bss_info = ubus.call('hostapd', 'bss_info', { iface: v.ifname });
+               if (!iface.bss_info)
+                       iface.bss_info = ubus.call('wpa_supplicant', 'bss_info', { iface: v.ifname });
+       }
 
-               ifaces[v.ifname].ssid = v.config.ssid || v.config.mesh_id;
-               ifaces[v.ifname].radio = data.config;
-               
-               let bss_info = ifaces[v.ifname].bss_info;
-               let owe_transition_ifname = bss_info?.owe_transition_ifname;
-
-               if (v.config.owe_transition && ifaces[owe_transition_ifname]) {
-                       ifaces[v.ifname].owe_transition_ifname = owe_transition_ifname;
-                       ifaces[owe_transition_ifname].ssid = v.config.ssid;
-                       ifaces[owe_transition_ifname].radio = data.config;
-                       ifaces[owe_transition_ifname].owe_transition_ifname = v.ifname
+       for (let radio, data in wireless_status)
+               for (let k, v in data.interfaces) {
+                       if (!v.ifname || !ifaces[v.ifname])
+                               continue;
+
+                       ifaces[v.ifname].ssid = v.config.ssid || v.config.mesh_id;
+                       ifaces[v.ifname].radio = data.config;
+
+                       let bss_info = ifaces[v.ifname].bss_info;
+                       let owe_transition_ifname = bss_info?.owe_transition_ifname;
+
+                       if (v.config.owe_transition && ifaces[owe_transition_ifname]) {
+                               ifaces[v.ifname].owe_transition_ifname = owe_transition_ifname;
+                               ifaces[owe_transition_ifname].ssid = v.config.ssid;
+                               ifaces[owe_transition_ifname].radio = data.config;
+                               ifaces[owe_transition_ifname].owe_transition_ifname = v.ifname
+                       }
                }
-       }
+};
 
 function format_channel(freq) {
        if (freq < 1000)
@@ -674,3 +682,5 @@ export function scan(dev) {
 
        return cells;
 };
+
+update();