diff mbox series

[5/6] AP: Remove link stations on a new station authentication

Message ID 20231225174303.4066419-5-andrei.otcheretianski@intel.com
State Accepted
Headers show
Series [1/6] AP: Unify code handling deauthentication/disassociation | expand

Commit Message

Andrei Otcheretianski Dec. 25, 2023, 5:43 p.m. UTC
From: Ilan Peer <ilan.peer@intel.com>

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@intel.com>
Signed-off-by: Andrei Otcheretianski <andrei.otcheretianski@intel.com>
---
 src/ap/sta_info.c | 36 ++++++++++++++++++++++++++++++++++++
 1 file changed, 36 insertions(+)
diff mbox series

Patch

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);