diff options
| author | Yang You (UU) <[email protected]> | 2025-11-11 16:07:58 -0800 |
|---|---|---|
| committer | Yang You (UU) <[email protected]> | 2025-11-11 16:07:58 -0800 |
| commit | fe139d460e690a27cc98bb9c077eeb5964fc7877 (patch) | |
| tree | f358ad588aa316ef00e0a4ce57f6c73a301f1248 /network | |
| parent | bddbce760509546060b3ccc28a9891b2412d2824 (diff) | |
have the HAL layer created for correctly demo the Interface of WIfireuqest, meanwhile have the WPPTrace enabled for both um and km
Diffstat (limited to 'network')
18 files changed, 2181 insertions, 1655 deletions
diff --git a/network/wlan/WIFICX/drivercode/SharedTypes.h b/network/wlan/WIFICX/drivercode/SharedTypes.h index 237f5997..43fd815a 100644 --- a/network/wlan/WIFICX/drivercode/SharedTypes.h +++ b/network/wlan/WIFICX/drivercode/SharedTypes.h @@ -13,70 +13,4 @@ // ============================= // {bb67559a-06f6-4eb0-81e9-21fdc3b60efb} DEFINE_GUID(GUID_WIFICX_SAMPLE_CLIENT_INTERFACE, 0xbb67559a, 0x06f6, 0x4eb0, 0x81, 0xe9, 0x21, 0xfd, 0xc3, 0xb6, 0x0e, 0xfb); -#define WIFI_DRIVER_DEFAULT_POOL_TAG 'sHIW' // WIFI IHV Sample Driver - -// ============================= -// WDF Object Context Types -// ============================= - -typedef struct _WIFI_DEVICE_CONTEXT -{ - // - // Do not add field variable before WdfTriageInfoPtr. - // NetAdapterCx carving code requires the first field of WDF context - // to be a pointer to WDF_TRIAGE_INFO. - // - void* WdfTriageInfoPtr; - WDFDEVICE WdfDevice; - UCHAR CurrentRadioState; - WDI_GET_ADAPTER_CAPABILITIES_PARAMETERS AdapterCapabilities; - TLV_CONTEXT TlvContext; - UINT32 LastConnectEntryId; - UINT32 LastConnectTransactionId; - WDI_AUTH_ALGORITHM LastAuthAlgo; - DOT11_MAC_ADDRESS ConnectedPeer; - NETADAPTER primaryStaAdapter; -} WIFI_DEVICE_CONTEXT, * PWIFI_DEVICE_CONTEXT; - -WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(WIFI_DEVICE_CONTEXT, WifiGetDeviceContext); -static_assert(FIELD_OFFSET(WIFI_DEVICE_CONTEXT, WdfTriageInfoPtr) == 0); - -// Context for each NetAdapter instance. -// Each NetAdapter instance corresponds to an IP interface -// -typedef struct _WIFI_NETADAPTER_CONTEXT -{ - PWIFI_DEVICE_CONTEXT WifiDeviceContext; // Wdf device context - NETADAPTER NetAdapter; // NetAdapter object - - LIST_ENTRY ReceiveList; - NETPACKETQUEUE TxQueue; // Tx Queue object - NETPACKETQUEUE RxQueue; // Rx Queue object - bool CanReportWifiWakeSourceTypeClientDriverDiagnostic; -} WIFI_NETADAPTER_CONTEXT, * PWIFI_NETADAPTER_CONTEXT; - -WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(WIFI_NETADAPTER_CONTEXT, WifiGetNetAdapterContext); - -typedef struct _PLACEMENT_NEW_ALLOCATION_CONTEXT -{ - size_t cbMaxSize; - _Field_size_bytes_(cbMaxSize) void* pbBuffer; -} PLACEMENT_NEW_ALLOCATION_CONTEXT, * PPLACEMENT_NEW_ALLOCATION_CONTEXT; -typedef const PLACEMENT_NEW_ALLOCATION_CONTEXT* PCPLACEMENT_NEW_ALLOCATION_CONTEXT; - -// for FreeWdfMemoryBuffer to correct get -// the handle to free the memory -struct WIFI_IHV_MEMORY_HEADER -{ - size_t HeaderSize; - WDFMEMORY WdfMemoryHandle; -}; - -// for tracking memory leaks -struct WIFI_IHV_MEMORY_CONTEXT -{ - size_t ContextSize; - void* pvCaller; -}; - -WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(WIFI_IHV_MEMORY_CONTEXT, GetWificxIhvMemoryContextFromHandle); +#define WIFI_DRIVER_DEFAULT_POOL_TAG 'shiW' // WIFI IHV Sample Driver
\ No newline at end of file diff --git a/network/wlan/WIFICX/drivercode/adapter.h b/network/wlan/WIFICX/drivercode/adapter.h index 33a886f0..65e7e023 100644 --- a/network/wlan/WIFICX/drivercode/adapter.h +++ b/network/wlan/WIFICX/drivercode/adapter.h @@ -19,3 +19,14 @@ EVT_NET_ADAPTER_CREATE_RXQUEUE EvtAdapterCreateRxQueue; EVT_WDF_DEVICE_CONTEXT_DESTROY MbbDestroyAdapterContext; NTSTATUS WifiCxTestAdapterStart(_In_ NETADAPTER netAdapter); + + +// Context for each "Wdi Port"[NetAdapter] instance. +// Each NetAdapter instance corresponds to an IP interface +typedef struct _WIFI_IHV_NETADAPTER_CONTEXT +{ + PWIFI_IHV_DEVICE_CONTEXT WifiDeviceContext; // Wdf Ihv device context + NETADAPTER NetAdapter; // NetAdapter object +} WIFI_IHV_NETADAPTER_CONTEXT, * PWIFI_IHV_NETADAPTER_CONTEXT; + +WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(WIFI_IHV_NETADAPTER_CONTEXT, WifiGetIhvNetAdapterContext); diff --git a/network/wlan/WIFICX/drivercode/device.cpp b/network/wlan/WIFICX/drivercode/device.cpp index dbd03566..a0614807 100644 --- a/network/wlan/WIFICX/drivercode/device.cpp +++ b/network/wlan/WIFICX/drivercode/device.cpp @@ -1,6 +1,3 @@ -//------------------------------------------------------------------------------- -// Net Adapter source file -// // Copyright (c) Microsoft Corporation. All rights reserved. #include "precomp.h" @@ -49,21 +46,16 @@ void EvtDeviceSurpriseRemoval(WDFDEVICE device) static NTSTATUS WifiInitAdapterContext(_In_ WDFDEVICE Device, _In_ NETADAPTER NetAdapter) { - PWIFI_DEVICE_CONTEXT deviceContext = WifiGetDeviceContext(Device); - PWIFI_NETADAPTER_CONTEXT netAdapterContext = WifiGetNetAdapterContext(NetAdapter); + PWIFI_IHV_DEVICE_CONTEXT deviceContext = WifiGetIhvDeviceContext(Device); + PWIFI_IHV_NETADAPTER_CONTEXT netAdapterContext = WifiGetIhvNetAdapterContext(NetAdapter); NTSTATUS status = STATUS_SUCCESS; - - deviceContext->LastConnectEntryId = 0; // Disconnected State - deviceContext->LastConnectTransactionId = 0; - deviceContext->CurrentRadioState = TRUE; if (deviceContext->primaryStaAdapter == WDF_NO_HANDLE) { deviceContext->primaryStaAdapter = NetAdapter; } - InitializeListHead(&netAdapterContext->ReceiveList); netAdapterContext->WifiDeviceContext = deviceContext; - netAdapterContext->NetAdapter = NetAdapter; + return status; } @@ -78,7 +70,7 @@ NTSTATUS EvtWifiDeviceCreateAdapter(WDFDEVICE Device, NETADAPTER_INIT* AdapterIn WDF_OBJECT_ATTRIBUTES adapterAttributes; WDF_OBJECT_ATTRIBUTES_INIT(&adapterAttributes); - WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&adapterAttributes, WIFI_NETADAPTER_CONTEXT); + WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&adapterAttributes, WIFI_IHV_NETADAPTER_CONTEXT); adapterAttributes.EvtCleanupCallback = EvtAdapterCleanup; NETADAPTER netAdapter; diff --git a/network/wlan/WIFICX/drivercode/device.h b/network/wlan/WIFICX/drivercode/device.h index ba716fe6..57de18f3 100644 --- a/network/wlan/WIFICX/drivercode/device.h +++ b/network/wlan/WIFICX/drivercode/device.h @@ -1,11 +1,30 @@ // Copyright (C) Microsoft Corporation. All rights reserved. #pragma once - +#include "wifiHAL.h" EVT_WDF_DEVICE_PREPARE_HARDWARE EvtDevicePrepareHardware; EVT_WDF_DEVICE_RELEASE_HARDWARE EvtDeviceReleaseHardware; -EVT_WDF_DEVICE_SURPRISE_REMOVAL EvtDeviceSurpriseRemoval; EVT_WIFI_DEVICE_CREATE_ADAPTER EvtWifiDeviceCreateAdapter; EVT_WIFI_DEVICE_CREATE_WIFIDIRECTDEVICE EvtWifiDeviceCreateWifiDirectDevice; EVT_WIFI_DEVICE_SEND_COMMAND EvtWifiDeviceSendCommand; EVT_WDF_OBJECT_CONTEXT_CLEANUP EvtAdapterCleanup; + +typedef struct _WIFI_IHV_DEVICE_CONTEXT +{ + // + // Do not add field variable before WdfTriageInfoPtr. + // NetAdapterCx carving code requires the first field of WDF context + // to be a pointer to WDF_TRIAGE_INFO. + // + void* WdfTriageInfoPtr; + WDFDEVICE WdfDevice; + WDI_GET_ADAPTER_CAPABILITIES_PARAMETERS AdapterCapabilities; + TLV_CONTEXT TlvContext; + UINT32 LastConnectTransactionId; + WDI_AUTH_ALGORITHM LastAuthAlgo; + NETADAPTER primaryStaAdapter; + WifiHAL* wifiHAL; +} WIFI_IHV_DEVICE_CONTEXT, * PWIFI_IHV_DEVICE_CONTEXT; + +WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(WIFI_IHV_DEVICE_CONTEXT, WifiGetIhvDeviceContext); +static_assert(FIELD_OFFSET(WIFI_IHV_DEVICE_CONTEXT, WdfTriageInfoPtr) == 0); diff --git a/network/wlan/WIFICX/drivercode/driver.cpp b/network/wlan/WIFICX/drivercode/driver.cpp index 2b0e2658..562769ef 100644 --- a/network/wlan/WIFICX/drivercode/driver.cpp +++ b/network/wlan/WIFICX/drivercode/driver.cpp @@ -1,58 +1,94 @@ -//------------------------------------------------------------------------------- -// Net Adapter source file -// // Copyright (c) Microsoft Corporation. All rights reserved. - #include "precomp.h" #include "device.h" +#include "driver.h" #include "driver.tmh" -EXTERN_C __declspec(code_seg("INIT")) DRIVER_INITIALIZE DriverEntry; -EVT_WDF_DRIVER_UNLOAD EvtDriverUnload; -EVT_WDF_DRIVER_DEVICE_ADD EvtDriverDeviceAdd; +extern "C" +NTSTATUS DriverEntry( + _In_ PDRIVER_OBJECT driverObject, + _In_ PUNICODE_STRING registryPath) +/*++ + +Routine Description: + DriverEntry initializes the driver and is the first routine called by the + system after the driver is loaded. DriverEntry specifies the other entry + points in the function driver, such as EvtDevice and DriverUnload. + +Parameters Description: + DriverObject - represents the instance of the function driver that is loaded + into memory. DriverEntry must initialize members of DriverObject before it + returns to the caller. DriverObject is allocated by the system before the + driver is loaded, and it is released by the system after the system unloads + the function driver from memory. + RegistryPath - represents the driver specific path in the Registry. + The function driver can use the path to store driver related data between + reboots. The path does not store hardware instance specific data. -#if __cplusplus >= 201703L -#define MAYBE_UNUSED [[maybe_unused]] -#else -#define MAYBE_UNUSED -#endif +Return Value: -__declspec(code_seg("INIT")) NTSTATUS DriverEntry(_In_ PDRIVER_OBJECT driverObject, _In_ PUNICODE_STRING registryPath) + STATUS_SUCCESS if successful, + STATUS_UNSUCCESSFUL otherwise. + +--*/ { NTSTATUS status = STATUS_SUCCESS; + WDF_DRIVER_CONFIG driverConfig{}; + WDF_OBJECT_ATTRIBUTES attributes; + // + // Initialize WPP Tracing + // WPP_INIT_TRACING(driverObject, registryPath); + + // Since WPP tracing is now initialized, we can use Trace functions TraceEntry(); - WDF_DRIVER_CONFIG driverConfig; - WDF_DRIVER_CONFIG_INIT(&driverConfig, EvtDriverDeviceAdd); - driverConfig.DriverPoolTag = WIFI_DRIVER_DEFAULT_POOL_TAG; - - driverConfig.EvtDriverUnload = EvtDriverUnload; - - WDFDRIVER driver; - status = WdfDriverCreate(driverObject, registryPath, WDF_NO_OBJECT_ATTRIBUTES, &driverConfig, &driver); - if (!NT_SUCCESS(status)) - { - WFCError("WdfDriverCreate failed 0x%x", status); - goto Exit; - } + // + // Register a cleanup callback so that we can call WPP_CLEANUP when + // the framework driver object is deleted during driver unload. + // + WDF_OBJECT_ATTRIBUTES_INIT(&attributes); + attributes.EvtCleanupCallback = EvtWifiDriverContextCleanup; -Exit: - TraceExit(status); + WDF_DRIVER_CONFIG_INIT(&driverConfig, EvtWifiDriverDeviceAdd); + driverConfig.DriverPoolTag = WIFI_DRIVER_DEFAULT_POOL_TAG; + status = WdfDriverCreate(driverObject, registryPath, &attributes, &driverConfig, WDF_NO_HANDLE); if (!NT_SUCCESS(status)) { + WFCError("WdfDriverCreate failed %!STATUS!", status); WPP_CLEANUP(driverObject); + return status; } + //TraceExit(status); + return status; } -NTSTATUS EvtDriverDeviceAdd(_In_ WDFDRIVER driver, _Inout_ PWDFDEVICE_INIT deviceInit) +NTSTATUS EvtWifiDriverDeviceAdd(_In_ WDFDRIVER driver, _Inout_ PWDFDEVICE_INIT deviceInit) +/*++ +Routine Description: + + EvtWifiDriverDeviceAdd is called by the framework in response to AddDevice + call from the PnP manager. We create and initialize a device object to + represent a new instance of the device. + +Arguments: + + Driver - Handle to a framework driver object created in DriverEntry + + DeviceInit - Pointer to a framework-allocated WDFDEVICE_INIT structure. + +Return Value: + + NTSTATUS + +--*/ { UNREFERENCED_PARAMETER(driver); @@ -60,6 +96,7 @@ NTSTATUS EvtDriverDeviceAdd(_In_ WDFDRIVER driver, _Inout_ PWDFDEVICE_INIT devic NTSTATUS status = STATUS_SUCCESS; + // Configure the device init for NetAdapterCx (Data Path) status = NetDeviceInitConfig(deviceInit); if (!NT_SUCCESS(status)) { @@ -67,6 +104,7 @@ NTSTATUS EvtDriverDeviceAdd(_In_ WDFDRIVER driver, _Inout_ PWDFDEVICE_INIT devic goto Exit; } + // Configure the device init for WifiCx (Control Path) status = WifiDeviceInitConfig(deviceInit); if (!NT_SUCCESS(status)) { @@ -74,64 +112,100 @@ NTSTATUS EvtDriverDeviceAdd(_In_ WDFDRIVER driver, _Inout_ PWDFDEVICE_INIT devic goto Exit; } - WDF_OBJECT_ATTRIBUTES deviceAttributes; - WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&deviceAttributes, WIFI_DEVICE_CONTEXT); - + // Set PnP and Power Callbacks. + // [Scope: Only PrepareHardware and ReleaseHardware are implemented in this sample.] WDF_PNPPOWER_EVENT_CALLBACKS pnpPowerCallbacks; WDF_PNPPOWER_EVENT_CALLBACKS_INIT(&pnpPowerCallbacks); pnpPowerCallbacks.EvtDevicePrepareHardware = EvtDevicePrepareHardware; pnpPowerCallbacks.EvtDeviceReleaseHardware = EvtDeviceReleaseHardware; - pnpPowerCallbacks.EvtDeviceSurpriseRemoval = EvtDeviceSurpriseRemoval; - WdfDeviceInitSetPnpPowerEventCallbacks(deviceInit, &pnpPowerCallbacks); - WDFDEVICE wdfDevice; - status = WdfDeviceCreate(&deviceInit, &deviceAttributes, &wdfDevice); + // [Scope: ArmWake and DisarmWake are not implemented in this sample.] + //WDF_POWER_POLICY_EVENT_CALLBACKS powerPolicyCallbacks; + //WdfDeviceInitSetPowerPolicyEventCallbacks(deviceInit, &powerPolicyCallbacks); + + WDFDEVICE wdfIhvDevice{}; + // Create the device object context to store the device specific information + WDF_OBJECT_ATTRIBUTES ihvDeviceAttributes; + WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&ihvDeviceAttributes, WIFI_IHV_DEVICE_CONTEXT); + + status = WdfDeviceCreate(&deviceInit, &ihvDeviceAttributes, &wdfIhvDevice); if (!NT_SUCCESS(status)) { WFCError("WdfDeviceCreate failed, status=0x%x", status); goto Exit; } - - status = WdfDeviceCreateDeviceInterface(wdfDevice, &GUID_WIFICX_SAMPLE_CLIENT_INTERFACE, nullptr); + + // + // Create a device interface so that applications can find and talk + // to us. + // + status = WdfDeviceCreateDeviceInterface(wdfIhvDevice, &GUID_WIFICX_SAMPLE_CLIENT_INTERFACE, nullptr); if (!NT_SUCCESS(status)) { WFCError("WdfDeviceCreateDeviceInterface failed with status=0x%x", status); goto Exit; } - // Set the device to be not ejectable - WDF_DEVICE_PNP_CAPABILITIES pnpCapabilities; - WDF_DEVICE_PNP_CAPABILITIES_INIT(&pnpCapabilities); - pnpCapabilities.SurpriseRemovalOK = WdfTrue; - WdfDeviceSetPnpCapabilities(wdfDevice, &pnpCapabilities); - + // Initialize WifiCx device now that the WDFDEVICE has been created. + // In short the WifICx is the "wdf managed WDI", so the Wdi core + // concepts still applies. WIFI_DEVICE_CONFIG wifiDeviceConfig; WIFI_DEVICE_CONFIG_INIT( - &wifiDeviceConfig, WDI_VERSION_LATEST, EvtWifiDeviceSendCommand, EvtWifiDeviceCreateAdapter, nullptr); + &wifiDeviceConfig, + WDI_VERSION_LATEST, // The "WDI" version supported by this Ihv driver + EvtWifiDeviceSendCommand, // The Wdi command and task, now called "wifirequest". + EvtWifiDeviceCreateAdapter, // The Wdi "ports", now support by the netadapter instances. + nullptr); // [Scope: No WiFi Direct support in this sample] - status = WifiDeviceInitialize(wdfDevice, &wifiDeviceConfig); + // Initialize the WifiCx device with the configuration above to let OS side ready. + status = WifiDeviceInitialize(wdfIhvDevice, &wifiDeviceConfig); if (!NT_SUCCESS(status)) { WFCError("WifiDeviceInitialize failed, status=0x%x", status); goto Exit; } - PWIFI_DEVICE_CONTEXT deviceContext = WifiGetDeviceContext(wdfDevice); - deviceContext->WdfDevice = wdfDevice; - deviceContext->WdfTriageInfoPtr = WdfGetTriageInfo(); + // Get a pointer to the device context structure that we just associated + // with the device object. We define this structure in the device.h + // header file. WifiGetIhvDeviceContext is an inline function generated by + // using the WDF_DECLARE_CONTEXT_TYPE_WITH_NAME macro in device.h. + // This function will do the type checking and return the device context. + // If you pass a wrong object handle it will return NULL and assert if + // run under framework verifier mode. + auto deviceIhvContext = WifiGetIhvDeviceContext(wdfIhvDevice); + deviceIhvContext->WdfDevice = wdfIhvDevice; + deviceIhvContext->WdfTriageInfoPtr = WdfGetTriageInfo(); - deviceContext->TlvContext.AllocationContext = 0; - deviceContext->TlvContext.PeerVersion = WifiDeviceGetOsWdiVersion(wdfDevice); + deviceIhvContext->TlvContext.AllocationContext = 0; + deviceIhvContext->TlvContext.PeerVersion = WifiDeviceGetOsWdiVersion(wdfIhvDevice); Exit: TraceExit(status); return status; } -void EvtDriverUnload(MAYBE_UNUSED _In_ WDFDRIVER driver) +void EvtWifiDriverContextCleanup(_In_ WDFOBJECT DriverObject) +/*++ +Routine Description: + + Free all the resources allocated in DriverEntry. + +Arguments: + + DriverObject - handle to a WDF Driver object. + +Return Value: + + VOID. + +--*/ { - TraceEntry(); - UNREFERENCED_PARAMETER(driver); - WPP_CLEANUP(WdfDriverWdmGetDriverObject(driver)); +#ifndef _KERNEL_MODE + // follow https://github.com/MicrosoftDocs/windows-driver-docs/blob/staging/windows-driver-docs-pr/wdf/using-wpp-software-tracing-in-kmdf-and-umdf-2-drivers.md + // because UMDF drivers use the kernel-mode signatures of these macros for initializing and cleaning up tracing, the calls look identical for KMDF and UMDF. + UNREFERENCED_PARAMETER(DriverObject); +#endif // !_KERNEL_MODE + + WPP_CLEANUP(WdfDriverWdmGetDriverObject(static_cast<WDFDRIVER>(DriverObject))); } diff --git a/network/wlan/WIFICX/drivercode/driver.h b/network/wlan/WIFICX/drivercode/driver.h new file mode 100644 index 00000000..12820f1c --- /dev/null +++ b/network/wlan/WIFICX/drivercode/driver.h @@ -0,0 +1,6 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +#pragma once +#include "precomp.h" + +EVT_WDF_DRIVER_DEVICE_ADD EvtWifiDriverDeviceAdd; +EVT_WDF_OBJECT_CONTEXT_CLEANUP EvtWifiDriverContextCleanup;
\ No newline at end of file diff --git a/network/wlan/WIFICX/drivercode/memorymanagement.cpp b/network/wlan/WIFICX/drivercode/memorymanagement.cpp index 8c6d56d0..de231d8c 100644 --- a/network/wlan/WIFICX/drivercode/memorymanagement.cpp +++ b/network/wlan/WIFICX/drivercode/memorymanagement.cpp @@ -1,35 +1,34 @@ -/*++ - -Copyright (c) Microsoft Corporation. All rights reserved. - - Microsoft Confidential - - THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY - KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR - PURPOSE. - -Module Name: - - new.cpp - -Abstract: - - Test only stub WDI driver (C++ portions) +// Copyright (C) Microsoft Corporation. All rights reserved. +#include "precomp.h" -Environment: +#ifndef _KERNEL_MODE +#include <intrin.h> // for _ReturnAddress for user mode +#endif // UM - Kernel mode +typedef struct _PLACEMENT_NEW_ALLOCATION_CONTEXT +{ + size_t cbMaxSize; + _Field_size_bytes_(cbMaxSize) void* pbBuffer; +} PLACEMENT_NEW_ALLOCATION_CONTEXT, * PPLACEMENT_NEW_ALLOCATION_CONTEXT; +typedef const PLACEMENT_NEW_ALLOCATION_CONTEXT* PCPLACEMENT_NEW_ALLOCATION_CONTEXT; -Author: +// for FreeWdfMemoryBuffer to correct get +// the handle to free the memory +struct WIFI_IHV_MEMORY_HEADER +{ + size_t HeaderSize; + WDFMEMORY WdfMemoryHandle; +}; +// for tracking memory leaks +struct WIFI_IHV_MEMORY_CONTEXT +{ + size_t ContextSize; + void* pvCaller; +}; ---*/ -#include "precomp.h" +WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(WIFI_IHV_MEMORY_CONTEXT, GetWificxIhvMemoryContextFromHandle); -#ifndef _KERNEL_MODE -#include <intrin.h> // for _ReturnAddress for user mode -#endif // UM void* AllocateWdfMemoryBuffer(size_t Size, _In_ void* CallerForMemoryLeakTracking) { diff --git a/network/wlan/WIFICX/drivercode/precomp.h b/network/wlan/WIFICX/drivercode/precomp.h index c08123a1..f6bc3aad 100644 --- a/network/wlan/WIFICX/drivercode/precomp.h +++ b/network/wlan/WIFICX/drivercode/precomp.h @@ -1,12 +1,12 @@ // Copyright (C) Microsoft Corporation. All rights reserved. #pragma once -//#include <initguid.h> - #ifdef _KERNEL_MODE #include <ntddk.h> #else #include <windows.h> + #include <ndis/types.h> // For NDIS_STATUS + #include <ndis/status.h> // For NDIS_STATUS codes #include <ntddndis.h> #endif // WDF Headers @@ -23,10 +23,6 @@ #include "dot11wificxtypes.hpp" #include "TLVGeneratorParser.hpp" #include "SharedTypes.h" + // WPP Tracing Headers #include "trace.h" - -//#include "device.h" -//#include "adapter.h" - -//#include "wifirequest.h" diff --git a/network/wlan/WIFICX/drivercode/trace.h b/network/wlan/WIFICX/drivercode/trace.h index 7bbda1fa..39b9033d 100644 --- a/network/wlan/WIFICX/drivercode/trace.h +++ b/network/wlan/WIFICX/drivercode/trace.h @@ -5,16 +5,16 @@ #ifndef TRACE_H #define TRACE_H -//extern "C" -//{ -//#include <WppRecorder.h> -//} #define WPP_USE_TRACE_LEVELS // 21BA7B61-05F8-41F1-9048-C09493DCFE38 #define WPP_CONTROL_GUIDS \ WPP_DEFINE_CONTROL_GUID(WdiLibraryCtlGuid, (21BA7B61, 05F8, 41F1, 9048, C09493DCFE38), WPP_DEFINE_BIT(DUMMY)) +//#define WPP_LEVEL_EXP_ENABLED(LEVEL, EXP) WPP_LEVEL_ENABLED(LEVEL) +//#define WPP_LEVEL_EXP_LOGGER(LEVEL, EXP) WPP_LEVEL_LOGGER(LEVEL) + + #define WPP_RECORDER_LEVEL_FLAGS_ARGS(lvl, flags) WPP_CONTROL(WPP_BIT_##flags).AutoLogContext, lvl, WPP_BIT_##flags #define WPP_RECORDER_LEVEL_FLAGS_FILTER(lvl, flags) \ (WPP_LEVEL_ENABLED(lvl) || lvl < TRACE_LEVEL_VERBOSE || WPP_CONTROL(WPP_BIT_##flags).AutoLogVerboseEnabled) @@ -36,7 +36,6 @@ #define WFCError(Format, ...) #define WFCInfo(Format, ...) - // begin_wpp config // USEPREFIX (TraceEntry, "%!STDPREFIX!"); // FUNC TraceEntry{LEVEL=TRACE_LEVEL_VERBOSE}(...); @@ -66,62 +65,6 @@ // end_wpp // -// -// C++ with Activity ID function entry/exit commands -// -// begin_wpp config -// -// USEPREFIX (TraceActEntry, "%!STDPREFIX! [O:%p][A:%x]", this, this->get_ActivityId()); -// FUNC TraceActEntry{LEVEL=TRACE_LEVEL_VERBOSE}(...); -// USESUFFIX (TraceActEntry, "--> %!FUNC!"); -// -// USEPREFIX (TraceActExit, "%!STDPREFIX! [O:%p][A:%x]", this, this->get_ActivityId()); -// FUNC TraceActExit{LEVEL=TRACE_LEVEL_VERBOSE}(EXP); -// USESUFFIX (TraceActExit, "<-- %!FUNC!: 0x%x", EXP); -// -// end_wpp -// - -// -// C++ with Activity ID trace commands -// -// begin_wpp config -// -// USEPREFIX (WFCActError, "%!STDPREFIX! [O:%p][A:%x][ERROR]", this, this->get_ActivityId()); -// FUNC WFCActError{LEVEL=TRACE_LEVEL_ERROR}(MSG, ...); -// -// USEPREFIX (WFCActErrorStatus, "%!STDPREFIX! [O:%p][A:%x][ERROR=%x]", this, this->get_ActivityId(), status); -// FUNC WFCActErrorStatus{LEVEL=TRACE_LEVEL_ERROR}(MSG, ...); -// -// USEPREFIX (WFCActInfo, "%!STDPREFIX! [O:%p][A:%x][INFO]", this, this->get_ActivityId()); -// FUNC WFCActInfo{LEVEL=TRACE_LEVEL_INFORMATION}(MSG, ...); -// -// USEPREFIX (WFCActTrace, "%!STDPREFIX! [O:%p][A:%x][TRACE]", this, this->get_ActivityId()); -// FUNC WFCActTrace{LEVEL=TRACE_LEVEL_VERBOSE}(MSG, ...); -// -// end_wpp -// - -// -// C++ with Port ID trace commands -// -// begin_wpp config -// -// USEPREFIX (WFCPortError, "%!STDPREFIX! [O:%p][P:%x][ERROR]", this, this->GetPortId()); -// FUNC WFCPortError{LEVEL=TRACE_LEVEL_ERROR}(MSG, ...); -// -// USEPREFIX (WFCPortErrorStatus, "%!STDPREFIX! [O:%p][P:%x][ERROR=%x]", this, this->GetPortId(), status); -// FUNC WFCPortErrorStatus{LEVEL=TRACE_LEVEL_ERROR}(MSG, ...); -// -// USEPREFIX (WFCPortInfo, "%!STDPREFIX! [O:%p][P:%x][INFO]", this, this->GetPortId()); -// FUNC WFCPortInfo{LEVEL=TRACE_LEVEL_INFORMATION}(MSG, ...); -// -// USEPREFIX (WFCPortTrace, "%!STDPREFIX! [O:%p][P:%x][TRACE]", this, this->GetPortId()); -// FUNC WFCPortTrace{LEVEL=TRACE_LEVEL_VERBOSE}(MSG, ...); -// -// end_wpp -// - #define MACRO_START \ do \ { @@ -130,12 +73,12 @@ while (0) // -// WPP Macros: WX_RETURN_IF_NOT_NT_SUCCESS_MSG +// WPP Macros: WX_RETURN_NTSTATUS_IF_NOT_NT_SUCCESS_MSG // // begin_wpp config -// FUNC WX_RETURN_IF_NOT_NT_SUCCESS_MSG{COMPNAME=DUMMY,LEVEL=TRACE_LEVEL_ERROR}(NTEXPR,MSG,...); -// USEPREFIX (WX_RETURN_IF_NOT_NT_SUCCESS_MSG, "%!STDPREFIX! !! WifiCx - %!FUNC!: "); -// USESUFFIX (WX_RETURN_IF_NOT_NT_SUCCESS_MSG, " [status=%!STATUS!]", nt__wpp); +// FUNC WX_RETURN_NTSTATUS_IF_NOT_NT_SUCCESS_MSG{COMPNAME=DUMMY,LEVEL=TRACE_LEVEL_ERROR}(NTEXPR,MSG,...); +// USEPREFIX (WX_RETURN_NTSTATUS_IF_NOT_NT_SUCCESS_MSG, "%!STDPREFIX! !! WifiIhv - %!FUNC!: "); +// USESUFFIX (WX_RETURN_NTSTATUS_IF_NOT_NT_SUCCESS_MSG, " [status=%!STATUS!]", nt__wpp); // end_wpp #define WPP_COMPNAME_LEVEL_NTEXPR_PRE(comp, level, ntexpr) \ @@ -155,7 +98,7 @@ // // begin_wpp config // FUNC WX_RETURN_INSUFFICIENT_RESOURCES_IF_NULL_MSG{COMPNAME=DUMMY,LEVEL=TRACE_LEVEL_ERROR}(PTR2,MSG,...); -// USEPREFIX (WX_RETURN_INSUFFICIENT_RESOURCES_IF_NULL_MSG, "%!STDPREFIX! !! WifiCx - %!FUNC!: "); +// USEPREFIX (WX_RETURN_INSUFFICIENT_RESOURCES_IF_NULL_MSG, "%!STDPREFIX! !! WifiIhv - %!FUNC!: "); // USESUFFIX (WX_RETURN_INSUFFICIENT_RESOURCES_IF_NULL_MSG, "%!s! is null", #PTR2); // end_wpp @@ -175,7 +118,7 @@ // // begin_wpp config // FUNC WX_RETURN_IF_NULL_MSG{COMPNAME=DUMMY,LEVEL=TRACE_LEVEL_ERROR}(PTR3,MSG,...); -// USEPREFIX (WX_RETURN_IF_NULL_MSG, "%!STDPREFIX! !! WifiCx - %!FUNC!: "); +// USEPREFIX (WX_RETURN_IF_NULL_MSG, "%!STDPREFIX! !! WifiIhv - %!FUNC!: "); // USESUFFIX (WX_RETURN_IF_NULL_MSG, "%!s! is null", #PTR3); // end_wpp @@ -233,14 +176,7 @@ __inline ByteArray log_lenstr(ULONG len, const void* buf) // // DEFINE_CPLX_TYPE(MACADDR, WPP_LOGMACADDR, DOT11_MAC_ADDRESS, ItemMACAddr,"s", _MAC_, 0); // -// CUSTOM_TYPE(WFC_RX_PEER_STATE, ItemEnum(_WFC_RX_PEER_STATE)); -// // CUSTOM_TYPE(MESSAGE_ID, ItemEnum(WDI_TLV::ENUMS::MESSAGE_ID)); -// CUSTOM_TYPE(WFC_PORT_PROPERTY_NAME, ItemEnum(WFC_PORT_PROPERTY_NAME)); -// CUSTOM_TYPE(DisconnectInDxReason, ItemEnum(CSetPowerJob::DisconnectInDxReason)); -// CUSTOM_TYPE(WFC_JOB_TYPE, ItemEnum(_WFC_JOB_TYPE)); -// CUSTOM_TYPE(ConfigurableActionFrameWakePatterns, ItemEnum(ConfigurableActionFrameWakePatterns)); -// CUSTOM_TYPE(WFC_PORT_TYPE, ItemEnum(_WFC_PORT_TYPE)); // end_wpp // diff --git a/network/wlan/WIFICX/drivercode/umkmfusion.h b/network/wlan/WIFICX/drivercode/umkmfusion.h index cc74cd83..f94454f8 100644 --- a/network/wlan/WIFICX/drivercode/umkmfusion.h +++ b/network/wlan/WIFICX/drivercode/umkmfusion.h @@ -24,6 +24,13 @@ namespace Wifi return SUCCEEDED(hr) ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL; } + _inline + NTSTATUS ConvertNDISSTATUSoNTSTATUS(NDIS_STATUS ndisStatus) { + + return ndisStatus > 0 ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL; + } + + _Must_inspect_result_ _inline NTSTATUS SizeTAddSafe(_In_ size_t Augend, _In_ size_t Addend, _Out_ _Deref_out_range_(== , Augend + Addend) size_t* pResult) diff --git a/network/wlan/WIFICX/drivercode/wifihal.cpp b/network/wlan/WIFICX/drivercode/wifihal.cpp new file mode 100644 index 00000000..824ab6ac --- /dev/null +++ b/network/wlan/WIFICX/drivercode/wifihal.cpp @@ -0,0 +1,907 @@ +// Copyright (C) Microsoft Corporation. All rights reserved. + +#include "precomp.h" +#include "wifirequest.h" +#include "wifiHALtestdata.h" +#include "WifiHal.h" +#include "WifiHal.tmh" + +NTSTATUS WifiHAL::WifiIhvSetDeviceCapabilities(WDFDEVICE Device) +{ + WIFI_DEVICE_CAPABILITIES deviceCaps = {}; + WIFI_DEVICE_CAPABILITIES_INIT(&deviceCaps); + + deviceCaps.HardwareRadioState = TRUE; + deviceCaps.SoftwareRadioState = TRUE; + deviceCaps.FirmwareVersion[MAX_FIRMWARE_VERSION_LENGTH]; + deviceCaps.ActionFramesSupported = TRUE; + deviceCaps.NumRxStreams = 1; + deviceCaps.NumTxStreams = 1; + deviceCaps.Support_eCSA = FALSE; + deviceCaps.MACAddressRandomization = FALSE; + deviceCaps.MACAddressRandomizationMask.Address[0] = 0; + deviceCaps.MACAddressRandomizationMask.Address[1] = 0; + deviceCaps.MACAddressRandomizationMask.Address[2] = 0; + deviceCaps.MACAddressRandomizationMask.Address[3] = 0xFF; + deviceCaps.MACAddressRandomizationMask.Address[4] = 0; + deviceCaps.MACAddressRandomizationMask.Address[5] = 0; + deviceCaps.BluetoothCoexistenceSupport = WDI_BLUETOOTH_COEXISTENCE_PERFORMANCE_MAINTAINED; + deviceCaps.SupportsNonWdiOidRequests = FALSE; + deviceCaps.FastTransitionSupported = TRUE; + deviceCaps.MU_MIMOSupported = FALSE; + deviceCaps.SAEAuthenticationSupported = TRUE; + deviceCaps.BSSTransitionSupported = TRUE; + deviceCaps.MBOSupported = FALSE; + deviceCaps.BeaconReportsImplemented = FALSE; + + WX_RETURN_NTSTATUS_IF_NOT_NT_SUCCESS_MSG( + WifiDeviceSetDeviceCapabilities(Device, &deviceCaps), + "Failed to set device capabilities"); + + WIFI_STATION_CAPABILITIES StationCaps = {}; + WIFI_STATION_CAPABILITIES_INIT(&StationCaps); + + StationCaps.ScanSSIDListSize = 4; + StationCaps.DesiredSSIDListSize = 1; + StationCaps.PrivacyExemptionListSize = 1; + StationCaps.KeyMappingTableSize = 32; + StationCaps.DefaultKeyTableSize = 4; + StationCaps.WEPKeyValueMaxLength = 0x20; + StationCaps.MaxNumPerSTA = 4; + StationCaps.SupportedQOSFlags = 0; + StationCaps.HostFIPSModeImplemented = FALSE; + StationCaps.MFPCapable = TRUE; + StationCaps.AutoPowerSaveMode = FALSE; + StationCaps.BSSListCachemanagement = FALSE; + StationCaps.ConnectBSSSelectionOverride = FALSE; + StationCaps.MaxNetworkOffloadListSize = 0; + StationCaps.HESSIDConnectionSupported = FALSE; + StationCaps.FTMAsInitiatorSupport = FALSE; + StationCaps.FTMNumberOfSupportedTargets = 0; + + const DOT11_AUTH_CIPHER_PAIR UnicastAlgos[] = { + {DOT11_AUTH_ALGO_80211_OPEN, DOT11_CIPHER_ALGO_NONE}, + {DOT11_AUTH_ALGO_80211_OPEN, DOT11_CIPHER_ALGO_WEP}, + {DOT11_AUTH_ALGO_WPA_PSK, DOT11_CIPHER_ALGO_CCMP}, + {DOT11_AUTH_ALGO_RSNA, DOT11_CIPHER_ALGO_CCMP}, + {DOT11_AUTH_ALGO_RSNA_PSK, DOT11_CIPHER_ALGO_TKIP}, + {DOT11_AUTH_ALGO_RSNA_PSK, DOT11_CIPHER_ALGO_CCMP}, + {DOT11_AUTH_ALGO_WPA3_ENT_192, DOT11_CIPHER_ALGO_GCMP_256}, + {DOT11_AUTH_ALGO_WPA3_ENT, DOT11_CIPHER_ALGO_CCMP}, + {DOT11_AUTH_ALGO_WPA3_SAE, DOT11_CIPHER_ALGO_GCMP_256}, + {DOT11_AUTH_ALGO_WPA3_SAE, DOT11_CIPHER_ALGO_CCMP}, + {DOT11_AUTH_ALGO_OWE, DOT11_CIPHER_ALGO_GCMP_256}, + {DOT11_AUTH_ALGO_OWE, DOT11_CIPHER_ALGO_CCMP}, + }; + + const DOT11_AUTH_CIPHER_PAIR McastMgmtAlgos[] = { + {DOT11_AUTH_ALGO_80211_OPEN, DOT11_CIPHER_ALGO_NONE}, + {DOT11_AUTH_ALGO_RSNA, DOT11_CIPHER_ALGO_BIP}, + {DOT11_AUTH_ALGO_RSNA_PSK, DOT11_CIPHER_ALGO_BIP}, + {DOT11_AUTH_ALGO_WPA3_SAE, DOT11_CIPHER_ALGO_BIP}, + {DOT11_AUTH_ALGO_WPA3_ENT, DOT11_CIPHER_ALGO_BIP}, + {DOT11_AUTH_ALGO_WPA3_ENT_192, DOT11_CIPHER_ALGO_BIP_GMAC_256}, + }; + + StationCaps.NumSupportedUnicastAlgorithms = ARRAYSIZE(UnicastAlgos); + StationCaps.UnicastAlgorithmsList = const_cast<PDOT11_AUTH_CIPHER_PAIR>(UnicastAlgos); + StationCaps.NumSupportedMulticastDataAlgorithms = ARRAYSIZE(UnicastAlgos); + StationCaps.MulticastDataAlgorithmsList = const_cast<PDOT11_AUTH_CIPHER_PAIR>(UnicastAlgos); + StationCaps.NumSupportedMulticastMgmtAlgorithms = ARRAYSIZE(McastMgmtAlgos); + StationCaps.MulticastMgmtAlgorithmsList = const_cast<PDOT11_AUTH_CIPHER_PAIR>(McastMgmtAlgos); + + WIFI_STA_BANDS_COMBINATION SecondaryStaBandsCombinations[] = { + {2, {WDI_BAND_ID_2400, WDI_BAND_ID_5000, WDI_BAND_ID_UNKNOWN, WDI_BAND_ID_UNKNOWN}}, + {2, {WDI_BAND_ID_2400, WDI_BAND_ID_6000, WDI_BAND_ID_UNKNOWN, WDI_BAND_ID_UNKNOWN}}, + {2, {WDI_BAND_ID_5000, WDI_BAND_ID_6000, WDI_BAND_ID_UNKNOWN, WDI_BAND_ID_UNKNOWN}}, + {3, {WDI_BAND_ID_2400, WDI_BAND_ID_5000, WDI_BAND_ID_6000, WDI_BAND_ID_UNKNOWN}}, + }; + + StationCaps.NumSecondaryStaBandCombinations = ARRAYSIZE(SecondaryStaBandsCombinations); + StationCaps.SecondaryStaBandsCombinations = SecondaryStaBandsCombinations; + + WDI_MAC_ADDRESS MLOAddresses[] = { + {0x11, 0x01, 0x02, 0x03, 0x04, 0x21}, + {0x11, 0x01, 0x02, 0x03, 0x04, 0x22}, + }; + StationCaps.MaxMLOLinksSupported = ARRAYSIZE(MLOAddresses); + StationCaps.MLOAddressesList = MLOAddresses; + + RSNA_AKM_SUITE AkmsList[] = { + rsna_akm_1x, + rsna_akm_psk, + rsna_akm_ft_1x_sha256, + rsna_akm_ft_psk_sha256, + rsna_akm_1x_sha256, + rsna_akm_psk_sha256, + rsna_akm_sae_pmk256, + rsna_akm_1x_suite_b_sha384, + rsna_akm_owe, + rsna_akm_1x_sha384, + rsna_akm_sae_pmk384, + }; + StationCaps.NumAkmsSupported = ARRAYSIZE(AkmsList); + StationCaps.AkmsList = AkmsList; + + if (WIFI_IS_FIELD_AVAILABLE(WIFI_STATION_CAPABILITIES, MSCSSupported)) + { + StationCaps.MSCSSupported = true; + } + if (WIFI_IS_FIELD_AVAILABLE(WIFI_STATION_CAPABILITIES, DSCPToUPMappingSupported)) + { + StationCaps.DSCPToUPMappingSupported = true; + } + + WX_RETURN_NTSTATUS_IF_NOT_NT_SUCCESS_MSG( + WifiDeviceSetStationCapabilities(Device, &StationCaps), + "Failed to set station capabilities"); + + WIFI_BAND_CAPABILITIES BandCaps = {}; + WIFI_BAND_CAPABILITIES_INIT(&BandCaps); + + const WDI_PHY_TYPE Phy24GHz[] = { WDI_PHY_TYPE_ERP, WDI_PHY_TYPE_HE }; // g, ax + const WDI_PHY_TYPE Phy5GHz[] = { WDI_PHY_TYPE_OFDM, WDI_PHY_TYPE_HE, WDI_PHY_TYPE_EHT }; // a, ax, be + const WDI_PHY_TYPE Phy6GHz[] = { WDI_PHY_TYPE_HE, WDI_PHY_TYPE_EHT }; // ax, be + const WDI_PHY_TYPE pPhy60GHz[] = { WDI_PHY_TYPE_DMG }; // ad + const WDI_PHY_TYPE phyIHV[2] = { WDI_PHY_TYPE_OFDM, static_cast<WDI_PHY_TYPE>(WDI_PHY_TYPE_IHV_START + 1) }; + + // clang-format off + + const WDI_CHANNEL_MAPPING_ENTRY ChannelMap24[] = { + {1, 2412}, + {2, 2417}, + {3, 2422}, + {4, 2427}, + {5, 2432}, + {6, 2437}, + {7, 2442}, + {8, 2447}, + {9, 2452}, + {10, 2457}, + {11, 2462}, + {12, 2467}, // Not used in US + {13, 2472}, // Not used in US + {14, 2484}, // Allowed in Japan only + }; + + const WDI_CHANNEL_MAPPING_ENTRY ChannelMap5[] = { + {7, 5035}, // Not used in US + {8, 5040}, // Not used in US + {9, 5045}, // Not used in US + {11, 5055}, // Not used in US + {12, 5060}, // Not used in US + {16, 5080}, // Not used in US + {32, 5160}, // Unknown status + {34, 5170}, // Not used in US + {36, 5180}, + {38, 5190}, + {40, 5200}, + {42, 5210}, + {44, 5220}, + {46, 5230}, + {48, 5240}, + {50, 5250}, // DFS + {52, 5260}, // DFS + {54, 5270}, // DFS + {56, 5280}, // DFS + {58, 5290}, // DFS + {60, 5300}, // DFS + {62, 5310}, // DFS + {64, 5320}, // DFS + {68, 5340}, // Unknown status + {96, 5480}, // Unknown status + {100, 5500}, // DFS + {102, 5510}, // DFS + {104, 5520}, // DFS + {106, 5530}, // DFS + {108, 5540}, // DFS + {110, 5550}, // DFS + {112, 5560}, // DFS + {114, 5570}, // DFS + {116, 5580}, // DFS + {118, 5590}, // DFS + {120, 5600}, // DFS + {122, 5610}, // DFS + {124, 5620}, // DFS + {126, 5630}, // DFS + {128, 5640}, // DFS + {132, 5660}, // DFS + {134, 5670}, // DFS + {136, 5680}, // DFS + {138, 5690}, // DFS + {140, 5700}, // DFS + {142, 5710}, // DFS + {142, 5720}, // DFS + {144, 5730}, // DFS + {149, 5745}, + {151, 5755}, + {153, 5765}, + {155, 5785}, + {157, 5785}, + {159, 5795}, + {161, 5805}, + {165, 5825}, + {169, 5845}, // Not used in US + {173, 5865}, // Not used in US + {183, 4915}, // Not used in US + {184, 4920}, // Not used in US + {185, 4925}, // Not used in US + {187, 4935}, // Not used in US + {188, 4940}, // Not used in US + {189, 4945}, // Not used in US + {192, 4960}, // Not used in US + {196, 4980}, // Not used in US + }; + + const WDI_CHANNEL_MAPPING_ENTRY channelMap6[] = { + {1, 5955}, + {5, 5975}, // PSC Channel (1) + {9, 5995}, + + {13, 6015}, + {17, 6035}, + {21, 6055}, // PSC Channel (2) + {25, 6075}, + {29, 6095}, + + {33, 6115}, + {37, 6135}, // PSC Channel (3) + {41, 6155}, + {45, 6175}, + {49, 6195}, + + {53, 6215}, // PSC Channel (4) + {57, 6235}, + {61, 6255}, + {65, 6275}, + {69, 6295}, // PSC Channel (5) + + {73, 6315}, + {77, 6335}, + {81, 6355}, + {85, 6375}, // PSC Channel (6) + {89, 6395}, + + {93, 6415}, + {97, 6435}, + {101, 6455}, // PSC Channel (7) + {105, 6475}, + {109, 6495}, + + {113, 6515}, + {117, 6535}, // PSC Channel (8) + {121, 6555}, + {125, 6575}, + {129, 6595}, + + {133, 6615}, // PSC Channel (9) + {137, 6635}, + {141, 6655}, + {145, 6675}, + {149, 6695}, // PSC Channel (10) + + {153, 6715}, + {157, 6735}, + {161, 6755}, + {165, 6775}, // PSC Channel (11) + {169, 6795}, + + {173, 6815}, + {177, 6835}, + {181, 6855}, // PSC Channel (12) + {185, 6875}, + {189, 6895}, + + {193, 6915}, + {197, 6935}, // PSC Channel (13) + {201, 6955}, + {205, 6975}, + {209, 6995}, + + {213, 7015}, // PSC Channel (14) + {217, 7035}, + {221, 7055}, + {225, 7075}, + {229, 7095}, // PSC Channel (15) + + {233, 7115}, + {237, 7135}, + {241, 7155}, + {245, 7175}, + {249, 7195}, + + {253, 7215}, + }; + + const WDI_CHANNEL_MAPPING_ENTRY channelMap60[] = { + {1, 58320}, + {2, 60480}, + {3, 62640}, + {4, 64800}, + {5, 66960}, + {6, 69120}, + }; + + // clang-format on + + UINT32 ChannelWidth10Mhz = 10; + UINT32 ChannelWidth20Mhz = 20; + UINT32 channelWidth2160Mhz = 2160; + UINT32 pChannelWidth6Ghz[] = { 20, 40, 80, 160, 320 }; + + WIFI_BAND_INFO BandInfo[4] = {}; // Upto 4 bands + UINT32 bandInfoCount = 0; + + if (m_SupportedBands & WDI_BAND_ID_2400) + { + BandInfo[bandInfoCount].BandID = WDI_BAND_ID_2400; + BandInfo[bandInfoCount].BandState = TRUE; + BandInfo[bandInfoCount].NumValidPhyTypes = ARRAYSIZE(Phy24GHz); + BandInfo[bandInfoCount].ValidPhyTypeList = const_cast<WDI_PHY_TYPE*>(Phy24GHz); + BandInfo[bandInfoCount].NumValidChannelTypes = ARRAYSIZE(ChannelMap24); + BandInfo[bandInfoCount].ValidChannelTypes = const_cast<WDI_CHANNEL_MAPPING_ENTRY*>(ChannelMap24); + BandInfo[bandInfoCount].NumChannelWidths = 1; + BandInfo[bandInfoCount].ChannelWidthList = &ChannelWidth10Mhz; + bandInfoCount++; + } + NT_ASSERT(bandInfoCount <= 1); + + if (m_SupportedBands & WDI_BAND_ID_5000) + { + BandInfo[bandInfoCount].BandID = WDI_BAND_ID_5000; + BandInfo[bandInfoCount].BandState = TRUE; + BandInfo[bandInfoCount].NumValidPhyTypes = ARRAYSIZE(Phy5GHz); + BandInfo[bandInfoCount].ValidPhyTypeList = const_cast<WDI_PHY_TYPE*>(Phy5GHz); + BandInfo[bandInfoCount].NumValidChannelTypes = ARRAYSIZE(ChannelMap5); + BandInfo[bandInfoCount].ValidChannelTypes = const_cast<WDI_CHANNEL_MAPPING_ENTRY*>(ChannelMap5); + BandInfo[bandInfoCount].NumChannelWidths = 1; + BandInfo[bandInfoCount].ChannelWidthList = &ChannelWidth20Mhz; + bandInfoCount++; + } + NT_ASSERT(bandInfoCount <= 2); + + if (m_SupportedBands & WDI_BAND_ID_6000) + { + BandInfo[bandInfoCount].BandID = WDI_BAND_ID_6000; // 6 + BandInfo[bandInfoCount].BandState = TRUE; + BandInfo[bandInfoCount].NumValidPhyTypes = ARRAYSIZE(Phy6GHz); + BandInfo[bandInfoCount].ValidPhyTypeList = const_cast<WDI_PHY_TYPE*>(Phy6GHz); + BandInfo[bandInfoCount].NumValidChannelTypes = ARRAYSIZE(channelMap6); + BandInfo[bandInfoCount].ValidChannelTypes = const_cast<WDI_CHANNEL_MAPPING_ENTRY*>(channelMap6); + BandInfo[bandInfoCount].NumChannelWidths = ARRAYSIZE(pChannelWidth6Ghz); + BandInfo[bandInfoCount].ChannelWidthList = pChannelWidth6Ghz; + bandInfoCount++; + } + + NT_ASSERT(bandInfoCount <= 3); + if (m_SupportedBands & WDI_BAND_ID_60000) + { + BandInfo[bandInfoCount].BandID = WDI_BAND_ID_60000; // 60 + BandInfo[bandInfoCount].BandState = TRUE; + BandInfo[bandInfoCount].NumValidPhyTypes = ARRAYSIZE(pPhy60GHz); + BandInfo[bandInfoCount].ValidPhyTypeList = const_cast<WDI_PHY_TYPE*>(pPhy60GHz); + BandInfo[bandInfoCount].NumValidChannelTypes = ARRAYSIZE(channelMap60); + BandInfo[bandInfoCount].ValidChannelTypes = const_cast<WDI_CHANNEL_MAPPING_ENTRY*>(channelMap60); + BandInfo[bandInfoCount].NumChannelWidths = 1; + BandInfo[bandInfoCount].ChannelWidthList = &channelWidth2160Mhz; + bandInfoCount++; + } + NT_ASSERT(bandInfoCount <= 4); + + BandCaps.NumBands = bandInfoCount; + BandCaps.BandInfoList = BandInfo; + + WX_RETURN_NTSTATUS_IF_NOT_NT_SUCCESS_MSG( + WifiDeviceSetBandCapabilities(Device, &BandCaps), + "Failed to set band capabilities"); + + WIFI_PHY_CAPABILITIES PhyCaps = {}; + WIFI_PHY_CAPABILITIES_INIT(&PhyCaps); + + WIFI_PHY_INFO PhyInfoList[3]; + + const WDI_DATA_RATE_ENTRY DataRateListErp[] = { + {WDI_DATA_RATE_RX_RATE | WDI_DATA_RATE_TX_RATE, 2}, + {WDI_DATA_RATE_RX_RATE | WDI_DATA_RATE_TX_RATE, 4}, + {WDI_DATA_RATE_RX_RATE | WDI_DATA_RATE_TX_RATE, 22}, + {WDI_DATA_RATE_RX_RATE | WDI_DATA_RATE_TX_RATE, 108} }; + const WDI_DATA_RATE_ENTRY DataRateListOfdm[] = { + {WDI_DATA_RATE_RX_RATE | WDI_DATA_RATE_TX_RATE, 2}, {WDI_DATA_RATE_RX_RATE | WDI_DATA_RATE_TX_RATE, 108} }; + const WDI_DATA_RATE_ENTRY DataRateListEht[] = { + {WDI_DATA_RATE_RX_RATE | WDI_DATA_RATE_TX_RATE, 2}, {WDI_DATA_RATE_RX_RATE | WDI_DATA_RATE_TX_RATE, 108} }; + + PhyInfoList[0].PhyType = WDI_PHY_TYPE_ERP; + PhyInfoList[0].NumberDataRateEntries = ARRAYSIZE(DataRateListErp); + RtlCopyMemory(&PhyInfoList[0].DataRateList, &DataRateListErp, sizeof(DataRateListErp)); + + PhyInfoList[1].PhyType = WDI_PHY_TYPE_HE; + PhyInfoList[1].NumberDataRateEntries = ARRAYSIZE(DataRateListOfdm); + RtlCopyMemory(&PhyInfoList[1].DataRateList, &DataRateListOfdm, sizeof(DataRateListOfdm)); + + PhyInfoList[2].PhyType = WDI_PHY_TYPE_EHT; + PhyInfoList[2].NumberDataRateEntries = ARRAYSIZE(DataRateListEht); + RtlCopyMemory(&PhyInfoList[2].DataRateList, &DataRateListEht, sizeof(DataRateListEht)); + + PhyCaps.NumPhyTypes = ARRAYSIZE(PhyInfoList); + PhyCaps.PhyInfoList = PhyInfoList; + + WX_RETURN_NTSTATUS_IF_NOT_NT_SUCCESS_MSG( + WifiDeviceSetPhyCapabilities(Device, &PhyCaps), + "Failed to set PHY capabilities"); + + return STATUS_SUCCESS; +} + +NTSTATUS WifiHAL::WifiIhvReset(WDFDEVICE Device, const WDI_TASK_DOT11_RESET_PARAMETERS& ResetParameters, const PWDI_MESSAGE_HEADER pWdiHeader, PCTLV_CONTEXT) +{ + if (0 == ResetParameters.Optional.ResetMACAddress_IsPresent) + { + WFCTrace("DOT11 Reset, set default MIB = %d, no MAC Address specified\n", ResetParameters.Dot11ResetParameters.SetDefaultMIB); + } + else + { + WFCTrace( + "DOT11 Reset, set default MIB = %d, MAC Address = %2x:%2x:%2x:%2x:%2x:%2x\n", + ResetParameters.Dot11ResetParameters.SetDefaultMIB, + ResetParameters.ResetMACAddress.Address[0], + ResetParameters.ResetMACAddress.Address[1], + ResetParameters.ResetMACAddress.Address[2], + ResetParameters.ResetMACAddress.Address[3], + ResetParameters.ResetMACAddress.Address[4], + ResetParameters.ResetMACAddress.Address[5]); + } + + // Reset the connection ID in case the previous connection attempt did not complete + m_LastConnectEntryId = 0; + WifiIhvSendIndicationToOs(Device, pWdiHeader, WDI_INDICATION_DOT11_RESET_COMPLETE, pWdiHeader->TransactionId, nullptr, 0); + + return STATUS_SUCCESS; +} + +_Use_decl_annotations_ +NTSTATUS WifiHAL::WifiIhvSetRadioState(WDFDEVICE Device, const WDI_SET_RADIO_STATE_PARAMETERS& RadioState, const PWDI_MESSAGE_HEADER pWdiHeader, PCTLV_CONTEXT Context) +{ + if (RadioState.SoftwareRadioState != m_CurrentRadioState) + { + // Change the radio state + m_CurrentRadioState = RadioState.SoftwareRadioState; + + // Send the radio state indication + WDI_INDICATION_RADIO_STATUS_PARAMETERS RadioStatusParams = {}; + UINT8* pOutput = nullptr; + ULONG cbOutput = 0; + + RadioStatusParams.RadioState.HardwareState = TRUE; + RadioStatusParams.RadioState.SoftwareState = m_CurrentRadioState; + if (GenerateWdiIndicationRadioStatus(&RadioStatusParams, 0, Context, &cbOutput, &pOutput) == NDIS_STATUS_SUCCESS) + { + WifiIhvSendIndicationToOs(Device, pWdiHeader, WDI_INDICATION_RADIO_STATUS, 0, pOutput, cbOutput); + FreeGenerated(pOutput); + } + } + + WifiIhvSendIndicationToOs(Device, pWdiHeader, WDI_INDICATION_SET_RADIO_STATE_COMPLETE, pWdiHeader->TransactionId, nullptr, 0); + + return STATUS_SUCCESS; +} + +_Use_decl_annotations_ +NTSTATUS WifiHAL::WifiIhvScan(WDFDEVICE Device, WDI_SCAN_PARAMETERS& ScanParameters, const PWDI_MESSAGE_HEADER pWdiHeader, PCTLV_CONTEXT) +{ + for (UINT8 connectEntry = 1; connectEntry < ConnectEntryId_MAX; connectEntry++) + { + if (m_SupportedBands & g_ConnectEntries[connectEntry].BandId) + { + PUCHAR pBssEntry = g_ConnectEntries[connectEntry].pTlvBssEntry; + // + // If currently connected, see if the connected entry should be skipped + // + if ((m_LastConnectEntryId != 0) && + (RtlCompareMemory(&m_ConnectedPeer, &pBssEntry[8], sizeof(DOT11_MAC_ADDRESS)) == sizeof(DOT11_MAC_ADDRESS))) + { + // Already connected, don't report this entry + continue; + } + + // TODO: Skip the IHV band as it is not being reported in capabilities + if (g_ConnectEntries[connectEntry].BandId == TESTMP_BAND_IHV) + { + continue; + } + + // Send the BSS entry indication + WifiIhvSendIndicationToOs( + Device, + pWdiHeader, + WDI_INDICATION_BSS_ENTRY_LIST, + 0, + g_ConnectEntries[connectEntry].pTlvBssEntry, + g_ConnectEntries[connectEntry].TlvBssEntrySize); + } + } + + // + // See if the hidden network needs to be indicated + // + if ((ScanParameters.SSIDList.ElementCount > 0) && (ScanParameters.SSIDList.pElements[0].ElementCount == 8) && + (ScanParameters.SSIDList.pElements[0].pElements[4] == 'H') && (ScanParameters.SSIDList.pElements[0].pElements[5] == 'I') && + (ScanParameters.SSIDList.pElements[0].pElements[6] == 'D') && (ScanParameters.SSIDList.pElements[0].pElements[7] == 'E')) + { + WifiIhvSendIndicationToOs( + Device, pWdiHeader, WDI_INDICATION_BSS_ENTRY_LIST, 0, s_TLV_BSS_Entry_ProbeResponse_8_Hidden, sizeof(s_TLV_BSS_Entry_ProbeResponse_8_Hidden)); + } + + WifiIhvSendIndicationToOs(Device, pWdiHeader, WDI_INDICATION_SCAN_COMPLETE, pWdiHeader->TransactionId, nullptr, 0); + + return STATUS_SUCCESS; +} + +NTSTATUS WifiHAL::WifiIhvConnect(WDFDEVICE Device, WDI_TASK_CONNECT_PARAMETERS& ConnectParameters, const PWDI_MESSAGE_HEADER pWdiHeader, PCTLV_CONTEXT) +{ + NT_ASSERT(m_LastConnectEntryId == 0); + if (m_LastConnectEntryId != 0) // Not Disconnected State + { +#ifdef WIFI_IHV_NETV + DeleteDatapathPeer( + deviceContext->netAdapters[pWdiHeader->PortId], reinterpret_cast<NET_EUI48_ADDRESS*>(&deviceContext->ConnectedPeer)); +#endif // WIFI_IHV_NETV + } + + WX_RETURN_NTSTATUS_IF_NOT_NT_SUCCESS_MSG(WifiIhvPerformAssociation( + Device, &ConnectParameters.PreferredBSSEntryList, &ConnectParameters.ConnectParameters.AuthenticationAlgorithms, pWdiHeader), + "Failed to perform association"); + + // + // WPA3-SAE requires the SAE Exchange, so do not complete the Connection request until the SAE exchange is complete + // + if (WDI_AUTH_ALGO_WPA3_SAE != m_LastAuthAlgo) + { + WifiIhvSendIndicationToOs(Device, pWdiHeader, WDI_INDICATION_CONNECT_COMPLETE, pWdiHeader->TransactionId, nullptr, 0); + } + + return STATUS_SUCCESS; +} + +_Use_decl_annotations_ +NTSTATUS WifiHAL::WifiIhvSendLinkStateIndication(_In_ WDFDEVICE Device, _In_ PWDI_MESSAGE_HEADER pWdiHeader, ULONG numLinks) +{ + // Report link quality + NTSTATUS ntStatus = STATUS_SUCCESS; + PWIFI_IHV_DEVICE_CONTEXT pDeviceContext = WifiGetIhvDeviceContext(Device); + WDI_INDICATION_LINK_STATE_CHANGE_PARAMETERS linkStateChangeParameters = {}; + WDI_LINK_INFO_CONTAINER pLinkInfo[2] = {}; + UINT8* pOutput = nullptr; + ULONG cbOutput = 0; + + RtlCopyMemory( + &linkStateChangeParameters.LinkStateChangeParameters.PeerMACAddress, &m_ConnectedPeer, sizeof(DOT11_MAC_ADDRESS)); + linkStateChangeParameters.LinkStateChangeParameters.TxLinkSpeed = 30000; + linkStateChangeParameters.LinkStateChangeParameters.RxLinkSpeed = 30000; + linkStateChangeParameters.LinkStateChangeParameters.LinkQuality = 56; + + // Default linkId for non-Mlo connections is 0 + pLinkInfo[0].LinkID = 0; + RtlCopyMemory(&pLinkInfo[0].LocalLinkMACAddress, &m_LocalLinkAddresses[0], sizeof(DOT11_MAC_ADDRESS)); + RtlCopyMemory(&pLinkInfo[0].PeerLinkMACAddress, &m_ConnectedPeer, sizeof(DOT11_MAC_ADDRESS)); + pLinkInfo[0].ChannelNumber = 6; + pLinkInfo[0].BandId = WDI_BAND_ID_2400; + pLinkInfo[0].RSSI = -50; + pLinkInfo[0].Bandwidth = 40; + pLinkInfo[0].TxMCS = 3; + pLinkInfo[0].RxMCS = 4; + + if (numLinks > 1) + { + // For Mlo connections, set the link ID for the first link to 1 + pLinkInfo[0].LinkID = 1; + + pLinkInfo[1].LinkID = 2; + RtlCopyMemory(&pLinkInfo[1].LocalLinkMACAddress, &m_LocalLinkAddresses[1], sizeof(DOT11_MAC_ADDRESS)); + RtlCopyMemory(&pLinkInfo[1].PeerLinkMACAddress, &m_ConnectedPeer, sizeof(DOT11_MAC_ADDRESS)); + pLinkInfo[1].ChannelNumber = 36; + pLinkInfo[1].BandId = WDI_BAND_ID_5000; + pLinkInfo[1].RSSI = -30; + pLinkInfo[1].Bandwidth = 160; + pLinkInfo[1].TxMCS = 8; + pLinkInfo[1].RxMCS = 9; + } + + linkStateChangeParameters.LinkInfo.pElements = pLinkInfo; + linkStateChangeParameters.LinkInfo.ElementCount = numLinks > 1 ? 2 : 1; + + ntStatus = GenerateWdiIndicationLinkStateChangeFromIhv(&linkStateChangeParameters, 0, &pDeviceContext->TlvContext, &cbOutput, &pOutput); + if (STATUS_SUCCESS == ntStatus) + { + WifiIhvSendIndicationToOs(Device, pWdiHeader, WDI_INDICATION_LINK_STATE_CHANGE, 0, pOutput, cbOutput); + FreeGenerated(pOutput); + } + else + { + WFCError("Failed to generate WDI_INDICATION_LINK_STATE_CHANGE - 0x%08x\n", ntStatus); + } + + return ntStatus; +} + +_Use_decl_annotations_ +NTSTATUS WifiHAL::WifiIhvPerformAssociation( + WDFDEVICE Device, + struct ArrayOfElements<WDI_CONNECT_BSS_ENTRY_CONTAINER>* pPreferredBSSEntryList, + struct ArrayOfElements<WDI_AUTH_ALGORITHM>* pAuthenticationAlgorithms, + PWDI_MESSAGE_HEADER pWdiHeader) +{ + + ULONG bssIndex = 0; + ULONG connectEntry = ConnectEntryId_MAX; + NTSTATUS ntStatus = STATUS_SUCCESS; + UINT32 NewConnectEntryId = 0; // Disconnected State + WDI_AUTH_ALGORITHM NewAuthAlgo = pAuthenticationAlgorithms->pElements[0]; + UCHAR pucData[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF, 0x10 }; +#ifdef WIFI_IHV_NETV + WifiNetvDevice* pDeviceContext = WifiNetvDeviceGetContext(Device); +#else + PWIFI_IHV_DEVICE_CONTEXT pDeviceContext = WifiGetIhvDeviceContext(Device); +#endif // WIFI_IHV_NETV + ULONG assocStatus = WDI_ASSOC_STATUS_SUCCESS; + + do + { + // We search for the BSSID pattern to figure out what AP we are trying to connect to + for (bssIndex = 0; bssIndex < pPreferredBSSEntryList->ElementCount; bssIndex++) + { + for (connectEntry = 1; connectEntry < ConnectEntryId_MAX; connectEntry++) + { + if (RtlCompareMemory( + pPreferredBSSEntryList->pElements[bssIndex].BSSID.Address, + g_ConnectEntries[connectEntry].pMacAddress, + sizeof(DOT11_MAC_ADDRESS)) == sizeof(DOT11_MAC_ADDRESS)) + { + PUCHAR pAssociationResult = g_ConnectEntries[connectEntry].pTlvAssociationResult; + + NewConnectEntryId = connectEntry; + m_LastConnectTransactionId = pWdiHeader->TransactionId; +#ifdef WIFI_IHV_NETV + // add peer on datapath + AddDatapathPeer(pDeviceContext->netAdapters[pWdiHeader->PortId], + reinterpret_cast<NET_EUI48_ADDRESS*>(g_ConnectEntries[connectEntry].pMacAddress)); +#endif // WIFI_IHV_NETV + +#ifdef WIFI_IHV_HANDSHAKE + // Pretend to recieve M1 on datapath before, the association complete has made it up the control path. + RecieveDatapathFrame(0x33, sizeof(pucData), pucData); +#endif // WIFI_IHV_HANDSHAKE + + if (NewAuthAlgo == WDI_AUTH_ALGO_WPA3_SAE) + { + WDI_INDICATION_SAE_AUTH_PARAMS_NEEDED_PARAMETERS SAEAuthParamsNeeded; + UINT8* pOutput = nullptr; + ULONG cbOutput = 0; + NDIS_STATUS ndisStatus = NDIS_STATUS_SUCCESS; + + // + // Handle special case for WPA3-SAE + // Send the Indication to request additonal SAE params + // + g_dwSaeResendConfirmRequested = 0; + SAEAuthParamsNeeded.SAEIndicationType = WDI_SAE_INDICATION_TYPE_COMMIT_REQUEST_PARAMS_NEEDED; + RtlCopyMemory( + SAEAuthParamsNeeded.BssId.Address, g_ConnectEntries[connectEntry].pMacAddress, sizeof(DOT11_MAC_ADDRESS)); + + ndisStatus = GenerateWdiIndicationSaeAuthParamsNeeded( + &SAEAuthParamsNeeded, 0, &pDeviceContext->TlvContext, &cbOutput, &pOutput); + if (ndisStatus == NDIS_STATUS_SUCCESS) + { + WFCInfo("[SAE] Indicating request for COMMIT_REQUEST_PARAMS_NEEDED ..."); + + WifiIhvSendIndicationToOs(Device, pWdiHeader, WDI_INDICATION_SAE_AUTH_PARAMS_NEEDED, 0, pOutput, cbOutput); + + FreeGenerated(pOutput); + + break; + } + } + + // Get the assoc status + RtlCopyMemory(&assocStatus, &pAssociationResult[18], sizeof(ULONG)); + + // Send the association indication + WifiIhvSendIndicationToOs( + Device, + pWdiHeader, + WDI_INDICATION_ASSOCIATION_RESULT, + 0, + g_ConnectEntries[connectEntry].pTlvAssociationResult, + g_ConnectEntries[connectEntry].TlvAssociationResultSize); + + break; + } + } + + // If we found a matching BSSID entry, we are done + if (connectEntry < ConnectEntryId_MAX) + { + break; + } + } + + } while (FALSE); + + if (WDI_ASSOC_STATUS_SUCCESS != assocStatus || 0 == NewConnectEntryId || bssIndex >= pPreferredBSSEntryList->ElementCount) + { + NewConnectEntryId = 0; // Disconnected State + NewAuthAlgo = WDI_AUTH_ALGO_80211_OPEN; + ntStatus = STATUS_UNSUCCESSFUL; + } + else + { + RtlCopyMemory(&m_ConnectedPeer, pPreferredBSSEntryList->pElements[bssIndex].BSSID.Address, sizeof(DOT11_MAC_ADDRESS)); + } + + m_LastConnectEntryId = NewConnectEntryId; + m_LastAuthAlgo = NewAuthAlgo; + + if (STATUS_SUCCESS == ntStatus && (WDI_AUTH_ALGO_WPA3_SAE != m_LastAuthAlgo)) + { + // Report link quality + ntStatus = WifiIhvSendLinkStateIndication(Device, pWdiHeader, 2); + } + + return ntStatus; +} + +NTSTATUS WifiHAL::WifiIhvSetSaeAuthParams(WDFDEVICE Device, const WDI_SET_SAE_AUTH_PARAMS_COMMAND& setSAEAuthParams, const PWDI_MESSAGE_HEADER pWdiHeader, PCTLV_CONTEXT Context) +{ + WDI_INDICATION_SAE_AUTH_PARAMS_NEEDED_PARAMETERS SAEAuthParamsNeeded{}; + UINT8* pOutput = nullptr; + ULONG cbOutput = 0; + + // Commit frame when Status = 0: FiniteCyclicGroup + Scalar + Element + // Commit frame when Status = 76: FiniteCyclicGroup + AntiCloggingToken + WFCInfo("WDI_SET_SAE_AUTH_PARAMS called!!!\n"); + if (WDI_SAE_REQUEST_TYPE_COMMIT_PARAMS == setSAEAuthParams.SAERequestType) + { + WFCInfo("[SAE] WDI_SET_SAE_AUTH_PARAMS has Commit request for Tx, Setting CommitResponse for Rx\n"); + + SAEAuthParamsNeeded.SAEIndicationType = WDI_SAE_INDICATION_TYPE_COMMIT_FRAME; + SAEAuthParamsNeeded.Optional.SAECommitFrame_IsPresent = 1; + + // + // Send reflection attack first + // + SAEAuthParamsNeeded.SAECommitFrame.ElementCount = sizeof(pucSAECommitResponseReflection); + SAEAuthParamsNeeded.SAECommitFrame.pElements = pucSAECommitResponseReflection; + } + else if ( + (WDI_SAE_REQUEST_TYPE_FAILURE == setSAEAuthParams.SAERequestType) && + (WDI_SAE_STATUS_COMMIT_MESSAGE_REFLECTION_ATTACK_DETECTED == setSAEAuthParams.SAEStatus)) + { + WFCInfo("[SAE] WDI_SET_SAE_AUTH_PARAMS returned Reflection error -- Inidicate proper CommitResponse for Rx\n"); + + SAEAuthParamsNeeded.SAEIndicationType = WDI_SAE_INDICATION_TYPE_CONFIRM_FRAME; + SAEAuthParamsNeeded.Optional.SAECommitFrame_IsPresent = 1; + SAEAuthParamsNeeded.SAECommitFrame.ElementCount = sizeof(pucSAECommitResponse); + SAEAuthParamsNeeded.SAECommitFrame.pElements = pucSAECommitResponse; + } + else if (WDI_SAE_REQUEST_TYPE_CONFIRM_PARAMS == setSAEAuthParams.SAERequestType) + { + WFCInfo("[SAE] WDI_SET_SAE_AUTH_PARAMS has Confirm request for Tx, Setting ConfirmResponse for Rx\n"); + + if (g_dwSaeResendConfirmRequested) + { + SAEAuthParamsNeeded.SAEIndicationType = WDI_SAE_INDICATION_TYPE_CONFIRM_FRAME; + SAEAuthParamsNeeded.Optional.SAECommitFrame_IsPresent = 1; + SAEAuthParamsNeeded.SAECommitFrame.ElementCount = sizeof(pucSAEConfirmResponse); + SAEAuthParamsNeeded.SAECommitFrame.pElements = pucSAEConfirmResponse; + } + else + { + g_dwSaeResendConfirmRequested = 1; + + SAEAuthParamsNeeded.SAEIndicationType = WDI_SAE_INDICATION_TYPE_CONFIRM_REQUEST_RESEND_REQUEST; + } + } + else + { + if (WDI_SAE_REQUEST_TYPE_FAILURE == setSAEAuthParams.SAERequestType) + { + WFCInfo("[SAE] OID_WDI_SET_SAE_AUTH_PARAMS has indicated error - %d\n", setSAEAuthParams.SAEStatus); + } + else if (WDI_SAE_REQUEST_TYPE_SUCCESS == setSAEAuthParams.SAERequestType) + { + WFCInfo("[SAE] OID_WDI_SET_SAE_AUTH_PARAMS has indicated SAE success - %d\n", setSAEAuthParams.SAEStatus); + } + else + { + WFCInfo("[SAE] OID_WDI_SET_SAE_AUTH_PARAMS has set INVALID Request type = %d\n", setSAEAuthParams.SAERequestType); + } + + // Send the association indication + // This assumes that the association result fields are in the right order + if (WDI_AUTH_ALGO_WPA3_SAE == m_LastAuthAlgo) + { + g_ConnectEntries[m_LastConnectEntryId].pTlvAssociationResult[27] = (UCHAR)WDI_AUTH_ALGO_WPA3_SAE; + } + else + { + g_ConnectEntries[m_LastConnectEntryId].pTlvAssociationResult[27] = (UCHAR)WDI_AUTH_ALGO_RSNA_PSK; + } + + WifiIhvSendIndicationToOs( + Device, + pWdiHeader, + WDI_INDICATION_ASSOCIATION_RESULT, + 0, + g_ConnectEntries[m_LastConnectEntryId].pTlvAssociationResult, + g_ConnectEntries[m_LastConnectEntryId].TlvAssociationResultSize); + RtlCopyMemory(&m_ConnectedPeer, &g_ConnectEntries[m_LastConnectEntryId].pMacAddress, sizeof(DOT11_MAC_ADDRESS)); + + // Report link quality + WX_RETURN_NTSTATUS_IF_NOT_NT_SUCCESS_MSG(WifiIhvSendLinkStateIndication(Device, pWdiHeader, 1), + "Failed WifiIhvSendLinkStateIndication"); + + WifiIhvSendIndicationToOs( + Device, pWdiHeader, WDI_INDICATION_CONNECT_COMPLETE, m_LastConnectTransactionId, nullptr, 0); +#ifdef WIFI_IHV_HANDSHAKE + // + // Receive M1 frame of 4-way handshake + // + RecieveDatapathFrame(0x33, sizeof(pucM1SaeFrame), pucM1SaeFrame); + + // + // Receive M3 frame of 4-way handshake + // + RecieveDatapathFrame(0x33, sizeof(pucM3SaeFrame), pucM3SaeFrame); +#endif + } + + RtlCopyMemory(SAEAuthParamsNeeded.BssId.Address, &g_ConnectEntries[m_LastConnectEntryId].pMacAddress, sizeof(DOT11_MAC_ADDRESS)); + + auto ndisStatus = + GenerateWdiIndicationSaeAuthParamsNeeded(&SAEAuthParamsNeeded, 0, Context, &cbOutput, &pOutput); + if (ndisStatus == NDIS_STATUS_SUCCESS) + { + WifiIhvSendIndicationToOs(Device, pWdiHeader, WDI_INDICATION_SAE_AUTH_PARAMS_NEEDED, 0, pOutput, cbOutput); + + FreeGenerated(pOutput); + } + else + { + WFCError("Failed to generate WDI_INDICATION_SAE_AUTH_PARAMS_NEEDED - 0x%08x\n", ndisStatus); + } + + return STATUS_SUCCESS; +} + +_Use_decl_annotations_ +void WifiHAL::WifiIhvPerformDisassociation(_In_ WDFDEVICE Device, _In_ PWDI_MESSAGE_HEADER pWdiHeader, _In_ WDI_ASSOC_STATUS DisassocStatus) +{ + UCHAR s_TLV_Disassociation[] = + { + // WDI_TLV_ASSOCIATION_RESULT + 0xBC, 0x00, + 0x0A, 0x00, + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + // WDI_TLV Need Peer Cleanup Params + 0xb4, 0x00, + 0x01, 0x00, + + 0x00 + }; + + RtlCopyMemory(&s_TLV_Disassociation[4], &m_ConnectedPeer, sizeof(DOT11_MAC_ADDRESS)); + RtlCopyMemory(&s_TLV_Disassociation[10], &DisassocStatus, sizeof(ULONG)); + + // Send the disassociation indication + WifiIhvSendIndicationToOs(Device, pWdiHeader, WDI_INDICATION_DISASSOCIATION, 0, s_TLV_Disassociation, sizeof(s_TLV_Disassociation)); + + m_LastConnectEntryId = 0; // Disconnected State + +#ifdef WIFI_IHV_NETV + DeleteDatapathPeer(0x33); +#endif + + WifiIhvSendIndicationToOs(Device, pWdiHeader, WDI_INDICATION_DISCONNECT_COMPLETE, pWdiHeader->TransactionId, nullptr, 0); +}
\ No newline at end of file diff --git a/network/wlan/WIFICX/drivercode/wifihal.h b/network/wlan/WIFICX/drivercode/wifihal.h new file mode 100644 index 00000000..5f1ec299 --- /dev/null +++ b/network/wlan/WIFICX/drivercode/wifihal.h @@ -0,0 +1,31 @@ +// Copyright (C) Microsoft Corporation. All rights reserved. +#pragma once + +// The class for Wifi IHV device's HAL functionalities +class WifiHAL +{ +public: + NTSTATUS WifiIhvSetDeviceCapabilities(_In_ WDFDEVICE Device); + NTSTATUS WifiIhvReset(_In_ WDFDEVICE Device,_In_ const WDI_TASK_DOT11_RESET_PARAMETERS& ResetParameters, _In_ const PWDI_MESSAGE_HEADER pWdiHeader, _In_ PCTLV_CONTEXT Context); + NTSTATUS WifiIhvSetRadioState(_In_ WDFDEVICE Device, _In_ const WDI_SET_RADIO_STATE_PARAMETERS& RadioState, _In_ const PWDI_MESSAGE_HEADER pWdiHeader, _In_ PCTLV_CONTEXT Context); + NTSTATUS WifiIhvScan(_In_ WDFDEVICE Device, _In_ WDI_SCAN_PARAMETERS& ScanParameters, _In_ const PWDI_MESSAGE_HEADER pWdiHeader, _In_ PCTLV_CONTEXT Context); + NTSTATUS WifiIhvConnect(_In_ WDFDEVICE Device, _In_ WDI_TASK_CONNECT_PARAMETERS& ConnectParameters, _In_ const PWDI_MESSAGE_HEADER pWdiHeader, _In_ PCTLV_CONTEXT Context); + NTSTATUS WifiIhvPerformAssociation(_In_ WDFDEVICE Device, _In_ struct ArrayOfElements<WDI_CONNECT_BSS_ENTRY_CONTAINER>* pPreferredBSSEntryList, _In_ struct ArrayOfElements<WDI_AUTH_ALGORITHM>* pAuthenticationAlgorithms, _In_ PWDI_MESSAGE_HEADER pWdiHeader); + NTSTATUS WifiIhvSetSaeAuthParams(_In_ WDFDEVICE Device, _In_ const WDI_SET_SAE_AUTH_PARAMS_COMMAND& setSAEAuthParams, _In_ const PWDI_MESSAGE_HEADER pWdiHeader, _In_ PCTLV_CONTEXT Context); + void WifiIhvPerformDisassociation(_In_ WDFDEVICE Device, _In_ PWDI_MESSAGE_HEADER pWdiHeader, _In_ WDI_ASSOC_STATUS DisassocStatus); +private: + NTSTATUS WifiIhvSendLinkStateIndication(_In_ WDFDEVICE Device, _In_ PWDI_MESSAGE_HEADER pWdiHeader, ULONG numLinks); + + UCHAR m_CurrentRadioState{}; + UINT32 m_LastConnectEntryId{}; + UINT32 m_LastConnectTransactionId{}; + WDI_AUTH_ALGORITHM m_LastAuthAlgo{}; + DOT11_MAC_ADDRESS m_ConnectedPeer{}; + + const WDI_MAC_ADDRESS m_LocalLinkAddresses[2] = { + {0x11, 0x01, 0x02, 0x03, 0x04, 0x21}, + {0x11, 0x01, 0x02, 0x03, 0x04, 0x22}, + }; + + const ULONG m_SupportedBands = (WDI_BAND_ID_2400 | WDI_BAND_ID_5000 | WDI_BAND_ID_6000); +}; diff --git a/network/wlan/WIFICX/drivercode/testdata.h b/network/wlan/WIFICX/drivercode/wifihaltestdata.h index f8f83f63..7ded0f2b 100644 --- a/network/wlan/WIFICX/drivercode/testdata.h +++ b/network/wlan/WIFICX/drivercode/wifihaltestdata.h @@ -1,45 +1,11 @@ -/*++ - -Copyright (c) Microsoft Corporation. All rights reserved. - - Microsoft Confidential - - THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY - KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR - PURPOSE. - -Module Name: - - TestData.h - -Abstract: - - Test only Network data - -Environment: - - Kernel mode - -Author: - - ---*/ - +// Copyright (C) Microsoft Corporation. All rights reserved. #pragma once #define TESTMP_BAND_IHV 0x00000010 -typedef struct -{ - UINT32 BandId; - WDI_MAC_ADDRESS* pMacAddress; - PUCHAR pTlvBssEntry; - UINT32 TlvBssEntrySize; - PUCHAR pTlvAssociationResult; - UINT32 TlvAssociationResultSize; +// clang-format on -} WdiTestConnectEntry, *PWdiTestConnectEntry; +#define ConnectEntryId_MAX ARRAYSIZE(g_ConnectEntries) // //=============================================================================== @@ -7434,6 +7400,891 @@ UCHAR s_TLV_SuccessOpenAssociationResult_42_DualSta_6Ghz[] = }; //=============================================================================== +// Data throughput test networks +//=============================================================================== +// + +__declspec(selectany) WDI_MAC_ADDRESS s_Connect_Addr_43_Speed_01_WiFi7_Open_Link_1 = {0x22, 0x22, 0x22, 0x22, 0x00, 0x01}; +__declspec(selectany) WDI_MAC_ADDRESS s_Connect_Addr_44_Speed_02_WiFi7_Open_Link_1 = {0x22, 0x22, 0x22, 0x22, 0x00, 0x02}; +__declspec(selectany) UCHAR s_TLV_BSS_Entry_43_WiFi7_Open_Link_1 [] = +{ + // WDI_TLV_BSS_ENTRY + 0x08, 0x00, //Type + 0xca, 0x00, //Len + + // WDI_TLV_BSSID + 0x02, 0x00, // Type + 0x06, 0x00, // Length + 0x22, 0x22, 0x22, 0X22, 0x00, 0x01, // AP Link 1 address + // WDI_TLV_BEACON_FRAME + 0x0a, 0x00, + 0x97, 0x00, + 0x22, 0x02, 0x2C, 0x01, 0x00, 0x00, 0x00, 0x00, // Timestamp + 0x64, 0x00, // Beacon Interval + 0x01, 0x00, // Capability + 0x00, 0x0e, // SSID + 'W', 'i', '-', 'F', 'i', ' ', '7', ' ', '-', ' ', 'D', 'T', '0', '1', + 0x01, 0x08, + 0x82, 0x84, 0x8B, 0x96, 0x24, 0x30, 0x48, 0x6C, // Supported Rates + 0x03, 0x01, + 0x06, // DSS Parameters + 0x05, 0x04, + 0x00, 0x01, 0x00, 0x00, // TIM + 0x2A, 0x01, + 0x00, // ERP + 0x2F, 0x01, + 0x00, // Reserved + 0xff, 0x23, // Multilink Extension Element + 0x6B, // Multilink Extension ID + // [B7-B4] [B3-B0] [B15-B12] [b11-B8] + // [EML=0 + Medium=0 + BSS=1 + LinkID=1] [Reserved=0 + Basic=0] [Reserved=0000] [Reserved=000 MLD=0] + 0x20, 0x00, // MultiLink Control ([Reserved=0000000 + MLDCapabilities=1 + 000 + LinkID=1 + Reserved=0 + Basic=000] = 0000000 1 000 1 0 000 = 0x0110) + 0x09, // Common Info length + 0x00, 0xA0, 0xB0, 0xC0, 0xD1, 0x06, // AP MLD Mac address (required for Basic) + 0x01, // [ Link ID (1 octet) - in Beacon/ProbeResp/(Re)AssocResp frames ] + // [ BSS Parameters Change Count (1 octet) - from AP only ] + // [ Medium Synchronization delay (2 octets) - from AP only] + // [ EML Capabilities (2 octets) ] + 0x00, 0x03, // [ MLD Capabilities (2 octets) - (3 links max) in Beacon/ProbeResp/(Re)AssocReq/(Re)AssocResp frames ] + // Per-Sta profile - 1/2 (Link 2) + 0x00, // Subelement ID = 0 for Per-Sta Profile Element + 0x09, // Length + // STA Control = [B7-B4] [B3-B0] [B15-B12] [b11-B8] + 0x33, 0x00, // [DTIM=0 + BeaconInt=0 + MAC=1 + Complete=1] [LinkID=0011] [Reserved=0000] [Reserved=0 + BSS=0 + NTSRBit=0 + NTSRPres=0] + 0x06, // STA Info : Length + 0x00, 0xA0, 0xB0, 0xC0, 0xD1, 0x08, // STA Info : AP Link2 MAC address + // Remaining STA Profile for Link 2 + // Per-Sta profile - 2/2 (Link 3) + 0x00, // Subelement ID = 0 for Per-Sta Profile Element + 0x09, // Length + // STA Control = [B7-B4] [B3-B0] [B15-B12] [b11-B8] + 0x37, 0x00, // [DTIM=0 + BeaconInt=0 + MAC=1 + Complete=1] [LinkID=0011] [Reserved=0000] [Reserved=0 + BSS=0 + NTSRBit=0 + NTSRPres=0] + 0x06, // STA Info : Length + 0x00, 0xA0, 0xB0, 0xC0, 0xD1, 0x09, // STA Info : AP Link 3 MAC address + // Remaining STA Profile for Link 3 + 0xc9, 0x14, // RNR IE + 0x04, 0x10, // TBTT: 0x04 => B2=1(FilteredAP),B4-B7=0(TBTT Information Count=0+1) :: 0x0c = TBTT Length + 0x51, 0x06, // Operating Class = 81 (2.4 GHz), Channel = 6 + 0x00, // TBTTOffset + 0x00, 0xA0, 0xB0, 0xC0, 0xD1, 0x08, // Bssid + 0x1d, 0xc5, 0x3b, 0x12, // ShortSsid + 0x40, // BssParameters + 0x00, // 20 MHz + 0x12, 0x03, 0x56, // Mld Parameters: MLD ID(8 bits) : LinkID (4 bits) + ... + 0xc9, 0x14, // RNR IE + 0x04, 0x10, // TBTT: 0x04 => B2=1(FilteredAP),B4-B7=0(TBTT Information Count=0+1) :: 0x0c = TBTT Length + 0x51, 0x06, // Operating Class = 81 (2.4 GHz), Channel = 6 + 0x00, // TBTTOffset + 0x00, 0xA0, 0xB0, 0xC0, 0xD1, 0x09, // Bssid + 0x1d, 0xc5, 0x3b, 0x12, // ShortSsid + 0x40, // BssParameters + 0x00, // 20 MHz + 0x12, 0x07, 0x56, // Mld Parameters: MLD ID(8 bits) : LinkID (4 bits) + ... + 0x32, 0x04, + 0x0C, 0x12, 0x18, 0x60, // Extended Supported Rates + 0xDD, 0x09, + 0x00, 0x10, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, // Vendor Specific + + // WDI_TLV_BSS_ENTRY_DEVICE_CONTEXT + 0x0d, 0x00, + 0x09, 0x00, + 0x04, 0x05, 0x06, 0x07, 0x04, 0x05, 0x06, 0x07, 0x00, + + // WDI_TLV_BSS_ENTRY_SIGNAL_INFO + 0x0b, 0x00, + 0x08, 0x00, + 0xCE, 0xFF, 0xFF, 0xFF, // RSSI + 0x5A, 0x00, 0x00, 0x00, // Link Quality + + // WDI_TLV_BSS_ENTRY_PHY_INFO + 0x3a, 0x00, + 0x08, 0x00, + 0x9d, 0x00, 0x00, 0x00, // Channel + 0x02, 0x00, 0x00, 0x00 // BandId + +}; + +__declspec(selectany) UCHAR s_TLV_Success_AssociationResult_43_WiFi7_Open_Link_1[] = +{ + // WDI_TLV_ASSOCIATION_RESULT + 0x35, 0x00, + 0xb3, 0x01, + + // WDI_TLV_BSSID + 0x02, 0x00, + 0x06, 0x00, + 0x22, 0x22, 0x22, 0x22, 0x00, 0x01, // AP Link 1 Mac Address + + // WDI_TLV_ASSOCIATION_RESULT_PARAMETERS + 0x2D, 0x00, + 0x30, 0x00, + 0x00, 0x00, 0x00, 0x00, // Association Status + 0x00, 0x00, 0x00, 0x00, // Status Code + 0x00, // ReAssociationRequest + 0x00, 0x00, 0x00, 0x00, // AuthAlgorithm = WDI_CIPHER_ALGO_NONE = 0 + 0x00, 0x00, 0x00, 0x00, // UnicastCipherAlgorithm = WDI_AUTH_ALGO_80211_OPEN = 0 + 0x00, 0x00, 0x00, 0x00, // MulticastDataCipherAlgorithm = WDI_AUTH_ALGO_80211_OPEN = 0 + 0x00, 0x00, 0x00, 0x00, // MulticastMgmtCipherAlgorithm = WDI_AUTH_ALGO_80211_OPEN = 0 + 0x00, // FourAddressSupported + 0x00, // Port Authorized + 0x00, // WMM QoS Enabled + 0x00, 0x00, 0x00, 0x00, // DSInfo + 0x00, 0x00, 0x00, 0x00, // AssociationComebackTime + 0x02, 0x00, 0x00, 0x00, // Band ID + 0x00, 0x00, 0x00, 0x00, // IHV Association Status + 0x00, 0x00, 0x00, 0x00, //DisableDataPathOffloadsScenario + + // WDI_TLV_ASSOCIATION_REQUEST_FRAME + 0x2E, 0x00, + 0x75, 0x00, + 0x21, 0x04, // Capabilities + 0x0A, 0x00, // Listen Interval + 0x00, 0x0e, // SSID + 'W', 'i', '-', 'F', 'i', ' ', '7', ' ', '-', ' ', 'D', 'T', '0', '1', + 0x01, 0x08, + 0x82, 0x84, 0x8B, 0x96, 0x24, 0x30, 0x48, 0x6C, // Rates + 0x21, 0x02, + 0x07, 0x12, //Power Capability + 0x24, 0x02, + 0x01, 0x0B, //Supported Channels + 0x32, 0x04, + 0x0C, 0x12, 0x18, 0x60, //Extended Rates + 0xDD, 0x08, + 0x00, 0x50, 0xF2, 0x02, 0x00, 0x01, 0x00, 0x03, // WMM settings + 0xff, 0x3d, // Multilink Extension Element + 0x6B, // Multilink Extension ID + // Multi-Link Control = [B7-B4] [B3-B0] [B15-B12] [b11-B8] + 0x80, 0x01, // [EML=1 + Medium=0 + BSS=0 + LinkID=0] [Reserved=0 + Basic=0] [Reserved=0000] [Reserved=000 MLD=1] + 0x0b, // Common Info length + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, // Local STA MLD Mac address (required for Basic) + // [ Link ID (1 octet) - in Beacon/ProbeResp/(Re)AssocResp frames ] + // [ BSS Parameters Change Count (1 octet) - from AP only ] + // [ Medium Synchronization delay (2 octets) - from AP only] + 0x81, 0x00, 0x00, // [ EML Capabilities (3 octets) ] + 0x02, 0x00, // [ MLD Capabilities (2 octets) - (2 links max) in Beacon/ProbeResp/(Re)AssocReq/(Re)AssocResp frames ] + // Per-Sta profile - 1/2 (Link 2) + 0x00, // Subelement ID = 0 for Per-Sta Profile Element + 0x15, // Length + // STA Control = [B7-B4] [B3-B0] [B15-B12] [b11-B8] + 0x32, 0x00, // [DTIM=0 + BeaconInt=0 + MAC=1 + Complete=1] [LinkID=0010] [Reserved=0000] [Reserved=0 + BSS=0 + NTSRBit=0 + NTSRPres=0] + 0x06, // Length + 0x11, 0x01, 0x02, 0x03, 0x04, 0x21, // STA Info : Local Link 1 MAC address + // STA Profile + // Remaining STA Profile for Link 2 + 0x11, 0x15, 0x21, 0x02, 0x00, 0x0e, 0xff, 0x03, 0x38, 0x01, 0x30, 0x00, + // Per-Sta profile - 2/2 (Link 3) + 0x00, // Subelement ID = 0 for Per-Sta Profile Element + 0x15, // Length = 21 + // STA Control = [B7-B4] [B3-B0] [B15-B12] [b11-B8] + 0x33, 0x00, // [DTIM=0 + BeaconInt=0 + MAC=1 + Complete=1] [LinkID=0011] [Reserved=0000] [Reserved=0 + BSS=0 + NTSRBit=0 + NTSRPres=0] + 0x06, // Length + 0x11, 0x01, 0x02, 0x03, 0x04, 0x22, // STA Info : Local Sta Link 2 MAC address + // STA Profile + // Remaining STA Profile for Link 3 + 0x11, 0x15, 0x21, 0x02, 0x00, 0x0e, 0xff, 0x03, 0x38, 0x01, 0x30, 0x00, + + + // WDI_TLV_ASSOCIATION_RESPONSE_FRAME + 0x2F, 0x00, + 0x55, 0x00, + 0x01, 0x04, //Capability + 0x00, 0x00, //Status + 0x01, 0xC0, //Association ID + 0x01, 0x08, + 0x82, 0x84, 0x8B, 0x96, 0x24, 0x30, 0x48, 0x6C, //Rates + 0x32, 0x04, + 0x0C, 0x12, 0x18, 0x60, //Extended Rates + 0xDD, 0x18, + 0x00, 0x50, 0xF2, 0x02, 0x01, 0x01, 0x80, 0x00, 0x03, 0xA4, 0x00, 0x00, 0x27, 0xA4, 0x00, 0x00, 0x42, 0x43, 0x5E, 0x00, 0x62, 0x32, 0x2F, 0x00, //WMM settings + 0xff, 0x23, // Multilink Extension Element + 0x6B, // Multilink Extension ID + 0x01, 0x10, // MultiLink Control ([Reserved=0000000 + MLDCapabilities=1 + 000 + LinkID=1 + Reserved=0 + Basic=000] = 0000000 1 000 1 0 000 = 0x0110) + 0x09, // Common Info length + 0x00, 0xA0, 0xB0, 0xC0, 0xD1, 0x06, // AP MLD Mac address (required for Basic) + 0x01, // [ Link ID (1 octet) - in Beacon/ProbeResp/(Re)AssocResp frames ] + // [ BSS Parameters Change Count (1 octet) - from AP only ] + // [ Medium Synchronization delay (2 octets) - from AP only] + // [ EML Capabilities (2 octets) ] + 0x00, 0x03, // [ MLD Capabilities (2 octets) - (3 links max) in Beacon/ProbeResp/(Re)AssocReq/(Re)AssocResp frames ] + // Per-Sta profile - 1/2 (Link 2) + 0x00, // Subelement ID = 0 for Per-Sta Profile Element + 0x09, // Length + 0x00, 0x22, // STA Control = (Reserved=00000+BSSParam=0+NTSRBS=0+NTSRLP=0+DTIM=0+BeaconInt=0+MAC=1+CompleteP=0+LinkID=0001) = 0x0021 + 0x00, // STA Info : Length + 0x22, 0x22, 0x22, 0x22, 0x00, 0x01, // STA Info : AP Link 1 MAC address + // STA Profile + // Per-Sta profile - 2/2 (Link 3) + 0x00, // Subelement ID = 0 for Per-Sta Profile Element + 0x09, // Length + 0x00, 0x23, // STA Control = (Reserved=00000+BSSParam=0+NTSRBS=0+NTSRLP=0+DTIM=0+BeaconInt=0+MAC=1+CompleteP=0+LinkID=0001) = 0x0021 + 0x00, // STA Info : Length + 0x22, 0x22, 0x22, 0x22, 0x00, 0x02, // STA Info : AP Link 2 MAC address + // STA Profile + + + // WDI_TLV_BEACON_FRAME + 0x30, 0x00, + 0x97, 0x00, + + 0x22, 0x02, 0x2C, 0x01, 0x00, 0x00, 0x00, 0x00, // Timestamp + 0x01, 0x00, // Beacon Interval + 0x31, 0x04, // Capability + 0x00, 0x0e, // SSID + 'W', 'i', '-', 'F', 'i', ' ', '7', ' ', '-', ' ', 'D', 'T', '0', '1', + 0x01, 0x08, + 0x82, 0x84, 0x8B, 0x96, 0x24, 0x30, 0x48, 0x6C, // Supported Rates + 0x03, 0x01, + 0x06, // DSS Parameters + 0x05, 0x04, + 0x00, 0x01, 0x00, 0x00, // TIM + 0x2A, 0x01, + 0x00, // ERP + 0x2F, 0x01, + 0x00, // Reserved + 0xff, 0x23, // Multilink Extension Element + 0x6B, // Multilink Extension ID + 0x01, 0x10, // MultiLink Control ([Reserved=0000000 + MLDCapabilities=1 + 000 + LinkID=1 + Reserved=0 + Basic=000] = 0000000 1 000 1 0 000 = 0x0110) + 0x09, // Common Info length + 0x00, 0xA0, 0xB0, 0xC0, 0xD1, 0x06, // AP MLD Mac address (required for Basic) + 0x01, // [ Link ID (1 octet) - in Beacon/ProbeResp/(Re)AssocResp frames ] + // [ BSS Parameters Change Count (1 octet) - from AP only ] + // [ Medium Synchronization delay (2 octets) - from AP only] + // [ EML Capabilities (2 octets) ] + 0x00, 0x03, // [ MLD Capabilities (2 octets) - (3 links max) in Beacon/ProbeResp/(Re)AssocReq/(Re)AssocResp frames ] + // Per-Sta profile - 1/2 (Link 2) + 0x00, // Subelement ID = 0 for Per-Sta Profile Element + 0x09, // Length + 0x00, 0x22, // STA Control = (Reserved=00000+BSSParam=0+NTSRBS=0+NTSRLP=0+DTIM=0+BeaconInt=0+MAC=1+CompleteP=0+LinkID=0001) = 0x0021 + 0x00, // STA Info : Length + 0x00, 0xA0, 0xB0, 0xC0, 0xD1, 0x08, // STA Info : AP Link 1 MAC address + // STA Profile + // Per-Sta profile - 2/2 (Link 3) + 0x00, // Subelement ID = 0 for Per-Sta Profile Element + 0x09, // Length + 0x00, 0x23, // STA Control = (Reserved=00000+BSSParam=0+NTSRBS=0+NTSRLP=0+DTIM=0+BeaconInt=0+MAC=1+CompleteP=0+LinkID=0001) = 0x0021 + 0x00, // STA Info : Length + 0x00, 0xA0, 0xB0, 0xC0, 0xD1, 0x09, // STA Info : AP Link 2 MAC address + // STA Profile + 0xc9, 0x14, // RNR IE + 0x04, 0x10, // TBTT: 0x04 => B2=1(FilteredAP),B4-B7=0(TBTT Information Count=0+1) :: 0x0c = TBTT Length + 0x51, 0x06, // Operating Class = 81 (2.4 GHz), Channel = 6 + 0x00, // TBTTOffset + 0x00, 0xA0, 0xB0, 0xC0, 0xD1, 0x08, // Bssid + 0x1d, 0xc5, 0x3b, 0x12, // ShortSsid + 0x40, // BssParameters + 0x00, // 20 MHz + 0x12, 0x03, 0x56, // Mld Parameters: MLD ID(8 bits) : LinkID (4 bits) + ... + 0xc9, 0x14, // RNR IE + 0x04, 0x10, // TBTT: 0x04 => B2=1(FilteredAP),B4-B7=0(TBTT Information Count=0+1) :: 0x0c = TBTT Length + 0x51, 0x06, // Operating Class = 81 (2.4 GHz), Channel = 6 + 0x00, // TBTTOffset + 0x00, 0xA0, 0xB0, 0xC0, 0xD1, 0x09, // Bssid + 0x1d, 0xc5, 0x3b, 0x12, // ShortSsid + 0x40, // BssParameters + 0x00, // 20 MHz + 0x12, 0x07, 0x56, // Mld Parameters: MLD ID(8 bits) : LinkID (4 bits) + ... + 0x32, 0x04, + 0x0C, 0x12, 0x18, 0x60, // Extended Supported Rates + 0xDD, 0x09, + 0x00, 0x10, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, // Vendor Specific + + // WDI_TLV_PHY_TYPE_LIST + 0x19, 0x00, + 0x04, 0x00, + 0x0b, 0x00, 0x00, 0x00, // dot11_phy_type_eht + +}; + + +__declspec(selectany) UCHAR s_TLV_BSS_Entry_44_WiFi7_Open_Link_1 [] = +{ + // WDI_TLV_BSS_ENTRY + 0x08, 0x00, //Type + 0xca, 0x00, //Len + + // WDI_TLV_BSSID + 0x02, 0x00, // Type + 0x06, 0x00, // Length + 0x22, 0x22, 0x22, 0x22, 0x00, 0x02, // AP Link 1 address + // WDI_TLV_BEACON_FRAME + 0x0a, 0x00, + 0x97, 0x00, + 0x22, 0x02, 0x2C, 0x01, 0x00, 0x00, 0x00, 0x00, // Timestamp + 0x64, 0x00, // Beacon Interval + 0x01, 0x00, // Capability + 0x00, 0x0e, // SSID + 'W', 'i', '-', 'F', 'i', ' ', '7', ' ', '-', ' ', 'D', 'T', '0', '2', + 0x01, 0x08, + 0x82, 0x84, 0x8B, 0x96, 0x24, 0x30, 0x48, 0x6C, // Supported Rates + 0x03, 0x01, + 0x06, // DSS Parameters + 0x05, 0x04, + 0x00, 0x01, 0x00, 0x00, // TIM + 0x2A, 0x01, + 0x00, // ERP + 0x2F, 0x01, + 0x00, // Reserved + 0xff, 0x23, // Multilink Extension Element + 0x6B, // Multilink Extension ID + // [B7-B4] [B3-B0] [B15-B12] [b11-B8] + // [EML=0 + Medium=0 + BSS=1 + LinkID=1] [Reserved=0 + Basic=0] [Reserved=0000] [Reserved=000 MLD=0] + 0x20, 0x00, // MultiLink Control ([Reserved=0000000 + MLDCapabilities=1 + 000 + LinkID=1 + Reserved=0 + Basic=000] = 0000000 1 000 1 0 000 = 0x0110) + 0x09, // Common Info length + 0x00, 0xA0, 0xB0, 0xC0, 0xD1, 0x06, // AP MLD Mac address (required for Basic) + 0x01, // [ Link ID (1 octet) - in Beacon/ProbeResp/(Re)AssocResp frames ] + // [ BSS Parameters Change Count (1 octet) - from AP only ] + // [ Medium Synchronization delay (2 octets) - from AP only] + // [ EML Capabilities (2 octets) ] + 0x00, 0x03, // [ MLD Capabilities (2 octets) - (3 links max) in Beacon/ProbeResp/(Re)AssocReq/(Re)AssocResp frames ] + // Per-Sta profile - 1/2 (Link 2) + 0x00, // Subelement ID = 0 for Per-Sta Profile Element + 0x09, // Length + // STA Control = [B7-B4] [B3-B0] [B15-B12] [b11-B8] + 0x33, 0x00, // [DTIM=0 + BeaconInt=0 + MAC=1 + Complete=1] [LinkID=0011] [Reserved=0000] [Reserved=0 + BSS=0 + NTSRBit=0 + NTSRPres=0] + 0x06, // STA Info : Length + 0x00, 0xA0, 0xB0, 0xC0, 0xD1, 0x08, // STA Info : AP Link2 MAC address + // Remaining STA Profile for Link 2 + // Per-Sta profile - 2/2 (Link 3) + 0x00, // Subelement ID = 0 for Per-Sta Profile Element + 0x09, // Length + // STA Control = [B7-B4] [B3-B0] [B15-B12] [b11-B8] + 0x37, 0x00, // [DTIM=0 + BeaconInt=0 + MAC=1 + Complete=1] [LinkID=0011] [Reserved=0000] [Reserved=0 + BSS=0 + NTSRBit=0 + NTSRPres=0] + 0x06, // STA Info : Length + 0x00, 0xA0, 0xB0, 0xC0, 0xD1, 0x09, // STA Info : AP Link 3 MAC address + // Remaining STA Profile for Link 3 + 0xc9, 0x14, // RNR IE + 0x04, 0x10, // TBTT: 0x04 => B2=1(FilteredAP),B4-B7=0(TBTT Information Count=0+1) :: 0x0c = TBTT Length + 0x51, 0x06, // Operating Class = 81 (2.4 GHz), Channel = 6 + 0x00, // TBTTOffset + 0x00, 0xA0, 0xB0, 0xC0, 0xD1, 0x08, // Bssid + 0x1d, 0xc5, 0x3b, 0x12, // ShortSsid + 0x40, // BssParameters + 0x00, // 20 MHz + 0x12, 0x03, 0x56, // Mld Parameters: MLD ID(8 bits) : LinkID (4 bits) + ... + 0xc9, 0x14, // RNR IE + 0x04, 0x10, // TBTT: 0x04 => B2=1(FilteredAP),B4-B7=0(TBTT Information Count=0+1) :: 0x0c = TBTT Length + 0x51, 0x06, // Operating Class = 81 (2.4 GHz), Channel = 6 + 0x00, // TBTTOffset + 0x00, 0xA0, 0xB0, 0xC0, 0xD1, 0x09, // Bssid + 0x1d, 0xc5, 0x3b, 0x12, // ShortSsid + 0x40, // BssParameters + 0x00, // 20 MHz + 0x12, 0x07, 0x56, // Mld Parameters: MLD ID(8 bits) : LinkID (4 bits) + ... + 0x32, 0x04, + 0x0C, 0x12, 0x18, 0x60, // Extended Supported Rates + 0xDD, 0x09, + 0x00, 0x10, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, // Vendor Specific + + // WDI_TLV_BSS_ENTRY_DEVICE_CONTEXT + 0x0d, 0x00, + 0x09, 0x00, + 0x04, 0x05, 0x06, 0x07, 0x04, 0x05, 0x06, 0x07, 0x00, + + // WDI_TLV_BSS_ENTRY_SIGNAL_INFO + 0x0b, 0x00, + 0x08, 0x00, + 0xCE, 0xFF, 0xFF, 0xFF, // RSSI + 0x5A, 0x00, 0x00, 0x00, // Link Quality + + // WDI_TLV_BSS_ENTRY_PHY_INFO + 0x3a, 0x00, + 0x08, 0x00, + 0x9d, 0x00, 0x00, 0x00, // Channel + 0x02, 0x00, 0x00, 0x00 // BandId + +}; + +__declspec(selectany) UCHAR s_TLV_Success_AssociationResult_44_WiFi7_Open_Link_1[] = +{ + // WDI_TLV_ASSOCIATION_RESULT + 0x35, 0x00, + 0xb3, 0x01, + + // WDI_TLV_BSSID + 0x02, 0x00, + 0x06, 0x00, + 0x22, 0x22, 0x22, 0x22, 0x00, 0x02, // AP Link 1 Mac Address + + // WDI_TLV_ASSOCIATION_RESULT_PARAMETERS + 0x2D, 0x00, + 0x30, 0x00, + 0x00, 0x00, 0x00, 0x00, // Association Status + 0x00, 0x00, 0x00, 0x00, // Status Code + 0x00, // ReAssociationRequest + 0x00, 0x00, 0x00, 0x00, // AuthAlgorithm = WDI_CIPHER_ALGO_NONE = 0 + 0x00, 0x00, 0x00, 0x00, // UnicastCipherAlgorithm = WDI_AUTH_ALGO_80211_OPEN = 0 + 0x00, 0x00, 0x00, 0x00, // MulticastDataCipherAlgorithm = WDI_AUTH_ALGO_80211_OPEN = 0 + 0x00, 0x00, 0x00, 0x00, // MulticastMgmtCipherAlgorithm = WDI_AUTH_ALGO_80211_OPEN = 0 + 0x00, // FourAddressSupported + 0x00, // Port Authorized + 0x00, // WMM QoS Enabled + 0x00, 0x00, 0x00, 0x00, // DSInfo + 0x00, 0x00, 0x00, 0x00, // AssociationComebackTime + 0x02, 0x00, 0x00, 0x00, // Band ID + 0x00, 0x00, 0x00, 0x00, // IHV Association Status + 0x00, 0x00, 0x00, 0x00, //DisableDataPathOffloadsScenario + + // WDI_TLV_ASSOCIATION_REQUEST_FRAME + 0x2E, 0x00, + 0x75, 0x00, + 0x21, 0x04, // Capabilities + 0x0A, 0x00, // Listen Interval + 0x00, 0x0e, // SSID + 'W', 'i', '-', 'F', 'i', ' ', '7', ' ', '-', ' ', 'D', 'T', '0', '2', + 0x01, 0x08, + 0x82, 0x84, 0x8B, 0x96, 0x24, 0x30, 0x48, 0x6C, // Rates + 0x21, 0x02, + 0x07, 0x12, //Power Capability + 0x24, 0x02, + 0x01, 0x0B, //Supported Channels + 0x32, 0x04, + 0x0C, 0x12, 0x18, 0x60, //Extended Rates + 0xDD, 0x08, + 0x00, 0x50, 0xF2, 0x02, 0x00, 0x01, 0x00, 0x03, // WMM settings + 0xff, 0x3d, // Multilink Extension Element + 0x6B, // Multilink Extension ID + // Multi-Link Control = [B7-B4] [B3-B0] [B15-B12] [b11-B8] + 0x80, 0x01, // [EML=1 + Medium=0 + BSS=0 + LinkID=0] [Reserved=0 + Basic=0] [Reserved=0000] [Reserved=000 MLD=1] + 0x0b, // Common Info length + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, // Local STA MLD Mac address (required for Basic) + // [ Link ID (1 octet) - in Beacon/ProbeResp/(Re)AssocResp frames ] + // [ BSS Parameters Change Count (1 octet) - from AP only ] + // [ Medium Synchronization delay (2 octets) - from AP only] + 0x81, 0x00, 0x00, // [ EML Capabilities (3 octets) ] + 0x02, 0x00, // [ MLD Capabilities (2 octets) - (2 links max) in Beacon/ProbeResp/(Re)AssocReq/(Re)AssocResp frames ] + // Per-Sta profile - 1/2 (Link 2) + 0x00, // Subelement ID = 0 for Per-Sta Profile Element + 0x15, // Length + // STA Control = [B7-B4] [B3-B0] [B15-B12] [b11-B8] + 0x32, 0x00, // [DTIM=0 + BeaconInt=0 + MAC=1 + Complete=1] [LinkID=0010] [Reserved=0000] [Reserved=0 + BSS=0 + NTSRBit=0 + NTSRPres=0] + 0x06, // Length + 0x11, 0x01, 0x02, 0x03, 0x04, 0x21, // STA Info : Local Link 1 MAC address + // STA Profile + // Remaining STA Profile for Link 2 + 0x11, 0x15, 0x21, 0x02, 0x00, 0x0e, 0xff, 0x03, 0x38, 0x01, 0x30, 0x00, + // Per-Sta profile - 2/2 (Link 3) + 0x00, // Subelement ID = 0 for Per-Sta Profile Element + 0x15, // Length = 21 + // STA Control = [B7-B4] [B3-B0] [B15-B12] [b11-B8] + 0x33, 0x00, // [DTIM=0 + BeaconInt=0 + MAC=1 + Complete=1] [LinkID=0011] [Reserved=0000] [Reserved=0 + BSS=0 + NTSRBit=0 + NTSRPres=0] + 0x06, // Length + 0x11, 0x01, 0x02, 0x03, 0x04, 0x22, // STA Info : Local Sta Link 2 MAC address + // STA Profile + // Remaining STA Profile for Link 3 + 0x11, 0x15, 0x21, 0x02, 0x00, 0x0e, 0xff, 0x03, 0x38, 0x01, 0x30, 0x00, + + + // WDI_TLV_ASSOCIATION_RESPONSE_FRAME + 0x2F, 0x00, + 0x55, 0x00, + 0x01, 0x04, //Capability + 0x00, 0x00, //Status + 0x01, 0xC0, //Association ID + 0x01, 0x08, + 0x82, 0x84, 0x8B, 0x96, 0x24, 0x30, 0x48, 0x6C, //Rates + 0x32, 0x04, + 0x0C, 0x12, 0x18, 0x60, //Extended Rates + 0xDD, 0x18, + 0x00, 0x50, 0xF2, 0x02, 0x01, 0x01, 0x80, 0x00, 0x03, 0xA4, 0x00, 0x00, 0x27, 0xA4, 0x00, 0x00, 0x42, 0x43, 0x5E, 0x00, 0x62, 0x32, 0x2F, 0x00, //WMM settings + 0xff, 0x23, // Multilink Extension Element + 0x6B, // Multilink Extension ID + 0x01, 0x10, // MultiLink Control ([Reserved=0000000 + MLDCapabilities=1 + 000 + LinkID=1 + Reserved=0 + Basic=000] = 0000000 1 000 1 0 000 = 0x0110) + 0x09, // Common Info length + 0x00, 0xA0, 0xB0, 0xC0, 0xD1, 0x06, // AP MLD Mac address (required for Basic) + 0x01, // [ Link ID (1 octet) - in Beacon/ProbeResp/(Re)AssocResp frames ] + // [ BSS Parameters Change Count (1 octet) - from AP only ] + // [ Medium Synchronization delay (2 octets) - from AP only] + // [ EML Capabilities (2 octets) ] + 0x00, 0x03, // [ MLD Capabilities (2 octets) - (3 links max) in Beacon/ProbeResp/(Re)AssocReq/(Re)AssocResp frames ] + // Per-Sta profile - 1/2 (Link 2) + 0x00, // Subelement ID = 0 for Per-Sta Profile Element + 0x09, // Length + 0x00, 0x22, // STA Control = (Reserved=00000+BSSParam=0+NTSRBS=0+NTSRLP=0+DTIM=0+BeaconInt=0+MAC=1+CompleteP=0+LinkID=0001) = 0x0021 + 0x00, // STA Info : Length + 0x22, 0x22, 0x22, 0x22, 0x00, 0x01, // STA Info : AP Link 1 MAC address + // STA Profile + // Per-Sta profile - 2/2 (Link 3) + 0x00, // Subelement ID = 0 for Per-Sta Profile Element + 0x09, // Length + 0x00, 0x23, // STA Control = (Reserved=00000+BSSParam=0+NTSRBS=0+NTSRLP=0+DTIM=0+BeaconInt=0+MAC=1+CompleteP=0+LinkID=0001) = 0x0021 + 0x00, // STA Info : Length + 0x22, 0x22, 0x22, 0x22, 0x00, 0x02, // STA Info : AP Link 2 MAC address + // STA Profile + + + // WDI_TLV_BEACON_FRAME + 0x30, 0x00, + 0x97, 0x00, + + 0x22, 0x02, 0x2C, 0x01, 0x00, 0x00, 0x00, 0x00, // Timestamp + 0x01, 0x00, // Beacon Interval + 0x31, 0x04, // Capability + 0x00, 0x0e, // SSID + 'W', 'i', '-', 'F', 'i', ' ', '7', ' ', '-', ' ', 'D', 'T', '0', '2', + 0x01, 0x08, + 0x82, 0x84, 0x8B, 0x96, 0x24, 0x30, 0x48, 0x6C, // Supported Rates + 0x03, 0x01, + 0x06, // DSS Parameters + 0x05, 0x04, + 0x00, 0x01, 0x00, 0x00, // TIM + 0x2A, 0x01, + 0x00, // ERP + 0x2F, 0x01, + 0x00, // Reserved + 0xff, 0x23, // Multilink Extension Element + 0x6B, // Multilink Extension ID + 0x01, 0x10, // MultiLink Control ([Reserved=0000000 + MLDCapabilities=1 + 000 + LinkID=1 + Reserved=0 + Basic=000] = 0000000 1 000 1 0 000 = 0x0110) + 0x09, // Common Info length + 0x00, 0xA0, 0xB0, 0xC0, 0xD1, 0x06, // AP MLD Mac address (required for Basic) + 0x01, // [ Link ID (1 octet) - in Beacon/ProbeResp/(Re)AssocResp frames ] + // [ BSS Parameters Change Count (1 octet) - from AP only ] + // [ Medium Synchronization delay (2 octets) - from AP only] + // [ EML Capabilities (2 octets) ] + 0x00, 0x03, // [ MLD Capabilities (2 octets) - (3 links max) in Beacon/ProbeResp/(Re)AssocReq/(Re)AssocResp frames ] + // Per-Sta profile - 1/2 (Link 2) + 0x00, // Subelement ID = 0 for Per-Sta Profile Element + 0x09, // Length + 0x00, 0x22, // STA Control = (Reserved=00000+BSSParam=0+NTSRBS=0+NTSRLP=0+DTIM=0+BeaconInt=0+MAC=1+CompleteP=0+LinkID=0001) = 0x0021 + 0x00, // STA Info : Length + 0x00, 0xA0, 0xB0, 0xC0, 0xD1, 0x08, // STA Info : AP Link 1 MAC address + // STA Profile + // Per-Sta profile - 2/2 (Link 3) + 0x00, // Subelement ID = 0 for Per-Sta Profile Element + 0x09, // Length + 0x00, 0x23, // STA Control = (Reserved=00000+BSSParam=0+NTSRBS=0+NTSRLP=0+DTIM=0+BeaconInt=0+MAC=1+CompleteP=0+LinkID=0001) = 0x0021 + 0x00, // STA Info : Length + 0x00, 0xA0, 0xB0, 0xC0, 0xD1, 0x09, // STA Info : AP Link 2 MAC address + // STA Profile + 0xc9, 0x14, // RNR IE + 0x04, 0x10, // TBTT: 0x04 => B2=1(FilteredAP),B4-B7=0(TBTT Information Count=0+1) :: 0x0c = TBTT Length + 0x51, 0x06, // Operating Class = 81 (2.4 GHz), Channel = 6 + 0x00, // TBTTOffset + 0x00, 0xA0, 0xB0, 0xC0, 0xD1, 0x08, // Bssid + 0x1d, 0xc5, 0x3b, 0x12, // ShortSsid + 0x40, // BssParameters + 0x00, // 20 MHz + 0x12, 0x03, 0x56, // Mld Parameters: MLD ID(8 bits) : LinkID (4 bits) + ... + 0xc9, 0x14, // RNR IE + 0x04, 0x10, // TBTT: 0x04 => B2=1(FilteredAP),B4-B7=0(TBTT Information Count=0+1) :: 0x0c = TBTT Length + 0x51, 0x06, // Operating Class = 81 (2.4 GHz), Channel = 6 + 0x00, // TBTTOffset + 0x00, 0xA0, 0xB0, 0xC0, 0xD1, 0x09, // Bssid + 0x1d, 0xc5, 0x3b, 0x12, // ShortSsid + 0x40, // BssParameters + 0x00, // 20 MHz + 0x12, 0x07, 0x56, // Mld Parameters: MLD ID(8 bits) : LinkID (4 bits) + ... + 0x32, 0x04, + 0x0C, 0x12, 0x18, 0x60, // Extended Supported Rates + 0xDD, 0x09, + 0x00, 0x10, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, // Vendor Specific + + // WDI_TLV_PHY_TYPE_LIST + 0x19, 0x00, + 0x04, 0x00, + 0x0b, 0x00, 0x00, 0x00, // dot11_phy_type_eht + +}; + +//=============================================================================== //=============================================================================== +typedef struct +{ + UINT32 BandId; + WDI_MAC_ADDRESS* pMacAddress; + PUCHAR pTlvBssEntry; + UINT32 TlvBssEntrySize; + PUCHAR pTlvAssociationResult; + UINT32 TlvAssociationResultSize; + +} WdiTestConnectEntry, * PWdiTestConnectEntry; + +WdiTestConnectEntry g_ConnectEntries[] = +{ + // 0 + { // 0th Entry is disconnected state + 0, + nullptr, + nullptr, 0, + nullptr, 0, + }, + + // 1 - WFC_OPEN + { + WDI_BAND_ID_2400, + &s_Connect_Addr, + s_TLV_BSS_Entry_1, sizeof(s_TLV_BSS_Entry_1), + s_TLV_SuccessOpenAssociationResult, sizeof(s_TLV_SuccessOpenAssociationResult), + }, + + // 2 - WFC_OPEN + { + WDI_BAND_ID_2400, + &s_Connect_Addr_2_Open, + s_TLV_BSS_Entry_2_Open, sizeof(s_TLV_BSS_Entry_2_Open), + s_TLV_Success_AssociationResult_2_Open, sizeof(s_TLV_Success_AssociationResult_2_Open), + }, + + // 3 - WDI__WEP + { + WDI_BAND_ID_2400, + &s_Connect_Addr_3_WEP, + s_TLV_BSS_Entry_3_WEP, sizeof(s_TLV_BSS_Entry_3_WEP), + s_TLV_Success_AssociationResult_3_WEP, sizeof(s_TLV_Success_AssociationResult_3_WEP), + }, + + // 4 - WDI_SECURE + { + WDI_BAND_ID_2400, + &s_Connect_Addr_4_RSNA_CCMP, + s_TLV_BSS_Entry_4_RSNA_CCMP, sizeof(s_TLV_BSS_Entry_4_RSNA_CCMP), + s_TLV_Success_AssociationResult_4_RSNA_CCMP, sizeof(s_TLV_Success_AssociationResult_4_RSNA_CCMP), + }, + + // 5 - WDI__IHV + { + TESTMP_BAND_IHV, + &s_Connect_Addr_5_IHV, + s_TLV_BSS_Entry_5_IHV, sizeof(s_TLV_BSS_Entry_5_IHV), + s_TLV_Success_AssociationResult_5_IHV, sizeof(s_TLV_Success_AssociationResult_5_IHV), + }, + + // 6 - WDI__FT + { + WDI_BAND_ID_2400, + &s_Connect_Addr_6_FT_CCMP, + s_TLV_BSS_Entry_6_FT_CCMP, sizeof(s_TLV_BSS_Entry_6_FT_CCMP), + s_TLV_Success_AssociationResult_6_FT_CCMP, sizeof(s_TLV_Success_AssociationResult_6_FT_CCMP), + }, + + // 7 - WDI__FTPSK + { + WDI_BAND_ID_2400, + &s_Connect_Addr_7_FT_PSK_CCMP, + s_TLV_BSS_Entry_7_FT_PSK_CCMP, sizeof(s_TLV_BSS_Entry_7_FT_PSK_CCMP), + s_TLV_Success_AssociationResult_7_FT_PSK_CCMP, sizeof(s_TLV_Success_AssociationResult_7_FT_PSK_CCMP), + }, + + // 8 - + { + WDI_BAND_ID_2400, + &s_Connect_Addr_8_Hidden, + s_TLV_BSS_Entry_Beacon_8_Hidden, sizeof(s_TLV_BSS_Entry_Beacon_8_Hidden), + s_TLV_Success_AssociationResult_8_Hidden, sizeof(s_TLV_Success_AssociationResult_8_Hidden), + }, + + // 9 - WDI_adPSK + { + WDI_BAND_ID_60000, + &s_Connect_Addr_9_11ad_PSK, + s_TLV_BSS_Entry_9_11ad_ProbeResponse_PSK, sizeof(s_TLV_BSS_Entry_9_11ad_ProbeResponse_PSK), + s_TLV_Success_AssociationResult_9_11ad_PSK, sizeof(s_TLV_Success_AssociationResult_9_11ad_PSK), + }, + + // 10 - WDI_ad_1x + { + WDI_BAND_ID_60000, + &s_Connect_Addr_10_11ad_1x, + s_TLV_BSS_Entry_10_11ad_ProbeResponse_1x, sizeof(s_TLV_BSS_Entry_10_11ad_ProbeResponse_1x), + s_TLV_Success_AssociationResult_10_11ad_1x, sizeof(s_TLV_Success_AssociationResult_10_11ad_1x), + }, + + // 11 - WDI_ad_ON + { + WDI_BAND_ID_60000, + &s_Connect_Addr_11_11ad_Open, + s_TLV_BSS_Entry_11_11ad_ProbeResponse_Open, sizeof(s_TLV_BSS_Entry_11_11ad_ProbeResponse_Open), + s_TLV_Success_AssociationResult_11_11ad_Open, sizeof(s_TLV_Success_AssociationResult_11_11ad_Open), + }, + + // 12 - WDI_OPEN_11ax.2.4 + { + WDI_BAND_ID_60000, + &s_Connect_Addr_12_11ax_24_Open, + s_TLV_BSS_Entry_12_11ax_24_Open, sizeof(s_TLV_BSS_Entry_12_11ax_24_Open), + s_TLV_Success_AssociationResult_12_11ax_24_Open, sizeof(s_TLV_Success_AssociationResult_12_11ax_24_Open), + }, + + // 13 - WDI_OPEN_11ax.5 + { + WDI_BAND_ID_5000, + &s_Connect_Addr_13_11ax_5_Open, + s_TLV_BSS_Entry_13_11ax_5_Open, sizeof(s_TLV_BSS_Entry_13_11ax_5_Open), + s_TLV_Success_AssociationResult_13_11ax_5_Open, sizeof(s_TLV_Success_AssociationResult_13_11ax_5_Open), + }, + + // 14 - WDI_WPA3-SAE + { + WDI_BAND_ID_2400, + &s_Connect_Addr_14_WPA3_SAE_CCMP, + s_TLV_BSS_Entry_14_WPA3_SAE_CCMP, sizeof(s_TLV_BSS_Entry_14_WPA3_SAE_CCMP), + s_TLV_Success_AssociationResult_14_WPA3_SAE_CCMP, sizeof(s_TLV_Success_AssociationResult_14_WPA3_SAE_CCMP), + }, + + // 15 - WDI_SHA256 + { + WDI_BAND_ID_2400, + &s_Connect_Addr_15_WPA2PSK_SHA256, + s_TLV_BSS_Entry_15_WPA2PSK_SHA256, sizeof(s_TLV_BSS_Entry_15_WPA2PSK_SHA256), + s_TLV_Success_AssociationResult_15_WPA2PSK_SHA256, sizeof(s_TLV_Success_AssociationResult_15_WPA2PSK_SHA256), + }, + + // 16 - WDI_WPA3-SUITE_B + { + WDI_BAND_ID_2400, + &s_Connect_Addr_16_WPA3_SUITEB, + s_TLV_BSS_Entry_16_WPA3_SUITEB, sizeof(s_TLV_BSS_Entry_16_WPA3_SUITEB), + s_TLV_Success_AssociationResult_16_WPA3_SUITEB, sizeof(s_TLV_Success_AssociationResult_16_WPA3_SUITEB), + }, + + // 17 - 6E__1 + { + WDI_BAND_ID_2400, + &s_Connect_Addr_17_6G_S1_2_4_Ghz, + s_TLV_BSS_Entry_17_6G_S1_2_4_Ghz, sizeof(s_TLV_BSS_Entry_17_6G_S1_2_4_Ghz), + s_TLV_Success_AssociationResult_17_6G_S1_2_4_Ghz, sizeof(s_TLV_Success_AssociationResult_17_6G_S1_2_4_Ghz), + }, + + // 18 - 6E__1 + { + WDI_BAND_ID_5000, + &s_Connect_Addr_18_6G_S1_5_Ghz, + s_TLV_BSS_Entry_18_6G_S1_5_Ghz, sizeof(s_TLV_BSS_Entry_18_6G_S1_5_Ghz), + s_TLV_Success_AssociationResult_18_6G_S1_5_Ghz, sizeof(s_TLV_Success_AssociationResult_18_6G_S1_5_Ghz), + }, + + // 19 - 6E__1 + { + WDI_BAND_ID_6000, + &s_Connect_Addr_19_6G_S1a_6_Ghz, + s_TLV_BSS_Entry_19_6G_S1a_6_Ghz, sizeof(s_TLV_BSS_Entry_19_6G_S1a_6_Ghz), + s_TLV_Success_AssociationResult_19_6G_S1a_6_Ghz, sizeof(s_TLV_Success_AssociationResult_19_6G_S1a_6_Ghz), + }, + + // 20 - 6E__1 + { + WDI_BAND_ID_6000, + &s_Connect_Addr_20_6G_S1b_6_Ghz, + s_TLV_BSS_Entry_20_6G_S1b_6_Ghz, sizeof(s_TLV_BSS_Entry_20_6G_S1b_6_Ghz), + s_TLV_Success_AssociationResult_20_6G_S1b_6_Ghz, sizeof(s_TLV_Success_AssociationResult_20_6G_S1b_6_Ghz), + }, + + // 21 - 6E__2 + { + WDI_BAND_ID_2400, + &s_Connect_Addr_21_6G_S2_2_4_Ghz, + s_TLV_BSS_Entry_21_6G_S2_2_4_Ghz, sizeof(s_TLV_BSS_Entry_21_6G_S2_2_4_Ghz), + s_TLV_Success_AssociationResult_21_6G_S2_2_4_Ghz, sizeof(s_TLV_Success_AssociationResult_21_6G_S2_2_4_Ghz), + }, + + // 22 - 6E__2 + { + WDI_BAND_ID_5000, + &s_Connect_Addr_22_6G_S2_5_Ghz, + s_TLV_BSS_Entry_22_6G_S2_5_Ghz, sizeof(s_TLV_BSS_Entry_22_6G_S2_5_Ghz), + s_TLV_Success_AssociationResult_22_6G_S2_5_Ghz, sizeof(s_TLV_Success_AssociationResult_22_6G_S2_5_Ghz), + }, + + // 23 - 6E__2 + { + WDI_BAND_ID_6000, + &s_Connect_Addr_23_6G_S2_6_Ghz, + s_TLV_BSS_Entry_23_6G_S2_6_Ghz, sizeof(s_TLV_BSS_Entry_23_6G_S2_6_Ghz), + s_TLV_Success_AssociationResult_23_6G_S2_6_Ghz, sizeof(s_TLV_Success_AssociationResult_23_6G_S2_6_Ghz), + }, + + // 24 - 6E__3 + { + WDI_BAND_ID_2400, + &s_Connect_Addr_24_6G_S3_2_4_Ghz, + s_TLV_BSS_Entry_24_6G_S3_2_4_Ghz, sizeof(s_TLV_BSS_Entry_24_6G_S3_2_4_Ghz), + s_TLV_Success_AssociationResult_24_6G_S3_2_4_Ghz, sizeof(s_TLV_Success_AssociationResult_24_6G_S3_2_4_Ghz), + }, + + // 25 - 6E__4 + { + WDI_BAND_ID_6000, + &s_Connect_Addr_25_6G_S4_6_Ghz, + s_TLV_BSS_Entry_25_6G_S4_6_Ghz, sizeof(s_TLV_BSS_Entry_25_6G_S4_6_Ghz), + s_TLV_Success_AssociationResult_25_6G_S4_6_Ghz, sizeof(s_TLV_Success_AssociationResult_25_6G_S4_6_Ghz), + }, + + // 26 - WDI_OWE_RNR + { + WDI_BAND_ID_2400, + &s_ConnectAddr_26_OWE_With_RNR, + s_TLV_BSS_Entry_26_OWE_With_RNR, sizeof(s_TLV_BSS_Entry_26_OWE_With_RNR), + s_TLV_Failure_AssociationResult_26_OWE_With_RNR, sizeof(s_TLV_Failure_AssociationResult_26_OWE_With_RNR) + }, + // 27 - <WDI_OWE_TM_OPEN> + { + WDI_BAND_ID_2400, + &s_ConnectAddr_27_OWE_TM_OWE, + s_TLV_BSS_Entry_27_OWE_TM_OWE, sizeof(s_TLV_BSS_Entry_27_OWE_TM_OWE), + s_TLV_Failure_AssociationResult_27_OWE_TM_OWE, sizeof(s_TLV_Failure_AssociationResult_27_OWE_TM_OWE) + }, + // 28 - WDI_OWE_TM_OPEN + { + WDI_BAND_ID_2400, + &s_ConnectAddr_28_OWE_TM_Open, + s_TLV_BSS_Entry_28_OWE_TM_Open_Beacon, sizeof(s_TLV_BSS_Entry_28_OWE_TM_Open_Beacon), + s_TLV_Failure_AssociationResult_28_OWE_TM_Open, sizeof(s_TLV_Failure_AssociationResult_28_OWE_TM_Open) + }, + + // 29 is only MLD address for Wi-Fi 7 + // 30 - Wi-Fi 7 - Mixed + { + WDI_BAND_ID_5000, + &s_Connect_Addr_30_WiFi7_Mixed_Link_1, + s_TLV_BSS_Entry_30_WiFi7_Mixed_Link_1, sizeof(s_TLV_BSS_Entry_30_WiFi7_Mixed_Link_1), + s_TLV_Success_AssociationResult_30_WiFi7_Mixed_Link_1, sizeof(s_TLV_Success_AssociationResult_30_WiFi7_Mixed_Link_1), + }, + // 34 - Wi-Fi 7 - Open + { + WDI_BAND_ID_5000, + &s_Connect_Addr_34_WiFi7_Open_Link_1, + s_TLV_BSS_Entry_34_WiFi7_Open_Link_1, sizeof(s_TLV_BSS_Entry_34_WiFi7_Open_Link_1), + s_TLV_Success_AssociationResult_34_WiFi7_Open_Link_1, sizeof(s_TLV_Success_AssociationResult_34_WiFi7_Open_Link_1), + }, + // 38 - Wi-Fi 7 - Only + { + WDI_BAND_ID_6000, + &s_Connect_Addr_38_WiFi7_Only_Link_1, + s_TLV_BSS_Entry_38_WiFi7_Only_Link_1, sizeof(s_TLV_BSS_Entry_38_WiFi7_Only_Link_1), + s_TLV_Success_AssociationResult_38_WiFi7_Only_Link_1, sizeof(s_TLV_Success_AssociationResult_38_WiFi7_Only_Link_1), + }, + + // 41 - Dual-Sta + { + WDI_BAND_ID_5000, + &s_Connect_Addr_41_DualSta_5Ghz, + s_TLV_BSS_Entry_41_DualSta_5Ghz, sizeof(s_TLV_BSS_Entry_41_DualSta_5Ghz), + s_TLV_SuccessOpenAssociationResult_41_DualSta_5Ghz, sizeof(s_TLV_SuccessOpenAssociationResult_41_DualSta_5Ghz), + }, + + // 42 - Dual-Sta + { + WDI_BAND_ID_6000, + &s_Connect_Addr_42_DualSta_6Ghz, + s_TLV_BSS_Entry_42_DualSta_6Ghz, sizeof(s_TLV_BSS_Entry_42_DualSta_6Ghz), + s_TLV_SuccessOpenAssociationResult_42_DualSta_6Ghz, sizeof(s_TLV_SuccessOpenAssociationResult_42_DualSta_6Ghz), + }, + + // 43 - Speed Test(01) + { + WDI_BAND_ID_5000, + &s_Connect_Addr_43_Speed_01_WiFi7_Open_Link_1, + s_TLV_BSS_Entry_43_WiFi7_Open_Link_1, sizeof(s_TLV_BSS_Entry_43_WiFi7_Open_Link_1), + s_TLV_Success_AssociationResult_43_WiFi7_Open_Link_1, sizeof(s_TLV_Success_AssociationResult_43_WiFi7_Open_Link_1), + }, + + // 44 - Speed Test(02) + { + WDI_BAND_ID_5000, + &s_Connect_Addr_44_Speed_02_WiFi7_Open_Link_1, + s_TLV_BSS_Entry_44_WiFi7_Open_Link_1, sizeof(s_TLV_BSS_Entry_44_WiFi7_Open_Link_1), + s_TLV_Success_AssociationResult_44_WiFi7_Open_Link_1, sizeof(s_TLV_Success_AssociationResult_44_WiFi7_Open_Link_1), + }, +}; + // clang-format on diff --git a/network/wlan/WIFICX/drivercode/wifirequest.cpp b/network/wlan/WIFICX/drivercode/wifirequest.cpp index 06703795..1fefe040 100644 --- a/network/wlan/WIFICX/drivercode/wifirequest.cpp +++ b/network/wlan/WIFICX/drivercode/wifirequest.cpp @@ -1,308 +1,10 @@ -//------------------------------------------------------------------------------- -// Net Adapter source file -// // Copyright (c) Microsoft Corporation. All rights reserved. #include "precomp.h" -#include "testdata.h" -#include <ndis\status.h> +#include "wifiHAL.h" #include "wifirequest.h" #include "wifirequest.tmh" -// clang-format off - - -WdiTestConnectEntry g_ConnectEntries[] = -{ - // 0 - { // 0th Entry is disconnected state - 0, - nullptr, - nullptr, 0, - nullptr, 0, - }, - - // 1 - WFC_OPEN - { - WDI_BAND_ID_2400, - &s_Connect_Addr, - s_TLV_BSS_Entry_1, sizeof(s_TLV_BSS_Entry_1), - s_TLV_SuccessOpenAssociationResult, sizeof(s_TLV_SuccessOpenAssociationResult), - }, - - // 2 - WFC_OPEN - { - WDI_BAND_ID_2400, - &s_Connect_Addr_2_Open, - s_TLV_BSS_Entry_2_Open, sizeof(s_TLV_BSS_Entry_2_Open), - s_TLV_Success_AssociationResult_2_Open, sizeof(s_TLV_Success_AssociationResult_2_Open), - }, - - // 3 - WDI__WEP - { - WDI_BAND_ID_2400, - &s_Connect_Addr_3_WEP, - s_TLV_BSS_Entry_3_WEP, sizeof(s_TLV_BSS_Entry_3_WEP), - s_TLV_Success_AssociationResult_3_WEP, sizeof(s_TLV_Success_AssociationResult_3_WEP), - }, - - // 4 - WDI_SECURE - { - WDI_BAND_ID_2400, - &s_Connect_Addr_4_RSNA_CCMP, - s_TLV_BSS_Entry_4_RSNA_CCMP, sizeof(s_TLV_BSS_Entry_4_RSNA_CCMP), - s_TLV_Success_AssociationResult_4_RSNA_CCMP, sizeof(s_TLV_Success_AssociationResult_4_RSNA_CCMP), - }, - - // 5 - WDI__IHV - { - TESTMP_BAND_IHV, - &s_Connect_Addr_5_IHV, - s_TLV_BSS_Entry_5_IHV, sizeof(s_TLV_BSS_Entry_5_IHV), - s_TLV_Success_AssociationResult_5_IHV, sizeof(s_TLV_Success_AssociationResult_5_IHV), - }, - - // 6 - WDI__FT - { - WDI_BAND_ID_2400, - &s_Connect_Addr_6_FT_CCMP, - s_TLV_BSS_Entry_6_FT_CCMP, sizeof(s_TLV_BSS_Entry_6_FT_CCMP), - s_TLV_Success_AssociationResult_6_FT_CCMP, sizeof(s_TLV_Success_AssociationResult_6_FT_CCMP), - }, - - // 7 - WDI__FTPSK - { - WDI_BAND_ID_2400, - &s_Connect_Addr_7_FT_PSK_CCMP, - s_TLV_BSS_Entry_7_FT_PSK_CCMP, sizeof(s_TLV_BSS_Entry_7_FT_PSK_CCMP), - s_TLV_Success_AssociationResult_7_FT_PSK_CCMP, sizeof(s_TLV_Success_AssociationResult_7_FT_PSK_CCMP), - }, - - // 8 - - { - WDI_BAND_ID_2400, - &s_Connect_Addr_8_Hidden, - s_TLV_BSS_Entry_Beacon_8_Hidden, sizeof(s_TLV_BSS_Entry_Beacon_8_Hidden), - s_TLV_Success_AssociationResult_8_Hidden, sizeof(s_TLV_Success_AssociationResult_8_Hidden), - }, - - // 9 - WDI_adPSK - { - WDI_BAND_ID_60000, - &s_Connect_Addr_9_11ad_PSK, -#ifdef DMG_CAPABILITIES - s_TLV_BSS_Entry_9_11ad_ProbeResponse_Dmg_PSK, sizeof(s_TLV_BSS_Entry_9_11ad_ProbeResponse_Dmg_PSK), - s_TLV_Success_AssociationResult_9_11ad_Dmg_PSK, sizeof(s_TLV_Success_AssociationResult_9_11ad_Dmg_PSK), -#else - s_TLV_BSS_Entry_9_11ad_ProbeResponse_PSK, sizeof(s_TLV_BSS_Entry_9_11ad_ProbeResponse_PSK), - s_TLV_Success_AssociationResult_9_11ad_PSK, sizeof(s_TLV_Success_AssociationResult_9_11ad_PSK), -#endif // DMG_CAPABILITIES - }, - - // 10 - WDI_ad_1x - { - WDI_BAND_ID_60000, - &s_Connect_Addr_10_11ad_1x, -#ifdef DMG_CAPABILITIES - s_TLV_BSS_Entry_10_11ad_ProbeResponse_Dmg_1x, sizeof(s_TLV_BSS_Entry_10_11ad_ProbeResponse_Dmg_1x), - s_TLV_Success_AssociationResult_10_11ad_Dmg_1x, sizeof(s_TLV_Success_AssociationResult_10_11ad_Dmg_1x), -#else - s_TLV_BSS_Entry_10_11ad_ProbeResponse_1x, sizeof(s_TLV_BSS_Entry_10_11ad_ProbeResponse_1x), - s_TLV_Success_AssociationResult_10_11ad_1x, sizeof(s_TLV_Success_AssociationResult_10_11ad_1x), -#endif // DMG_CAPABILITIES - }, - - // 11 - WDI_ad_ON - { - WDI_BAND_ID_60000, - &s_Connect_Addr_11_11ad_Open, -#ifdef DMG_CAPABILITIES - s_TLV_BSS_Entry_11_11ad_ProbeResponse_Dmg_Open, sizeof(s_TLV_BSS_Entry_11_11ad_ProbeResponse_Dmg_Open), - s_TLV_Success_AssociationResult_11_11ad_Dmg_Open, sizeof(s_TLV_Success_AssociationResult_11_11ad_Dmg_Open), -#else - s_TLV_BSS_Entry_11_11ad_ProbeResponse_Open, sizeof(s_TLV_BSS_Entry_11_11ad_ProbeResponse_Open), - s_TLV_Success_AssociationResult_11_11ad_Open, sizeof(s_TLV_Success_AssociationResult_11_11ad_Open), -#endif // DMG_CAPABILITIES - }, - - // 12 - WDI_OPEN_11ax.2.4 - { - WDI_BAND_ID_60000, - &s_Connect_Addr_12_11ax_24_Open, - s_TLV_BSS_Entry_12_11ax_24_Open, sizeof(s_TLV_BSS_Entry_12_11ax_24_Open), - s_TLV_Success_AssociationResult_12_11ax_24_Open, sizeof(s_TLV_Success_AssociationResult_12_11ax_24_Open), - }, - - // 13 - WDI_OPEN_11ax.5 - { - WDI_BAND_ID_5000, - &s_Connect_Addr_13_11ax_5_Open, - s_TLV_BSS_Entry_13_11ax_5_Open, sizeof(s_TLV_BSS_Entry_13_11ax_5_Open), - s_TLV_Success_AssociationResult_13_11ax_5_Open, sizeof(s_TLV_Success_AssociationResult_13_11ax_5_Open), - }, - - // 14 - WDI_WPA3-SAE - { - WDI_BAND_ID_2400, - &s_Connect_Addr_14_WPA3_SAE_CCMP, - s_TLV_BSS_Entry_14_WPA3_SAE_CCMP, sizeof(s_TLV_BSS_Entry_14_WPA3_SAE_CCMP), - s_TLV_Success_AssociationResult_14_WPA3_SAE_CCMP, sizeof(s_TLV_Success_AssociationResult_14_WPA3_SAE_CCMP), - }, - - // 15 - WDI_SHA256 - { - WDI_BAND_ID_2400, - &s_Connect_Addr_15_WPA2PSK_SHA256, - s_TLV_BSS_Entry_15_WPA2PSK_SHA256, sizeof(s_TLV_BSS_Entry_15_WPA2PSK_SHA256), - s_TLV_Success_AssociationResult_15_WPA2PSK_SHA256, sizeof(s_TLV_Success_AssociationResult_15_WPA2PSK_SHA256), - }, - - // 16 - WDI_WPA3-SUITE_B - { - WDI_BAND_ID_2400, - &s_Connect_Addr_16_WPA3_SUITEB, - s_TLV_BSS_Entry_16_WPA3_SUITEB, sizeof(s_TLV_BSS_Entry_16_WPA3_SUITEB), - s_TLV_Success_AssociationResult_16_WPA3_SUITEB, sizeof(s_TLV_Success_AssociationResult_16_WPA3_SUITEB), - }, - - // 17 - 6E__1 - { - WDI_BAND_ID_2400, - &s_Connect_Addr_17_6G_S1_2_4_Ghz, - s_TLV_BSS_Entry_17_6G_S1_2_4_Ghz, sizeof(s_TLV_BSS_Entry_17_6G_S1_2_4_Ghz), - s_TLV_Success_AssociationResult_17_6G_S1_2_4_Ghz, sizeof(s_TLV_Success_AssociationResult_17_6G_S1_2_4_Ghz), - }, - - // 18 - 6E__1 - { - WDI_BAND_ID_5000, - &s_Connect_Addr_18_6G_S1_5_Ghz, - s_TLV_BSS_Entry_18_6G_S1_5_Ghz, sizeof(s_TLV_BSS_Entry_18_6G_S1_5_Ghz), - s_TLV_Success_AssociationResult_18_6G_S1_5_Ghz, sizeof(s_TLV_Success_AssociationResult_18_6G_S1_5_Ghz), - }, - - // 19 - 6E__1 - { - WDI_BAND_ID_6000, - &s_Connect_Addr_19_6G_S1a_6_Ghz, - s_TLV_BSS_Entry_19_6G_S1a_6_Ghz, sizeof(s_TLV_BSS_Entry_19_6G_S1a_6_Ghz), - s_TLV_Success_AssociationResult_19_6G_S1a_6_Ghz, sizeof(s_TLV_Success_AssociationResult_19_6G_S1a_6_Ghz), - }, - - // 20 - 6E__1 - { - WDI_BAND_ID_6000, - &s_Connect_Addr_20_6G_S1b_6_Ghz, - s_TLV_BSS_Entry_20_6G_S1b_6_Ghz, sizeof(s_TLV_BSS_Entry_20_6G_S1b_6_Ghz), - s_TLV_Success_AssociationResult_20_6G_S1b_6_Ghz, sizeof(s_TLV_Success_AssociationResult_20_6G_S1b_6_Ghz), - }, - - // 21 - 6E__2 - { - WDI_BAND_ID_2400, - &s_Connect_Addr_21_6G_S2_2_4_Ghz, - s_TLV_BSS_Entry_21_6G_S2_2_4_Ghz, sizeof(s_TLV_BSS_Entry_21_6G_S2_2_4_Ghz), - s_TLV_Success_AssociationResult_21_6G_S2_2_4_Ghz, sizeof(s_TLV_Success_AssociationResult_21_6G_S2_2_4_Ghz), - }, - - // 22 - 6E__2 - { - WDI_BAND_ID_5000, - &s_Connect_Addr_22_6G_S2_5_Ghz, - s_TLV_BSS_Entry_22_6G_S2_5_Ghz, sizeof(s_TLV_BSS_Entry_22_6G_S2_5_Ghz), - s_TLV_Success_AssociationResult_22_6G_S2_5_Ghz, sizeof(s_TLV_Success_AssociationResult_22_6G_S2_5_Ghz), - }, - - // 23 - 6E__2 - { - WDI_BAND_ID_6000, - &s_Connect_Addr_23_6G_S2_6_Ghz, - s_TLV_BSS_Entry_23_6G_S2_6_Ghz, sizeof(s_TLV_BSS_Entry_23_6G_S2_6_Ghz), - s_TLV_Success_AssociationResult_23_6G_S2_6_Ghz, sizeof(s_TLV_Success_AssociationResult_23_6G_S2_6_Ghz), - }, - - // 24 - 6E__3 - { - WDI_BAND_ID_2400, - &s_Connect_Addr_24_6G_S3_2_4_Ghz, - s_TLV_BSS_Entry_24_6G_S3_2_4_Ghz, sizeof(s_TLV_BSS_Entry_24_6G_S3_2_4_Ghz), - s_TLV_Success_AssociationResult_24_6G_S3_2_4_Ghz, sizeof(s_TLV_Success_AssociationResult_24_6G_S3_2_4_Ghz), - }, - - // 25 - 6E__4 - { - WDI_BAND_ID_6000, - &s_Connect_Addr_25_6G_S4_6_Ghz, - s_TLV_BSS_Entry_25_6G_S4_6_Ghz, sizeof(s_TLV_BSS_Entry_25_6G_S4_6_Ghz), - s_TLV_Success_AssociationResult_25_6G_S4_6_Ghz, sizeof(s_TLV_Success_AssociationResult_25_6G_S4_6_Ghz), - }, - - // 26 - WDI_OWE_RNR - { - WDI_BAND_ID_2400, - &s_ConnectAddr_26_OWE_With_RNR, - s_TLV_BSS_Entry_26_OWE_With_RNR, sizeof(s_TLV_BSS_Entry_26_OWE_With_RNR), - s_TLV_Failure_AssociationResult_26_OWE_With_RNR, sizeof(s_TLV_Failure_AssociationResult_26_OWE_With_RNR) - }, - // 27 - <WDI_OWE_TM_OPEN> - { - WDI_BAND_ID_2400, - &s_ConnectAddr_27_OWE_TM_OWE, - s_TLV_BSS_Entry_27_OWE_TM_OWE, sizeof(s_TLV_BSS_Entry_27_OWE_TM_OWE), - s_TLV_Failure_AssociationResult_27_OWE_TM_OWE, sizeof(s_TLV_Failure_AssociationResult_27_OWE_TM_OWE) - }, - // 28 - WDI_OWE_TM_OPEN - { - WDI_BAND_ID_2400, - &s_ConnectAddr_28_OWE_TM_Open, - s_TLV_BSS_Entry_28_OWE_TM_Open_Beacon, sizeof(s_TLV_BSS_Entry_28_OWE_TM_Open_Beacon), - s_TLV_Failure_AssociationResult_28_OWE_TM_Open, sizeof(s_TLV_Failure_AssociationResult_28_OWE_TM_Open) - }, - - // 29 is only MLD address for Wi-Fi 7 - // 30 - Wi-Fi 7 - Mixed - { - WDI_BAND_ID_5000, - &s_Connect_Addr_30_WiFi7_Mixed_Link_1, - s_TLV_BSS_Entry_30_WiFi7_Mixed_Link_1, sizeof(s_TLV_BSS_Entry_30_WiFi7_Mixed_Link_1), - s_TLV_Success_AssociationResult_30_WiFi7_Mixed_Link_1, sizeof(s_TLV_Success_AssociationResult_30_WiFi7_Mixed_Link_1), - }, - // 34 - Wi-Fi 7 - Open - { - WDI_BAND_ID_5000, - &s_Connect_Addr_34_WiFi7_Open_Link_1, - s_TLV_BSS_Entry_34_WiFi7_Open_Link_1, sizeof(s_TLV_BSS_Entry_34_WiFi7_Open_Link_1), - s_TLV_Success_AssociationResult_34_WiFi7_Open_Link_1, sizeof(s_TLV_Success_AssociationResult_34_WiFi7_Open_Link_1), - }, - // 38 - Wi-Fi 7 - Only - { - WDI_BAND_ID_6000, - &s_Connect_Addr_38_WiFi7_Only_Link_1, - s_TLV_BSS_Entry_38_WiFi7_Only_Link_1, sizeof(s_TLV_BSS_Entry_38_WiFi7_Only_Link_1), - s_TLV_Success_AssociationResult_38_WiFi7_Only_Link_1, sizeof(s_TLV_Success_AssociationResult_38_WiFi7_Only_Link_1), - }, - - // 41 - Dual-Sta - { - WDI_BAND_ID_5000, - &s_Connect_Addr_41_DualSta_5Ghz, - s_TLV_BSS_Entry_41_DualSta_5Ghz, sizeof(s_TLV_BSS_Entry_41_DualSta_5Ghz), - s_TLV_SuccessOpenAssociationResult_41_DualSta_5Ghz, sizeof(s_TLV_SuccessOpenAssociationResult_41_DualSta_5Ghz), - }, - - // 42 - Dual-Sta - { - WDI_BAND_ID_6000, - &s_Connect_Addr_42_DualSta_6Ghz, - s_TLV_BSS_Entry_42_DualSta_6Ghz, sizeof(s_TLV_BSS_Entry_42_DualSta_6Ghz), - s_TLV_SuccessOpenAssociationResult_42_DualSta_6Ghz, sizeof(s_TLV_SuccessOpenAssociationResult_42_DualSta_6Ghz), - }, -}; - -// clang-format on - -#define ConnectEntryId_MAX ARRAYSIZE(g_ConnectEntries) - _Use_decl_annotations_ void EvtWifiDeviceSendCommand(WDFDEVICE Device, WIFIREQUEST SendRequest) { @@ -323,10 +25,9 @@ void EvtWifiDeviceSendCommand(WDFDEVICE Device, WIFIREQUEST SendRequest) } _Use_decl_annotations_ -void WifiCxTestSendIndication(WDFDEVICE Device, PWDI_MESSAGE_HEADER pWdiHeader, UINT16 MessageId, UINT32 TransactionId, PUCHAR pTlvData, UINT32 TlvDataSize) +void WifiIhvSendIndicationToOs(WDFDEVICE Device, PWDI_MESSAGE_HEADER pWdiHeader, UINT16 MessageId, UINT32 TransactionId, PUCHAR pTlvData, UINT32 TlvDataSize) { - NTSTATUS ntStatus; - WDFMEMORY data; + WDFMEMORY data = WDF_NO_HANDLE; PUCHAR pIndicationBuffer = nullptr; PWDI_MESSAGE_HEADER pIndicationHeader = nullptr; SIZE_T indicationSize = sizeof(WDI_MESSAGE_HEADER) + TlvDataSize; @@ -335,11 +36,9 @@ void WifiCxTestSendIndication(WDFDEVICE Device, PWDI_MESSAGE_HEADER pWdiHeader, WDF_OBJECT_ATTRIBUTES_INIT(&objectAttribs); objectAttribs.ParentObject = Device; - ntStatus = WdfMemoryCreate(&objectAttribs, NonPagedPoolNx, 0, indicationSize, &data, reinterpret_cast<void**>(&pIndicationBuffer)); - - if (!NT_SUCCESS(ntStatus)) + if(!NT_SUCCESS(WdfMemoryCreate(&objectAttribs, NonPagedPoolNx, 0, indicationSize, &data, reinterpret_cast<void**>(&pIndicationBuffer)))) { - WFCError("%!FUNC!: Failed to initialize indication buffer %!STATUS!", ntStatus); + WFCError("Failed to create indication buffer"); return; } @@ -362,320 +61,10 @@ void WifiCxTestSendIndication(WDFDEVICE Device, PWDI_MESSAGE_HEADER pWdiHeader, } _Use_decl_annotations_ -UINT WifiCxTestSetOutput(PWIFI_DEVICE_CONTEXT pDeviceContext, void* ReqBuffer, SIZE_T ReqBufferSize, PUCHAR pTlvData, UINT32 TlvDataSize) -{ - UNREFERENCED_PARAMETER(pDeviceContext); - PWDI_MESSAGE_HEADER pWdiHeader = static_cast<PWDI_MESSAGE_HEADER>(ReqBuffer); - UINT BytesWritten = 0; - pWdiHeader->Status = NDIS_STATUS_SUCCESS; // TODO Need to set it to actual output - - if (ReqBufferSize >= (TlvDataSize + sizeof(WDI_MESSAGE_HEADER))) - { - if (TlvDataSize > 0) - { - RtlCopyMemory((static_cast<UCHAR*>(ReqBuffer)) + sizeof(WDI_MESSAGE_HEADER), pTlvData, TlvDataSize); - } - BytesWritten = static_cast<UINT16>(TlvDataSize); - } - else - { - pWdiHeader->Status = NDIS_STATUS_BUFFER_OVERFLOW; - } - return BytesWritten; -} - -_Use_decl_annotations_ -NDIS_STATUS WifiCxTestGetAdapterCapabilities(PWIFI_DEVICE_CONTEXT pDeviceContext, void* ReqBuffer, SIZE_T ReqBufferSize) -{ - NDIS_STATUS ndisStatus = NDIS_STATUS_SUCCESS; - PUCHAR pOutput = nullptr; - ULONG length = 0; - - // Generate TLV - ndisStatus = - GenerateWdiGetAdapterCapabilities(&pDeviceContext->AdapterCapabilities, 0, &pDeviceContext->TlvContext, &length, &pOutput); - - if (ndisStatus == NDIS_STATUS_SUCCESS) - { - // Set the information in the wifirequest - WifiCxTestSetOutput(pDeviceContext, ReqBuffer, ReqBufferSize, pOutput, length); - } - - FreeGenerated(pOutput); - - return ndisStatus; -} - -_Use_decl_annotations_ -NDIS_STATUS WifiCxTestSetAdapterConfiguration(PWIFI_DEVICE_CONTEXT pDeviceContext, void* ReqBuffer, SIZE_T ReqBufferSize) -{ - NDIS_STATUS ndisStatus = NDIS_STATUS_SUCCESS; - WDI_SET_FIRMWARE_CONFIGURATION_PARAMETERS fwConfig = {}; - - ULONG TLVStreamLength = static_cast<ULONG>(ReqBufferSize - sizeof(WDI_MESSAGE_HEADER)); - auto TLVByteStream = static_cast<UCHAR*>(ReqBuffer) + sizeof(WDI_MESSAGE_HEADER); - - DumpMessageTlvByteStream( - WDI_SET_ADAPTER_CONFIGURATION, TRUE, pDeviceContext->TlvContext.PeerVersion, TLVStreamLength, TLVByteStream, 0, nullptr); - ndisStatus = ParseWdiSetAdapterConfiguration(TLVStreamLength, TLVByteStream, &pDeviceContext->TlvContext, &fwConfig); - - if (ndisStatus == NDIS_STATUS_SUCCESS) - { - if (fwConfig.Optional.MacAddress_IsPresent) - { - pDeviceContext->AdapterCapabilities.InterfaceAttributes.InterfaceCapabilities.Address = fwConfig.MacAddress; - } - } - - CleanupParsedWdiSetAdapterConfiguration(&fwConfig); - - return ndisStatus; -} - - -extern WDI_MAC_ADDRESS STAAddress; - -WDI_MAC_ADDRESS LocalLinkAddresses[] = { - {0x11, 0x01, 0x02, 0x03, 0x04, 0x21}, - {0x11, 0x01, 0x02, 0x03, 0x04, 0x22}, -}; - -static NTSTATUS WifiCxTestSendLinkStateIndication(_In_ WDFDEVICE Device, _In_ PWDI_MESSAGE_HEADER pWdiHeader, ULONG numLinks) -{ - // Report link quality - NTSTATUS ntStatus = STATUS_SUCCESS; - PWIFI_DEVICE_CONTEXT pDeviceContext = WifiGetDeviceContext(Device); - WDI_INDICATION_LINK_STATE_CHANGE_PARAMETERS linkStateChangeParameters = {}; - WDI_LINK_INFO_CONTAINER pLinkInfo[2] = {}; - UINT8* pOutput = nullptr; - ULONG cbOutput = 0; - - RtlCopyMemory( - &linkStateChangeParameters.LinkStateChangeParameters.PeerMACAddress, &pDeviceContext->ConnectedPeer, sizeof(DOT11_MAC_ADDRESS)); - linkStateChangeParameters.LinkStateChangeParameters.TxLinkSpeed = 30000; - linkStateChangeParameters.LinkStateChangeParameters.RxLinkSpeed = 30000; - linkStateChangeParameters.LinkStateChangeParameters.LinkQuality = 56; - - pLinkInfo[0].LinkID = 1; - RtlCopyMemory(&pLinkInfo[0].LocalLinkMACAddress, &LocalLinkAddresses[0], sizeof(DOT11_MAC_ADDRESS)); - RtlCopyMemory(&pLinkInfo[0].PeerLinkMACAddress, &pDeviceContext->ConnectedPeer, sizeof(DOT11_MAC_ADDRESS)); - pLinkInfo[0].ChannelNumber = 6; - pLinkInfo[0].BandId = WDI_BAND_ID_2400; - pLinkInfo[0].RSSI = -50; - pLinkInfo[0].Bandwidth = 40; - pLinkInfo[0].TxMCS = 3; - pLinkInfo[0].RxMCS = 4; - - if (numLinks > 1) - { - pLinkInfo[1].LinkID = 2; - RtlCopyMemory(&pLinkInfo[1].LocalLinkMACAddress, &LocalLinkAddresses[1], sizeof(DOT11_MAC_ADDRESS)); - RtlCopyMemory(&pLinkInfo[1].PeerLinkMACAddress, &pDeviceContext->ConnectedPeer, sizeof(DOT11_MAC_ADDRESS)); - pLinkInfo[1].ChannelNumber = 36; - pLinkInfo[1].BandId = WDI_BAND_ID_5000; - pLinkInfo[1].RSSI = -30; - pLinkInfo[1].Bandwidth = 160; - pLinkInfo[1].TxMCS = 8; - pLinkInfo[1].RxMCS = 9; - } - - linkStateChangeParameters.LinkInfo.pElements = pLinkInfo; - linkStateChangeParameters.LinkInfo.ElementCount = numLinks > 1 ? 2 : 1; - - ntStatus = - GenerateWdiIndicationLinkStateChangeFromIhv(&linkStateChangeParameters, 0, &pDeviceContext->TlvContext, &cbOutput, &pOutput); - if (STATUS_SUCCESS == ntStatus) - { - WifiCxTestSendIndication(Device, pWdiHeader, WDI_INDICATION_LINK_STATE_CHANGE, 0, pOutput, cbOutput); - FreeGenerated(pOutput); - } - else - { - WFCError("Failed to generate WDI_INDICATION_LINK_STATE_CHANGE - 0x%08x\n", ntStatus); - } - - return ntStatus; -} - -#define TEST_RSN_EAPOL_SHA384_KCK_LENGTH (192 / 8) // 24 bytes -#define TEST_RSN_EAPOL_SHA384_KEK_LENGTH (256 / 8) // 32 bytes -#define TEST_RSN_CCMP_KEY_LENGTH 16 -#define TEST_RSN_BIP_GMAC_256_KEY_LENGTH 32 - -#define TEST_NUM_LINKS 3 -#define TEST_NUM_CIPHER_KEY_TYPES 3 - - -static NTSTATUS WifiCxTestPerformAssociation( - _In_ WDFDEVICE Device, - _In_ struct ArrayOfElements<WDI_CONNECT_BSS_ENTRY_CONTAINER>* pPreferredBSSEntryList, - _In_ struct ArrayOfElements<WDI_AUTH_ALGORITHM>* pAuthenticationAlgorithms, - _In_ PWDI_MESSAGE_HEADER pWdiHeader) -{ - - ULONG bssIndex = 0; - ULONG connectEntry = ConnectEntryId_MAX; - NTSTATUS ntStatus = STATUS_SUCCESS; - UINT32 NewConnectEntryId = 0; // Disconnected State - WDI_AUTH_ALGORITHM NewAuthAlgo = pAuthenticationAlgorithms->pElements[0]; - UCHAR pucData[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF, 0x10}; - PWIFI_DEVICE_CONTEXT pDeviceContext = WifiGetDeviceContext(Device); - ULONG assocStatus = WDI_ASSOC_STATUS_SUCCESS; - - do - { - // We search for the BSSID pattern to figure out what AP we are trying to connect to - for (bssIndex = 0; bssIndex < pPreferredBSSEntryList->ElementCount; bssIndex++) - { - for (connectEntry = 1; connectEntry < ConnectEntryId_MAX; connectEntry++) - { - if (RtlCompareMemory( - pPreferredBSSEntryList->pElements[bssIndex].BSSID.Address, - g_ConnectEntries[connectEntry].pMacAddress, - sizeof(DOT11_MAC_ADDRESS)) == sizeof(DOT11_MAC_ADDRESS)) - { - PUCHAR pAssociationResult = g_ConnectEntries[connectEntry].pTlvAssociationResult; - - NewConnectEntryId = connectEntry; - pDeviceContext->LastConnectTransactionId = pWdiHeader->TransactionId; - - // TODO NetAdapter: datapath not yet implemented -#ifdef WIFICX_TEST_DATAPATH - // add peer on datapath - AddDatapathPeer(0x33, *g_ConnectEntries[connectEntry].pMacAddress); - - // example inject frame - InjectDatapathFrame(0x33); - - // Pretend to recieve M1 on datapath before, the association complete has made it up the control path. - RecieveDatapathFrame(0x33, sizeof(pucData), pucData); - -#endif - if ((&s_Connect_Addr_14_WPA3_SAE_CCMP == g_ConnectEntries[connectEntry].pMacAddress) || - (&s_Connect_Addr_30_WiFi7_Mixed_Link_1 == g_ConnectEntries[connectEntry].pMacAddress) || - (&s_Connect_Addr_38_WiFi7_Only_Link_1 == g_ConnectEntries[connectEntry].pMacAddress)) - { - WDI_INDICATION_SAE_AUTH_PARAMS_NEEDED_PARAMETERS SAEAuthParamsNeeded; - UINT8* pOutput = nullptr; - ULONG cbOutput = 0; - NDIS_STATUS ndisStatus = NDIS_STATUS_SUCCESS; - - // - // Handle special case for WPA3-SAE - // Send the Indication to request additonal SAE params - // - g_dwSaeResendConfirmRequested = 0; - SAEAuthParamsNeeded.SAEIndicationType = WDI_SAE_INDICATION_TYPE_COMMIT_REQUEST_PARAMS_NEEDED; - RtlCopyMemory( - SAEAuthParamsNeeded.BssId.Address, g_ConnectEntries[connectEntry].pMacAddress, sizeof(DOT11_MAC_ADDRESS)); - - ndisStatus = GenerateWdiIndicationSaeAuthParamsNeeded( - &SAEAuthParamsNeeded, 0, &pDeviceContext->TlvContext, &cbOutput, &pOutput); - if (ndisStatus == NDIS_STATUS_SUCCESS) - { - WFCInfo("[SAE] Indicating request for COMMIT_REQUEST_PARAMS_NEEDED ..."); - - WifiCxTestSendIndication(Device, pWdiHeader, WDI_INDICATION_SAE_AUTH_PARAMS_NEEDED, 0, pOutput, cbOutput); - - FreeGenerated(pOutput); - - break; - } - } - - // Get the assoc status - RtlCopyMemory(&assocStatus, &pAssociationResult[18], sizeof(ULONG)); - - // Send the association indication - WifiCxTestSendIndication( - Device, - pWdiHeader, - WDI_INDICATION_ASSOCIATION_RESULT, - 0, - g_ConnectEntries[connectEntry].pTlvAssociationResult, - g_ConnectEntries[connectEntry].TlvAssociationResultSize); - - break; - } - } - - // - // If we found a matching BSSID entry, we are done - // - if (connectEntry < ConnectEntryId_MAX) - { - break; - } - } - - } while (FALSE); - - if (WDI_ASSOC_STATUS_SUCCESS != assocStatus || 0 == NewConnectEntryId || bssIndex >= pPreferredBSSEntryList->ElementCount) - { - NewConnectEntryId = 0; // Disconnected State - NewAuthAlgo = WDI_AUTH_ALGO_80211_OPEN; - ntStatus = STATUS_UNSUCCESSFUL; - } - else - { - RtlCopyMemory(&pDeviceContext->ConnectedPeer, pPreferredBSSEntryList->pElements[bssIndex].BSSID.Address, sizeof(DOT11_MAC_ADDRESS)); - } - - pDeviceContext->LastConnectEntryId = NewConnectEntryId; - pDeviceContext->LastAuthAlgo = NewAuthAlgo; - - if (STATUS_SUCCESS == ntStatus && (WDI_AUTH_ALGO_WPA3_SAE != pDeviceContext->LastAuthAlgo)) - { - // Report link quality - ntStatus = WifiCxTestSendLinkStateIndication(Device, pWdiHeader, 2); - } - - return ntStatus; -} - -static void WifiCxTestPerformDisassociation(_In_ WDFDEVICE Device, _In_ PWDI_MESSAGE_HEADER pWdiHeader, _In_ WDI_ASSOC_STATUS DisassocStatus) -{ - // clang-format off - UCHAR s_TLV_Disassociation[] = - { - // WDI_TLV_ASSOCIATION_RESULT - 0xBC, 0x00, - 0x0A, 0x00, - - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - - // WDI_TLV Need Peer Cleanup Params - 0xb4, 0x00, - 0x01, 0x00, - - 0x00 - }; - // clang-format on - - PWIFI_DEVICE_CONTEXT pDeviceContext = WifiGetDeviceContext(Device); - - // TODO NetAdapter: datapath not yet implemented -#ifdef WIFICX_TEST_DATAPATH - // example inject frame - InjectDatapathFrame(0x33); -#endif - - RtlCopyMemory(&s_TLV_Disassociation[4], &pDeviceContext->ConnectedPeer, sizeof(DOT11_MAC_ADDRESS)); - RtlCopyMemory(&s_TLV_Disassociation[10], &DisassocStatus, sizeof(ULONG)); - - // Send the disassociation indication - WifiCxTestSendIndication(Device, pWdiHeader, WDI_INDICATION_DISASSOCIATION, 0, s_TLV_Disassociation, sizeof(s_TLV_Disassociation)); - - pDeviceContext->LastConnectEntryId = 0; // Disconnected State -} - -_Use_decl_annotations_ static NTSTATUS ProcessWifiRequest(WDFDEVICE Device, UINT16 MessageId, void* Buffer, UINT InBufferLen, UINT OutBufferLen, UINT* pBytesWritten) { NTSTATUS ntStatus = STATUS_SUCCESS; - NDIS_STATUS ndisStatus = NDIS_STATUS_SUCCESS; - PWIFI_DEVICE_CONTEXT deviceContext = WifiGetDeviceContext(Device); + PWIFI_IHV_DEVICE_CONTEXT deviceContext = WifiGetIhvDeviceContext(Device); PWDI_MESSAGE_HEADER pWdiHeader = static_cast<PWDI_MESSAGE_HEADER>(Buffer); UINT BytesWritten = sizeof(WDI_MESSAGE_HEADER); @@ -703,42 +92,31 @@ static NTSTATUS ProcessWifiRequest(WDFDEVICE Device, UINT16 MessageId, void* Buf { WDI_SET_RADIO_STATE_PARAMETERS RadioStateParams = {}; ULONG TLVStreamLength = static_cast<ULONG>(InBufferLen - sizeof(WDI_MESSAGE_HEADER)); - auto TLVByteStream = buffer + sizeof(WDI_MESSAGE_HEADER); + auto TLVByteStream = buffer +sizeof(WDI_MESSAGE_HEADER); DumpMessageTlvByteStream( WDI_TASK_SET_RADIO_STATE, TRUE, deviceContext->TlvContext.PeerVersion, TLVStreamLength, TLVByteStream, 0, nullptr); - ParseWdiTaskSetRadioState(TLVStreamLength, TLVByteStream, &deviceContext->TlvContext, &RadioStateParams); - if (RadioStateParams.SoftwareRadioState != deviceContext->CurrentRadioState) - { - // Change the radio state - deviceContext->CurrentRadioState = RadioStateParams.SoftwareRadioState; - - // Send the radio state indication - WDI_INDICATION_RADIO_STATUS_PARAMETERS RadioStatusParams = {}; - UINT8* pOutput = nullptr; - ULONG cbOutput = 0; - - RadioStatusParams.RadioState.HardwareState = TRUE; - RadioStatusParams.RadioState.SoftwareState = deviceContext->CurrentRadioState; - GenerateWdiIndicationRadioStatus(&RadioStatusParams, 0, &deviceContext->TlvContext, &cbOutput, &pOutput); - WifiCxTestSendIndication(Device, pWdiHeader, WDI_INDICATION_RADIO_STATUS, 0, pOutput, cbOutput); + WX_RETURN_NTSTATUS_IF_NOT_NT_SUCCESS_MSG( + Wifi::ConvertNDISSTATUSoNTSTATUS( + ParseWdiTaskSetRadioState( + TLVStreamLength, + TLVByteStream, + &deviceContext->TlvContext, + &RadioStateParams)), + "Set Radio State parsing failed"); - FreeGenerated(pOutput); + // No WX_RETURN here since we need to cleanup. + ntStatus = deviceContext->wifiHAL->WifiIhvSetRadioState( + Device, RadioStateParams, pWdiHeader, &deviceContext->TlvContext); + if(!NT_SUCCESS(ntStatus)) + { + WFCError("WifiIhvSetRadioState failed: %!STATUS!\n", ntStatus); } - WifiCxTestSendIndication(Device, pWdiHeader, WDI_INDICATION_SET_RADIO_STATE_COMPLETE, pWdiHeader->TransactionId, nullptr, 0); - CleanupParsedWdiTaskSetRadioState(&RadioStateParams); } break; - - case WDI_SET_ADAPTER_CONFIGURATION: - { - ndisStatus = WifiCxTestSetAdapterConfiguration(deviceContext, Buffer, InBufferLen); - } - break; - case WDI_TASK_SCAN: { ULONG scanDataLength = static_cast<ULONG>(InBufferLen - sizeof(WDI_MESSAGE_HEADER)); @@ -746,63 +124,24 @@ static NTSTATUS ProcessWifiRequest(WDFDEVICE Device, UINT16 MessageId, void* Buf WDI_SCAN_PARAMETERS scanParams = {}; - ndisStatus = ParseWdiTaskScan(scanDataLength, pScanData, &deviceContext->TlvContext, &scanParams); - - if (NDIS_STATUS_SUCCESS != ndisStatus) - { - WFCTrace("Scan parameters parsing failed: %d\n", ndisStatus); - // ntStatus = NdisConvertNdisStatusToNtStatus(parseStatus); - break; - } - - for (UINT8 connectEntry = 1; connectEntry < ConnectEntryId_MAX; connectEntry++) - { - if (g_SupportedBands & g_ConnectEntries[connectEntry].BandId) - { - - PUCHAR pBssEntry = g_ConnectEntries[connectEntry].pTlvBssEntry; - - // - // If currently connected, see if the connected entry should be skipped - // - if ((deviceContext->LastConnectEntryId != 0) && - (RtlCompareMemory(&deviceContext->ConnectedPeer, &pBssEntry[8], sizeof(DOT11_MAC_ADDRESS)) == sizeof(DOT11_MAC_ADDRESS))) - { - // Already connected, don't report this entry - continue; - } - - // TODO: Skip the IHV band as it is not being reported in capabilities - if (g_ConnectEntries[connectEntry].BandId == TESTMP_BAND_IHV) - { - continue; - } + WX_RETURN_NTSTATUS_IF_NOT_NT_SUCCESS_MSG( + Wifi::ConvertNDISSTATUSoNTSTATUS( + ParseWdiTaskScan( + scanDataLength, + pScanData, + &deviceContext->TlvContext, + &scanParams)), + "Scan parameters parsing failed"); - // Send the BSS entry indication - WifiCxTestSendIndication( - Device, - pWdiHeader, - WDI_INDICATION_BSS_ENTRY_LIST, - 0, - g_ConnectEntries[connectEntry].pTlvBssEntry, - g_ConnectEntries[connectEntry].TlvBssEntrySize); - } - } - - // - // See if the hidden network needs to be indicated - // - if ((scanParams.SSIDList.ElementCount > 0) && (scanParams.SSIDList.pElements[0].ElementCount == 8) && - (scanParams.SSIDList.pElements[0].pElements[4] == 'H') && (scanParams.SSIDList.pElements[0].pElements[5] == 'I') && - (scanParams.SSIDList.pElements[0].pElements[6] == 'D') && (scanParams.SSIDList.pElements[0].pElements[7] == 'E')) + // No WX_RETURN here since we need to cleanup. + ntStatus = deviceContext->wifiHAL->WifiIhvScan( + Device, scanParams, pWdiHeader, &deviceContext->TlvContext); + if (!NT_SUCCESS(ntStatus)) { - WifiCxTestSendIndication( - Device, pWdiHeader, WDI_INDICATION_BSS_ENTRY_LIST, 0, s_TLV_BSS_Entry_ProbeResponse_8_Hidden, sizeof(s_TLV_BSS_Entry_ProbeResponse_8_Hidden)); + WFCError("WifiIhvSetRadioState failed: %!STATUS!\n", ntStatus); } CleanupParsedWdiTaskScan(&scanParams); - - WifiCxTestSendIndication(Device, pWdiHeader, WDI_INDICATION_SCAN_COMPLETE, pWdiHeader->TransactionId, nullptr, 0); } break; @@ -813,30 +152,17 @@ static NTSTATUS ProcessWifiRequest(WDFDEVICE Device, UINT16 MessageId, void* Buf ULONG resetDataLength = static_cast<ULONG>(InBufferLen - sizeof(WDI_MESSAGE_HEADER)); auto pResetData = buffer + sizeof(WDI_MESSAGE_HEADER); - ndisStatus = ParseWdiTaskDot11Reset(resetDataLength, pResetData, &deviceContext->TlvContext, &resetParameters); + WX_RETURN_NTSTATUS_IF_NOT_NT_SUCCESS_MSG( + Wifi::ConvertNDISSTATUSoNTSTATUS(ParseWdiTaskDot11Reset(resetDataLength, pResetData, &deviceContext->TlvContext, &resetParameters)), + "DOT11 Reset parameters parsing failed"); - if (NDIS_STATUS_SUCCESS != ndisStatus) - { - WFCTrace("DOT11 Reset parameters parsing failed: %d\n", ndisStatus); - } - else if (0 == resetParameters.Optional.ResetMACAddress_IsPresent) + // No WX_RETURN here since we need to cleanup. + ntStatus = deviceContext->wifiHAL->WifiIhvReset( + Device, resetParameters, pWdiHeader, &deviceContext->TlvContext); + if (!NT_SUCCESS(ntStatus)) { - WFCTrace("DOT11 Reset, set default MIB = %d, no MAC Address specified\n", resetParameters.Dot11ResetParameters.SetDefaultMIB); + WFCError("WifiIhvReset failed: %!STATUS!\n", ntStatus); } - else - { - WFCTrace( - "DOT11 Reset, set default MIB = %d, MAC Address = %2x:%2x:%2x:%2x:%2x:%2x\n", - resetParameters.Dot11ResetParameters.SetDefaultMIB, - resetParameters.ResetMACAddress.Address[0], - resetParameters.ResetMACAddress.Address[1], - resetParameters.ResetMACAddress.Address[2], - resetParameters.ResetMACAddress.Address[3], - resetParameters.ResetMACAddress.Address[4], - resetParameters.ResetMACAddress.Address[5]); - } - - WifiCxTestSendIndication(Device, pWdiHeader, WDI_INDICATION_DOT11_RESET_COMPLETE, pWdiHeader->TransactionId, nullptr, 0); CleanupParsedWdiTaskDot11Reset(&resetParameters); } @@ -849,51 +175,29 @@ static NTSTATUS ProcessWifiRequest(WDFDEVICE Device, UINT16 MessageId, void* Buf DumpMessageTlvByteStream(WDI_TASK_CONNECT, TRUE, deviceContext->TlvContext.PeerVersion, connectDataLength, pConnectData, 0, nullptr); - WDI_TASK_CONNECT_PARAMETERS connectParams; + WDI_TASK_CONNECT_PARAMETERS connectParams{}; - if (deviceContext->LastConnectEntryId != 0) // Not Disconnected State - { - ASSERT(FALSE); - // TODO NetAdapter: datapath not yet implemented -#ifdef WIFICX_TEST_DATAPATH - DeleteDatapathPeer(0x33); -#endif - } // We search for the BSSID pattern to figure out what AP we are trying to connect to - ndisStatus = ParseWdiTaskConnect(connectDataLength, pConnectData, &deviceContext->TlvContext, &connectParams); - if (NDIS_STATUS_SUCCESS != ndisStatus) + WX_RETURN_NTSTATUS_IF_NOT_NT_SUCCESS_MSG( + Wifi::ConvertNDISSTATUSoNTSTATUS(ParseWdiTaskConnect(connectDataLength, pConnectData, &deviceContext->TlvContext, &connectParams)), + "Connect parameters parsing failed"); + + // No WX_RETURN here since we need to cleanup. + ntStatus = deviceContext->wifiHAL->WifiIhvConnect( + Device, connectParams, pWdiHeader, &deviceContext->TlvContext); + if (!NT_SUCCESS(ntStatus)) { - // ntStatus = NdisConvertNdisStatusToNtStatus(parseStatus); - WFCTrace("ParseWdiTaskConnect FAIled %d\n", ndisStatus); - break; + WFCError("WifiIhvConnect failed: %!STATUS!\n", ntStatus); } - // Call the helper - ndisStatus = WifiCxTestPerformAssociation( - Device, &connectParams.PreferredBSSEntryList, &connectParams.ConnectParameters.AuthenticationAlgorithms, pWdiHeader); CleanupParsedWdiTaskConnect(&connectParams); - - // - // WPA3-SAE requires the SAE Exchange, so do not complete the Connection request until the SAE exchange is complete - // - if (WDI_AUTH_ALGO_WPA3_SAE != deviceContext->LastAuthAlgo) - { - WifiCxTestSendIndication(Device, pWdiHeader, WDI_INDICATION_CONNECT_COMPLETE, pWdiHeader->TransactionId, nullptr, 0); - } } break; case WDI_TASK_DISCONNECT: { - WifiCxTestPerformDisassociation(Device, pWdiHeader, WDI_ASSOC_STATUS_DISASSOCIATED_BY_HOST); - - WifiCxTestSendIndication(Device, pWdiHeader, WDI_INDICATION_DISCONNECT_COMPLETE, pWdiHeader->TransactionId, nullptr, 0); - -#ifdef WIFICX_TEST_DATAPATH - // TODO NetAdapter: datapath not yet implemented - DeleteDatapathPeer(0x33); -#endif + deviceContext->wifiHAL->WifiIhvPerformDisassociation(Device, pWdiHeader, WDI_ASSOC_STATUS_DISASSOCIATED_BY_HOST); } break; @@ -903,161 +207,28 @@ static NTSTATUS ProcessWifiRequest(WDFDEVICE Device, UINT16 MessageId, void* Buf case WDI_SET_DELETE_CIPHER_KEYS: case WDI_SET_RECEIVE_PACKET_FILTER: case WDI_SET_CONNECTION_QUALITY: + case WDI_SET_ADAPTER_CONFIGURATION: // Doing Nothing special break; case WDI_SET_SAE_AUTH_PARAMS: { WDI_SET_SAE_AUTH_PARAMS_COMMAND setSAEAuthParams; - WDI_INDICATION_SAE_AUTH_PARAMS_NEEDED_PARAMETERS SAEAuthParamsNeeded; - UINT8* pOutput = nullptr; - ULONG cbOutput = 0; - - // Commit frame when Status = 0: FiniteCyclicGroup + Scalar + Element - // Commit frame when Status = 76: FiniteCyclicGroup + AntiCloggingToken - WFCInfo("WDI_SET_SAE_AUTH_PARAMS called!!!\n"); + + WX_RETURN_NTSTATUS_IF_NOT_NT_SUCCESS_MSG( + Wifi::ConvertNDISSTATUSoNTSTATUS(ParseWdiSetSaeAuthParams( + InBufferLen - sizeof(WDI_MESSAGE_HEADER), (PUINT8)buffer + sizeof(WDI_MESSAGE_HEADER), &deviceContext->TlvContext, &setSAEAuthParams)), + "Failed to parse WDI_SET_SAE_AUTH_PARAMS"); - ndisStatus = ParseWdiSetSaeAuthParams( - InBufferLen - sizeof(WDI_MESSAGE_HEADER), (PUINT8)buffer + sizeof(WDI_MESSAGE_HEADER), &deviceContext->TlvContext, &setSAEAuthParams); - if (ndisStatus == NDIS_STATUS_SUCCESS) + // No WX_RETURN here since we need to cleanup. + ntStatus = deviceContext->wifiHAL->WifiIhvSetSaeAuthParams( + Device, setSAEAuthParams, pWdiHeader, &deviceContext->TlvContext); + if (!NT_SUCCESS(ntStatus)) { - if (WDI_SAE_REQUEST_TYPE_COMMIT_PARAMS == setSAEAuthParams.SAERequestType) - { - WFCInfo("[SAE] WDI_SET_SAE_AUTH_PARAMS has Commit request for Tx, Setting CommitResponse for Rx\n"); - - SAEAuthParamsNeeded.SAEIndicationType = WDI_SAE_INDICATION_TYPE_COMMIT_FRAME; - SAEAuthParamsNeeded.Optional.SAECommitFrame_IsPresent = 1; - - // - // Send reflection attack first - // - SAEAuthParamsNeeded.SAECommitFrame.ElementCount = sizeof(pucSAECommitResponseReflection); - SAEAuthParamsNeeded.SAECommitFrame.pElements = pucSAECommitResponseReflection; - } - else if ( - (WDI_SAE_REQUEST_TYPE_FAILURE == setSAEAuthParams.SAERequestType) && - (WDI_SAE_STATUS_COMMIT_MESSAGE_REFLECTION_ATTACK_DETECTED == setSAEAuthParams.SAEStatus)) - { - WFCInfo("[SAE] WDI_SET_SAE_AUTH_PARAMS returned Reflection error -- Inidicate proper CommitResponse for Rx\n"); - - SAEAuthParamsNeeded.SAEIndicationType = WDI_SAE_INDICATION_TYPE_CONFIRM_FRAME; - SAEAuthParamsNeeded.Optional.SAECommitFrame_IsPresent = 1; - SAEAuthParamsNeeded.SAECommitFrame.ElementCount = sizeof(pucSAECommitResponse); - SAEAuthParamsNeeded.SAECommitFrame.pElements = pucSAECommitResponse; - } - else if (WDI_SAE_REQUEST_TYPE_CONFIRM_PARAMS == setSAEAuthParams.SAERequestType) - { - WFCInfo("[SAE] WDI_SET_SAE_AUTH_PARAMS has Confirm request for Tx, Setting ConfirmResponse for Rx\n"); - - if (g_dwSaeResendConfirmRequested) - { - SAEAuthParamsNeeded.SAEIndicationType = WDI_SAE_INDICATION_TYPE_CONFIRM_FRAME; - SAEAuthParamsNeeded.Optional.SAECommitFrame_IsPresent = 1; - SAEAuthParamsNeeded.SAECommitFrame.ElementCount = sizeof(pucSAEConfirmResponse); - SAEAuthParamsNeeded.SAECommitFrame.pElements = pucSAEConfirmResponse; - } - else - { - g_dwSaeResendConfirmRequested = 1; - - SAEAuthParamsNeeded.SAEIndicationType = WDI_SAE_INDICATION_TYPE_CONFIRM_REQUEST_RESEND_REQUEST; - } - } - else - { - if (WDI_SAE_REQUEST_TYPE_FAILURE == setSAEAuthParams.SAERequestType) - { - WFCInfo("[SAE] OID_WDI_SET_SAE_AUTH_PARAMS has indicated error - %d\n", setSAEAuthParams.SAEStatus); - } - else if (WDI_SAE_REQUEST_TYPE_SUCCESS == setSAEAuthParams.SAERequestType) - { - WFCInfo("[SAE] OID_WDI_SET_SAE_AUTH_PARAMS has indicated SAE success - %d\n", setSAEAuthParams.SAEStatus); - } - else - { - WFCInfo("[SAE] OID_WDI_SET_SAE_AUTH_PARAMS has set INVALID Request type = %d\n", setSAEAuthParams.SAERequestType); - } -#ifdef WIFICX_TEST_DATAPATH - // example inject frame - InjectDatapathFrame(0x33); -#endif - // Send the association indication - if (WDI_AUTH_ALGO_WPA3_SAE == deviceContext->LastAuthAlgo) - { - s_TLV_Success_AssociationResult_14_WPA3_SAE_CCMP[27] = (UCHAR)WDI_AUTH_ALGO_WPA3_SAE; - } - else - { - s_TLV_Success_AssociationResult_14_WPA3_SAE_CCMP[27] = (UCHAR)WDI_AUTH_ALGO_RSNA_PSK; - } - - WifiCxTestSendIndication( - Device, - pWdiHeader, - WDI_INDICATION_ASSOCIATION_RESULT, - 0, - s_TLV_Success_AssociationResult_14_WPA3_SAE_CCMP, - sizeof(s_TLV_Success_AssociationResult_14_WPA3_SAE_CCMP)); - RtlCopyMemory(&deviceContext->ConnectedPeer, &s_Connect_Addr_14_WPA3_SAE_CCMP, sizeof(DOT11_MAC_ADDRESS)); - - // Report link quality - ntStatus = WifiCxTestSendLinkStateIndication(Device, pWdiHeader, 1); - - WifiCxTestSendIndication( - Device, pWdiHeader, WDI_INDICATION_CONNECT_COMPLETE, deviceContext->LastConnectTransactionId, nullptr, 0); - -#ifdef WIFICX_TEST_DATAPATH - // - // Receive M1 frame of 4-way handshake - // - RecieveDatapathFrame(0x33, sizeof(pucM1SaeFrame), pucM1SaeFrame); - - // - // Receive M3 frame of 4-way handshake - // - RecieveDatapathFrame(0x33, sizeof(pucM3SaeFrame), pucM3SaeFrame); -#endif - break; - } - - RtlCopyMemory(SAEAuthParamsNeeded.BssId.Address, &s_Connect_Addr_14_WPA3_SAE_CCMP, sizeof(DOT11_MAC_ADDRESS)); - - ndisStatus = - GenerateWdiIndicationSaeAuthParamsNeeded(&SAEAuthParamsNeeded, 0, &deviceContext->TlvContext, &cbOutput, &pOutput); - if (ndisStatus == NDIS_STATUS_SUCCESS) - { - WifiCxTestSendIndication(Device, pWdiHeader, WDI_INDICATION_SAE_AUTH_PARAMS_NEEDED, 0, pOutput, cbOutput); - - FreeGenerated(pOutput); - } - else - { - WFCError("Failed to generate WDI_INDICATION_SAE_AUTH_PARAMS_NEEDED - 0x%08x\n", ndisStatus); - } - } - else - { - WFCError("[SAE] Failed to parse WDI_SET_SAE_AUTH_PARAMS data - 0x%08x\n", ndisStatus); + WFCError("WifiIhvSetSaeAuthParams failed: %!STATUS!\n", ntStatus); } - CleanupParsedWdiSetSaeAuthParamsToIhv(&setSAEAuthParams); - } - break; - - case WDI_SET_LOCATION_PRIVACY: - { - WDI_SET_LOCATION_PRIVACY_PARAMETERS privacyParams; - ndisStatus = ParseWdiSetLocationPrivacyToIhv( - InBufferLen - sizeof(WDI_MESSAGE_HEADER), (PUINT8)buffer + sizeof(WDI_MESSAGE_HEADER), &deviceContext->TlvContext, &privacyParams); - if (NDIS_STATUS_SUCCESS == ndisStatus) - { - WFCInfo("[WDI_SET_LOCATION_PRIVACY]: Got privacy setting = %x *****\n", privacyParams.LocationAllowed); - CleanupParsedWdiSetLocationPrivacy(&privacyParams); - } - else - { - WFCError("[WDI_SET_LOCATION_PRIVACY]: ParseWdiSetLocationPrivacyToIhv FAIled %x0x *****\n", ndisStatus); - } + CleanupParsedWdiSetSaeAuthParams(&setSAEAuthParams); } break; @@ -1066,9 +237,6 @@ static NTSTATUS ProcessWifiRequest(WDFDEVICE Device, UINT16 MessageId, void* Buf break; } - // Set the ndis Status in the WDI header - pWdiHeader->Status = ndisStatus; - // Set the output length if (pBytesWritten) { @@ -1076,446 +244,3 @@ static NTSTATUS ProcessWifiRequest(WDFDEVICE Device, UINT16 MessageId, void* Buf } return ntStatus; } - -_Use_decl_annotations_ -NTSTATUS WifiCxTestSetDeviceCapabilities(WDFDEVICE Device) -{ - WIFI_DEVICE_CAPABILITIES deviceCaps = {}; - WIFI_DEVICE_CAPABILITIES_INIT(&deviceCaps); - - deviceCaps.HardwareRadioState = TRUE; - deviceCaps.SoftwareRadioState = TRUE; - deviceCaps.FirmwareVersion[MAX_FIRMWARE_VERSION_LENGTH]; - deviceCaps.ActionFramesSupported = TRUE; - deviceCaps.NumRxStreams = 1; - deviceCaps.NumTxStreams = 1; - deviceCaps.Support_eCSA = FALSE; - deviceCaps.MACAddressRandomization = FALSE; - deviceCaps.MACAddressRandomizationMask.Address[0] = 0; - deviceCaps.MACAddressRandomizationMask.Address[1] = 0; - deviceCaps.MACAddressRandomizationMask.Address[2] = 0; - deviceCaps.MACAddressRandomizationMask.Address[3] = 0xFF; - deviceCaps.MACAddressRandomizationMask.Address[4] = 0; - deviceCaps.MACAddressRandomizationMask.Address[5] = 0; - deviceCaps.BluetoothCoexistenceSupport = WDI_BLUETOOTH_COEXISTENCE_PERFORMANCE_MAINTAINED; - deviceCaps.SupportsNonWdiOidRequests = FALSE; - deviceCaps.FastTransitionSupported = TRUE; - deviceCaps.MU_MIMOSupported = FALSE; - deviceCaps.SAEAuthenticationSupported = TRUE; - deviceCaps.BSSTransitionSupported = TRUE; - deviceCaps.MBOSupported = FALSE; - deviceCaps.BeaconReportsImplemented = FALSE; - - WifiDeviceSetDeviceCapabilities(Device, &deviceCaps); - - WIFI_STATION_CAPABILITIES StationCaps = {}; - WIFI_STATION_CAPABILITIES_INIT(&StationCaps); - - StationCaps.ScanSSIDListSize = 4; - StationCaps.DesiredSSIDListSize = 1; - StationCaps.PrivacyExemptionListSize = 1; - StationCaps.KeyMappingTableSize = 32; - StationCaps.DefaultKeyTableSize = 4; - StationCaps.WEPKeyValueMaxLength = 0x20; - StationCaps.MaxNumPerSTA = 4; - StationCaps.SupportedQOSFlags = 0; - StationCaps.HostFIPSModeImplemented = FALSE; - StationCaps.MFPCapable = TRUE; - StationCaps.AutoPowerSaveMode = FALSE; - StationCaps.BSSListCachemanagement = FALSE; - StationCaps.ConnectBSSSelectionOverride = FALSE; - StationCaps.MaxNetworkOffloadListSize = 0; - StationCaps.HESSIDConnectionSupported = FALSE; - StationCaps.FTMAsInitiatorSupport = FALSE; - StationCaps.FTMNumberOfSupportedTargets = 0; - - const DOT11_AUTH_CIPHER_PAIR UnicastAlgos[] = { - {DOT11_AUTH_ALGO_80211_OPEN, DOT11_CIPHER_ALGO_NONE}, - {DOT11_AUTH_ALGO_80211_OPEN, DOT11_CIPHER_ALGO_WEP}, - {DOT11_AUTH_ALGO_WPA_PSK, DOT11_CIPHER_ALGO_CCMP}, - {DOT11_AUTH_ALGO_RSNA, DOT11_CIPHER_ALGO_CCMP}, - {DOT11_AUTH_ALGO_RSNA_PSK, DOT11_CIPHER_ALGO_TKIP}, - {DOT11_AUTH_ALGO_RSNA_PSK, DOT11_CIPHER_ALGO_CCMP}, - {DOT11_AUTH_ALGO_WPA3_ENT_192, DOT11_CIPHER_ALGO_GCMP_256}, - {DOT11_AUTH_ALGO_WPA3_ENT, DOT11_CIPHER_ALGO_CCMP}, - {DOT11_AUTH_ALGO_WPA3_SAE, DOT11_CIPHER_ALGO_GCMP_256}, - {DOT11_AUTH_ALGO_WPA3_SAE, DOT11_CIPHER_ALGO_CCMP}, - {DOT11_AUTH_ALGO_OWE, DOT11_CIPHER_ALGO_GCMP_256}, - {DOT11_AUTH_ALGO_OWE, DOT11_CIPHER_ALGO_CCMP}, - }; - - const DOT11_AUTH_CIPHER_PAIR McastMgmtAlgos[] = { - {DOT11_AUTH_ALGO_80211_OPEN, DOT11_CIPHER_ALGO_NONE}, - {DOT11_AUTH_ALGO_RSNA, DOT11_CIPHER_ALGO_BIP}, - {DOT11_AUTH_ALGO_RSNA_PSK, DOT11_CIPHER_ALGO_BIP}, - {DOT11_AUTH_ALGO_WPA3_SAE, DOT11_CIPHER_ALGO_BIP}, - {DOT11_AUTH_ALGO_WPA3_ENT, DOT11_CIPHER_ALGO_BIP}, - {DOT11_AUTH_ALGO_WPA3_ENT_192, DOT11_CIPHER_ALGO_BIP_GMAC_256}, - }; - - StationCaps.NumSupportedUnicastAlgorithms = ARRAYSIZE(UnicastAlgos); - StationCaps.UnicastAlgorithmsList = const_cast<PDOT11_AUTH_CIPHER_PAIR>(UnicastAlgos); - StationCaps.NumSupportedMulticastDataAlgorithms = ARRAYSIZE(UnicastAlgos); - StationCaps.MulticastDataAlgorithmsList = const_cast<PDOT11_AUTH_CIPHER_PAIR>(UnicastAlgos); - StationCaps.NumSupportedMulticastMgmtAlgorithms = ARRAYSIZE(McastMgmtAlgos); - StationCaps.MulticastMgmtAlgorithmsList = const_cast<PDOT11_AUTH_CIPHER_PAIR>(McastMgmtAlgos); - - WIFI_STA_BANDS_COMBINATION SecondaryStaBandsCombinations[] = { - {2, {WDI_BAND_ID_2400, WDI_BAND_ID_5000, WDI_BAND_ID_UNKNOWN, WDI_BAND_ID_UNKNOWN}}, - {2, {WDI_BAND_ID_2400, WDI_BAND_ID_6000, WDI_BAND_ID_UNKNOWN, WDI_BAND_ID_UNKNOWN}}, - {2, {WDI_BAND_ID_5000, WDI_BAND_ID_6000, WDI_BAND_ID_UNKNOWN, WDI_BAND_ID_UNKNOWN}}, - {3, {WDI_BAND_ID_2400, WDI_BAND_ID_5000, WDI_BAND_ID_6000, WDI_BAND_ID_UNKNOWN}}, - }; - - StationCaps.NumSecondaryStaBandCombinations = ARRAYSIZE(SecondaryStaBandsCombinations); - StationCaps.SecondaryStaBandsCombinations = SecondaryStaBandsCombinations; - - WDI_MAC_ADDRESS MLOAddresses[] = { - {0x11, 0x01, 0x02, 0x03, 0x04, 0x21}, - {0x11, 0x01, 0x02, 0x03, 0x04, 0x22}, - }; - StationCaps.MaxMLOLinksSupported = ARRAYSIZE(MLOAddresses); - StationCaps.MLOAddressesList = MLOAddresses; - - RSNA_AKM_SUITE AkmsList[] = { - rsna_akm_1x, - rsna_akm_psk, - rsna_akm_ft_1x_sha256, - rsna_akm_ft_psk_sha256, - rsna_akm_1x_sha256, - rsna_akm_psk_sha256, - rsna_akm_sae_pmk256, - rsna_akm_1x_suite_b_sha384, - rsna_akm_owe, - rsna_akm_1x_sha384, - rsna_akm_sae_pmk384, - }; - StationCaps.NumAkmsSupported = ARRAYSIZE(AkmsList); - StationCaps.AkmsList = AkmsList; - - if (WIFI_IS_FIELD_AVAILABLE(WIFI_STATION_CAPABILITIES, MSCSSupported)) - { - StationCaps.MSCSSupported = true; - } - if (WIFI_IS_FIELD_AVAILABLE(WIFI_STATION_CAPABILITIES, DSCPToUPMappingSupported)) - { - StationCaps.DSCPToUPMappingSupported = true; - } -#ifdef _KERNEL_MODE - if (!KdRefreshDebuggerNotPresent()) - { - DbgPrintEx( - DPFLTR_DEFAULT_ID, - DPFLTR_ERROR_LEVEL, - "WIFI_IS_FIELD_AVAILABLE:WIFI_STATION_CAPABILITIES::MSCSSupported %u\n", - WIFI_IS_FIELD_AVAILABLE(WIFI_STATION_CAPABILITIES, MSCSSupported)); - DbgPrintEx( - DPFLTR_DEFAULT_ID, - DPFLTR_ERROR_LEVEL, - "WIFI_IS_FIELD_AVAILABLE:WIFI_STATION_CAPABILITIES::DSCPToUPMappingSupported %u\n", - WIFI_IS_FIELD_AVAILABLE(WIFI_STATION_CAPABILITIES, DSCPToUPMappingSupported)); - DbgPrintEx( - DPFLTR_DEFAULT_ID, - DPFLTR_ERROR_LEVEL, - "WIFI_IS_FIELD_AVAILABLE:WIFI_STATION_CAPABILITIES::MaxNumConfigurableActionFrameWakePatterns %u\n", - WIFI_IS_FIELD_AVAILABLE(WIFI_STATION_CAPABILITIES, MaxNumConfigurableActionFrameWakePatterns)); - DbgPrintEx( - DPFLTR_DEFAULT_ID, - DPFLTR_ERROR_LEVEL, - "WIFI_IS_FUNCTION_AVAILABLE:WifiPowerOffloadGetActionFrameWakePatternParameters %u\n", - WIFI_IS_FUNCTION_AVAILABLE(WifiPowerOffloadGetActionFrameWakePatternParameters)); - } -#endif - WifiDeviceSetStationCapabilities(Device, &StationCaps); - - WIFI_BAND_CAPABILITIES BandCaps = {}; - WIFI_BAND_CAPABILITIES_INIT(&BandCaps); - - const WDI_PHY_TYPE Phy24GHz[] = { WDI_PHY_TYPE_ERP, WDI_PHY_TYPE_HE }; // g, ax - const WDI_PHY_TYPE Phy5GHz[] = { WDI_PHY_TYPE_OFDM, WDI_PHY_TYPE_HE, WDI_PHY_TYPE_EHT }; // a, ax, be - const WDI_PHY_TYPE Phy6GHz[] = { WDI_PHY_TYPE_HE, WDI_PHY_TYPE_EHT }; // ax, be - const WDI_PHY_TYPE pPhy60GHz[] = { WDI_PHY_TYPE_DMG }; // ad - const WDI_PHY_TYPE phyIHV[2] = { WDI_PHY_TYPE_OFDM, static_cast<WDI_PHY_TYPE>(WDI_PHY_TYPE_IHV_START + 1) }; - - // clang-format off - - const WDI_CHANNEL_MAPPING_ENTRY ChannelMap24[] = { - {1, 2412}, - {2, 2417}, - {3, 2422}, - {4, 2427}, - {5, 2432}, - {6, 2437}, - {7, 2442}, - {8, 2447}, - {9, 2452}, - {10, 2457}, - {11, 2462}, - {12, 2467}, // Not used in US - {13, 2472}, // Not used in US - {14, 2484}, // Allowed in Japan only - }; - - const WDI_CHANNEL_MAPPING_ENTRY ChannelMap5[] = { - {7, 5035}, // Not used in US - {8, 5040}, // Not used in US - {9, 5045}, // Not used in US - {11, 5055}, // Not used in US - {12, 5060}, // Not used in US - {16, 5080}, // Not used in US - {32, 5160}, // Unknown status - {34, 5170}, // Not used in US - {36, 5180}, - {38, 5190}, - {40, 5200}, - {42, 5210}, - {44, 5220}, - {46, 5230}, - {48, 5240}, - {50, 5250}, // DFS - {52, 5260}, // DFS - {54, 5270}, // DFS - {56, 5280}, // DFS - {58, 5290}, // DFS - {60, 5300}, // DFS - {62, 5310}, // DFS - {64, 5320}, // DFS - {68, 5340}, // Unknown status - {96, 5480}, // Unknown status - {100, 5500}, // DFS - {102, 5510}, // DFS - {104, 5520}, // DFS - {106, 5530}, // DFS - {108, 5540}, // DFS - {110, 5550}, // DFS - {112, 5560}, // DFS - {114, 5570}, // DFS - {116, 5580}, // DFS - {118, 5590}, // DFS - {120, 5600}, // DFS - {122, 5610}, // DFS - {124, 5620}, // DFS - {126, 5630}, // DFS - {128, 5640}, // DFS - {132, 5660}, // DFS - {134, 5670}, // DFS - {136, 5680}, // DFS - {138, 5690}, // DFS - {140, 5700}, // DFS - {142, 5710}, // DFS - {142, 5720}, // DFS - {144, 5730}, // DFS - {149, 5745}, - {151, 5755}, - {153, 5765}, - {155, 5785}, - {157, 5785}, - {159, 5795}, - {161, 5805}, - {165, 5825}, - {169, 5845}, // Not used in US - {173, 5865}, // Not used in US - {183, 4915}, // Not used in US - {184, 4920}, // Not used in US - {185, 4925}, // Not used in US - {187, 4935}, // Not used in US - {188, 4940}, // Not used in US - {189, 4945}, // Not used in US - {192, 4960}, // Not used in US - {196, 4980}, // Not used in US - }; - - const WDI_CHANNEL_MAPPING_ENTRY channelMap6[] = { - {1, 5955}, - {5, 5975}, // PSC Channel (1) - {9, 5995}, - - {13, 6015}, - {17, 6035}, - {21, 6055}, // PSC Channel (2) - {25, 6075}, - {29, 6095}, - - {33, 6115}, - {37, 6135}, // PSC Channel (3) - {41, 6155}, - {45, 6175}, - {49, 6195}, - - {53, 6215}, // PSC Channel (4) - {57, 6235}, - {61, 6255}, - {65, 6275}, - {69, 6295}, // PSC Channel (5) - - {73, 6315}, - {77, 6335}, - {81, 6355}, - {85, 6375}, // PSC Channel (6) - {89, 6395}, - - {93, 6415}, - {97, 6435}, - {101, 6455}, // PSC Channel (7) - {105, 6475}, - {109, 6495}, - - {113, 6515}, - {117, 6535}, // PSC Channel (8) - {121, 6555}, - {125, 6575}, - {129, 6595}, - - {133, 6615}, // PSC Channel (9) - {137, 6635}, - {141, 6655}, - {145, 6675}, - {149, 6695}, // PSC Channel (10) - - {153, 6715}, - {157, 6735}, - {161, 6755}, - {165, 6775}, // PSC Channel (11) - {169, 6795}, - - {173, 6815}, - {177, 6835}, - {181, 6855}, // PSC Channel (12) - {185, 6875}, - {189, 6895}, - - {193, 6915}, - {197, 6935}, // PSC Channel (13) - {201, 6955}, - {205, 6975}, - {209, 6995}, - - {213, 7015}, // PSC Channel (14) - {217, 7035}, - {221, 7055}, - {225, 7075}, - {229, 7095}, // PSC Channel (15) - - {233, 7115}, - {237, 7135}, - {241, 7155}, - {245, 7175}, - {249, 7195}, - - {253, 7215}, - }; - - const WDI_CHANNEL_MAPPING_ENTRY channelMap60[] = { - {1, 58320}, - {2, 60480}, - {3, 62640}, - {4, 64800}, - {5, 66960}, - {6, 69120}, - }; - - // clang-format on - - UINT32 ChannelWidth10Mhz = 10; - UINT32 ChannelWidth20Mhz = 20; - UINT32 channelWidth2160Mhz = 2160; - UINT32 pChannelWidth6Ghz[] = { 20, 40, 80, 160, 320 }; - - WIFI_BAND_INFO BandInfo[4] = {}; // Upto 4 bands - UINT32 bandInfoCount = 0; - - if (g_SupportedBands & WDI_BAND_ID_2400) - { - BandInfo[bandInfoCount].BandID = WDI_BAND_ID_2400; - BandInfo[bandInfoCount].BandState = TRUE; - BandInfo[bandInfoCount].NumValidPhyTypes = ARRAYSIZE(Phy24GHz); - BandInfo[bandInfoCount].ValidPhyTypeList = const_cast<WDI_PHY_TYPE*>(Phy24GHz); - BandInfo[bandInfoCount].NumValidChannelTypes = ARRAYSIZE(ChannelMap24); - BandInfo[bandInfoCount].ValidChannelTypes = const_cast<WDI_CHANNEL_MAPPING_ENTRY*>(ChannelMap24); - BandInfo[bandInfoCount].NumChannelWidths = 1; - BandInfo[bandInfoCount].ChannelWidthList = &ChannelWidth10Mhz; - bandInfoCount++; - } - NT_ASSERT(bandInfoCount <= 1); - - if (g_SupportedBands & WDI_BAND_ID_5000) - { - BandInfo[bandInfoCount].BandID = WDI_BAND_ID_5000; - BandInfo[bandInfoCount].BandState = TRUE; - BandInfo[bandInfoCount].NumValidPhyTypes = ARRAYSIZE(Phy5GHz); - BandInfo[bandInfoCount].ValidPhyTypeList = const_cast<WDI_PHY_TYPE*>(Phy5GHz); - BandInfo[bandInfoCount].NumValidChannelTypes = ARRAYSIZE(ChannelMap5); - BandInfo[bandInfoCount].ValidChannelTypes = const_cast<WDI_CHANNEL_MAPPING_ENTRY*>(ChannelMap5); - BandInfo[bandInfoCount].NumChannelWidths = 1; - BandInfo[bandInfoCount].ChannelWidthList = &ChannelWidth20Mhz; - bandInfoCount++; - } - NT_ASSERT(bandInfoCount <= 2); - - if (g_SupportedBands & WDI_BAND_ID_6000) - { - BandInfo[bandInfoCount].BandID = WDI_BAND_ID_6000; // 6 - BandInfo[bandInfoCount].BandState = TRUE; - BandInfo[bandInfoCount].NumValidPhyTypes = ARRAYSIZE(Phy6GHz); - BandInfo[bandInfoCount].ValidPhyTypeList = const_cast<WDI_PHY_TYPE*>(Phy6GHz); - BandInfo[bandInfoCount].NumValidChannelTypes = ARRAYSIZE(channelMap6); - BandInfo[bandInfoCount].ValidChannelTypes = const_cast<WDI_CHANNEL_MAPPING_ENTRY*>(channelMap6); - BandInfo[bandInfoCount].NumChannelWidths = ARRAYSIZE(pChannelWidth6Ghz); - BandInfo[bandInfoCount].ChannelWidthList = pChannelWidth6Ghz; - bandInfoCount++; - } - - NT_ASSERT(bandInfoCount <= 3); - if (g_SupportedBands & WDI_BAND_ID_60000) - { - BandInfo[bandInfoCount].BandID = WDI_BAND_ID_60000; // 60 - BandInfo[bandInfoCount].BandState = TRUE; - BandInfo[bandInfoCount].NumValidPhyTypes = ARRAYSIZE(pPhy60GHz); - BandInfo[bandInfoCount].ValidPhyTypeList = const_cast<WDI_PHY_TYPE*>(pPhy60GHz); - BandInfo[bandInfoCount].NumValidChannelTypes = ARRAYSIZE(channelMap60); - BandInfo[bandInfoCount].ValidChannelTypes = const_cast<WDI_CHANNEL_MAPPING_ENTRY*>(channelMap60); - BandInfo[bandInfoCount].NumChannelWidths = 1; - BandInfo[bandInfoCount].ChannelWidthList = &channelWidth2160Mhz; - bandInfoCount++; - } - NT_ASSERT(bandInfoCount <= 4); - - BandCaps.NumBands = bandInfoCount; - BandCaps.BandInfoList = BandInfo; - - WifiDeviceSetBandCapabilities(Device, &BandCaps); - - WIFI_PHY_CAPABILITIES PhyCaps = {}; - WIFI_PHY_CAPABILITIES_INIT(&PhyCaps); - - WIFI_PHY_INFO PhyInfoList[3]; - - const WDI_DATA_RATE_ENTRY DataRateListErp[] = { - {WDI_DATA_RATE_RX_RATE | WDI_DATA_RATE_TX_RATE, 2}, - {WDI_DATA_RATE_RX_RATE | WDI_DATA_RATE_TX_RATE, 4}, - {WDI_DATA_RATE_RX_RATE | WDI_DATA_RATE_TX_RATE, 22}, - {WDI_DATA_RATE_RX_RATE | WDI_DATA_RATE_TX_RATE, 108} }; - const WDI_DATA_RATE_ENTRY DataRateListOfdm[] = { - {WDI_DATA_RATE_RX_RATE | WDI_DATA_RATE_TX_RATE, 2}, {WDI_DATA_RATE_RX_RATE | WDI_DATA_RATE_TX_RATE, 108} }; - const WDI_DATA_RATE_ENTRY DataRateListEht[] = { - {WDI_DATA_RATE_RX_RATE | WDI_DATA_RATE_TX_RATE, 2}, {WDI_DATA_RATE_RX_RATE | WDI_DATA_RATE_TX_RATE, 108} }; - - PhyInfoList[0].PhyType = WDI_PHY_TYPE_ERP; - PhyInfoList[0].NumberDataRateEntries = ARRAYSIZE(DataRateListErp); - RtlCopyMemory(&PhyInfoList[0].DataRateList, &DataRateListErp, sizeof(DataRateListErp)); - - PhyInfoList[1].PhyType = WDI_PHY_TYPE_HE; - PhyInfoList[1].NumberDataRateEntries = ARRAYSIZE(DataRateListOfdm); - RtlCopyMemory(&PhyInfoList[1].DataRateList, &DataRateListOfdm, sizeof(DataRateListOfdm)); - - PhyInfoList[2].PhyType = WDI_PHY_TYPE_EHT; - PhyInfoList[2].NumberDataRateEntries = ARRAYSIZE(DataRateListEht); - RtlCopyMemory(&PhyInfoList[2].DataRateList, &DataRateListEht, sizeof(DataRateListEht)); - - PhyCaps.NumPhyTypes = ARRAYSIZE(PhyInfoList); - PhyCaps.PhyInfoList = PhyInfoList; - - WifiDeviceSetPhyCapabilities(Device, &PhyCaps); - - return STATUS_SUCCESS; -}
\ No newline at end of file diff --git a/network/wlan/WIFICX/drivercode/wifirequest.h b/network/wlan/WIFICX/drivercode/wifirequest.h index b2221c1e..601fec7d 100644 --- a/network/wlan/WIFICX/drivercode/wifirequest.h +++ b/network/wlan/WIFICX/drivercode/wifirequest.h @@ -1,30 +1,16 @@ // Copyright (C) Microsoft Corporation. All rights reserved. #pragma once +#include "device.h" EVT_WIFI_DEVICE_SEND_COMMAND EvtWifiDeviceSendCommand; static NTSTATUS ProcessWifiRequest( _In_ WDFDEVICE Device, _In_ UINT16 MessageId, _In_ void* Buffer, _In_ UINT InBufferLen, _In_ UINT OutBufferLen, _In_ UINT* pBytesWritten); -UINT WifiCxTestSetOutput( - _In_ PWIFI_DEVICE_CONTEXT pDeviceContext, - _Inout_ void* ReqBuffer, - _In_ SIZE_T ReqBufferSize, - _In_opt_bytecount_(TlvDataSize) PUCHAR pTlvData, - _In_ UINT32 TlvDataSize); - -void WifiCxTestSendIndication( +void WifiIhvSendIndicationToOs( _In_ WDFDEVICE Device, _In_ PWDI_MESSAGE_HEADER pWdiHeader, _In_ UINT16 MessageId, _In_ UINT32 TransactionId, _In_opt_bytecount_(TlvDataSize) PUCHAR pTlvData, _In_ UINT32 TlvDataSize); - -NDIS_STATUS WifiCxTestGetAdapterCapabilities(_In_ PWIFI_DEVICE_CONTEXT pDeviceContext, _In_ void* ReqBuffer, _In_ SIZE_T ReqBufferSize); - -NDIS_STATUS WifiCxTestSetAdapterConfiguration(_In_ PWIFI_DEVICE_CONTEXT pDeviceContext, _In_ void* ReqBuffer, _In_ SIZE_T ReqBufferSize); - -NTSTATUS WifiCxTestSetDeviceCapabilities(_In_ WDFDEVICE Device); - -ULONG g_SupportedBands = (WDI_BAND_ID_2400 | WDI_BAND_ID_5000 | WDI_BAND_ID_6000);
\ No newline at end of file diff --git a/network/wlan/WIFICX/km/wificxsampleclientkm.vcxproj b/network/wlan/WIFICX/km/wificxsampleclientkm.vcxproj index 73dfb632..aea719ed 100644 --- a/network/wlan/WIFICX/km/wificxsampleclientkm.vcxproj +++ b/network/wlan/WIFICX/km/wificxsampleclientkm.vcxproj @@ -127,6 +127,9 @@ <ClCompile> <WppEnabled>true</WppEnabled> <AdditionalIncludeDirectories>$(DDK_INC_PATH)wlan\2.0;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <WppRecorderEnabled>true</WppRecorderEnabled> + <WppScanConfigurationData>..\drivercode\trace.h</WppScanConfigurationData> + <WppMinimalRebuildFromTracking>false</WppMinimalRebuildFromTracking> </ClCompile> <Link> <AdditionalDependencies>$(DDK_LIB_PATH)wlan\2.0\WificxTLVGenParse.lib;%(AdditionalDependencies)</AdditionalDependencies> @@ -138,6 +141,10 @@ </DriverSign> <ClCompile> <AdditionalIncludeDirectories>$(DDK_INC_PATH)wlan\2.0;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <WppEnabled>true</WppEnabled> + <WppRecorderEnabled>true</WppRecorderEnabled> + <WppScanConfigurationData>..\drivercode\trace.h</WppScanConfigurationData> + <WppMinimalRebuildFromTracking>false</WppMinimalRebuildFromTracking> </ClCompile> <Link> <AdditionalDependencies>$(DDK_LIB_PATH)wlan\2.0\WificxTLVGenParse.lib;%(AdditionalDependencies)</AdditionalDependencies> @@ -149,6 +156,10 @@ </DriverSign> <ClCompile> <AdditionalIncludeDirectories>$(DDK_INC_PATH)wlan\2.0;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <WppEnabled>true</WppEnabled> + <WppRecorderEnabled>true</WppRecorderEnabled> + <WppScanConfigurationData>..\drivercode\trace.h</WppScanConfigurationData> + <WppMinimalRebuildFromTracking>false</WppMinimalRebuildFromTracking> </ClCompile> <Link> <AdditionalDependencies>$(DDK_LIB_PATH)wlan\2.0\WificxTLVGenParse.lib;%(AdditionalDependencies)</AdditionalDependencies> @@ -160,6 +171,10 @@ </DriverSign> <ClCompile> <AdditionalIncludeDirectories>$(DDK_INC_PATH)wlan\2.0;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <WppEnabled>true</WppEnabled> + <WppRecorderEnabled>true</WppRecorderEnabled> + <WppScanConfigurationData>..\drivercode\trace.h</WppScanConfigurationData> + <WppMinimalRebuildFromTracking>false</WppMinimalRebuildFromTracking> </ClCompile> <Link> <AdditionalDependencies>$(DDK_LIB_PATH)wlan\2.0\WificxTLVGenParse.lib;%(AdditionalDependencies)</AdditionalDependencies> @@ -177,13 +192,19 @@ <ClCompile Include="..\drivercode\device.cpp" /> <ClCompile Include="..\drivercode\driver.cpp" /> <ClCompile Include="..\drivercode\memorymanagement.cpp" /> + <ClCompile Include="..\drivercode\wifihal.cpp" /> </ItemGroup> <ItemGroup> + <ClInclude Include="..\drivercode\adapter.h" /> + <ClInclude Include="..\drivercode\device.h" /> + <ClInclude Include="..\drivercode\driver.h" /> + <ClInclude Include="..\drivercode\sharedtypes.h" /> <ClInclude Include="..\drivercode\umkmfusion.h" /> + <ClInclude Include="..\drivercode\wifihaltestdata.h" /> <ClInclude Include="..\drivercode\wifirequest.h" /> - <ClInclude Include="..\drivercode\testdata.h" /> <ClInclude Include="..\drivercode\precomp.h" /> <ClInclude Include="..\drivercode\trace.h" /> + <ClInclude Include="..\drivercode\wifihal.h" /> </ItemGroup> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <ImportGroup Label="ExtensionTargets"> diff --git a/network/wlan/WIFICX/um/wificxsampleclientum.vcxproj b/network/wlan/WIFICX/um/wificxsampleclientum.vcxproj index 5e4d00b9..70383f39 100644 --- a/network/wlan/WIFICX/um/wificxsampleclientum.vcxproj +++ b/network/wlan/WIFICX/um/wificxsampleclientum.vcxproj @@ -128,9 +128,13 @@ <FileDigestAlgorithm>sha256</FileDigestAlgorithm> </DriverSign> <ClCompile> - <AdditionalIncludeDirectories>$(WDK_UM_INC_PATH)wlan\2.0;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>$(WDK_UM_INC_PATH)wlan\2.0;$(KIT_SHARED_INC_PATH_WDK);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <PreprocessorDefinitions>WIFICX_TEMPORARY_REMOVED_FOR_USERMODE;%(PreprocessorDefinitions)</PreprocessorDefinitions> <WppEnabled>true</WppEnabled> + <WppScanConfigurationData>..\drivercode\trace.h</WppScanConfigurationData> + <WppMinimalRebuildFromTracking>false</WppMinimalRebuildFromTracking> + <PreprocessToFile>false</PreprocessToFile> + <WppRecorderEnabled>true</WppRecorderEnabled> </ClCompile> <Link> <AdditionalDependencies>$(WDK_UM_LIB_PATH)wlan\2.0\WificxTLVGenParse.lib;%(AdditionalDependencies)</AdditionalDependencies> @@ -141,9 +145,13 @@ <FileDigestAlgorithm>sha256</FileDigestAlgorithm> </DriverSign> <ClCompile> - <AdditionalIncludeDirectories>$(WDK_UM_INC_PATH)wlan\2.0;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>$(WDK_UM_INC_PATH)wlan\2.0;$(KIT_SHARED_INC_PATH_WDK);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <PreprocessorDefinitions>WIFICX_TEMPORARY_REMOVED_FOR_USERMODE;%(PreprocessorDefinitions)</PreprocessorDefinitions> <WppEnabled>true</WppEnabled> + <WppScanConfigurationData>..\drivercode\trace.h</WppScanConfigurationData> + <WppMinimalRebuildFromTracking>false</WppMinimalRebuildFromTracking> + <PreprocessToFile>false</PreprocessToFile> + <WppRecorderEnabled>true</WppRecorderEnabled> </ClCompile> <Link> <AdditionalDependencies>$(WDK_UM_LIB_PATH)wlan\2.0\WificxTLVGenParse.lib;%(AdditionalDependencies)</AdditionalDependencies> @@ -154,9 +162,13 @@ <FileDigestAlgorithm>sha256</FileDigestAlgorithm> </DriverSign> <ClCompile> - <AdditionalIncludeDirectories>$(WDK_UM_INC_PATH)wlan\2.0;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>$(WDK_UM_INC_PATH)wlan\2.0;$(KIT_SHARED_INC_PATH_WDK);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <PreprocessorDefinitions>WIFICX_TEMPORARY_REMOVED_FOR_USERMODE;%(PreprocessorDefinitions)</PreprocessorDefinitions> <WppEnabled>true</WppEnabled> + <WppScanConfigurationData>..\drivercode\trace.h</WppScanConfigurationData> + <WppMinimalRebuildFromTracking>false</WppMinimalRebuildFromTracking> + <PreprocessToFile>false</PreprocessToFile> + <WppRecorderEnabled>true</WppRecorderEnabled> </ClCompile> <Link> <AdditionalDependencies>$(WDK_UM_LIB_PATH)wlan\2.0\WificxTLVGenParse.lib;%(AdditionalDependencies)</AdditionalDependencies> @@ -167,9 +179,13 @@ <FileDigestAlgorithm>sha256</FileDigestAlgorithm> </DriverSign> <ClCompile> - <AdditionalIncludeDirectories>$(WDK_UM_INC_PATH)wlan\2.0;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>$(WDK_UM_INC_PATH)wlan\2.0;$(KIT_SHARED_INC_PATH_WDK);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <PreprocessorDefinitions>WIFICX_TEMPORARY_REMOVED_FOR_USERMODE;%(PreprocessorDefinitions)</PreprocessorDefinitions> <WppEnabled>true</WppEnabled> + <WppScanConfigurationData>..\drivercode\trace.h</WppScanConfigurationData> + <WppMinimalRebuildFromTracking>false</WppMinimalRebuildFromTracking> + <PreprocessToFile>false</PreprocessToFile> + <WppRecorderEnabled>true</WppRecorderEnabled> </ClCompile> <Link> <AdditionalDependencies>$(WDK_UM_LIB_PATH)wlan\2.0\WificxTLVGenParse.lib;%(AdditionalDependencies)</AdditionalDependencies> @@ -181,10 +197,12 @@ <ItemGroup> <ClInclude Include="..\drivercode\adapter.h" /> <ClInclude Include="..\drivercode\device.h" /> + <ClInclude Include="..\drivercode\driver.h" /> <ClInclude Include="..\drivercode\precomp.h" /> - <ClInclude Include="..\drivercode\SharedTypes.h" /> - <ClInclude Include="..\drivercode\testdata.h" /> + <ClInclude Include="..\drivercode\sharedtypes.h" /> + <ClInclude Include="..\drivercode\wifihaltestdata.h" /> <ClInclude Include="..\drivercode\trace.h" /> + <ClInclude Include="..\drivercode\wifihal.h" /> <ClInclude Include="..\drivercode\wifirequest.h" /> <ClInclude Include="..\drivercode\umkmfusion.h" /> </ItemGroup> @@ -193,6 +211,7 @@ <ClCompile Include="..\drivercode\device.cpp" /> <ClCompile Include="..\drivercode\driver.cpp" /> <ClCompile Include="..\drivercode\memorymanagement.cpp" /> + <ClCompile Include="..\drivercode\wifihal.cpp" /> <ClCompile Include="..\drivercode\wifirequest.cpp" /> </ItemGroup> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> diff --git a/network/wlan/WIFICX/um/wificxsampleclientum.vcxproj.filters b/network/wlan/WIFICX/um/wificxsampleclientum.vcxproj.filters index 20ff1a35..099c33f8 100644 --- a/network/wlan/WIFICX/um/wificxsampleclientum.vcxproj.filters +++ b/network/wlan/WIFICX/um/wificxsampleclientum.vcxproj.filters @@ -24,42 +24,54 @@ </Inf> </ItemGroup> <ItemGroup> - <ClInclude Include="..\common\adapter.h"> + <ClInclude Include="..\drivercode\adapter.h"> <Filter>Header Files</Filter> </ClInclude> - <ClInclude Include="..\common\device.h"> + <ClInclude Include="..\drivercode\device.h"> <Filter>Header Files</Filter> </ClInclude> - <ClInclude Include="..\common\precomp.h"> + <ClInclude Include="..\drivercode\driver.h"> <Filter>Header Files</Filter> </ClInclude> - <ClInclude Include="..\common\testdata.h"> + <ClInclude Include="..\drivercode\precomp.h"> <Filter>Header Files</Filter> </ClInclude> - <ClInclude Include="..\common\trace.h"> + <ClInclude Include="..\drivercode\sharedtypes.h"> <Filter>Header Files</Filter> </ClInclude> - <ClInclude Include="..\common\wifirequest.h"> + <ClInclude Include="..\drivercode\wifihaltestdata.h"> <Filter>Header Files</Filter> </ClInclude> - <ClInclude Include="UMKMFusion .h"> + <ClInclude Include="..\drivercode\trace.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="..\drivercode\wifirequest.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="..\drivercode\umkmfusion.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="..\drivercode\wifihal.h"> <Filter>Header Files</Filter> </ClInclude> </ItemGroup> <ItemGroup> - <ClCompile Include="..\common\adapter.cpp"> + <ClCompile Include="..\drivercode\adapter.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="..\drivercode\device.cpp"> <Filter>Source Files</Filter> </ClCompile> - <ClCompile Include="..\common\device.cpp"> + <ClCompile Include="..\drivercode\driver.cpp"> <Filter>Source Files</Filter> </ClCompile> - <ClCompile Include="..\common\driver.cpp"> + <ClCompile Include="..\drivercode\memorymanagement.cpp"> <Filter>Source Files</Filter> </ClCompile> - <ClCompile Include="..\common\memorymanagement.cpp"> + <ClCompile Include="..\drivercode\wifirequest.cpp"> <Filter>Source Files</Filter> </ClCompile> - <ClCompile Include="..\common\wifirequest.cpp"> + <ClCompile Include="..\drivercode\wifihal.cpp"> <Filter>Source Files</Filter> </ClCompile> </ItemGroup> |
