mirror of
https://git.kernel.org/pub/scm/network/wireless/iwd.git
synced 2024-11-20 04:19:25 +01:00
scan: parse BSS_SIGNAL_UNSPEC, fix potential zero signal
A select few drivers send this instead of SIGNAL_MBM. The docs say this value is the signal 'in unspecified units, scaled to 0..100'. The range for SIGNAL_MBM is -10000..0 so this can be scaled to the MBM range easy enough... Now, this isn't exactly correct because this value ultimately gets returned from GetOrderedNetworks() and is documented as 100 * dBm where in reality its just a unit-less signal strength value. Its not ideal, but this patch at least will fix BSS ranking for these few drivers.
This commit is contained in:
parent
1284a6ca9f
commit
6ff99f1766
23
src/scan.c
23
src/scan.c
@ -1372,6 +1372,22 @@ static bool scan_parse_bss_information_elements(struct scan_bss *bss,
|
|||||||
return have_ssid;
|
return have_ssid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Maps 0..100 values to -10000..0
|
||||||
|
*
|
||||||
|
* This isn't really mapping to mBm since the input is unit-less and we have no
|
||||||
|
* idea what the driver itself does to come up with this 'strength' value but
|
||||||
|
* this is really the best that can be done for these drivers (its only 4 in
|
||||||
|
* tree drivers after all).
|
||||||
|
*/
|
||||||
|
static int32_t signal_unspec_to_mbm(uint8_t strength)
|
||||||
|
{
|
||||||
|
if (L_WARN_ON(strength > 100))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return ((int32_t)strength * 100) - 10000;
|
||||||
|
}
|
||||||
|
|
||||||
static struct scan_bss *scan_parse_attr_bss(struct l_genl_attr *attr,
|
static struct scan_bss *scan_parse_attr_bss(struct l_genl_attr *attr,
|
||||||
struct wiphy *wiphy,
|
struct wiphy *wiphy,
|
||||||
uint32_t *out_seen_ms_ago)
|
uint32_t *out_seen_ms_ago)
|
||||||
@ -1414,6 +1430,13 @@ static struct scan_bss *scan_parse_attr_bss(struct l_genl_attr *attr,
|
|||||||
|
|
||||||
bss->signal_strength = *((int32_t *) data);
|
bss->signal_strength = *((int32_t *) data);
|
||||||
break;
|
break;
|
||||||
|
case NL80211_BSS_SIGNAL_UNSPEC:
|
||||||
|
if (len != 1)
|
||||||
|
goto fail;
|
||||||
|
|
||||||
|
bss->signal_strength =
|
||||||
|
signal_unspec_to_mbm(l_get_u8(data));
|
||||||
|
break;
|
||||||
case NL80211_BSS_INFORMATION_ELEMENTS:
|
case NL80211_BSS_INFORMATION_ELEMENTS:
|
||||||
ies = data;
|
ies = data;
|
||||||
ies_len = len;
|
ies_len = len;
|
||||||
|
Loading…
Reference in New Issue
Block a user