summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYang You (UU) <[email protected]>2025-11-11 16:07:58 -0800
committerYang You (UU) <[email protected]>2025-11-11 16:07:58 -0800
commitfe139d460e690a27cc98bb9c077eeb5964fc7877 (patch)
treef358ad588aa316ef00e0a4ce57f6c73a301f1248
parentbddbce760509546060b3ccc28a9891b2412d2824 (diff)
have the HAL layer created for correctly demo the Interface of WIfireuqest, meanwhile have the WPPTrace enabled for both um and km
-rw-r--r--network/wlan/WIFICX/drivercode/SharedTypes.h68
-rw-r--r--network/wlan/WIFICX/drivercode/adapter.h11
-rw-r--r--network/wlan/WIFICX/drivercode/device.cpp16
-rw-r--r--network/wlan/WIFICX/drivercode/device.h23
-rw-r--r--network/wlan/WIFICX/drivercode/driver.cpp184
-rw-r--r--network/wlan/WIFICX/drivercode/driver.h6
-rw-r--r--network/wlan/WIFICX/drivercode/memorymanagement.cpp51
-rw-r--r--network/wlan/WIFICX/drivercode/precomp.h10
-rw-r--r--network/wlan/WIFICX/drivercode/trace.h84
-rw-r--r--network/wlan/WIFICX/drivercode/umkmfusion.h7
-rw-r--r--network/wlan/WIFICX/drivercode/wifihal.cpp907
-rw-r--r--network/wlan/WIFICX/drivercode/wifihal.h31
-rw-r--r--network/wlan/WIFICX/drivercode/wifihaltestdata.h (renamed from network/wlan/WIFICX/drivercode/testdata.h)925
-rw-r--r--network/wlan/WIFICX/drivercode/wifirequest.cpp1405
-rw-r--r--network/wlan/WIFICX/drivercode/wifirequest.h18
-rw-r--r--network/wlan/WIFICX/km/wificxsampleclientkm.vcxproj23
-rw-r--r--network/wlan/WIFICX/um/wificxsampleclientum.vcxproj31
-rw-r--r--network/wlan/WIFICX/um/wificxsampleclientum.vcxproj.filters36
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>