Use estimated throughput to improve roaming selection

Previously, within-ESS roaming was skipped if the selected BSS did not
have a higher signal strength than the current BSS regardless of AP
capabilities. This could result in not moving to a BSS that would
provide higher throughput, e.g., due to larger channel bandwidth or
higher rates (HT/VHT MCS).

Use estimated throughput information from scan result processing to
allow within-ESS roaming if the selected BSS is likely to provide better
throughput even if the current BSS has larger RSSI.

Signed-off-by: Jouni Malinen <j@w1.fi>
This commit is contained in:
Jouni Malinen 2015-02-22 11:28:27 +02:00
parent 1d747e2a98
commit 0d2030ee20

View file

@ -1223,10 +1223,14 @@ static int wpa_supplicant_need_to_roam(struct wpa_supplicant *wpa_s,
#ifndef CONFIG_NO_ROAMING #ifndef CONFIG_NO_ROAMING
wpa_dbg(wpa_s, MSG_DEBUG, "Considering within-ESS reassociation"); wpa_dbg(wpa_s, MSG_DEBUG, "Considering within-ESS reassociation");
wpa_dbg(wpa_s, MSG_DEBUG, "Current BSS: " MACSTR " level=%d", wpa_dbg(wpa_s, MSG_DEBUG, "Current BSS: " MACSTR
MAC2STR(current_bss->bssid), current_bss->level); " level=%d snr=%d est_throughput=%u",
wpa_dbg(wpa_s, MSG_DEBUG, "Selected BSS: " MACSTR " level=%d", MAC2STR(current_bss->bssid), current_bss->level,
MAC2STR(selected->bssid), selected->level); current_bss->snr, current_bss->est_throughput);
wpa_dbg(wpa_s, MSG_DEBUG, "Selected BSS: " MACSTR
" level=%d snr=%d est_throughput=%u",
MAC2STR(selected->bssid), selected->level,
selected->snr, selected->est_throughput);
if (wpa_s->current_ssid->bssid_set && if (wpa_s->current_ssid->bssid_set &&
os_memcmp(selected->bssid, wpa_s->current_ssid->bssid, ETH_ALEN) == os_memcmp(selected->bssid, wpa_s->current_ssid->bssid, ETH_ALEN) ==
@ -1236,6 +1240,12 @@ static int wpa_supplicant_need_to_roam(struct wpa_supplicant *wpa_s,
return 1; return 1;
} }
if (selected->est_throughput > current_bss->est_throughput + 5000) {
wpa_dbg(wpa_s, MSG_DEBUG,
"Allow reassociation - selected BSS has better estimated throughput");
return 1;
}
if (current_bss->level < 0 && current_bss->level > selected->level) { if (current_bss->level < 0 && current_bss->level > selected->level) {
wpa_dbg(wpa_s, MSG_DEBUG, "Skip roam - Current BSS has better " wpa_dbg(wpa_s, MSG_DEBUG, "Skip roam - Current BSS has better "
"signal level"); "signal level");