|
|
@@ -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);
|