Skip to content

Commit 4cbcd0f

Browse files
committed
Wifi (Linux): improve performance
1 parent fdc9bee commit 4cbcd0f

File tree

1 file changed

+62
-12
lines changed

1 file changed

+62
-12
lines changed

src/detection/wifi/wifi_linux.c

Lines changed: 62 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,13 @@ typedef enum {
3636
NM_802_11_AP_SEC_KEY_MGMT_EAP_SUITE_B_192 = 0x00002000,
3737
} NM80211ApSecurityFlags;
3838

39+
#define FF_DBUS_ITER_CONTINUE(dbus, iterator) \
40+
{ \
41+
if(!(dbus).lib->ffdbus_message_iter_next(iterator)) \
42+
break; \
43+
continue; \
44+
}
45+
3946
static const char* detectWifiWithNm(FFWifiResult* item, FFstrbuf* buffer)
4047
{
4148
FFDBusData dbus;
@@ -72,24 +79,67 @@ static const char* detectWifiWithNm(FFWifiResult* item, FFstrbuf* buffer)
7279
if (!item->conn.status.length)
7380
ffStrbufSetStatic(&item->conn.status, "connected");
7481

75-
if (!item->conn.ssid.length)
76-
ffDBusGetPropertyString(&dbus, "org.freedesktop.NetworkManager", apPath.chars, "org.freedesktop.NetworkManager.AccessPoint", "Ssid", &item->conn.ssid);
77-
78-
if (!item->conn.bssid.length)
79-
ffDBusGetPropertyString(&dbus, "org.freedesktop.NetworkManager", apPath.chars, "org.freedesktop.NetworkManager.AccessPoint", "HwAddress", &item->conn.bssid);
82+
DBusMessage* reply = ffDBusGetAllProperties(&dbus, "org.freedesktop.NetworkManager", apPath.chars, "org.freedesktop.NetworkManager.AccessPoint");
83+
if(reply == NULL)
84+
return "Failed to get access point properties";
8085

81-
if (item->conn.signalQuality != item->conn.signalQuality)
86+
DBusMessageIter rootIterator;
87+
if(!dbus.lib->ffdbus_message_iter_init(reply, &rootIterator) &&
88+
dbus.lib->ffdbus_message_iter_get_arg_type(&rootIterator) != DBUS_TYPE_ARRAY)
8289
{
83-
uint32_t strengthPercent;
84-
if (ffDBusGetPropertyUint(&dbus, "org.freedesktop.NetworkManager", apPath.chars, "org.freedesktop.NetworkManager.AccessPoint", "Strength", &strengthPercent))
85-
item->conn.signalQuality = strengthPercent;
90+
dbus.lib->ffdbus_message_unref(reply);
91+
return "Invalid type of access point properties";
8692
}
8793

94+
DBusMessageIter arrayIterator;
95+
dbus.lib->ffdbus_message_iter_recurse(&rootIterator, &arrayIterator);
96+
8897
NM80211ApFlags flags;
8998
NM80211ApSecurityFlags wpaFlags, rsnFlags;
90-
if (ffDBusGetPropertyUint(&dbus, "org.freedesktop.NetworkManager", apPath.chars, "org.freedesktop.NetworkManager.AccessPoint", "Flags", &flags) &&
91-
ffDBusGetPropertyUint(&dbus, "org.freedesktop.NetworkManager", apPath.chars, "org.freedesktop.NetworkManager.AccessPoint", "WpaFlags", &wpaFlags) &&
92-
ffDBusGetPropertyUint(&dbus, "org.freedesktop.NetworkManager", apPath.chars , "org.freedesktop.NetworkManager.AccessPoint", "RsnFlags", &rsnFlags))
99+
int flagCount = 0;
100+
101+
while(true)
102+
{
103+
if(dbus.lib->ffdbus_message_iter_get_arg_type(&arrayIterator) != DBUS_TYPE_DICT_ENTRY)
104+
FF_DBUS_ITER_CONTINUE(dbus, &arrayIterator)
105+
106+
DBusMessageIter dictIterator;
107+
dbus.lib->ffdbus_message_iter_recurse(&arrayIterator, &dictIterator);
108+
109+
const char* key;
110+
dbus.lib->ffdbus_message_iter_get_basic(&dictIterator, &key);
111+
112+
dbus.lib->ffdbus_message_iter_next(&dictIterator);
113+
114+
if (ffStrEquals(key, "Ssid"))
115+
{
116+
if (!item->conn.ssid.length)
117+
ffDBusGetString(&dbus, &dictIterator, &item->conn.ssid);
118+
}
119+
else if (ffStrEquals(key, "HwAddress"))
120+
{
121+
if (!item->conn.bssid.length)
122+
ffDBusGetString(&dbus, &dictIterator, &item->conn.bssid);
123+
}
124+
else if (ffStrEquals(key, "Strength"))
125+
{
126+
if (item->conn.signalQuality != item->conn.signalQuality)
127+
{
128+
uint32_t strengthPercent;
129+
if (ffDBusGetUint(&dbus, &dictIterator, &strengthPercent))
130+
item->conn.signalQuality = strengthPercent;
131+
}
132+
}
133+
else if ((ffStrEquals(key, "Flags") && ffDBusGetUint(&dbus, &dictIterator, &flags)) ||
134+
(ffStrEquals(key, "WpaFlags") && ffDBusGetUint(&dbus, &dictIterator, &wpaFlags)) ||
135+
(ffStrEquals(key, "RsnFlags") && ffDBusGetUint(&dbus, &dictIterator, &rsnFlags))
136+
)
137+
++flagCount;
138+
139+
FF_DBUS_ITER_CONTINUE(dbus, &arrayIterator)
140+
}
141+
142+
if (flagCount == 3)
93143
{
94144
if ((flags & NM_802_11_AP_FLAGS_PRIVACY) && (wpaFlags == NM_802_11_AP_SEC_NONE)
95145
&& (rsnFlags == NM_802_11_AP_SEC_NONE))

0 commit comments

Comments
 (0)