wifi-scripts: fix ucode support for referencing wifi devices by phy name
authorFelix Fietkau <nbd@nbd.name>
Sun, 8 Dec 2024 12:55:33 +0000 (13:55 +0100)
committerFelix Fietkau <nbd@nbd.name>
Sun, 8 Dec 2024 13:11:14 +0000 (14:11 +0100)
Rename phys according to board.json

Signed-off-by: Felix Fietkau <nbd@nbd.name>
package/network/config/wifi-scripts/files-ucode/lib/netifd/wireless/mac80211.sh
package/network/config/wifi-scripts/files-ucode/usr/share/schema/wireless.wifi-device.json

index 8b55d01e7a8b51e451449da2fec0b05eb76308fb..cfd74240611fc040e9b3f0e792b5f92f1b30b67e 100755 (executable)
@@ -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 * as nl80211 from 'nl80211';
 import * as fs from 'fs';
 
 global.radio = ARGV[2];
@@ -57,7 +58,7 @@ function phy_path_match(phy, path) {
        return substr(phy_path, -length(path)) == path;
 }
 
-function find_phy_by_path(phys, path) {
+function __find_phy_by_path(phys, path) {
        if (!path)
                return null;
 
@@ -73,7 +74,57 @@ function find_phy_by_macaddr(phys, 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;
 }
 
index 0588401c99e639d108640ec38db80b9ebda4dd27..65d33989fe636a37e01213aed2860745aebb5ea1 100644 (file)
                        "description": "Alternative to phy used to identify the device based paths in /sys/devices",
                        "type": "string"
                },
+               "phy": {
+                       "description": "Name of the phy, as described in board.json",
+                       "type": "string"
+               },
                "radio": {
                        "description": "Index of the phy radio (for multi-radio PHYs)",
                        "type": "number",