diff mbox series

events: Use the link BSSID to resolve current BSS

Message ID 20231213123741.296634-1-andrei.otcheretianski@intel.com
State Accepted
Headers show
Series events: Use the link BSSID to resolve current BSS | expand

Commit Message

Otcheretianski, Andrei Dec. 13, 2023, 12:37 p.m. UTC
From: Benjamin Berg <benjamin.berg@intel.com>

Otherwise any new scan result (even manual ones if they do not set
use_id=X to a non-zero value), can cause a reconnect to the same BSS.
This is because the current BSS is not detected by
wpa_supplicant_need_to_roam and it assumes that roaming is needed.

Signed-off-by: Benjamin Berg <benjamin.berg@intel.com>
Signed-off-by: Andrei Otcheretianski <andrei.otcheretianski@intel.com>
---
 wpa_supplicant/events.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

Comments

Jouni Malinen Dec. 16, 2023, 6:50 p.m. UTC | #1
On Wed, Dec 13, 2023 at 02:37:40PM +0200, Andrei Otcheretianski wrote:
> Otherwise any new scan result (even manual ones if they do not set
> use_id=X to a non-zero value), can cause a reconnect to the same BSS.
> This is because the current BSS is not detected by
> wpa_supplicant_need_to_roam and it assumes that roaming is needed.

Thanks, applied.
diff mbox series

Patch

diff --git a/wpa_supplicant/events.c b/wpa_supplicant/events.c
index 4644f54888..7d035e85fc 100644
--- a/wpa_supplicant/events.c
+++ b/wpa_supplicant/events.c
@@ -2304,6 +2304,7 @@  static int wpa_supplicant_need_to_roam(struct wpa_supplicant *wpa_s,
 				       struct wpa_ssid *ssid)
 {
 	struct wpa_bss *current_bss = NULL;
+	u8 *bssid;
 
 	if (wpa_s->reassociate)
 		return 1; /* explicit request to reassociate */
@@ -2317,12 +2318,17 @@  static int wpa_supplicant_need_to_roam(struct wpa_supplicant *wpa_s,
 	if (wpas_driver_bss_selection(wpa_s))
 		return 0; /* Driver-based roaming */
 
+	if (wpa_s->valid_links)
+		bssid = wpa_s->links[wpa_s->mlo_assoc_link_id].bssid;
+	else
+		bssid = wpa_s->bssid;
+
 	if (wpa_s->current_ssid->ssid)
-		current_bss = wpa_bss_get(wpa_s, wpa_s->bssid,
+		current_bss = wpa_bss_get(wpa_s, bssid,
 					  wpa_s->current_ssid->ssid,
 					  wpa_s->current_ssid->ssid_len);
 	if (!current_bss)
-		current_bss = wpa_bss_get_bssid(wpa_s, wpa_s->bssid);
+		current_bss = wpa_bss_get_bssid(wpa_s, bssid);
 
 	if (!current_bss)
 		return 1; /* current BSS not seen in scan results */