From: Ilan Peer <ilan.peer@xxxxxxxxx> When a station tries to authenticate to an AP that hosts a MLD AP, need to remove all station instances from all APs. Signed-off-by: Ilan Peer <ilan.peer@xxxxxxxxx> Signed-off-by: Andrei Otcheretianski <andrei.otcheretianski@xxxxxxxxx> --- src/ap/sta_info.c | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/src/ap/sta_info.c b/src/ap/sta_info.c index db2e8ca26c..b224ef955a 100644 --- a/src/ap/sta_info.c +++ b/src/ap/sta_info.c @@ -1715,6 +1715,35 @@ int ap_sta_pending_delayed_1x_auth_fail_disconnect(struct hostapd_data *hapd, } +#ifdef CONFIG_IEEE80211BE +static void ap_sta_remove_link_sta(struct hostapd_data *hapd, + struct sta_info *sta) +{ + struct hostapd_data *tmp_hapd; + unsigned int i, j; + + for_each_mld_link(tmp_hapd, i, j, hapd->iface->interfaces, + hapd->conf->mld_id) { + struct sta_info *tmp_sta; + + if (hapd == tmp_hapd) + continue; + + for (tmp_sta = tmp_hapd->sta_list; tmp_sta; + tmp_sta = tmp_sta->next) { + if (tmp_sta == sta || + os_memcmp(tmp_sta->addr, sta->addr, + ETH_ALEN)) + continue; + + ap_free_sta(tmp_hapd, tmp_sta); + break; + } + } +} +#endif /* CONFIG_IEEE80211BE */ + + int ap_sta_re_add(struct hostapd_data *hapd, struct sta_info *sta) { const u8 *mld_link_addr = NULL; @@ -1734,7 +1763,14 @@ int ap_sta_re_add(struct hostapd_data *hapd, struct sta_info *sta) mld_link_sta = sta->mld_assoc_link_id != mld_link_id; mld_link_addr = sta->mld_info.links[mld_link_id].peer_addr; + + /* + * In case the AP hosts an MLD AP, need to remove the station + * from all relevant links/APs. + */ + ap_sta_remove_link_sta(hapd, sta); } + #endif /* CONFIG_IEEE80211BE */ ap_sta_set_authorized(hapd, sta, 0); -- 2.43.0 _______________________________________________ Hostap mailing list Hostap@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/hostap