3
0
mirror of https://git.kernel.org/pub/scm/network/wireless/iwd.git synced 2025-09-16 12:27:27 +02:00

station: get neighbor report on BSS TM request

If a BSS is requesting IWD roam elsewhere but does not include a
preferred candidate list try getting a neighbor report before doing
a full scan.

If the limited scan based on the candidate list comes up empty this
would previously result in IWD giving up on the AP roam entirely.
This patch also improves that behavior slightly by doing a full
scan afterwards as a last ditch effort. If no BSS's are found after
that, IWD will give up on the AP roam.
This commit is contained in:
James Prestwood 2025-08-27 05:54:58 -07:00 committed by Denis Kenzior
parent cee079da5b
commit c0efaf21ad

View File

@ -2440,8 +2440,16 @@ static void station_roam_failed(struct station *station)
* We were told by the AP to roam, but failed. Try ourselves or
* wait for the AP to tell us to roam again
*/
if (station->ap_directed_roaming)
if (station->ap_directed_roaming) {
/*
* The candidate list from the AP (or neighbor report) found
* no BSS's. Force a full scan
*/
if (!station->roam_scan_full)
goto full_scan;
goto delayed_retry;
}
/*
* If we tried a limited scan, failed and the signal is still low,
@ -2453,6 +2461,7 @@ static void station_roam_failed(struct station *station)
* the scan here, so that the destroy callback is not called
* after the return of this function
*/
full_scan:
scan_cancel(netdev_get_wdev_id(station->netdev),
station->roam_scan_id);
@ -3045,6 +3054,7 @@ static int station_roam_scan(struct station *station,
if (!freq_set) {
station->roam_scan_full = true;
params.freqs = allowed;
station_debug_event(station, "full-roam-scan");
} else
scan_freq_set_constrain(freq_set, allowed);
@ -3378,7 +3388,15 @@ static void station_ap_directed_roam(struct station *station,
station_neighbor_report_cb(station->netdev, 0, body + pos,
body_len - pos, station);
} else {
l_debug("roam: AP did not include a preferred candidate list");
if (station->connected_bss->cap_rm_neighbor_report) {
if (!netdev_neighbor_report_req(station->netdev,
station_neighbor_report_cb))
return;
l_warn("failed to request neighbor report!");
}
l_debug("full scan after BSS transition request");
if (station_roam_scan(station, NULL) < 0)
station_roam_failed(station);
}