[openwrt/openwrt] wifi-scripts: add macaddr_base wifi-device option
LEDE Commits
lede-commits at lists.infradead.org
Thu Dec 12 10:40:15 PST 2024
nbd pushed a commit to openwrt/openwrt.git, branch main:
https://git.openwrt.org/00860e485b2ef82c1fafc8e011f3a8965e317bca
commit 00860e485b2ef82c1fafc8e011f3a8965e317bca
Author: Felix Fietkau <nbd at nbd.name>
AuthorDate: Mon Dec 9 20:09:15 2024 +0100
wifi-scripts: add macaddr_base wifi-device option
This can be used to configure the base mac address from which all
interface mac addresses are derived
Signed-off-by: Felix Fietkau <nbd at nbd.name>
---
.../wifi-scripts/files-ucode/lib/netifd/wireless/mac80211.sh | 2 +-
.../files-ucode/usr/share/schema/wireless.wifi-device.json | 4 ++++
.../wifi-scripts/files-ucode/usr/share/ucode/wifi/hostapd.uc | 2 ++
.../wifi-scripts/files-ucode/usr/share/ucode/wifi/iface.uc | 4 ++--
.../files-ucode/usr/share/ucode/wifi/supplicant.uc | 2 ++
.../config/wifi-scripts/files/lib/netifd/wireless/mac80211.sh | 9 ++++++---
.../config/wifi-scripts/files/usr/share/hostap/common.uc | 4 +++-
package/network/services/hostapd/files/hostapd.uc | 3 +++
package/network/services/hostapd/files/wpa_supplicant.uc | 11 ++++++++---
9 files changed, 31 insertions(+), 10 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 cfd7424061..93ab404d57 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
@@ -302,7 +302,7 @@ function setup() {
if (mode != "ap")
data.config.noscan = true;
validate('iface', v.config);
- iface.prepare(v.config, data.phy + data.phy_suffix, data.config.num_global_macaddr);
+ iface.prepare(v.config, data.phy + data.phy_suffix, data.config.num_global_macaddr, data.config.macaddr_base);
netifd.set_vif(k, v.config.ifname);
break;
}
diff --git a/package/network/config/wifi-scripts/files-ucode/usr/share/schema/wireless.wifi-device.json b/package/network/config/wifi-scripts/files-ucode/usr/share/schema/wireless.wifi-device.json
index 77b7adada8..4354b4f816 100644
--- a/package/network/config/wifi-scripts/files-ucode/usr/share/schema/wireless.wifi-device.json
+++ b/package/network/config/wifi-scripts/files-ucode/usr/share/schema/wireless.wifi-device.json
@@ -490,6 +490,10 @@
"type": "alias",
"default": "bssid"
},
+ "macaddr_base": {
+ "type": "string",
+ "description": "Base MAC address used for deriving interface MAC addresses"
+ },
"max_amsdu": {
"description": "Maximum A-MSDU length of 7935 octects (3839 octets if option set to 0)",
"type": "boolean",
diff --git a/package/network/config/wifi-scripts/files-ucode/usr/share/ucode/wifi/hostapd.uc b/package/network/config/wifi-scripts/files-ucode/usr/share/ucode/wifi/hostapd.uc
index c7baa8d85b..f95f01e846 100644
--- a/package/network/config/wifi-scripts/files-ucode/usr/share/ucode/wifi/hostapd.uc
+++ b/package/network/config/wifi-scripts/files-ucode/usr/share/ucode/wifi/hostapd.uc
@@ -544,6 +544,8 @@ export function setup(data) {
if (data.config.num_global_macaddr)
append('\n#num_global_macaddr', data.config.num_global_macaddr);
+ if (data.config.macaddr_base)
+ append('\n#macaddr_base', data.config.macaddr_base);
for (let k, interface in data.interfaces) {
if (interface.config.mode != 'ap')
diff --git a/package/network/config/wifi-scripts/files-ucode/usr/share/ucode/wifi/iface.uc b/package/network/config/wifi-scripts/files-ucode/usr/share/ucode/wifi/iface.uc
index daddb801ef..ed9b2625bb 100644
--- a/package/network/config/wifi-scripts/files-ucode/usr/share/ucode/wifi/iface.uc
+++ b/package/network/config/wifi-scripts/files-ucode/usr/share/ucode/wifi/iface.uc
@@ -178,9 +178,9 @@ function macaddr_random() {
}
let mac_idx = 0;
-export function prepare(data, phy, num_global_macaddr) {
+export function prepare(data, phy, num_global_macaddr, macaddr_base) {
if (!data.macaddr) {
- let pipe = fs.popen(`ucode /usr/share/hostap/wdev.uc ${phy} get_macaddr id=${mac_idx} num_global=${num_global_macaddr} mbssid=${data.mbssid ?? 0}`);
+ let pipe = fs.popen(`ucode /usr/share/hostap/wdev.uc ${phy} get_macaddr id=${mac_idx} num_global=${num_global_macaddr} mbssid=${data.mbssid ?? 0} macaddr_base=${macaddr_base}`);
data.macaddr = trim(pipe.read("all"), '\n');
pipe.close();
diff --git a/package/network/config/wifi-scripts/files-ucode/usr/share/ucode/wifi/supplicant.uc b/package/network/config/wifi-scripts/files-ucode/usr/share/ucode/wifi/supplicant.uc
index 0519e58177..c7bfeb6b9a 100644
--- a/package/network/config/wifi-scripts/files-ucode/usr/share/ucode/wifi/supplicant.uc
+++ b/package/network/config/wifi-scripts/files-ucode/usr/share/ucode/wifi/supplicant.uc
@@ -221,6 +221,7 @@ export function setup(config, data) {
config,
defer: true,
num_global_macaddr: data.config.num_global_macaddr,
+ macaddr_base: data.config.macaddr_base,
});
if (ret)
@@ -235,5 +236,6 @@ export function start(data) {
phy: data.phy,
radio: data.config.radio,
num_global_macaddr: data.config.num_global_macaddr,
+ macaddr_base: data.config.macaddr_base,
});
};
diff --git a/package/network/config/wifi-scripts/files/lib/netifd/wireless/mac80211.sh b/package/network/config/wifi-scripts/files/lib/netifd/wireless/mac80211.sh
index 1fb3edf055..5d9bf8ee09 100755
--- a/package/network/config/wifi-scripts/files/lib/netifd/wireless/mac80211.sh
+++ b/package/network/config/wifi-scripts/files/lib/netifd/wireless/mac80211.sh
@@ -30,6 +30,7 @@ drv_mac80211_init_device_config() {
config_add_string tx_burst
config_add_string distance
config_add_string ifname_prefix
+ config_add_string macaddr_base
config_add_int radio beacon_int chanbw frag rts
config_add_int rxantenna txantenna txpower min_tx_power
config_add_int num_global_macaddr multiple_bssid
@@ -530,6 +531,7 @@ ${hostapd_noscan:+noscan=1}
${tx_burst:+tx_queue_data2_burst=$tx_burst}
${multiple_bssid:+mbssid=$multiple_bssid}
#num_global_macaddr=$num_global_macaddr
+#macaddr_base=$macaddr_base
$base_cfg
EOF
@@ -577,7 +579,7 @@ mac80211_generate_mac() {
local phy="$1"
local id="${macidx:-0}"
- wdev_tool "$phy$phy_suffix" get_macaddr id=$id num_global=$num_global_macaddr mbssid=${multiple_bssid:-0}
+ wdev_tool "$phy$phy_suffix" get_macaddr id=$id num_global=$num_global_macaddr mbssid=${multiple_bssid:-0} macaddr_base=${macaddr_base}
}
get_board_phy_name() (
@@ -939,6 +941,7 @@ wpa_supplicant_set_config() {
json_add_string phy "$phy"
json_add_int radio "$radio"
json_add_int num_global_macaddr "$num_global_macaddr"
+ json_add_string macaddr_base "$macaddr_base"
json_add_boolean defer 1
local data="$(json_dump)"
@@ -985,7 +988,7 @@ wpa_supplicant_start() {
[ -n "$wpa_supp_init" ] || return 0
- ubus_call wpa_supplicant config_set '{ "phy": "'"$phy"'", "radio": '"$radio"', "num_global_macaddr": '"$num_global_macaddr"' }' > /dev/null
+ ubus_call wpa_supplicant config_set '{ "phy": "'"$phy"'", "radio": '"$radio"', "num_global_macaddr": '"$num_global_macaddr"', "macaddr_base": "'"$macaddr_base"'" }' > /dev/null
}
mac80211_setup_supplicant() {
@@ -1112,7 +1115,7 @@ drv_mac80211_setup() {
rxantenna txantenna \
frag rts beacon_int:100 htmode \
num_global_macaddr:1 multiple_bssid \
- ifname_prefix
+ ifname_prefix macaddr_base
json_get_values basic_rate_list basic_rate
json_get_values scan_list scan_list
json_select ..
diff --git a/package/network/config/wifi-scripts/files/usr/share/hostap/common.uc b/package/network/config/wifi-scripts/files/usr/share/hostap/common.uc
index c6bfb62ef3..fd28b66472 100644
--- a/package/network/config/wifi-scripts/files/usr/share/hostap/common.uc
+++ b/package/network/config/wifi-scripts/files/usr/share/hostap/common.uc
@@ -213,7 +213,9 @@ const phy_proto = {
if (!base_mask)
return null;
- if (base_mask == "00:00:00:00:00:00" &&
+ if (data.macaddr_base)
+ base_addr = data.macaddr_base;
+ else if (base_mask == "00:00:00:00:00:00" &&
(radio_idx > 0 || idx >= num_global)) {
let addrs = split(phy_sysfs_file(phy, "addresses"), "\n");
diff --git a/package/network/services/hostapd/files/hostapd.uc b/package/network/services/hostapd/files/hostapd.uc
index 1593feef6b..053f08cb96 100644
--- a/package/network/services/hostapd/files/hostapd.uc
+++ b/package/network/services/hostapd/files/hostapd.uc
@@ -280,6 +280,7 @@ function iface_macaddr_init(phydev, config, macaddr_list)
{
let macaddr_data = {
num_global: config.num_global_macaddr ?? 1,
+ macaddr_base: config.macaddr_base,
mbssid: config.mbssid ?? 0,
};
@@ -750,6 +751,8 @@ function iface_load_config(phy, radio, filename)
if (val[0] == "#num_global_macaddr")
config[substr(val[0], 1)] = int(val[1]);
+ else if (val[0] == "#macaddr_base")
+ config[substr(val[0], 1)] = val[1];
else if (val[0] == "mbssid")
config[val[0]] = int(val[1]);
diff --git a/package/network/services/hostapd/files/wpa_supplicant.uc b/package/network/services/hostapd/files/wpa_supplicant.uc
index fbea27628e..f288121e9d 100644
--- a/package/network/services/hostapd/files/wpa_supplicant.uc
+++ b/package/network/services/hostapd/files/wpa_supplicant.uc
@@ -68,7 +68,7 @@ function prepare_config(config, radio)
return { config };
}
-function set_config(config_name, phy_name, radio, num_global_macaddr, config_list)
+function set_config(config_name, phy_name, radio, num_global_macaddr, macaddr_base, config_list)
{
let phy = wpas.data.config[config_name];
@@ -83,6 +83,7 @@ function set_config(config_name, phy_name, radio, num_global_macaddr, config_lis
phy.radio = radio;
phy.num_global_macaddr = num_global_macaddr;
+ phy.macaddr_base = macaddr_base;
let values = [];
for (let config in config_list)
@@ -106,7 +107,10 @@ function start_pending(phy_name)
}
let macaddr_list = wpas.data.macaddr_list[phy_name];
- phydev.macaddr_init(macaddr_list, { num_global: phy.num_global_macaddr });
+ phydev.macaddr_init(macaddr_list, {
+ num_global: phy.num_global_macaddr,
+ macaddr_base: phy.macaddr_base,
+ });
for (let ifname in phy.data)
iface_start(phydev, phy.data[ifname]);
@@ -210,6 +214,7 @@ let main_obj = {
phy: "",
radio: 0,
num_global_macaddr: 0,
+ macaddr_base: "",
config: [],
defer: true,
},
@@ -221,7 +226,7 @@ let main_obj = {
wpas.printf(`Set new config for phy ${phy}`);
try {
if (req.args.config)
- set_config(phy, req.args.phy, req.args.radio, req.args.num_global_macaddr, req.args.config);
+ set_config(phy, req.args.phy, req.args.radio, req.args.num_global_macaddr, req.args.macaddr_base, req.args.config);
if (!req.args.defer)
start_pending(phy);
More information about the lede-commits
mailing list