hostapd_event_color_change(hapd, true);
break;
#endif /* CONFIG_IEEE80211AX */
+#ifdef CONFIG_IEEE80211BE
+ case EVENT_MLD_INTERFACE_FREED:
+ wpa_printf(MSG_DEBUG, "MLD: Interface %s freed",
+ hapd->conf->iface);
+ hostapd_mld_interface_freed(hapd);
+ break;
+#endif /* CONFIG_IEEE80211BE */
default:
wpa_printf(MSG_DEBUG, "Unknown event %d", event);
break;
driver->is_drv_shared &&
!driver->is_drv_shared(drv_priv, iface->bss[0])) {
driver->hapd_deinit(drv_priv);
+ hostapd_mld_interface_freed(iface->bss[0]);
} else if (hostapd_if_link_remove(iface->bss[0],
WPA_IF_AP_BSS,
iface->bss[0]->conf->iface,
return mld->fbss;
}
+
+void hostapd_mld_interface_freed(struct hostapd_data *hapd)
+{
+ struct hostapd_data *link_bss = NULL;
+
+ if (!hapd || !hapd->conf->mld_ap)
+ return;
+
+ for_each_mld_link(link_bss, hapd)
+ link_bss->drv_priv = NULL;
+}
+
#endif /* CONFIG_IEEE80211BE */
#ifdef CONFIG_IEEE80211BE
bool hostapd_mld_is_first_bss(struct hostapd_data *hapd);
+void hostapd_mld_interface_freed(struct hostapd_data *hapd);
#define for_each_mld_link(partner, self) \
dl_list_for_each(partner, &self->mld->links, struct hostapd_data, link)
* EVENT_LINK_RECONFIG - Notification that AP links removed
*/
EVENT_LINK_RECONFIG,
+
+ /**
+ * EVENT_MLD_INTERFACE_FREED - Notification of AP MLD interface removal
+ */
+ EVENT_MLD_INTERFACE_FREED,
};
E2S(LINK_CH_SWITCH_STARTED);
E2S(TID_LINK_MAP);
E2S(LINK_RECONFIG);
+ E2S(MLD_INTERFACE_FREED);
}
return "UNKNOWN";
{
struct i802_bss *bss = priv;
struct wpa_driver_nl80211_data *drv = bss->drv;
+ int ret;
if (type != WPA_IF_AP_BSS ||
!nl80211_link_valid(bss->valid_links, link_id))
if (!bss->valid_links) {
wpa_printf(MSG_DEBUG,
"nl80211: No more links remaining, so remove interface");
- return wpa_driver_nl80211_if_remove(bss, type, ifname);
+ ret = wpa_driver_nl80211_if_remove(bss, type, ifname);
+ if (ret)
+ return ret;
+
+ /* Notify that the MLD interface is removed */
+ wpa_supplicant_event(bss->ctx, EVENT_MLD_INTERFACE_FREED, NULL);
}
return 0;