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 <nbd@nbd.name>
This commit is contained in:
Felix Fietkau
2026-07-16 11:50:22 +02:00
parent 73c35f97f3
commit 26a4d50806
@@ -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 {