From: Felix Fietkau Date: Wed, 16 Jul 2025 11:09:03 +0000 (+0200) Subject: wifi-scripts: ucode: add support for iwinfo nl80211 phyname X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=119aa00a787f4f4f025c1d0588c9a446fffa22cc;p=thirdparty%2Fopenwrt.git wifi-scripts: ucode: add support for iwinfo nl80211 phyname It is needed for compatibility with scripts that rely on this existing iwinfo behavior Signed-off-by: Felix Fietkau --- diff --git a/package/network/config/wifi-scripts/files-ucode/lib/netifd/wireless/mac80211.sh b/package/network/config/wifi-scripts/files-ucode/lib/netifd/wireless/mac80211.sh index 96cd0d0fc37..249c7a4596d 100755 --- a/package/network/config/wifi-scripts/files-ucode/lib/netifd/wireless/mac80211.sh +++ b/package/network/config/wifi-scripts/files-ucode/lib/netifd/wireless/mac80211.sh @@ -8,6 +8,7 @@ import * as supplicant from 'wifi.supplicant'; import * as hostapd from 'wifi.hostapd'; import * as netifd from 'wifi.netifd'; import * as iface from 'wifi.iface'; +import { find_phy } from 'wifi.utils'; import * as nl80211 from 'nl80211'; import * as fs from 'fs'; @@ -41,101 +42,6 @@ function reset_config(phy, radio) { system(`ucode /usr/share/hostap/wdev.uc ${name} set_config '{}'`); } -function phy_filename(phy, name) { - return `/sys/class/ieee80211/${phy}/${name}`; -} - -function phy_file(phy, name) { - return fs.readfile(phy_filename(phy, name)); -} - -function phy_index(phy) { - return +phy_file(phy, "index"); -} - -function phy_path_match(phy, path) { - let phy_path = fs.realpath(phy_filename(phy, "device")); - return substr(phy_path, -length(path)) == path; -} - -function __find_phy_by_path(phys, path) { - if (!path) - return null; - - path = split(path, "+"); - phys = filter(phys, (phy) => phy_path_match(phy, path[0])); - phys = sort(phys, (a, b) => phy_index(a) - phy_index(b)); - - return phys[+path[1]]; -} - -function find_phy_by_macaddr(phys, macaddr) { - macaddr = lc(macaddr); - return filter(phys, (phy) => phy_file(phy, "macaddr") == macaddr)[0]; -} - -function rename_phy_by_name(phys, name) { - let data = json(fs.readfile("/etc/board.json")).wlan; - if (!data) - return; - - data = data[name]; - if (!data) - return; - - let prev_name = __find_phy_by_path(phys, data.path); - if (!prev_name) - return; - - let idx = phy_index(prev_name); - nl80211.request(nl80211.const.NL80211_CMD_SET_WIPHY, 0, { - wiphy: idx, - wiphy_name: name - }); - return true; -} - -function find_phy_by_path(phys, path) { - let name = __find_phy_by_path(phys, path); - if (!name) - return; - - let data = json(fs.readfile("/etc/board.json")).wlan; - if (!data || data[name]) - return name; - - for (let cur_name, cur_data in data) { - if (!phy_path_match(name, cur_data.path)) - continue; - - let idx = phy_index(name); - nl80211.request(nl80211.const.NL80211_CMD_SET_WIPHY, 0, { - wiphy: idx, - wiphy_name: cur_name - }); - - return cur_name; - } - - return name; -} - -function find_phy_by_name(phys, name) { - if (index(phys, name) >= 0) - return name; - - rename_phy_by_name(phys, name); - return index(phys, name) < 0 ? null : name; -} - -function find_phy(config) { - let phys = fs.lsdir("/sys/class/ieee80211"); - - return find_phy_by_path(phys, config.path) ?? - find_phy_by_macaddr(phys, config.macaddr) ?? - find_phy_by_name(phys, config.phy); -} - function get_channel_frequency(band, channel) { if (channel < 1) return null; @@ -254,7 +160,7 @@ function config_add_mesh_params(config, data) { function setup() { let data = json(ARGV[3]); - data.phy = find_phy(data.config); + data.phy = find_phy(data.config, true); if (!data.phy) { log('Bug: PHY is undefined for device'); netifd.set_retry(false); diff --git a/package/network/config/wifi-scripts/files-ucode/usr/bin/iwinfo b/package/network/config/wifi-scripts/files-ucode/usr/bin/iwinfo index 3b274f838c0..d51c3ad6faf 100755 --- a/package/network/config/wifi-scripts/files-ucode/usr/bin/iwinfo +++ b/package/network/config/wifi-scripts/files-ucode/usr/bin/iwinfo @@ -2,6 +2,8 @@ 'use strict'; +import { find_phy } from 'wifi.utils'; +import * as uci from 'uci'; import * as iwinfo from 'iwinfo'; function print_assoclist(stations) { @@ -123,6 +125,24 @@ const commands = { txpowerlist: [ iwinfo.txpowerlist, print_txpowerlist ], }; +if (ARGV[0] == 'nl80211' && ARGV[1] == 'phyname') { + let sec_name = ARGV[2]; + let sec = uci.cursor(null, null, null, { strict: false }).get_all('wireless', sec_name); + if (!sec || sec['.type'] != 'wifi-device') { + warn(`Config section ${sec_name} not found\n`); + return 1; + } + + let name = find_phy(sec); + if (!name) { + warn('Phy not found\n'); + return 1; + } + + print(name + '\n'); + return 0; +} + if (length(ARGV) == 2 && iwinfo.ifaces[ARGV[0]]) for (let cmd, cb in commands) if (substr(cmd, 0, length(ARGV[1])) == ARGV[1]) { @@ -145,7 +165,7 @@ case 'iface': return 0; } -printf('Usage:\n' + +warn('Usage:\n' + '\tiwinfo info\n' + '\tiwinfo scan\n' + '\tiwinfo txpowerlist\n' + @@ -153,4 +173,5 @@ printf('Usage:\n' + '\tiwinfo assoclist\n' + '\tiwinfo countrylist\n' + '\tiwinfo htmodelist\n' + - '\tiwinfo phyname
\n'); + '\tiwinfo nl80211 phyname
\n'); +return 1; diff --git a/package/network/config/wifi-scripts/files-ucode/usr/share/ucode/wifi/utils.uc b/package/network/config/wifi-scripts/files-ucode/usr/share/ucode/wifi/utils.uc new file mode 100644 index 00000000000..0ec85056706 --- /dev/null +++ b/package/network/config/wifi-scripts/files-ucode/usr/share/ucode/wifi/utils.uc @@ -0,0 +1,107 @@ +'use strict'; + +import { readfile, realpath, lsdir } from "fs"; +import * as nl80211 from "nl80211"; + +function phy_filename(phy, name) { + return `/sys/class/ieee80211/${phy}/${name}`; +} + +function phy_file(phy, name) { + return readfile(phy_filename(phy, name)); +} + +function phy_index(phy) { + return +phy_file(phy, "index"); +} + +function phy_path_match(phy, path) { + let phy_path = realpath(phy_filename(phy, "device")); + return substr(phy_path, -length(path)) == path; +} + +function __find_phy_by_path(phys, path) { + if (!path) + return null; + + path = split(path, "+"); + phys = filter(phys, (phy) => phy_path_match(phy, path[0])); + phys = sort(phys, (a, b) => phy_index(a) - phy_index(b)); + + return phys[+path[1]]; +} + +function find_phy_by_macaddr(phys, macaddr) { + macaddr = lc(macaddr); + return filter(phys, (phy) => phy_file(phy, "macaddr") == macaddr)[0]; +} + +function rename_phy_by_name(phys, name, rename) { + let data = json(readfile("/etc/board.json")).wlan; + if (!data) + return; + + data = data[name]; + if (!data) + return; + + let prev_name = __find_phy_by_path(phys, data.path); + if (!prev_name) + return; + + if (!rename) + return true; + + let idx = phy_index(prev_name); + nl80211.request(nl80211.const.NL80211_CMD_SET_WIPHY, 0, { + wiphy: idx, + wiphy_name: name + }); + return true; +} + +function find_phy_by_path(phys, path) { + let name = __find_phy_by_path(phys, path); + if (!name) + return; + + let data = json(readfile("/etc/board.json")).wlan; + if (!data || data[name]) + return name; + + for (let cur_name, cur_data in data) { + if (!phy_path_match(name, cur_data.path)) + continue; + + let idx = phy_index(name); + nl80211.request(nl80211.const.NL80211_CMD_SET_WIPHY, 0, { + wiphy: idx, + wiphy_name: cur_name + }); + + return cur_name; + } + + return name; +} + +function find_phy_by_name(phys, name, rename) { + if (index(phys, name) >= 0) + return name; + + if (!rename_phy_by_name(phys, name, rename)) + return; + + if (!rename) + return name; + + return index(phys, name) < 0 ? null : name; +} + +export function find_phy(config, rename) { + let phys = lsdir("/sys/class/ieee80211"); + + return find_phy_by_path(phys, config.path) ?? + find_phy_by_macaddr(phys, config.macaddr) ?? + find_phy_by_name(phys, config.phy, rename); +};