From: John Crispin Date: Fri, 19 Sep 2025 15:05:30 +0000 (+0200) Subject: wifi-scripts: refactor iwinfo.uc to support dynamic data updates X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=26eab84f81ad0fa8018c950530d5c7a7b0a3b5d7;p=thirdparty%2Fopenwrt.git wifi-scripts: refactor iwinfo.uc to support dynamic data updates 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 --- diff --git a/package/network/config/wifi-scripts/files-ucode/usr/share/ucode/iwinfo.uc b/package/network/config/wifi-scripts/files-ucode/usr/share/ucode/iwinfo.uc index 554ed71d3b4..4bc04134a69 100644 --- a/package/network/config/wifi-scripts/files-ucode/usr/share/ucode/iwinfo.uc +++ b/package/network/config/wifi-scripts/files-ucode/usr/share/ucode/iwinfo.uc @@ -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();