wpa_supplicant roaming algorithm

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Greetings,

The current roaming algorithm appears incorrect.  I would like your
opinion on the following proposed change.  I understand the patch is
for the 2.6 release.  I checked the master branch the RSSI roaming
criteria are still the same.  Will update the patch for the master
branch once I hear your opinion.

There are roaming gaps, identified for specific current signal levels.
In these gaps, no roaming occurs.  However, outside of these gaps
which include worse selected signals roaming occurs.

Also, I don't believe the operating condition current_bss->level > 0
is physically possible.

All values in the tables are in dBm.

Proposed alternative:
=====================
(standard)
----------
      Current Level < -85      selected - current >= 1   min_diff = 1
-85 < Current Level < -80      selected - current >= 2   min_diff = 2
-80 < Current Level < -75      selected - current >= 3   min_diff = 3
-75 < Current Level < -70      selected - current >= 4   min_diff = 4
      Current Level > -70      selected - current >= 5   min_diff = 5

2.4 to 5.0 GHz
--------------
      Current Level < -85      selected - current >= -2   min_diff = -2
-85 < Current Level < -80      selected - current >= -2   min_diff = -2
-80 < Current Level < -75      selected - current >=  1   min_diff =  1
-75 < Current Level < -70      selected - current >=  2   min_diff =  2
      Current Level > -70      selected - current >=  3   min_diff =  3

Current implementation
======================
(standard)
----------
      Current Level < -85      selected - current >= 1   min_diff = 1
-85 < Current Level < -80      selected - current >= 2   min_diff = 2
-80 < Current Level < -75      selected - current >= 3   min_diff = 3
-75 < Current Level < -70      selected - current >= 4   min_diff = 4
-70 < Current Level <   0      selected - current >= 5   min_diff = 5
      Current Level > 0        selected - current >= 2   min_diff = 2
(Roaming gap < -2, > 2)

2.4 to 5.0 GHz
--------------
      Current Level < -85      selected - current >= -2   min_diff = 0
-85 < Current Level < -80      selected - current >= -2   min_diff = 0
-80 < Current Level < -75      selected - current >=  1   min_diff = 1
 (Roaming gap -2,-1, > 1)
-75 < Current Level < -70      selected - current >=  2   min_diff = 2
 (Roaming gap -2,-1, > 2)
-70 < Current Level <   0      selected - current >=  3   min_diff = 3
      Current Level > 0        selected - current >= any   min_diff = 0

Regards,
From 0f6f3d777ae2a8712ff4374cd482fe1c99a66fee Mon Sep 17 00:00:00 2001
From: Iyad Qumei <iyad.qumei@xxxxxxxxxxx>
Date: Wed, 1 Aug 2018 12:24:07 -0700
Subject: [PATCH] wpa: fix roaming algorithm

The current roaming algorithm is incorrect.  There are roaming gaps,
identified for specific current signal levels.  In these gaps no roaming
occurs.  However, outside of these gaps which include worse selected
signals roaming occurs.

All values in the tables are in dBm.

Proposed alternative:
=====================
(standard)
----------
      Current Level < -85      selected - current >= 1   min_diff = 1
-85 < Current Level < -80      selected - current >= 2   min_diff = 2
-80 < Current Level < -75      selected - current >= 3   min_diff = 3
-75 < Current Level < -70      selected - current >= 4   min_diff = 4
      Current Level > -70      selected - current >= 5   min_diff = 5

2.4 to 5.0 GHz
--------------
      Current Level < -85      selected - current >= -2   min_diff = -2
-85 < Current Level < -80      selected - current >= -2   min_diff = -2
-80 < Current Level < -75      selected - current >=  1   min_diff =  1
-75 < Current Level < -70      selected - current >=  2   min_diff =  2
      Current Level > -70      selected - current >=  3   min_diff =  3

Current implementation
======================
(standard)
----------
      Current Level < -85      selected - current >= 1   min_diff = 1
-85 < Current Level < -80      selected - current >= 2   min_diff = 2
-80 < Current Level < -75      selected - current >= 3   min_diff = 3
-75 < Current Level < -70      selected - current >= 4   min_diff = 4
-70 < Current Level <   0      selected - current >= 5   min_diff = 5
      Current Level > 0        selected - current >= 2   min_diff = 2  (Roaming gap < -2, > 2)

2.4 to 5.0 GHz
--------------
      Current Level < -85      selected - current >= -2   min_diff = 0
-85 < Current Level < -80      selected - current >= -2   min_diff = 0
-80 < Current Level < -75      selected - current >=  1   min_diff = 1  (Roaming gap -2,-1, > 1)
-75 < Current Level < -70      selected - current >=  2   min_diff = 2  (Roaming gap -2,-1, > 2)
-70 < Current Level <   0      selected - current >=  3   min_diff = 3
      Current Level > 0        selected - current >= any   min_diff = 0
---
 .pc/applied-patches     |  1 +
 wpa_supplicant/events.c | 27 +++++++++++++--------------
 2 files changed, 14 insertions(+), 14 deletions(-)

diff --git a/.pc/applied-patches b/.pc/applied-patches
index e5913f2..72f582c 100644
--- a/.pc/applied-patches
+++ b/.pc/applied-patches
@@ -2,3 +2,4 @@ key-replay-cve-multiple.patch
 allow-wpa-cli-with-dbus.patch
 wpa_supplicant_ap_selection.patch
 wpa-ptk-error-code.patch
+wpa-correct-roaming-algorithm.patch
diff --git a/wpa_supplicant/events.c b/wpa_supplicant/events.c
index 41057cc..962d81f 100644
--- a/wpa_supplicant/events.c
+++ b/wpa_supplicant/events.c
@@ -1470,26 +1470,25 @@ static int wpa_supplicant_need_to_roam(struct wpa_supplicant *wpa_s,
 	}
 
 	min_diff = 2;
-	if (current_bss->level < 0) {
-		if (current_bss->level < -85)
-			min_diff = 1;
-		else if (current_bss->level < -80)
-			min_diff = 2;
-		else if (current_bss->level < -75)
-			min_diff = 3;
-		else if (current_bss->level < -70)
-			min_diff = 4;
-		else
-			min_diff = 5;
-	}
+        if (current_bss->level < -85)
+                min_diff = 1;
+        else if (current_bss->level < -80)
+                min_diff = 2;
+        else if (current_bss->level < -75)
+                min_diff = 3;
+        else if (current_bss->level < -70)
+                min_diff = 4;
+        else
+                min_diff = 5;
+
 	if (to_5ghz) {
 		/* Make it easier to move to 5 GHz band */
 		if (min_diff > 2)
 			min_diff -= 2;
 		else
-			min_diff = 0;
+			min_diff = -2;
 	}
-	if (abs(current_bss->level - selected->level) < min_diff) {
+	if ((selected->level -current_bss->level) < min_diff) {
 		wpa_dbg(wpa_s, MSG_INFO, "Skip roam - too small difference "
 			"in signal level");
 		return 0;
-- 
2.7.4

_______________________________________________
Hostap mailing list
Hostap@xxxxxxxxxxxxxxxxxxx
http://lists.infradead.org/mailman/listinfo/hostap

[Index of Archives]     [Linux Wireless]     [Linux Kernel]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Device Mapper]

  Powered by Linux