From 974dc962592d1ddd296ba0ca376526212ccff4f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Mon, 28 Nov 2022 15:13:47 +0800 Subject: [PATCH] Wifi: support multiple interfaces --- src/detection/wifi/wifi.h | 4 +- src/detection/wifi/wifi_nosupport.c | 4 +- src/detection/wifi/wifi_windows.c | 315 ++++++++++++++-------------- src/modules/wifi.c | 100 ++++----- 4 files changed, 212 insertions(+), 211 deletions(-) diff --git a/src/detection/wifi/wifi.h b/src/detection/wifi/wifi.h index 39ffa293b..e16c95e7d 100644 --- a/src/detection/wifi/wifi.h +++ b/src/detection/wifi/wifi.h @@ -35,10 +35,8 @@ typedef struct FFWifiResult struct FFWifiInterface inf; struct FFWifiConnection conn; struct FFWifiSecurity security; - - FFstrbuf error; } FFWifiResult; -void ffDetectWifi(const FFinstance* instance, FFWifiResult* result); +const char* ffDetectWifi(const FFinstance* instance, FFlist* result /*list of FFWifiItem*/); #endif diff --git a/src/detection/wifi/wifi_nosupport.c b/src/detection/wifi/wifi_nosupport.c index 98d82f19b..0bfc199d1 100644 --- a/src/detection/wifi/wifi_nosupport.c +++ b/src/detection/wifi/wifi_nosupport.c @@ -1,7 +1,7 @@ #include "wifi.h" -void ffDetectWifi(const FFinstance* instance, FFWifiResult* result) +const char* ffDetectWifi(const FFinstance* instance, FFlist* result) { FF_UNUSED(instance); - ffStrbufAppendS(&result->error, "Not supported on this platform"); + return "Not supported on this platform"; } diff --git a/src/detection/wifi/wifi_windows.c b/src/detection/wifi/wifi_windows.c index 22a71a9f9..4e5dc5e2a 100644 --- a/src/detection/wifi/wifi_windows.c +++ b/src/detection/wifi/wifi_windows.c @@ -40,7 +40,7 @@ static void convertIfStateToString(WLAN_INTERFACE_STATE state, FFstrbuf* result) } } -static const char* detectWifiImpl(const FFinstance* instance, FFWifiResult* result) +const char* ffDetectWifi(const FFinstance* instance, FFlist* result) { FF_LIBRARY_LOAD(wlanapi, &instance->config.libcJSON, "dlopen wlanapi"FF_LIBRARY_EXTENSION" failed", "wlanapi"FF_LIBRARY_EXTENSION, 1) FF_LIBRARY_LOAD_SYMBOL_MESSAGE(wlanapi, WlanOpenHandle) @@ -52,10 +52,9 @@ static const char* detectWifiImpl(const FFinstance* instance, FFWifiResult* resu DWORD curVersion; HANDLE hClient = NULL; WLAN_INTERFACE_INFO_LIST* ifList = NULL; - WLAN_CONNECTION_ATTRIBUTES* connInfo = NULL; const char* error = NULL; - if(ffWlanOpenHandle(1, NULL, &curVersion, &hClient) != ERROR_SUCCESS) + if(ffWlanOpenHandle(2, NULL, &curVersion, &hClient) != ERROR_SUCCESS) { error = "WlanOpenHandle() failed"; goto exit; @@ -73,170 +72,187 @@ static const char* detectWifiImpl(const FFinstance* instance, FFWifiResult* resu goto exit; } - WLAN_INTERFACE_INFO* ifInfo = (WLAN_INTERFACE_INFO*)&ifList->InterfaceInfo[0]; - ffStrbufSetWS(&result->inf.description, ifInfo->strInterfaceDescription); - convertIfStateToString(ifInfo->isState, &result->inf.status); - - if(ifInfo->isState != wlan_interface_state_connected) - goto exit; - - DWORD connectInfoSize = sizeof(WLAN_CONNECTION_ATTRIBUTES); - WLAN_OPCODE_VALUE_TYPE opCode = wlan_opcode_value_type_invalid; - - if(ffWlanQueryInterface(hClient, - &ifInfo->InterfaceGuid, - wlan_intf_opcode_current_connection, - NULL, - &connectInfoSize, - (PVOID*)&connInfo, - &opCode) != ERROR_SUCCESS) + for(uint32_t index = 0; index < ifList->dwNumberOfItems; ++index) { - error = "WlanQueryInterface() failed"; - goto exit; - } + WLAN_INTERFACE_INFO* ifInfo = (WLAN_INTERFACE_INFO*)&ifList->InterfaceInfo[index]; - convertIfStateToString(connInfo->isState, &result->conn.status); - ffStrbufAppendNS(&result->conn.ssid, - connInfo->wlanAssociationAttributes.dot11Ssid.uSSIDLength, - (const char *)connInfo->wlanAssociationAttributes.dot11Ssid.ucSSID); + 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.phyType); + item->conn.signalQuality = 0.0/0.0; + item->conn.rxRate = 0.0/0.0; + item->conn.txRate = 0.0/0.0; + item->security.enabled = false; + item->security.oneXEnabled = false; + ffStrbufInit(&item->security.authAlgo); + ffStrbufInit(&item->security.cipherAlgo); - for (size_t i = 0; i < sizeof(connInfo->wlanAssociationAttributes.dot11Bssid); i++) - ffStrbufAppendF(&result->conn.macAddress, "%.2X-", connInfo->wlanAssociationAttributes.dot11Bssid[i]); - ffStrbufTrimRight(&result->conn.macAddress, '-'); + ffStrbufSetWS(&item->inf.description, ifInfo->strInterfaceDescription); + convertIfStateToString(ifInfo->isState, &item->inf.status); - switch (connInfo->wlanAssociationAttributes.dot11PhyType) - { - case dot11_phy_type_fhss: - ffStrbufAppendS(&result->conn.phyType, "802.11 (FHSS)"); + 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; + + if(ffWlanQueryInterface(hClient, + &ifInfo->InterfaceGuid, + wlan_intf_opcode_current_connection, + NULL, + &connectInfoSize, + (PVOID*)&connInfo, + &opCode) != ERROR_SUCCESS + ) continue; + + convertIfStateToString(connInfo->isState, &item->conn.status); + ffStrbufAppendNS(&item->conn.ssid, + connInfo->wlanAssociationAttributes.dot11Ssid.uSSIDLength, + (const char *)connInfo->wlanAssociationAttributes.dot11Ssid.ucSSID); + + for (size_t i = 0; i < sizeof(connInfo->wlanAssociationAttributes.dot11Bssid); i++) + ffStrbufAppendF(&item->conn.macAddress, "%.2X-", connInfo->wlanAssociationAttributes.dot11Bssid[i]); + ffStrbufTrimRight(&item->conn.macAddress, '-'); + + switch (connInfo->wlanAssociationAttributes.dot11PhyType) + { + case dot11_phy_type_fhss: + ffStrbufAppendS(&item->conn.phyType, "802.11 (FHSS)"); + break; + case dot11_phy_type_dsss: + ffStrbufAppendS(&item->conn.phyType, "802.11 (DSSS)"); + break; + case dot11_phy_type_irbaseband: + ffStrbufAppendS(&item->conn.phyType, "802.11 (IR)"); + break; + case dot11_phy_type_ofdm: + ffStrbufAppendS(&item->conn.phyType, "802.11a"); + break; + case dot11_phy_type_hrdsss: + ffStrbufAppendS(&item->conn.phyType, "802.11b"); + break; + case dot11_phy_type_erp: + ffStrbufAppendS(&item->conn.phyType, "802.11g"); + break; + case dot11_phy_type_ht: + ffStrbufAppendS(&item->conn.phyType, "802.11n (Wi-Fi 4)"); + break; + case 8 /*dot11_phy_type_vht*/: + ffStrbufAppendS(&item->conn.phyType, "802.11ac (Wi-Fi 5)"); + break; + case 9 /*dot11_phy_type_dmg*/: + ffStrbufAppendS(&item->conn.phyType, "802.11ad (WiGig)"); + break; + case 10 /*dot11_phy_type_he*/: + ffStrbufAppendS(&item->conn.phyType, "802.11ax (Wi-Fi 6)"); + break; + case 11 /*dot11_phy_type_eht*/: + ffStrbufAppendS(&item->conn.phyType, "802.11be (Wi-Fi 7)"); + break; + default: + ffStrbufAppendF(&item->conn.phyType, "Unknown (%u)", (unsigned)connInfo->wlanAssociationAttributes.dot11PhyType); + break; + } + + item->conn.signalQuality = connInfo->wlanAssociationAttributes.wlanSignalQuality; + item->conn.rxRate = connInfo->wlanAssociationAttributes.ulRxRate; + item->conn.txRate = connInfo->wlanAssociationAttributes.ulTxRate; + + item->security.enabled = connInfo->wlanSecurityAttributes.bSecurityEnabled; + item->security.oneXEnabled = connInfo->wlanSecurityAttributes.bOneXEnabled; + switch (connInfo->wlanSecurityAttributes.dot11AuthAlgorithm) + { + case DOT11_AUTH_ALGO_80211_OPEN: + ffStrbufAppendS(&item->security.authAlgo, "802.11 Open"); + break; + case DOT11_AUTH_ALGO_80211_SHARED_KEY: + ffStrbufAppendS(&item->security.authAlgo, "802.11 Shared"); + break; + case DOT11_AUTH_ALGO_WPA: + ffStrbufAppendS(&item->security.authAlgo, "WPA"); + break; + case DOT11_AUTH_ALGO_WPA_PSK: + ffStrbufAppendS(&item->security.authAlgo, "WPA-PSK"); + break; + case DOT11_AUTH_ALGO_WPA_NONE: + ffStrbufAppendS(&item->security.authAlgo, "WPA-None"); + break; + case DOT11_AUTH_ALGO_RSNA: + ffStrbufAppendS(&item->security.authAlgo, "RSNA"); + break; + case DOT11_AUTH_ALGO_RSNA_PSK: + ffStrbufAppendS(&item->security.authAlgo, "RSNA with PSK"); + break; + case 8 /* DOT11_AUTH_ALGO_WPA3 */: + ffStrbufAppendS(&item->security.authAlgo, "WPA3"); + break; + case 9 /* DOT11_AUTH_ALGO_WPA3_SAE */: + ffStrbufAppendS(&item->security.authAlgo, "WPA3-SAE"); + break; + case 10 /* DOT11_AUTH_ALGO_OWE */: + ffStrbufAppendS(&item->security.authAlgo, "OWE"); + break; + case 11 /* DOT11_AUTH_ALGO_WPA3_ENT */: + ffStrbufAppendS(&item->security.authAlgo, "OWE-ENT"); + break; + default: + ffStrbufAppendF(&item->security.authAlgo, "Unknown (%u)", (unsigned)connInfo->wlanSecurityAttributes.dot11AuthAlgorithm); + break; + } + switch (connInfo->wlanSecurityAttributes.dot11CipherAlgorithm) + { + case DOT11_CIPHER_ALGO_NONE: + ffStrbufAppendS(&item->security.cipherAlgo, "None"); break; - case dot11_phy_type_dsss: - ffStrbufAppendS(&result->conn.phyType, "802.11 (DSSS)"); + case DOT11_CIPHER_ALGO_WEP40: + ffStrbufAppendS(&item->security.cipherAlgo, "WEP-40"); break; - case dot11_phy_type_irbaseband: - ffStrbufAppendS(&result->conn.phyType, "802.11 (IR)"); + case DOT11_CIPHER_ALGO_TKIP: + ffStrbufAppendS(&item->security.cipherAlgo, "TKIP"); break; - case dot11_phy_type_ofdm: - ffStrbufAppendS(&result->conn.phyType, "802.11a"); + case DOT11_CIPHER_ALGO_CCMP: + ffStrbufAppendS(&item->security.cipherAlgo, "CCMP"); break; - case dot11_phy_type_hrdsss: - ffStrbufAppendS(&result->conn.phyType, "802.11b"); + case DOT11_CIPHER_ALGO_WEP104: + ffStrbufAppendS(&item->security.cipherAlgo, "WEP-104"); break; - case dot11_phy_type_erp: - ffStrbufAppendS(&result->conn.phyType, "802.11g"); + case 0x06 /* DOT11_CIPHER_ALGO_BIP */: + ffStrbufAppendS(&item->security.cipherAlgo, "BIP-CMAC-128"); break; - case dot11_phy_type_ht: - ffStrbufAppendS(&result->conn.phyType, "802.11n (Wi-Fi 4)"); + case 0x08 /* DOT11_CIPHER_ALGO_GCMP */: + ffStrbufAppendS(&item->security.cipherAlgo, "GCMP-128"); break; - case 8 /*dot11_phy_type_vht*/: - ffStrbufAppendS(&result->conn.phyType, "802.11ac (Wi-Fi 5)"); + case 0x09 /* DOT11_CIPHER_ALGO_GCMP_256 */: + ffStrbufAppendS(&item->security.cipherAlgo, "GCMP-256"); break; - case 9 /*dot11_phy_type_dmg*/: - ffStrbufAppendS(&result->conn.phyType, "802.11ad (WiGig)"); + case 0x0a /* DOT11_CIPHER_ALGO_CCMP_256 */: + ffStrbufAppendS(&item->security.cipherAlgo, "CCMP-256"); break; - case 10 /*dot11_phy_type_he*/: - ffStrbufAppendS(&result->conn.phyType, "802.11ax (Wi-Fi 6)"); + case 0x0b /* DOT11_CIPHER_ALGO_BIP_GMAC_128 */: + ffStrbufAppendS(&item->security.cipherAlgo, "BIP-GMAC-128"); break; - case 11 /*dot11_phy_type_eht*/: - ffStrbufAppendS(&result->conn.phyType, "802.11be (Wi-Fi 7)"); + case 0x0c /* DOT11_CIPHER_ALGO_BIP_GMAC_256 */: + ffStrbufAppendS(&item->security.cipherAlgo, "BIP-GMAC-256"); + break; + case 0x0d /* DOT11_CIPHER_ALGO_BIP_CMAC_256 */: + ffStrbufAppendS(&item->security.cipherAlgo, "BIP-CMAC-256"); + break; + case DOT11_CIPHER_ALGO_WEP: + ffStrbufAppendS(&item->security.cipherAlgo, "WEP"); break; default: - ffStrbufAppendF(&result->conn.phyType, "Unknown (%u)", (unsigned)connInfo->wlanAssociationAttributes.dot11PhyType); + ffStrbufAppendF(&item->security.cipherAlgo, "Unknown (%u)", (unsigned)connInfo->wlanSecurityAttributes.dot11CipherAlgorithm); break; - } - - result->conn.signalQuality = connInfo->wlanAssociationAttributes.wlanSignalQuality; - result->conn.rxRate = connInfo->wlanAssociationAttributes.ulRxRate; - result->conn.txRate = connInfo->wlanAssociationAttributes.ulTxRate; - - result->security.enabled = connInfo->wlanSecurityAttributes.bSecurityEnabled; - result->security.oneXEnabled = connInfo->wlanSecurityAttributes.bOneXEnabled; - switch (connInfo->wlanSecurityAttributes.dot11AuthAlgorithm) - { - case DOT11_AUTH_ALGO_80211_OPEN: - ffStrbufAppendS(&result->security.authAlgo, "802.11 Open"); - break; - case DOT11_AUTH_ALGO_80211_SHARED_KEY: - ffStrbufAppendS(&result->security.authAlgo, "802.11 Shared"); - break; - case DOT11_AUTH_ALGO_WPA: - ffStrbufAppendS(&result->security.authAlgo, "WPA"); - break; - case DOT11_AUTH_ALGO_WPA_PSK: - ffStrbufAppendS(&result->security.authAlgo, "WPA-PSK"); - break; - case DOT11_AUTH_ALGO_WPA_NONE: - ffStrbufAppendS(&result->security.authAlgo, "WPA-None"); - break; - case DOT11_AUTH_ALGO_RSNA: - ffStrbufAppendS(&result->security.authAlgo, "RSNA"); - break; - case DOT11_AUTH_ALGO_RSNA_PSK: - ffStrbufAppendS(&result->security.authAlgo, "RSNA with PSK"); - break; - case 8 /* DOT11_AUTH_ALGO_WPA3 */: - ffStrbufAppendS(&result->security.authAlgo, "WPA3"); - break; - case 9 /* DOT11_AUTH_ALGO_WPA3_SAE */: - ffStrbufAppendS(&result->security.authAlgo, "WPA3-SAE"); - break; - case 10 /* DOT11_AUTH_ALGO_OWE */: - ffStrbufAppendS(&result->security.authAlgo, "OWE"); - break; - case 11 /* DOT11_AUTH_ALGO_WPA3_ENT */: - ffStrbufAppendS(&result->security.authAlgo, "OWE-ENT"); - break; - default: - ffStrbufAppendF(&result->security.authAlgo, "Unknown (%u)", (unsigned)connInfo->wlanSecurityAttributes.dot11AuthAlgorithm); - break; - } - switch (connInfo->wlanSecurityAttributes.dot11CipherAlgorithm) - { - case DOT11_CIPHER_ALGO_NONE: - ffStrbufAppendS(&result->security.cipherAlgo, "None"); - break; - case DOT11_CIPHER_ALGO_WEP40: - ffStrbufAppendS(&result->security.cipherAlgo, "WEP-40"); - break; - case DOT11_CIPHER_ALGO_TKIP: - ffStrbufAppendS(&result->security.cipherAlgo, "TKIP"); - break; - case DOT11_CIPHER_ALGO_CCMP: - ffStrbufAppendS(&result->security.cipherAlgo, "CCMP"); - break; - case DOT11_CIPHER_ALGO_WEP104: - ffStrbufAppendS(&result->security.cipherAlgo, "WEP-104"); - break; - case 0x06 /* DOT11_CIPHER_ALGO_BIP */: - ffStrbufAppendS(&result->security.cipherAlgo, "BIP-CMAC-128"); - break; - case 0x08 /* DOT11_CIPHER_ALGO_GCMP */: - ffStrbufAppendS(&result->security.cipherAlgo, "GCMP-128"); - break; - case 0x09 /* DOT11_CIPHER_ALGO_GCMP_256 */: - ffStrbufAppendS(&result->security.cipherAlgo, "GCMP-256"); - break; - case 0x0a /* DOT11_CIPHER_ALGO_CCMP_256 */: - ffStrbufAppendS(&result->security.cipherAlgo, "CCMP-256"); - break; - case 0x0b /* DOT11_CIPHER_ALGO_BIP_GMAC_128 */: - ffStrbufAppendS(&result->security.cipherAlgo, "BIP-GMAC-128"); - break; - case 0x0c /* DOT11_CIPHER_ALGO_BIP_GMAC_256 */: - ffStrbufAppendS(&result->security.cipherAlgo, "BIP-GMAC-256"); - break; - case 0x0d /* DOT11_CIPHER_ALGO_BIP_CMAC_256 */: - ffStrbufAppendS(&result->security.cipherAlgo, "BIP-CMAC-256"); - break; - case DOT11_CIPHER_ALGO_WEP: - ffStrbufAppendS(&result->security.cipherAlgo, "WEP"); - break; - default: - ffStrbufAppendF(&result->security.cipherAlgo, "Unknown (%u)", (unsigned)connInfo->wlanSecurityAttributes.dot11CipherAlgorithm); - break; + } + ffWlanFreeMemory(connInfo); } exit: - if(connInfo) ffWlanFreeMemory(connInfo); if(ifList) ffWlanFreeMemory(ifList); if(hClient) ffWlanCloseHandle(hClient, NULL); dlclose(wlanapi); @@ -244,8 +260,3 @@ exit: } #pragma GCC diagnostic pop - -void ffDetectWifi(const FFinstance* instance, FFWifiResult* result) -{ - ffStrbufAppendS(&result->error, detectWifiImpl(instance, result)); -} diff --git a/src/modules/wifi.c b/src/modules/wifi.c index 1e5ddab20..7f075d4b4 100644 --- a/src/modules/wifi.c +++ b/src/modules/wifi.c @@ -7,73 +7,65 @@ void ffPrintWifi(FFinstance* instance) { - FFWifiResult result; - ffStrbufInit(&result.inf.description); - ffStrbufInit(&result.inf.status); - ffStrbufInit(&result.conn.status); - ffStrbufInit(&result.conn.ssid); - ffStrbufInit(&result.conn.macAddress); - ffStrbufInit(&result.conn.phyType); - result.conn.signalQuality = 0.0/0.0; - result.conn.rxRate = 0.0/0.0; - result.conn.txRate = 0.0/0.0; - result.security.enabled = false; - result.security.oneXEnabled = false; - ffStrbufInit(&result.security.authAlgo); - ffStrbufInit(&result.security.cipherAlgo); - ffStrbufInit(&result.error); + FFlist result; + ffListInit(&result, sizeof(FFWifiResult)); - ffDetectWifi(instance, &result); + const char* error = ffDetectWifi(instance, &result); - if(!result.error.length) + if(!error) { - if(instance->config.wifi.outputFormat.length == 0) + for(uint32_t index = 0; index < result.length; ++index) { - ffPrintLogoAndKey(instance, FF_WIFI_MODULE_NAME, 0, &instance->config.wifi.key); - if(result.conn.ssid.length) + FFWifiResult* item = (FFWifiResult*)ffListGet(&result, index); + uint8_t moduleIndex = result.length == 1 ? 0 : (uint8_t)(index + 1); + + if(instance->config.wifi.outputFormat.length == 0) { - printf("%s - %s", result.conn.ssid.chars, result.conn.phyType.chars); - if(!result.security.enabled) - puts(" - insecure"); + 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.enabled) + puts(" - insecure"); + else + putchar('\n'); + } else - putchar('\n'); + { + puts(item->inf.status.chars); + } } else { - puts(result.inf.status.chars); + ffPrintFormat(instance, FF_WIFI_MODULE_NAME, moduleIndex, &instance->config.wifi, FF_WIFI_NUM_FORMAT_ARGS, (FFformatarg[]){ + {FF_FORMAT_ARG_TYPE_STRBUF, &item->inf.description}, + {FF_FORMAT_ARG_TYPE_STRBUF, &item->inf.status}, + {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_DOUBLE, &item->conn.signalQuality}, + {FF_FORMAT_ARG_TYPE_DOUBLE, &item->conn.rxRate}, + {FF_FORMAT_ARG_TYPE_DOUBLE, &item->conn.txRate}, + {FF_FORMAT_ARG_TYPE_BOOL, &item->security.enabled}, + {FF_FORMAT_ARG_TYPE_BOOL, &item->security.oneXEnabled}, + {FF_FORMAT_ARG_TYPE_STRBUF, &item->security.authAlgo}, + {FF_FORMAT_ARG_TYPE_STRBUF, &item->security.cipherAlgo}, + }); } - } - else - { - ffPrintFormat(instance, FF_WIFI_MODULE_NAME, 0, &instance->config.wifi, FF_WIFI_NUM_FORMAT_ARGS, (FFformatarg[]){ - {FF_FORMAT_ARG_TYPE_STRBUF, &result.inf.description}, - {FF_FORMAT_ARG_TYPE_STRBUF, &result.inf.status}, - {FF_FORMAT_ARG_TYPE_STRBUF, &result.conn.status}, - {FF_FORMAT_ARG_TYPE_STRBUF, &result.conn.ssid}, - {FF_FORMAT_ARG_TYPE_STRBUF, &result.conn.macAddress}, - {FF_FORMAT_ARG_TYPE_STRBUF, &result.conn.phyType}, - {FF_FORMAT_ARG_TYPE_DOUBLE, &result.conn.signalQuality}, - {FF_FORMAT_ARG_TYPE_DOUBLE, &result.conn.rxRate}, - {FF_FORMAT_ARG_TYPE_DOUBLE, &result.conn.txRate}, - {FF_FORMAT_ARG_TYPE_BOOL, &result.security.enabled}, - {FF_FORMAT_ARG_TYPE_BOOL, &result.security.oneXEnabled}, - {FF_FORMAT_ARG_TYPE_STRBUF, &result.security.authAlgo}, - {FF_FORMAT_ARG_TYPE_STRBUF, &result.security.cipherAlgo}, - }); + + ffStrbufDestroy(&item->inf.description); + ffStrbufDestroy(&item->inf.status); + ffStrbufDestroy(&item->conn.status); + ffStrbufDestroy(&item->conn.ssid); + ffStrbufDestroy(&item->conn.macAddress); + ffStrbufDestroy(&item->conn.phyType); + ffStrbufDestroy(&item->security.authAlgo); + ffStrbufDestroy(&item->security.cipherAlgo); } } else { - ffPrintError(instance, FF_WIFI_MODULE_NAME, 0, &instance->config.wmTheme, "%*s", result.error.length, result.error.chars); + ffPrintError(instance, FF_WIFI_MODULE_NAME, 0, &instance->config.wmTheme, "%s", error); } - - ffStrbufDestroy(&result.inf.description); - ffStrbufDestroy(&result.inf.status); - ffStrbufDestroy(&result.conn.status); - ffStrbufDestroy(&result.conn.ssid); - ffStrbufDestroy(&result.conn.macAddress); - ffStrbufDestroy(&result.conn.phyType); - ffStrbufDestroy(&result.security.authAlgo); - ffStrbufDestroy(&result.security.cipherAlgo); - ffStrbufDestroy(&result.error); }