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@nbd.name>
This commit is contained in:
parent
c39a09686e
commit
119aa00a78
3 changed files with 132 additions and 98 deletions
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
};
|
Loading…
Reference in a new issue