wifi-scripts: fix reload handling with random macaddr
authorFelix Fietkau <nbd@nbd.name>
Mon, 25 Aug 2025 18:31:02 +0000 (20:31 +0200)
committerFelix Fietkau <nbd@nbd.name>
Tue, 26 Aug 2025 09:53:50 +0000 (11:53 +0200)
Allow initially generated MAC address to be preserved across reload

Signed-off-by: Felix Fietkau <nbd@nbd.name>
package/network/config/wifi-scripts/files-ucode/usr/share/ucode/wifi/ap.uc
package/network/config/wifi-scripts/files-ucode/usr/share/ucode/wifi/iface.uc
package/network/config/wifi-scripts/files/lib/netifd/wireless/mac80211.sh
package/network/services/hostapd/files/hostapd.uc

index 16a2c67afeace63e11508b2aa70a7d1dfd70b5ef..bbd907c234362e558529b0f2843a279bc03cdf1c 100644 (file)
@@ -508,4 +508,6 @@ export function generate(interface, data, config, vlans, stas, phy_features) {
 
        if (config.default_macaddr)
                append_raw('#default_macaddr');
+       else if (config.random_macaddr)
+               append_raw('#random_macaddr');
 };
index 46af3b8a61694a4259d44d7fe8f4cf5549afad39..dd3143f0cd7bd67cc3e64c67027d599e20b6ca70 100644 (file)
@@ -243,8 +243,10 @@ export function prepare(data, phy, num_global_macaddr, macaddr_base) {
 
                data.default_macaddr = true;
                mac_idx++;
-       } else if (data.macaddr == 'random')
+       } else if (data.macaddr == 'random') {
                data.macaddr = macaddr_random();
+               data.random_macaddr = true;
+       }
 
        log(`Preparing interface: ${data.ifname} with MAC: ${data.macaddr}`);
 };
index 2e939852b683fa27d1cbc5ae861ef26fa45cefa4..30d08a301547ffe71794eefc8f3c4884cc1c3a4f 100755 (executable)
@@ -563,6 +563,7 @@ mac80211_hostapd_setup_bss() {
 $hostapd_cfg
 bssid=$macaddr
 ${default_macaddr:+#default_macaddr}
+${random_macaddr:+#random_macaddr}
 ${dtim_period:+dtim_period=$dtim_period}
 ${max_listen_int:+max_listen_interval=$max_listen_int}
 EOF
@@ -691,12 +692,14 @@ mac80211_prepare_vif() {
        json_add_string _ifname "$ifname"
 
        default_macaddr=
+       random_macaddr=
        if [ -z "$macaddr" ]; then
                macaddr="$(mac80211_generate_mac $phy)"
                macidx="$(($macidx + 1))"
                default_macaddr=1
        elif [ "$macaddr" = 'random' ]; then
                macaddr="$(macaddr_random)"
+               random_macaddr=1
        fi
        json_add_string _macaddr "$macaddr"
        json_add_string _default_macaddr "$default_macaddr"
index a28c282493029315cbeeefd5ef9cbe50674a3253..7b3862e0e233a640b2f867b40c6abab8ed620b95 100644 (file)
@@ -574,7 +574,9 @@ function iface_reload_config(name, phydev, config, old_config)
 
                // try to preserve MAC address of this BSS by reassigning another
                // BSS if necessary
-               if (cur_config.default_macaddr &&
+               if ((cur_config.default_macaddr || cur_config.random_macaddr) &&
+                   cur_config.random_macaddr == prev_config.random_macaddr &&
+                   cur_config.default_macaddr == prev_config.default_macaddr &&
                    !macaddr_list[prev_config.bssid]) {
                        macaddr_list[prev_config.bssid] = i;
                        cur_config.bssid = prev_config.bssid;
@@ -918,6 +920,8 @@ function iface_load_config(phy, radio, filename)
        while ((line = rtrim(f.read("line"), "\n")) != null) {
                if (line == "#default_macaddr")
                        bss.default_macaddr = true;
+               if (line == "#random_macaddr")
+                       bss.random_macaddr = true;
 
                let val = split(line, "=", 2);
                if (!val[0])