Wifi (Linux): improve performance

This commit is contained in:
Carter Li
2024-11-20 08:43:28 +08:00
parent fdc9bee4b3
commit 4cbcd0f107
+62 -12
View File
@@ -36,6 +36,13 @@ typedef enum {
NM_802_11_AP_SEC_KEY_MGMT_EAP_SUITE_B_192 = 0x00002000,
} NM80211ApSecurityFlags;
#define FF_DBUS_ITER_CONTINUE(dbus, iterator) \
{ \
if(!(dbus).lib->ffdbus_message_iter_next(iterator)) \
break; \
continue; \
}
static const char* detectWifiWithNm(FFWifiResult* item, FFstrbuf* buffer)
{
FFDBusData dbus;
@@ -72,24 +79,67 @@ static const char* detectWifiWithNm(FFWifiResult* item, FFstrbuf* buffer)
if (!item->conn.status.length)
ffStrbufSetStatic(&item->conn.status, "connected");
if (!item->conn.ssid.length)
ffDBusGetPropertyString(&dbus, "org.freedesktop.NetworkManager", apPath.chars, "org.freedesktop.NetworkManager.AccessPoint", "Ssid", &item->conn.ssid);
DBusMessage* reply = ffDBusGetAllProperties(&dbus, "org.freedesktop.NetworkManager", apPath.chars, "org.freedesktop.NetworkManager.AccessPoint");
if(reply == NULL)
return "Failed to get access point properties";
if (!item->conn.bssid.length)
ffDBusGetPropertyString(&dbus, "org.freedesktop.NetworkManager", apPath.chars, "org.freedesktop.NetworkManager.AccessPoint", "HwAddress", &item->conn.bssid);
if (item->conn.signalQuality != item->conn.signalQuality)
DBusMessageIter rootIterator;
if(!dbus.lib->ffdbus_message_iter_init(reply, &rootIterator) &&
dbus.lib->ffdbus_message_iter_get_arg_type(&rootIterator) != DBUS_TYPE_ARRAY)
{
uint32_t strengthPercent;
if (ffDBusGetPropertyUint(&dbus, "org.freedesktop.NetworkManager", apPath.chars, "org.freedesktop.NetworkManager.AccessPoint", "Strength", &strengthPercent))
item->conn.signalQuality = strengthPercent;
dbus.lib->ffdbus_message_unref(reply);
return "Invalid type of access point properties";
}
DBusMessageIter arrayIterator;
dbus.lib->ffdbus_message_iter_recurse(&rootIterator, &arrayIterator);
NM80211ApFlags flags;
NM80211ApSecurityFlags wpaFlags, rsnFlags;
if (ffDBusGetPropertyUint(&dbus, "org.freedesktop.NetworkManager", apPath.chars, "org.freedesktop.NetworkManager.AccessPoint", "Flags", &flags) &&
ffDBusGetPropertyUint(&dbus, "org.freedesktop.NetworkManager", apPath.chars, "org.freedesktop.NetworkManager.AccessPoint", "WpaFlags", &wpaFlags) &&
ffDBusGetPropertyUint(&dbus, "org.freedesktop.NetworkManager", apPath.chars , "org.freedesktop.NetworkManager.AccessPoint", "RsnFlags", &rsnFlags))
int flagCount = 0;
while(true)
{
if(dbus.lib->ffdbus_message_iter_get_arg_type(&arrayIterator) != DBUS_TYPE_DICT_ENTRY)
FF_DBUS_ITER_CONTINUE(dbus, &arrayIterator)
DBusMessageIter dictIterator;
dbus.lib->ffdbus_message_iter_recurse(&arrayIterator, &dictIterator);
const char* key;
dbus.lib->ffdbus_message_iter_get_basic(&dictIterator, &key);
dbus.lib->ffdbus_message_iter_next(&dictIterator);
if (ffStrEquals(key, "Ssid"))
{
if (!item->conn.ssid.length)
ffDBusGetString(&dbus, &dictIterator, &item->conn.ssid);
}
else if (ffStrEquals(key, "HwAddress"))
{
if (!item->conn.bssid.length)
ffDBusGetString(&dbus, &dictIterator, &item->conn.bssid);
}
else if (ffStrEquals(key, "Strength"))
{
if (item->conn.signalQuality != item->conn.signalQuality)
{
uint32_t strengthPercent;
if (ffDBusGetUint(&dbus, &dictIterator, &strengthPercent))
item->conn.signalQuality = strengthPercent;
}
}
else if ((ffStrEquals(key, "Flags") && ffDBusGetUint(&dbus, &dictIterator, &flags)) ||
(ffStrEquals(key, "WpaFlags") && ffDBusGetUint(&dbus, &dictIterator, &wpaFlags)) ||
(ffStrEquals(key, "RsnFlags") && ffDBusGetUint(&dbus, &dictIterator, &rsnFlags))
)
++flagCount;
FF_DBUS_ITER_CONTINUE(dbus, &arrayIterator)
}
if (flagCount == 3)
{
if ((flags & NM_802_11_AP_FLAGS_PRIVACY) && (wpaFlags == NM_802_11_AP_SEC_NONE)
&& (rsnFlags == NM_802_11_AP_SEC_NONE))