wpa_printf(MSG_DEBUG, "MLD: link: status=%u", status);
if (status != WLAN_STATUS_SUCCESS) {
+ wpa_release_link_auth_ref(origin_sta->wpa_sm,
+ hapd->mld_link_id);
if (sta)
ap_free_sta(hapd, sta);
return -1;
#ifdef CONFIG_IEEE80211BE
-void wpa_release_link_auth_ref(struct wpa_state_machine *sm,
- int release_link_id)
+void wpa_release_link_auth_ref(struct wpa_state_machine *sm, u8 link_id)
{
- int link_id;
+ struct wpa_authenticator *wpa_auth;
+ struct mld_link *link;
- if (!sm || release_link_id >= MAX_NUM_MLD_LINKS)
+ if (!sm || link_id >= MAX_NUM_MLD_LINKS)
return;
- for_each_sm_auth(sm, link_id) {
- if (link_id == release_link_id)
- sm->mld_links[link_id].wpa_auth = NULL;
+ link = &sm->mld_links[link_id];
+ if (link->valid) {
+ link->valid = false;
+ wpa_auth = link->wpa_auth;
+ if (wpa_auth) {
+ link->wpa_auth = NULL;
+ wpa_group_put(wpa_auth, wpa_auth->group);
+ }
+ sm->n_mld_affiliated_links--;
}
}
bool mgmt_frame_prot, bool beacon_prot,
bool rekey);
-void wpa_release_link_auth_ref(struct wpa_state_machine *sm,
- int release_link_id);
+void wpa_release_link_auth_ref(struct wpa_state_machine *sm, u8 link_id);
#define for_each_sm_auth(sm, link_id) \
for (link_id = 0; link_id < MAX_NUM_MLD_LINKS; link_id++) \