From: Felix Fietkau Date: Fri, 10 Jul 2026 12:51:32 +0000 (+0200) Subject: hostapd: ucode: filter MLD loops by phy in phy_set_state/phy_status X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=26a4d5080669d5196e406541d7ac6c2d4d0a5044;p=thirdparty%2Fopenwrt.git hostapd: ucode: filter MLD loops by phy in phy_set_state/phy_status 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 --- diff --git a/package/network/services/hostapd/files/wpa_supplicant.uc b/package/network/services/hostapd/files/wpa_supplicant.uc index 8cb9df24ab6..9effed7017a 100644 --- a/package/network/services/hostapd/files/wpa_supplicant.uc +++ b/package/network/services/hostapd/files/wpa_supplicant.uc @@ -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 {