AP: Do not prune station when adding a link station

As otherwise the original station would be pruned.

Signed-off-by: Ilan Peer <ilan.peer@intel.com>
This commit is contained in:
Ilan Peer 2023-05-22 22:33:51 +03:00 committed by Jouni Malinen
parent 5a61644fff
commit 7a9ae9f43e
4 changed files with 34 additions and 3 deletions

View file

@ -3534,6 +3534,12 @@ void hostapd_new_assoc_sta(struct hostapd_data *hapd, struct sta_info *sta,
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;

View file

@ -723,7 +723,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,
int mld_assoc_link_id);
/* drv_callbacks.c (TODO: move to somewhere else?) */
void hostapd_notify_assoc_fils_finish(struct hostapd_data *hapd,

View file

@ -1299,7 +1299,19 @@ void ap_sta_set_authorized(struct hostapd_data *hapd, struct sta_info *sta,
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;

View file

@ -43,6 +43,7 @@ int hostapd_register_probereq_cb(struct hostapd_data *hapd,
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)
@ -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,
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(