uspot: configure devices ifnames in section uspot

The current uspot config uses a single named section to assign ifnames
to uspot interfaces like so:

config devices 'devices'
	option wlanc0 'hotspot1'
	option wlanc1 'hotspot1'

Where 'wlanc0' and 'wlanc1' are physical ifnames.

Code in common.uc also hardcodes a check to match ifnames with 'wlanc*'.

This comit gets rid of the "config device" sections and accepts in the
"config uspot" sections e.g.:

	option ifname 'wlanc0'
or
	list ifname 'wlanc0'
	list ifname 'wlanc1'

The listed devices are then associated with the current uspot config
exactly as they were with the previous configuration system.

The hardcoded check in common.uc is also removed, allowing arbitrary
ifnames to be used.

Malformed sections are ignored with a warning. Subsequent duplicate
entries for a given ifname are be ignored with a warning.

Signed-off-by: Thibaut VARÈNE <hacks@slashdirt.org>
This commit is contained in:
Thibaut VARÈNE
2023-05-11 11:08:42 +02:00
committed by John Crispin
parent b44c7b09db
commit 74651831ef
4 changed files with 36 additions and 11 deletions

View File

@@ -1,2 +1 @@
config devices devices
config webroot def_captive config webroot def_captive

View File

@@ -10,10 +10,10 @@ function restart() {
function interfaces() { function interfaces() {
let interfaces = []; let interfaces = [];
let devices = uci.get_all('uspot', 'devices'); uci.foreach('uspot', 'uspot', (d) => {
for (let k, v in devices) if (!d[".anonymous"])
if (substr(k, 0, 1) != '.') push(interfaces, d[".name"]);
push(interfaces, v); });
return uniq(interfaces); return uniq(interfaces);
} }

View File

@@ -21,10 +21,10 @@ function session_timeout(interface) {
return config[interface].session_timeout || 0; return config[interface].session_timeout || 0;
} }
let devices = uci.get_all('uspot', 'devices'); uci.foreach('uspot', 'uspot', (d) => {
for (let k, v in devices) if (!d[".anonymous"])
if (substr(k, 0, 1) != '.') clients[d[".name"]] = {};
clients[v] = {};; });
function syslog(interface, mac, msg) { function syslog(interface, mac, msg) {
let log = sprintf('uspot: %s %s %s', interface, mac, msg); let log = sprintf('uspot: %s %s %s', interface, mac, msg);

View File

@@ -29,12 +29,38 @@ if (file) {
file.close(); file.close();
} }
let devices = uci.get_all('uspot', 'devices'); let devices = {};
uci.foreach('uspot', 'uspot', (d) => {
function adddev(ifname, sname) {
if (ifname in devices)
warn('uspot: ignoring duplicate entry for ifname: "' + ifname + '"\n');
else
devices[ifname] = sname;
}
if (d[".anonymous"]) {
warn('uspot: ignoring invalid anonymous section at index ' + d[".index"] + '\n');
return;
}
let spotname = d[".name"];
if (!d.ifname) {
warn('uspot: missing ifname in section "' + spotname + '"\n');
return;
}
if (type(d.ifname) == "array") {
for (let n in d.ifname)
adddev(n, spotname);
}
else
adddev(d.ifname, spotname);
});
function lookup_station(mac) { function lookup_station(mac) {
let wifs = nl.request(nl.const.NL80211_CMD_GET_INTERFACE, nl.const.NLM_F_DUMP); let wifs = nl.request(nl.const.NL80211_CMD_GET_INTERFACE, nl.const.NLM_F_DUMP);
for (let wif in wifs) { for (let wif in wifs) {
if (substr(wif.ifname, 0, 5) != 'wlanc') if (!(wif.ifname in devices))
continue; continue;
let res = nl.request(nl.const.NL80211_CMD_GET_STATION, nl.const.NLM_F_DUMP, { dev: wif.ifname }); let res = nl.request(nl.const.NL80211_CMD_GET_STATION, nl.const.NLM_F_DUMP, { dev: wif.ifname });
for (let sta in res) { for (let sta in res) {