mirror of
https://github.com/fastfetch-cli/fastfetch.git
synced 2026-09-13 02:42:09 +02:00
Wifi: detect channel and frequency
This commit is contained in:
@@ -18,6 +18,8 @@ struct FFWifiConnection
|
||||
double signalQuality; // Percentage
|
||||
double rxRate;
|
||||
double txRate;
|
||||
uint16_t channel;
|
||||
uint16_t frequency; // MHz
|
||||
};
|
||||
|
||||
typedef struct FFWifiResult
|
||||
|
||||
@@ -43,6 +43,8 @@ const char* ffDetectWifi(FFlist* result)
|
||||
item->conn.signalQuality = 0.0/0.0;
|
||||
item->conn.rxRate = 0.0/0.0;
|
||||
item->conn.txRate = 0.0/0.0;
|
||||
item->conn.channel = 0;
|
||||
item->conn.frequency = 0;
|
||||
|
||||
ffStrbufAppendS(&item->inf.status, yyjson_get_str(yyjson_obj_get(root, "supplicant_state")));
|
||||
if(!item->inf.status.length)
|
||||
|
||||
@@ -80,6 +80,8 @@ const char* ffDetectWifi(FFlist* result)
|
||||
item->conn.signalQuality = 0.0/0.0;
|
||||
item->conn.rxRate = 0.0/0.0;
|
||||
item->conn.txRate = 0.0/0.0;
|
||||
item->conn.channel = 0;
|
||||
item->conn.frequency = 0;
|
||||
|
||||
ffStrbufAppendS(&item->inf.description, inf.interfaceName.UTF8String);
|
||||
ffStrbufSetStatic(&item->inf.status, inf.powerOn ? "Power On" : "Power Off");
|
||||
@@ -289,6 +291,15 @@ const char* ffDetectWifi(FFlist* result)
|
||||
ffStrbufAppendF(&item->conn.security, "Unknown (%ld)", inf.security);
|
||||
break;
|
||||
}
|
||||
|
||||
item->conn.channel = (uint16_t) inf.wlanChannel.channelNumber;
|
||||
switch (inf.wlanChannel.channelBand)
|
||||
{
|
||||
case kCWChannelBand2GHz: item->conn.frequency = 2400; break;
|
||||
case kCWChannelBand5GHz: item->conn.frequency = 5000; break;
|
||||
case kCWChannelBand6GHz: item->conn.frequency = 6000; break;
|
||||
default: item->conn.frequency = 0; break;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -34,6 +34,8 @@ const char* ffDetectWifi(FFlist* result)
|
||||
item->conn.signalQuality = 0.0/0.0;
|
||||
item->conn.rxRate = 0.0/0.0;
|
||||
item->conn.txRate = 0.0/0.0;
|
||||
item->conn.channel = 0;
|
||||
item->conn.frequency = 0;
|
||||
|
||||
ffParsePropLines(ifconfig.chars, "ssid ", &item->conn.ssid);
|
||||
if (item->conn.ssid.length)
|
||||
|
||||
@@ -339,6 +339,8 @@ const char* ffDetectWifi(FF_MAYBE_UNUSED FFlist* result)
|
||||
item->conn.signalQuality = 0.0/0.0;
|
||||
item->conn.rxRate = 0.0/0.0;
|
||||
item->conn.txRate = 0.0/0.0;
|
||||
item->conn.channel = 0;
|
||||
item->conn.frequency = 0;
|
||||
|
||||
ffStrbufSetF(&buffer, "/sys/class/net/%s/operstate", i->if_name);
|
||||
if (!ffAppendFileBuffer(buffer.chars, &item->inf.status))
|
||||
|
||||
@@ -49,6 +49,7 @@ const char* ffDetectWifi(FFlist* result)
|
||||
FF_LIBRARY_LOAD_SYMBOL_MESSAGE(wlanapi, WlanQueryInterface)
|
||||
FF_LIBRARY_LOAD_SYMBOL_MESSAGE(wlanapi, WlanFreeMemory)
|
||||
FF_LIBRARY_LOAD_SYMBOL_MESSAGE(wlanapi, WlanCloseHandle)
|
||||
FF_LIBRARY_LOAD_SYMBOL_MESSAGE(wlanapi, WlanGetNetworkBssList)
|
||||
|
||||
DWORD curVersion;
|
||||
HANDLE hClient = NULL;
|
||||
@@ -82,21 +83,23 @@ const char* ffDetectWifi(FFlist* result)
|
||||
item->conn.signalQuality = 0.0/0.0;
|
||||
item->conn.rxRate = 0.0/0.0;
|
||||
item->conn.txRate = 0.0/0.0;
|
||||
item->conn.channel = 0;
|
||||
item->conn.frequency = 0;
|
||||
|
||||
convertIfStateToString(ifInfo->isState, &item->inf.status);
|
||||
|
||||
if(ifInfo->isState != wlan_interface_state_connected)
|
||||
continue;
|
||||
|
||||
DWORD connectInfoSize = sizeof(WLAN_CONNECTION_ATTRIBUTES);
|
||||
WLAN_OPCODE_VALUE_TYPE opCode = wlan_opcode_value_type_invalid;
|
||||
WLAN_CONNECTION_ATTRIBUTES* connInfo = NULL;
|
||||
DWORD bufSize = sizeof(*connInfo);
|
||||
WLAN_OPCODE_VALUE_TYPE opCode = wlan_opcode_value_type_query_only;
|
||||
|
||||
if(ffWlanQueryInterface(hClient,
|
||||
&ifInfo->InterfaceGuid,
|
||||
wlan_intf_opcode_current_connection,
|
||||
NULL,
|
||||
&connectInfoSize,
|
||||
&bufSize,
|
||||
(PVOID*)&connInfo,
|
||||
&opCode) != ERROR_SUCCESS
|
||||
) continue;
|
||||
@@ -107,8 +110,8 @@ const char* ffDetectWifi(FFlist* result)
|
||||
(const char *)connInfo->wlanAssociationAttributes.dot11Ssid.ucSSID);
|
||||
|
||||
for (size_t i = 0; i < sizeof(connInfo->wlanAssociationAttributes.dot11Bssid); i++)
|
||||
ffStrbufAppendF(&item->conn.bssid, "%.2X-", connInfo->wlanAssociationAttributes.dot11Bssid[i]);
|
||||
ffStrbufTrimRight(&item->conn.bssid, '-');
|
||||
ffStrbufAppendF(&item->conn.bssid, "%.2X:", connInfo->wlanAssociationAttributes.dot11Bssid[i]);
|
||||
ffStrbufTrimRight(&item->conn.bssid, ':');
|
||||
|
||||
switch (connInfo->wlanAssociationAttributes.dot11PhyType)
|
||||
{
|
||||
@@ -201,7 +204,34 @@ const char* ffDetectWifi(FFlist* result)
|
||||
else
|
||||
ffStrbufAppendS(&item->conn.security, "Insecure");
|
||||
|
||||
WLAN_BSS_LIST* bssList = NULL;
|
||||
if (ffWlanGetNetworkBssList(hClient,
|
||||
&ifInfo->InterfaceGuid,
|
||||
&connInfo->wlanAssociationAttributes.dot11Ssid,
|
||||
connInfo->wlanAssociationAttributes.dot11BssType,
|
||||
connInfo->wlanSecurityAttributes.bSecurityEnabled,
|
||||
NULL,
|
||||
&bssList) == ERROR_SUCCESS && bssList->dwNumberOfItems > 0
|
||||
) {
|
||||
item->conn.frequency = (uint16_t) (bssList->wlanBssEntries[0].ulChCenterFrequency / 1000);
|
||||
ffWlanFreeMemory(bssList);
|
||||
}
|
||||
|
||||
ffWlanFreeMemory(connInfo);
|
||||
|
||||
ULONG* channelNumber = 0;
|
||||
bufSize = sizeof(*channelNumber);
|
||||
if(ffWlanQueryInterface(hClient,
|
||||
&ifInfo->InterfaceGuid,
|
||||
wlan_intf_opcode_channel_number,
|
||||
NULL,
|
||||
&bufSize,
|
||||
(PVOID*)&channelNumber,
|
||||
&opCode) == ERROR_SUCCESS
|
||||
) {
|
||||
item->conn.channel = (uint16_t) *channelNumber;
|
||||
ffWlanFreeMemory(channelNumber);
|
||||
}
|
||||
}
|
||||
|
||||
exit:
|
||||
|
||||
@@ -181,6 +181,8 @@ void ffGenerateWifiJsonResult(FF_MAYBE_UNUSED FFWifiOptions* options, yyjson_mut
|
||||
yyjson_mut_obj_add_real(doc, conn, "signalQuality", wifi->conn.signalQuality);
|
||||
yyjson_mut_obj_add_real(doc, conn, "rxRate", wifi->conn.rxRate);
|
||||
yyjson_mut_obj_add_real(doc, conn, "txRate", wifi->conn.txRate);
|
||||
yyjson_mut_obj_add_uint(doc, conn, "channel", wifi->conn.channel);
|
||||
yyjson_mut_obj_add_uint(doc, conn, "frequency", wifi->conn.frequency);
|
||||
}
|
||||
|
||||
FF_LIST_FOR_EACH(FFWifiResult, item, result)
|
||||
|
||||
Reference in New Issue
Block a user