MLD: Use MLD MAC address for deauthentication

When connecting, pending_bssid is set to the main link that we are
authenticating/associating on. Later on, the MLD MAC address will be
stored in the bssid, but we may also try to deauthenticate before we are
connected and in that case, pending_bssid is not yet set to the MLD MAC
address.

As such, use the ap_mld_addr instead of pending_bssid if n_mld_links is
non-zero. This is the sensible thing to do and expected behavior on
nl80211.

Signed-off-by: Benjamin Berg <benjamin.berg@intel.com>
Signed-off-by: Andrei Otcheretianski <andrei.otcheretianski@intel.com>
This commit is contained in:
Benjamin Berg 2023-11-21 01:51:40 +02:00 committed by Jouni Malinen
parent f60287e6c9
commit b9c81e2005

View file

@ -2667,10 +2667,16 @@ int sme_update_ft_ies(struct wpa_supplicant *wpa_s, const u8 *md,
static void sme_deauth(struct wpa_supplicant *wpa_s, const u8 **link_bssids) static void sme_deauth(struct wpa_supplicant *wpa_s, const u8 **link_bssids)
{ {
int bssid_changed; int bssid_changed;
const u8 *bssid;
bssid_changed = !is_zero_ether_addr(wpa_s->bssid); bssid_changed = !is_zero_ether_addr(wpa_s->bssid);
if (wpa_drv_deauthenticate(wpa_s, wpa_s->pending_bssid, if (wpa_s->valid_links)
bssid = wpa_s->ap_mld_addr;
else
bssid = wpa_s->pending_bssid;
if (wpa_drv_deauthenticate(wpa_s, bssid,
WLAN_REASON_DEAUTH_LEAVING) < 0) { WLAN_REASON_DEAUTH_LEAVING) < 0) {
wpa_msg(wpa_s, MSG_INFO, "SME: Deauth request to the driver " wpa_msg(wpa_s, MSG_INFO, "SME: Deauth request to the driver "
"failed"); "failed");
@ -2706,8 +2712,14 @@ void sme_event_assoc_reject(struct wpa_supplicant *wpa_s,
if (wpa_s->current_bss) { if (wpa_s->current_bss) {
struct wpa_bss *bss = wpa_s->current_bss; struct wpa_bss *bss = wpa_s->current_bss;
struct wpa_ssid *ssid = wpa_s->current_ssid; struct wpa_ssid *ssid = wpa_s->current_ssid;
const u8 *bssid;
wpa_drv_deauthenticate(wpa_s, wpa_s->pending_bssid, if (wpa_s->valid_links)
bssid = wpa_s->ap_mld_addr;
else
bssid = wpa_s->pending_bssid;
wpa_drv_deauthenticate(wpa_s, bssid,
WLAN_REASON_DEAUTH_LEAVING); WLAN_REASON_DEAUTH_LEAVING);
wpas_connect_work_done(wpa_s); wpas_connect_work_done(wpa_s);
wpa_supplicant_mark_disassoc(wpa_s); wpa_supplicant_mark_disassoc(wpa_s);