ifconfig scan displays RSSI (received signal strength indicator) values. If the driver sets ic->ic_max_rssi the value is displayed as a percentage of ic_max_rssi. Otherwise ifconfig displays the value as dBm.
The problem in the dBm case is that many drivers end up reporting a positive value. The range for 802.11 networks is -10dBm to -100dBm (wikipedia has a table at https://en.wikipedia.org/wiki/DBm). In January 2016 sthen@ fixed this problem for some drivers by converting from an unsigned value to a signed value at the ioctl boundary. This approach works for drivers which report values in the (unsigned) range 128 - 255. But there are some drivers which report RSSI values in the 20 to 100 range. These are fixed by the diff below. A few drivers report bogus values altogether, and some always report the same value. I'm not going to bother fixing those. Index: ieee80211_ioctl.c =================================================================== RCS file: /cvs/src/sys/net80211/ieee80211_ioctl.c,v retrieving revision 1.42 diff -u -p -r1.42 ieee80211_ioctl.c --- ieee80211_ioctl.c 15 Aug 2016 22:14:19 -0000 1.42 +++ ieee80211_ioctl.c 30 Aug 2016 15:36:50 -0000 @@ -60,6 +60,8 @@ void ieee80211_node2req(struct ieee80211com *ic, const struct ieee80211_node *ni, struct ieee80211_nodereq *nr) { + uint8_t rssi; + /* Node address and name information */ IEEE80211_ADDR_COPY(nr->nr_macaddr, ni->ni_macaddr); IEEE80211_ADDR_COPY(nr->nr_bssid, ni->ni_bssid); @@ -73,7 +75,19 @@ ieee80211_node2req(struct ieee80211com * bcopy(ni->ni_rates.rs_rates, nr->nr_rates, IEEE80211_RATE_MAXSIZE); /* Node status information */ - nr->nr_rssi = (*ic->ic_node_getrssi)(ic, ni); + rssi = (*ic->ic_node_getrssi)(ic, ni); + if (ic->ic_max_rssi) { + /* Driver reports RSSI relative to ic_max_rssi. */ + nr->nr_rssi = rssi; + } else { + /* + * Driver reports RSSI value in dBm. + * Convert from unsigned to signed. + * Some drivers report a negative value, some don't. + * Reasonable range is -20dBm to -80dBm. + */ + nr->nr_rssi = (rssi < 128) ? -rssi : rssi; + } nr->nr_max_rssi = ic->ic_max_rssi; bcopy(ni->ni_tstamp, nr->nr_tstamp, sizeof(nr->nr_tstamp)); nr->nr_intval = ni->ni_intval;