As otherwise the original station would be pruned.
Signed-off-by: Ilan Peer <ilan.peer@intel.com>
return;
}
+#ifdef CONFIG_IEEE80211BE
+ if (hapd->conf->mld_ap && sta->mld_info.mld_sta &&
+ sta->mld_assoc_link_id != hapd->mld_link_id)
+ return;
+#endif /* CONFIG_IEEE80211BE */
+
ap_sta_clear_disconnect_timeouts(hapd, sta);
sta->post_csa_sa_query = 0;
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,
+ int mld_assoc_link_id);
/* drv_callbacks.c (TODO: move to somewhere else?) */
void hostapd_notify_assoc_fils_finish(struct hostapd_data *hapd,
return;
if (authorized) {
- hostapd_prune_associations(hapd, sta->addr);
+ int mld_assoc_link_id = -1;
+
+#ifdef CONFIG_IEEE80211BE
+ if (hapd->conf->mld_ap && sta->mld_info.mld_sta) {
+ if (sta->mld_assoc_link_id == hapd->mld_link_id)
+ mld_assoc_link_id = sta->mld_assoc_link_id;
+ else
+ mld_assoc_link_id = -2;
+ }
+#endif /* CONFIG_IEEE80211BE */
+ if (mld_assoc_link_id != -2)
+ hostapd_prune_associations(hapd, sta->addr,
+ mld_assoc_link_id);
sta->flags |= WLAN_STA_AUTHORIZED;
} else {
sta->flags &= ~WLAN_STA_AUTHORIZED;
struct prune_data {
struct hostapd_data *hapd;
const u8 *addr;
+ int mld_assoc_link_id;
};
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);
* 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,
+ int 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(