[openwrt/openwrt] wifi-scripts: ucode: add support for iwinfo nl80211 phyname

LEDE Commits lede-commits at lists.infradead.org
Fri Jul 18 03:34:03 PDT 2025


nbd pushed a commit to openwrt/openwrt.git, branch main:
https://git.openwrt.org/119aa00a787f4f4f025c1d0588c9a446fffa22cc

commit 119aa00a787f4f4f025c1d0588c9a446fffa22cc
Author: Felix Fietkau <nbd at nbd.name>
AuthorDate: Wed Jul 16 13:09:03 2025 +0200

    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 <nbd at nbd.name>
---
 .../files-ucode/lib/netifd/wireless/mac80211.sh    |  98 +------------------
 .../config/wifi-scripts/files-ucode/usr/bin/iwinfo |  25 ++++-
 .../files-ucode/usr/share/ucode/wifi/utils.uc      | 107 +++++++++++++++++++++
 3 files changed, 132 insertions(+), 98 deletions(-)

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 96cd0d0fc3..249c7a4596 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 3b274f838c..d51c3ad6fa 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 <device> info\n' +
 	'\tiwinfo <device> scan\n' +
 	'\tiwinfo <device> txpowerlist\n' +
@@ -153,4 +173,5 @@ printf('Usage:\n' +
 	'\tiwinfo <device> assoclist\n' +
 	'\tiwinfo <device> countrylist\n' +
 	'\tiwinfo <device> htmodelist\n' +
-	'\tiwinfo <backend> phyname <section>\n');
+	'\tiwinfo nl80211 phyname <section>\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 0000000000..0ec8505670
--- /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);
+};




More information about the lede-commits mailing list