diff mbox series

[5/6] Decrease cross-threshold roam difficulty

Message ID 20200602001018.83640-5-matthewmwang@chromium.org
State Changes Requested
Headers show
Series [1/6] Use LUT instead of macro | expand

Commit Message

Matthew Wang June 2, 2020, 12:10 a.m. UTC
Decrease the roam difficulty when we roam across the short background
scan threshold (i.e. when the current BSS RSSI is below the threshold
and the selected BSS RSSI is above the threshold). This tends to happen
in normal roaming scenarios when we walk from the domain of one AP to
the domain of the other.

Signed-off-by: Matthew Wang <matthewmwang@chromium.org>
---
 wpa_supplicant/bgscan_simple.c    | 5 ++++-
 wpa_supplicant/events.c           | 6 +++++-
 wpa_supplicant/wpa_supplicant_i.h | 1 +
 3 files changed, 10 insertions(+), 2 deletions(-)
diff mbox series

Patch

diff --git a/wpa_supplicant/bgscan_simple.c b/wpa_supplicant/bgscan_simple.c
index 41a26df0d..740b1f8cf 100644
--- a/wpa_supplicant/bgscan_simple.c
+++ b/wpa_supplicant/bgscan_simple.c
@@ -134,6 +134,7 @@  static void * bgscan_simple_init(struct wpa_supplicant *wpa_s,
 	data->scan_interval = data->short_interval;
 	data->max_short_scans = data->long_interval / data->short_interval + 1;
 	if (data->signal_threshold) {
+		wpa_s->signal_threshold = data->signal_threshold;
 		/* Poll for signal info to set initial scan interval */
 		struct wpa_signal_info siginfo;
 		if (wpa_drv_signal_poll(wpa_s, &siginfo) == 0 &&
@@ -161,8 +162,10 @@  static void bgscan_simple_deinit(void *priv)
 {
 	struct bgscan_simple_data *data = priv;
 	eloop_cancel_timeout(bgscan_simple_timeout, data, NULL);
-	if (data->signal_threshold)
+	if (data->signal_threshold) {
+		data->wpa_s->signal_threshold = 0;
 		wpa_drv_signal_monitor(data->wpa_s, 0, 0);
+	}
 	os_free(data);
 }
 
diff --git a/wpa_supplicant/events.c b/wpa_supplicant/events.c
index 60cbf5a54..f70d84b75 100644
--- a/wpa_supplicant/events.c
+++ b/wpa_supplicant/events.c
@@ -1779,7 +1779,7 @@  int wpa_supplicant_need_to_roam_within_ess(struct wpa_supplicant *wpa_s,
 {
 	int min_diff, diff;
 	int to_2ghz, to_5ghz;
-	int cur_level;
+	int cur_level, sel_level;
 	int adjust = 0;
 	double adjust_factor, est_ratio;
 	unsigned int cur_est, sel_est;
@@ -1878,6 +1878,7 @@  int wpa_supplicant_need_to_roam_within_ess(struct wpa_supplicant *wpa_s,
 	}
 
 	sel_est = selected->est_throughput;
+	sel_level = selected->level;
 	if (cur_est > sel_est) {
 		adjust = 1;
 		est_ratio = sel_est == 0 ? 2 : (double) cur_est / sel_est;
@@ -1894,6 +1895,9 @@  int wpa_supplicant_need_to_roam_within_ess(struct wpa_supplicant *wpa_s,
 		min_diff += 2;
 	else if (to_5ghz)
 		min_diff -= 2;
+	if (wpa_s->signal_threshold && cur_level <= wpa_s->signal_threshold &&
+	    sel_level > wpa_s->signal_threshold)
+		min_diff -= 2;
 	diff = selected->level - cur_level;
 	if (diff < min_diff) {
 		wpa_dbg(wpa_s, MSG_DEBUG,
diff --git a/wpa_supplicant/wpa_supplicant_i.h b/wpa_supplicant/wpa_supplicant_i.h
index e7bc0bc41..ff398888c 100644
--- a/wpa_supplicant/wpa_supplicant_i.h
+++ b/wpa_supplicant/wpa_supplicant_i.h
@@ -988,6 +988,7 @@  struct wpa_supplicant {
 	struct wpa_ssid *bgscan_ssid;
 	const struct bgscan_ops *bgscan;
 	void *bgscan_priv;
+	int signal_threshold;
 
 	const struct autoscan_ops *autoscan;
 	struct wpa_driver_scan_params *autoscan_params;