Commit a77b8552 authored by Johannes Berg's avatar Johannes Berg Committed by John W. Linville

cfg80211/mac80211: fill qual.qual value/adjust max_qual.qual

Due to various bugs in the software stack we end up having
to fill qual.qual; level should be used, but wpa_supplicant
doesn't properly ignore qual.qual, NM should use qual.level
regardless of that because qual.qual is 0 but doesn't handle
IW_QUAL_DBM right now.

So fill qual.qual with the qual.level value clamped to
-110..-40 dBm or just the regular 'unspecified' signal level.
This requires a mac80211 change to properly announce the
max_qual.qual and avg_qual.qual values.
Signed-off-by: default avatarJohannes Berg <johannes@sipsolutions.net>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent cb3a8eec
...@@ -200,10 +200,24 @@ static int ieee80211_ioctl_giwrange(struct net_device *dev, ...@@ -200,10 +200,24 @@ static int ieee80211_ioctl_giwrange(struct net_device *dev,
else else
range->max_qual.noise = 0; range->max_qual.noise = 0;
range->max_qual.qual = 100;
range->max_qual.updated = ieee80211_get_wstats_flags(local); range->max_qual.updated = ieee80211_get_wstats_flags(local);
range->avg_qual.qual = 50; if (local->hw.flags & IEEE80211_HW_SIGNAL_DBM) {
/*
* cfg80211 assumes -110 to -40 dBm and clamps to that range
* for qual.qual, so tell userspace this is what we give it
* but take into account that we have to start from 0.
*/
range->max_qual.qual = 70;
range->avg_qual.qual = 35;
} else {
/*
* cfg80211 just uses the level value for qual too, and it
* requires the level value to be 0 .. 100.
*/
range->max_qual.qual = 100;
range->avg_qual.qual = 50;
}
/* not always true but better than nothing */ /* not always true but better than nothing */
range->avg_qual.level = range->max_qual.level / 2; range->avg_qual.level = range->max_qual.level / 2;
range->avg_qual.noise = range->max_qual.noise / 2; range->avg_qual.noise = range->max_qual.noise / 2;
......
...@@ -614,7 +614,7 @@ ieee80211_bss(struct iw_request_info *info, ...@@ -614,7 +614,7 @@ ieee80211_bss(struct iw_request_info *info,
struct iw_event iwe; struct iw_event iwe;
u8 *buf, *cfg, *p; u8 *buf, *cfg, *p;
u8 *ie = bss->pub.information_elements; u8 *ie = bss->pub.information_elements;
int rem = bss->pub.len_information_elements, i; int rem = bss->pub.len_information_elements, i, sig;
bool ismesh = false; bool ismesh = false;
memset(&iwe, 0, sizeof(iwe)); memset(&iwe, 0, sizeof(iwe));
...@@ -643,14 +643,23 @@ ieee80211_bss(struct iw_request_info *info, ...@@ -643,14 +643,23 @@ ieee80211_bss(struct iw_request_info *info,
iwe.cmd = IWEVQUAL; iwe.cmd = IWEVQUAL;
iwe.u.qual.updated = IW_QUAL_LEVEL_UPDATED | iwe.u.qual.updated = IW_QUAL_LEVEL_UPDATED |
IW_QUAL_NOISE_INVALID | IW_QUAL_NOISE_INVALID |
IW_QUAL_QUAL_INVALID; IW_QUAL_QUAL_UPDATED;
switch (bss->pub.signal_type) { switch (bss->pub.signal_type) {
case CFG80211_SIGNAL_TYPE_MBM: case CFG80211_SIGNAL_TYPE_MBM:
iwe.u.qual.level = bss->pub.signal / 100; sig = bss->pub.signal / 100;
iwe.u.qual.level = sig;
iwe.u.qual.updated |= IW_QUAL_DBM; iwe.u.qual.updated |= IW_QUAL_DBM;
if (sig < -110) /* rather bad */
sig = -110;
else if (sig > -40) /* perfect */
sig = -40;
/* will give a range of 0 .. 70 */
iwe.u.qual.qual = sig + 110;
break; break;
case CFG80211_SIGNAL_TYPE_UNSPEC: case CFG80211_SIGNAL_TYPE_UNSPEC:
iwe.u.qual.level = bss->pub.signal; iwe.u.qual.level = bss->pub.signal;
/* will give range 0 .. 100 */
iwe.u.qual.qual = bss->pub.signal;
break; break;
default: default:
/* not reached */ /* not reached */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment