[PATCH] wpa_supplicant: use signal quality if level is not available for comparing max rates

Helmut Schaa helmut.schaa
Tue Jan 27 07:16:11 PST 2009

Some drivers (for example ipw2100) do not report signal level but only
signal quality. wpa_supplicant already uses the signal quality if no level
is reported and all other comparision parameters are equal to sort the scan
results. However, if two APs have different max rates and the signal level
does not differ much wpa_supplicant chooses the AP with the higher max rate.

In case of ipw2100 no signal level is reported and thus wpa_supplicant ever
takes the AP with higher max rate even if its signal quality is really low.
For example if AP1 (max rate 11Mb/s, 80% signal quality) and AP2 (max rate
54Mb/s, 20% signal quality) are found by a scan wpa_supplicant would choose

Hence, if no signal level is reported depend on the signal quality if max
rate should be compared. A quality difference of 10% is considered
acceptable in favour of the higher max rate.

Signed-off-by: Helmut Schaa <helmut.schaa at googlemail.com>

diff --git a/src/drivers/scan_helpers.c b/src/drivers/scan_helpers.c
index 72e360f..5047214 100644
--- a/src/drivers/scan_helpers.c
+++ b/src/drivers/scan_helpers.c
@@ -156,10 +156,13 @@ static int wpa_scan_result_compar(const void *a, const void *b)
 		return -1;
 	/* best/max rate preferred if signal level close enough XXX */
-	maxrate_a = wpa_scan_get_max_rate(wa);
-	maxrate_b = wpa_scan_get_max_rate(wb);
-	if (maxrate_a != maxrate_b && abs(wb->level - wa->level) < 5)
-		return maxrate_b - maxrate_a;
+	if ( (wb->level != 0 && wa->level != 0 && abs(wb->level - wa->level) < 5) ||
+	     (abs(wb->qual - wa->qual) < 10) ) {
+		maxrate_a = wpa_scan_get_max_rate(wa);
+		maxrate_b = wpa_scan_get_max_rate(wb);
+		if (maxrate_a != maxrate_b)
+			return maxrate_b - maxrate_a;
+	}
 	/* use freq for channel preference */

More information about the Hostap mailing list