mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-23 23:42:43 +00:00
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@nbd.name>
This commit is contained in:
parent
1be18c6daa
commit
00860e485b
@ -302,7 +302,7 @@ function setup() {
|
|||||||
if (mode != "ap")
|
if (mode != "ap")
|
||||||
data.config.noscan = true;
|
data.config.noscan = true;
|
||||||
validate('iface', v.config);
|
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);
|
netifd.set_vif(k, v.config.ifname);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -490,6 +490,10 @@
|
|||||||
"type": "alias",
|
"type": "alias",
|
||||||
"default": "bssid"
|
"default": "bssid"
|
||||||
},
|
},
|
||||||
|
"macaddr_base": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "Base MAC address used for deriving interface MAC addresses"
|
||||||
|
},
|
||||||
"max_amsdu": {
|
"max_amsdu": {
|
||||||
"description": "Maximum A-MSDU length of 7935 octects (3839 octets if option set to 0)",
|
"description": "Maximum A-MSDU length of 7935 octects (3839 octets if option set to 0)",
|
||||||
"type": "boolean",
|
"type": "boolean",
|
||||||
|
@ -544,6 +544,8 @@ export function setup(data) {
|
|||||||
|
|
||||||
if (data.config.num_global_macaddr)
|
if (data.config.num_global_macaddr)
|
||||||
append('\n#num_global_macaddr', 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) {
|
for (let k, interface in data.interfaces) {
|
||||||
if (interface.config.mode != 'ap')
|
if (interface.config.mode != 'ap')
|
||||||
|
@ -178,9 +178,9 @@ function macaddr_random() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let mac_idx = 0;
|
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) {
|
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');
|
data.macaddr = trim(pipe.read("all"), '\n');
|
||||||
pipe.close();
|
pipe.close();
|
||||||
|
@ -221,6 +221,7 @@ export function setup(config, data) {
|
|||||||
config,
|
config,
|
||||||
defer: true,
|
defer: true,
|
||||||
num_global_macaddr: data.config.num_global_macaddr,
|
num_global_macaddr: data.config.num_global_macaddr,
|
||||||
|
macaddr_base: data.config.macaddr_base,
|
||||||
});
|
});
|
||||||
|
|
||||||
if (ret)
|
if (ret)
|
||||||
@ -235,5 +236,6 @@ export function start(data) {
|
|||||||
phy: data.phy,
|
phy: data.phy,
|
||||||
radio: data.config.radio,
|
radio: data.config.radio,
|
||||||
num_global_macaddr: data.config.num_global_macaddr,
|
num_global_macaddr: data.config.num_global_macaddr,
|
||||||
|
macaddr_base: data.config.macaddr_base,
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
@ -30,6 +30,7 @@ drv_mac80211_init_device_config() {
|
|||||||
config_add_string tx_burst
|
config_add_string tx_burst
|
||||||
config_add_string distance
|
config_add_string distance
|
||||||
config_add_string ifname_prefix
|
config_add_string ifname_prefix
|
||||||
|
config_add_string macaddr_base
|
||||||
config_add_int radio beacon_int chanbw frag rts
|
config_add_int radio beacon_int chanbw frag rts
|
||||||
config_add_int rxantenna txantenna txpower min_tx_power
|
config_add_int rxantenna txantenna txpower min_tx_power
|
||||||
config_add_int num_global_macaddr multiple_bssid
|
config_add_int num_global_macaddr multiple_bssid
|
||||||
@ -530,6 +531,7 @@ ${hostapd_noscan:+noscan=1}
|
|||||||
${tx_burst:+tx_queue_data2_burst=$tx_burst}
|
${tx_burst:+tx_queue_data2_burst=$tx_burst}
|
||||||
${multiple_bssid:+mbssid=$multiple_bssid}
|
${multiple_bssid:+mbssid=$multiple_bssid}
|
||||||
#num_global_macaddr=$num_global_macaddr
|
#num_global_macaddr=$num_global_macaddr
|
||||||
|
#macaddr_base=$macaddr_base
|
||||||
$base_cfg
|
$base_cfg
|
||||||
|
|
||||||
EOF
|
EOF
|
||||||
@ -577,7 +579,7 @@ mac80211_generate_mac() {
|
|||||||
local phy="$1"
|
local phy="$1"
|
||||||
local id="${macidx:-0}"
|
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() (
|
get_board_phy_name() (
|
||||||
@ -939,6 +941,7 @@ wpa_supplicant_set_config() {
|
|||||||
json_add_string phy "$phy"
|
json_add_string phy "$phy"
|
||||||
json_add_int radio "$radio"
|
json_add_int radio "$radio"
|
||||||
json_add_int num_global_macaddr "$num_global_macaddr"
|
json_add_int num_global_macaddr "$num_global_macaddr"
|
||||||
|
json_add_string macaddr_base "$macaddr_base"
|
||||||
json_add_boolean defer 1
|
json_add_boolean defer 1
|
||||||
local data="$(json_dump)"
|
local data="$(json_dump)"
|
||||||
|
|
||||||
@ -985,7 +988,7 @@ wpa_supplicant_start() {
|
|||||||
|
|
||||||
[ -n "$wpa_supp_init" ] || return 0
|
[ -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() {
|
mac80211_setup_supplicant() {
|
||||||
@ -1112,7 +1115,7 @@ drv_mac80211_setup() {
|
|||||||
rxantenna txantenna \
|
rxantenna txantenna \
|
||||||
frag rts beacon_int:100 htmode \
|
frag rts beacon_int:100 htmode \
|
||||||
num_global_macaddr:1 multiple_bssid \
|
num_global_macaddr:1 multiple_bssid \
|
||||||
ifname_prefix
|
ifname_prefix macaddr_base
|
||||||
json_get_values basic_rate_list basic_rate
|
json_get_values basic_rate_list basic_rate
|
||||||
json_get_values scan_list scan_list
|
json_get_values scan_list scan_list
|
||||||
json_select ..
|
json_select ..
|
||||||
|
@ -213,7 +213,9 @@ const phy_proto = {
|
|||||||
if (!base_mask)
|
if (!base_mask)
|
||||||
return null;
|
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)) {
|
(radio_idx > 0 || idx >= num_global)) {
|
||||||
let addrs = split(phy_sysfs_file(phy, "addresses"), "\n");
|
let addrs = split(phy_sysfs_file(phy, "addresses"), "\n");
|
||||||
|
|
||||||
|
@ -280,6 +280,7 @@ function iface_macaddr_init(phydev, config, macaddr_list)
|
|||||||
{
|
{
|
||||||
let macaddr_data = {
|
let macaddr_data = {
|
||||||
num_global: config.num_global_macaddr ?? 1,
|
num_global: config.num_global_macaddr ?? 1,
|
||||||
|
macaddr_base: config.macaddr_base,
|
||||||
mbssid: config.mbssid ?? 0,
|
mbssid: config.mbssid ?? 0,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -750,6 +751,8 @@ function iface_load_config(phy, radio, filename)
|
|||||||
|
|
||||||
if (val[0] == "#num_global_macaddr")
|
if (val[0] == "#num_global_macaddr")
|
||||||
config[substr(val[0], 1)] = int(val[1]);
|
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")
|
else if (val[0] == "mbssid")
|
||||||
config[val[0]] = int(val[1]);
|
config[val[0]] = int(val[1]);
|
||||||
|
|
||||||
|
@ -68,7 +68,7 @@ function prepare_config(config, radio)
|
|||||||
return { config };
|
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];
|
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.radio = radio;
|
||||||
phy.num_global_macaddr = num_global_macaddr;
|
phy.num_global_macaddr = num_global_macaddr;
|
||||||
|
phy.macaddr_base = macaddr_base;
|
||||||
|
|
||||||
let values = [];
|
let values = [];
|
||||||
for (let config in config_list)
|
for (let config in config_list)
|
||||||
@ -106,7 +107,10 @@ function start_pending(phy_name)
|
|||||||
}
|
}
|
||||||
|
|
||||||
let macaddr_list = wpas.data.macaddr_list[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)
|
for (let ifname in phy.data)
|
||||||
iface_start(phydev, phy.data[ifname]);
|
iface_start(phydev, phy.data[ifname]);
|
||||||
@ -210,6 +214,7 @@ let main_obj = {
|
|||||||
phy: "",
|
phy: "",
|
||||||
radio: 0,
|
radio: 0,
|
||||||
num_global_macaddr: 0,
|
num_global_macaddr: 0,
|
||||||
|
macaddr_base: "",
|
||||||
config: [],
|
config: [],
|
||||||
defer: true,
|
defer: true,
|
||||||
},
|
},
|
||||||
@ -221,7 +226,7 @@ let main_obj = {
|
|||||||
wpas.printf(`Set new config for phy ${phy}`);
|
wpas.printf(`Set new config for phy ${phy}`);
|
||||||
try {
|
try {
|
||||||
if (req.args.config)
|
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)
|
if (!req.args.defer)
|
||||||
start_pending(phy);
|
start_pending(phy);
|
||||||
|
Loading…
Reference in New Issue
Block a user