summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorGatis Paeglis <gatis.paeglis@theqtcompany.com>2015-02-24 14:31:36 +0100
committerGatis Paeglis <gatis.paeglis@theqtcompany.com>2015-04-16 10:36:23 +0300
commit615a3cbe7ac97c73556fd5194c06e901eccd16de (patch)
tree9e9918c3007ac1c2374505f51f78ab6e3a328ab4 /src
parentd598f850f9fad6a33dae622ce11a01b8585fe790 (diff)
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 <eirik.aavitsland@theqtcompany.com>
Diffstat (limited to 'src')
-rw-r--r--src/imports/wifi/pluginmain.cpp14
-rw-r--r--src/wifi/qwifimanager.cpp10
-rw-r--r--src/wifi/qwifinetworklistmodel.cpp13
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);