I have noticed that 'wpa_cli scan_results' always reported a signal level of 0 for every bssid found during a scan. I found this a bit odd (especially since ifconfig wlan0 list scan reported good signal level data)
FreeBSD 8.0-RC1 r197417 amd64 Looking at the /usr/src/usr.sbin/wpa/wpa_supplicant/driver_freebsd.c source, I found: in wpa_driver_bsd_get_scan_results() wsr->qual = sr->isr_rssi; wsr->level = 0; /* XXX? */ This hardcodes the signal level to 0, and sets the signal quality to the rssi value. Looking around at the source, it seems that wpa_supplicant does not ever use the quality variable, but instead looks at the level variable in wpa_scan_result_compar (). In an attempt to try to figure out what signal level vs signal quality in wpa_supplicant context means, I found this: http://lists.shmoo.com/pipermail/hostap/2006-December/014831.html, and a feb-2009 change to scan_helpers.c (which drivers_freebsd.c seems to be partially based upon) http://hostap.epitest.fi/gitweb/gitweb.cgi?p=hostap.git;a=commitdiff;h=e1b525c3560614cc56c85b7d060f540900c4da34 So, it seems that some wpa_supplicant drivers use quality, and some use level. Since quality(wsr->qual) does not seem to be used in current wpa_supplicant in freebsd, should it instead look like ?: (attached as an SVN diff with some debug as well) wsr->ssid_len = sr->isr_ssid_len; wsr->freq = sr->isr_freq; wsr->noise = sr->isr_noise; - wsr->qual = sr->isr_rssi; - wsr->level = 0; /* XXX? */ + wsr->qual = 0; /* XXX? */ + wsr->level = sr->isr_rssi; wsr->caps = sr->isr_capinfo; wsr->maxrate = getmaxrate(sr->isr_rates, sr->isr_nrates); vp = ((u_int8_t *)sr) + sr->isr_ie_off; Should we just set qual to 0, or should we set qual to rssi/rssi_max*100 (if we can determine rssi_max for a particular wlan interface) In any case, do you want me to file a PR on this ? --Thanks! ---Dave H
Index: driver_freebsd.c =================================================================== --- driver_freebsd.c (revision 197439) +++ driver_freebsd.c (working copy) @@ -641,6 +641,8 @@ /* use freq for channel preference */ /* all things being equal, use signal level */ + wpa_printf(MSG_DEBUG, "%s: signal levels; %d:#1(wa) %d:#2(wb)", + __func__, wa->level, wb->level); return wb->level - wa->level; } @@ -697,8 +699,8 @@ wsr->ssid_len = sr->isr_ssid_len; wsr->freq = sr->isr_freq; wsr->noise = sr->isr_noise; - wsr->qual = sr->isr_rssi; - wsr->level = 0; /* XXX? */ + wsr->qual = 0; /* XXX? */ + wsr->level = sr->isr_rssi; wsr->caps = sr->isr_capinfo; wsr->maxrate = getmaxrate(sr->isr_rates, sr->isr_nrates); vp = ((u_int8_t *)sr) + sr->isr_ie_off;
_______________________________________________ freebsd-net@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-net To unsubscribe, send any mail to "freebsd-net-unsubscr...@freebsd.org"