From 4a1cd7f5454e4dc2ec3b53813b32a0141d3aa40f Mon Sep 17 00:00:00 2001 From: Benjamin Berg Date: Tue, 21 Nov 2023 01:51:30 +0200 Subject: [PATCH] nl80211: Report link specific association failures from the kernel If a link specific error occured, mark the offending link within the association parameters. Signed-off-by: Benjamin Berg Signed-off-by: Andrei Otcheretianski --- src/drivers/driver.h | 1 + src/drivers/driver_nl80211.c | 17 ++++++++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/drivers/driver.h b/src/drivers/driver.h index d7f4c599d..d6c490d1c 100644 --- a/src/drivers/driver.h +++ b/src/drivers/driver.h @@ -949,6 +949,7 @@ struct wpa_driver_mld_params { const u8 *bssid; const u8 *ies; size_t ies_len; + int error; } mld_links[MAX_NUM_MLD_LINKS]; }; diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c index 2ff7b52bf..5a4dac7b6 100644 --- a/src/drivers/driver_nl80211.c +++ b/src/drivers/driver_nl80211.c @@ -7260,6 +7260,7 @@ static int wpa_driver_nl80211_associate( { struct i802_bss *bss = priv; struct wpa_driver_nl80211_data *drv = bss->drv; + struct nl80211_err_info err_info; int ret = -1; struct nl_msg *msg; @@ -7319,13 +7320,27 @@ static int wpa_driver_nl80211_associate( } ret = send_and_recv_msgs_connect_handle(drv, msg, drv->first_bss, 1, - NULL); + &err_info); msg = NULL; if (ret) { wpa_dbg(drv->ctx, MSG_DEBUG, "nl80211: MLME command failed (assoc): ret=%d (%s)", ret, strerror(-ret)); nl80211_dump_scan(drv); + + /* Mark failed link within params */ + if (err_info.link_id >= 0) { + if (err_info.link_id >= MAX_NUM_MLD_LINKS || + !(params->mld_params.valid_links & + BIT(err_info.link_id))) { + wpa_printf(MSG_DEBUG, + "nl80211: Invalid errorred link_id %d", + err_info.link_id); + goto fail; + } + params->mld_params.mld_links[err_info.link_id].error = + ret; + } } else { wpa_printf(MSG_DEBUG, "nl80211: Association request send successfully");