From 615a3cbe7ac97c73556fd5194c06e901eccd16de Mon Sep 17 00:00:00 2001 From: Gatis Paeglis Date: Tue, 24 Feb 2015 14:31:36 +0100 Subject: Fix signal calculation for WEXT-based drivers This patch introduces a behavior change. Previously the 'SignalStrength' role was interpreted as dBm. This was working fine for nl80211 based drivers, for WEXT-based drivers it contained garbage values. Now the 'SignalStrength' role will always be interpreted as percentage. The wpa_supplicant passes back only the 'level' of the scanned BSS, which with nl80211-based driver is almost always dBm (val < 0). WEXT-based driver has its own interpretation of 'level' - it can contain dBm, percentage [0-100] (and some other values for historical reasons, but these are converted by the wpa_supplicant to dBm). This is what I have concluded from looking at NetworkManager and wpa_supplicant sources and git history. Even the official GUI tool wpa_gui for the wpa_supplicant is out-of-date and can not be used as a referance. Change-Id: I70d15e26e0a1700ad0f7d19d23cbade2d3d46054 Reviewed-by: Eirik Aavitsland --- src/imports/wifi/pluginmain.cpp | 14 +++++++------- src/wifi/qwifimanager.cpp | 10 +++++----- src/wifi/qwifinetworklistmodel.cpp | 13 ++++++++++--- 3 files changed, 22 insertions(+), 15 deletions(-) diff --git a/src/imports/wifi/pluginmain.cpp b/src/imports/wifi/pluginmain.cpp index 7d129d2..b498b66 100644 --- a/src/imports/wifi/pluginmain.cpp +++ b/src/imports/wifi/pluginmain.cpp @@ -93,13 +93,13 @@ QT_BEGIN_NAMESPACE interface, accessed with the following roles: \list - \li \e ssid - informal (human) name of a Wifi network - \li \e bssid - basic service set identification of a network, used to uniquely identify BSS - \li \e signalStrength - strength of a Wifi signal, measured in dBm - \li \e supportsWPA - holds whether network access point supports WPA security protocol - \li \e supportsWPA2 - holds whether network access point supports WPA2 security protocol - \li \e supportsWEP - holds whether network access point supports WEP security protocol - \li \e supportsWPS - holds whether network access point supports WPS security protocol + \li \e ssid - informal (human) name of a Wifi network (string) + \li \e bssid - basic service set identification of a network, used to uniquely identify BSS (string) + \li \e signalStrength - strength of a Wifi signal represented as percentage (0-100) (int) + \li \e supportsWPA - holds whether network access point supports WPA security protocol (bool) + \li \e supportsWPA2 - holds whether network access point supports WPA2 security protocol (bool) + \li \e supportsWEP - holds whether network access point supports WEP security protocol (bool) + \li \e supportsWPS - holds whether network access point supports WPS security protocol (bool) \endlist */ diff --git a/src/wifi/qwifimanager.cpp b/src/wifi/qwifimanager.cpp index 7585cf2..2a5cfff 100644 --- a/src/wifi/qwifimanager.cpp +++ b/src/wifi/qwifimanager.cpp @@ -212,11 +212,11 @@ void QWifiManagerPrivate::updateLastError(const QString &error) \value SSID informal (human) name of a Wifi network (QString) \value BSSID basic service set identification of a network, used to uniquely identify BSS (QString) - \value SignalStrength strength of a Wifi signal, measured in dBm (int) - \value WPASupported holds whether network access point supports WPA security protocol (QString) - \value WPA2Supported holds whether network access point supports WPA2 security protocol (QString) - \value WEPSupported holds whether network access point supports WEP security protocol (QString) - \value WPSSupported holds whether network access point supports WPS security protocol (QString) + \value SignalStrength strength of a Wifi signal represented as percentage (0-100) (int) + \value WPASupported holds whether network access point supports WPA security protocol (bool) + \value WPA2Supported holds whether network access point supports WPA2 security protocol (bool) + \value WEPSupported holds whether network access point supports WEP security protocol (bool) + \value WPSSupported holds whether network access point supports WPS security protocol (bool) */ QWifiManager* QWifiManager::m_instance = 0; diff --git a/src/wifi/qwifinetworklistmodel.cpp b/src/wifi/qwifinetworklistmodel.cpp index 7ed4be4..9d6202f 100644 --- a/src/wifi/qwifinetworklistmodel.cpp +++ b/src/wifi/qwifinetworklistmodel.cpp @@ -132,9 +132,16 @@ void QWifiNetworkListModel::parseScanResults(const QString &results) QWifiNetwork *knownNetwork = networkForSSID(ssid, &pos); if (!knownNetwork) knownNetwork = outOfRangeListContains(ssid); - // signal strength is in dBm. Deprecated, but still widely used "wext" - // wifi driver reports positive values for signal strength, we workaround that. - int signalStrength = qAbs(info.at(2).trimmed().toInt()) * -1; + + int signalStrength = info.at(2).trimmed().toInt(); + if (signalStrength < 0) { + // signal is reported in dBm, rough conversion: best = -40, worst = -100 + int val = qAbs(qMax(-100, qMin(signalStrength, -40)) + 40); // clamp and normalize to 0 + signalStrength = 100 - (int) ((100.0 * (double) val) / 60.0); + } else if (signalStrength > 100) { + qCWarning(B2QT_WIFI) << "unexpected value for a signal level: " << signalStrength; + } + if (!knownNetwork) { QWifiNetwork *network = new QWifiNetwork(); network->setOutOfRange(false); -- cgit v1.2.3