[PATCH 28/50] AP: Do not prune station when adding a link station
Andrei Otcheretianski
andrei.otcheretianski at intel.com
Wed Feb 15 15:08:42 PST 2023
From: Ilan Peer <ilan.peer at intel.com>
As otherwise the original station would be pruned.
Signed-off-by: Ilan Peer <ilan.peer at intel.com>
---
src/ap/hostapd.c | 12 +++++++++++-
src/ap/hostapd.h | 3 ++-
src/ap/utils.c | 14 +++++++++++++-
3 files changed, 26 insertions(+), 3 deletions(-)
diff --git a/src/ap/hostapd.c b/src/ap/hostapd.c
index a47acd2506..e9902639f0 100644
--- a/src/ap/hostapd.c
+++ b/src/ap/hostapd.c
@@ -3358,13 +3358,23 @@ int hostapd_remove_iface(struct hapd_interfaces *interfaces, char *buf)
void hostapd_new_assoc_sta(struct hostapd_data *hapd, struct sta_info *sta,
int reassoc)
{
+ s8 mld_assoc_link_id = -1;
+
if (hapd->tkip_countermeasures) {
hostapd_drv_sta_deauth(hapd, sta->addr,
WLAN_REASON_MICHAEL_MIC_FAILURE);
return;
}
- hostapd_prune_associations(hapd, sta->addr);
+#ifdef CONFIG_IEEE80211BE
+ if (hapd->conf->mld_ap && sta->mld_info.mld_sta) {
+ mld_assoc_link_id = sta->mld_assoc_link_id;
+ if (sta->mld_assoc_link_id != hapd->conf->mld_link_id)
+ return;
+ }
+#endif /* CONFIG_IEEE80211BE */
+
+ hostapd_prune_associations(hapd, sta->addr, mld_assoc_link_id);
ap_sta_clear_disconnect_timeouts(hapd, sta);
sta->post_csa_sa_query = 0;
diff --git a/src/ap/hostapd.h b/src/ap/hostapd.h
index 6c0cece36e..3f03b6d91a 100644
--- a/src/ap/hostapd.h
+++ b/src/ap/hostapd.h
@@ -712,7 +712,8 @@ int hostapd_register_probereq_cb(struct hostapd_data *hapd,
const u8 *ie, size_t ie_len,
int ssi_signal),
void *ctx);
-void hostapd_prune_associations(struct hostapd_data *hapd, const u8 *addr);
+void hostapd_prune_associations(struct hostapd_data *hapd, const u8 *addr,
+ s8 mld_assoc_link_id);
/* drv_callbacks.c (TODO: move to somewhere else?) */
void hostapd_notify_assoc_fils_finish(struct hostapd_data *hapd,
diff --git a/src/ap/utils.c b/src/ap/utils.c
index bedad6eb02..1c42506a9b 100644
--- a/src/ap/utils.c
+++ b/src/ap/utils.c
@@ -43,6 +43,7 @@ int hostapd_register_probereq_cb(struct hostapd_data *hapd,
struct prune_data {
struct hostapd_data *hapd;
const u8 *addr;
+ s8 mld_assoc_link_id;
};
static int prune_associations(struct hostapd_iface *iface, void *ctx)
@@ -72,6 +73,12 @@ static int prune_associations(struct hostapd_iface *iface, void *ctx)
if (!osta)
continue;
+#ifdef CONFIG_IEEE80211BE
+ if (data->mld_assoc_link_id >= 0 &&
+ osta->mld_assoc_link_id == data->mld_assoc_link_id)
+ continue;
+#endif /* CONFIG_IEEE80211BE */
+
wpa_printf(MSG_INFO, "%s: Prune association for " MACSTR,
ohapd->conf->iface, MAC2STR(osta->addr));
ap_sta_disassociate(ohapd, osta, WLAN_REASON_UNSPECIFIED);
@@ -84,15 +91,20 @@ static int prune_associations(struct hostapd_iface *iface, void *ctx)
* hostapd_prune_associations - Remove extraneous associations
* @hapd: Pointer to BSS data for the most recent association
* @addr: Associated STA address
+ * @mld_assoc_link_id: MLD link id used for association or -1 for non MLO
*
* This function looks through all radios and BSS's for previous
* (stale) associations of STA. If any are found they are removed.
*/
-void hostapd_prune_associations(struct hostapd_data *hapd, const u8 *addr)
+void hostapd_prune_associations(struct hostapd_data *hapd, const u8 *addr,
+ s8 mld_assoc_link_id)
{
struct prune_data data;
+
data.hapd = hapd;
data.addr = addr;
+ data.mld_assoc_link_id = mld_assoc_link_id;
+
if (hapd->iface->interfaces &&
hapd->iface->interfaces->for_each_interface)
hapd->iface->interfaces->for_each_interface(
--
2.38.1
More information about the Hostap
mailing list