Wifi: detect more information using libnm (Linux)

This commit is contained in:
李通洲
2023-01-17 12:45:26 +08:00
parent df793c20fd
commit f28805fb94
11 changed files with 334 additions and 195 deletions
+1 -1
View File
@@ -22,7 +22,7 @@ Features:
* Support `WezTerm` terminal font detection (requires [`wezterm` executable](https://wezfurlong.org/wezterm/cli/general.html) being available)
* Add `--shell-version` and `--terminal-version` options to disable shell / terminal version detection
* Enhance `--percent-type` to allow hiding other texts (#387)
* Add Wifi module basic support for Linux
* Add Wifi module support for Linux
Logos:
* Raspbian (@IamNoRobot, #373)
+5
View File
@@ -68,6 +68,7 @@ cmake_dependent_option(ENABLE_GLX "Enable glx" ON "LINUX OR BSD" OFF)
cmake_dependent_option(ENABLE_OSMESA "Enable osmesa" ON "LINUX OR BSD" OFF)
cmake_dependent_option(ENABLE_OPENCL "Enable opencl" ON "LINUX OR BSD OR WIN32" OFF)
cmake_dependent_option(ENABLE_LIBCJSON "Enable libcjson" ON "LINUX OR WIN32" OFF)
cmake_dependent_option(ENABLE_LIBNM "Enable libnm" ON "LINUX" OFF)
cmake_dependent_option(ENABLE_FREETYPE "Enable freetype" ON "ANDROID" OFF)
cmake_dependent_option(ENABLE_THREADS "Enable multithreading" ON "Threads_FOUND AND NOT ANDROID" OFF)
cmake_dependent_option(ENABLE_BUFFER "Enable stdout buffer" ON "LINUX OR APPLE OR BSD OR WIN32 OR ANDROID" OFF)
@@ -637,6 +638,10 @@ ff_lib_enable(LIBCJSON
"libcjson"
"CJson"
)
ff_lib_enable(LIBNM
"libnm"
"libnm"
)
ff_lib_enable(FREETYPE
"freetype2"
"FreeType2"
+1
View File
@@ -52,6 +52,7 @@ The following libraries are used if present at runtime:
* [`libsqlite3`](https://www.sqlite.org/index.html): Needed for pkg & rpm package count.
* [`librpm`](http://rpm.org/): Slower fallback for rpm package count. Needed on openSUSE.
* [`libcJSON`](https://github.com/DaveGamble/cJSON): Needed for Windows Terminal font ( WSL ).
* [`libnm`](https://networkmanager.dev/docs/libnm/latest/): Used for Wifi detection on Linux.
### macOS
+2
View File
@@ -139,6 +139,7 @@ static void defaultConfig(FFinstance* instance)
ffStrbufInitA(&instance->config.libcJSON, 0);
ffStrbufInitA(&instance->config.libfreetype, 0);
ffStrbufInit(&instance->config.libwlanapi);
ffStrbufInit(&instance->config.libnm);
instance->config.cpuTemp = false;
instance->config.gpuTemp = false;
@@ -400,6 +401,7 @@ static void destroyConfig(FFinstance* instance)
ffStrbufDestroy(&instance->config.libcJSON);
ffStrbufDestroy(&instance->config.libfreetype);
ffStrbufDestroy(&instance->config.libwlanapi);
ffStrbufDestroy(&instance->config.libnm);
ffStrbufDestroy(&instance->config.diskFolders);
ffStrbufDestroy(&instance->config.batteryDir);
+2 -16
View File
@@ -16,31 +16,17 @@ struct FFWifiConnection
FFstrbuf status;
FFstrbuf ssid;
FFstrbuf macAddress;
FFstrbuf phyType;
FFstrbuf protocol;
FFstrbuf security;
double signalQuality; // Percentage
double rxRate;
double txRate;
};
enum FFWifiSecurityType
{
FF_WIFI_SECURITY_UNKNOWN,
FF_WIFI_SECURITY_ENABLED,
FF_WIFI_SECURITY_DISABLED,
};
struct FFWifiSecurity
{
enum FFWifiSecurityType type;
bool oneXEnabled;
FFstrbuf algorithm;
};
typedef struct FFWifiResult
{
struct FFWifiInterface inf;
struct FFWifiConnection conn;
struct FFWifiSecurity security;
} FFWifiResult;
const char* ffDetectWifi(const FFinstance* instance, FFlist* result /*list of FFWifiItem*/);
+28 -33
View File
@@ -21,13 +21,11 @@ const char* ffDetectWifi(const FFinstance* instance, FFlist* result)
ffStrbufInit(&item->conn.status);
ffStrbufInit(&item->conn.ssid);
ffStrbufInit(&item->conn.macAddress);
ffStrbufInit(&item->conn.phyType);
ffStrbufInit(&item->conn.protocol);
ffStrbufInit(&item->conn.security);
item->conn.signalQuality = 0.0/0.0;
item->conn.rxRate = 0.0/0.0;
item->conn.txRate = 0.0/0.0;
item->security.type = FF_WIFI_SECURITY_UNKNOWN;
item->security.oneXEnabled = false;
ffStrbufInit(&item->security.algorithm);
ffStrbufAppendS(&item->inf.description, inf.interfaceName.UTF8String);
ffStrbufAppendS(&item->inf.status, inf.powerOn ? "Power On" : "Power Off");
@@ -43,88 +41,85 @@ const char* ffDetectWifi(const FFinstance* instance, FFlist* result)
switch(inf.activePHYMode)
{
case kCWPHYModeNone:
ffStrbufAppendS(&item->conn.phyType, "none");
ffStrbufAppendS(&item->conn.protocol, "none");
break;
case kCWPHYMode11a:
ffStrbufAppendS(&item->conn.phyType, "802.11a");
ffStrbufAppendS(&item->conn.protocol, "802.11a");
break;
case kCWPHYMode11b:
ffStrbufAppendS(&item->conn.phyType, "802.11b");
ffStrbufAppendS(&item->conn.protocol, "802.11b");
break;
case kCWPHYMode11g:
ffStrbufAppendS(&item->conn.phyType, "802.11g");
ffStrbufAppendS(&item->conn.protocol, "802.11g");
break;
case kCWPHYMode11n:
ffStrbufAppendS(&item->conn.phyType, "802.11n (Wi-Fi 4)");
ffStrbufAppendS(&item->conn.protocol, "802.11n (Wi-Fi 4)");
break;
case kCWPHYMode11ac:
ffStrbufAppendS(&item->conn.phyType, "802.11ac (Wi-Fi 5)");
ffStrbufAppendS(&item->conn.protocol, "802.11ac (Wi-Fi 5)");
break;
case 6 /*kCWPHYMode11ax*/:
ffStrbufAppendS(&item->conn.phyType, "802.11ax (Wi-Fi 6)");
ffStrbufAppendS(&item->conn.protocol, "802.11ax (Wi-Fi 6)");
break;
case 7 /*kCWPHYMode11be?*/:
ffStrbufAppendS(&item->conn.phyType, "802.11be (Wi-Fi 7)");
ffStrbufAppendS(&item->conn.protocol, "802.11be (Wi-Fi 7)");
break;
default:
ffStrbufAppendF(&item->conn.phyType, "Unknown (%ld)", inf.activePHYMode);
ffStrbufAppendF(&item->conn.protocol, "Unknown (%ld)", inf.activePHYMode);
break;
}
item->conn.signalQuality = inf.rssiValue >= -50 ? 100 : inf.rssiValue <= -100 ? 0 : (inf.rssiValue + 100) * 2;
item->conn.txRate = inf.transmitRate;
item->security.type = inf.security != kCWSecurityNone ? FF_WIFI_SECURITY_ENABLED : FF_WIFI_SECURITY_DISABLED;
switch(inf.security)
{
case kCWSecurityNone:
ffStrbufAppendS(&item->security.algorithm, "None");
break;
case kCWSecurityWEP:
ffStrbufAppendS(&item->security.algorithm, "WEP");
ffStrbufAppendS(&item->conn.security, "WEP");
break;
case kCWSecurityWPAPersonal:
ffStrbufAppendS(&item->security.algorithm, "WPA Personal");
ffStrbufAppendS(&item->conn.security, "WPA Personal");
break;
case kCWSecurityWPAPersonalMixed:
ffStrbufAppendS(&item->security.algorithm, "WPA Persional Mixed");
ffStrbufAppendS(&item->conn.security, "WPA Persional Mixed");
break;
case kCWSecurityWPA2Personal:
ffStrbufAppendS(&item->security.algorithm, "WPA2 Personal");
ffStrbufAppendS(&item->conn.security, "WPA2 Personal");
break;
case kCWSecurityPersonal:
ffStrbufAppendS(&item->security.algorithm, "Personal");
ffStrbufAppendS(&item->conn.security, "Personal");
break;
case kCWSecurityDynamicWEP:
ffStrbufAppendS(&item->security.algorithm, "Dynamic WEP");
ffStrbufAppendS(&item->conn.security, "Dynamic WEP");
break;
case kCWSecurityWPAEnterprise:
ffStrbufAppendS(&item->security.algorithm, "WPA Enterprise");
ffStrbufAppendS(&item->conn.security, "WPA Enterprise");
break;
case kCWSecurityWPAEnterpriseMixed:
ffStrbufAppendS(&item->security.algorithm, "WPA Enterprise Mixed");
ffStrbufAppendS(&item->conn.security, "WPA Enterprise Mixed");
break;
case kCWSecurityWPA2Enterprise:
ffStrbufAppendS(&item->security.algorithm, "WPA2 Enterprise");
ffStrbufAppendS(&item->conn.security, "WPA2 Enterprise");
break;
case kCWSecurityEnterprise:
ffStrbufAppendS(&item->security.algorithm, "Enterprise");
ffStrbufAppendS(&item->conn.security, "Enterprise");
break;
case kCWSecurityWPA3Personal:
ffStrbufAppendS(&item->security.algorithm, "WPA3 Personal");
ffStrbufAppendS(&item->conn.security, "WPA3 Personal");
break;
case kCWSecurityWPA3Enterprise:
ffStrbufAppendS(&item->security.algorithm, "WPA3 Enterprise");
ffStrbufAppendS(&item->conn.security, "WPA3 Enterprise");
break;
case kCWSecurityWPA3Transition:
ffStrbufAppendS(&item->security.algorithm, "WPA3 Transition");
ffStrbufAppendS(&item->conn.security, "WPA3 Transition");
break;
case 14 /*kCWSecurityOWE*/:
ffStrbufAppendS(&item->security.algorithm, "OWE");
ffStrbufAppendS(&item->conn.security, "OWE");
break;
case 15 /*kCWSecurityOWETransition*/:
ffStrbufAppendS(&item->security.algorithm, "OWE Transition");
ffStrbufAppendS(&item->conn.security, "OWE Transition");
break;
default:
ffStrbufAppendF(&item->security.algorithm, "Unknown (%ld)", inf.security);
ffStrbufAppendF(&item->conn.security, "Unknown (%ld)", inf.security);
break;
}
}
+223 -28
View File
@@ -1,5 +1,204 @@
#include "wifi.h"
#include "common/processing.h"
#include "common/properties.h"
#include "common/library.h"
#include <stdio.h>
#include <stdlib.h>
#ifdef FF_HAVE_LIBNM
#include <glib.h>
#define NM_NO_INCLUDE_EXTRA_HEADERS 1
#include <NetworkManager.h>
const char* ffDetectWifi(FF_MAYBE_UNUSED const FFinstance* instance, FFlist* result)
{
FF_LIBRARY_LOAD(nm, &instance->config.libnm, "dlopen libnm failed", "libnm" FF_LIBRARY_EXTENSION, 0);
FF_LIBRARY_LOAD_SYMBOL_MESSAGE(nm, nm_client_new);
FF_LIBRARY_LOAD_SYMBOL_MESSAGE(nm, nm_client_get_devices);
FF_LIBRARY_LOAD_SYMBOL_MESSAGE(nm, nm_device_get_iface);
FF_LIBRARY_LOAD_SYMBOL_MESSAGE(nm, nm_device_get_state);
FF_LIBRARY_LOAD_SYMBOL_MESSAGE(nm, nm_device_wifi_get_type);
FF_LIBRARY_LOAD_SYMBOL_MESSAGE(nm, nm_device_wifi_get_active_access_point);
FF_LIBRARY_LOAD_SYMBOL_MESSAGE(nm, nm_access_point_get_ssid);
FF_LIBRARY_LOAD_SYMBOL_MESSAGE(nm, nm_utils_ssid_to_utf8);
FF_LIBRARY_LOAD_SYMBOL_MESSAGE(nm, nm_access_point_get_bssid);
FF_LIBRARY_LOAD_SYMBOL_MESSAGE(nm, nm_access_point_get_strength);
FF_LIBRARY_LOAD_SYMBOL_MESSAGE(nm, nm_access_point_get_max_bitrate);
FF_LIBRARY_LOAD_SYMBOL_MESSAGE(nm, nm_access_point_get_flags);
FF_LIBRARY_LOAD_SYMBOL_MESSAGE(nm, nm_access_point_get_wpa_flags);
FF_LIBRARY_LOAD_SYMBOL_MESSAGE(nm, nm_access_point_get_rsn_flags);
FF_LIBRARY_LOAD_SYMBOL_MESSAGE(nm, g_type_check_instance_is_a);
FF_LIBRARY_LOAD_SYMBOL_MESSAGE(nm, g_bytes_get_size);
FF_LIBRARY_LOAD_SYMBOL_MESSAGE(nm, g_bytes_get_data);
FF_LIBRARY_LOAD_SYMBOL_MESSAGE(nm, g_free);
FF_LIBRARY_LOAD_SYMBOL_MESSAGE(nm, g_object_unref);
NMClient* client = ffnm_client_new(NULL, NULL);
if(!client)
{
dlclose(nm);
return "Could not create NMClient";
}
/* Get all devices managed by NetworkManager */
const GPtrArray* devices = ffnm_client_get_devices(client);
/* Go through the array and process Wi-Fi devices */
for (guint i = 0; i < devices->len; i++)
{
NMDevice *device = g_ptr_array_index(devices, i);
if (!({
GTypeInstance *__inst = (GTypeInstance*) device; GType __t = ffnm_device_wifi_get_type(); gboolean __r;
if (!__inst)
__r = FALSE;
else if (__inst->g_class && __inst->g_class->g_type == __t)
__r = TRUE;
else
__r = ffg_type_check_instance_is_a (__inst, __t);
__r;
}) //NM_IS_DEVICE_WIFI(device)
)
continue;
FFWifiResult* item = (FFWifiResult*) ffListAdd(result);
ffStrbufInit(&item->inf.description);
ffStrbufInit(&item->inf.status);
ffStrbufInit(&item->conn.status);
ffStrbufInit(&item->conn.ssid);
ffStrbufInit(&item->conn.macAddress);
ffStrbufInit(&item->conn.protocol);
ffStrbufInit(&item->conn.security);
item->conn.signalQuality = 0.0/0.0;
item->conn.rxRate = 0.0/0.0;
item->conn.txRate = 0.0/0.0;
ffStrbufAppendS(&item->inf.description, ffnm_device_get_iface(device));
NMDeviceState state = ffnm_device_get_state(device);
switch(state)
{
case NM_DEVICE_STATE_UNKNOWN:
ffStrbufAppendS(&item->inf.status, "Unknown");
break;
case NM_DEVICE_STATE_UNMANAGED:
ffStrbufAppendS(&item->inf.status, "Unmanaged");
break;
case NM_DEVICE_STATE_UNAVAILABLE:
ffStrbufAppendS(&item->inf.status, "Unavailable");
break;
case NM_DEVICE_STATE_DISCONNECTED:
ffStrbufAppendS(&item->inf.status, "Disconnected");
break;
case NM_DEVICE_STATE_PREPARE:
ffStrbufAppendS(&item->inf.status, "Prepare");
break;
case NM_DEVICE_STATE_CONFIG:
ffStrbufAppendS(&item->inf.status, "Config");
break;
case NM_DEVICE_STATE_NEED_AUTH:
ffStrbufAppendS(&item->inf.status, "Need auth");
break;
case NM_DEVICE_STATE_IP_CONFIG:
ffStrbufAppendS(&item->inf.status, "IP config");
break;
case NM_DEVICE_STATE_IP_CHECK:
ffStrbufAppendS(&item->inf.status, "IP check");
break;
case NM_DEVICE_STATE_SECONDARIES:
ffStrbufAppendS(&item->inf.status, "Secondaries");
break;
case NM_DEVICE_STATE_ACTIVATED:
ffStrbufAppendS(&item->inf.status, "Activated");
break;
case NM_DEVICE_STATE_DEACTIVATING:
ffStrbufAppendS(&item->inf.status, "Deactivating");
break;
case NM_DEVICE_STATE_FAILED:
ffStrbufAppendS(&item->inf.status, "Failed");
break;
}
if(state != NM_DEVICE_STATE_ACTIVATED)
continue;
NMAccessPoint* ap = ffnm_device_wifi_get_active_access_point((NMDeviceWifi *) device);
if (!ap)
continue;
GBytes* activeSsid = ffnm_access_point_get_ssid(ap);
if (activeSsid)
{
char* ssid = ffnm_utils_ssid_to_utf8(ffg_bytes_get_data(activeSsid, NULL), ffg_bytes_get_size(activeSsid));
ffStrbufAppendS(&item->conn.ssid, ssid);
ffg_free(ssid);
}
ffStrbufAppendS(&item->conn.macAddress, ffnm_access_point_get_bssid(ap));
item->conn.signalQuality = ffnm_access_point_get_strength(ap);
item->conn.rxRate = ffnm_access_point_get_max_bitrate(ap);
if(instance->config.allowSlowOperations)
{
FF_STRBUF_AUTO_DESTROY output;
ffStrbufInit(&output);
if(!ffProcessAppendStdOut(&output, (char* const[]){
"iw",
"dev",
item->inf.description.chars,
"link",
NULL
}) && ffParsePropLines(output.chars, "tx bitrate: ", &item->conn.protocol))
{
if(ffStrbufContainS(&item->conn.protocol, " HE-MCS "))
ffStrbufSetS(&item->conn.protocol, "802.11ax (Wi-Fi 6)");
else if(ffStrbufContainS(&item->conn.protocol, " VHT-MCS "))
ffStrbufSetS(&item->conn.protocol, "802.11ac (Wi-Fi 5)");
else if(ffStrbufContainS(&item->conn.protocol, " MCS "))
ffStrbufSetS(&item->conn.protocol, "802.11n (Wi-Fi 4)");
else
ffStrbufSetS(&item->conn.protocol, "802.11a/b/g");
}
}
if(!item->conn.protocol.length)
ffStrbufAppendS(&item->conn.protocol, "802.11");
NM80211ApFlags flags = ffnm_access_point_get_flags(ap);
NM80211ApSecurityFlags wpaFlags = ffnm_access_point_get_wpa_flags(ap);
NM80211ApSecurityFlags rsnFlags = ffnm_access_point_get_rsn_flags(ap);
if ((flags & NM_802_11_AP_FLAGS_PRIVACY) && (wpaFlags == NM_802_11_AP_SEC_NONE)
&& (rsnFlags == NM_802_11_AP_SEC_NONE))
ffStrbufAppendS(&item->conn.security, "WEP ");
if (wpaFlags != NM_802_11_AP_SEC_NONE)
ffStrbufAppendS(&item->conn.security, "WPA ");
if ((rsnFlags & NM_802_11_AP_SEC_KEY_MGMT_PSK)
|| (rsnFlags & NM_802_11_AP_SEC_KEY_MGMT_802_1X)) {
ffStrbufAppendS(&item->conn.security, "WPA2 ");
}
if (rsnFlags & NM_802_11_AP_SEC_KEY_MGMT_SAE) {
ffStrbufAppendS(&item->conn.security, "WPA3 ");
}
if ((rsnFlags & NM_802_11_AP_SEC_KEY_MGMT_OWE)
|| (rsnFlags & NM_802_11_AP_SEC_KEY_MGMT_OWE_TM)) {
ffStrbufAppendS(&item->conn.security, "OWE ");
}
if ((wpaFlags & NM_802_11_AP_SEC_KEY_MGMT_802_1X)
|| (rsnFlags & NM_802_11_AP_SEC_KEY_MGMT_802_1X)) {
ffStrbufAppendS(&item->conn.security, "802.1X ");
}
ffStrbufTrimRight(&item->conn.security, ' ');
}
ffg_object_unref(client);
dlclose(nm);
return NULL;
}
#else
#include "common/io.h"
#include <net/if.h>
@@ -26,9 +225,9 @@ static const char* detectInf(char* ifName, FFWifiResult* wifi)
if(ioctl(sock, SIOCGIWNAME, &iwr) >= 0)
{
if(strncasecmp(iwr.u.name, "IEEE ", 5) == 0)
ffStrbufSetS(&wifi->conn.phyType, iwr.u.name + 5);
ffStrbufSetS(&wifi->conn.protocol, iwr.u.name + 5);
else
ffStrbufSetS(&wifi->conn.phyType, iwr.u.name);
ffStrbufSetS(&wifi->conn.protocol, iwr.u.name);
}
if(ioctl(sock, SIOCGIWAP, &iwr) >= 0)
@@ -50,30 +249,26 @@ static const char* detectInf(char* ifName, FFWifiResult* wifi)
if(ioctl(sock, SIOCGIWENCODEEXT, &iwr) >= 0)
{
struct iw_encode_ext* iwe = iwr.u.data.pointer;
if(iwe->alg == IW_ENCODE_ALG_NONE)
wifi->security.type = FF_WIFI_SECURITY_DISABLED;
else
switch(iwe->alg)
{
wifi->security.type = FF_WIFI_SECURITY_ENABLED;
switch(iwe->alg)
{
case IW_ENCODE_ALG_WEP:
ffStrbufAppendS(&wifi->security.algorithm, "WEP");
break;
case IW_ENCODE_ALG_TKIP:
ffStrbufAppendS(&wifi->security.algorithm, "TKIP");
break;
case IW_ENCODE_ALG_CCMP:
ffStrbufAppendS(&wifi->security.algorithm, "CCMP");
break;
case IW_ENCODE_ALG_PMK:
ffStrbufAppendS(&wifi->security.algorithm, "PMK");
break;
case IW_ENCODE_ALG_AES_CMAC:
ffStrbufAppendS(&wifi->security.algorithm, "CMAC");
break;
}
case IW_ENCODE_ALG_WEP:
ffStrbufAppendS(&wifi->conn.security, "WEP");
break;
case IW_ENCODE_ALG_TKIP:
ffStrbufAppendS(&wifi->conn.security, "TKIP");
break;
case IW_ENCODE_ALG_CCMP:
ffStrbufAppendS(&wifi->conn.security, "CCMP");
break;
case IW_ENCODE_ALG_PMK:
ffStrbufAppendS(&wifi->conn.security, "PMK");
break;
case IW_ENCODE_ALG_AES_CMAC:
ffStrbufAppendS(&wifi->conn.security, "CMAC");
break;
}
} else {
ffStrbufAppendS(&wifi->conn.security, "unknown");
}
close(sock);
@@ -104,13 +299,11 @@ const char* ffDetectWifi(const FFinstance* instance, FFlist* result)
ffStrbufInit(&item->conn.status);
ffStrbufInit(&item->conn.ssid);
ffStrbufInit(&item->conn.macAddress);
ffStrbufInit(&item->conn.phyType);
ffStrbufInit(&item->conn.protocol);
ffStrbufInit(&item->conn.security);
item->conn.signalQuality = 0.0/0.0;
item->conn.rxRate = 0.0/0.0;
item->conn.txRate = 0.0/0.0;
item->security.type = FF_WIFI_SECURITY_UNKNOWN;
item->security.oneXEnabled = false;
ffStrbufInit(&item->security.algorithm);
ffStrbufSetF(&path, "/sys/class/net/%s/operstate", i->if_name);
if(!ffAppendFileBuffer(path.chars, &item->inf.status) || !ffStrbufEqualS(&item->inf.status, "up"))
@@ -126,3 +319,5 @@ const char* ffDetectWifi(const FFinstance* instance, FFlist* result)
return NULL;
}
#endif
+57 -101
View File
@@ -82,13 +82,11 @@ const char* ffDetectWifi(FF_MAYBE_UNUSED const FFinstance* instance, FFlist* res
ffStrbufInit(&item->conn.status);
ffStrbufInit(&item->conn.ssid);
ffStrbufInit(&item->conn.macAddress);
ffStrbufInit(&item->conn.phyType);
ffStrbufInit(&item->conn.protocol);
ffStrbufInit(&item->conn.security);
item->conn.signalQuality = 0.0/0.0;
item->conn.rxRate = 0.0/0.0;
item->conn.txRate = 0.0/0.0;
item->security.type = FF_WIFI_SECURITY_UNKNOWN;
item->security.oneXEnabled = false;
ffStrbufInit(&item->security.algorithm);
ffStrbufSetWS(&item->inf.description, ifInfo->strInterfaceDescription);
convertIfStateToString(ifInfo->isState, &item->inf.status);
@@ -121,40 +119,40 @@ const char* ffDetectWifi(FF_MAYBE_UNUSED const FFinstance* instance, FFlist* res
switch (connInfo->wlanAssociationAttributes.dot11PhyType)
{
case dot11_phy_type_fhss:
ffStrbufAppendS(&item->conn.phyType, "802.11 (FHSS)");
ffStrbufAppendS(&item->conn.protocol, "802.11 (FHSS)");
break;
case dot11_phy_type_dsss:
ffStrbufAppendS(&item->conn.phyType, "802.11 (DSSS)");
ffStrbufAppendS(&item->conn.protocol, "802.11 (DSSS)");
break;
case dot11_phy_type_irbaseband:
ffStrbufAppendS(&item->conn.phyType, "802.11 (IR)");
ffStrbufAppendS(&item->conn.protocol, "802.11 (IR)");
break;
case dot11_phy_type_ofdm:
ffStrbufAppendS(&item->conn.phyType, "802.11a");
ffStrbufAppendS(&item->conn.protocol, "802.11a");
break;
case dot11_phy_type_hrdsss:
ffStrbufAppendS(&item->conn.phyType, "802.11b");
ffStrbufAppendS(&item->conn.protocol, "802.11b");
break;
case dot11_phy_type_erp:
ffStrbufAppendS(&item->conn.phyType, "802.11g");
ffStrbufAppendS(&item->conn.protocol, "802.11g");
break;
case dot11_phy_type_ht:
ffStrbufAppendS(&item->conn.phyType, "802.11n (Wi-Fi 4)");
ffStrbufAppendS(&item->conn.protocol, "802.11n (Wi-Fi 4)");
break;
case 8 /*dot11_phy_type_vht*/:
ffStrbufAppendS(&item->conn.phyType, "802.11ac (Wi-Fi 5)");
ffStrbufAppendS(&item->conn.protocol, "802.11ac (Wi-Fi 5)");
break;
case 9 /*dot11_phy_type_dmg*/:
ffStrbufAppendS(&item->conn.phyType, "802.11ad (WiGig)");
ffStrbufAppendS(&item->conn.protocol, "802.11ad (WiGig)");
break;
case 10 /*dot11_phy_type_he*/:
ffStrbufAppendS(&item->conn.phyType, "802.11ax (Wi-Fi 6)");
ffStrbufAppendS(&item->conn.protocol, "802.11ax (Wi-Fi 6)");
break;
case 11 /*dot11_phy_type_eht*/:
ffStrbufAppendS(&item->conn.phyType, "802.11be (Wi-Fi 7)");
ffStrbufAppendS(&item->conn.protocol, "802.11be (Wi-Fi 7)");
break;
default:
ffStrbufAppendF(&item->conn.phyType, "Unknown (%u)", (unsigned)connInfo->wlanAssociationAttributes.dot11PhyType);
ffStrbufAppendF(&item->conn.protocol, "Unknown (%u)", (unsigned)connInfo->wlanAssociationAttributes.dot11PhyType);
break;
}
@@ -162,93 +160,51 @@ const char* ffDetectWifi(FF_MAYBE_UNUSED const FFinstance* instance, FFlist* res
item->conn.rxRate = connInfo->wlanAssociationAttributes.ulRxRate;
item->conn.txRate = connInfo->wlanAssociationAttributes.ulTxRate;
item->security.type = connInfo->wlanSecurityAttributes.bSecurityEnabled ? FF_WIFI_SECURITY_ENABLED : FF_WIFI_SECURITY_DISABLED;
item->security.oneXEnabled = connInfo->wlanSecurityAttributes.bOneXEnabled;
switch (connInfo->wlanSecurityAttributes.dot11AuthAlgorithm)
if(connInfo->wlanSecurityAttributes.bSecurityEnabled)
{
case DOT11_AUTH_ALGO_80211_OPEN:
ffStrbufAppendS(&item->security.algorithm, "802.11 Open");
break;
case DOT11_AUTH_ALGO_80211_SHARED_KEY:
ffStrbufAppendS(&item->security.algorithm, "802.11 Shared");
break;
case DOT11_AUTH_ALGO_WPA:
ffStrbufAppendS(&item->security.algorithm, "WPA");
break;
case DOT11_AUTH_ALGO_WPA_PSK:
ffStrbufAppendS(&item->security.algorithm, "WPA-PSK");
break;
case DOT11_AUTH_ALGO_WPA_NONE:
ffStrbufAppendS(&item->security.algorithm, "WPA-None");
break;
case DOT11_AUTH_ALGO_RSNA:
ffStrbufAppendS(&item->security.algorithm, "RSNA");
break;
case DOT11_AUTH_ALGO_RSNA_PSK:
ffStrbufAppendS(&item->security.algorithm, "RSNA with PSK");
break;
case 8 /* DOT11_AUTH_ALGO_WPA3 */:
ffStrbufAppendS(&item->security.algorithm, "WPA3");
break;
case 9 /* DOT11_AUTH_ALGO_WPA3_SAE */:
ffStrbufAppendS(&item->security.algorithm, "WPA3-SAE");
break;
case 10 /* DOT11_AUTH_ALGO_OWE */:
ffStrbufAppendS(&item->security.algorithm, "OWE");
break;
case 11 /* DOT11_AUTH_ALGO_WPA3_ENT */:
ffStrbufAppendS(&item->security.algorithm, "OWE-ENT");
break;
default:
ffStrbufAppendF(&item->security.algorithm, "Unknown (%u)", (unsigned)connInfo->wlanSecurityAttributes.dot11AuthAlgorithm);
break;
}
ffStrbufAppendS(&item->security.algorithm, " - ");
switch (connInfo->wlanSecurityAttributes.dot11CipherAlgorithm)
{
case DOT11_CIPHER_ALGO_NONE:
ffStrbufAppendS(&item->security.algorithm, "None");
break;
case DOT11_CIPHER_ALGO_WEP40:
ffStrbufAppendS(&item->security.algorithm, "WEP-40");
break;
case DOT11_CIPHER_ALGO_TKIP:
ffStrbufAppendS(&item->security.algorithm, "TKIP");
break;
case DOT11_CIPHER_ALGO_CCMP:
ffStrbufAppendS(&item->security.algorithm, "CCMP");
break;
case DOT11_CIPHER_ALGO_WEP104:
ffStrbufAppendS(&item->security.algorithm, "WEP-104");
break;
case 0x06 /* DOT11_CIPHER_ALGO_BIP */:
ffStrbufAppendS(&item->security.algorithm, "BIP-CMAC-128");
break;
case 0x08 /* DOT11_CIPHER_ALGO_GCMP */:
ffStrbufAppendS(&item->security.algorithm, "GCMP-128");
break;
case 0x09 /* DOT11_CIPHER_ALGO_GCMP_256 */:
ffStrbufAppendS(&item->security.algorithm, "GCMP-256");
break;
case 0x0a /* DOT11_CIPHER_ALGO_CCMP_256 */:
ffStrbufAppendS(&item->security.algorithm, "CCMP-256");
break;
case 0x0b /* DOT11_CIPHER_ALGO_BIP_GMAC_128 */:
ffStrbufAppendS(&item->security.algorithm, "BIP-GMAC-128");
break;
case 0x0c /* DOT11_CIPHER_ALGO_BIP_GMAC_256 */:
ffStrbufAppendS(&item->security.algorithm, "BIP-GMAC-256");
break;
case 0x0d /* DOT11_CIPHER_ALGO_BIP_CMAC_256 */:
ffStrbufAppendS(&item->security.algorithm, "BIP-CMAC-256");
break;
case DOT11_CIPHER_ALGO_WEP:
ffStrbufAppendS(&item->security.algorithm, "WEP");
break;
default:
ffStrbufAppendF(&item->security.algorithm, "Unknown (%u)", (unsigned)connInfo->wlanSecurityAttributes.dot11CipherAlgorithm);
break;
switch (connInfo->wlanSecurityAttributes.dot11AuthAlgorithm)
{
case DOT11_AUTH_ALGO_80211_OPEN:
ffStrbufAppendS(&item->conn.security, "802.11 Open");
break;
case DOT11_AUTH_ALGO_80211_SHARED_KEY:
ffStrbufAppendS(&item->conn.security, "802.11 Shared");
break;
case DOT11_AUTH_ALGO_WPA:
ffStrbufAppendS(&item->conn.security, "WPA");
break;
case DOT11_AUTH_ALGO_WPA_PSK:
ffStrbufAppendS(&item->conn.security, "WPA-PSK");
break;
case DOT11_AUTH_ALGO_WPA_NONE:
ffStrbufAppendS(&item->conn.security, "WPA-None");
break;
case DOT11_AUTH_ALGO_RSNA:
ffStrbufAppendS(&item->conn.security, "WPA2");
break;
case DOT11_AUTH_ALGO_RSNA_PSK:
ffStrbufAppendS(&item->conn.security, "WPA2-PSK");
break;
case 8 /* DOT11_AUTH_ALGO_WPA3 */:
ffStrbufAppendS(&item->conn.security, "WPA3");
break;
case 9 /* DOT11_AUTH_ALGO_WPA3_SAE */:
ffStrbufAppendS(&item->conn.security, "WPA3-SAE");
break;
case 10 /* DOT11_AUTH_ALGO_OWE */:
ffStrbufAppendS(&item->conn.security, "OWE");
break;
case 11 /* DOT11_AUTH_ALGO_WPA3_ENT */:
ffStrbufAppendS(&item->conn.security, "OWE-ENT");
break;
default:
ffStrbufAppendF(&item->conn.security, "Unknown (%u)", (unsigned)connInfo->wlanSecurityAttributes.dot11AuthAlgorithm);
break;
}
if(connInfo->wlanSecurityAttributes.bOneXEnabled)
ffStrbufAppendS(&item->conn.security, " 802.11X");
}
ffWlanFreeMemory(connInfo);
}
+4 -4
View File
@@ -373,13 +373,11 @@ static inline void printCommandHelp(const char* command)
"Connection status",
"Connection SSID",
"Connection mac address",
"Connection PHY type",
"Connection protocol",
"Connection signal quality (percentage)",
"Connection RX rate",
"Connection TX rate",
"Security enabled",
"Security 802.1X enabled",
"Security algorithm"
"Connection Security algorithm"
);
}
else if(strcasecmp(command, "player-format") == 0)
@@ -1236,6 +1234,8 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con
optionParseString(key, value, &instance->config.libcJSON);
else if(strcasecmp(subkey, "-wlanapi") == 0)
optionParseString(key, value, &instance->config.libwlanapi);
else if(strcasecmp(subkey, "-nm") == 0)
optionParseString(key, value, &instance->config.libnm);
else
goto error;
}
+1
View File
@@ -163,6 +163,7 @@ typedef struct FFconfig
FFstrbuf libcJSON;
FFstrbuf libfreetype;
FFstrbuf libwlanapi;
FFstrbuf libnm;
bool cpuTemp;
bool gpuTemp;
+10 -12
View File
@@ -3,7 +3,7 @@
#include "detection/wifi/wifi.h"
#define FF_WIFI_MODULE_NAME "Wifi"
#define FF_WIFI_NUM_FORMAT_ARGS 12
#define FF_WIFI_NUM_FORMAT_ARGS 10
void ffPrintWifi(FFinstance* instance)
{
@@ -24,11 +24,11 @@ void ffPrintWifi(FFinstance* instance)
ffPrintLogoAndKey(instance, FF_WIFI_MODULE_NAME, moduleIndex, &instance->config.wifi.key);
if(item->conn.ssid.length)
{
printf("%s - %s", item->conn.ssid.chars, item->conn.phyType.chars);
if(item->security.type == FF_WIFI_SECURITY_DISABLED)
puts(" - insecure");
else
putchar('\n');
printf("%s - %s - %s\n",
item->conn.ssid.chars,
item->conn.protocol.chars,
item->conn.security.length > 0 ? item->conn.security.chars : "insecure"
);
}
else
{
@@ -43,13 +43,11 @@ void ffPrintWifi(FFinstance* instance)
{FF_FORMAT_ARG_TYPE_STRBUF, &item->conn.status},
{FF_FORMAT_ARG_TYPE_STRBUF, &item->conn.ssid},
{FF_FORMAT_ARG_TYPE_STRBUF, &item->conn.macAddress},
{FF_FORMAT_ARG_TYPE_STRBUF, &item->conn.phyType},
{FF_FORMAT_ARG_TYPE_STRBUF, &item->conn.protocol},
{FF_FORMAT_ARG_TYPE_DOUBLE, &item->conn.signalQuality},
{FF_FORMAT_ARG_TYPE_DOUBLE, &item->conn.rxRate},
{FF_FORMAT_ARG_TYPE_DOUBLE, &item->conn.txRate},
{FF_FORMAT_ARG_TYPE_STRING, item->security.type == FF_WIFI_SECURITY_UNKNOWN ? "Unknown" : item->security.type == FF_WIFI_SECURITY_ENABLED ? "Secure" : "Insecure"},
{FF_FORMAT_ARG_TYPE_BOOL, &item->security.oneXEnabled},
{FF_FORMAT_ARG_TYPE_STRBUF, &item->security.algorithm},
{FF_FORMAT_ARG_TYPE_STRBUF, &item->conn.security},
});
}
@@ -58,8 +56,8 @@ void ffPrintWifi(FFinstance* instance)
ffStrbufDestroy(&item->conn.status);
ffStrbufDestroy(&item->conn.ssid);
ffStrbufDestroy(&item->conn.macAddress);
ffStrbufDestroy(&item->conn.phyType);
ffStrbufDestroy(&item->security.algorithm);
ffStrbufDestroy(&item->conn.protocol);
ffStrbufDestroy(&item->conn.security);
}
}
else