Skip roaming based on signal level difference if current SNR is good
If the current SNR with the associated BSS is sufficiently good (better than GREAT_SNR = 25), there is limited benefit from moving to another BSS even if that BSS were to have a higher signal level. As such, skip roaming based on the signal level difference between the selected BSS from scan results and the current BSS for such cases. Signed-off-by: Jouni Malinen <j@w1.fi>
This commit is contained in:
parent
cc7f85ca72
commit
9fafefb9e5
1 changed files with 12 additions and 6 deletions
|
@ -1704,6 +1704,7 @@ static int wpa_supplicant_need_to_roam(struct wpa_supplicant *wpa_s,
|
||||||
int cur_level;
|
int cur_level;
|
||||||
unsigned int cur_est, sel_est;
|
unsigned int cur_est, sel_est;
|
||||||
struct wpa_signal_info si;
|
struct wpa_signal_info si;
|
||||||
|
int cur_snr = 0;
|
||||||
#endif /* CONFIG_NO_ROAMING */
|
#endif /* CONFIG_NO_ROAMING */
|
||||||
|
|
||||||
if (wpa_s->reassociate)
|
if (wpa_s->reassociate)
|
||||||
|
@ -1774,19 +1775,17 @@ static int wpa_supplicant_need_to_roam(struct wpa_supplicant *wpa_s,
|
||||||
*/
|
*/
|
||||||
if (wpa_drv_signal_poll(wpa_s, &si) == 0 &&
|
if (wpa_drv_signal_poll(wpa_s, &si) == 0 &&
|
||||||
(si.avg_beacon_signal || si.avg_signal)) {
|
(si.avg_beacon_signal || si.avg_signal)) {
|
||||||
int snr;
|
|
||||||
|
|
||||||
cur_level = si.avg_beacon_signal ? si.avg_beacon_signal :
|
cur_level = si.avg_beacon_signal ? si.avg_beacon_signal :
|
||||||
si.avg_signal;
|
si.avg_signal;
|
||||||
snr = wpas_get_snr_signal_info(si.frequency, cur_level,
|
cur_snr = wpas_get_snr_signal_info(si.frequency, cur_level,
|
||||||
si.current_noise);
|
si.current_noise);
|
||||||
|
|
||||||
cur_est = wpas_get_est_throughput_from_bss_snr(wpa_s,
|
cur_est = wpas_get_est_throughput_from_bss_snr(wpa_s,
|
||||||
current_bss,
|
current_bss,
|
||||||
snr);
|
cur_snr);
|
||||||
wpa_dbg(wpa_s, MSG_DEBUG,
|
wpa_dbg(wpa_s, MSG_DEBUG,
|
||||||
"Using signal poll values for the current BSS: level=%d snr=%d est_throughput=%u",
|
"Using signal poll values for the current BSS: level=%d snr=%d est_throughput=%u",
|
||||||
cur_level, snr, cur_est);
|
cur_level, cur_snr, cur_est);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (selected->est_throughput > cur_est + 5000) {
|
if (selected->est_throughput > cur_est + 5000) {
|
||||||
|
@ -1809,6 +1808,13 @@ static int wpa_supplicant_need_to_roam(struct wpa_supplicant *wpa_s,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (cur_snr > GREAT_SNR) {
|
||||||
|
wpa_dbg(wpa_s, MSG_DEBUG,
|
||||||
|
"Skip roam - Current BSS has good SNR (%u > %u)",
|
||||||
|
cur_snr, GREAT_SNR);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
sel_est = selected->est_throughput;
|
sel_est = selected->est_throughput;
|
||||||
min_diff = 2;
|
min_diff = 2;
|
||||||
if (cur_level < 0) {
|
if (cur_level < 0) {
|
||||||
|
|
Loading…
Reference in a new issue