]> git.ipfire.org Git - thirdparty/openwrt.git/commitdiff
hostapd: ucode: filter MLD loops by phy in phy_set_state/phy_status
authorFelix Fietkau <nbd@nbd.name>
Fri, 10 Jul 2026 12:51:32 +0000 (14:51 +0200)
committerFelix Fietkau <nbd@nbd.name>
Thu, 16 Jul 2026 09:50:22 +0000 (11:50 +0200)
The per-wiphy radio-mask loops iterated all MLDs without checking the phy,
so a stop/start or status query for one wiphy touched MLDs on another wiphy
with the same radio index (clearing present bits, tearing links down, or
reporting a foreign MLD). Skip MLDs that do not belong to the phy, matching
mld_update_phy().

Signed-off-by: Felix Fietkau <nbd@nbd.name>
package/network/services/hostapd/files/wpa_supplicant.uc

index 8cb9df24ab6b2c8f03fbbfbfa6429fe1103e8268..9effed7017a402cce306579cb50df9642d03dfb5 100644 (file)
@@ -552,6 +552,8 @@ let main_obj = {
                                for (let ifname in phy.data)
                                        iface_stop(phy.data[ifname]);
                                for (let name, data in wpas.data.mld) {
+                                       if (data.phy != phy.name)
+                                               continue;
                                        data.radio_mask_present &= ~radio_mask;
                                        if (data.radio_mask_up & radio_mask)
                                                mld_update_iface(name, data);
@@ -561,6 +563,8 @@ let main_obj = {
 
                                let found;
                                for (let name, data in wpas.data.mld) {
+                                       if (data.phy != phy.name)
+                                               continue;
                                        if (!(data.radio_mask & radio_mask))
                                                continue;
                                        data.radio_mask_present |= radio_mask;
@@ -604,9 +608,12 @@ let main_obj = {
 
                        let ifnames = keys(phy.data);
                        let radio_mask = phy.radio != null ? (1 << phy.radio) : 0;
-                       for (let name, data in wpas.data.mld)
+                       for (let name, data in wpas.data.mld) {
+                               if (data.phy != phy.name)
+                                       continue;
                                if (data.radio_mask_up & radio_mask)
                                        push(ifnames, name);
+                       }
 
                        for (let ifname in ifnames) {
                                try {