On Fri, Jan 09, 2015 at 03:52:44PM +0000, Stuart Henderson wrote:
> This has been bugging me for ages but I forgot about it for quite a
> while (mostly because iwn scanning was broken on my laptop for ages).
> RSSI is a signed value, but various places are storing it unsigned,
> in particular ifconfig prints it that way (so the displayed strength
> is unfeasibly large; realistic values are maybe -40 [very strong
> signal] to -90 or so).
> 
> Diff below fixes things for ifconfig and doesn't affect things used
> in other places in the kernel. Sample output from iwn scan below (and
> the values are sensible).
> 
> OK?

OK. This aligns ifconfig output with what my wifi textbook says about
dBm and rssi. Before this diff ifconfig reported 196dB for some wifi
networks around here which (if I got the math right) corresponds to
60000000000000000 Watts of tx power which, hmm, exceeds regulatory limits.

Can you switch "dB" to "dBm" as well?

> 
>               nwid Y2 chan 104 bssid 04:4f:f5:0c:a7:ec -52dB 54M 
> privacy,spectrum_mgmt,short_slottime,wpa2 
>               nwid Y2-x chan 5 bssid 04:4f:f5:4c:a7:e8 -53dB 54M 
> privacy,short_preamble,short_slottime,wpa2,802.1x 
>               nwid BTHub3-MM9S chan 6 bssid 00:81:d8:1a:c5:22 -78dB 54M 
> privacy,short_preamble,short_slottime,wpa2 
>               nwid BTHub3-C2KT chan 11 bssid 40:4d:8e:51:3f:b9 -83dB 54M 
> privacy,short_slottime,wpa2 
>               nwid Laboratory chan 2 bssid 78:54:2e:8a:c9:7a -89dB 54M 
> privacy,short_slottime,wpa2 
> 
> There are various other rssi values (variables and returned by
> functions) which also use u_int8_t - ni_rssi, ic_max_rssi,
> ic_node_getrssi(), and some in rateadapt - as well as rxi_rssi which
> was already signed (and is copied to various unsigned variables).
> These seem more risky to change (or at least more complicated)
> so I haven't touched them here, but I wonder, does anyone have a
> handle on what's going on with these?
> 
> Index: sys/net80211/ieee80211_ioctl.h
> ===================================================================
> RCS file: /cvs/src/sys/net80211/ieee80211_ioctl.h,v
> retrieving revision 1.20
> diff -u -p -r1.20 ieee80211_ioctl.h
> --- sys/net80211/ieee80211_ioctl.h    24 Aug 2014 18:01:27 -0000      1.20
> +++ sys/net80211/ieee80211_ioctl.h    9 Jan 2015 15:27:10 -0000
> @@ -295,8 +295,8 @@ struct ieee80211_nodereq {
>       u_int8_t        nr_rates[IEEE80211_RATE_MAXSIZE];       /* rate set */
>  
>       /* Node status information */
> -     u_int8_t        nr_rssi;        /* received signal strength */
> -     u_int8_t        nr_max_rssi;    /* maximum rssi */
> +     int8_t          nr_rssi;        /* received signal strength */
> +     int8_t          nr_max_rssi;    /* maximum rssi */
>       u_int8_t        nr_tstamp[8];   /* from last received beacon */
>       u_int16_t       nr_intval;      /* beacon interval */
>       u_int16_t       nr_capinfo;     /* capabilities */
> Index: sbin/ifconfig/ifconfig.c
> ===================================================================
> RCS file: /cvs/src/sbin/ifconfig/ifconfig.c,v
> retrieving revision 1.293
> diff -u -p -r1.293 ifconfig.c
> --- sbin/ifconfig/ifconfig.c  6 Jan 2015 21:26:46 -0000       1.293
> +++ sbin/ifconfig/ifconfig.c  9 Jan 2015 15:27:10 -0000
> @@ -2087,7 +2087,7 @@ ieee80211_status(void)
>                       if (nr.nr_max_rssi)
>                               printf(" %u%%", IEEE80211_NODEREQ_RSSI(&nr));
>                       else
> -                             printf(" %udB", nr.nr_rssi);
> +                             printf(" %ddB", nr.nr_rssi);
>               }
>       }
>  
> @@ -2318,7 +2318,7 @@ ieee80211_printnode(struct ieee80211_nod
>       if (nr->nr_max_rssi)
>               printf("%u%% ", IEEE80211_NODEREQ_RSSI(nr));
>       else
> -             printf("%udB ", nr->nr_rssi);
> +             printf("%ddB ", nr->nr_rssi);
>  
>       if (nr->nr_pwrsave)
>               printf("powersave ");

Reply via email to