diff --git a/.github/crashdetect/CrashDetectCreateUsb.cmd b/.github/crashdetect/CrashDetectCreateUsb.cmd new file mode 100644 index 000000000..571f03936 --- /dev/null +++ b/.github/crashdetect/CrashDetectCreateUsb.cmd @@ -0,0 +1,189 @@ +@echo off +setlocal + +set WINPE_DRIVE=A +set WINUSB_DRIVE=B +set EXITCODE=0 + +rem Pre-check +if not exist "C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Deployment Tools\amd64\DISM\dism.exe" ( + echo ERROR: Missing DISM tool! + goto error +) +if not exist "C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Windows Preinstallation Environment\amd64\en-us\winpe.wim" ( + echo ERROR: Missing winpe.wim image! + goto error +) +if not exist "C:\WinPE_USB\Scripts\CrashDetectOsReinstall.cmd" ( + echo ERROR: Missing script C:\WinPE_USB\Scripts\CrashDetectOsReinstall.cmd! + goto error +) +if not exist "C:\WinPE_USB\Scripts\Unattend.xml" ( + echo ERROR: Missing XML C:\WinPE_USB\Scripts\Unattend.xml! + goto error +) +if not exist "C:\WinPE_USB\Images\install.wim" ( + echo ERROR: Missing WIM C:\WinPE_USB\Images\install.wim! + goto error +) + +rem Environment setup. +echo Setting up environment for ADK tools... +cd "C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Deployment Tools>" +call DandISetEnv.bat +echo Done setting up environment. + +rem Ask for the USB disk number displayed in Diskpart. +echo Displaying detected disk drives.. +echo Creating DiskPart script... +( +echo list disk +) > C:\WinPE_USB\diskpart.txt +diskpart /s C:\WinPE_USB\diskpart.txt +del C:\WinPE_USB\diskpart.txt +echo( +echo( +echo Note that Disk 0 is often the OS drive you do NOT want to format! +echo( +echo Ensure drive letters %WINPE_DRIVE%: and %WINUSB_DRIVE%: are not currently assigned to other drives! +echo It's ok if it's assigned to the target USB. +echo( +set /p USBDISK=Enter the Disk Number of the USB drive you want to make WinPE bootable: +echo( +echo Disk %USBDISK% selected. + +rem Create a USB drive with WinPE and data partitions. +echo( +echo WARNING!!!: VERIFY DISK %USBDISK% IS THE CORRECT USB DISK TO FORMAT! +choice /C YN /M "ARE YOU SURE YOU WANT TO FORMAT DISK %USBDISK%?" +echo( +if %errorlevel% equ 2 ( + echo You chose NO, exiting without modifying USB key. + exit /b 0 +) +if %errorlevel% equ 1 ( + echo You chose YES, proceeding with formatting USB key. +) + +:dism +rem Update startnet.cmd autorun script in WinPE boot image (winpe.wim). +cd /d "C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Windows Preinstallation Environment\amd64" +echo( +if not exist "C:\WinPE_USB\WinPE_amd64\mount" ( + echo Creating temp folders C:\WinPE_USB\WinPE_amd64\mount... + mkdir "C:\WinPE_USB\WinPE_amd64\mount" +) +echo Mounting WinPE image to modify... +Dism /Mount-Image /ImageFile:"en-us\winpe.wim" /index:1 /MountDir:"C:\WinPE_USB\WinPE_amd64\mount" +if errorlevel 1 ( + echo ERROR: DISM failed to mount ImageFile:"en-us\winpe.wim"! + goto error +) +echo Done mounting winpe.wim image. +echo Updating startnet.cmd autorun script in WinPE boot image... +( +echo wpeinit +echo. +echo @echo off +echo rem Find USB drive. +echo for %%%%D in (D E F G H I J K L M N O P Q R S T U V W Y Z^) do ^( +echo if exist %%%%D:Scripts\CrashDetectOsReinstall.cmd ^( +echo call %%%%D:Scripts\CrashDetectOsReinstall.cmd +echo goto EOF +echo ^) +echo ^) +) > "C:\WinPE_USB\WinPE_amd64\mount\Windows\System32\startnet.cmd" +echo Done adding CrashDetectOsReinstall.cmd to startnet.cmd. +echo Unmounting WinPE image with committed changes... +Dism /Unmount-Image /MountDir:"C:\WinPE_USB\WinPE_amd64\mount" /commit +if errorlevel 1 ( + echo ERROR: DISM failed to unmount ImageFile:"en-us\winpe.wim"! + echo USB drive have not been touched yet. + goto error +) +echo Done unmounting winpe.wim image. + +rem Delete temp "WinPE_amd64" folder, else the "copype.cmd" below will fail if the folder is already present. +rmdir /s /q "C:\WinPE_USB\WinPE_amd64" +echo Deleted temp folder "C:\WinPE_USB\WinPE_amd64". +echo( +echo Wiping out USB and creating 2 partitions... +echo Creating DiskPart script... +( +echo select disk %USBDISK% +echo clean +echo create partition primary size=2048 +echo active +echo format fs=FAT32 quick label="WinPE" +echo assign letter=%WINPE_DRIVE% +echo create partition primary +echo format fs=NTFS quick label="WinUSB" +echo assign letter=%WINUSB_DRIVE% +) > C:\WinPE_USB\diskpart.txt +echo Partitioning USB... +diskpart /s C:\WinPE_USB\diskpart.txt +if errorlevel 1 ( + echo ERROR: DiskPart failed during partitioning and formatting USB! + del C:\WinPE_USB\diskpart.txt + goto error +) +del C:\WinPE_USB\diskpart.txt +echo Done partitioning and formatting USB. +echo( +rem The "copype.cmd" script will create working directory "WinPE_amd64", it will fail if directory already exist. +echo Copying WinPE working files to "C:\WinPE_USB\WinPE_amd64"... +call copype.cmd amd64 "C:\WinPE_USB\WinPE_amd64" +if errorlevel 1 ( + echo ERROR: Script "copype.cmd" failed to copy working files! + goto error +) +echo Done copying WinPE files. +echo( +rem Install WinPE to the USB and make it bootable. +echo Creating bootable WinPE USB... +call Makewinpemedia.cmd /ufd /f "C:\WinPE_USB\WinPE_amd64" "%WINPE_DRIVE%:" /bootex +if errorlevel 1 ( + echo ERROR: Script "Makewinpemedia.cmd" failed to make WinPE USB bootable! + goto error +) +echo Done, WinPE USB drive is now bootable. +echo( +rem Copy Unattend.xml, scripts and install.wim over to USB +echo Copying Unattend.xml and scripts over to USB... +xcopy "C:\WinPE_USB\Scripts\" "%WINUSB_DRIVE%:\Scripts\" /E /I /R /Y +if errorlevel 1 ( + echo ERROR: Failed copying scripts from "C:\WinPE_USB\Scripts\" to USB! + goto error +) +echo Done copying script files. +echo( +echo Copying install.wim over to USB...this could take a while... +robocopy "C:\WinPE_USB\Images" "%WINUSB_DRIVE%:\Images" install.wim /ETA /J +if %errorlevel% geq 8 ( + echo ERROR: Failed copying install.wim from "C:\WinPE_USB\Images\" to USB! + goto error +) +echo Done copying WIM file. +echo( +goto cleanup + +:error +set EXITCODE=1 +goto cleanup + +:cleanup +rem Clean up any temp folders. +if exist "C:\WinPE_USB\WinPE_amd64" ( + rmdir /s /q "C:\WinPE_USB\WinPE_amd64" + echo Cleaned up temp folder "C:\WinPE_USB\WinPE_amd64". +) + +:done +if %EXITCODE% equ 0 ( + echo( + echo SUCCESSFULLY CREATED BOOTABLE WINPE USB DRIVE. +) else ( + echo( + echo FAILED CREATING BOOTABLE WINPE USB DRIVE! +) +endlocal & exit /b %EXITCODE% \ No newline at end of file diff --git a/.github/crashdetect/CrashDetectOsReinstall.cmd b/.github/crashdetect/CrashDetectOsReinstall.cmd new file mode 100644 index 000000000..faebb4432 --- /dev/null +++ b/.github/crashdetect/CrashDetectOsReinstall.cmd @@ -0,0 +1,258 @@ +@echo off +setlocal EnableExtensions EnableDelayedExpansion + +echo CrashDetectOsReinstall.cmd...START + +echo Searching for the USB drive volume letter... +set "USB=" + +for %%D in (D E F G H I J K L M N O P Q R S T U V W Y Z) do ( + if exist "%%D:\Scripts\CrashDetectOsReinstall.cmd" ( + set "USB=%%D" + echo Found USB at drive volume letter !USB!: + ) +) + +if not defined USB ( + echo ERROR: Did not find USB drive volume letter + goto error +) + +if not exist "!USB!:\Logs" ( + echo Creating Logs directory on USB + mkdir "!USB!:\Logs" +) +set "LOG=!USB!:\Logs\CrashDetectOsReinstall.log" +echo Created log file "%LOG%" on USB +echo [%DATE% %TIME%] CrashDetectOsReinstall.cmd...START >> "%LOG%" +echo [%DATE% %TIME%] Found USB at drive volume letter !USB!: >> "%LOG%" + +set "FLAG_RETRIES=!USB!:\Logs\Retries.flg" +set "FLAG_INSTALLOS=!USB!:\Logs\InstallOs.flg" +set "FLAG_DEPLOYOSDONE=!USB!:\Logs\DeployOsDone.flg" + + +:installos +if exist "%FLAG_INSTALLOS%" ( + if exist "%FLAG_DEPLOYOSDONE%" ( + echo OS reinstall done. + echo [%DATE% %TIME%] OS reinstall done. >> "%LOG%" + del "%FLAG_INSTALLOS%" >> "%LOG%" 2>&1 + del "%FLAG_DEPLOYOSDONE%" >> "%LOG%" 2>&1 + goto reboot + ) + echo Reinstalling OS... + echo [%DATE% %TIME%] Reinstalling OS... >> "%LOG%" + goto deployos +) + + +:detectcrash +if exist "C:\Windows\Minidump\" ( + echo OS crashed on last reboot into the OS! + echo [%date% %time%] OS crashed on last reboot into the OS! >> "%LOG%" + + set "MININAME=" + for %%F in ("C:\Windows\Minidump\*.dmp") do ( + set "MININAME=%%~nF" + echo Minidump filename: !MININAME! >> "%LOG%" + ) + + echo Backing up Minidump files... + copy /y "C:\Windows\Minidump\*.dmp" "!USB!:\Logs" >> "%LOG%" 2>&1 + if !errorlevel! neq 0 ( + echo ERROR: Failed to back up Mini dump file + echo [%date% %time%] ERROR: Failed to back up Mini dump file >> "%LOG%" + ) + rmdir /s /q "C:\Windows\Minidump" >> "%LOG%" 2>&1 + if !errorlevel! neq 0 ( + echo ERROR: Failed to delete Minidump folder + echo [%date% %time%] Failed to delete Minidump folder >> "%LOG%" + ) + + if exist "C:\Windows\MEMORY.DMP" ( + if defined MININAME ( + ren "C:\Windows\MEMORY.DMP" "MEMORY-!MININAME!.DMP" >> "%LOG%" 2>&1 + ) + if !errorlevel! neq 0 ( + echo ERROR: Failed to rename MEMORY.DMP file + echo [%date% %time%] ERROR: Failed to rename MEMORY.DMP file >> "%LOG%" + echo Backing up MEMORY.DMP file... + copy /y "C:\Windows\MEMORY.DMP" "!USB!:\Logs" >> "%LOG%" 2>&1 + ) else ( + echo Backing up MEMORY-!MININAME!.DMP file... + copy /y "C:\Windows\MEMORY-!MININAME!.DMP" "!USB!:\Logs" >> "%LOG%" 2>&1 + ) + if !errorlevel! neq 0 ( + echo ERROR: Failed to back up MEMORY.DMP file + echo [%date% %time%] ERROR: Failed to back up MEMORY.DMP file >> "%LOG%" + ) + ) + + echo Done trying to back up files to USB + echo [%date% %time%] Done trying to back up files to USB >> "%LOG%" + goto retry +) else ( + rem If OS crashed just now, it will be detected on next reboot. + rem Minidump folder used for crash detection is not created yet on automatic first crash reboot until OS is loaded. + echo No OS crash on last reboot into the OS. + echo [%date% %time%] No OS crash on last reboot into the OS. >> "%LOG%" + if exist %FLAG_RETRIES% ( + del %FLAG_RETRIES% >> "%LOG%" 2>&1 + ) + goto reboot +) + + +:retry +set "TRIES=0" +rem Retries are always one less than actual crashes because first crash is not detected. +set "MAX_RETRIES=2" + +if not exist "%FLAG_RETRIES%" ( + echo Creating "%FLAG_RETRIES%" with default retries set to 0 >> "%LOG%" + echo RETRIES=0 > "%FLAG_RETRIES%" +) + +for /f "tokens=1,2 delims==" %%A in (%FLAG_RETRIES%) do ( + if /i "%%A"=="RETRIES" ( + set "TRIES=%%B" >> "%LOG%" 2>&1 + ) +) + +set /a TRIES+=0 2>nul >> "%LOG%" 2>&1 +set /a TRIES+=1 >> "%LOG%" 2>&1 +echo RETRIES=!TRIES! > %FLAG_RETRIES% + +echo Current OS boot retries: !TRIES! +echo Current OS boot retries: !TRIES! >> "%LOG%" +if !TRIES! GEQ %MAX_RETRIES% ( + echo Max %MAX_RETRIES% retries reached, reinstalling OS... + del %FLAG_RETRIES% >> "%LOG%" 2>&1 + type nul > %FLAG_INSTALLOS% + goto installos +) else ( + echo Max %MAX_RETRIES% retries allowed, booting into OS... + goto reboot +) + + +:deployos +rem Image index is the OS edition to install from a multi-edition OS install image. +rem For "Windows 11 25H2" image, "Windows 11 Pro" is the 6th item on the list of editions available. +rem Adjust accordingly to install other OS editions. +rem For single edition OS images, set index to 1. +set "IMAGE_INDEX=6" +set "TARGET_DISK=0" +set "SYSTEM_DRIVE=S" +set "SYSTEM_LABEL=System" +set "TARGET_DRIVE=W" +set "TARGET_LABEL=TestOS" +set "INSTALL_WIM=install.wim" +set "UNATTEND_XML=Unattend.xml" + +echo Setting flag InstallOs.flg for CrashDetectOsReinstall.cmd autorun script to detect OS install. >> "%LOG%" +type nul > "%FLAG_INSTALLOS%" + +echo [1/8] Creating DiskPart script... +echo [%DATE% %TIME%] [1/8] Creating DiskPart script... >> "%LOG%" +( +echo select disk "%TARGET_DISK%" +echo clean +echo convert gpt +echo create partition efi size=100 +echo format quick fs=fat32 label="%SYSTEM_LABEL%" +echo assign letter="%SYSTEM_DRIVE%" +echo create partition msr size=16 +echo create partition primary +echo format quick fs=ntfs label="%TARGET_LABEL%" +echo assign letter="%TARGET_DRIVE%" +) > X:\diskpart.txt + +echo [2/8] Partitioning target disk... +echo [%DATE% %TIME%] [2/8] Partitioning target disk... >> "%LOG%" +diskpart /s X:\diskpart.txt >> "%LOG%" 2>&1 +if errorlevel 1 ( + echo ERROR: DiskPart failed. See %LOG% + goto error +) + +echo [3/8] Applying OS WIM image... +echo [%DATE% %TIME%] [3/8] Applying image... >> "%LOG%" +dism /Apply-Image /ImageFile:"!USB!:\Images\%INSTALL_WIM%" /Index:"%IMAGE_INDEX%" /ApplyDir:"%TARGET_DRIVE%":\ >> "%LOG%" 2>&1 +if errorlevel 1 ( + echo ERROR: DISM apply failed. See %LOG% + goto error +) + +echo [4/8] Copying "%UNATTEND_XML%"... +echo [%DATE% %TIME%] [4/8] Copying %UNATTEND_XML%... >> "%LOG%" +if not exist "%TARGET_DRIVE%:\Windows\Panther" ( + mkdir "%TARGET_DRIVE%:\Windows\Panther" >> "%LOG%" 2>&1 +) +copy /y "!USB!:\Scripts\%UNATTEND_XML%" "%TARGET_DRIVE%:\Windows\Panther\%UNATTEND_XML%" >> "%LOG%" 2>&1 +if errorlevel 1 ( + echo ERROR: Failed to copy %UNATTEND_XML%. See %LOG% + echo [%DATE% %TIME%] ERROR: Failed to copy %UNATTEND_XML%. >> %LOG% + goto error +) + +echo [5/8] Creating boot files... +echo [%DATE% %TIME%] [5/8] Creating boot files... >> "%LOG%" +bcdboot W:\Windows /s S: /f UEFI >> "%LOG%" 2>&1 +if errorlevel 1 ( + echo ERROR: BCDBOOT failed. See %LOG% + goto error +) + +echo [6/8] Setting one-time bootsequence to OS boot manager... +echo [%DATE% %TIME%] [6/8] Setting one-time bootsequence to OS boot manager... >> "%LOG%" +bcdedit /set {fwbootmgr} bootsequence {bootmgr} +echo bcdedit /set {fwbootmgr} bootsequence {bootmgr} >> "%LOG%" +if errorlevel 1 ( + echo ERROR: BCDEDIT /set {fwbootmgr} bootsequence {bootmgr} failed. See "%LOG%" + goto error +) + +echo [7/8] Deployment complete. +echo [%DATE% %TIME%] [7/8] Deployment complete. >> "%LOG%" +echo Deployment complete. >> "%LOG%" +echo Setting flag DeployOsDone.flg for script to detect OS install complete and boot into OS. +type nul > "%FLAG_DEPLOYOSDONE%" + +echo [8/8] Rebooting into OS in 10sec... +echo [%DATE% %TIME%] [8/8] Rebooting into OS in 10sec... >> "%LOG%" +rem Simulate timeout with ping (10 sec) +ping -n 11 127.0.0.1 >nul +wpeutil reboot >> "%LOG%" 2>&1 + + +:reboot +echo Rebooting into OS in 10sec... +echo [%DATE% %TIME%] Rebooting into OS... >> "%LOG%" +rem Force next boot into Windows boot manager. +bcdedit /set {fwbootmgr} bootsequence {bootmgr} >> "%LOG%" 2>&1 +if errorlevel 1 ( + echo ERROR: BCDEDIT /set {fwbootmgr} bootsequence {bootmgr} - failed. See "%LOG%" + goto error +) +rem Disable WinRE prompt to attempt system recovery, which requires user intervention. +bcdedit /set {default} recoveryenabled no >> "%LOG%" 2>&1 +if errorlevel 1 ( + echo ERROR: BCDEDIT /set {default} recoveryenabled no - failed. See "%LOG%" +) +rem Simulate timeout with ping (10 sec) +ping -n 11 127.0.0.1 >nul +wpeutil reboot >> "%LOG%" 2>&1 + + +:error +echo CrashDetectOsReinstall.cmd...ERROR! See "%LOG%" +echo [%DATE% %TIME%] CrashDetectOsReinstall.cmd...ERROR! >> "%LOG%" +exit /b 1 >> "%LOG%" 2>&1 + + +:done +echo CrashDetectOsReinstall.cmd...DONE! +echo [%DATE% %TIME%] CrashDetectOsReinstall.cmd...DONE! >> "%LOG%" +exit /b 0 >> "%LOG%" 2>&1 diff --git a/.github/crashdetect/CrashDetectSetupGuide.md b/.github/crashdetect/CrashDetectSetupGuide.md new file mode 100644 index 000000000..dc974507d --- /dev/null +++ b/.github/crashdetect/CrashDetectSetupGuide.md @@ -0,0 +1,256 @@ +# Crash Detect USB Setup Guide:
Automating Crash Detection and OS Reinstall of Target Test Systems + +--- + +## A) Overview +This guide walks through setting up a new bootable WinPE USB drive using: + +- A **Host Controller** (to build the USB) +- A **bootable WinPE USB** (automatic crash detection and OS reinstall) +- A **target test system** + +### High-level flow +1. Download Windows image (ISO) +2. Install Windows ADK + WinPE add-on +3. Create bootable WinPE USB +4. Copy image + scripts to USB +5. Boot up target system +6. OPTIONAL: Install OS on new Target System +7. OPTIONAL: Add a Custom Script to Windows Setup + +--- + +## B) Requirements + +### Host Controller +- Windows 11 25H2 +- Administrator privileges +- USB drive (>= 64GB recommended) +- Internet connection + +### Target System +- Windows 11 25H2 +- BIOS boot priority set to **USB boot** and **Secure Boot disabled** +- Windows System failure recovery set to **"Automatically restart"** +- Willing to wipe disk (automatic OS reinstall from crash) + +--- + +## C) Download Required Software and Scripts onto the Host Controller + +### Windows OS Image (ISO) +- [Download Windows 11 (official)](https://www.microsoft.com/en-us/software-download/windows11) +- Go to section "Download Windows 11 Disk Image (ISO) for x64 devices". +- Select the option "Windows 11 (multi-edition ISO for x64 devices)". +- Click "Confirm" button. +- Section "Select the product language" should appear. +- Select your language option. (Ex: "English (United States)") +- Click "Confirm" button. +- Section "Download - Windows 11 English" should appear. +- Click "64-bit Download" button. + +Mount ISO: +- In File Explorer, go to the location you downloaded the ISO file `Win11_25H2_English_x64_v2.iso` to. +- Right-click on the ISO file and select "Mount". + - If the "Open File - Security Warning" prompt pops up after a minute then click "Open". + - (The prompt may be hidden behind other Windows.) +- Create new folder and subfolder `C:\WinPE_USB\Images`. +- Go to the `%MountDriveLetter%:\sources` folder and copy the **`install.wim`** file to **`C:\WinPE_USB\Images`**. + - This is the Windows 11 OS image file that the DISM tool will need to deploy the OS. + - This file will be copied over to the USB later after bootable WinPE USB creation. +- Right-click on the %MountDriveLetter% and select "Eject" to unmount the ISO image. + +--- + +### Windows Assessment and Deployment Kit (Deployment Tools) & Windows PE Add-on +- [Download Windows ADK & WinPE Add-on](https://learn.microsoft.com/en-us/windows-hardware/get-started/adk-install) +- Go to section "Download the ADK 10.1.26100.2454 (December 2024)". +- Click on the link "Download the Windows ADK 10.1.26100.2454 (December 2024)" to download the `adksetup.exe` installer. +- Click on the link "Download the Windows PE add-on for the Windows ADK 10.1.26100.2454 (December 2024)" to download the `adkwinpesetup.exe` installer. + +Install ADK: +- Double-click on the `adksetup.exe` from the location you downloaded the file to launch the installer. +- "Specify Location" page, click "Next", to install at default location. +- "Windows Kits Privacy" page, select your privacy option, click "Next". +- "License Agreement" page, click "Accept". +- "Select the features you want to install" page, confirm "Deployment Tools" is checked, then click "Install". +- If "User Account Control" prompt appears, click "Yes" to begin installation process. +- "Installing features..." page, wait for installation process to complete. +- "Welcome to the Windows Assessment and Deployment Kit!" page, click "Close". + +Install WinPE Add-on:
**Important:** Install **ADK first**, then WinPE add-on +- Double-click on the `adkwinpesetup.exe` from the location you downloaded the file to launch the installer. +- "Specify Location" page, click "Next", to install at default location. +- "Windows Kits Privacy" page, select your privacy option, click "Next". +- "License Agreement" page, click "Accept". +- "Select the features you want to install" page, confirm "Windows Preinstallation Environment (Windows PE)" is checked, then click "Install". +- If "User Account Control" prompt appears, click "Yes" to begin installation process. +- "Installing features..." page, wait for installation process to complete. +- "Welcome to the Windows Assessment and Deployment Kit Windows Preinstallation Environment Add-ons!" page, click "Close". + +--- + +### Unattend and Script Files from GitHub +- Download files from [Windows-driver-samples/tree/main/.github/crashdetect](https://github.com/microsoft/Windows-driver-samples/tree/main/.github/crashdetect) +- Create directory **`C:\WinPE_USB\Scripts\`** and copy the following downloaded files to there. + - `CrashDetectCreateUsb.cmd` + - `CrashDetectOsReinstall.cmd` + - `Unattend.xml` + +--- + +## D) Create Bootable WinPE USB +- **TIP:** It's a good idea to make a backup copy of the original **"winpe.wim"** image file before editing it in the following steps. + - `C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Windows Preinstallation Environment\amd64\en-us\winpe.wim` + +- Plug a USB drive into the Host Controller. +- Check to make sure drive letters **A:** and **B:** are not currently used by any other drive. If used by the target USB drive, it's okay. +- Confirm the folder **`C:\WinPE_USB`** and its subfolders **`Scripts`** and **`Images`** exist. +- Confirm the **`Scripts`** subfolder contains the following files that were downloaded from previous steps. + - `CrashDetectOsReinstall.cmd` + - `Unattend.xml` +- Confirm the **`Images`** subfolder contains the Win11 OS image file. + - `install.wim` + +### OPTION 1: Use the `CrashDetectCreateUsb.cmd` script to create the USB automatically. +- Start a `Command Prompt` running as administrator. +- Run the script by typing the following line into the Command Prompt. +```cmd +C:\WinPE_USB\Scripts\CrashDetectCreateUsb.cmd +``` +- The script will display a list of detected disk drives, usually Disk 0 is the OS disk, DO NOT select that disk. +- Prompt 1: will ask you to enter the Disk number of your USB drive. +- Prompt 2: will ask you to confirm one last time before wiping out the USB drive. +- The last step will copy over the `install.wim` OS image to the USB, which could take a while. + +### OPTION 2: Follow the steps below to create the USB manually. +#### 1. Make sure your PC has the ADK and ADK Windows PE add-on installed. + - Start the `Deployment and Imaging Tools Environment` running as administrator. + +#### 2. Update the `startnet.cmd` autorun script in the WinPE boot image. + - Mount the WinPE boot image (`winpe.wim`) using DISM. + - Adds the `CrashDetectOsReinstall.cmd` script to the `startnet.cmd` script. +```cmd +( +echo wpeinit +echo. +echo @echo off +echo REM Find USB drive. +echo for %%D in (D E F G H I J K L M N O P Q R S T U V W Y Z^) do ^( +echo if exist %%D:Scripts\CrashDetectOsReinstall.cmd ^( +echo call %%D:Scripts\CrashDetectOsReinstall.cmd +echo goto EOF +echo ^) +echo ^) +) > "C:\WinPE_USB\WinPE_amd64\mount\Windows\System32\startnet.cmd" +``` + - Unmount the WinPE image using DISM. +```cmd +Dism /Unmount-Image /MountDir:"C:\WinPE_USB\WinPE_amd64\mount" /commit +``` + - Delete folder `C:\WinPE_USB\WinPE_amd64`, else the `copype.cmd` below will fail if the folder is already present. +```cmd +rmdir /s /q "C:\WinPE_USB\WinPE_amd64" +``` + +#### 3. Create and format a multiple partition USB drive. + - Attach a USB large enough for 2GB WinPE partition + WinUSB partition (Win11 WIM 8GB + Memory dump files 16GB-64GB + Scripts). + - Enter the following commands into the command prompt. +```cmd +diskpart +list disk +select disk X (where X is your USB drive) +clean +create partition primary size=2048 +active +format fs=FAT32 quick label="WinPE" +assign letter=A +create partition primary +format fs=NTFS quick label="WinUSB" +assign letter=B +exit +``` + +#### 4. Create a bootable Windows PE USB drive. + - Copying WinPE boot files to a working directory. +```cmd +copype.cmd amd64 "C:\WinPE_USB\WinPE_amd64" +``` + - Copy the WinPE files to the WinPE partition on USB. +```cmd +MakeWinPEMedia.cmd /UFD /F "C:\WinPE_USB\WinPE_amd64" "A:" /bootex +``` + +--- + +#### 5. Copy scripts and OS install image over to WinUSB partition on USB. + - Copy Script files over to USB. +```cmd +xcopy "C:\WinPE_USB\Scripts\" "B:\Scripts\" /E /I /R /Y +``` + - Copy Windows 11 OS WIM file over to USB, this could take a while... +```cmd +robocopy "C:\WinPE_USB\Images" "B:\Images" install.wim /ETA /J +``` + +--- + +## E) Boot Up Target System +- Insert USB into target PC +- Power on +- Enter boot menu (F12 / ESC / DEL depending on vendor) +- Confirm BIOS/UEFI setting has USB Drive as the first boot priority. (Varies among vendors) +- Confirm Secure Boot setting is Disabled +- Save BIOS settings to reboot target system. +- WinPE will automatically launch the "startnet.cmd" script we edited earlier in the "winpe.wim" image. +- The script will call "wpeinit", then our "CrashDetectOsReinstall.cmd" script to begin automatic OS crash detection and reimage for WDK driver testing. + +--- + +## F) OPTIONAL: Install OS on new Target System +### On the bootable USB's second partition `WinPE_USB` +- Create the folder **`Logs`**. +- Create an empty file **`InstallOs.flg`** in that folder. + - (In File Explorer, ensure file name extensions are visible, else the filename may be accidentally set to `InstallOs.flg.txt`) +- Plug USB into target system and reboot into USB. +- The USB will detect the flag and begin reinstalling the OS immediately. + - **WARNING**: There will be **NO** prompt to reconfirm OS install, be sure to plug into the correct target system. + - Do **NOT** leave this USB plugged into the Host Controller when this flag is set, to avoid accidental OS reinstall. + +--- + +## G) OPTIONAL: Add a Custom Script to Windows Setup +### Setupcomplete.cmd and ErrorHandler.cmd +- These are custom scripts that run during or after the Windows Setup process. They can be used to install applications or run other tasks by using cscript/wscript scripts. +- Follow instructions on this website: + - (https://learn.microsoft.com/en-us/windows-hardware/manufacture/desktop/add-a-custom-script-to-windows-setup) + +--- + +## Troubleshooting +### ERROR: Script "Makewinpemedia.cmd" failed to make WinPE USB bootable! +- If your Host Controller is connected to a secured IT network, the actions in this script may have been blocked. +- Check to see if **"bootsect.exe"** was blocked by Windows Security. + - Run "Windows Security" + - Select "Virus & threat protection" + - Click link "Manage ransomware protection" at the bottom + - Click link "Allow an app through Controlled folder access" + - Click button "Add an allowed app" button, then select option "Recently blocked apps" + - Scroll down and look for the "bootsect.exe" app to add to allow list +### USB won't boot +- Check BIOS boot order +- Disable Secure Boot +### Disk not visible in WinPE +- Missing storage drivers +### Windows doesn't boot +- Re-run `bcdboot` +- Verify partition layout + +--- + +## Reference Documentation +- [WinPE overview](https://learn.microsoft.com/en-us/windows-hardware/manufacture/desktop/winpe-intro) +- [Create a USB drive with WinPE and data partitions](https://learn.microsoft.com/en-us/windows-hardware/manufacture/desktop/winpe--use-a-single-usb-key-for-winpe-and-a-wim-file---wim#create-a-usb-drive-with-winpe-and-data-partitions) +- [WinPE: Create bootable media](https://learn.microsoft.com/en-us/windows-hardware/manufacture/desktop/winpe-create-usb-bootable-drive) +- [Capture and apply Windows (WIM)](https://learn.microsoft.com/en-us/windows-hardware/manufacture/desktop/capture-and-apply-windows-using-a-single-wim) +- [Answer files (unattend.xml)](https://learn.microsoft.com/en-us/windows-hardware/manufacture/desktop/update-windows-settings-and-scripts-create-your-own-answer-file-sxs) \ No newline at end of file diff --git a/.github/crashdetect/Unattend.xml b/.github/crashdetect/Unattend.xml new file mode 100644 index 000000000..a235fba0d --- /dev/null +++ b/.github/crashdetect/Unattend.xml @@ -0,0 +1,64 @@ + + + + + + en-US + en-US + en-US + en-US + + + + + Pacific Standard Time + + + + true + true + true + true + true + Work + 3 + + + + + + admin + Administrators + + @Password123 + true</PlainText> + </Password> + </LocalAccount> + </LocalAccounts> + </UserAccounts> + + <!-- Auto logon (lab only) --> + <AutoLogon> + <Username>admin</Username> + <Enabled>true</Enabled> + <Password> + <Value>@Password123</Value> + <PlainText>true</PlainText> + </Password> + <LogonCount>999</LogonCount> + </AutoLogon> + + </component> + </settings> + +</unattend> \ No newline at end of file diff --git a/.github/pdu/Pdu.ps1 b/.github/pdu/Pdu.ps1 new file mode 100644 index 000000000..b87fd4705 --- /dev/null +++ b/.github/pdu/Pdu.ps1 @@ -0,0 +1,250 @@ +# ====================================================================== +# +# Manufacturer: Eaton Tripp Lite Switched Power Distribution Unit (PDU) +# Website: https://www.eaton.com/us/en-us/skuPage.PDUMH15NET.html +# Model: PDUMH15NET +# SNMP/Web Management Accessory Card: WEBCARDLX +# +# HW Requirements: Ethernet cable or USBA-to-MicroUSB cable. +# SW Requirements: Plink.exe from PuTTY terminal client SW (if Ethernet) +# PuTTY: https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html +# +# Script: PowerShell script for turning ON/OFF and power CYCLING the PDU +# Usage: .\Pdu.ps1 [on | off | cycle] [1-16] +# +# ====================================================================== + +param( + [Parameter(Mandatory=$true, Position=0)] + [ValidateSet("cycle","on","off")] + [string]$Action, + + [Parameter(Mandatory=$true, Position=1)] + [ValidateRange(1,16)] + [int]$LoadNumber +) + +# ========================= +# Configuration +# ========================= +$ComNumber = 3 +$ComPort = "COM$ComNumber" + +$PduIP = "169.254.0.1" +$SshPort = 22 + +$Username = "localadmin" +$Password = "@Password123" + +$Plink = "C:\Program Files\PuTTY\plink.exe" + +# ========================= +# Helper Functions +# ========================= + +function Test-PduSerialConnection +{ + [bool]$Connected = $false + + try + { + $Port = New-Object System.IO.Ports.SerialPort $ComPort,115200,None,8,one + $Port.ReadTimeout = 3000 + $Port.WriteTimeout = 3000 + $Port.Open() + Start-Sleep 5 + $Port.DiscardOutBuffer() + $Port.DiscardInBuffer() + $null = $Port.ReadExisting() + + # Wake up console + $Port.WriteLine("") + Start-Sleep 2 + + $Banner = $Port.ReadExisting() + if ($Banner -match "login|localadmin|PowerAlert|Ubuntu") { + Write-Host "PDU detected on serial connection at $ComPort" + $Connected = $true + } else { + Write-Host "PDU NOT detected on serial connection at $ComPort" -ForegroundColor Yellow + } + } + catch + { + Write-Host "Unable to communicate on serial connection at $ComPort" -ForegroundColor Yellow + Write-Host $_.Exception.Message + } + finally + { + if ($Port -and $Port.IsOpen) { + $Port.DiscardOutBuffer() + $Port.DiscardInBuffer() + if ($Port.BytesToRead -gt 0) { + $null = $Port.ReadExisting() + } + $Port.Close() + } + + $Port.Dispose() + $Port = $null + } + return $Connected +} + +function Send-PduSerialCommand +{ + param([string]$Action) + + $Port = New-Object System.IO.Ports.SerialPort $ComPort,115200,None,8,one + + try + { + $Port.ReadTimeout = 3000 + $Port.WriteTimeout = 3000 + + $Port.Open() + Start-Sleep 5 + $Port.DiscardOutBuffer() + $Port.DiscardInBuffer() + $null = $Port.ReadExisting() + + Write-Host "Using SERIAL connection..." -ForegroundColor Green + $Port.WriteLine("") + Start-Sleep 2 + + Write-Host "Sending Username to PDU..." + $Port.WriteLine($Username) + Start-Sleep 2 + + Write-Host "Sending Password to PDU..." + $Port.WriteLine($Password) + Start-Sleep 5 + + # Sending [ cycle | on | off ] command to PDU. + Write-Host "Sending '$Action' command to PDU..." + $Port.WriteLine("device; load $LoadNumber; $Action force") + Start-Sleep 2 + + # "Sending Exit command to PDU..." + $Port.WriteLine("exit; exit; exit") + Start-Sleep 2 + } + catch + { + Write-Host "Unable to communicate with $ComPort" + Write-Host $_.Exception.Message + } + finally + { + if ($Port -and $Port.IsOpen) { + $Port.DiscardOutBuffer() + $Port.DiscardInBuffer() + if ($Port.BytesToRead -gt 0) { + $null = $Port.ReadExisting() + } + $Port.Close() + Write-Host "Closed serial port $ComPort" + } + if ($Port) + { + $Port.Dispose() + } + $Port = $null + } +} + +function Test-PduNetworkConnection +{ + [bool]$Connected = $false + + try + { + $Client = New-Object System.Net.Sockets.TcpClient +# $Client.Connect($PduIP,$SshPort) + + $Result = $Client.BeginConnect($PduIP,$SshPort,$null,$null) + if (-not $Result.AsyncWaitHandle.WaitOne(3000)) + { + throw "Connection timeout" + } + $Client.EndConnect($Result) + + $Stream = $Client.GetStream() + Start-Sleep 1 + + $Buffer = New-Object byte[] 1024 + $Stream.ReadTimeout = 3000 + $Bytes = $Stream.Read($Buffer,0,$Buffer.Length) + + $Banner = [System.Text.Encoding]::ASCII.GetString($Buffer,0,$Bytes) + + if ($Banner -match "login|localadmin|PowerAlert|Ubuntu") { + Write-Host "PDU detected on network connection at IP: $PduIP, Port: $SshPort" + $Connected = $true + } + else { + Write-Host "PDU NOT detected on network connection at IP: $PduIP, Port: $SshPort" -ForegroundColor Yellow + } + + $Client.Close() + } + catch + { + Write-Host "Unable to establish network connection at IP: $PduIP, Port: $SshPort" -ForegroundColor Yellow + Write-Host $_.Exception.Message + } + return $Connected +} + +function Send-PduNetworkCommand +{ + param([string]$Action) + + if (-not (Test-Path $Plink)) + { + throw "plink.exe not found: $Plink" + } + + Write-Host "Using NETWORK connection..." -ForegroundColor Green + + $Command = "device; load $LoadNumber; $Action force; exit; exit; exit" + + $Command | & $Plink ` + -ssh ` + -batch ` + -pw $Password ` + "$Username@$PduIP" ` +} + +# ========================= +# Main Logic +# ========================= + +Write-Host "" +Write-Host "Requested Action : $Action" +Write-Host "" + +# First choice = Serial +if (Test-PduSerialConnection) +{ + Send-PduSerialCommand $Action + exit 0 +} + +Write-Host "Serial connection not available." +Write-Host "Trying network connection..." + +# Second choice = Network +if (Test-PduNetworkConnection) +{ + Send-PduNetworkCommand $Action + exit 0 +} + +Write-Host "" +Write-Host "ERROR: No PDU connection available." -ForegroundColor Red +Write-Host " Serial : $ComPort" +Write-Host " Ethernet : $PduIP" +Write-Host "" + +exit 1 \ No newline at end of file diff --git a/.github/pdu/PduReadme.md b/.github/pdu/PduReadme.md new file mode 100644 index 000000000..524bddd2d --- /dev/null +++ b/.github/pdu/PduReadme.md @@ -0,0 +1,65 @@ +# PDU Setup: <br>Eaton Tripp Lite Switched Power Distribution Unit (PDUMH15NET) + +## Requirements: +### HW: + - USBA-to-MicroUSB cable, needed for 1st time PDU login and password change, if IP address is unknown. + - Ethernet cable, can be used if the IP address is known. +### SW: + - [Tera Term 5.6.1 terminal client:](https://github.com/TeraTermProject/teraterm/releases/tag/v5.6.1) + - Terminal client for PDU login and configuration via serial. + - [PuTTY 0.84 terminal client:](https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html) + - `Plink.exe` needed for PowerShell scripting via network. + - **Note**: PuTTY terminal client GUI does not appear to work, so Tera Term client was used instead, but `Plink.exe` is needed for passing passwords via SSH in PowerShell scripts. + +## Serial Connection +### What's my IP address? +- If the PDU is connected to a network with **DHCP**, then we need to find it's IP address first by using serial connection. + - If the PDU is not connected to a network with DHCP, then its default static IP address should be `169.254.0.1`. + - If that's the case, then you can login to the PDU via a browser by skipping the the section Network Connection. + +Tera Term: +- Connect the PC to the PDU (CONFIG port) with a USBA-to-MiniUSB cable. +- On the PC, go to Device Manager and verify under `Ports (COM & LPT)`, the `USB Serial Device (COM3)` device is present. +- Download and install Tera Term on PC, if not already present. + - You may use other Terminal Emulation Programs, but this is the one used in the manufacturer's user manual to connect to the WEBCARDLX network interface card. +- Launch Tera Term and select the "Serial" connection type and ensure `Port: "COM3: USB Serial Device (COM3)` is selected, then click "OK". +- When the blinking cursor in the empty prompt stops blinking, hit Enter key to wake up console. +- The `Ubuntu 18.04.6 LTS poweralert-0006674a215f` (<-- MAC Address) should show up in the prompt asking for login. + - Default login is: `localadmin` + - Default 1st time password is: `localadmin` + - Must change password after 1st logon. + - Change password to `@Password123` to match what the `pdu.ps1` PowerShell script uses. +- Once logged in, type `show network` to display network information such as current IP address. + - If on DHCP network, note the IP address assigned to the PDU. + - PDU default if no DHCP: + - IPv4: `169.254.0.1` + - Subnet Mask: `255.255.0.0` +- Test pinging the IPv4 address of the PDU from the PC. + - `ping <IP Address>` +- Now that you have the IP address, it may be easier to switch over to the browser interface to configure the rest of the PDU. + +## Network Connection +- Connect an Ethernet cable from the PC to the PDU Ethernet port. +- Since we have the IP of the PDU, it's easier to configure the PDU via a browser interface. +- Open an Internet browser and enter the IPv4 address of the PDU into the browser. + - If it prompts you about any security warnings, just find a way to accept and continue anyway. +- The `Power Alert LX` web interface should prompt for username and password. +- If 1st time login... + - Default login is: `localadmin` + - Default 1st time password is: `localadmin` + - Must change password after 1st logon. + - Change password to `@Password123` to match what the `pdu.ps1` PowerShell script uses. +- Select `Load` tab on the left of screen to see all the loads on the 16 power ports. +- Click on the `State` slider to show the Load options, `Turn Off Load` and `Cycle Load`. +- To enable SSH for PowerShell scripting later, select `Network` tab, then `Services`, then enable `SSH Enabled`. + +## Scripting +- The `Pdu.ps1` PowerShell script can be used for automating power ON/OFF/CYCLE of the PDU ports. +- Usage: `.\Pdu.ps1 [on | off | cycle] [1-16]` +- Update the following variables in the `Pdu.ps1` script if necessary. + - `$PduIP = "169.254.0.1"` + - `$Password = "@Password123"` +- The script will check first if there's a serial connection first, then network connection if serial is not present, before issuing the PDU command. + +## References +- Eaton Tripp Lite Switched PDU (PDUMH15NET): [Manuals & User Guides](https://www.eaton.com/us/en-us/skuPage.PDUMH15NET.html#tab-2) \ No newline at end of file diff --git a/.github/scripts/Build-ChangedSamples.ps1 b/.github/scripts/Build-ChangedSamples.ps1 index 3e91eb883..f03f93f3b 100644 --- a/.github/scripts/Build-ChangedSamples.ps1 +++ b/.github/scripts/Build-ChangedSamples.ps1 @@ -22,7 +22,7 @@ foreach ($file in $ChangedFiles) { $filename = Split-Path $file -Leaf # Files that can affect how every sample is built should trigger a full build - if ($filename -eq "Build-Samples.ps1" -or $filename -eq "exclusions.csv" -or $filename -eq "Directory.Build.props" -or $filename -eq "packages.config") { + if ($filename -eq "Build-Samples.ps1" -or $filename -eq "Get-NtTargetVersions.ps1" -or $filename -eq "exclusions.csv" -or $filename -eq "Directory.Build.props" -or $filename -eq "packages.config") { $buildAll = $true } if ($dir -like "$root\.github\scripts" -or $dir -like "$root\.github\scripts\*") { diff --git a/.github/scripts/Join-CsvReports.ps1 b/.github/scripts/Join-CsvReports.ps1 index 32cd9d63e..43e0c826b 100644 --- a/.github/scripts/Join-CsvReports.ps1 +++ b/.github/scripts/Join-CsvReports.ps1 @@ -1,35 +1,201 @@ -$logsPath = Join-Path (Get-Location).Path "_logs" +<# +.SYNOPSIS + Joins the per-job Build-Samples CSV reports (one per _NT_TARGET_VERSION x configuration x + platform) into a single overview, and writes an easy-to-scan summary to the GitHub Actions + run page ($GITHUB_STEP_SUMMARY). + +.DESCRIPTION + Each build job uploads a "_logs" folder containing a report named + _overview.<ntTag>.<configuration>.<platform>.csv + with columns: Sample, <Configuration|Platform> (one combination per file). This script: + * parses the _NT_TARGET_VERSION tag and combination from every report, + * collapses each sample's combinations into one status per version, + * writes _overview.all.csv / _overview.all.htm (a colour-coded sample x version matrix), and + * appends a Markdown summary (per-version totals + a failures table) to $GITHUB_STEP_SUMMARY + so failures are obvious from the run page without opening any logs. + + The older 2-part name (_overview.<configuration>.<platform>.csv, no version) is still + understood and bucketed under the "latest" column. +#> + +$logsPath = Join-Path (Get-Location).Path "_logs" $reportFileName = '_overview.all' -$idProperty = 'Sample' -$results = $null -Get-ChildItem -Path $logsPath -Filter '*.csv' | ForEach-Object { - $csv = Import-Csv -Path $_ - if ($results -eq $null) { - $results = $csv +if (-not (Test-Path $logsPath)) { + Write-Warning "No _logs directory found at $logsPath - nothing to report." + return +} + +# --- Load every per-job CSV --------------------------------------------------- +# data[sample][tag][combo] = status +$data = @{} +$allSamples = [System.Collections.Generic.SortedSet[string]]::new([System.StringComparer]::OrdinalIgnoreCase) +$tagSet = [System.Collections.Generic.HashSet[string]]::new() + +Get-ChildItem -Path $logsPath -Filter '_overview.*.csv' | + Where-Object { $_.Name -notlike '_overview.all.*' } | + ForEach-Object { + # _overview.<tag>.<config>.<platform> -> drop _overview; last two are config/platform. + $parts = [IO.Path]::GetFileNameWithoutExtension($_.Name).Split('.') + $parts = $parts[1..($parts.Count - 1)] # drop the leading "_overview" + if ($parts.Count -ge 3) { $tag = ($parts[0..($parts.Count - 3)] -join '.') } + else { $tag = 'latest' } + [void]$tagSet.Add($tag) + + Import-Csv -Path $_.FullName | ForEach-Object { + $sample = $_.Sample + if (-not $sample) { return } + [void]$allSamples.Add($sample) + if (-not $data.ContainsKey($sample)) { $data[$sample] = @{} } + if (-not $data[$sample].ContainsKey($tag)) { $data[$sample][$tag] = @{} } + foreach ($col in ($_.PSObject.Properties.Name | Where-Object { $_ -ne 'Sample' })) { + $data[$sample][$tag][$col] = "$($_.$col)".Trim() + } + } } - else { - $results = $csv | ForEach-Object { - $id = $_.$idProperty - $match = $results | Where-Object { $_.$idProperty -eq $id } - if ($match) { - $properties = $_ | Get-Member -MemberType NoteProperty | Where-Object { $_.Name -ne $idProperty } | Select-Object -ExpandProperty Name - $newObject = New-Object PSObject - # Add ID property separately to ensure it appears first - $newObject | Add-Member -MemberType NoteProperty -Name $idProperty -Value $_.$idProperty - foreach ($property in $properties) { - $newObject | Add-Member -MemberType NoteProperty -Name $property -Value $_.$property - } - foreach ($property in ($match | Get-Member -MemberType NoteProperty | Where-Object { $_.Name -ne $idProperty } | Select-Object -ExpandProperty Name)) { - if ($properties -notcontains $property) { - $newObject | Add-Member -MemberType NoteProperty -Name $property -Value $match.$property - } - } - $newObject + +if ($tagSet.Count -eq 0) { + Write-Warning "No per-job '_overview.*.csv' reports were found in $logsPath." + return +} + +# Order versions newest-first (numeric tags descending; non-numeric last) +$tags = $tagSet | Sort-Object @{ Expression = { if ($_ -match '^\d+$') { [int]$_ } else { 0 } }; Descending = $true }, @{ Expression = { $_ } } + +function Get-Status { + # Collapse one sample/version's combinations into a single status object. + param([hashtable]$Combos) + $c = @{ Succeeded = 0; Failed = 0; Sporadic = 0; Unsupported = 0; Excluded = 0 } + $details = @() + if ($Combos) { + foreach ($k in ($Combos.Keys | Sort-Object)) { + switch ($Combos[$k]) { + 'Succeeded' { $c.Succeeded++ } 'Failed' { $c.Failed++ } 'Sporadic' { $c.Sporadic++ } + 'Unsupported' { $c.Unsupported++ } 'Excluded' { $c.Excluded++ } + } + $details += "$k = $($Combos[$k])" + } + } + $buildable = $c.Succeeded + $c.Failed + $c.Sporadic + if (-not $Combos -or $Combos.Count -eq 0) { $label = 'n/a'; $klass = 'na' } + elseif ($buildable -eq 0) { $label = '--'; $klass = 'na' } + elseif ($c.Failed -eq 0 -and $c.Sporadic -eq 0) { $label = "PASS ($($c.Succeeded)/$buildable)"; $klass = 'pass' } + elseif ($c.Failed -eq 0) { $label = "PASS* ($($c.Succeeded + $c.Sporadic)/$buildable)"; $klass = 'flaky' } + elseif ($c.Failed -eq $buildable) { $label = "FAIL ($($c.Failed)/$buildable)"; $klass = 'fail' } + else { $label = "PARTIAL ($($c.Failed) failed / $buildable)"; $klass = 'partial' } + [pscustomobject]@{ Label = $label; Class = $klass; Tooltip = ($details -join ' | '); Counts = $c; Buildable = $buildable } +} + +# --- Build per-version totals + the matrix ------------------------------------ +$totals = @{}; foreach ($t in $tags) { $totals[$t] = [pscustomobject]@{ S = 0; F = 0; O = 0; U = 0; E = 0; pass = 0; flaky = 0; partial = 0; fail = 0; na = 0 } } +$failuresList = [System.Collections.ArrayList]::new() +$csvRows = @() +$bodyRows = New-Object System.Text.StringBuilder + +foreach ($sample in $allSamples) { + $csvRow = [ordered]@{ Sample = $sample } + $cells = '' + foreach ($t in $tags) { + $combos = $null + if ($data[$sample].ContainsKey($t)) { $combos = $data[$sample][$t] } + $st = Get-Status -Combos $combos + $tt = $totals[$t] + $tt.S += $st.Counts.Succeeded; $tt.F += $st.Counts.Failed; $tt.O += $st.Counts.Sporadic + $tt.U += $st.Counts.Unsupported; $tt.E += $st.Counts.Excluded + switch ($st.Class) { 'pass' { $tt.pass++ } 'flaky' { $tt.flaky++ } 'partial' { $tt.partial++ } 'fail' { $tt.fail++ } 'na' { $tt.na++ } } + $csvRow["$t"] = $st.Label + $tip = [System.Web.HttpUtility]::HtmlEncode($st.Tooltip) + $cells += "<td class='$($st.Class)' title='$tip'>$($st.Label)</td>" + if ($combos) { + foreach ($k in ($combos.Keys | Sort-Object)) { + if ($combos[$k] -eq 'Failed') { [void]$failuresList.Add([pscustomobject]@{ Sample = $sample; Version = $t; Combo = $k }) } } } } + $csvRows += [pscustomobject]$csvRow + $enc = [System.Web.HttpUtility]::HtmlEncode($sample) + [void]$bodyRows.Append("<tr><td class='sample'>$enc</td>$cells</tr>`n") } -$results | ConvertTo-Csv | Out-File (Join-Path $logsPath "$reportFileName.csv") -$results | ConvertTo-Html -Title "Overview" | Out-File (Join-Path $logsPath "$reportFileName.htm") +Add-Type -AssemblyName System.Web -ErrorAction SilentlyContinue + +# --- CSV ---------------------------------------------------------------------- +$csvRows | Export-Csv -Path (Join-Path $logsPath "$reportFileName.csv") -NoTypeInformation + +# --- HTML (colour-coded sample x version matrix) ------------------------------ +$generated = Get-Date -Format 'yyyy-MM-dd HH:mm:ss' +$sumHead = "<tr><th>_NT_TARGET_VERSION</th><th>Pass</th><th>Flaky</th><th>Partial</th><th>Fail</th><th>n/a</th><th>Combos OK</th><th>Sporadic</th><th>Failed</th><th>Excluded</th><th>Pass rate</th></tr>" +$sumRows = '' +foreach ($t in $tags) { + $x = $totals[$t]; $tot = $x.pass + $x.flaky + $x.partial + $x.fail + $x.na; $elig = $tot - $x.na + $rate = if ($elig -gt 0) { '{0:N0}%' -f (100.0 * ($x.pass + $x.flaky) / $elig) } else { 'n/a' } + $sumRows += "<tr><td class='sample'>$t</td><td class='pass'>$($x.pass)</td><td class='flaky'>$($x.flaky)</td><td class='partial'>$($x.partial)</td><td class='fail'>$($x.fail)</td><td class='na'>$($x.na)</td><td>$($x.S)</td><td>$($x.O)</td><td>$($x.F)</td><td>$($x.E)</td><td><b>$rate</b></td></tr>`n" +} +$matHead = "<tr><th class='sample'>Sample</th>" +foreach ($t in $tags) { $matHead += "<th>$t</th>" } +$matHead += "</tr>" + +$html = @" +<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"/> +<title>WDK Driver Samples - Build Overview</title> +<style> + body{font-family:'Segoe UI',Arial,sans-serif;margin:24px;color:#1b1b1b} + h1{font-size:22px;margin-bottom:4px}h2{font-size:17px;margin-top:28px} + .meta{color:#555;font-size:13px;margin-bottom:8px} + table{border-collapse:collapse;margin-top:8px;font-size:13px} + th,td{border:1px solid #cfcfcf;padding:5px 9px;text-align:center} + th{background:#f0f3f7;position:sticky;top:0} + td.sample,th.sample{text-align:left;font-family:Consolas,monospace;white-space:nowrap} + .sub{font-weight:normal;color:#666;font-size:11px} + .pass{background:#c8e6c9}.flaky{background:#fff59d}.partial{background:#ffcc80}.fail{background:#ef9a9a}.na{background:#eee;color:#888} + .legend span{display:inline-block;padding:3px 9px;margin-right:6px;border:1px solid #cfcfcf;border-radius:3px;font-size:12px} +</style></head><body> +<h1>WDK Driver Samples &mdash; Build Overview</h1> +<div class="meta">Generated: $generated &nbsp;|&nbsp; columns are <b>_NT_TARGET_VERSION</b> (library link version); hover a cell for the per-combination breakdown.</div> +<div class="legend"><span class="pass">PASS</span><span class="flaky">PASS* (retry)</span><span class="partial">PARTIAL</span><span class="fail">FAIL</span><span class="na">-- n/a</span></div> +<h2>Summary by _NT_TARGET_VERSION</h2> +<table>$sumHead +$sumRows</table> +<h2>Sample &times; _NT_TARGET_VERSION</h2> +<table>$matHead +$($bodyRows.ToString())</table> +</body></html> +"@ +$html | Out-File -FilePath (Join-Path $logsPath "$reportFileName.htm") -Encoding UTF8 + +# --- GitHub Actions run summary (Markdown) ------------------------------------ +if ($env:GITHUB_STEP_SUMMARY) { + $totalFailed = ($totals.Values | Measure-Object -Property fail -Sum).Sum + ($totals.Values | Measure-Object -Property partial -Sum).Sum + $icon = if ($failuresList.Count -gt 0) { ':x:' } else { ':white_check_mark:' } + + $md = [System.Text.StringBuilder]::new() + [void]$md.AppendLine("# $icon WDK Driver Samples &mdash; Build Overview") + [void]$md.AppendLine() + [void]$md.AppendLine("Columns are **_NT_TARGET_VERSION** (the WDK library version drivers link against). Each version was built for Debug/Release x x64/arm64.") + [void]$md.AppendLine() + [void]$md.AppendLine("## Summary by _NT_TARGET_VERSION") + [void]$md.AppendLine("| _NT_TARGET_VERSION | :white_check_mark: Pass | :warning: Flaky | :large_orange_diamond: Partial | :x: Fail | :heavy_minus_sign: n/a | Pass rate |") + [void]$md.AppendLine("|---|---:|---:|---:|---:|---:|---:|") + foreach ($t in $tags) { + $x = $totals[$t]; $tot = $x.pass + $x.flaky + $x.partial + $x.fail + $x.na; $elig = $tot - $x.na + $rate = if ($elig -gt 0) { '{0:N0}%' -f (100.0 * ($x.pass + $x.flaky) / $elig) } else { 'n/a' } + [void]$md.AppendLine("| ``$t`` | $($x.pass) | $($x.flaky) | $($x.partial) | $($x.fail) | $($x.na) | **$rate** |") + } + [void]$md.AppendLine() + + if ($failuresList.Count -gt 0) { + [void]$md.AppendLine("## :x: Failures ($($failuresList.Count))") + [void]$md.AppendLine("| Sample | _NT_TARGET_VERSION | Config/Platform |") + [void]$md.AppendLine("|---|---|---|") + foreach ($f in ($failuresList | Sort-Object Sample, Version, Combo)) { + [void]$md.AppendLine("| ``$($f.Sample)`` | $($f.Version) | $($f.Combo.Replace('|','/')) |") + } + [void]$md.AppendLine() + [void]$md.AppendLine("> Open the matching **build** job's summary (or the ``logs-*`` artifact) for the exact compiler error.") + } + else { + [void]$md.AppendLine(":tada: **All combinations built successfully.**") + } + + $md.ToString() | Out-File -FilePath $env:GITHUB_STEP_SUMMARY -Append -Encoding utf8 +} diff --git a/.github/workflows/ci-pr.yml b/.github/workflows/ci-pr.yml index 6719270e7..8119c94c4 100644 --- a/.github/workflows/ci-pr.yml +++ b/.github/workflows/ci-pr.yml @@ -8,13 +8,39 @@ on: - '**.md' - 'LICENSE' jobs: + # Auto-discover the available _NT_TARGET_VERSION values from the active WDK so the build + # matrix never needs a hand-maintained version list. Change -Newest to build more/fewer. + discover: + name: discover _NT_TARGET_VERSIONs + runs-on: windows-2025-vs2026 + outputs: + versions: ${{ steps.nt.outputs.versions }} + steps: + - name: Check out repository code + uses: actions/checkout@v4 + + - name: Install Nuget Packages + run: nuget restore .\packages.config -PackagesDirectory .\packages\ + + - name: Discover the newest _NT_TARGET_VERSION values + id: nt + shell: pwsh + run: | + $json = .\Get-NtTargetVersions.ps1 -Newest 4 -AsMatrixJson + "versions=$json" | Out-File -FilePath $env:GITHUB_OUTPUT -Append -Encoding utf8 + Write-Host "Discovered _NT_TARGET_VERSION matrix: $json" + build: - name: Build driver samples + name: build ${{ matrix.nt.tag }} ${{ matrix.configuration }} ${{ matrix.platform }} + needs: discover strategy: fail-fast: false matrix: configuration: [Debug, Release] platform: [x64, arm64] + # _NT_TARGET_VERSION values are auto-discovered by the 'discover' job from the active + # WDK, so there is no version list to maintain here. + nt: ${{ fromJSON(needs.discover.outputs.versions) }} runs-on: windows-2025-vs2026 steps: - name: Check out repository code @@ -38,13 +64,14 @@ jobs: env: WDS_Configuration: ${{ matrix.configuration }} WDS_Platform: ${{ matrix.platform }} - WDS_ReportFileName: _overview.${{ matrix.configuration }}.${{ matrix.platform }} + WDS_NtTargetVersion: ${{ matrix.nt.version }} + WDS_ReportFileName: _overview.${{ matrix.nt.tag }}.${{ matrix.configuration }}.${{ matrix.platform }} - name: Archive build logs and overview build reports uses: actions/upload-artifact@v4 if: always() with: - name: logs-${{ matrix.configuration }}-${{ matrix.platform }} + name: logs-${{ matrix.nt.tag }}-${{ matrix.configuration }}-${{ matrix.platform }} path: _logs report: diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ca2696d89..4b263a826 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,5 +1,7 @@ name: Build all driver samples on: + # Allows the workflow to be triggered manually from the Actions tab ("Run workflow"). + workflow_dispatch: push: branches: - main @@ -11,13 +13,39 @@ on: # Runs every Saturday at 00:00 PST (08:00 UTC) - cron: '0 8 * * 6' jobs: + # Auto-discover the available _NT_TARGET_VERSION values from the active WDK so the build + # matrix never needs a hand-maintained version list. Change -Newest to build more/fewer. + discover: + name: discover _NT_TARGET_VERSIONs + runs-on: windows-2025-vs2026 + outputs: + versions: ${{ steps.nt.outputs.versions }} + steps: + - name: Check out repository code + uses: actions/checkout@v4 + + - name: Install Nuget Packages + run: nuget restore .\packages.config -PackagesDirectory .\packages\ + + - name: Discover the newest _NT_TARGET_VERSION values + id: nt + shell: pwsh + run: | + $json = .\Get-NtTargetVersions.ps1 -Newest 4 -AsMatrixJson + "versions=$json" | Out-File -FilePath $env:GITHUB_OUTPUT -Append -Encoding utf8 + Write-Host "Discovered _NT_TARGET_VERSION matrix: $json" + build: - name: Build driver samples + name: build ${{ matrix.nt.tag }} ${{ matrix.configuration }} ${{ matrix.platform }} + needs: discover strategy: fail-fast: false matrix: configuration: [Debug, Release] platform: [x64, arm64] + # _NT_TARGET_VERSION values are auto-discovered by the 'discover' job from the active + # WDK, so there is no version list to maintain here. + nt: ${{ fromJSON(needs.discover.outputs.versions) }} runs-on: windows-2025-vs2026 steps: - name: Check out repository code @@ -33,13 +61,14 @@ jobs: env: WDS_Configuration: ${{ matrix.configuration }} WDS_Platform: ${{ matrix.platform }} - WDS_ReportFileName: _overview.${{ matrix.configuration }}.${{ matrix.platform }} + WDS_NtTargetVersion: ${{ matrix.nt.version }} + WDS_ReportFileName: _overview.${{ matrix.nt.tag }}.${{ matrix.configuration }}.${{ matrix.platform }} - name: Archive build logs and overview build reports uses: actions/upload-artifact@v4 if: always() with: - name: logs-${{ matrix.configuration }}-${{ matrix.platform }} + name: logs-${{ matrix.nt.tag }}-${{ matrix.configuration }}-${{ matrix.platform }} path: _logs report: diff --git a/Build-Samples.ps1 b/Build-Samples.ps1 index a73a2afa1..e0b1a6b35 100644 --- a/Build-Samples.ps1 +++ b/Build-Samples.ps1 @@ -27,6 +27,14 @@ .PARAMETER Platforms Build platforms (e.g. 'x64','arm64'). Defaults to $env:WDS_Platform or ('x64','arm64'). +.PARAMETER NtTargetVersion + The _NT_TARGET_VERSION value - the WDK library version the driver links against + ("OS version of libraries"). Accepts the Windows build-number form '10.0.<build>' or the + short '<build>' tag (e.g. '10.0.28000' or '28000'). The valid values are auto-discovered + from the active WDK's DriverGeneral.xml rule (see Get-NtTargetVersions.ps1), so a new WDK + version is picked up with no script change. Defaults to $env:WDS_NtTargetVersion, or the + latest discovered version when unset. + .PARAMETER LogFilesDirectory Directory for build log files. Defaults to _logs in the current directory. @@ -69,6 +77,11 @@ .\Build-Samples -RunMode WDK Forces WDK mode regardless of environment variables. + +.EXAMPLE + .\Build-Samples -NtTargetVersion 10.0.22000 + + Builds all samples linking against the 10.0.22000 library set instead of the latest. #> #Requires -Version 7.0 @@ -78,6 +91,9 @@ param( [string[]]$Samples, [string[]]$Configurations = @(if ([string]::IsNullOrEmpty($env:WDS_Configuration)) { ('Debug', 'Release') } else { $env:WDS_Configuration }), [string[]]$Platforms = @(if ([string]::IsNullOrEmpty($env:WDS_Platform)) { ('x64', 'arm64') } else { $env:WDS_Platform }), + # _NT_TARGET_VERSION = the WDK library version the driver links against. Valid values are + # auto-discovered from the WDK (Get-NtTargetVersions.ps1); empty = the latest discovered. + [string]$NtTargetVersion = $env:WDS_NtTargetVersion, [string]$LogFilesDirectory = (Join-Path (Get-Location) "_logs"), [string]$ReportFileName = $(if ([string]::IsNullOrEmpty($env:WDS_ReportFileName)) { "_overview" } else { $env:WDS_ReportFileName }), [string]$InfOptions, @@ -102,15 +118,20 @@ function Import-SampleExclusions { - Configurations: semicolon-separated config|platform patterns (or '*' for all) - Reason: human-readable explanation - Only exclusions whose [MinBuild, MaxBuild] range includes the given build number - are returned. Exclusions outside the range are silently skipped. + A row is only returned when ALL of the following match the current build: + - its [MinBuild, MaxBuild] range includes the given build number, and + - its [MinNtTargetVersion, MaxNtTargetVersion] range includes the current + _NT_TARGET_VERSION build number (e.g. 22000 parsed from '10.0.22000'). + Rows outside either range are skipped; blank range bounds mean unbounded. .NOTES - CSV format: Path,Configurations,MinBuild,MaxBuild,Reason - Example row: network\wlan\wdi,*,,27100,"failure introduced in VS17.14" + CSV format: Path,Configurations,MinBuild,MaxBuild,MinNtTargetVersion,MaxNtTargetVersion,Reason + Example row: network\wlan\wdi,*,26100,,,,"failure introduced in VS17.14" + NT-version-specific: somepath,*,,,,22621,"needs an API newer than the 10.0.22621 library" #> param( [string]$CsvPath, - [int]$BuildNumber + [int]$BuildNumber, + [string]$NtTargetVersion ) if (-not (Test-Path $CsvPath)) { @@ -118,20 +139,38 @@ function Import-SampleExclusions { return @() } + # The _NT_TARGET_VERSION param is the friendly build-number form (e.g. '10.0.22000'); + # take its last dotted component for numeric range comparisons. An empty value (or + # 'latest') means the newest libraries, so no NT-version-scoped row applies. + $ntBuild = if ([string]::IsNullOrWhiteSpace($NtTargetVersion) -or $NtTargetVersion -eq 'latest') { + [int]::MaxValue + } + else { + [int]($NtTargetVersion -replace '.*\.', '') + } + $exclusions = [System.Collections.ArrayList]::new() Import-Csv $CsvPath | ForEach-Object { $pattern = $_.Path.Trim('\').Replace('\', '.').ToLower() $configs = if ([string]::IsNullOrWhiteSpace($_.Configurations)) { '*' } else { $_.Configurations } $minBuild = if ([string]::IsNullOrWhiteSpace($_.MinBuild)) { 0 } else { [int]$_.MinBuild } $maxBuild = if ([string]::IsNullOrWhiteSpace($_.MaxBuild)) { 99999 } else { [int]$_.MaxBuild } - - if ($minBuild -le $BuildNumber -and $BuildNumber -le $maxBuild) { + # Min/MaxNtTargetVersion columns are optional; blank or missing means "all NT versions". + $minNt = if ([string]::IsNullOrWhiteSpace($_.MinNtTargetVersion)) { 0 } else { [int]$_.MinNtTargetVersion } + $maxNt = if ([string]::IsNullOrWhiteSpace($_.MaxNtTargetVersion)) { [int]::MaxValue } else { [int]$_.MaxNtTargetVersion } + + # _NT_TARGET_VERSION is constant for the whole run, so (like the build number) filter + # these rows out here at load time. + if ($ntBuild -lt $minNt -or $ntBuild -gt $maxNt) { + Write-Verbose "Exclusion skipped: '$pattern' - _NT_TARGET_VERSION $ntBuild outside [$minNt, $maxNt]" + } + elseif ($minBuild -le $BuildNumber -and $BuildNumber -le $maxBuild) { [void]$exclusions.Add([PSCustomObject]@{ Pattern = $pattern Configurations = $configs Reason = $_.Reason }) - Write-Verbose "Exclusion applied: '$pattern' configs='$configs' reason='$($_.Reason)'" + Write-Verbose "Exclusion applied: '$pattern' configs='$configs' ntRange=[$minNt,$maxNt] reason='$($_.Reason)'" } else { Write-Verbose "Exclusion skipped: '$pattern' - build $BuildNumber outside [$minBuild, $maxBuild]" @@ -172,6 +211,7 @@ function Build-SingleSample { [string]$SampleName, [string]$Configuration = 'Debug', [string]$Platform = 'x64', + [string]$NtTargetVersionCode, [string]$InfVerif_AdditionalOptions = '/samples', [string]$LogFilesDirectory = (Get-Location), [bool]$Verbose = $false @@ -249,6 +289,7 @@ function Build-SingleSample { -property:Configuration=$Configuration ` -property:Platform=$Platform ` -p:TargetVersion=Windows10 ` + -p:_NT_TARGET_VERSION=$NtTargetVersionCode ` -p:InfVerif_AdditionalOptions="$InfVerif_AdditionalOptions" ` -warnaserror ` -binaryLogger:LogFile=$binLogFilePath`;ProjectImports=None ` @@ -392,11 +433,37 @@ else { $infVerifOptions = if ($buildNumber -le 22621) { '/sw1284 /sw1285 /sw1293 /sw2083 /sw2086' } else { '/samples' } } +# ============================================================================= +# Step 5b - Resolve _NT_TARGET_VERSION +# ============================================================================= +# +# _NT_TARGET_VERSION selects the WDK library version the driver links against. The valid +# values (and their NTDDI codes) are auto-discovered from the active WDK by +# Get-NtTargetVersions.ps1, so nothing here needs updating when a new WDK version ships. +# msbuild takes the NTDDI code. +$ntVersions = & (Join-Path $PSScriptRoot 'Get-NtTargetVersions.ps1') +if (-not $ntVersions) { + Write-Error "Could not discover any _NT_TARGET_VERSION values from the active WDK." + exit 1 +} +if ([string]::IsNullOrWhiteSpace($NtTargetVersion) -or $NtTargetVersion -eq 'latest') { + $ntSelected = $ntVersions[0] # newest +} +else { + $ntSelected = $ntVersions | Where-Object { $_.Version -eq $NtTargetVersion -or $_.Tag -eq $NtTargetVersion } | Select-Object -First 1 + if (-not $ntSelected) { + Write-Error "Invalid -NtTargetVersion '$NtTargetVersion'. Valid values: $(($ntVersions.Version) -join ', ')" + exit 1 + } +} +$NtTargetVersion = $ntSelected.Version +$ntTargetVersionCode = $ntSelected.Code + # ============================================================================= # Step 6 - Load Exclusions # ============================================================================= -$exclusions = Import-SampleExclusions -CsvPath (Join-Path $root 'exclusions.csv') -BuildNumber $buildNumber +$exclusions = Import-SampleExclusions -CsvPath (Join-Path $root 'exclusions.csv') -BuildNumber $buildNumber -NtTargetVersion $NtTargetVersion # ============================================================================= # Step 7 - Print Build Plan @@ -417,6 +484,7 @@ Write-Output "" Write-Output " Samples: $($sampleSet.Count) ($skippedCount skipped)" Write-Output " Configurations: $($Configurations -join ', ')" Write-Output " Platforms: $($Platforms -join ', ')" +Write-Output " NT Target Ver: $NtTargetVersion ($ntTargetVersionCode)" Write-Output " Combinations: $combinationsTotal" Write-Output " Exclusions: $($exclusions.Count)" Write-Output "" @@ -463,6 +531,7 @@ $sampleSet.GetEnumerator() | ForEach-Object -ThrottleLimit $ThrottleLimit -Paral $configs = $using:Configurations $platforms = $using:Platforms $infOpts = $using:infVerifOptions + $ntCode = $using:ntTargetVersionCode $isVerbose = $using:verbose $state = $using:buildState $total = $using:combinationsTotal @@ -513,7 +582,8 @@ $sampleSet.GetEnumerator() | ForEach-Object -ThrottleLimit $ThrottleLimit -Paral $buildResult = Build-SingleSample ` -Directory $directory -SampleName $sampleName ` -LogFilesDirectory $logDir -Configuration $configuration ` - -Platform $platform -InfVerif_AdditionalOptions $infOpts ` + -Platform $platform -NtTargetVersionCode $ntCode ` + -InfVerif_AdditionalOptions $infOpts ` -Verbose:$isVerbose # Return codes from Build-SingleSample: @@ -631,6 +701,7 @@ Write-Output "" Write-Output " Samples: $($sampleSet.Count)" Write-Output " Configurations: $($Configurations -join ', ')" Write-Output " Platforms: $($Platforms -join ', ')" +Write-Output " NT Target Ver: $NtTargetVersion ($ntTargetVersionCode)" Write-Output " Combinations: $combinationsTotal" Write-Output "" Write-Output " Succeeded: $($buildState.Succeeded)" @@ -650,9 +721,61 @@ Write-Output "------------------------------------------------------------------ $sortedResults = $buildState.Results | Sort-Object { $_.Sample } $sortedResults | ConvertTo-Csv | Out-File $reportCsvPath -$sortedResults | ConvertTo-Html -Title "WDK Sample Build Overview" | Out-File $reportHtmlPath +$sortedResults | ConvertTo-Html -Title "WDK Sample Build Overview - _NT_TARGET_VERSION $NtTargetVersion" | Out-File $reportHtmlPath # Only open the HTML report interactively (not in CI/automation) if (-not $env:BUILD_BUILDID -and [Environment]::UserInteractive) { Invoke-Item $reportHtmlPath } + +# ============================================================================= +# Step 12 - GitHub Actions job summary (CI only; no-op when run locally) +# ============================================================================= +# When $GITHUB_STEP_SUMMARY is set, emit an easy-to-scan markdown summary for the run +# page: a status header, a counts table, and (if any) a table of failures with the first +# compiler/linker error so problems are obvious without opening the logs. +if ($env:GITHUB_STEP_SUMMARY) { + $icon = if ($buildState.Failed -gt 0) { ':x:' } elseif ($buildState.Sporadic -gt 0) { ':warning:' } else { ':white_check_mark:' } + $cfgLabel = "$($Configurations -join ',')|$($Platforms -join ',')" + + $md = [System.Text.StringBuilder]::new() + [void]$md.AppendLine("## $icon ``$cfgLabel`` &nbsp;&middot;&nbsp; _NT_TARGET_VERSION ``$NtTargetVersion``") + [void]$md.AppendLine() + [void]$md.AppendLine("Environment **$($buildEnv.Name)** &middot; WDK build **$buildNumber** &middot; **$($sampleSet.Count)** samples &middot; $($elapsed.Minutes)m $($elapsed.Seconds)s") + [void]$md.AppendLine() + [void]$md.AppendLine("| :white_check_mark: Succeeded | :x: Failed | :warning: Sporadic | :heavy_minus_sign: Excluded | :grey_question: Unsupported |") + [void]$md.AppendLine("|---:|---:|---:|---:|---:|") + [void]$md.AppendLine("| $($buildState.Succeeded) | $($buildState.Failed) | $($buildState.Sporadic) | $($buildState.Excluded) | $($buildState.Unsupported) |") + [void]$md.AppendLine() + + if ($buildState.FailSet.Count -gt 0) { + [void]$md.AppendLine("<details open><summary><b>:x: $($buildState.FailSet.Count) failed</b></summary>") + [void]$md.AppendLine() + [void]$md.AppendLine("| Sample | Config/Platform | First error |") + [void]$md.AppendLine("|---|---|---|") + foreach ($entry in ($buildState.FailSet | Sort-Object)) { + if ($entry -match '^(?<name>.*)\s+(?<config>\w+)\|(?<platform>\w+)$') { + $fName = $Matches.name; $fConfig = $Matches.config; $fPlatform = $Matches.platform + $errLog = Join-Path $LogFilesDirectory "$fName.$fConfig.$fPlatform.0.err" + $msg = '' + if (Test-Path $errLog) { + $line = Get-Content $errLog | Where-Object { $_ -match ': (error|fatal error) ' } | Select-Object -First 1 + if ($line -match ':\s*((?:fatal )?error\s.+?)\s*\[[^\[]*\]\s*$') { $msg = $Matches[1] } else { $msg = $line } + } + $msg = ("$msg" -replace '\|', '\|').Trim() + if ($msg.Length -gt 180) { $msg = $msg.Substring(0, 177) + '...' } + [void]$md.AppendLine("| ``$fName`` | $fConfig/$fPlatform | $msg |") + } + } + [void]$md.AppendLine("</details>") + [void]$md.AppendLine() + } + + if ($buildState.SporadicSet.Count -gt 0) { + $sp = ($buildState.SporadicSet | Sort-Object | ForEach-Object { "``$_``" }) -join ', ' + [void]$md.AppendLine(":warning: **Sporadic** (passed on retry): $sp") + [void]$md.AppendLine() + } + + $md.ToString() | Out-File -FilePath $env:GITHUB_STEP_SUMMARY -Append -Encoding utf8 +} diff --git a/Building-Locally.md b/Building-Locally.md index 9d683a86a..ebddbfbad 100644 --- a/Building-Locally.md +++ b/Building-Locally.md @@ -120,6 +120,52 @@ Get-Help .\Build-Samples.ps1 -Detailed # Build a specific sample for Debug|x64 only: .\Build-Samples.ps1 -Samples 'tools.sdv.samples.sampledriver' -Configurations 'Debug' -Platforms 'x64' + +# Build every sample linking against an older WDK library set (default is the latest): +.\Build-Samples.ps1 -NtTargetVersion 10.0.22000 +``` + +`-NtTargetVersion` selects the WDK **`_NT_TARGET_VERSION`** — the OS version of the libraries +the driver links against. It accepts the Windows build number (`10.0.<build>`) or the short +`<build>` tag (e.g. `10.0.22000` or `22000`); when omitted it uses the latest. The valid +values are **auto-discovered from the active WDK** — `Get-NtTargetVersions.ps1` parses the +WDK's `DriverGeneral.xml` rule — so a new WDK version is picked up automatically with no edits. +List what's available with: + +```powershell +.\Get-NtTargetVersions.ps1 +``` + +--- + +## Excluding samples from the build + +Samples that are known not to build for a given environment are listed in `exclusions.csv` +at the repo root. Each row excludes a path (with wildcards) for specific +configuration/platform combinations, an optional WDK build-number range, and an optional +`_NT_TARGET_VERSION` range: + +``` +Path,Configurations,MinBuild,MaxBuild,MinNtTargetVersion,MaxNtTargetVersion,Reason +``` + +| Column | Meaning | +| ---------------- | ---------------------------------------------------------------------------------------- | +| `Path` | Sample path (backslashes); supports `*`/`?` wildcards. | +| `Configurations` | `;`-separated `Config\|Platform` patterns, or `*` for all (e.g. `*\|ARM64`, `Debug\|x64`). | +| `MinBuild`/`MaxBuild` | Inclusive WDK build-number range; blank = unbounded. | +| `MinNtTargetVersion`/`MaxNtTargetVersion` | Inclusive `-NtTargetVersion` build-number range (e.g. `22621` matches `10.0.22621`); blank = unbounded. Use this for samples that fail only when linking against older libraries. | +| `Reason` | Human-readable explanation (keep this column last; quote it if it contains commas). | + +A row is applied only when every populated condition matches the current run (path, +configuration/platform, WDK build-number range, and NT target-version range are AND-ed +together). Leave a column blank to ignore that dimension (the default for most rows). + +For example, to exclude a sample (Debug builds only) when linking against the `10.0.22621` +library set or older, because it uses a newer API: + +``` +somepath,Debug|*,,,,22621,uses an API newer than the 10.0.22621 library ``` --- diff --git a/Get-NtTargetVersions.ps1 b/Get-NtTargetVersions.ps1 new file mode 100644 index 000000000..680882777 --- /dev/null +++ b/Get-NtTargetVersions.ps1 @@ -0,0 +1,100 @@ +<# +.SYNOPSIS + Auto-discovers the valid _NT_TARGET_VERSION values from the active WDK. + +.DESCRIPTION + The _NT_TARGET_VERSION property (the OS version of the libraries a driver links against) + is an enumeration defined by the WDK in its 'DriverGeneral.xml' rule file. This script + locates that rule file (from the restored NuGet packages, or the installed WDK) and parses + the enumeration so that nothing in the build needs a hard-coded version list: when a new + WDK adds a new _NT_TARGET_VERSION it is picked up automatically. + + Returns one object per Windows 10/11 entry, newest-first: + Version e.g. 10.0.28000 (use with -NtTargetVersion) + Tag e.g. 28000 (short, filename/CI-friendly) + Code e.g. 0xA000012 (the NTDDI value passed to msbuild) + Build e.g. 28000 (numeric, for sorting/ranges) + +.PARAMETER XmlPath + Optional explicit path to a DriverGeneral.xml. When omitted the newest available rule file + is auto-located. + +.PARAMETER Newest + Return only the newest N versions (0 = all). Useful for bounding the CI build matrix. + +.PARAMETER AsMatrixJson + Emit a compact JSON array of { version, tag } objects for a GitHub Actions matrix + (consumed via fromJSON). Implies a single-line output. + +.EXAMPLE + .\Get-NtTargetVersions.ps1 # all discovered versions (objects) + +.EXAMPLE + .\Get-NtTargetVersions.ps1 -Newest 4 -AsMatrixJson +#> +[CmdletBinding()] +param( + [string]$XmlPath, + [int]$Newest = 0, + [switch]$AsMatrixJson +) + +function Find-DriverGeneralXml { + # Prefer the restored NuGet WDK package (matches what the build actually uses), then the + # installed WDK. Within each source, pick the highest build version. + $candidates = @() + $candidates += Get-ChildItem -Path (Join-Path $PSScriptRoot 'packages') -Recurse -Filter 'DriverGeneral.xml' -ErrorAction SilentlyContinue + foreach ($kitsRoot in @("${env:ProgramFiles(x86)}\Windows Kits\10\build", "${env:ProgramFiles}\Windows Kits\10\build")) { + if ($kitsRoot -and (Test-Path $kitsRoot)) { + $candidates += Get-ChildItem -Path $kitsRoot -Recurse -Filter 'DriverGeneral.xml' -ErrorAction SilentlyContinue + } + } + # EWDK / arbitrary build environments expose the build tree via these variables. + foreach ($envRoot in @($env:WDKContentRoot, $env:WindowsSdkDir)) { + if ($envRoot -and (Test-Path $envRoot)) { + $buildDir = Join-Path $envRoot 'build' + if (Test-Path $buildDir) { + $candidates += Get-ChildItem -Path $buildDir -Recurse -Filter 'DriverGeneral.xml' -ErrorAction SilentlyContinue + } + } + } + if (-not $candidates) { return $null } + # Order by the build version embedded in the path (e.g. ...\10.0.28000.0\...), highest first. + return ($candidates | Sort-Object { + if ($_.FullName -match '10\.0\.(\d+)\.\d') { [int]$Matches[1] } else { 0 } + } -Descending | Select-Object -First 1).FullName +} + +if (-not $XmlPath) { $XmlPath = Find-DriverGeneralXml } +if (-not $XmlPath -or -not (Test-Path $XmlPath)) { + throw "Could not locate DriverGeneral.xml. Restore the WDK NuGet packages or install the WDK, or pass -XmlPath." +} + +[xml]$xml = Get-Content -Path $XmlPath -Raw +$enum = $xml.ProjectSchemaDefinitions.Rule.EnumProperty | Where-Object { $_.Name -eq '_NT_TARGET_VERSION' } +if (-not $enum) { throw "No _NT_TARGET_VERSION enumeration found in '$XmlPath'." } + +$versions = + $enum.EnumValue | + ForEach-Object { + # DisplayName is e.g. "Windows 10.0.28000"; Name is the NTDDI code e.g. "0xA000012". + if ("$($_.DisplayName)" -match 'Windows\s+(?<v>10\.0\.(?<b>\d+))\s*$') { + [pscustomobject]@{ + Version = $Matches.v + Tag = $Matches.b + Code = $_.Name + Build = [int]$Matches.b + } + } + } | + Sort-Object Build -Descending + +if ($Newest -gt 0) { $versions = $versions | Select-Object -First $Newest } + +if ($AsMatrixJson) { + # Compact, single-line JSON for a GitHub Actions matrix: [{ "version": "...", "tag": "..." }, ...] + $matrix = @($versions | ForEach-Object { [ordered]@{ version = $_.Version; tag = $_.Tag } }) + return ($matrix | ConvertTo-Json -Compress -Depth 3) +} + +return $versions diff --git a/exclusions.csv b/exclusions.csv index df12335dc..0cae0380f 100644 --- a/exclusions.csv +++ b/exclusions.csv @@ -1,12 +1,20 @@ -Path,Configurations,MinBuild,MaxBuild,Reason -audio\acx\samples\audiocodec\driver,*,,22621,Only NI: error C1083: Cannot open include file: 'acx.h': No such file or directory -general\dchu\osrfx2_dchu_extension_loose,*|x64,,22621,Only NI: Only x64: Fails to build -general\dchu\osrfx2_dchu_extension_tight,*|x64,,22621,Only NI: Only x64: Fails to build -network\trans\WFPSampler,Debug|ARM64,,22621,Only NI: Only ARM: Fails to build on EWDK 22621 with VS 17.1.5 - CallingConvention=StdCall not supported -prm,*,,22621,Only NI: Not supported on NI. -powerlimit\plclient,*,,22621,Only NI: Not supported on NI. -powerlimit\plpolicy,*,,22621,Only NI: Not supported on NI. -general\pcidrv,*,26100,,"failure introduced in VS17.14, suppressed until fix" -serial\serial,*,26100,,"failure introduced in VS17.14, suppressed until fix" -network\wlan\wdi,*,26100,,"failure introduced in VS17.14, suppressed until fix" -tools\kasan\samples\kasandemo-wdm,*|x64,26100,,"failure introduced in VS17.14, suppressed until fix" +Path,Configurations,MinBuild,MaxBuild,MinNtTargetVersion,MaxNtTargetVersion,Reason +audio\acx\samples\audiocodec\driver,*,,22621,,,Only NI: error C1083: Cannot open include file: 'acx.h': No such file or directory +general\dchu\osrfx2_dchu_extension_loose,*|x64,,22621,,,Only NI: Only x64: Fails to build +general\dchu\osrfx2_dchu_extension_tight,*|x64,,22621,,,Only NI: Only x64: Fails to build +network\trans\WFPSampler,Debug|ARM64,,22621,,,Only NI: Only ARM: Fails to build on EWDK 22621 with VS 17.1.5 - CallingConvention=StdCall not supported +prm,*,,22621,,,Only NI: Not supported on NI. +powerlimit\plclient,*,,22621,,,Only NI: Not supported on NI. +powerlimit\plpolicy,*,,22621,,,Only NI: Not supported on NI. +general\pcidrv,*,26100,,,,"failure introduced in VS17.14, suppressed until fix" +serial\serial,*,26100,,,,"failure introduced in VS17.14, suppressed until fix" +network\wlan\wdi,*,26100,,,,"failure introduced in VS17.14, suppressed until fix" +tools\kasan\samples\kasandemo-wdm,*|x64,26100,,,,"failure introduced in VS17.14, suppressed until fix" +audio\sysvad,*,,,,22000,_NT_TARGET_VERSION: KSJACK_DESCRIPTION3 undeclared; audio jack descriptor v3 was added in 22H2 (10.0.22621) +network\netadaptercx\netvadapter,*,,,,22621,_NT_TARGET_VERSION: requests an NDIS/DDI version newer than the linked library (C1189 wrong NDIS or DDI version) +network\wlan\wificx,*,,,,22621,_NT_TARGET_VERSION: requests an NDIS/DDI version newer than the linked library (C1189 wrong NDIS or DDI version) +powerlimit\plclient,*,,,,22621,_NT_TARGET_VERSION: POWER_LIMIT_ATTRIBUTES not declared in the older library (C2061) +powerlimit\plpolicy,*,,,,22621,_NT_TARGET_VERSION: POWER_LIMIT_ATTRIBUTES not declared in the older library (C2061) +storage\class\classpnp,Debug|*,,,,22621,_NT_TARGET_VERSION: STOR_ADDRESS_TYPE_NVME undeclared in the older library (C2065); Debug only +storage\miniports\storahci,Debug|*,,,,22621,_NT_TARGET_VERSION: STOR_ADDRESS_TYPE_NVME undeclared in the older library (C2065); Debug only +storage\msdsm,Debug|x64,,,,22621,_NT_TARGET_VERSION: STOR_ADDRESS_TYPE_NVME undeclared in the older library (C2065); Debug|x64 only diff --git a/network/netadaptercx/netvadapter/README.md b/network/netadaptercx/netvadapter/README.md new file mode 100644 index 000000000..894f5e403 --- /dev/null +++ b/network/netadaptercx/netvadapter/README.md @@ -0,0 +1,113 @@ +--- +page_type: sample +description: "A virtual NIC (NetAdapterCx) miniport driver built on top of netvadapterlibrary, in both KMDF and UMDF flavors." +languages: +- cpp +products: +- windows +- windows-wdk +--- + +# netvadapter — Virtual NIC Sample + +`netvadapter` is a **virtual Ethernet NIC** driver that uses **NetAdapterCx** for its data +path. It links against the shared **netvadapterlibrary** static library (the same library used +by the WIFICX sample) and ships in both **KMDF** and **UMDF** flavors. + +Two `netvadapter` instances can be paired together through the library's **Emulated Network +Link (ENL)**: packets sent on one adapter are delivered to the other and vice‑versa, so you can +run connectivity tests (ping, throughput) entirely in software with no physical hardware. + +--- + +## Layout + +| Path | Description | +| --- | --- | +| `netvadapter.sln` | Solution containing both drivers + the library project references. | +| `build.cmd` | Build wrapper (see **Building** — pins UMDF to 2.33). | +| `km\netvadapterkm.vcxproj` | KMDF driver → `netvadapter.sys` (INF: `km\netvadapter.inf`). | +| `um\netvadapterum.vcxproj` | UMDF driver → `netvadapterum.dll` (INF: `um\netvadapterum.inf`). | +| `drivercode\` | Shared driver source (see below). | + +## Building + +The UMDF driver targets **UMDF 2.33** (to match `netvadapterum.inf`'s +`UmdfLibraryVersion = 2.33.0`), while the shared `netvadapterlibrary` is checked in at **UMDF +2.35** (so the WIFICX sample is unaffected). Because the WDF version must match within a single +binary, **build through `build.cmd`**, which forces the library and driver to 2.33 for this +solution only: + +```cmd +build.cmd :: Debug x64 (defaults) +build.cmd Release x64 +``` + +> A plain `msbuild netvadapter.sln` or a Visual Studio IDE build will fail to link with an +> unresolved `WdfFunctions_02035` symbol, because it does not apply the 2.33 override. + +### Signing the package (test signing) + +The build signs the binaries but does **not** produce a catalog. To create and test‑sign the +catalogs (required to install while in test‑signing mode): + +```cmd +:: From an EWDK environment, for each package folder under x64\<Config>\: +Inf2Cat /driver:.\netvadapterkm /os:10_X64,Server10_X64 +Inf2Cat /driver:.\netvadapterum /os:10_X64,Server10_X64 + +signtool sign /fd SHA256 /sha1 <WDKTestCertThumbprint> /tr http://timestamp.digicert.com /td SHA256 .\netvadapterkm\netvadapter.cat +signtool sign /fd SHA256 /sha1 <WDKTestCertThumbprint> /tr http://timestamp.digicert.com /td SHA256 .\netvadapterum\netvadapterum.cat +``` + +--- + +## Installing + +Enable test signing once (elevated, then reboot), and install the test certificate into the +**Root** and **TrustedPublisher** stores on the target machine. Then install the driver with +`devcon`: + +```cmd +.\devcon.exe install .\netvadapterum.inf root\netvadapterum +``` + +If the command fails, inspect the device‑install log at: + +``` +C:\Windows\INF\setupapi.dev.log +``` + +### Pairing two adapters + +A working link requires **two** `netvadapter` instances. Create both by running the install +command **twice**: + +```cmd +.\devcon.exe install .\netvadapterum.inf root\netvadapterum +.\devcon.exe install .\netvadapterum.inf root\netvadapterum +``` + +Then set the **`MACLastByte`** advanced keyword to 1 and 2 on both adapters via Device Manager → adapter → **Advanced**, or the network adapter +property pages. + +> ⚠️ `MACLastByte` defaults to **0**. If an adapter is left at the default, the device fails +> to start and shows a **yellow bang** (error) in Device Manager. Assign distinct values such as +> `1` and `2` for the pair to link correctly. + +--- + +## Managing the driver + +List installed `net`‑class drivers (to find the `oemNN.inf` published name): + +```cmd +pnputil /enum-drivers /class net +``` + +Remove the driver and prepare for a clean reinstall (substitute the `oemNN.inf` from the command +above): + +```cmd +pnputil /delete-driver oem2.inf /uninstall /force +``` diff --git a/network/netadaptercx/netvadapter/build.cmd b/network/netadaptercx/netvadapter/build.cmd new file mode 100644 index 000000000..3f7c8e5da --- /dev/null +++ b/network/netadaptercx/netvadapter/build.cmd @@ -0,0 +1,25 @@ +@echo off +REM ============================================================================ +REM Build wrapper for netvadapter.sln +REM +REM The netvadapter UM driver targets UMDF 2.33 (matching netvadapterum.inf's +REM UmdfLibraryVersion = 2.33.0). It links the shared netvadapterlibrary, whose +REM checked-in project targets UMDF 2.35 (so the wificx sample is unaffected). +REM +REM WDF version must match within a single binary, so this script forces the +REM library + driver to 2.33 *for this solution's build only* via a global +REM MSBuild property. A plain "msbuild netvadapter.sln" (without these props) +REM will fail to link with an unresolved WdfFunctions_02035 symbol. +REM +REM Usage: build.cmd [Configuration] [Platform] (defaults: Debug x64) +REM Example: build.cmd Release x64 +REM ============================================================================ + +setlocal +set CONFIG=%~1 +set PLAT=%~2 +if "%CONFIG%"=="" set CONFIG=Debug +if "%PLAT%"=="" set PLAT=x64 + +msbuild "%~dp0netvadapter.sln" /t:Build /p:Configuration=%CONFIG% /p:Platform=%PLAT% /p:UMDF_VERSION_MINOR=33 /p:UMDF_MINIMUM_VERSION_REQUIRED=33 /m +endlocal diff --git a/network/netadaptercx/netvadapter/drivercode/device.cpp b/network/netadaptercx/netvadapter/drivercode/device.cpp new file mode 100644 index 000000000..6cbad3276 --- /dev/null +++ b/network/netadaptercx/netvadapter/drivercode/device.cpp @@ -0,0 +1,126 @@ +// Copyright (c) Microsoft Corporation. All rights reserved + +#include "pch.hpp" + +#include <wil/resource.h> + +#include "netvadapter.h" +#include "device.h" +#include "trace.h" +#include "device.tmh" +#include "power.h" + +static +EVT_NET_ADAPTER_CREATE_TXQUEUE + EvtAdapterCreateTxQueue; + +static +EVT_NET_ADAPTER_CREATE_RXQUEUE + EvtAdapterCreateRxQueue; + +NetvDevice::NetvDevice( + WDFDEVICE Handle +) + : m_triage(WdfGetTriageInfo()) + , m_handle(Handle) +{ +} + +_Use_decl_annotations_ +NTSTATUS +NetvDevice::Initialize( + void +) +{ + using unique_adapterinit = wil::unique_any<NETADAPTER_INIT*, + decltype(&::NetAdapterInitFree), + ::NetAdapterInitFree>; + + unique_adapterinit adapterInit{NetAdapterInitAllocate(m_handle)}; + RETURN_NTSTATUS_IF( + STATUS_INSUFFICIENT_RESOURCES, + ! adapterInit); + + NET_ADAPTER_DATAPATH_CALLBACKS datapathCallbacks; + NET_ADAPTER_DATAPATH_CALLBACKS_INIT( + &datapathCallbacks, + EvtAdapterCreateTxQueue, + EvtAdapterCreateRxQueue); + + NetAdapterInitSetDatapathCallbacks( + adapterInit.get(), + &datapathCallbacks); + + WDF_OBJECT_ATTRIBUTES adapterAttributes; + WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&adapterAttributes, NetvAdapter); + adapterAttributes.EvtDestroyCallback = [](WDFOBJECT Handle) { + NetvAdapterGetContext(static_cast<NETADAPTER>(Handle))->Destroy(); + }; + + NETADAPTER netAdapter; + RETURN_IF_NOT_STATUS_SUCCESS( + NetAdapterCreate(adapterInit.get(), &adapterAttributes, &netAdapter)); + + m_adapter = new (NetvAdapterGetContext(netAdapter)) NetvAdapter(netAdapter, m_handle); + + RETURN_IF_NOT_STATUS_SUCCESS( + m_adapter->Initialize()); + + RETURN_STATUS_SUCCESS(); +} + +NTSTATUS +NetvDevice::PrepareHardware( + WDFCMRESLIST ResourcesRaw, + WDFCMRESLIST ResourcesTranslated +) +{ + UNREFERENCED_PARAMETER(ResourcesRaw); + UNREFERENCED_PARAMETER(ResourcesTranslated); + + NetvDeviceInitializePowerManagement(this); + + RETURN_IF_NOT_STATUS_SUCCESS( + m_adapter->ConfigureDataCapabilities()); + + RETURN_IF_NOT_STATUS_SUCCESS( + NetAdapterStart(m_adapter->m_handle)); + + RETURN_STATUS_SUCCESS(); +} + +_Use_decl_annotations_ +NTSTATUS +EvtDevicePrepareHardware( + WDFDEVICE Device, + WDFCMRESLIST ResourcesRaw, + WDFCMRESLIST ResourcesTranslated + ) +{ + return NetvDeviceGetContext(Device)->PrepareHardware(ResourcesRaw, ResourcesTranslated); +} + +_Use_decl_annotations_ +NTSTATUS +EvtAdapterCreateTxQueue( + NETADAPTER Adapter, + NETTXQUEUE_INIT * Init +) +{ + return NetvAdapterGetContext(Adapter)->CreateTxQueue(Init); +} + +_Use_decl_annotations_ +NTSTATUS +EvtAdapterCreateRxQueue( + NETADAPTER Adapter, + NETRXQUEUE_INIT * Init +) +{ + return NetvAdapterGetContext(Adapter)->CreateRxQueue(Init); +} + +NetvAdapter* NetvAdapterGetContextFromWDFObject(NETADAPTER netAdapter) +{ + return NetvAdapterGetContext(netAdapter); +} diff --git a/network/netadaptercx/netvadapter/drivercode/device.h b/network/netadaptercx/netvadapter/drivercode/device.h new file mode 100644 index 000000000..3b8e5d2d3 --- /dev/null +++ b/network/netadaptercx/netvadapter/drivercode/device.h @@ -0,0 +1,50 @@ +// Copyright (c) Microsoft Corporation. All rights reserved + +#pragma once + +#include "netvadapter.h" + +class NetvDevice +{ + +public: + + // + // Do not add variable before WdfTriageInfoPtr. + // NetAdapterCx carving code requires the first field of + // WDF context to be a pointer to WDF_TRIAGE_INFO. + // + void * + m_triage = nullptr; + + NetvDevice( + WDFDEVICE Handle + ); + + NTSTATUS + Initialize( + void + ); + + NTSTATUS + PrepareHardware( + WDFCMRESLIST ResourcesRaw, + WDFCMRESLIST ResourcesTranslated + ); + +public: // private: + + WDFDEVICE + m_handle = WDF_NO_HANDLE; + + NetvAdapter * + m_adapter = nullptr; + +}; +static_assert(FIELD_OFFSET(NetvDevice, m_triage) == 0u); + +WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(NetvDevice, NetvDeviceGetContext); +WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(NetvAdapter, NetvAdapterGetContext); + +EVT_WDF_DEVICE_PREPARE_HARDWARE + EvtDevicePrepareHardware; diff --git a/network/netadaptercx/netvadapter/drivercode/driver.cpp b/network/netadaptercx/netvadapter/drivercode/driver.cpp new file mode 100644 index 000000000..393292c10 --- /dev/null +++ b/network/netadaptercx/netvadapter/drivercode/driver.cpp @@ -0,0 +1,98 @@ +// Copyright (c) Microsoft Corporation. All rights reserved + +#include "pch.hpp" + +#include <wil/resource.h> + +#include "netvadapter.h" +#include "trace.h" +#include "driver.tmh" +#include "device.h" +#include "power.h" + +GLOBAL_CONTEXT NetvGlobalContext; + +EXTERN_C +DRIVER_INITIALIZE + DriverEntry; + +EVT_WDF_DRIVER_DEVICE_ADD EvtDriverDeviceAdd; +EVT_WDF_DRIVER_UNLOAD EvtDriverUnload; + +_Use_decl_annotations_ +NTSTATUS +DriverEntry( + PDRIVER_OBJECT DriverObject, + PUNICODE_STRING RegistryPath + ) +{ + WPP_INIT_TRACING(DriverObject, RegistryPath); + + WDF_DRIVER_CONFIG config; + WDF_DRIVER_CONFIG_INIT(&config, EvtDriverDeviceAdd); + config.EvtDriverUnload = EvtDriverUnload; + + NTSTATUS status = WdfDriverCreate(DriverObject, + RegistryPath, + WDF_NO_OBJECT_ATTRIBUTES, + &config, + NULL); + + if (!NT_SUCCESS(status)) + { + LogError(FLAG_DRIVER, "%!STATUS! WdfDriverCreate", status); + WPP_CLEANUP(DriverObject); + + return status; + } + + RETURN_STATUS_SUCCESS(); +} + +_Use_decl_annotations_ +NTSTATUS +EvtDriverDeviceAdd( + WDFDRIVER Driver, + PWDFDEVICE_INIT DeviceInit + ) +{ + UNREFERENCED_PARAMETER(Driver); + + RETURN_IF_NOT_STATUS_SUCCESS( + NetDeviceInitConfig(DeviceInit)); + + WDF_PNPPOWER_EVENT_CALLBACKS pnpPowerCallbacks; + WDF_PNPPOWER_EVENT_CALLBACKS_INIT(&pnpPowerCallbacks); + pnpPowerCallbacks.EvtDevicePrepareHardware = EvtDevicePrepareHardware; + WdfDeviceInitSetPnpPowerEventCallbacks(DeviceInit, &pnpPowerCallbacks); + + WDF_POWER_POLICY_EVENT_CALLBACKS powerPolicyCallbacks; + WDF_POWER_POLICY_EVENT_CALLBACKS_INIT(&powerPolicyCallbacks); + powerPolicyCallbacks.EvtDeviceArmWakeFromS0 = EvtDeviceArmWakeFromS0; + powerPolicyCallbacks.EvtDeviceDisarmWakeFromS0 = EvtDeviceDisarmWakeFromS0; + WdfDeviceInitSetPowerPolicyEventCallbacks(DeviceInit, &powerPolicyCallbacks); + + WDF_OBJECT_ATTRIBUTES deviceAttributes; + WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&deviceAttributes, NetvDevice); + + WDFDEVICE wdfDevice; + RETURN_IF_NOT_STATUS_SUCCESS( + WdfDeviceCreate(&DeviceInit, &deviceAttributes, &wdfDevice)); + + auto device = new (NetvDeviceGetContext(wdfDevice)) NetvDevice(wdfDevice); + + RETURN_IF_NOT_STATUS_SUCCESS( + device->Initialize()); + + RETURN_STATUS_SUCCESS(); +} + +_Use_decl_annotations_ +VOID +EvtDriverUnload( + WDFDRIVER Driver +) +{ + UNREFERENCED_PARAMETER(Driver); + WPP_CLEANUP(WdfDriverWdmGetDriverObject(Driver)); +} diff --git a/network/netadaptercx/netvadapter/drivercode/memorymanagement.cpp b/network/netadaptercx/netvadapter/drivercode/memorymanagement.cpp new file mode 100644 index 000000000..29a2006aa --- /dev/null +++ b/network/netadaptercx/netvadapter/drivercode/memorymanagement.cpp @@ -0,0 +1,89 @@ +// Copyright (c) Microsoft Corporation. All rights reserved +// +// Global operator new / delete for the driver. +// +// The shared netvadapterlibrary routes its allocations through the global +// operator new (see memory.cpp in the library, which provides the nothrow +// variant that forwards to operator new(size_t)). The client driver is +// responsible for providing the backing implementation. We use WDF managed +// memory so that the same implementation works for both KMDF and UMDF, the +// same approach used by the WIFICX sample. + +#include "pch.hpp" + +#define NETV_POOL_TAG 'vteN' + +struct NETV_MEMORY_HEADER +{ + size_t HeaderSize; + WDFMEMORY WdfMemoryHandle; +}; + +static void* AllocateBuffer(size_t Size) +{ + const size_t totalSize = Size + sizeof(NETV_MEMORY_HEADER); + + WDF_OBJECT_ATTRIBUTES attributes; + WDF_OBJECT_ATTRIBUTES_INIT(&attributes); + + WDFMEMORY wdfMemory = WDF_NO_HANDLE; + void* buffer = nullptr; + + if (!NT_SUCCESS(WdfMemoryCreate(&attributes, NonPagedPoolNx, NETV_POOL_TAG, totalSize, &wdfMemory, &buffer))) + { + return nullptr; + } + + RtlZeroMemory(buffer, totalSize); + + auto header = static_cast<NETV_MEMORY_HEADER*>(buffer); + header->HeaderSize = sizeof(NETV_MEMORY_HEADER); + header->WdfMemoryHandle = wdfMemory; + + return reinterpret_cast<void*>(reinterpret_cast<ULONG_PTR>(buffer) + sizeof(NETV_MEMORY_HEADER)); +} + +static void FreeBuffer(void* Buffer) +{ + if (Buffer == nullptr) + { + return; + } + + auto header = reinterpret_cast<NETV_MEMORY_HEADER*>( + reinterpret_cast<ULONG_PTR>(Buffer) - sizeof(NETV_MEMORY_HEADER)); + + NT_ASSERT(header->HeaderSize == sizeof(NETV_MEMORY_HEADER)); + + WdfObjectDelete(header->WdfMemoryHandle); +} + +void* __cdecl operator new(size_t Size) +{ + return AllocateBuffer(Size); +} + +void* __cdecl operator new[](size_t Size) +{ + return AllocateBuffer(Size); +} + +void __cdecl operator delete(void* Buffer) noexcept +{ + FreeBuffer(Buffer); +} + +void __cdecl operator delete[](void* Buffer) noexcept +{ + FreeBuffer(Buffer); +} + +void __cdecl operator delete(void* Buffer, size_t) noexcept +{ + FreeBuffer(Buffer); +} + +void __cdecl operator delete[](void* Buffer, size_t) noexcept +{ + FreeBuffer(Buffer); +} diff --git a/network/netadaptercx/netvadapter/drivercode/pch.hpp b/network/netadaptercx/netvadapter/drivercode/pch.hpp new file mode 100644 index 000000000..b0e017eff --- /dev/null +++ b/network/netadaptercx/netvadapter/drivercode/pch.hpp @@ -0,0 +1,14 @@ +// Copyright (c) Microsoft Corporation. All rights reserved +#pragma once + +#include <initguid.h> + +#ifdef _KERNEL_MODE +#include <ntddk.h> +#else +#include <windows.h> +#include <new> +#endif + +#include <wdf.h> +#include <netadaptercx.h> diff --git a/network/netadaptercx/netvadapter/drivercode/power.cpp b/network/netadaptercx/netvadapter/drivercode/power.cpp new file mode 100644 index 000000000..68b057ff8 --- /dev/null +++ b/network/netadaptercx/netvadapter/drivercode/power.cpp @@ -0,0 +1,73 @@ +// Copyright (c) Microsoft Corporation. All rights reserved + +#include "pch.hpp" +#include "netvadapter.h" +#include "device.h" +#include "trace.h" +#include "power.h" +#include "power.tmh" + +void +NetvDeviceInitializePowerManagement( + _In_ NetvDevice * Device +) +{ +#ifdef _KERNEL_MODE + WDFDEVICE wdfDevice = Device->m_handle; + NetvAdapter * adapter = Device->m_adapter; + + if (!adapter->S0Idle) + { + return; + } + + WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS idleSettings; + WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS_INIT( + &idleSettings, + IdleCanWakeFromS0); + + idleSettings.IdleTimeout = 3000; + idleSettings.IdleTimeoutType = SystemManagedIdleTimeoutWithHint; + + NTSTATUS ntStatus = WdfDeviceAssignS0IdleSettings( + wdfDevice, + &idleSettings); + + if (ntStatus != STATUS_SUCCESS) + { + // MSDN says we should ignore error codes from assign S0 idle settings, do that + return; + } + + // Now tell NetAdapterCx we support wake on packet filter match + NET_ADAPTER_WAKE_PACKET_FILTER_CAPABILITIES wakeOnPacketFilterMatch; + NET_ADAPTER_WAKE_PACKET_FILTER_CAPABILITIES_INIT(&wakeOnPacketFilterMatch); + wakeOnPacketFilterMatch.PacketFilterMatch = TRUE; + + NetAdapterWakeSetPacketFilterCapabilities(adapter->m_handle, &wakeOnPacketFilterMatch); +#else + UNREFERENCED_PARAMETER(Device); +#endif +} + +_Use_decl_annotations_ +NTSTATUS +EvtDeviceArmWakeFromS0( + WDFDEVICE Device +) +{ + auto adapter = NetvDeviceGetContext(Device)->m_adapter; + adapter->ArmWakeFromS0(); + + return STATUS_SUCCESS; +} + +_Use_decl_annotations_ +void +EvtDeviceDisarmWakeFromS0( + WDFDEVICE Device +) +{ + auto adapter = NetvDeviceGetContext(Device)->m_adapter; + adapter->DisarmWakeFromS0(); +} diff --git a/network/netadaptercx/netvadapter/drivercode/power.h b/network/netadaptercx/netvadapter/drivercode/power.h new file mode 100644 index 000000000..6a5e2399e --- /dev/null +++ b/network/netadaptercx/netvadapter/drivercode/power.h @@ -0,0 +1,10 @@ +// Copyright (c) Microsoft Corporation. All rights reserved +#pragma once + +EVT_WDF_DEVICE_ARM_WAKE_FROM_S0 EvtDeviceArmWakeFromS0; +EVT_WDF_DEVICE_DISARM_WAKE_FROM_S0 EvtDeviceDisarmWakeFromS0; + +void +NetvDeviceInitializePowerManagement( + _In_ NetvDevice * Device +); diff --git a/network/netadaptercx/netvadapter/km/netvadapter.inf b/network/netadaptercx/netvadapter/km/netvadapter.inf new file mode 100644 index 000000000..a5565a86f Binary files /dev/null and b/network/netadaptercx/netvadapter/km/netvadapter.inf differ diff --git a/network/netadaptercx/netvadapter/km/netvadapterkm.vcxproj b/network/netadaptercx/netvadapter/km/netvadapterkm.vcxproj new file mode 100644 index 000000000..b9414ab80 --- /dev/null +++ b/network/netadaptercx/netvadapter/km/netvadapterkm.vcxproj @@ -0,0 +1,217 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|x64"> + <Configuration>Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|x64"> + <Configuration>Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Debug|ARM64"> + <Configuration>Debug</Configuration> + <Platform>ARM64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|ARM64"> + <Configuration>Release</Configuration> + <Platform>ARM64</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{B4044984-19DD-456F-9D47-565F59A47F5E}</ProjectGuid> + <TemplateGuid>{1bc93793-694f-48fe-9372-81e2b05556fd}</TemplateGuid> + <TargetFrameworkVersion>v4.5</TargetFrameworkVersion> + <MinimumVisualStudioVersion>12.0</MinimumVisualStudioVersion> + <Configuration>Debug</Configuration> + <Platform Condition="'$(Platform)' == ''">x64</Platform> + <RootNamespace>netvadapterkm</RootNamespace> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset> + <ConfigurationType>Driver</ConfigurationType> + <DriverType>KMDF</DriverType> + <DriverTargetPlatform>Windows Driver</DriverTargetPlatform> + <KMDF_VERSION_MAJOR>1</KMDF_VERSION_MAJOR> + <KMDF_VERSION_MINOR>33</KMDF_VERSION_MINOR> + <KMDF_MINIMUM_VERSION_REQUIRED>33</KMDF_MINIMUM_VERSION_REQUIRED> + <NetAdapterDriver>true</NetAdapterDriver> + <NETADAPTER_VERSION_MAJOR>2</NETADAPTER_VERSION_MAJOR> + <NETADAPTER_VERSION_MINOR>5</NETADAPTER_VERSION_MINOR> + <NETADAPTER_MINIMUM_VERSION_REQUIRED>4</NETADAPTER_MINIMUM_VERSION_REQUIRED> + <SupportsPackaging>true</SupportsPackaging> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset> + <ConfigurationType>Driver</ConfigurationType> + <DriverType>KMDF</DriverType> + <DriverTargetPlatform>Windows Driver</DriverTargetPlatform> + <KMDF_VERSION_MAJOR>1</KMDF_VERSION_MAJOR> + <KMDF_VERSION_MINOR>33</KMDF_VERSION_MINOR> + <KMDF_MINIMUM_VERSION_REQUIRED>33</KMDF_MINIMUM_VERSION_REQUIRED> + <NetAdapterDriver>true</NetAdapterDriver> + <NETADAPTER_VERSION_MAJOR>2</NETADAPTER_VERSION_MAJOR> + <NETADAPTER_VERSION_MINOR>5</NETADAPTER_VERSION_MINOR> + <NETADAPTER_MINIMUM_VERSION_REQUIRED>4</NETADAPTER_MINIMUM_VERSION_REQUIRED> + <SupportsPackaging>true</SupportsPackaging> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset> + <ConfigurationType>Driver</ConfigurationType> + <DriverType>KMDF</DriverType> + <DriverTargetPlatform>Windows Driver</DriverTargetPlatform> + <KMDF_VERSION_MAJOR>1</KMDF_VERSION_MAJOR> + <KMDF_VERSION_MINOR>33</KMDF_VERSION_MINOR> + <KMDF_MINIMUM_VERSION_REQUIRED>33</KMDF_MINIMUM_VERSION_REQUIRED> + <NetAdapterDriver>true</NetAdapterDriver> + <NETADAPTER_VERSION_MAJOR>2</NETADAPTER_VERSION_MAJOR> + <NETADAPTER_VERSION_MINOR>5</NETADAPTER_VERSION_MINOR> + <NETADAPTER_MINIMUM_VERSION_REQUIRED>4</NETADAPTER_MINIMUM_VERSION_REQUIRED> + <SupportsPackaging>true</SupportsPackaging> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset> + <ConfigurationType>Driver</ConfigurationType> + <DriverType>KMDF</DriverType> + <DriverTargetPlatform>Windows Driver</DriverTargetPlatform> + <KMDF_VERSION_MAJOR>1</KMDF_VERSION_MAJOR> + <KMDF_VERSION_MINOR>33</KMDF_VERSION_MINOR> + <KMDF_MINIMUM_VERSION_REQUIRED>33</KMDF_MINIMUM_VERSION_REQUIRED> + <NetAdapterDriver>true</NetAdapterDriver> + <NETADAPTER_VERSION_MAJOR>2</NETADAPTER_VERSION_MAJOR> + <NETADAPTER_VERSION_MINOR>5</NETADAPTER_VERSION_MINOR> + <NETADAPTER_MINIMUM_VERSION_REQUIRED>4</NETADAPTER_MINIMUM_VERSION_REQUIRED> + <SupportsPackaging>true</SupportsPackaging> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup /> + <PropertyGroup> + <SkipPackageVerification>true</SkipPackageVerification> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor> + <RunCodeAnalysis>false</RunCodeAnalysis> + <EnableInf2cat>false</EnableInf2cat> + <TargetName>netvadapter</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor> + <RunCodeAnalysis>false</RunCodeAnalysis> + <EnableInf2cat>false</EnableInf2cat> + <TargetName>netvadapter</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'"> + <DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor> + <RunCodeAnalysis>false</RunCodeAnalysis> + <EnableInf2cat>false</EnableInf2cat> + <TargetName>netvadapter</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'"> + <DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor> + <RunCodeAnalysis>false</RunCodeAnalysis> + <EnableInf2cat>false</EnableInf2cat> + <TargetName>netvadapter</TargetName> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <DriverSign> + <FileDigestAlgorithm>sha256</FileDigestAlgorithm> + </DriverSign> + <ClCompile> + <WppEnabled>true</WppEnabled> + <AdditionalIncludeDirectories>..\..\netvadapterlibrary\Interface;..\..\netvadapterlibrary\code;..\..\..\..\wil\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <WppRecorderEnabled>true</WppRecorderEnabled> + <WppScanConfigurationData>..\..\netvadapterlibrary\code\trace.h</WppScanConfigurationData> + <WppMinimalRebuildFromTracking>false</WppMinimalRebuildFromTracking> + <PreprocessorDefinitions>_HAS_EXCEPTIONS=0;%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <Inf> + <TimeStamp>1.0</TimeStamp> + </Inf> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <DriverSign> + <FileDigestAlgorithm>sha256</FileDigestAlgorithm> + </DriverSign> + <ClCompile> + <WppEnabled>true</WppEnabled> + <AdditionalIncludeDirectories>..\..\netvadapterlibrary\Interface;..\..\netvadapterlibrary\code;..\..\..\..\wil\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <WppRecorderEnabled>true</WppRecorderEnabled> + <WppScanConfigurationData>..\..\netvadapterlibrary\code\trace.h</WppScanConfigurationData> + <WppMinimalRebuildFromTracking>false</WppMinimalRebuildFromTracking> + <PreprocessorDefinitions>_HAS_EXCEPTIONS=0;%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <Inf> + <TimeStamp>1.0</TimeStamp> + </Inf> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'"> + <DriverSign> + <FileDigestAlgorithm>sha256</FileDigestAlgorithm> + </DriverSign> + <ClCompile> + <WppEnabled>true</WppEnabled> + <AdditionalIncludeDirectories>..\..\netvadapterlibrary\Interface;..\..\netvadapterlibrary\code;..\..\..\..\wil\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <WppRecorderEnabled>true</WppRecorderEnabled> + <WppScanConfigurationData>..\..\netvadapterlibrary\code\trace.h</WppScanConfigurationData> + <WppMinimalRebuildFromTracking>false</WppMinimalRebuildFromTracking> + <PreprocessorDefinitions>_HAS_EXCEPTIONS=0;%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <Inf> + <TimeStamp>1.0</TimeStamp> + </Inf> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'"> + <DriverSign> + <FileDigestAlgorithm>sha256</FileDigestAlgorithm> + </DriverSign> + <ClCompile> + <WppEnabled>true</WppEnabled> + <AdditionalIncludeDirectories>..\..\netvadapterlibrary\Interface;..\..\netvadapterlibrary\code;..\..\..\..\wil\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <WppRecorderEnabled>true</WppRecorderEnabled> + <WppScanConfigurationData>..\..\netvadapterlibrary\code\trace.h</WppScanConfigurationData> + <WppMinimalRebuildFromTracking>false</WppMinimalRebuildFromTracking> + <PreprocessorDefinitions>_HAS_EXCEPTIONS=0;%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <Inf> + <TimeStamp>1.0</TimeStamp> + </Inf> + </ItemDefinitionGroup> + <ItemGroup> + <Inf Include="netvadapter.inf" /> + </ItemGroup> + <ItemGroup> + <FilesToPackage Include="$(TargetPath)" /> + </ItemGroup> + <ItemGroup> + <ClCompile Include="..\drivercode\driver.cpp" /> + <ClCompile Include="..\drivercode\device.cpp" /> + <ClCompile Include="..\drivercode\power.cpp" /> + <ClCompile Include="..\drivercode\memorymanagement.cpp" /> + </ItemGroup> + <ItemGroup> + <ClInclude Include="..\drivercode\pch.hpp" /> + <ClInclude Include="..\drivercode\device.h" /> + <ClInclude Include="..\drivercode\power.h" /> + </ItemGroup> + <ItemGroup> + <ProjectReference Include="..\..\netvadapterlibrary\ethernet_km\netvadapterlibrarykm.vcxproj"> + <Project>{e2a65efd-25cc-4af0-b180-0cd56ee277a9}</Project> + </ProjectReference> + </ItemGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> +</Project> \ No newline at end of file diff --git a/network/netadaptercx/netvadapter/km/netvadapterkm.vcxproj.filters b/network/netadaptercx/netvadapter/km/netvadapterkm.vcxproj.filters new file mode 100644 index 000000000..3d80c128c --- /dev/null +++ b/network/netadaptercx/netvadapter/km/netvadapterkm.vcxproj.filters @@ -0,0 +1,51 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup> + <Filter Include="Source Files"> + <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier> + <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions> + </Filter> + <Filter Include="Header Files"> + <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier> + <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions> + </Filter> + <Filter Include="Resource Files"> + <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier> + <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions> + </Filter> + <Filter Include="Driver Files"> + <UniqueIdentifier>{8E41214B-6785-4CFE-B992-037D68949A14}</UniqueIdentifier> + <Extensions>inf;inv;inx;mof;mc;</Extensions> + </Filter> + </ItemGroup> + <ItemGroup> + <Inf Include="netvadapter.inf"> + <Filter>Driver Files</Filter> + </Inf> + </ItemGroup> + <ItemGroup> + <ClCompile Include="..\drivercode\driver.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="..\drivercode\device.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="..\drivercode\power.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="..\drivercode\memorymanagement.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + </ItemGroup> + <ItemGroup> + <ClInclude Include="..\drivercode\pch.hpp"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="..\drivercode\device.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="..\drivercode\power.h"> + <Filter>Header Files</Filter> + </ClInclude> + </ItemGroup> +</Project> diff --git a/network/netadaptercx/netvadapter/netvadapter.sln b/network/netadaptercx/netvadapter/netvadapter.sln new file mode 100644 index 000000000..e41c436df --- /dev/null +++ b/network/netadaptercx/netvadapter/netvadapter.sln @@ -0,0 +1,74 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 18 +VisualStudioVersion = 18.7.11911.148 stable +MinimumVisualStudioVersion = 12.0 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "netvadapterkm", "km\netvadapterkm.vcxproj", "{B4044984-19DD-456F-9D47-565F59A47F5E}" + ProjectSection(ProjectDependencies) = postProject + {E2A65EFD-25CC-4AF0-B180-0CD56EE277A9} = {E2A65EFD-25CC-4AF0-B180-0CD56EE277A9} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "netvadapterum", "um\netvadapterum.vcxproj", "{1CDC2CE3-19F3-4200-87C7-C343FB2D8ED3}" + ProjectSection(ProjectDependencies) = postProject + {612F33AD-430C-4FE7-8000-35E15A5EB757} = {612F33AD-430C-4FE7-8000-35E15A5EB757} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "netvadapterlibrarykm", "..\netvadapterlibrary\ethernet_km\netvadapterlibrarykm.vcxproj", "{E2A65EFD-25CC-4AF0-B180-0CD56EE277A9}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "netvadapterlibraryum", "..\netvadapterlibrary\ethernet_um\netvadapterlibraryum.vcxproj", "{612F33AD-430C-4FE7-8000-35E15A5EB757}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|ARM64 = Debug|ARM64 + Debug|x64 = Debug|x64 + Release|ARM64 = Release|ARM64 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {B4044984-19DD-456F-9D47-565F59A47F5E}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {B4044984-19DD-456F-9D47-565F59A47F5E}.Debug|ARM64.Build.0 = Debug|ARM64 + {B4044984-19DD-456F-9D47-565F59A47F5E}.Debug|ARM64.Deploy.0 = Debug|ARM64 + {B4044984-19DD-456F-9D47-565F59A47F5E}.Debug|x64.ActiveCfg = Debug|x64 + {B4044984-19DD-456F-9D47-565F59A47F5E}.Debug|x64.Build.0 = Debug|x64 + {B4044984-19DD-456F-9D47-565F59A47F5E}.Debug|x64.Deploy.0 = Debug|x64 + {B4044984-19DD-456F-9D47-565F59A47F5E}.Release|ARM64.ActiveCfg = Release|ARM64 + {B4044984-19DD-456F-9D47-565F59A47F5E}.Release|ARM64.Build.0 = Release|ARM64 + {B4044984-19DD-456F-9D47-565F59A47F5E}.Release|ARM64.Deploy.0 = Release|ARM64 + {B4044984-19DD-456F-9D47-565F59A47F5E}.Release|x64.ActiveCfg = Release|x64 + {B4044984-19DD-456F-9D47-565F59A47F5E}.Release|x64.Build.0 = Release|x64 + {B4044984-19DD-456F-9D47-565F59A47F5E}.Release|x64.Deploy.0 = Release|x64 + {1CDC2CE3-19F3-4200-87C7-C343FB2D8ED3}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {1CDC2CE3-19F3-4200-87C7-C343FB2D8ED3}.Debug|ARM64.Build.0 = Debug|ARM64 + {1CDC2CE3-19F3-4200-87C7-C343FB2D8ED3}.Debug|ARM64.Deploy.0 = Debug|ARM64 + {1CDC2CE3-19F3-4200-87C7-C343FB2D8ED3}.Debug|x64.ActiveCfg = Debug|x64 + {1CDC2CE3-19F3-4200-87C7-C343FB2D8ED3}.Debug|x64.Build.0 = Debug|x64 + {1CDC2CE3-19F3-4200-87C7-C343FB2D8ED3}.Debug|x64.Deploy.0 = Debug|x64 + {1CDC2CE3-19F3-4200-87C7-C343FB2D8ED3}.Release|ARM64.ActiveCfg = Release|ARM64 + {1CDC2CE3-19F3-4200-87C7-C343FB2D8ED3}.Release|ARM64.Build.0 = Release|ARM64 + {1CDC2CE3-19F3-4200-87C7-C343FB2D8ED3}.Release|ARM64.Deploy.0 = Release|ARM64 + {1CDC2CE3-19F3-4200-87C7-C343FB2D8ED3}.Release|x64.ActiveCfg = Release|x64 + {1CDC2CE3-19F3-4200-87C7-C343FB2D8ED3}.Release|x64.Build.0 = Release|x64 + {1CDC2CE3-19F3-4200-87C7-C343FB2D8ED3}.Release|x64.Deploy.0 = Release|x64 + {E2A65EFD-25CC-4AF0-B180-0CD56EE277A9}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {E2A65EFD-25CC-4AF0-B180-0CD56EE277A9}.Debug|ARM64.Build.0 = Debug|ARM64 + {E2A65EFD-25CC-4AF0-B180-0CD56EE277A9}.Debug|x64.ActiveCfg = Debug|x64 + {E2A65EFD-25CC-4AF0-B180-0CD56EE277A9}.Debug|x64.Build.0 = Debug|x64 + {E2A65EFD-25CC-4AF0-B180-0CD56EE277A9}.Release|ARM64.ActiveCfg = Release|ARM64 + {E2A65EFD-25CC-4AF0-B180-0CD56EE277A9}.Release|ARM64.Build.0 = Release|ARM64 + {E2A65EFD-25CC-4AF0-B180-0CD56EE277A9}.Release|x64.ActiveCfg = Release|x64 + {E2A65EFD-25CC-4AF0-B180-0CD56EE277A9}.Release|x64.Build.0 = Release|x64 + {612F33AD-430C-4FE7-8000-35E15A5EB757}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {612F33AD-430C-4FE7-8000-35E15A5EB757}.Debug|ARM64.Build.0 = Debug|ARM64 + {612F33AD-430C-4FE7-8000-35E15A5EB757}.Debug|x64.ActiveCfg = Debug|x64 + {612F33AD-430C-4FE7-8000-35E15A5EB757}.Debug|x64.Build.0 = Debug|x64 + {612F33AD-430C-4FE7-8000-35E15A5EB757}.Release|ARM64.ActiveCfg = Release|ARM64 + {612F33AD-430C-4FE7-8000-35E15A5EB757}.Release|ARM64.Build.0 = Release|ARM64 + {612F33AD-430C-4FE7-8000-35E15A5EB757}.Release|x64.ActiveCfg = Release|x64 + {612F33AD-430C-4FE7-8000-35E15A5EB757}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {B869660E-4622-49A7-A458-819E1C98599D} + EndGlobalSection +EndGlobal diff --git a/network/netadaptercx/netvadapter/um/netvadapterum.inf b/network/netadaptercx/netvadapter/um/netvadapterum.inf new file mode 100644 index 000000000..4b55d2298 Binary files /dev/null and b/network/netadaptercx/netvadapter/um/netvadapterum.inf differ diff --git a/network/netadaptercx/netvadapter/um/netvadapterum.vcxproj b/network/netadaptercx/netvadapter/um/netvadapterum.vcxproj new file mode 100644 index 000000000..845796135 --- /dev/null +++ b/network/netadaptercx/netvadapter/um/netvadapterum.vcxproj @@ -0,0 +1,197 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|x64"> + <Configuration>Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|x64"> + <Configuration>Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Debug|ARM64"> + <Configuration>Debug</Configuration> + <Platform>ARM64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|ARM64"> + <Configuration>Release</Configuration> + <Platform>ARM64</Platform> + </ProjectConfiguration> + </ItemGroup> + <ItemGroup> + <Inf Include="netvadapterum.inf" /> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{1CDC2CE3-19F3-4200-87C7-C343FB2D8ED3}</ProjectGuid> + <TemplateGuid>{2177f19c-eb4c-4687-9e7f-f9eec1f12cf1}</TemplateGuid> + <TargetFrameworkVersion>v4.5</TargetFrameworkVersion> + <MinimumVisualStudioVersion>12.0</MinimumVisualStudioVersion> + <Configuration>Debug</Configuration> + <Platform Condition="'$(Platform)' == ''">x64</Platform> + <RootNamespace>netvadapterum</RootNamespace> + </PropertyGroup> + <PropertyGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <PlatformToolset>WindowsUserModeDriver10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <DriverTargetPlatform>Universal</DriverTargetPlatform> + </PropertyGroup> + <PropertyGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <PlatformToolset>WindowsUserModeDriver10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <DriverTargetPlatform>Universal</DriverTargetPlatform> + </PropertyGroup> + <PropertyGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'"> + <PlatformToolset>WindowsUserModeDriver10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <DriverTargetPlatform>Universal</DriverTargetPlatform> + </PropertyGroup> + <PropertyGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'"> + <PlatformToolset>WindowsUserModeDriver10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <DriverTargetPlatform>Universal</DriverTargetPlatform> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>true</UseDebugLibraries> + <UMDF_VERSION_MAJOR>2</UMDF_VERSION_MAJOR> + <UMDF_VERSION_MINOR>33</UMDF_VERSION_MINOR> + <UMDF_MINIMUM_VERSION_REQUIRED>33</UMDF_MINIMUM_VERSION_REQUIRED> + <NetAdapterDriver>true</NetAdapterDriver> + <NETADAPTER_VERSION_MAJOR>2</NETADAPTER_VERSION_MAJOR> + <NETADAPTER_VERSION_MINOR>5</NETADAPTER_VERSION_MINOR> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>false</UseDebugLibraries> + <UMDF_VERSION_MAJOR>2</UMDF_VERSION_MAJOR> + <UMDF_VERSION_MINOR>33</UMDF_VERSION_MINOR> + <UMDF_MINIMUM_VERSION_REQUIRED>33</UMDF_MINIMUM_VERSION_REQUIRED> + <NetAdapterDriver>true</NetAdapterDriver> + <NETADAPTER_VERSION_MAJOR>2</NETADAPTER_VERSION_MAJOR> + <NETADAPTER_VERSION_MINOR>5</NETADAPTER_VERSION_MINOR> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>true</UseDebugLibraries> + <UMDF_VERSION_MAJOR>2</UMDF_VERSION_MAJOR> + <UMDF_VERSION_MINOR>33</UMDF_VERSION_MINOR> + <UMDF_MINIMUM_VERSION_REQUIRED>33</UMDF_MINIMUM_VERSION_REQUIRED> + <NetAdapterDriver>true</NetAdapterDriver> + <NETADAPTER_VERSION_MAJOR>2</NETADAPTER_VERSION_MAJOR> + <NETADAPTER_VERSION_MINOR>5</NETADAPTER_VERSION_MINOR> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>false</UseDebugLibraries> + <UMDF_VERSION_MAJOR>2</UMDF_VERSION_MAJOR> + <UMDF_VERSION_MINOR>33</UMDF_VERSION_MINOR> + <UMDF_MINIMUM_VERSION_REQUIRED>33</UMDF_MINIMUM_VERSION_REQUIRED> + <NetAdapterDriver>true</NetAdapterDriver> + <NETADAPTER_VERSION_MAJOR>2</NETADAPTER_VERSION_MAJOR> + <NETADAPTER_VERSION_MINOR>5</NETADAPTER_VERSION_MINOR> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup /> + <PropertyGroup> + <SkipPackageVerification>true</SkipPackageVerification> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <DebuggerFlavor>DbgengRemoteDebugger</DebuggerFlavor> + <EnableInf2cat>false</EnableInf2cat> + <TargetName>netvadapterum</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <DebuggerFlavor>DbgengRemoteDebugger</DebuggerFlavor> + <EnableInf2cat>false</EnableInf2cat> + <TargetName>netvadapterum</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'"> + <DebuggerFlavor>DbgengRemoteDebugger</DebuggerFlavor> + <EnableInf2cat>false</EnableInf2cat> + <TargetName>netvadapterum</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'"> + <DebuggerFlavor>DbgengRemoteDebugger</DebuggerFlavor> + <EnableInf2cat>false</EnableInf2cat> + <TargetName>netvadapterum</TargetName> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <DriverSign> + <FileDigestAlgorithm>sha256</FileDigestAlgorithm> + </DriverSign> + <ClCompile> + <AdditionalIncludeDirectories>..\..\netvadapterlibrary\Interface;..\..\netvadapterlibrary\code;..\..\..\..\wil\include;$(KIT_SHARED_INC_PATH_WDK);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <WppEnabled>true</WppEnabled> + <WppScanConfigurationData>..\..\netvadapterlibrary\code\trace.h</WppScanConfigurationData> + <WppMinimalRebuildFromTracking>false</WppMinimalRebuildFromTracking> + <PreprocessToFile>false</PreprocessToFile> + <WppRecorderEnabled>true</WppRecorderEnabled> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <DriverSign> + <FileDigestAlgorithm>sha256</FileDigestAlgorithm> + </DriverSign> + <ClCompile> + <AdditionalIncludeDirectories>..\..\netvadapterlibrary\Interface;..\..\netvadapterlibrary\code;..\..\..\..\wil\include;$(KIT_SHARED_INC_PATH_WDK);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <WppEnabled>true</WppEnabled> + <WppScanConfigurationData>..\..\netvadapterlibrary\code\trace.h</WppScanConfigurationData> + <WppMinimalRebuildFromTracking>false</WppMinimalRebuildFromTracking> + <PreprocessToFile>false</PreprocessToFile> + <WppRecorderEnabled>true</WppRecorderEnabled> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'"> + <DriverSign> + <FileDigestAlgorithm>sha256</FileDigestAlgorithm> + </DriverSign> + <ClCompile> + <AdditionalIncludeDirectories>..\..\netvadapterlibrary\Interface;..\..\netvadapterlibrary\code;..\..\..\..\wil\include;$(KIT_SHARED_INC_PATH_WDK);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <WppEnabled>true</WppEnabled> + <WppScanConfigurationData>..\..\netvadapterlibrary\code\trace.h</WppScanConfigurationData> + <WppMinimalRebuildFromTracking>false</WppMinimalRebuildFromTracking> + <PreprocessToFile>false</PreprocessToFile> + <WppRecorderEnabled>true</WppRecorderEnabled> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'"> + <DriverSign> + <FileDigestAlgorithm>sha256</FileDigestAlgorithm> + </DriverSign> + <ClCompile> + <AdditionalIncludeDirectories>..\..\netvadapterlibrary\Interface;..\..\netvadapterlibrary\code;..\..\..\..\wil\include;$(KIT_SHARED_INC_PATH_WDK);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <WppEnabled>true</WppEnabled> + <WppScanConfigurationData>..\..\netvadapterlibrary\code\trace.h</WppScanConfigurationData> + <WppMinimalRebuildFromTracking>false</WppMinimalRebuildFromTracking> + <PreprocessToFile>false</PreprocessToFile> + <WppRecorderEnabled>true</WppRecorderEnabled> + </ClCompile> + </ItemDefinitionGroup> + <ItemGroup> + <FilesToPackage Include="$(TargetPath)" /> + </ItemGroup> + <ItemGroup> + <ClInclude Include="..\drivercode\pch.hpp" /> + <ClInclude Include="..\drivercode\device.h" /> + <ClInclude Include="..\drivercode\power.h" /> + </ItemGroup> + <ItemGroup> + <ClCompile Include="..\drivercode\driver.cpp" /> + <ClCompile Include="..\drivercode\device.cpp" /> + <ClCompile Include="..\drivercode\power.cpp" /> + <ClCompile Include="..\drivercode\memorymanagement.cpp" /> + </ItemGroup> + <ItemGroup> + <ProjectReference Include="..\..\netvadapterlibrary\ethernet_um\netvadapterlibraryum.vcxproj"> + <Project>{612f33ad-430c-4fe7-8000-35e15a5eb757}</Project> + </ProjectReference> + </ItemGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> +</Project> \ No newline at end of file diff --git a/network/netadaptercx/netvadapter/um/netvadapterum.vcxproj.filters b/network/netadaptercx/netvadapter/um/netvadapterum.vcxproj.filters new file mode 100644 index 000000000..b43c1b220 --- /dev/null +++ b/network/netadaptercx/netvadapter/um/netvadapterum.vcxproj.filters @@ -0,0 +1,51 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup> + <Filter Include="Source Files"> + <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier> + <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions> + </Filter> + <Filter Include="Header Files"> + <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier> + <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions> + </Filter> + <Filter Include="Resource Files"> + <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier> + <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions> + </Filter> + <Filter Include="Driver Files"> + <UniqueIdentifier>{8E41214B-6785-4CFE-B992-037D68949A14}</UniqueIdentifier> + <Extensions>inf;inv;inx;mof;mc;</Extensions> + </Filter> + </ItemGroup> + <ItemGroup> + <Inf Include="netvadapterum.inf"> + <Filter>Driver Files</Filter> + </Inf> + </ItemGroup> + <ItemGroup> + <ClCompile Include="..\drivercode\driver.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="..\drivercode\device.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="..\drivercode\power.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="..\drivercode\memorymanagement.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + </ItemGroup> + <ItemGroup> + <ClInclude Include="..\drivercode\pch.hpp"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="..\drivercode\device.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="..\drivercode\power.h"> + <Filter>Header Files</Filter> + </ClInclude> + </ItemGroup> +</Project> diff --git a/network/netadaptercx/netvadapterlibrary/Interface/netvadapter.h b/network/netadaptercx/netvadapterlibrary/Interface/netvadapter.h new file mode 100644 index 000000000..3ed87429d --- /dev/null +++ b/network/netadaptercx/netvadapterlibrary/Interface/netvadapter.h @@ -0,0 +1,118 @@ +// Copyright (c) Microsoft Corporation. All rights reserved +#pragma once + +#define MAX_MULTICAST_LIST_SIZE 32 +#define MAC_ADDR_LEN 6 +#define MAX_RX_QUEUES 1 +#define MAX_TX_QUEUES 1 +#define MTU_SIZE 1500 + +#define NETV_NUMBER_OF_QUEUES 1 + +//#define NETV_SUPPORT_RSS // RSS not supported due to ENL limitations +//#define NETV_SUPPORT_TX_DEMUXING // TX Demuxing not supported due to ENL limitations + +// supported filters +#define NETV_SUPPORTED_FILTERS ( \ + NetPacketFilterFlagDirected | \ + NetPacketFilterFlagMulticast | \ + NetPacketFilterFlagBroadcast | \ + NetPacketFilterFlagPromiscuous | \ + NetPacketFilterFlagAllMulticast) + + +EVT_NET_ADAPTER_CREATE_TXQUEUE + CreateTxQueue; +EVT_NET_ADAPTER_CREATE_RXQUEUE + CreateRxQueue; + +typedef enum _NETV_FLOW_CONTROL +{ + NetvFlowControlDisabled = 0, + NetvFlowControlTxEnabled = 1, + NetvFlowControlRxEnabled = 2, + NetvFlowControlTxRxEnabled = 3, +} NETV_FLOW_CONTROL; + +typedef NTSTATUS(EVT_PDO_WAKE_SIGNAL)(_In_ void* Context); + +class NetvAdapter +{ + +public: + + NetvAdapter( + NETADAPTER Handle, + WDFDEVICE Device + ) noexcept; + + // Public API + void Destroy(); + NTSTATUS Initialize(); + NTSTATUS CreateRxQueue(_Inout_ NETRXQUEUE_INIT* NetRxQueueInit); + NTSTATUS CreateTxQueue(_Inout_ NETTXQUEUE_INIT* NetTxQueueInit); + + // Former INetvAdapter method (kept as regular method) + NTSTATUS ConfigureDataCapabilities(); + + // Existing public API + void SetPdoWakeSignalCallback(_In_ EVT_PDO_WAKE_SIGNAL* evtPdoWakeSignal, _In_ void* context); + void ArmWakeFromS0(void); + void DisarmWakeFromS0(void); + + NETADAPTER m_handle = WDF_NO_HANDLE; + + WDFDEVICE m_device = WDF_NO_HANDLE; + + // configuration + NET_ADAPTER_LINK_LAYER_ADDRESS PermanentAddress; + NET_ADAPTER_LINK_LAYER_ADDRESS CurrentAddress; + ULONG MACLastByte; + BOOLEAN S0Idle; + BOOLEAN EnableUsoUro; + + // Packet Filter and look ahead size. + NET_PACKET_FILTER_FLAGS PacketFilter; + + bool LinkAutoNeg{false}; + NETV_FLOW_CONTROL FlowControl; + + ULONG MtuSize; + ULONG CurrentPacketFilter; + ULONG NumMulticastAddresses; + NET_ADAPTER_LINK_LAYER_ADDRESS MulticastAddressList[MAX_MULTICAST_LIST_SIZE]; + + //ENL + LIST_ENTRY AdapterListLink; + ULONG LinkCount{1}; + ULONG LinkProcIndex; + ULONG EnlIndex; + ULONG EnlPortIndex; + BOOLEAN EnlIndexValid; + BOOLEAN EnlPortCreated; + BOOLEAN LinkPoll; + ULONG64 EnlTxDrops; + + // Offloads + bool UsoEnabled; + bool UroEnabled; + +private: + + _IRQL_requires_(PASSIVE_LEVEL) + void + SetLinkState( + void + ) const; + + + NTSTATUS NetvAdapterReadAddress(); +}; + +extern NetvAdapter* NetvAdapterGetContextFromWDFObject(NETADAPTER netAdapter); + +typedef struct _GLOBAL_CONTEXT +{ +} GLOBAL_CONTEXT; + +extern GLOBAL_CONTEXT NetvGlobalContext; \ No newline at end of file diff --git a/network/netadaptercx/netvadapterlibrary/code/adapter.cpp b/network/netadaptercx/netvadapterlibrary/code/adapter.cpp new file mode 100644 index 000000000..880f970d8 --- /dev/null +++ b/network/netadaptercx/netvadapterlibrary/code/adapter.cpp @@ -0,0 +1,595 @@ +// Copyright (c) Microsoft Corporation. All rights reserved + +#include "pch.hpp" + +#include <new.h> +#ifdef _KERNEL_MODE +#include <xfilter.h> +#else +#include "net/umxfilter.h" // Copied from Km XFilter.h, NETCX please move this xfilter.h into shared location +#endif +#include "netvadapter.h" +#include "rxqueue.h" +#include "txqueue.h" +#include "configuration.h" +#include "trace.h" +#include "memory.h" + +#include "adapter.tmh" + +UCHAR NetvMacAddressBase[MAC_ADDR_LEN] = { 0x22, 0x22, 0x22, 0x22, 0x00, 0x00 }; +const ULONG GSO_MAX_OFFLOAD_SIZE = 0xffff; +const ULONG GSO_MIN_SEGMENT_COUNT = 2; + +/* + * increasing beyond 1Gbps results in intermittent failure of + * netvadapter start due to buffer allocation failures in + * netadaptercx when running in nebula. + * tracked as bug 50671552 (if it doesn't get archived) + */ +static auto constexpr MAX_LINK_SPEED{1'000'000'000ull}; + +void +NetvEnlInterruptRoutine( + _Inout_ PVOID PortContext, + _In_ bool Tx +) +{ + NETPACKETQUEUE queue = (NETPACKETQUEUE)PortContext; + + if (Tx) // Tx + { + NetTxQueueNotifyMoreCompletedPacketsAvailable(queue); + } + else // Rx + { + NetRxQueueNotifyMoreReceivedPacketsAvailable(queue); + } +} + +static +EVT_PACKET_QUEUE_START + EvtTxQueueStart; + +static +EVT_PACKET_QUEUE_STOP + EvtTxQueueStop; + +static +EVT_PACKET_QUEUE_ADVANCE + EvtTxQueueAdvance; + +static +EVT_PACKET_QUEUE_CANCEL + EvtTxQueueCancel; + +static +EVT_PACKET_QUEUE_SET_NOTIFICATION_ENABLED + EvtTxQueueSetNotify; + +static +EVT_PACKET_QUEUE_START + EvtRxQueueStart; + +static +EVT_PACKET_QUEUE_STOP + EvtRxQueueStop; + +static +EVT_PACKET_QUEUE_ADVANCE + EvtRxQueueAdvance; + +static +EVT_PACKET_QUEUE_CANCEL + EvtRxQueueCancel; + +static +EVT_PACKET_QUEUE_SET_NOTIFICATION_ENABLED + EvtRxQueueSetNotify; + +NetvAdapter::NetvAdapter( + NETADAPTER Handle, + WDFDEVICE Device +) noexcept + : m_handle(Handle) + , m_device(Device) +{ +} + +NTSTATUS +NetvAdapter::Initialize( + void +) +{ + RETURN_IF_NOT_STATUS_SUCCESS( + NetvAdapterReadConfiguration(this, m_device)); + + RETURN_IF_NOT_STATUS_SUCCESS(NetvAdapterReadAddress()); + + SetLinkState(); + + NTSTATUS status = STATUS_SUCCESS; + + // Create ENL + EnlPortCreated = FALSE; + + if (NetvEnlMLink[EnlIndex].LinkCount == 0) + { + RETURN_IF_NOT_STATUS_SUCCESS( + EnlMCreateLink( + LinkCount, + LinkProcIndex, + LinkPoll, + &NetvEnlMLink[EnlIndex])); + } + + RETURN_NTSTATUS_IF(STATUS_INVALID_ADDRESS, + EnlMIsPortActive(&NetvEnlMLink[EnlIndex], EnlPortIndex)); + + status = EnlMActivateLinkPort( + &NetvEnlMLink[EnlIndex], + EnlPortIndex, + NetvEnlInterruptRoutine, + this); + + // what is the virtue of doing this? + if (NT_SUCCESS(status)) + { + EnlPortCreated = TRUE; + } + + RETURN_STATUS_SUCCESS(); +} + +void +NetvAdapter::Destroy( + void +) +{ + if (EnlPortCreated) + { + EnlMDeactivateLinkPort(&NetvEnlMLink[EnlIndex], EnlPortIndex); + EnlPortCreated = FALSE; + } + + if (EnlIndexValid && !EnlIsLinkActive(NetvEnlMLink[EnlIndex].LinkHandle[0])) + { + EnlMCloseLink(&NetvEnlMLink[EnlIndex]); + } +} + +_Use_decl_annotations_ +NTSTATUS +NetvAdapter::CreateRxQueue( + NETRXQUEUE_INIT * NetRxQueueInit + ) +{ + WDF_OBJECT_ATTRIBUTES rxAttributes; + WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&rxAttributes, NetvRxQueue); + rxAttributes.EvtDestroyCallback = [](WDFOBJECT Handle) { + NetvRxQueueGetContext(static_cast<NETPACKETQUEUE>(Handle))->Destroy(); + }; + + NET_PACKET_QUEUE_CONFIG rxConfig; + NET_PACKET_QUEUE_CONFIG_INIT( + &rxConfig, + EvtRxQueueAdvance, + EvtRxQueueSetNotify, + EvtRxQueueCancel); + rxConfig.EvtStart = EvtRxQueueStart; + rxConfig.EvtStop = EvtRxQueueStop; + + NETPACKETQUEUE rxQueue; + RETURN_IF_NOT_STATUS_SUCCESS(NetRxQueueCreate( + NetRxQueueInit, + &rxAttributes, + &rxConfig, + &rxQueue)); + + new (NetvRxQueueGetContext(rxQueue)) NetvRxQueue(rxQueue, *this); + + RETURN_STATUS_SUCCESS(); +} + +_Use_decl_annotations_ +NTSTATUS +NetvAdapter::CreateTxQueue( + NETTXQUEUE_INIT * NetTxQueueInit + ) +{ + WDF_OBJECT_ATTRIBUTES txAttributes; + WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&txAttributes, NetvTxQueue); + txAttributes.EvtDestroyCallback = [](WDFOBJECT Handle) { + NetvTxQueueGetContext(static_cast<NETPACKETQUEUE>(Handle))->Destroy(); + }; + + NET_PACKET_QUEUE_CONFIG txConfig; + NET_PACKET_QUEUE_CONFIG_INIT( + &txConfig, + EvtTxQueueAdvance, + EvtTxQueueSetNotify, + EvtTxQueueCancel); + txConfig.EvtStart = EvtTxQueueStart; + txConfig.EvtStop = EvtTxQueueStop; + + NETPACKETQUEUE txQueue; + RETURN_IF_NOT_STATUS_SUCCESS(NetTxQueueCreate( + NetTxQueueInit, + &txAttributes, + &txConfig, + &txQueue)); + + new (NetvTxQueueGetContext(txQueue)) NetvTxQueue(txQueue, *this); + + RETURN_STATUS_SUCCESS(); +} + +void NetvAdapter::SetPdoWakeSignalCallback(_In_ EVT_PDO_WAKE_SIGNAL* evtPdoWakeSignal, _In_ void* context) +{ + EnlSetPdoWakeSignalCallback(NetvEnlMLink[EnlIndex].LinkHandle[0], evtPdoWakeSignal, context); +} + +_Use_decl_annotations_ +_IRQL_requires_max_(PASSIVE_LEVEL) +void NetvAdapter::ArmWakeFromS0(void) +{ + if (EnlPortCreated) + { + ENLP_LINK* enLinkHandle = NetvEnlMLink[EnlIndex].LinkHandle[0]; + EnlArmWake(enLinkHandle); + } +} + +_Use_decl_annotations_ +_IRQL_requires_max_(PASSIVE_LEVEL) +void NetvAdapter::DisarmWakeFromS0(void) +{ + if (EnlPortCreated) + { + ENLP_LINK* enLinkHandle = NetvEnlMLink[EnlIndex].LinkHandle[0]; + EnlDisarmWake(enLinkHandle); + } +} + +_Use_decl_annotations_ +void +NetvAdapter::SetLinkState( + void +) const +{ + NET_ADAPTER_AUTO_NEGOTIATION_FLAGS autoNegotiationFlags{NetAdapterAutoNegotiationFlagNone}; + if (LinkAutoNeg) + { + autoNegotiationFlags |= + NetAdapterAutoNegotiationFlagXmitLinkSpeedAutoNegotiated | + NetAdapterAutoNegotiationFlagRcvLinkSpeedautoNegotiated | + NetAdapterAutoNegotiationFlagDuplexAutoNegotiated; + } + if (FlowControl != NetvFlowControlDisabled) + { + autoNegotiationFlags |= + NetAdapterAutoNegotiationFlagPauseFunctionsAutoNegotiated; + } + + NET_ADAPTER_PAUSE_FUNCTION_TYPE pauseFunctions{NetAdapterPauseFunctionTypeUnknown}; + switch (FlowControl) + { + case NetvFlowControlDisabled: + pauseFunctions = NetAdapterPauseFunctionTypeUnsupported; + break; + case NetvFlowControlRxEnabled: + pauseFunctions = NetAdapterPauseFunctionTypeReceiveOnly; + break; + case NetvFlowControlTxEnabled: + pauseFunctions = NetAdapterPauseFunctionTypeSendOnly; + break; + case NetvFlowControlTxRxEnabled: + pauseFunctions = NetAdapterPauseFunctionTypeSendAndReceive; + break; + } + + NET_ADAPTER_LINK_STATE linkState; + NET_ADAPTER_LINK_STATE_INIT( + &linkState, + MAX_LINK_SPEED, + MediaConnectStateConnected, + MediaDuplexStateFull, + pauseFunctions, + autoNegotiationFlags); + NetAdapterSetLinkState(m_handle, &linkState); +} + +static +void +EvtSetReceiveFilter( + _In_ NETADAPTER NetAdapter, + _In_ NETRECEIVEFILTER Handle + ) +{ + NetvAdapter* adapter = NetvAdapterGetContextFromWDFObject(NetAdapter); + + adapter->PacketFilter = NetReceiveFilterGetPacketFilter(Handle); + + adapter->NumMulticastAddresses = (ULONG)NetReceiveFilterGetMulticastAddressCount(Handle); + + RtlZeroMemory(adapter->MulticastAddressList, + sizeof(NET_ADAPTER_LINK_LAYER_ADDRESS) * MAX_MULTICAST_LIST_SIZE); + + if (adapter->NumMulticastAddresses != 0U) + { + NET_ADAPTER_LINK_LAYER_ADDRESS const * MulticastAddressList = NetReceiveFilterGetMulticastAddressList(Handle); + RtlCopyMemory(adapter->MulticastAddressList, + MulticastAddressList, + sizeof(NET_ADAPTER_LINK_LAYER_ADDRESS) * adapter->NumMulticastAddresses); + } +} + +static +_IRQL_requires_same_ +_IRQL_requires_max_(PASSIVE_LEVEL) +void +NTAPI +EvtNetAdapterOffloadSetRxXSum( + _In_ NETADAPTER Adapter, + _In_ NETOFFLOAD Offload + ) +{ + UNREFERENCED_PARAMETER((Adapter, Offload)); + ASSERT(NetOffloadIsRxChecksumIPv4Enabled(Offload)); + ASSERT(NetOffloadIsRxChecksumUdpEnabled(Offload)); +} + +static +_IRQL_requires_same_ +_IRQL_requires_max_(PASSIVE_LEVEL) +void +NTAPI +EvtNetAdapterOffloadSetGso( + _In_ NETADAPTER Adapter, + _In_ NETOFFLOAD Offload + ) +{ + auto adapter = NetvAdapterGetContextFromWDFObject(Adapter); + if (adapter->UsoEnabled) + { + // + // Since netvadapter only converts USO sends into URO receives, + // both must be enabled together, or disabled together. + // The order of callbacks is nondeterministic, so this can't assert + // that URO is enabled, since it might not have been enabled yet. + // This assert is so anyone using netvadapter knows that USO has + // been disabled after being enabled. + // + NT_FRE_ASSERTMSG("USO can't be disabled after being enabled", NetOffloadIsUsoIPv4Enabled(Offload)); + NT_FRE_ASSERTMSG("USO can't be disabled after being enabled", NetOffloadIsUsoIPv6Enabled(Offload)); + } + else + { + adapter->UsoEnabled = NetOffloadIsUsoIPv4Enabled(Offload) && NetOffloadIsUsoIPv6Enabled(Offload); + } +} + +static +_IRQL_requires_same_ +_IRQL_requires_max_(PASSIVE_LEVEL) +void +NTAPI +EvtNetAdapterOffloadSetRsc( + _In_ NETADAPTER Adapter, + _In_ NETOFFLOAD Offload + ) +{ + auto adapter = NetvAdapterGetContextFromWDFObject(Adapter); + if (adapter->UroEnabled) + { + // + // Since netvadapter only converts USO sends into URO receives, + // both must be enabled together, or disabled together. + // The order of callbacks is nondeterministic, so this can't assert + // that USO is enabled, since it might not have been enabled yet. + // This assert is so anyone using netvadapter knows that URO has + // been disabled after being enabled. + // This assert is important because if URO is disabled, netvadapter + // will forward the USO send without fixing it up or segmenting it, + // and the stack may behave badly. + // + NT_FRE_ASSERTMSG("URO can't be disabled after being enabled", NetOffloadIsUdpRscEnabled(Offload)); + } + else + { + adapter->UroEnabled = NetOffloadIsUdpRscEnabled(Offload); + } +} + +static +void +NetvAdapterSetUsoUroOffloadCapabilities( + _In_ NETADAPTER Adapter + ) +{ + NET_ADAPTER_OFFLOAD_GSO_CAPABILITIES gsoCapabilities; + NET_ADAPTER_OFFLOAD_GSO_CAPABILITIES_INIT( + &gsoCapabilities, + NetAdapterOffloadLayer3FlagIPv4NoOptions | NetAdapterOffloadLayer3FlagIPv6NoExtensions, + NetAdapterOffloadLayer4FlagUdp, + GSO_MAX_OFFLOAD_SIZE, + GSO_MIN_SEGMENT_COUNT, + EvtNetAdapterOffloadSetGso); + + NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES rscCapabilities; + NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES_INIT( + &rscCapabilities, + NetAdapterOffloadLayer3FlagIPv4NoOptions | NetAdapterOffloadLayer3FlagIPv6NoExtensions, + NetAdapterOffloadLayer4FlagUdp, + EvtNetAdapterOffloadSetRsc); + rscCapabilities.TcpTimestampOption = FALSE; + + NetAdapterOffloadSetGsoCapabilities(Adapter, &gsoCapabilities); + NetAdapterOffloadSetRscCapabilities(Adapter, &rscCapabilities); +} + +_Use_decl_annotations_ +NTSTATUS NetvAdapter::ConfigureDataCapabilities() +{ + + + NET_ADAPTER_TX_CAPABILITIES txCapabilities; + NET_ADAPTER_TX_CAPABILITIES_INIT(&txCapabilities, MAX_TX_QUEUES); + + NET_ADAPTER_RX_CAPABILITIES rxCapabilities; + NET_ADAPTER_RX_CAPABILITIES_INIT_SYSTEM_MANAGED(&rxCapabilities, MAX_RX_BUFFER_SIZE, MAX_RX_QUEUES); + + NET_ADAPTER_LINK_LAYER_CAPABILITIES linkLayerCapabilities; + NET_ADAPTER_LINK_LAYER_CAPABILITIES_INIT(&linkLayerCapabilities, MAX_LINK_SPEED, MAX_LINK_SPEED); + + NET_ADAPTER_RECEIVE_FILTER_CAPABILITIES receiveFilterCapabilities; + NET_ADAPTER_RECEIVE_FILTER_CAPABILITIES_INIT(&receiveFilterCapabilities, EvtSetReceiveFilter); + receiveFilterCapabilities.SupportedPacketFilters = NETV_SUPPORTED_FILTERS; + receiveFilterCapabilities.MaximumMulticastAddresses = MAX_MULTICAST_LIST_SIZE; + + NET_ADAPTER_OFFLOAD_RX_CHECKSUM_CAPABILITIES xsumCapabilities; + NET_ADAPTER_OFFLOAD_RX_CHECKSUM_CAPABILITIES_INIT(&xsumCapabilities, EvtNetAdapterOffloadSetRxXSum); + + NetAdapterSetLinkLayerCapabilities(m_handle, &linkLayerCapabilities); + NetAdapterSetLinkLayerMtuSize(m_handle, MTU_SIZE); + NetAdapterSetDataPathCapabilities(m_handle, &txCapabilities, &rxCapabilities); + NetAdapterSetReceiveFilterCapabilities(m_handle, &receiveFilterCapabilities); + NetAdapterOffloadSetRxChecksumCapabilities(m_handle, &xsumCapabilities); + + NET_ADAPTER_LINK_LAYER_ADDRESS netvLinkAddress; + NET_ADAPTER_LINK_LAYER_ADDRESS_INIT(&netvLinkAddress, MAC_ADDR_LEN, (CONST UCHAR*)&(PermanentAddress.Address)); + + NetAdapterSetPermanentLinkLayerAddress(m_handle, &netvLinkAddress); + NetAdapterSetCurrentLinkLayerAddress(m_handle, &netvLinkAddress); + + if (EnableUsoUro) + { + NetvAdapterSetUsoUroOffloadCapabilities(m_handle); + } + + RETURN_STATUS_SUCCESS(); +} + +NTSTATUS +NetvAdapter::NetvAdapterReadAddress() +{ + PermanentAddress.Length = MAC_ADDR_LEN; + + RETURN_NTSTATUS_IF(STATUS_INVALID_ADDRESS, + MACLastByte < 1 || + MACLastByte > MAX_ADAPTER_COUNT); + + ETH_COPY_NETWORK_ADDRESS(PermanentAddress.Address, NetvMacAddressBase); + PermanentAddress.Address[MAC_ADDR_LEN - 1] = (UCHAR) MACLastByte; + + if (ETH_IS_MULTICAST(PermanentAddress.Address) || + ETH_IS_BROADCAST(PermanentAddress.Address)) + { + RETURN_IF_NOT_STATUS_SUCCESS(STATUS_INVALID_ADDRESS); + } + + RtlCopyMemory( + &CurrentAddress, + &PermanentAddress, + sizeof(PermanentAddress) + ); + + EnlIndex = (MACLastByte - 1) >> 1; + EnlPortIndex = (MACLastByte - 1) & 1; + EnlIndexValid = TRUE; + + RETURN_STATUS_SUCCESS(); +} + +_Use_decl_annotations_ +void +EvtTxQueueStart( + NETPACKETQUEUE Queue +) +{ + NetvTxQueueGetContext(Queue)->Start(); +} + +_Use_decl_annotations_ +void +EvtTxQueueStop( + NETPACKETQUEUE Queue +) +{ + NetvTxQueueGetContext(Queue)->Stop(); +} + +_Use_decl_annotations_ +void +EvtTxQueueAdvance( + NETPACKETQUEUE Queue +) +{ + NetvTxQueueGetContext(Queue)->Advance(); +} + +_Use_decl_annotations_ +void +EvtTxQueueCancel( + NETPACKETQUEUE Queue +) +{ + NetvTxQueueGetContext(Queue)->Cancel(); +} + +_Use_decl_annotations_ +void +EvtTxQueueSetNotify( + NETPACKETQUEUE Queue, + BOOLEAN Enable +) +{ + NetvTxQueueGetContext(Queue)->SetNotify(Enable); +} + +_Use_decl_annotations_ +void +EvtRxQueueStart( + NETPACKETQUEUE Queue +) +{ + NetvRxQueueGetContext(Queue)->Start(); +} + +_Use_decl_annotations_ +void +EvtRxQueueStop( + NETPACKETQUEUE Queue +) +{ + NetvRxQueueGetContext(Queue)->Stop(); +} + + +_Use_decl_annotations_ +void +EvtRxQueueAdvance( + NETPACKETQUEUE Queue +) +{ + NetvRxQueueGetContext(Queue)->Advance(); +} + +_Use_decl_annotations_ +void +EvtRxQueueCancel( + NETPACKETQUEUE Queue +) +{ + NetvRxQueueGetContext(Queue)->Cancel(); +} + +_Use_decl_annotations_ +void +EvtRxQueueSetNotify( + NETPACKETQUEUE Queue, + BOOLEAN Enable +) +{ + NetvRxQueueGetContext(Queue)->SetNotify(Enable); +} diff --git a/network/netadaptercx/netvadapterlibrary/code/configuration.cpp b/network/netadaptercx/netvadapterlibrary/code/configuration.cpp new file mode 100644 index 000000000..7482ef849 --- /dev/null +++ b/network/netadaptercx/netvadapterlibrary/code/configuration.cpp @@ -0,0 +1,102 @@ +#include "pch.hpp" +#include "netvadapter.h" + +#include "trace.h" +#include "configuration.tmh" + +typedef struct _NETVADAPTER_ADVANCED_PROPERTY +{ + UNICODE_STRING RegName; // variable name text + UINT32 FieldOffset; // offset to NetvAdapter field + UINT32 FieldSize; // size (in bytes) of the field + UINT32 Default; // default value to use + UINT32 Min; // minimum value allowed + UINT32 Max; // maximum value allowed +} NETVADAPTER_ADVANCED_PROPERTY; + +#define NETV_OFFSET(field) ((UINT32)FIELD_OFFSET(NetvAdapter,field)) +#define NETV_SIZE(field) RTL_FIELD_SIZE(NetvAdapter,field) + +#define CONSTANT_UNICODE_STRING(s) {sizeof( s ) - sizeof( WCHAR ), sizeof( s ), s } + +NETVADAPTER_ADVANCED_PROPERTY NetvSupportedProperties[] = +{ + // reg value name - Offset in NetvAdapter - Field size - Default Value - Min - Max + + // Standard Keywords + { CONSTANT_UNICODE_STRING(L"MACLastByte"), NETV_OFFSET(MACLastByte), NETV_SIZE(MACLastByte), 0, 0, 254 }, + { CONSTANT_UNICODE_STRING(L"LinkProcIndex"), NETV_OFFSET(LinkProcIndex), NETV_SIZE(LinkProcIndex), 1000, 0, 1023 }, + { CONSTANT_UNICODE_STRING(L"S0Idle"), NETV_OFFSET(S0Idle), NETV_SIZE(S0Idle), 0, 0, 1 }, + { CONSTANT_UNICODE_STRING(L"EnableUsoUro"), NETV_OFFSET(EnableUsoUro), NETV_SIZE(EnableUsoUro), 0, 0, 1 }, +}; + +NTSTATUS +NetvAdapterReadConfiguration( + NetvAdapter *Adapter, + WDFDEVICE Device + ) +{ + NTSTATUS status = STATUS_SUCCESS; + + NETCONFIGURATION configuration; + RETURN_IF_NOT_STATUS_SUCCESS( + NetDeviceOpenConfiguration(Device, WDF_NO_OBJECT_ATTRIBUTES, &configuration)); + + // read all the registry values + for (auto &property : NetvSupportedProperties) + { + // Driver should NOT fail the initialization only because it can not + // read the registry + auto pointer = (PUCHAR)Adapter + property.FieldOffset; + + // Get the configuration value for a specific parameter. Under NT the + // parameters are all read in as DWORDs. + ULONG value = 0; + + status = NetConfigurationQueryUlong( + configuration, + NET_CONFIGURATION_QUERY_ULONG_NO_FLAGS, + &property.RegName, + &value); + + // Store the value in the adapter structure. + switch (property.FieldSize) + { + case 1: + *((PUCHAR)pointer) = (UCHAR)value; + break; + + case 2: + *((PUSHORT)pointer) = (USHORT)value; + break; + + case 4: + *((PULONG)pointer) = (ULONG)value; + break; + + default: + break; + } + + // If the parameter was present, then check its value for validity. + if (NT_SUCCESS(status)) + { + // Check that param value is not too small or too large + + if (value < property.Min || + value > property.Max) + { + value = property.Default; + } + } + else + { + value = property.Default; + status = STATUS_SUCCESS; + } + } + + NetConfigurationClose(configuration); + + RETURN_STATUS_SUCCESS(); +} diff --git a/network/netadaptercx/netvadapterlibrary/code/configuration.h b/network/netadaptercx/netvadapterlibrary/code/configuration.h new file mode 100644 index 000000000..0bfe01708 --- /dev/null +++ b/network/netadaptercx/netvadapterlibrary/code/configuration.h @@ -0,0 +1,8 @@ +// Copyright (c) Microsoft Corporation. All rights reserved + +NTSTATUS +NetvAdapterReadConfiguration( + NetvAdapter *Adapter, + WDFDEVICE Device + ); + diff --git a/network/netadaptercx/netvadapterlibrary/code/enl.cpp b/network/netadaptercx/netvadapterlibrary/code/enl.cpp new file mode 100644 index 000000000..709c5a1ea --- /dev/null +++ b/network/netadaptercx/netvadapterlibrary/code/enl.cpp @@ -0,0 +1,1001 @@ +// Copyright (C) Microsoft Corporation. All rights reserved. +#include "pch.hpp" +#include <stdlib.h> +#include "netvadapter.h" +#include "rxqueue.h" +#include "txqueue.h" +#include "trace.h" +#include "memory.h" +#include "rtl\KLockHolder.h" +#include "enl.tmh" + +/////////////////////////////////////////////////////////////////////////////// +// BEGIN Generic execution engine thread lib // +/////////////////////////////////////////////////////////////////////////////// + +ENL_MLINK NetvEnlMLink[MAX_ADAPTER_COUNT / 2]; + +/*++ +The iteration routine performs one full pass over all input queues and +any internal queues (that might be holding previous items waiting to be +processed). +--*/ + +static +SIZE_T +CopyTxPacketDataToBuffer( + _Out_writes_bytes_(BufferLength) PUCHAR BufferDest, + _In_ NET_RING_PACKET_ITERATOR const * Iterator, + _In_ NET_EXTENSION const * VirtualAddressExtension, + _In_ SIZE_T BufferLength) +{ + SIZE_T bytesCopied = 0; + + for (NET_RING_FRAGMENT_ITERATOR fi = NetPacketIteratorGetFragments(Iterator); + NetFragmentIteratorHasAny(&fi) && (BufferLength > 0); + NetFragmentIteratorAdvance(&fi)) + { + NET_FRAGMENT const * fragment = NetFragmentIteratorGetFragment(&fi); + NET_FRAGMENT_VIRTUAL_ADDRESS const * virtualAddress = + NetExtensionGetFragmentVirtualAddress(VirtualAddressExtension, NetFragmentIteratorGetIndex(&fi)); + + UCHAR const * pPacketData = (UCHAR const *)virtualAddress->VirtualAddress + fragment->Offset; + SIZE_T bytesToCopy = + (BufferLength < (SIZE_T) fragment->ValidLength) ? BufferLength : (SIZE_T) fragment->ValidLength; + RtlCopyMemory(BufferDest, pPacketData, bytesToCopy); + + bytesCopied += bytesToCopy; + BufferDest += bytesToCopy; + BufferLength -= bytesToCopy; + } + + return bytesCopied; +} + +VOID +EnlpAffinitizeThread( + _In_ ULONG ProcIndex, + _In_ ULONG IdealNode + ) +{ + LogInformation(FLAG_DRIVER, L"ProcIndex=%u", ProcIndex); + NTSTATUS status; + PROCESSOR_NUMBER procNumber = { 0 }; + GROUP_AFFINITY affinity = { 0 }; + + if (ProcIndex == 999) + { + // No affinity at all + return; + } + + if (ProcIndex == 1000 || (ProcIndex >= 1001 && ProcIndex <= 1004)) + { + KeQueryNodeActiveAffinity((USHORT)IdealNode, &affinity, NULL); + + if (ProcIndex == 1000) + { + // Affinitize to all the procs in the Node + NOTHING; + } + else + { + // Affinitize to the highest numbered proc in the Node for 1001, + // next highest numbered proc for 1002, ... + ULONG index; +#ifdef _WIN64 + NT_FRE_ASSERTMSG("Failed to find bit", TRUE == BitScanReverse64(&index, (ULONG64)affinity.Mask)); + affinity.Mask = (KAFFINITY)((ULONG64)1 << (index - (ProcIndex - 1001))); +#else + NT_FRE_ASSERTMSG("Failed to find bit", TRUE == BitScanReverse(&index, (ULONG)affinity.Mask)); + affinity.Mask = (KAFFINITY)((ULONG)1 << (index - (ProcIndex - 1001))); +#endif + } + } + else + { + // Affinitize the specifically requested proc + status = KeGetProcessorNumberFromIndex(ProcIndex, &procNumber); + NT_FRE_ASSERTMSG("Bad ProcIndex", NT_SUCCESS(status)); + + affinity.Group = procNumber.Group; + affinity.Mask = AFFINITY_MASK(procNumber.Number); + } + + EnlThreadSetAffinity(&affinity, NULL); +} + +ENL_START_ROUTINE EnlpThreadRoutine; + +NTSTATUS +EnlpStartThread( + _In_ ULONG ProcIndex, + _In_ ULONG IdealNode, + _In_ ENLP_ITERATION_ROUTINE* IterationRoutine, + _In_ PVOID IterationContext, + _In_opt_ KAutoEvent* ArmWaitEvent, + _Out_ ENLP_THREAD_STATE* EnlThread + ) +{ + LogInformation(FLAG_DRIVER, L"ProcIndex=%u EnlThread=%p", ProcIndex, EnlThread); + + EnlThread->PauseRequested = TRUE; + EnlThread->StopRequested = FALSE; + EnlThread->IterationRoutine = IterationRoutine; + EnlThread->IterationContext = IterationContext; + EnlThread->ArmWaitEvent = ArmWaitEvent; + + EnlThread->ProcIndex = ProcIndex; + EnlThread->IdealNode = IdealNode; + + RETURN_IF_NOT_STATUS_SUCCESS( + EnlThreadCreate(EnlpThreadRoutine, EnlThread, EnlThread->Thread)); + + EnlThreadSetPriority(EnlThread->Thread, 15); + + RETURN_STATUS_SUCCESS(); +} + +BOOLEAN +EnlpIsThreadPaused( + _In_ CONST ENLP_THREAD_STATE* EnlThread + ) +{ + return EnlThread->PauseRequested; +} + +VOID +EnlpPauseThread( + _Inout_ ENLP_THREAD_STATE* EnlThread + ) +{ + LogInformation(FLAG_DRIVER, L"EnlThread=%p", EnlThread); + if (!EnlpIsThreadPaused(EnlThread)) + { + WriteBooleanNoFence(&EnlThread->PauseRequested, TRUE); + if (EnlThread->ArmWaitEvent != NULL) + { + EnlThread->ArmWaitEvent->Set(); + } + EnlThread->PausingEvent.Wait(); + } +} + +VOID +EnlpResumeThread( + _Inout_ ENLP_THREAD_STATE* EnlThread + ) +{ + LogInformation(FLAG_DRIVER, L"EnlThread=%p", EnlThread); + if (EnlpIsThreadPaused(EnlThread)) + { + WriteBooleanNoFence(&EnlThread->PauseRequested, FALSE); + KeMemoryBarrier(); + EnlThread->ResumeEvent.Set(); + } +} + +VOID +EnlpStopThread( + _Inout_ ENLP_THREAD_STATE* EnlThread + ) +{ + LogInformation(FLAG_DRIVER, L"EnlThread=%p", EnlThread); + if (EnlThread->Thread != NULL) + { + WriteBooleanNoFence(&EnlThread->StopRequested, TRUE); + EnlpResumeThread(EnlThread); // in case thread was paused + EnlThreadWaitForTermination(EnlThread->Thread); + EnlThread->Thread.reset(); + } +} + +ENL_THREAD_ROUTINE_RETURN +EnlpThreadRoutine( + _In_ PVOID Context + ) +{ + ENLP_THREAD_STATE* enlThread = (ENLP_THREAD_STATE*)Context; + + // + // Affinitize the thread + // + EnlpAffinitizeThread(enlThread->ProcIndex, enlThread->IdealNode); + + // + // ENL thread starts at paused state. + // + enlThread->ResumeEvent.Wait(); + + for (;;) + { + + if (ReadBooleanNoFence(&enlThread->PauseRequested)) + { + enlThread->PausingEvent.Set(); + enlThread->ResumeEvent.Wait(); + } + + if (ReadBooleanNoFence(&enlThread->StopRequested)) + { + break; + } + + enlThread->IterationRoutine(enlThread->IterationContext); + } + + return ENL_THREAD_ROUTINE_RETURN(); +} + +/////////////////////////////////////////////////////////////////////////////// +// END Generic execution engine thread lib // +/////////////////////////////////////////////////////////////////////////////// + +BOOLEAN +enlpCheckAndArmQueue( + _Inout_ ENLP_QUEUE* Q + ) +{ + BOOLEAN armed = FALSE; + auto ringBuffer = Q->Queue->GetPacketRing(); + // If Q is still empty, take the lock, and if still empty under lock, then + // arm it. + if (ringBuffer->BeginIndex == ringBuffer->EndIndex) + { + WdfSpinLockAcquire(Q->Spinlock); + + if (ringBuffer->BeginIndex == ringBuffer->EndIndex) + { + armed = TRUE; + Q->Armed = TRUE; + } + + WdfSpinLockRelease(Q->Spinlock); + } + + return armed; +} + +VOID +enlpArmAndWait( + _Inout_ ENLP_LINK* EnlLink + ) +{ + ULONG pi, ci; + + for (pi = 0; pi < ENLP_PORT_COUNT; pi++) + { + ENLP_PORT* port = &EnlLink->Ports[pi]; + + for (ci = 0; ci < port->TxQueueCount; ci++) + { + if (!enlpCheckAndArmQueue(port->TxQueue)) + { + return; + } + } + } + + EnlLink->ArmWaitEvent.Wait(); +} + +VOID +EnlpIterationRoutine( + _In_ PVOID IterationContext + ) +{ + auto enlLink = reinterpret_cast<ENLP_LINK *>(IterationContext); + bool emptyTx = true; + // + // Drain up to TX_BATCH_COUNT items from all tx queues first. + // + + for (size_t pi = 0U; pi < ENLP_PORT_COUNT; pi++) + { + auto txport = &enlLink->Ports[pi]; + auto rxport = &enlLink->Ports[pi ^ 0x1]; // 0 -> 1, 1 -> 0 + + for (size_t ci = 0U; ci < txport->TxQueueCount; ci++) + { + auto txq = &txport->TxQueue[ci]; + if (txq->State != Started) + continue; + + NET_RING_PACKET_ITERATOR txPi = { + txq->Queue->m_rings, nullptr, txq->QueueNext, txq->QueueEnd + }; + + while (NetPacketIteratorHasAny(&txPi)) + { + bool rxDrop = TRUE; + auto txPacket = NetPacketIteratorGetPacket(&txPi); + + emptyTx = FALSE; + + if (enlLink->ArmedForWake) + { + // Save wake packet and trigger a wake signal, any other frames queued after the wake + // packet will be dropped + enlLink->WakeFrameSize = CopyTxPacketDataToBuffer( + &enlLink->WakeFrame[0], + &txPi, + &txq->TxQueue->VirtualAddressExtension, + sizeof(enlLink->WakeFrame)); +#if _KERNEL_MODE + enlLink->EvtWakeSignal(enlLink->WakeSignalContext); +#endif + + // Make sure to disarm wake, otherwise this thread might overwrite the original wake frame + EnlDisarmWake(enlLink); + } + + if (rxport->RxQueueCount > 0) + { + //TODO: Currently does 1:1 mapping between Tx and Rx. Need to set up indirection table + auto rxq = &rxport->RxQueue[ci]; + + if (rxq->State == Started) + { + NET_RING_FRAGMENT_ITERATOR rxFi = { + rxq->Queue->m_rings, nullptr, rxq->QueueNext, rxq->QueueEnd + }; + + auto rxPi = NetRingGetPostPackets(rxq->Queue->m_rings); + + if (NetFragmentIteratorHasAny(&rxFi) && NetPacketIteratorHasAny(&rxPi)) + { + rxDrop = FALSE; + + auto fragment = NetFragmentIteratorGetFragment(&rxFi); + BYTE* fragmentBuffer = nullptr; + + auto const rxVirtualAddress = + NetExtensionGetFragmentVirtualAddress( + &rxq->RxQueue->VirtualAddressExtension, + NetFragmentIteratorGetIndex(&rxFi)); + + fragmentBuffer = static_cast<BYTE *>(rxVirtualAddress->VirtualAddress); + + fragment->Offset = 0; + fragment->ValidLength = + CopyTxPacketDataToBuffer( + fragmentBuffer, + &txPi, + &txq->TxQueue->VirtualAddressExtension, + static_cast<SIZE_T>(fragment->Capacity)); + + auto rxPacket = NetPacketIteratorGetPacket(&rxPi); + rxPacket->FragmentIndex = NetFragmentIteratorGetIndex(&rxFi); + rxPacket->FragmentCount = 1; + + if (enlLink->InitializePacketLayout) + { + rxPacket->Layout = txPacket->Layout; + } + else + { + rxPacket->Layout = {}; + } + + if (rxq->RxQueue->RxXSumExtension.Enabled) + { + auto RxXSum = NetExtensionGetPacketChecksum( + &rxq->RxQueue->RxXSumExtension, + NetPacketIteratorGetIndex(&rxPi)); + RxXSum->Layer2 = NetPacketRxChecksumEvaluationNotChecked; + RxXSum->Layer3 = NetPacketRxChecksumEvaluationValid; + RxXSum->Layer4 = NetPacketRxChecksumEvaluationValid; + } + + if (rxq->RxQueue->UdpRscExtension.Enabled && + txq->TxQueue->UsoExtension.Enabled) + { + auto txUso = NetExtensionGetPacketGso( + &txq->TxQueue->UsoExtension, + NetPacketIteratorGetIndex(&txPi)); + if (txPacket->Layout.Layer4Type == NetPacketLayer4TypeUdp && + txUso->UDP.Mss > 0) + { + if (txPacket->Layout.Layer3Type == NetPacketLayer3TypeIPv6NoExtensions) + { + UINT16* ipv6PayloadLength = (UINT16*)(fragmentBuffer + txPacket->Layout.Layer2HeaderLength + 4); + *ipv6PayloadLength = _byteswap_ushort( + (USHORT)(fragment->ValidLength - + (txPacket->Layout.Layer2HeaderLength + txPacket->Layout.Layer3HeaderLength))); + } + else if (txPacket->Layout.Layer3Type == NetPacketLayer3TypeIPv4NoOptions) + { + UINT16* ipv4TotalLength = (UINT16*)(fragmentBuffer + txPacket->Layout.Layer2HeaderLength + 2); + *ipv4TotalLength = _byteswap_ushort((USHORT)(fragment->ValidLength - txPacket->Layout.Layer2HeaderLength )); + NT_FRE_ASSERT(*ipv4TotalLength > 0); + } + + UINT16* udpPayloadLength = (UINT16*)(fragmentBuffer + txPacket->Layout.Layer2HeaderLength + + txPacket->Layout.Layer3HeaderLength + 4); + *udpPayloadLength = _byteswap_ushort( + (USHORT)(fragment->ValidLength - + (txPacket->Layout.Layer3HeaderLength + txPacket->Layout.Layer2HeaderLength))); + + // Set the checksum to zero + UINT16* udpChecksum = udpPayloadLength + 1; + *udpChecksum = 0; + + auto rxUro = NetExtensionGetPacketRsc( + &rxq->RxQueue->UdpRscExtension, + NetPacketIteratorGetIndex(&rxPi)); + rxUro->UDP.CoalescedSegmentSize = (UINT16)txUso->UDP.Mss; + rxUro->UDP.CoalescedSegmentCount = + (UINT16)((fragment->ValidLength - txPacket->Layout.Layer3HeaderLength - txPacket->Layout.Layer4HeaderLength + + txUso->UDP.Mss - 1) / txUso->UDP.Mss); + NT_FRE_ASSERT(rxUro->UDP.CoalescedSegmentCount > 1); + NT_FRE_ASSERT(*udpPayloadLength >= 8); + } + } + + // prevent any reordering the tx/rx completion flag + KeMemoryBarrier(); + + // Use Scratch field as completion flag for the rx fragment + fragment->Scratch = 1; + rxPacket->Scratch = 1; + + NetFragmentIteratorAdvance(&rxFi); + NetPacketIteratorAdvance(&rxPi); + + rxq->QueueNext = NetFragmentIteratorGetIndex(&rxFi); + NetPacketIteratorSet(&rxPi); + + if (rxq->Notify) + { + rxport->Interrupt(rxq->Queue->m_handle, rxq->TxRx); + } + } + } + } + + if (rxDrop) + { + // TODO - add rxdrop stat + } + + // Use Scratch field as completion flag for the tx packet + txPacket->Scratch = 1; + NetPacketIteratorAdvance(&txPi); + } + + if (!emptyTx) + { + if (txq->Notify) + { + txport->Interrupt(txq->Queue->m_handle, txq->TxRx); + } + + // Store the next index so that the EnlThread knows which packet to start from in the next iteration + txq->QueueNext = NetPacketIteratorGetIndex(&txPi); + } + } + } + + ULONG64 ts; + + if (emptyTx) + { + if (enlLink->Poll == FALSE) + { + enlpArmAndWait(enlLink); + } + + ts = ReadTimeStampCounter(); + enlLink->EmptyTicks += (ts - enlLink->Ts); + } + else + { + ts = ReadTimeStampCounter(); + enlLink->BusyTicks += (ts - enlLink->Ts); + } + + enlLink->Ts = ts; +} + +_IRQL_requires_max_(PASSIVE_LEVEL) +ENLP_QUEUE * +EnlCreateQueue( + _In_ NETPACKETQUEUE Queue, + _In_ BOOLEAN Tx + ) +{ + ENLP_LINK* enlLink; + ENLP_PORT* port; + ENLP_QUEUE* enlQueue; + NTSTATUS status; + + if (Tx) // Tx + { + NetvTxQueue* netvTxQueue = NetvTxQueueGetContext(Queue); + enlLink = NetvEnlMLink[netvTxQueue->m_adapter.EnlIndex].LinkHandle[0]; + port = &enlLink->Ports[netvTxQueue->m_adapter.EnlPortIndex]; + enlQueue = &port->TxQueue[0]; // Change to accommodate multiple Queues + enlQueue->Queue = netvTxQueue; + enlQueue->TxQueue = netvTxQueue; + enlQueue->State = Stopped; + enlQueue->ArmWaitEvent = &enlLink->ArmWaitEvent; + enlQueue->QueueNext = 0; + enlQueue->QueueEnd = 0; + enlQueue->TxRx = TX; + enlQueue->EnlPortHandle = port; + port->TxQueueCount++; + LogInformation(FLAG_DRIVER, L"Adapter=%p Queue=%Iu TxQueue=%p", + &netvTxQueue->m_adapter, reinterpret_cast<ULONG_PTR>(Queue), netvTxQueue); + } + else // Rx + { + NetvRxQueue* netvRxQueue = NetvRxQueueGetContext(Queue); + enlLink = NetvEnlMLink[netvRxQueue->m_adapter.EnlIndex].LinkHandle[0]; + port = &enlLink->Ports[netvRxQueue->m_adapter.EnlPortIndex]; + enlQueue = &port->RxQueue[0]; // Change to accommodate multiple Queues + enlQueue->Queue = netvRxQueue; + enlQueue->RxQueue = netvRxQueue; + enlQueue->State = Stopped; + enlQueue->QueueNext = 0; + enlQueue->QueueEnd = 0; + enlQueue->TxRx = RX; + enlQueue->EnlPortHandle = port; + port->RxQueueCount++; + LogInformation(FLAG_DRIVER, L"Adapter=%p Queue=%Iu RxQueue=%p", + &netvRxQueue->m_adapter, reinterpret_cast<ULONG_PTR>(Queue), netvRxQueue); + } + + // Create WDF spinlock for the queue, parent to the queue's WDF handle + WDF_OBJECT_ATTRIBUTES attributes; + WDF_OBJECT_ATTRIBUTES_INIT(&attributes); + attributes.ParentObject = enlQueue->Queue->m_handle; + status = WdfSpinLockCreate(&attributes, &enlQueue->Spinlock); + NT_ASSERT(NT_SUCCESS(status)); + + + EnlpResumeThread(&enlLink->EnlThread); + + return enlQueue; +} + +_IRQL_requires_max_(PASSIVE_LEVEL) +VOID +EnlDestroyQueue( + _In_ ENLP_QUEUE * Queue, + _In_ BOOLEAN Tx + ) +{ + LogInformation(FLAG_DRIVER, L"Queue=%p", Queue); + ENLP_PORT* port = Queue->EnlPortHandle; + + if (Tx) + { + port->TxQueueCount--; + } + else + { + port->RxQueueCount--; + } + + Queue->ArmWaitEvent = nullptr; +} + +_IRQL_requires_max_(PASSIVE_LEVEL) +VOID +EnlRingDoorBell( + _In_ ENLP_QUEUE * Queue, + _In_ ULONG EndIndex + ) +{ + InterlockedExchange((volatile LONG *)&Queue->QueueEnd, (LONG)EndIndex); + + WdfSpinLockAcquire(Queue->Spinlock); + + if (Queue->Armed) + { + NT_ASSERT(Queue->ArmWaitEvent != NULL); + Queue->Armed = FALSE; + WdfSpinLockRelease(Queue->Spinlock); + Queue->ArmWaitEvent->Set(); + return; + } + + WdfSpinLockRelease(Queue->Spinlock); +} + +_IRQL_requires_max_(PASSIVE_LEVEL) +VOID +EnlArmInterrupt( + _In_ ENLP_QUEUE * Queue, + _In_ BOOLEAN notificationEnabled + ) +{ + Queue->Notify = notificationEnabled; + + // TODO: InterlockedExchange reduces the throughput of the ENL from about 500MB/s to 8MB/s. -> why + //InterlockedExchange((volatile LONG *)&Queue->Notify, (LONG)notificationEnabled); +} + +_Use_decl_annotations_ +VOID +EnlIndicateQueueState( + ENLP_QUEUE * Queue, + ENL_QUEUE_STATE State + ) +{ + Queue->State = State; +} + +_IRQL_requires_max_(PASSIVE_LEVEL) +NTSTATUS +EnlCreateLink( + _In_ ULONG ProcessorIndex, + _In_ ULONG IdealNode, + _In_ BOOLEAN Poll, + _In_ BOOLEAN InitializePacketLayout, + _Out_ ENLP_LINK ** EnlLink + ) +{ + LogInformation(FLAG_DRIVER, L"ProcessorIndex=%u", ProcessorIndex); + + auto enlLink = wil::make_unique_nothrow<ENLP_LINK>(); + RETURN_NTSTATUS_IF( + STATUS_INSUFFICIENT_RESOURCES, + ! enlLink); + + enlLink->Ts = ReadTimeStampCounter(); + enlLink->Poll = Poll; + enlLink->InitializePacketLayout = InitializePacketLayout; + + RETURN_IF_NOT_STATUS_SUCCESS( + EnlpStartThread( + ProcessorIndex, + IdealNode, + EnlpIterationRoutine, + enlLink.get(), + enlLink->Poll ? NULL : &enlLink->ArmWaitEvent, + &enlLink->EnlThread)); + + *EnlLink = enlLink.release(); + + RETURN_STATUS_SUCCESS(); +} + +_IRQL_requires_max_(PASSIVE_LEVEL) +BOOLEAN +EnlIsPortActive( + _In_ ENLP_LINK * EnlLink, + _In_ ULONG PortIndex + ) +{ + ENLP_PORT* port = &EnlLink->Ports[PortIndex]; + ENLP_QUEUE* txq = &port->TxQueue[0]; + NT_FRE_ASSERT(PortIndex < ENLP_PORT_COUNT); + + return (txq->Queue == nullptr) ? FALSE : TRUE; +} + +_IRQL_requires_max_(PASSIVE_LEVEL) +BOOLEAN +EnlIsLinkActive( + _In_ ENLP_LINK * EnlLink + ) +{ + return (EnlIsPortActive(EnlLink, 0) || EnlIsPortActive(EnlLink, 1)); +} + +_IRQL_requires_max_(PASSIVE_LEVEL) +NTSTATUS +EnlActivateLinkPort( + _In_ ENLP_LINK * EnlLink, + _In_ ULONG PortIndex, + _In_ ENL_INTERRUPT_ROUTINE Interrupt, + _In_ PVOID PortContext + ) +{ + ENLP_PORT* port = &EnlLink->Ports[PortIndex]; + + LogInformation(FLAG_DRIVER, L"PortIndex=%u Queue=%p", PortIndex, port->TxQueue[0].Queue); + + NT_FRE_ASSERT(!EnlIsPortActive(EnlLink, PortIndex)); + NT_FRE_ASSERT(port->TxQueueCount == 0); + NT_FRE_ASSERT(port->RxQueueCount == 0); + + port->Interrupt = Interrupt; + port->PortContext = PortContext; + + RETURN_STATUS_SUCCESS(); +} + +_IRQL_requires_max_(PASSIVE_LEVEL) +void +EnlDeactivateLinkPort( + _In_ ENLP_LINK * EnlLink, + _In_ ULONG PortIndex + ) +{ + NT_FRE_ASSERT(PortIndex < ENLP_PORT_COUNT); + + ENLP_PORT* port = &EnlLink->Ports[PortIndex]; + LogInformation(FLAG_DRIVER, L"PortIndex=%u Queue=%p", PortIndex, port->TxQueue[0].Queue); + + NT_FRE_ASSERT(EnlIsPortActive(EnlLink, PortIndex)); + + KLockThisExclusive(EnlLink->Lock); + NT_FRE_ASSERT(!EnlpIsThreadPaused(&EnlLink->EnlThread)); + EnlpPauseThread(&EnlLink->EnlThread); + +#if _KERNEL_MODE + KeFlushQueuedDpcs(); +#endif + + port->PortContext = NULL; + + //Clears reference to only first queue - Change for all queues + port->TxQueue[0].Queue = nullptr; + port->RxQueue[0].Queue = nullptr; + + + // As long as there's one port with active queues, the EnlThread will run. + for (ULONG i = 0; i < ENLP_PORT_COUNT; i++) + { + if (EnlIsPortActive(EnlLink, i)) + { + EnlpResumeThread(&EnlLink->EnlThread); + break; + } + } +} + +_IRQL_requires_max_(PASSIVE_LEVEL) +VOID +EnlCloseLink( + _In_ ENLP_LINK * EnlLink + ) +{ + ULONG i; + + for (i = 0; i < ENLP_PORT_COUNT; i++) + { + NT_FRE_ASSERT(!EnlIsPortActive(EnlLink, i)); + } + + EnlpStopThread(&EnlLink->EnlThread); + + delete EnlLink; +} + +/////////////////////////////////////////////////////////////////////////////// +// Multi link wrapper APIs // +/////////////////////////////////////////////////////////////////////////////// + +_IRQL_requires_max_(PASSIVE_LEVEL) +NTSTATUS +EnlMCreateLink( + _In_range_(1, ENL_MLINK_MAX)ULONG LinkCount, + _In_reads_(LinkCount) ULONG ProcessorIndex, + _In_ BOOLEAN Poll, + _Out_ ENL_MLINK* EnlMLink + ) +{ + NTSTATUS status = STATUS_SUCCESS; + ULONG i = 0; + + RtlZeroMemory(EnlMLink, sizeof(*EnlMLink)); + + if (LinkCount < 1 || LinkCount > ENL_MLINK_MAX || + (LinkCount & (LinkCount - 1)) != 0) + { + status = STATUS_REQUEST_NOT_ACCEPTED; + goto exit; + } + + for (i = 0; i < LinkCount; i++) + { +#ifdef _KERNEL_MODE + const BOOLEAN initializePacketLayout = TRUE; +#else + const BOOLEAN initializePacketLayout = FALSE; +#endif + status = EnlCreateLink(ProcessorIndex, 0, Poll, initializePacketLayout, &EnlMLink->LinkHandle[i]); + + if (!NT_SUCCESS(status)) + { + goto exit; + } + } + + EnlMLink->LinkCount = LinkCount; + +exit: + + if (!NT_SUCCESS(status)) + { + for (; i > 0; i--) + { + EnlCloseLink(EnlMLink->LinkHandle[i - 1]); + EnlMLink->LinkHandle[i - 1] = NULL; + } + } + RETURN_NTSTATUS_IF( + status, + status != STATUS_SUCCESS); + + RETURN_STATUS_SUCCESS(); +} + +_IRQL_requires_max_(PASSIVE_LEVEL) +void EnlSetPdoWakeSignalCallback( + _In_ ENLP_LINK * EnlLink, + _In_ EVT_ENLP_PDO_WAKE_SIGNAL* evtPdoWakeSignal, + _In_ void* Context) +{ + EnlLink->EvtWakeSignal = evtPdoWakeSignal; + EnlLink->WakeSignalContext = Context; +} + +_IRQL_requires_max_(PASSIVE_LEVEL) +void +EnlArmWake( + _In_ ENLP_LINK * EnlLink +) +{ + EnlLink->ArmedForWake = TRUE; + RtlZeroMemory(&EnlLink->WakeFrame[0], sizeof(EnlLink->WakeFrame)); + EnlLink->WakeFrameSize = 0; +} + +_IRQL_requires_max_(PASSIVE_LEVEL) +void +EnlDisarmWake( + _In_ ENLP_LINK * EnlLink +) +{ + EnlLink->ArmedForWake = FALSE; +} + +_IRQL_requires_max_(PASSIVE_LEVEL) +size_t +EnlCopyWakeFrame( + _In_ ENLP_LINK * EnlLink, + _Out_writes_bytes_(BufferSize) unsigned char * Buffer, + _In_ size_t BufferSize +) +{ + if (EnlLink->WakeFrameSize == 0) + { + // There was no wake + return 0; + } + + if (BufferSize < EnlLink->WakeFrameSize) + { + // Wake frame is larger than what we can indicate + return 0; + } + + RtlCopyMemory(Buffer, &EnlLink->WakeFrame[0], EnlLink->WakeFrameSize); + auto const wakeFrameSize = EnlLink->WakeFrameSize; + + // Make sure to erase the wake frame, since the network interface might have + // multiple receive queues + RtlZeroMemory(&EnlLink->WakeFrame[0], EnlLink->WakeFrameSize); + EnlLink->WakeFrameSize = 0; + + return wakeFrameSize; +} + +_IRQL_requires_max_(PASSIVE_LEVEL) +BOOLEAN +EnlMIsPortActive( + _In_ CONST ENL_MLINK* EnlMLink, + _In_ ULONG PortIndex + ) +{ + ULONG i; + + BOOLEAN result = EnlIsPortActive(EnlMLink->LinkHandle[0], PortIndex); + + for (i = 1; i < EnlMLink->LinkCount; i++) + { + NT_FRE_ASSERT(EnlIsPortActive(EnlMLink->LinkHandle[i], PortIndex) == result); + } + + return result; +} + +_IRQL_requires_max_(PASSIVE_LEVEL) +BOOLEAN +EnlMIsLinkActive( + _In_ CONST ENL_MLINK* EnlMLink + ) +{ + ULONG i; + + BOOLEAN result = EnlIsLinkActive(EnlMLink->LinkHandle[0]); + + for (i = 1; i < EnlMLink->LinkCount; i++) + { + NT_FRE_ASSERT(EnlIsLinkActive(EnlMLink->LinkHandle[i]) == result); + } + + return result; +} + +_IRQL_requires_max_(PASSIVE_LEVEL) +NTSTATUS +EnlMActivateLinkPort( + _In_ CONST ENL_MLINK* EnlMLink, + _In_ ULONG PortIndex, + _In_ ENL_INTERRUPT_ROUTINE Interrupt, + _In_ PVOID PortContext + ) +{ + LogInformation(FLAG_DRIVER, L"EnlMLink=%p PortIndex=%u", EnlMLink, PortIndex); + + NTSTATUS status = STATUS_SUCCESS; + ULONG i; + + for (i = 0; i < EnlMLink->LinkCount; i++) + { + status = EnlActivateLinkPort( + EnlMLink->LinkHandle[i], + PortIndex, + Interrupt, + PortContext); + + if (!NT_SUCCESS(status)) + { + break; + } + } + + if (!NT_SUCCESS(status)) + { + for (; i > 0; i--) + { + EnlDeactivateLinkPort(EnlMLink->LinkHandle[i], PortIndex); + } + } + + RETURN_NTSTATUS_IF(status, + status != STATUS_SUCCESS); + + RETURN_STATUS_SUCCESS(); +} + +_IRQL_requires_max_(PASSIVE_LEVEL) +void +EnlMDeactivateLinkPort( + _In_ CONST ENL_MLINK* EnlMLink, + _In_ ULONG PortIndex + ) +{ + LogInformation(FLAG_DRIVER, L"EnlMLink=%p PortIndex=%u", EnlMLink, PortIndex); + + ULONG i; + + for (i = 0; i < EnlMLink->LinkCount; i++) + { + EnlDeactivateLinkPort(EnlMLink->LinkHandle[i], PortIndex); + } +} + +_IRQL_requires_max_(PASSIVE_LEVEL) +VOID +EnlMCloseLink( + _Inout_ ENL_MLINK* EnlMLink + ) +{ + LogInformation(FLAG_DRIVER, L"EnlMLink=%p", EnlMLink); + + ULONG i; + + for (i = 0; i < EnlMLink->LinkCount; i++) + { + EnlCloseLink(EnlMLink->LinkHandle[i]); + EnlMLink->LinkHandle[i] = NULL; + } + + EnlMLink->LinkCount = 0; +} diff --git a/network/netadaptercx/netvadapterlibrary/code/enl.h b/network/netadaptercx/netvadapterlibrary/code/enl.h new file mode 100644 index 000000000..2927a582c --- /dev/null +++ b/network/netadaptercx/netvadapterlibrary/code/enl.h @@ -0,0 +1,264 @@ +// Copyright (C) Microsoft Corporation. All rights reserved. +// +// Emulated Network Link (ENL) definitions +// + +// +// An ENL connects two virtual network adapters directly. Packets sent over +// one adapter are delivered to the other adapter and vice versa. +// +// An ENL is created with a processor index. This processor is used to emulate +// the NIC hardware for the adapters connected by the ENL. +// +// Caller can send packets as NBLs over a given port, and also receive +// incoming packets placed into NBLs over a given port. +// +// ENL indicates tx and rx NBL completions over the target processor(s) +// determined by the RSS indirection table and the hash value for each NBL. +// The current version of the ENL requires a symmetric Toeplitz hash key +// to be used by the system globally so that both directions of a given +// 4-tuple (or 2-tuple) yield the same hash value. ENL currently indicates +// NBL completions by queueing DPCs to the target processor. +// + + +#ifndef _KERNEL_MODE +#define ASSERT(x) NT_ASSERT(x) + +#endif +#include "rtl/KWaitEvent.h" +#include "rtl/KPushLock.h" + +#define ENL_MAX_PROC_COUNT 16 +#define ENLP_PORT_COUNT 2 + +#define TX TRUE +#define RX FALSE + +enum ENL_QUEUE_STATE { + Stopped, + Started + }; + +typedef +VOID +(ENL_INTERRUPT_ROUTINE) ( + _Inout_ PVOID PortContext, + _In_ bool TxRx + ); + +struct ENLP_LINK; +struct DECLSPEC_ALIGN(PAGE_SIZE) ENLP_PORT; +struct ENLP_QUEUE; + +typedef NTSTATUS(EVT_ENLP_PDO_WAKE_SIGNAL)(_In_ void* Context); + +_IRQL_requires_max_(PASSIVE_LEVEL) +ENLP_QUEUE * +EnlCreateQueue( + _In_ NETPACKETQUEUE Queue, + _In_ BOOLEAN Tx + ); + +_IRQL_requires_max_(PASSIVE_LEVEL) +VOID +EnlDestroyQueue( + _In_ ENLP_QUEUE * QueueContext, + _In_ BOOLEAN Tx + ); + +_IRQL_requires_max_(PASSIVE_LEVEL) +VOID +EnlRingDoorBell( + _In_ ENLP_QUEUE * QueueContext, + _In_ ULONG EndIndex + ); + +_IRQL_requires_max_(PASSIVE_LEVEL) +VOID +EnlArmInterrupt( + _In_ ENLP_QUEUE * QueueContext, + _In_ BOOLEAN NotificationEnabled + ); + +_IRQL_requires_max_(PASSIVE_LEVEL) +void +EnlSetPdoWakeSignalCallback( + _In_ ENLP_LINK * EnlLinkHandle, + _In_ EVT_ENLP_PDO_WAKE_SIGNAL* evtPdoWakeSignal, + _In_ void* Context + ); + +_IRQL_requires_max_(PASSIVE_LEVEL) +void +EnlArmWake( + _In_ ENLP_LINK * EnlLinkHandle + ); + +_IRQL_requires_max_(PASSIVE_LEVEL) +void +EnlDisarmWake( + _In_ ENLP_LINK * EnlLinkHandle + ); + +_IRQL_requires_max_(PASSIVE_LEVEL) +size_t +EnlCopyWakeFrame( + _In_ ENLP_LINK * EnlLinkHandle, + _Out_writes_bytes_(BufferSize) unsigned char * Buffer, + _In_ size_t BufferSize + ); + +_IRQL_requires_max_(PASSIVE_LEVEL) +BOOLEAN +EnlIsLinkActive( + _In_ ENLP_LINK * EnlLinkHandle + ); + +_IRQL_requires_max_(PASSIVE_LEVEL) +VOID +EnlIndicateQueueState( + _In_ ENLP_QUEUE * EnlLinkHandle, + _In_ ENL_QUEUE_STATE State + ); + +/////////////////////////////////////////////////////////////////////////////// +// Multi link wrapper APIs // +/////////////////////////////////////////////////////////////////////////////// + +#define ENL_MLINK_MAX 4 + +typedef struct +{ + _Field_range_(1, ENL_MLINK_MAX) ULONG LinkCount; + _Field_size_(LinkCount) ENLP_LINK * LinkHandle[ENL_MLINK_MAX]; +} ENL_MLINK; + +_IRQL_requires_max_(PASSIVE_LEVEL) +NTSTATUS +EnlMCreateLink( + _In_range_(1, ENL_MLINK_MAX)ULONG LinkCount, + _In_reads_(LinkCount) ULONG ProcessorIndex, + _In_ BOOLEAN Poll, + _Out_ ENL_MLINK* EnlMLink + ); + +_IRQL_requires_max_(PASSIVE_LEVEL) +BOOLEAN +EnlMIsPortActive( + _In_ CONST ENL_MLINK* EnlMLink, + _In_ ULONG PortIndex + ); + +_IRQL_requires_max_(PASSIVE_LEVEL) +NTSTATUS +EnlMActivateLinkPort( + _In_ CONST ENL_MLINK* EnlMLink, + _In_ ULONG PortIndex, + _In_ ENL_INTERRUPT_ROUTINE Interrupt, + _In_ PVOID PortContext + ); + +_IRQL_requires_max_(PASSIVE_LEVEL) +void +EnlMDeactivateLinkPort( + _In_ CONST ENL_MLINK* EnlMLink, + _In_ ULONG PortIndex + ); + +_IRQL_requires_max_(PASSIVE_LEVEL) +VOID +EnlMCloseLink( + _Inout_ ENL_MLINK* EnlMLink + ); + +#define ENL_MAXIMUM_WAKE_FRAME_SIZE 1514 + +typedef +_IRQL_requires_max_(PASSIVE_LEVEL) +VOID +(ENLP_ITERATION_ROUTINE) ( + _In_ PVOID IterationContext + ); + +struct ENLP_THREAD_STATE +{ + BOOLEAN PauseRequested{}; + BOOLEAN StopRequested{}; + ENLP_ITERATION_ROUTINE* IterationRoutine{}; + PVOID IterationContext{}; + KAutoEvent *ArmWaitEvent{}; + KAutoEvent ResumeEvent{}; + KAutoEvent PausingEvent{}; + ULONG ProcIndex{}; + ULONG IdealNode{}; + unique_thread Thread{}; +}; + +class NetvQueue; +class NetvRxQueue; +class NetvTxQueue; + +struct ENLP_QUEUE +{ + BOOLEAN TxRx{}; + BOOLEAN Notify{}; + ULONG QueueEnd{}; + ULONG QueueNext{}; + + ENLP_PORT * EnlPortHandle{}; + + BOOLEAN Armed{}; + WDFSPINLOCK Spinlock{}; + KAutoEvent *ArmWaitEvent{}; + + ENL_QUEUE_STATE State{}; + + NetvQueue * Queue{nullptr}; + union { + NetvRxQueue * RxQueue; + NetvTxQueue * TxQueue; + }; + +}; + +struct DECLSPEC_ALIGN(PAGE_SIZE) ENLP_PORT +{ + ENL_INTERRUPT_ROUTINE* Interrupt; + PVOID PortContext; + ULONG TxQueueCount; + ULONG RxQueueCount; + + DECLSPEC_CACHEALIGN + ENLP_QUEUE TxQueue[ENL_MAX_PROC_COUNT]; + + DECLSPEC_CACHEALIGN + ENLP_QUEUE RxQueue[ENL_MAX_PROC_COUNT]; +}; + +struct ENLP_LINK +{ + KPushLock Lock{}; + ULONG64 Ts{}; + ULONG64 BusyTicks{}; + ULONG64 EmptyTicks{}; + BOOLEAN Poll{}; + BOOLEAN InitializePacketLayout{}; + + // + // Power related features. If PowerInterface is NULL none of the other + // fields have meaning + // + EVT_ENLP_PDO_WAKE_SIGNAL* EvtWakeSignal; + void* WakeSignalContext; + BOOLEAN ArmedForWake{}; + unsigned char WakeFrame[ENL_MAXIMUM_WAKE_FRAME_SIZE]; + size_t WakeFrameSize{}; + + KAutoEvent ArmWaitEvent{}; + ENLP_THREAD_STATE EnlThread{}; + ENLP_PORT Ports[ENLP_PORT_COUNT]; +}; +#define MAX_ADAPTER_COUNT 2 +extern ENL_MLINK NetvEnlMLink[MAX_ADAPTER_COUNT / 2]; +C_ASSERT((ENLP_PORT_COUNT & 0x1) == 0); diff --git a/network/netadaptercx/netvadapterlibrary/code/enlthreads.cpp b/network/netadaptercx/netvadapterlibrary/code/enlthreads.cpp new file mode 100644 index 000000000..ffe70d6e7 --- /dev/null +++ b/network/netadaptercx/netvadapterlibrary/code/enlthreads.cpp @@ -0,0 +1,136 @@ +// Copyright (C) Microsoft Corporation. All rights reserved. +#include "pch.hpp" +//#include <ntassert.h> +#include "enlthreads.h" + +#ifdef _KERNEL_MODE +unique_thread::operator bool( + void +) const +{ + return !!NtHandle; +} + +void unique_thread::reset( +) +{ + NtHandle.reset(); + ObHandle.reset(); +} +#endif + +ENL_THREAD +EnlGetCurrentThread( + void +) +{ +#ifdef _KERNEL_MODE + return KeGetCurrentThread(); +#else + return GetCurrentThreadId(); +#endif +} + +_Use_decl_annotations_ +NTSTATUS +EnlThreadCreate( + ENL_START_ROUTINE StartRoutine, + void * Context, + unique_thread & Thread +) +{ +#ifdef _KERNEL_MODE + + unique_zw_handle ntHandle; + unique_pkthread obHandle; + + auto const ntStatus = PsCreateSystemThread( + &ntHandle, + THREAD_ALL_ACCESS, + nullptr, + nullptr, + nullptr, + StartRoutine, + Context); + + if (ntStatus != STATUS_SUCCESS) + { + return ntStatus; + } + + NT_FRE_ASSERT( + NT_SUCCESS( + ObReferenceObjectByHandle( + ntHandle.get(), + THREAD_ALL_ACCESS, + nullptr, + KernelMode, + reinterpret_cast<void **>(&obHandle), + nullptr))); + + Thread.NtHandle = wistd::move(ntHandle); + Thread.ObHandle = wistd::move(obHandle); + +#else + wil::unique_handle thread{ CreateThread(nullptr, 0, StartRoutine, Context, 0, nullptr) }; + + if (!thread) + { + return NTSTATUS_FROM_WIN32(GetLastError()); + } + + Thread = wistd::move(thread); +#endif + + return STATUS_SUCCESS; +} + +void +EnlThreadSetPriority( + unique_thread & Thread, + ENL_THREAD_PRIORITY Priority +) +{ +#ifdef _KERNEL_MODE + // KeSetBasePriorityThread does not take the actual priority, but an increment + // to be added to the current base priority. Calculate this value. + auto const increment = Priority - (LOW_REALTIME_PRIORITY + LOW_PRIORITY) / 2; + KeSetBasePriorityThread(Thread.ObHandle.get(), increment); +#else + SetThreadPriority(Thread.get(), Priority); +#endif +} + +_Use_decl_annotations_ +void +EnlThreadSetAffinity( + PGROUP_AFFINITY GroupAffinity, + PGROUP_AFFINITY PreviousAffinity +) +{ +#ifdef _KERNEL_MODE + KeSetSystemGroupAffinityThread(GroupAffinity, PreviousAffinity); +#else + SetThreadGroupAffinity(GetCurrentThread(), GroupAffinity, PreviousAffinity); +#endif +} + +_Use_decl_annotations_ +void +EnlThreadWaitForTermination( + unique_thread & Thread +) +{ +#ifdef _KERNEL_MODE + KeWaitForSingleObject( + Thread.ObHandle.get(), + KWAIT_REASON::Executive, + KernelMode, + FALSE, + nullptr); +#else + WaitForSingleObject( + Thread.get(), + INFINITE); +#endif +} diff --git a/network/netadaptercx/netvadapterlibrary/code/enlthreads.h b/network/netadaptercx/netvadapterlibrary/code/enlthreads.h new file mode 100644 index 000000000..062d728e1 --- /dev/null +++ b/network/netadaptercx/netvadapterlibrary/code/enlthreads.h @@ -0,0 +1,119 @@ +// Copyright (C) Microsoft Corporation. All rights reserved. +#pragma once + +#include <wil/resource.h> +// #include <KMacros.h> + +#ifdef _KERNEL_MODE + using ENL_START_ROUTINE = KSTART_ROUTINE; + using ENL_THREAD_ROUTINE_RETURN = VOID; + using ENL_THREAD = PKTHREAD; + // static const EC_THREAD EC_THREAD_INVALID = nullptr; + using ENL_THREAD_PRIORITY = LONG; + // #define EC_INVALID_THREAD_PRIORITY MAXLONG + + using unique_zw_handle = wil::unique_any<HANDLE, decltype(&::ZwClose), &::ZwClose>; + using unique_pkthread = wil::unique_any<PKTHREAD, decltype(&ObfDereferenceObject), &ObfDereferenceObject>; + using unique_pkevent = wil::unique_any<PKEVENT, decltype(&ObfDereferenceObject), &ObfDereferenceObject>; + using unique_completionport = wil::unique_any<void *, decltype(&ObfDereferenceObject), &ObfDereferenceObject>; + + struct unique_thread + { + unique_zw_handle + NtHandle; + + unique_pkthread + ObHandle; + + operator bool( + void + ) const; + + void reset( + ); + }; +#else + +#ifndef NOTHING +#define NOTHING +#endif + +#ifndef AFFINITY_MASK +#define AFFINITY_MASK(n) ((KAFFINITY)1 << (n)) +#endif + +typedef struct _NDTBUS_POWER_INTERFACE_STANDARD +{ +} NDTBUS_POWER_INTERFACE_STANDARD; + +_IRQL_requires_same_ +typedef DWORD (WINAPI ENL_START_ROUTINE)( + LPVOID lpThreadParameter +); +using ENL_THREAD_ROUTINE_RETURN = DWORD; +using ENL_THREAD = DWORD; +// static const EC_THREAD EC_THREAD_INVALID = 0; +using ENL_THREAD_PRIORITY = int; +// #define EC_INVALID_THREAD_PRIORITY THREAD_PRIORITY_ERROR_RETURN +using unique_thread = wil::unique_handle; + +#define KeGetProcessorIndexFromNumber(_processor) (_processor)->Number +#define KeMemoryBarrier() MemoryBarrier() + +inline +NTSTATUS +KeGetProcessorNumberFromIndex ( + _In_ ULONG ProcIndex, + _Out_ PPROCESSOR_NUMBER ProcNumber + ) +{ + ProcNumber->Number = static_cast<UCHAR>(ProcIndex); + ProcNumber->Group = 0; + ProcNumber->Reserved = 0; + + return STATUS_SUCCESS; +} + +inline +VOID +KeQueryNodeActiveAffinity ( + __in USHORT NodeNumber, + __out_opt PGROUP_AFFINITY Affinity, + __out_opt PUSHORT Count +) +{ + UNREFERENCED_PARAMETER(NodeNumber); + UNREFERENCED_PARAMETER(Count); + + GetThreadGroupAffinity(GetCurrentThread(), Affinity); +} +#endif + +ENL_THREAD +EnlGetCurrentThread( + void +); + +NTSTATUS +EnlThreadCreate( + _In_ ENL_START_ROUTINE StartRoutine, + _In_opt_ void * Context, + _Out_ unique_thread & Thread +); + +void +EnlThreadSetPriority( + _In_ unique_thread & Thread, + _In_ ENL_THREAD_PRIORITY Priority +); + +void +EnlThreadSetAffinity( + _In_ PGROUP_AFFINITY GroupAffinity, + _Out_opt_ PGROUP_AFFINITY PreviousAffinity +); + +void +EnlThreadWaitForTermination( + _In_ unique_thread & Thread +); diff --git a/network/netadaptercx/netvadapterlibrary/code/memory.cpp b/network/netadaptercx/netvadapterlibrary/code/memory.cpp new file mode 100644 index 000000000..35a3f2c5e --- /dev/null +++ b/network/netadaptercx/netvadapterlibrary/code/memory.cpp @@ -0,0 +1,11 @@ +// Copyright (C) Microsoft Corporation. All rights reserved. +#include "pch.hpp" +#include "memory.h" +#include "memory.tmh" + +// for wil::make_unique_nothrow +void* +operator new(size_t s, std::nothrow_t const&) +{ + return operator new(s); +} \ No newline at end of file diff --git a/network/netadaptercx/netvadapterlibrary/code/memory.h b/network/netadaptercx/netvadapterlibrary/code/memory.h new file mode 100644 index 000000000..1200c72c5 --- /dev/null +++ b/network/netadaptercx/netvadapterlibrary/code/memory.h @@ -0,0 +1,4 @@ +// Copyright (C) Microsoft Corporation. All rights reserved. +#pragma once + +#define MAX_RX_BUFFER_SIZE 65535 diff --git a/network/netadaptercx/netvadapterlibrary/code/net/netpacketlibrary.h b/network/netadaptercx/netvadapterlibrary/code/net/netpacketlibrary.h new file mode 100644 index 000000000..b5e345180 --- /dev/null +++ b/network/netadaptercx/netvadapterlibrary/code/net/netpacketlibrary.h @@ -0,0 +1,85 @@ +// Copyright (C) Microsoft Corporation. All rights reserved. + +#pragma once + +#include <net/virtualaddress.h> + +// +// Following are some helper APIs for common ring manipulations. +// They are all implemented using iterator +// + +inline +SIZE_T +GetTxPacketDataLength( + _In_ NET_RING_PACKET_ITERATOR const* Iterator +) +{ + SIZE_T length = 0; + + for (NET_RING_FRAGMENT_ITERATOR fi = NetPacketIteratorGetFragments(Iterator); + NetFragmentIteratorHasAny(&fi); + NetFragmentIteratorAdvance(&fi)) + { + NET_FRAGMENT* fragment = NetFragmentIteratorGetFragment(&fi); + length += (SIZE_T)fragment->ValidLength; + } + + return length; +} + +inline +VOID +CompleteTxPacketsBatch( + _In_ NET_RING_COLLECTION const* Rings, + _In_ UINT32 BatchSize +) +{ + UINT32 packetCount = 0; + + NET_RING_PACKET_ITERATOR pi = NetRingGetDrainPackets(Rings); + + while (NetPacketIteratorHasAny(&pi)) + { + NET_PACKET* packet = NetPacketIteratorGetPacket(&pi); + + // this function uses Scratch field as the bit for testing completion + if (!packet->Scratch) + { + break; + } + + packetCount++; + + NET_RING_FRAGMENT_ITERATOR fi = NetPacketIteratorGetFragments(&pi); + NetFragmentIteratorAdvanceToTheEnd(&fi); + + NetPacketIteratorAdvance(&pi); + + if (packetCount >= BatchSize) + { + NetPacketIteratorSet(&pi); + Rings->Rings[NetRingTypeFragment]->BeginIndex = NetFragmentIteratorGetIndex(&fi); + } + } +} + +inline +void +CancelRxPackets( + _In_ NET_RING_COLLECTION const* Rings +) +{ + NET_RING_PACKET_ITERATOR pi = NetRingGetAllPackets(Rings); + + for (; NetPacketIteratorHasAny(&pi); NetPacketIteratorAdvance(&pi)) + { + NetPacketIteratorGetPacket(&pi)->Ignore = 1; + } + + NetPacketIteratorSet(&pi); + + NET_RING_FRAGMENT_ITERATOR fi = NetRingGetAllFragments(Rings); + NetFragmentIteratorAdvanceToTheEnd(&fi); + NetFragmentIteratorSet(&fi); +} diff --git a/network/netadaptercx/netvadapterlibrary/code/net/netringiterator.h b/network/netadaptercx/netvadapterlibrary/code/net/netringiterator.h new file mode 100644 index 000000000..fb010751a --- /dev/null +++ b/network/netadaptercx/netvadapterlibrary/code/net/netringiterator.h @@ -0,0 +1,281 @@ +// Copyright (C) Microsoft Corporation. All rights reserved. + +#pragma once + +#include <net/ringcollection.h> + +typedef struct _NET_RING_ITERATOR +{ + + NET_RING_COLLECTION const* + Rings; + + UINT32* const + IndexToSet; + + UINT32 + Index; + + UINT32 const + End; + +} NET_RING_ITERATOR; + +typedef struct _NET_RING_PACKET_ITERATOR +{ + + NET_RING_ITERATOR + Iterator; + +} NET_RING_PACKET_ITERATOR; + +typedef struct _NET_RING_FRAGMENT_ITERATOR +{ + + NET_RING_ITERATOR + Iterator; + +} NET_RING_FRAGMENT_ITERATOR; + + +inline +NET_RING_PACKET_ITERATOR +NetRingGetPostPackets( + _In_ NET_RING_COLLECTION const* Rings +) +{ + NET_RING* ring = Rings->Rings[NetRingTypePacket]; + NET_RING_PACKET_ITERATOR iterator = { + Rings, &ring->NextIndex, ring->NextIndex, ring->EndIndex, + }; + + return iterator; +} + +inline +NET_RING_PACKET_ITERATOR +NetRingGetDrainPackets( + _In_ NET_RING_COLLECTION const* Rings +) +{ + NET_RING* ring = Rings->Rings[NetRingTypePacket]; + NET_RING_PACKET_ITERATOR iterator = { + Rings, &ring->BeginIndex, ring->BeginIndex, ring->NextIndex, + }; + + return iterator; +} + +inline +NET_RING_PACKET_ITERATOR +NetRingGetAllPackets( + _In_ NET_RING_COLLECTION const* Rings +) +{ + NET_RING* ring = Rings->Rings[NetRingTypePacket]; + NET_RING_PACKET_ITERATOR iterator = { + Rings, &ring->BeginIndex, ring->BeginIndex, ring->EndIndex, + }; + + return iterator; +} + +inline +NET_PACKET* +NetPacketIteratorGetPacket( + _In_ NET_RING_PACKET_ITERATOR const* Iterator +) +{ + return NetRingGetPacketAtIndex( + Iterator->Iterator.Rings->Rings[NetRingTypePacket], + Iterator->Iterator.Index); +} + +inline +UINT32 +NetPacketIteratorGetIndex( + _In_ NET_RING_PACKET_ITERATOR const* Iterator +) +{ + return Iterator->Iterator.Index; +} + +inline +BOOLEAN +NetPacketIteratorHasAny( + _In_ NET_RING_PACKET_ITERATOR const* Iterator +) +{ + return Iterator->Iterator.Index != Iterator->Iterator.End; +} + +inline +UINT32 +NetPacketIteratorGetCount( + _In_ NET_RING_PACKET_ITERATOR const* Iterator +) +{ + NET_RING const* ring = Iterator->Iterator.Rings->Rings[NetRingTypePacket]; + + return (Iterator->Iterator.End - Iterator->Iterator.Index) & ring->ElementIndexMask; +} + +inline +void +NetPacketIteratorAdvance( + _In_ NET_RING_PACKET_ITERATOR* Iterator +) +{ + Iterator->Iterator.Index = NetRingIncrementIndex( + Iterator->Iterator.Rings->Rings[NetRingTypePacket], + Iterator->Iterator.Index); +} + +inline +void +NetPacketIteratorAdvanceToTheEnd( + _In_ NET_RING_PACKET_ITERATOR* Iterator +) +{ + Iterator->Iterator.Index = Iterator->Iterator.End; +} + +inline +void +NetPacketIteratorSet( + _In_ NET_RING_PACKET_ITERATOR const* Iterator +) +{ + *Iterator->Iterator.IndexToSet + = Iterator->Iterator.Index; +} + + +inline +NET_RING_FRAGMENT_ITERATOR +NetPacketIteratorGetFragments( + _In_ NET_RING_PACKET_ITERATOR const* Iterator +) +{ + NET_RING const* ring = Iterator->Iterator.Rings->Rings[NetRingTypeFragment]; + NET_PACKET const* packet = NetPacketIteratorGetPacket(Iterator); + UINT32 const end = NetRingIncrementIndex(ring, + packet->FragmentIndex + packet->FragmentCount - 1); + NET_RING_FRAGMENT_ITERATOR iterator = { + Iterator->Iterator.Rings, NULL, packet->FragmentIndex, end, + }; + + return iterator; +} + +inline +NET_RING_FRAGMENT_ITERATOR +NetRingGetPostFragments( + _In_ NET_RING_COLLECTION const* Rings +) +{ + NET_RING* ring = Rings->Rings[NetRingTypeFragment]; + NET_RING_FRAGMENT_ITERATOR iterator = { + Rings, &ring->NextIndex, ring->NextIndex, ring->EndIndex, + }; + + return iterator; +} + +inline +NET_RING_FRAGMENT_ITERATOR +NetRingGetDrainFragments( + _In_ NET_RING_COLLECTION const* Rings +) +{ + NET_RING* ring = Rings->Rings[NetRingTypeFragment]; + NET_RING_FRAGMENT_ITERATOR iterator = { + Rings, &ring->BeginIndex, ring->BeginIndex, ring->NextIndex, + }; + + return iterator; +} + +inline +NET_RING_FRAGMENT_ITERATOR +NetRingGetAllFragments( + _In_ NET_RING_COLLECTION const* Rings +) +{ + NET_RING* ring = Rings->Rings[NetRingTypeFragment]; + NET_RING_FRAGMENT_ITERATOR iterator = { + Rings, &ring->BeginIndex, ring->BeginIndex, ring->EndIndex, + }; + + return iterator; +} + +inline +NET_FRAGMENT* +NetFragmentIteratorGetFragment( + _In_ NET_RING_FRAGMENT_ITERATOR const* Iterator +) +{ + return NetRingGetFragmentAtIndex( + Iterator->Iterator.Rings->Rings[NetRingTypeFragment], + Iterator->Iterator.Index); +} + +inline +UINT32 +NetFragmentIteratorGetIndex( + _In_ NET_RING_FRAGMENT_ITERATOR const* Iterator +) +{ + return Iterator->Iterator.Index; +} + +inline +BOOLEAN +NetFragmentIteratorHasAny( + _In_ NET_RING_FRAGMENT_ITERATOR const* Iterator +) +{ + return Iterator->Iterator.Index != Iterator->Iterator.End; +} + +inline +UINT32 +NetFragmentIteratorGetCount( + _In_ NET_RING_FRAGMENT_ITERATOR const* Iterator +) +{ + NET_RING const* ring = Iterator->Iterator.Rings->Rings[NetRingTypeFragment]; + + return (Iterator->Iterator.End - Iterator->Iterator.Index) & ring->ElementIndexMask; +} + +inline +void +NetFragmentIteratorAdvance( + _In_ NET_RING_FRAGMENT_ITERATOR* Iterator +) +{ + Iterator->Iterator.Index = NetRingIncrementIndex( + Iterator->Iterator.Rings->Rings[NetRingTypeFragment], + Iterator->Iterator.Index); +} + +inline +void +NetFragmentIteratorAdvanceToTheEnd( + _In_ NET_RING_FRAGMENT_ITERATOR* Iterator +) +{ + Iterator->Iterator.Index = Iterator->Iterator.End; +} + +inline +void +NetFragmentIteratorSet( + _In_ NET_RING_FRAGMENT_ITERATOR const* Iterator +) +{ + *(Iterator->Iterator.IndexToSet) + = Iterator->Iterator.Index; +} diff --git a/network/netadaptercx/netvadapterlibrary/code/net/umxfilter.h b/network/netadaptercx/netvadapterlibrary/code/net/umxfilter.h new file mode 100644 index 000000000..a6a019e4c --- /dev/null +++ b/network/netadaptercx/netvadapterlibrary/code/net/umxfilter.h @@ -0,0 +1,268 @@ +/*++ + +Copyright (c) Microsoft Corporation. All rights reserved. + +Module Name: + + xfilter.h + +Abstract: + + Header file for the address filtering library for NDIS MAC's. + +Author: + +Environment: + +Notes: + + None. + +Revision History: + +--*/ + +#ifndef _X_FILTER_DEFS_ +#define _X_FILTER_DEFS_ + +#pragma once + +#define ETH_LENGTH_OF_ADDRESS 6 + + +// +// ZZZ This is a little-endian specific check. +// +#define ETH_IS_MULTICAST(Address) \ + (BOOLEAN)(((PUCHAR)(Address))[0] & ((UCHAR)0x01)) + + +// +// Check whether an address is broadcast. +// +#define ETH_IS_BROADCAST(Address) \ + ((((PUCHAR)(Address))[0] == ((UCHAR)0xff)) && (((PUCHAR)(Address))[1] == ((UCHAR)0xff)) && (((PUCHAR)(Address))[2] == ((UCHAR)0xff)) && (((PUCHAR)(Address))[3] == ((UCHAR)0xff)) && (((PUCHAR)(Address))[4] == ((UCHAR)0xff)) && (((PUCHAR)(Address))[5] == ((UCHAR)0xff))) + + +// +// This macro will compare network addresses. +// +// A - Is a network address. +// +// B - Is a network address. +// +// Result - The result of comparing two network address. +// +// Result < 0 Implies the B address is greater. +// Result > 0 Implies the A element is greater. +// Result = 0 Implies equality. +// +// Note that this is an arbitrary ordering. There is not +// defined relation on network addresses. This is ad-hoc! +// +// +#define ETH_COMPARE_NETWORK_ADDRESSES(_A, _B, _Result) \ +{ \ + if (*(ULONG UNALIGNED *)&(_A)[2] > \ + *(ULONG UNALIGNED *)&(_B)[2]) \ + { \ + *(_Result) = 1; \ + } \ + else if (*(ULONG UNALIGNED *)&(_A)[2] < \ + *(ULONG UNALIGNED *)&(_B)[2]) \ + { \ + *(_Result) = (UINT)-1; \ + } \ + else if (*(USHORT UNALIGNED *)(_A) > \ + *(USHORT UNALIGNED *)(_B)) \ + { \ + *(_Result) = 1; \ + } \ + else if (*(USHORT UNALIGNED *)(_A) < \ + *(USHORT UNALIGNED *)(_B)) \ + { \ + *(_Result) = (UINT)-1; \ + } \ + else \ + { \ + *(_Result) = 0; \ + } \ +} + +// +// This macro will compare network addresses. +// +// A - Is a network address. +// +// B - Is a network address. +// +// Result - The result of comparing two network address. +// +// Result != 0 Implies inequality. +// Result == 0 Implies equality. +// +// +#define ETH_COMPARE_NETWORK_ADDRESSES_EQ(_A,_B, _Result) \ +{ \ + if ((*(ULONG UNALIGNED *)&(_A)[2] == \ + *(ULONG UNALIGNED *)&(_B)[2]) && \ + (*(USHORT UNALIGNED *)(_A) == \ + *(USHORT UNALIGNED *)(_B))) \ + { \ + *(_Result) = 0; \ + } \ + else \ + { \ + *(_Result) = 1; \ + } \ +} + + +// +// This macro is used to copy from one network address to +// another. +// +#define ETH_COPY_NETWORK_ADDRESS(_D, _S) \ +{ \ + *((ULONG UNALIGNED *)(_D)) = *((ULONG UNALIGNED *)(_S)); \ + *((USHORT UNALIGNED *)((UCHAR *)(_D)+4)) = *((USHORT UNALIGNED *)((UCHAR *)(_S)+4)); \ +} + +#define TR_LENGTH_OF_FUNCTIONAL 4 +#define TR_LENGTH_OF_ADDRESS 6 + + +// +// Only the low 32 bits of the functional/group address +// are needed since the upper 16 bits is always c0-00. +// +typedef ULONG TR_FUNCTIONAL_ADDRESS; +typedef ULONG TR_GROUP_ADDRESS; + + +#define TR_IS_NOT_DIRECTED(_Address, _Result) \ +{ \ + *(_Result) = (BOOLEAN)((_Address)[0] & 0x80); \ +} + +#define TR_IS_FUNCTIONAL(_Address, _Result) \ +{ \ + *(_Result) = (BOOLEAN)(((_Address)[0] & 0x80) && \ + !((_Address)[2] & 0x80)); \ +} + +// +// +#define TR_IS_GROUP(_Address, _Result) \ +{ \ + *(_Result) = (BOOLEAN)((_Address)[0] & (_Address)[2] & 0x80); \ +} + +// +// +#define TR_IS_SOURCE_ROUTING(_Address, _Result) \ +{ \ + *(_Result) = (BOOLEAN)((_Address)[0] & 0x80); \ +} + +// +// Check for NDIS_PACKET_TYPE_MAC_FRAME +// +#define TR_IS_MAC_FRAME(_PacketHeader) ((((PUCHAR)_PacketHeader)[1] & 0xFC) == 0) + + +// +// Check whether an address is broadcast. This is a little-endian check. +// +#define TR_IS_BROADCAST(_Address, _Result) \ +{ \ + *(_Result) = (BOOLEAN)(((*(UNALIGNED USHORT *)&(_Address)[0] == 0xFFFF) || \ + (*(UNALIGNED USHORT *)&(_Address)[0] == 0x00C0)) && \ + (*(UNALIGNED ULONG *)&(_Address)[2] == 0xFFFFFFFF));\ +} + + +// +// This macro will compare network addresses. +// +// A - Is a network address. +// +// B - Is a network address. +// +// Result - The result of comparing two network address. +// +// Result < 0 Implies the B address is greater. +// Result > 0 Implies the A element is greater. +// Result = 0 Implies equality. +// +// Note that this is an arbitrary ordering. There is not +// defined relation on network addresses. This is ad-hoc! +// +// +#define TR_COMPARE_NETWORK_ADDRESSES(_A, _B, _Result) \ +{ \ + if (*(ULONG UNALIGNED *)&(_A)[2] > \ + *(ULONG UNALIGNED *)&(_B)[2]) \ + { \ + *(_Result) = 1; \ + } \ + else if (*(ULONG UNALIGNED *)&(_A)[2] < \ + *(ULONG UNALIGNED *)&(_B)[2]) \ + { \ + *(_Result) = (UINT)-1; \ + } \ + else if (*(USHORT UNALIGNED *)(_A) > \ + *(USHORT UNALIGNED *)(_B)) \ + { \ + *(_Result) = 1; \ + } \ + else if (*(USHORT UNALIGNED *)(_A) < \ + *(USHORT UNALIGNED *)(_B)) \ + { \ + *(_Result) = (UINT)-1; \ + } \ + else \ + { \ + *(_Result) = 0; \ + } \ +} + +// +// This macro will compare network addresses. +// +// A - Is a network address. +// +// B - Is a network address. +// +// Result - The result of comparing two network address. +// +// Result != 0 Implies inequality. +// Result == 0 Implies equality. +// +// +#define TR_COMPARE_NETWORK_ADDRESSES_EQ(_A, _B, _Result) \ +{ \ + if ((*(ULONG UNALIGNED *)&(_A)[2] == *(ULONG UNALIGNED *)&(_B)[2]) && \ + (*(USHORT UNALIGNED *)&(_A)[0] == *(USHORT UNALIGNED *)&(_B)[0])) \ + { \ + *(_Result) = 0; \ + } \ + else \ + { \ + *(_Result) = 1; \ + } \ +} + + +// +// This macro is used to copy from one network address to +// another. +// +#define TR_COPY_NETWORK_ADDRESS(_D, _S) \ +{ \ + *((ULONG UNALIGNED *)(_D)) = *((ULONG UNALIGNED *)(_S)); \ + *((USHORT UNALIGNED *)((UCHAR *)(_D)+4)) = \ + *((USHORT UNALIGNED *)((UCHAR *)(_S)+4)); \ +} + +#endif // _X_FILTER_DEFS_ diff --git a/network/netadaptercx/netvadapterlibrary/code/pch.hpp b/network/netadaptercx/netvadapterlibrary/code/pch.hpp new file mode 100644 index 000000000..cf2f0f22e --- /dev/null +++ b/network/netadaptercx/netvadapterlibrary/code/pch.hpp @@ -0,0 +1,34 @@ +// Copyright (c) Microsoft Corporation. All rights reserved +#pragma once + +#include <initguid.h> + +#ifndef _KERNEL_MODE +// This is a user-mode driver +#include <windows.h> + +#else +// This is a kernel-mode driver +#include <ntddk.h> +#define NTSTRSAFE_LIB +#include <ntstrsafe.h> +#endif + +// This is a common WDF header (for both KMDF and UMDF) +#include <wdf.h> + +#include <netadaptercx.h> +//#include <wdftriage.h> +#include "net/netringiterator.h" +#include "net/netpacketlibrary.h" +#include <net/rsc.h> +#include <net/gso.h> +#include <net/checksum.h> +#include <net/databuffer.h> +#include <net/returncontext.h> + +#include "enlthreads.h" +#include "enl.h" + +#include "trace.h" + diff --git a/network/netadaptercx/netvadapterlibrary/code/queue.cpp b/network/netadaptercx/netvadapterlibrary/code/queue.cpp new file mode 100644 index 000000000..667d59f7b --- /dev/null +++ b/network/netadaptercx/netvadapterlibrary/code/queue.cpp @@ -0,0 +1,34 @@ +// Copyright (c) Microsoft Corporation. All rights reserved + +#include "pch.hpp" + +#include <net/ringcollection.h> + +#include "queue.h" + +NetvQueue::NetvQueue( + NETPACKETQUEUE Handle, + NetvAdapter & Adapter, + NET_RING_COLLECTION const * Rings +) + : m_handle{Handle} + , m_adapter{Adapter} + , m_rings{Rings} +{ +} + +NET_RING * +NetvQueue::GetPacketRing( + void +) +{ + return NetRingCollectionGetPacketRing(m_rings); +} + +NET_RING * +NetvQueue::GetFragmentRing( + void +) +{ + return NetRingCollectionGetFragmentRing(m_rings); +} diff --git a/network/netadaptercx/netvadapterlibrary/code/queue.h b/network/netadaptercx/netvadapterlibrary/code/queue.h new file mode 100644 index 000000000..becb72ce4 --- /dev/null +++ b/network/netadaptercx/netvadapterlibrary/code/queue.h @@ -0,0 +1,41 @@ +// Copyright (c) Microsoft Corporation. All rights reserved + +#pragma once + +class NetvAdapter; +struct ENLP_QUEUE; + +class NetvQueue +{ + +public: + + NetvQueue( + NETPACKETQUEUE Handle, + NetvAdapter & Adapter, + NET_RING_COLLECTION const * Rings + ); + + NET_RING * + GetPacketRing( + void + ); + + NET_RING * + GetFragmentRing( + void + ); + + NETPACKETQUEUE const + m_handle{WDF_NO_HANDLE}; + + NetvAdapter & + m_adapter; + + NET_RING_COLLECTION const * + m_rings; + + ENLP_QUEUE * + EnlQueueHandle; + +}; diff --git a/network/netadaptercx/netvadapterlibrary/code/rtl/KCriticalRegion.h b/network/netadaptercx/netvadapterlibrary/code/rtl/KCriticalRegion.h new file mode 100644 index 000000000..0bbedadb0 --- /dev/null +++ b/network/netadaptercx/netvadapterlibrary/code/rtl/KCriticalRegion.h @@ -0,0 +1,67 @@ +// Copyright (C) Microsoft Corporation. All rights reserved. +#pragma once + +#include <KMacros.h> + +class KCriticalRegion +{ +public: + + PAGED KCriticalRegion() : m_Entered(false) { } + + PAGED ~KCriticalRegion() { if (m_Entered) Leave(); } + + KCriticalRegion(KCriticalRegion &) = delete; + KCriticalRegion &operator=(KCriticalRegion &) = delete; + + PAGED void Enter() + { + ASSERT(m_Entered == false); + UnbalancedEnter(); + m_Entered = true; + } + + PAGED void Leave() + { + ASSERT(m_Entered == true); + m_Entered = false; + UnbalancedLeave(); + } + + static PAGED void UnbalancedEnter() + { +#if _KERNEL_MODE + KeEnterCriticalRegion(); +#endif + } + + static PAGED void UnbalancedLeave() + { +#if _KERNEL_MODE + KeLeaveCriticalRegion(); +#endif + } + +private: + + bool m_Entered; +}; + +struct KDefaultRegion +{ + void Enter() { } + void Leave() { } +}; + +struct KIrqlRegion +{ + KIrqlRegion() { } + ~KIrqlRegion() { } + + void Enter() { } + void Leave() { } + + KIRQL m_OldIrql; +}; + + diff --git a/network/netadaptercx/netvadapterlibrary/code/rtl/KLockHolder.h b/network/netadaptercx/netvadapterlibrary/code/rtl/KLockHolder.h new file mode 100644 index 000000000..d398f137c --- /dev/null +++ b/network/netadaptercx/netvadapterlibrary/code/rtl/KLockHolder.h @@ -0,0 +1,114 @@ +// Copyright (C) Microsoft Corporation. All rights reserved. +#pragma once + +#include <KCriticalRegion.h> +#include <KPushLock.h> + +class KRTL_CLASS KLockHolder +{ +private: + + enum { Unlocked, Shared, Exclusive } m_State; + +public: + + PAGED KLockHolder(KPushLockBase &lock) : m_Lock(lock), m_State(Unlocked) { } + PAGED ~KLockHolder() + { + switch (m_State) + { + case Shared: + ReleaseShared(); + break; + case Exclusive: + ReleaseExclusive(); + break; + } + } + + KLockHolder(KLockHolder &) = delete; + KLockHolder &operator=(KLockHolder &) = delete; + + _IRQL_requires_(PASSIVE_LEVEL) + PAGED void AcquireShared() + { + m_Region.Enter(); + ASSERT(m_State == Unlocked); + m_Lock.AcquireShared(); + m_State = Shared; + } + + _IRQL_requires_(PASSIVE_LEVEL) + PAGED void ReleaseShared() + { + ASSERT(m_State == Shared); + m_Lock.ReleaseShared(); + m_State = Unlocked; + m_Region.Leave(); + } + + _IRQL_requires_(PASSIVE_LEVEL) + PAGED void AcquireExclusive() + { + m_Region.Enter(); + ASSERT(m_State == Unlocked); + m_Lock.AcquireExclusive(); + m_State = Exclusive; + } + + _IRQL_requires_(PASSIVE_LEVEL) + PAGED void ReleaseExclusive() + { + ASSERT(m_State == Exclusive); + m_Lock.ReleaseExclusive(); + m_State = Unlocked; + m_Region.Leave(); + } + +private: + + KPushLockBase &m_Lock; + KCriticalRegion m_Region; +}; + +class KRTL_CLASS KLockThisShared : protected KLockHolder +{ +public: + + PAGED KLockThisShared(KPushLockBase &lock) : KLockHolder(lock) + { + AcquireShared(); + } + + PAGED void Acquire() + { + AcquireShared(); + } + + PAGED void Release() + { + ReleaseShared(); + } +}; + +class KRTL_CLASS KLockThisExclusive : protected KLockHolder +{ +public: + + PAGED KLockThisExclusive(KPushLockBase &lock) : KLockHolder(lock) + { + AcquireExclusive(); + } + + PAGED void Acquire() + { + AcquireExclusive(); + } + + PAGED void Release() + { + ReleaseExclusive(); + } +}; + + diff --git a/network/netadaptercx/netvadapterlibrary/code/rtl/KMacros.h b/network/netadaptercx/netvadapterlibrary/code/rtl/KMacros.h new file mode 100644 index 000000000..631c08bf4 --- /dev/null +++ b/network/netadaptercx/netvadapterlibrary/code/rtl/KMacros.h @@ -0,0 +1,84 @@ +// Copyright (C) Microsoft Corporation. All rights reserved. + +#pragma once + +#include <wil/common.h> + +#ifdef _KERNEL_MODE + +// nullptr_t is normally automatically defined by the CRT headers, but it +// doesn't get included by kernel code. +namespace std { typedef decltype(__nullptr) nullptr_t; } +using ::std::nullptr_t; + +// The stddef.h used for kernel code has the old offsetof macro. +// Let's use the new one instead. +#undef offsetof +#define offsetof(s,m) __builtin_offsetof(s,m) + +#endif // _KERNEL_MODE + +#define BEGIN_MACRO do { +#define END_MACRO } while (0) + +#ifdef _KERNEL_MODE +#define CODE_SEG(segment) __declspec(code_seg(segment)) +#else +#define CODE_SEG(segment) +#endif + +#ifndef KRTL_PAGE_SEGMENT +# define KRTL_PAGE_SEGMENT "PAGE" +#endif +#ifndef KRTL_INIT_SEGMENT +# define KRTL_INIT_SEGMENT "INIT" +#endif +#ifndef KRTL_NONPAGED_SEGMENT +# define KRTL_NONPAGED_SEGMENT ".text" +#endif + +/// Use on pageable functions. +#define PAGED CODE_SEG(KRTL_PAGE_SEGMENT) _IRQL_always_function_max_(PASSIVE_LEVEL) + +/// Use on pageable functions, where you don't want the SAL IRQL annotation to say PASSIVE_LEVEL. +#define PAGEDX CODE_SEG(KRTL_PAGE_SEGMENT) + +/// Use on code in the INIT segment. (Code is discarded after DriverEntry returns.) +#define INITCODE CODE_SEG(KRTL_INIT_SEGMENT) + +/// Use on code that must always be locked in memory. +#define NONPAGED CODE_SEG(KRTL_NONPAGED_SEGMENT) _IRQL_requires_max_(DISPATCH_LEVEL) + +/// Use on code that must always be locked in memory, where you don't want SAL IRQL annotations. +#define NONPAGEDX CODE_SEG(KRTL_NONPAGED_SEGMENT) + +#ifndef _KERNEL_MODE + +#ifndef PAGED_CODE +#define PAGED_CODE() (void)0 +#endif // PAGED_CODE + +#endif // _KERNEL_MODE + +/// Use on classes or structs. Class member functions & compiler-generated code +/// will default to the PAGE segment. You can override any member function with `NONPAGED`. +#define KRTL_CLASS CODE_SEG(KRTL_PAGE_SEGMENT) __declspec(empty_bases) + +/// Use on classes or structs. Class member functions & compiler-generated code +/// will default to the NONPAGED segment. You can override any member function with `PAGED`. +#define KRTL_CLASS_DPC_ALLOC __declspec(empty_bases) + +enum CallRunMode +{ + // This call should complete synchronously on the current thread + RunSynchronous, + // This call should return immediately, and complete the operation in a background thread + RunAsynchronous, + // This call can return immediately, OR complete synchronously + // (Use this if you're running on a workitem thread already, and you + // don't mind if the callee uses your thread to do its work, but you + // can tolerate the call completing asynchronously if the callee doesn't + // need your thread.) + RunAsynchronousButOkayToBlock, +}; + diff --git a/network/netadaptercx/netvadapterlibrary/code/rtl/KPushLock.h b/network/netadaptercx/netvadapterlibrary/code/rtl/KPushLock.h new file mode 100644 index 000000000..c589866c7 --- /dev/null +++ b/network/netadaptercx/netvadapterlibrary/code/rtl/KPushLock.h @@ -0,0 +1,147 @@ +// Copyright (C) Microsoft Corporation. All rights reserved. + +#pragma once + +#include <KMacros.h> +#include <KCriticalRegion.h> + +typedef struct _KTHREAD *PKTHREAD; +// Copyright (C) Microsoft Corporation. All rights reserved. + +class KPushLockBase +{ +public: + + KPushLockBase() = default; + KPushLockBase(KPushLockBase &) = delete; + KPushLockBase & operator=(KPushLockBase &) = delete; + + PAGED + void + KPushLockBase::AcquireShared() + { +#ifdef _KERNEL_MODE + ExAcquirePushLockShared(&m_Lock); +#else + AcquireSRWLockShared(&m_Lock); +#endif + } + + PAGED + void + KPushLockBase::ReleaseShared() + { +#ifdef _KERNEL_MODE + ExReleasePushLockShared(&m_Lock); +#else + ReleaseSRWLockShared(&m_Lock); +#endif + } + + PAGED + void + KPushLockBase::AcquireExclusive() + { +#ifdef _KERNEL_MODE + ExAcquirePushLockExclusive(&m_Lock); +#if DBG + m_ExclusiveOwner = KeGetCurrentThread(); +#endif +#else + AcquireSRWLockExclusive(&m_Lock); +#endif + + } + + PAGED + void + KPushLockBase::ReleaseExclusive() + { +#if DBG + m_ExclusiveOwner = nullptr; +#endif +#ifdef _KERNEL_MODE + ExReleasePushLockExclusive(&m_Lock); +#else + ReleaseSRWLockExclusive(&m_Lock); +#endif + } + + PAGED + void + KPushLockBase::AssertLockHeld() + { +#ifdef _KERNEL_MODE + WIN_ASSERT(m_ExclusiveOwner == KeGetCurrentThread()); +#endif + } + + PAGED + void + KPushLockBase::AssertLockNotHeld() + { +#if DBG && defined(_KERNEL_MODE) + WIN_ASSERT(m_ExclusiveOwner != KeGetCurrentThread()); +#endif + } + +protected: + + PAGED + void + KPushLockBase::InitializeInner() + { +#ifdef _KERNEL_MODE + ExInitializePushLock(&m_Lock); +#else + InitializeSRWLock(&m_Lock); +#endif +#if DBG + m_ExclusiveOwner = nullptr; +#endif + } + +private: + +#ifdef _KERNEL_MODE + EX_PUSH_LOCK m_Lock; +#else + SRWLOCK m_Lock; +#endif + +#if DBG + PKTHREAD m_ExclusiveOwner; +#endif +}; + +class KPushLock : public KPushLockBase +{ +public: + + PAGED + KPushLock::KPushLock() noexcept + { + InitializeInner(); + } + + + + PAGED + KPushLock::~KPushLock() + { + AssertLockNotHeld(); + } +}; + +class KPushLockManualConstruct : public KPushLockBase +{ +public: + + PAGED + void + KPushLockManualConstruct::Initialize() + { + InitializeInner(); + } +}; + diff --git a/network/netadaptercx/netvadapterlibrary/code/rtl/KWaitEvent.h b/network/netadaptercx/netvadapterlibrary/code/rtl/KWaitEvent.h new file mode 100644 index 000000000..124f416e7 --- /dev/null +++ b/network/netadaptercx/netvadapterlibrary/code/rtl/KWaitEvent.h @@ -0,0 +1,172 @@ +// Copyright (C) Microsoft Corporation. All rights reserved. +#pragma once + +#include <KMacros.h> + +#if _KERNEL_MODE +typedef wistd::integral_constant<EVENT_TYPE, SynchronizationEvent> auto_reset_event_t; +#else +typedef wistd::integral_constant<bool, false> auto_reset_event_t; +#endif + +#if _KERNEL_MODE +typedef wistd::integral_constant<EVENT_TYPE, NotificationEvent> manual_reset_event_t; +#else +typedef wistd::integral_constant<bool, true> manual_reset_event_t; +#endif + +#define WIN_VERIFY NT_VERIFY +#define WIN_ASSERT NT_ASSERT + +template<typename TEventType> +class KWaitEventBase +{ +public: + + KWaitEventBase() = default; + +#ifdef _KERNEL_MODE + NONPAGED ~KWaitEventBase() = default; +#else + NONPAGED ~KWaitEventBase() + { + WIN_ASSERT(m_event == nullptr); + } +#endif + + KWaitEventBase(KWaitEventBase &) = delete; + KWaitEventBase(KWaitEventBase &&) = delete; + KWaitEventBase & operator=(KWaitEventBase &) = delete; + KWaitEventBase & operator=(KWaitEventBase &&) = delete; + + _IRQL_requires_max_(DISPATCH_LEVEL) void Set() + { +#if _KERNEL_MODE + KeSetEvent(&m_event, 0, false); +#else + WIN_VERIFY(SetEvent(m_event)); +#endif + } + + _IRQL_requires_max_(DISPATCH_LEVEL) void Clear() + { +#if _KERNEL_MODE + KeClearEvent(&m_event); +#else + WIN_VERIFY(ResetEvent(m_event)); +#endif + } + + PAGED void Wait() + { +#if _KERNEL_MODE + // Not used at runtime, but might be useful during debugging + volatile LARGE_INTEGER SystemTime; + KeQuerySystemTime(const_cast<LARGE_INTEGER*>(&SystemTime)); + + NTSTATUS NtStatus = KeWaitForSingleObject( + &m_event, Executive, KernelMode, FALSE, nullptr); + NT_VERIFY(NtStatus == STATUS_SUCCESS); +#else + ULONG r = WaitForSingleObject(m_event, INFINITE); + WIN_VERIFY(r == NO_ERROR); +#endif + } + + PAGED bool Test() + { +#if _KERNEL_MODE + return !!KeReadStateEvent(&m_event); +#else + ULONG r = WaitForSingleObject(m_event, 0); + WIN_VERIFY(r == WAIT_TIMEOUT || r == WAIT_OBJECT_0); + return (r == WAIT_OBJECT_0); +#endif + } + + NONPAGED bool TestNP() + { +#if _KERNEL_MODE + return !!KeReadStateEvent(&m_event); +#else + ULONG r = WaitForSingleObject(m_event, 0); + WIN_VERIFY(r == WAIT_TIMEOUT || r == WAIT_OBJECT_0); + return (r == WAIT_OBJECT_0); +#endif + } + +protected: + + PAGED void InitializeBase() + { +#if _KERNEL_MODE + KeInitializeEvent(&m_event, TEventType(), FALSE); +#else + m_event = CreateEventW(nullptr, TEventType(), false, nullptr); + WIN_VERIFY(m_event); +#endif + } + + NONPAGED void CleanupBase() + { +#ifndef _KERNEL_MODE + CloseHandle(m_event); + m_event = nullptr; +#endif + } + +private: + +#if _KERNEL_MODE + KEVENT m_event; +#else + HANDLE m_event; +#endif + +}; + +class KWaitEvent : public KWaitEventBase<manual_reset_event_t> +{ +public: + + PAGED KWaitEvent() noexcept + { + InitializeBase(); + } + + NONPAGED ~KWaitEvent() + { + CleanupBase(); + } +}; + +class KWaitEventManualConstruct : public KWaitEventBase<manual_reset_event_t> +{ +public: + + PAGED void Initialize() + { + InitializeBase(); + } + + PAGED void Cleanup() + { + CleanupBase(); + } +}; + + +class KAutoEvent : public KWaitEventBase<auto_reset_event_t> +{ +public: + + PAGED KAutoEvent() noexcept + { + InitializeBase(); + } + + NONPAGED ~KAutoEvent() + { + CleanupBase(); + } +}; diff --git a/network/netadaptercx/netvadapterlibrary/code/rxqueue.cpp b/network/netadaptercx/netvadapterlibrary/code/rxqueue.cpp new file mode 100644 index 000000000..6eed638c1 --- /dev/null +++ b/network/netadaptercx/netvadapterlibrary/code/rxqueue.cpp @@ -0,0 +1,156 @@ +// Copyright (c) Microsoft Corporation. All rights reserved + +#include "pch.hpp" +#include "netvadapter.h" +#include "rxqueue.h" +#include "memory.h" + +static +void +CheckForWakeFrame( + NetvRxQueue * rx +) +{ + NET_RING_FRAGMENT_ITERATOR fi = NetRingGetAllFragments(rx->m_rings); + + if (! NetFragmentIteratorHasAny(&fi)) + { + return; + } + + auto *fragment = NetFragmentIteratorGetFragment(&fi); + auto *rxVirtualAddress = NetExtensionGetFragmentVirtualAddress( + &rx->VirtualAddressExtension, + NetFragmentIteratorGetIndex(&fi)); + + auto *fragmentBuffer = reinterpret_cast<unsigned char *>(rxVirtualAddress->VirtualAddress) + fragment->Offset; + + fragment->ValidLength = EnlCopyWakeFrame( + NetvEnlMLink[rx->m_adapter.EnlIndex].LinkHandle[0], + fragmentBuffer, + fragment->Capacity); + + // If there was a pending wake frame mark this fragment as complete, the normal advance code will get to it + fragment->Scratch = fragment->ValidLength > 0 ? 1 : 0; + + rx->CheckedWakeFrame = true; +} + + +NetvRxQueue::NetvRxQueue( + NETPACKETQUEUE Handle, + NetvAdapter & Adapter +) + : NetvQueue{Handle, Adapter, NetRxQueueGetRingCollection(Handle)} +{ + NET_EXTENSION_QUERY extension; + + NET_EXTENSION_QUERY_INIT( + &extension, + NET_FRAGMENT_EXTENSION_VIRTUAL_ADDRESS_NAME, + NET_FRAGMENT_EXTENSION_VIRTUAL_ADDRESS_VERSION_1, + NetExtensionTypeFragment); + + NetRxQueueGetExtension(m_handle, &extension, &VirtualAddressExtension); + + NET_EXTENSION_QUERY_INIT( + &extension, + NET_PACKET_EXTENSION_RSC_NAME, + NET_PACKET_EXTENSION_RSC_VERSION_2, + NetExtensionTypePacket); + + NetRxQueueGetExtension(m_handle, &extension, &UdpRscExtension); + + NET_EXTENSION_QUERY_INIT( + &extension, + NET_PACKET_EXTENSION_CHECKSUM_NAME, + NET_PACKET_EXTENSION_CHECKSUM_VERSION_1, + NetExtensionTypePacket); + + NetRxQueueGetExtension(m_handle, &extension, &RxXSumExtension); + + EnlQueueHandle = EnlCreateQueue(Handle, RX); +} + +_Use_decl_annotations_ +void +NetvRxQueue::Destroy( + void +) +{ + EnlDestroyQueue(EnlQueueHandle, RX); +} + +void +NetvRxQueue::Start( + void +) +{ + auto link = NetvEnlMLink[m_adapter.EnlIndex].LinkHandle[0]; + auto port = &link->Ports[m_adapter.EnlPortIndex]; + auto queue = &port->RxQueue[0]; + + WDFVERIFY(queue->State == Stopped); + + queue->QueueNext = queue->QueueEnd = 0U; + + EnlIndicateQueueState(EnlQueueHandle, Started); +} + +void +NetvRxQueue::Stop( + void +) +{ + EnlIndicateQueueState(EnlQueueHandle, Stopped); +} + +_Use_decl_annotations_ +void +NetvRxQueue::Advance( + void +) +{ + auto fr = GetFragmentRing(); + NET_RING_PACKET_ITERATOR pi = NetRingGetAllPackets(m_rings); + NET_RING_FRAGMENT_ITERATOR fi = NetRingGetAllFragments(m_rings); + + // Ideally this would run in EvtQueueStart, but at that point the receive buffers are not + // attached to the fragment yet + if (! CheckedWakeFrame) + { + CheckForWakeFrame(this); + } + + // Move begin index forward for all fragments with Scratch == 1, thus returning them to the OS since we're done processing them. + for (; NetFragmentIteratorHasAny(&fi) && NetPacketIteratorHasAny(&pi); NetPacketIteratorAdvance(&pi), NetFragmentIteratorAdvance(&fi)) + { + NET_FRAGMENT const * fragment = NetFragmentIteratorGetFragment(&fi); + if (! fragment->Scratch) + { + break; + } + } + + NetFragmentIteratorSet(&fi); + NetPacketIteratorSet(&pi); + EnlRingDoorBell(EnlQueueHandle, fr->EndIndex); +} + +_Use_decl_annotations_ +void +NetvRxQueue::Cancel( + void +) +{ + CancelRxPackets(m_rings); +} + +_Use_decl_annotations_ +void +NetvRxQueue::SetNotify( + bool NotificationEnabled +) +{ + EnlArmInterrupt(EnlQueueHandle, NotificationEnabled); +} diff --git a/network/netadaptercx/netvadapterlibrary/code/rxqueue.h b/network/netadaptercx/netvadapterlibrary/code/rxqueue.h new file mode 100644 index 000000000..cf208def2 --- /dev/null +++ b/network/netadaptercx/netvadapterlibrary/code/rxqueue.h @@ -0,0 +1,57 @@ +// Copyright (c) Microsoft Corporation. All rights reserved +#pragma once +#include "queue.h" + +class NetvRxQueue final + : public NetvQueue +{ + +public: + + NetvRxQueue( + NETPACKETQUEUE Handle, + NetvAdapter & Adapter + ); + + void + Destroy( + void + ); + + void + Start( + void + ); + + void + Stop( + void + ); + + void + Advance( + void + ); + + void + Cancel( + void + ); + + void + SetNotify( + bool Enable + ); + + ENLP_QUEUE * EnlQueueHandle; + + NET_EXTENSION VirtualAddressExtension; + NET_EXTENSION UdpRscExtension; + NET_EXTENSION RxXSumExtension; + NET_EXTENSION NetMemoryExtension; + NET_EXTENSION NetMemoryReturnContextExtensionIn; + + bool CheckedWakeFrame = false; +}; + +WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(NetvRxQueue, NetvRxQueueGetContext); diff --git a/network/netadaptercx/netvadapterlibrary/code/trace.h b/network/netadaptercx/netvadapterlibrary/code/trace.h new file mode 100644 index 000000000..dc2e28e4f --- /dev/null +++ b/network/netadaptercx/netvadapterlibrary/code/trace.h @@ -0,0 +1,96 @@ +// Copyright (C) Microsoft Corporation. All rights reserved. + +#pragma once + +#include <initguid.h> + +// 5EC34F87-7705-4B5B-B5F6-1F3E4665A31E +#define WPP_CONTROL_GUIDS \ + WPP_DEFINE_CONTROL_GUID( \ + NetvadapterTraceGuid, \ + (5EC34F87,7705,4B5B,B5F6,1F3E4665A31E), \ + WPP_DEFINE_BIT(FLAG_DRIVER) \ + ) + +#define WPP_FLAG_LEVEL_LOGGER(flag, level) \ + WPP_LEVEL_LOGGER(flag) + +#define WPP_FLAG_LEVEL_ENABLED(flag, level) \ + (WPP_LEVEL_ENABLED(flag) && WPP_CONTROL(WPP_BIT_ ## flag).Level >= level) + +#define WPP_LEVEL_FLAGS_LOGGER(lvl,flags) \ + WPP_LEVEL_LOGGER(flags) + +#define WPP_LEVEL_FLAGS_ENABLED(lvl, flags) \ + (WPP_LEVEL_ENABLED(flags) && WPP_CONTROL(WPP_BIT_ ## flags).Level >= lvl) + +// begin_wpp config +// USEPREFIX (LogInformation, "%!FUNC! ->"); +// LogVerbose{LEVEL=TRACE_LEVEL_VERBOSE}(FLAGS, MSG, ...); +// end_wpp + +// begin_wpp config +// USEPREFIX (LogInformation, "%!FUNC! ->"); +// LogWarning{LEVEL=TRACE_LEVEL_WARNING}(FLAGS, MSG, ...); +// end_wpp + +// begin_wpp config +// USEPREFIX (LogInformation, "%!FUNC! ->"); +// LogError{LEVEL=TRACE_LEVEL_ERROR}(FLAGS, MSG, ...); +// end_wpp + +// begin_wpp config +// USEPREFIX (LogInformation, "%!FUNC! ->"); +// LogInformation{LEVEL=TRACE_LEVEL_INFORMATION}(FLAGS, MSG, ...); +// end_wpp + +// +// WPP orders static parameters before dynamic parameters. To support the Trace function +// defined below which sets FLAGS=MYDRIVER_ALL_INFO, a custom macro must be defined to +// reorder the arguments to what the .tpl configuration file expects. +// +#define WPP_RECORDER_FLAGS_LEVEL_ARGS(flags, lvl) \ + WPP_RECORDER_LEVEL_FLAGS_ARGS(lvl, flags) + +#define WPP_RECORDER_FLAGS_LEVEL_FILTER(flags, lvl) \ + WPP_RECORDER_LEVEL_FLAGS_FILTER(lvl, flags) + +// begin_wpp config +// USEPREFIX (RETURN_IF_NOT_STATUS_SUCCESS, "%!STATUS! %!FUNC! ->%!s!", nt__wpp, #NTSTATUS); +// FUNC RETURN_IF_NOT_STATUS_SUCCESS{FLAG=FLAG_DRIVER,LEVEL=TRACE_LEVEL_ERROR}(NTSTATUS); +// end_wpp + +#define WPP_FLAG_LEVEL_NTSTATUS_PRE(flag, level, ntstatus) do { NTSTATUS nt__wpp = (ntstatus); if (STATUS_SUCCESS != nt__wpp) { +#define WPP_FLAG_LEVEL_NTSTATUS_POST(flag, level, ntstatus); return nt__wpp; } } while (0) +#define WPP_RECORDER_FLAG_LEVEL_NTSTATUS_FILTER(flag, level, ntstatus) WPP_RECORDER_LEVEL_FLAGS_FILTER(level, flag) +#define WPP_RECORDER_FLAG_LEVEL_NTSTATUS_ARGS(flag, level, ntstatus) WPP_RECORDER_LEVEL_FLAGS_ARGS(level, flag) + +// begin_wpp config +// USEPREFIX (RETURN_NTSTATUS_IF, "%!STATUS! %!FUNC! ->%!s!", nt__wpp, #CONDITION); +// FUNC RETURN_NTSTATUS_IF{FLAG=FLAG_DRIVER,LEVEL=TRACE_LEVEL_ERROR}(NTSTATUS, CONDITION); +// end_wpp + +#define WPP_FLAG_LEVEL_NTSTATUS_CONDITION_PRE(flag, level, ntstatus, condition) if (condition) { NTSTATUS nt__wpp = (ntstatus); +#define WPP_FLAG_LEVEL_NTSTATUS_CONDITION_POST(flag, level, ntstatus, condition); return nt__wpp; } +#define WPP_RECORDER_FLAG_LEVEL_NTSTATUS_CONDITION_FILTER(flag, level, ntstatus, condition) WPP_RECORDER_LEVEL_FLAGS_FILTER(level, flag) +#define WPP_RECORDER_FLAG_LEVEL_NTSTATUS_CONDITION_ARGS(flag, level, ntstatus, condition) WPP_RECORDER_LEVEL_FLAGS_ARGS(level, flag) + +// begin_wpp config +// USEPREFIX (RETURN_FAILED_NTSTATUS_MSG, "%!STATUS! %!FUNC! ->", nt__wpp); +// FUNC RETURN_FAILED_NTSTATUS_MSG{FLAG=FLAG_DRIVER,FAILEDLEVEL=TRACE_LEVEL_ERROR}(NTSTATUS, MSG, ...); +// end_wpp + +#define WPP_FLAG_FAILEDLEVEL_NTSTATUS_PRE(flag, level, ntstatus); do { NTSTATUS nt__wpp = (ntstatus); +#define WPP_FLAG_FAILEDLEVEL_NTSTATUS_POST(flag, level, ntstatus); return nt__wpp; } while (0) +#define WPP_RECORDER_FLAG_FAILEDLEVEL_NTSTATUS_FILTER(flag, level, ntstatus) WPP_RECORDER_LEVEL_FLAGS_FILTER(level, flag) +#define WPP_RECORDER_FLAG_FAILEDLEVEL_NTSTATUS_ARGS(flag, level, ntstatus) WPP_RECORDER_LEVEL_FLAGS_ARGS(level, flag) + +// begin_wpp config +// USEPREFIX (RETURN_STATUS_SUCCESS, "%!STATUS! %!FUNC!", STATUS_SUCCESS); +// FUNC RETURN_STATUS_SUCCESS{FLAG=FLAG_DRIVER,SUCCESSLEVEL=TRACE_LEVEL_INFORMATION,NTSTATUS=STATUS_SUCCESS}(); +// end_wpp + +#define WPP_FLAG_SUCCESSLEVEL_NTSTATUS_POST(flag, level, ntstatus); return (ntstatus); +#define WPP_RECORDER_FLAG_SUCCESSLEVEL_NTSTATUS_FILTER(flag, level, ntstatus) WPP_RECORDER_LEVEL_FLAGS_FILTER(level, flag) +#define WPP_RECORDER_FLAG_SUCCESSLEVEL_NTSTATUS_ARGS(flag, level, ntstatus) WPP_RECORDER_LEVEL_FLAGS_ARGS(level, flag) + diff --git a/network/netadaptercx/netvadapterlibrary/code/txqueue.cpp b/network/netadaptercx/netvadapterlibrary/code/txqueue.cpp new file mode 100644 index 000000000..b67692b54 --- /dev/null +++ b/network/netadaptercx/netvadapterlibrary/code/txqueue.cpp @@ -0,0 +1,118 @@ +// Copyright (c) Microsoft Corporation. All rights reserved + +#include "pch.hpp" +#include "netvadapter.h" +#include "txqueue.h" + +NetvTxQueue::NetvTxQueue( + NETPACKETQUEUE Handle, + NetvAdapter & Adapter +) noexcept + : NetvQueue{Handle, Adapter, NetTxQueueGetRingCollection(Handle)} +{ + NET_EXTENSION_QUERY extension; + NET_EXTENSION_QUERY_INIT( + &extension, + NET_FRAGMENT_EXTENSION_VIRTUAL_ADDRESS_NAME, + NET_FRAGMENT_EXTENSION_VIRTUAL_ADDRESS_VERSION_1, + NetExtensionTypeFragment); + + NetTxQueueGetExtension(m_handle, &extension, &VirtualAddressExtension); + + NET_EXTENSION_QUERY_INIT( + &extension, + NET_PACKET_EXTENSION_GSO_NAME, + NET_PACKET_EXTENSION_GSO_VERSION_1, + NetExtensionTypePacket); + + NetTxQueueGetExtension(m_handle, &extension, &UsoExtension); + + EnlQueueHandle = EnlCreateQueue(Handle, TX); +} + +_Use_decl_annotations_ +void +NetvTxQueue::Destroy( + void +) +{ + EnlDestroyQueue(EnlQueueHandle, TX); +} + +void +NetvTxQueue::Start( + void +) +{ + auto link = NetvEnlMLink[m_adapter.EnlIndex].LinkHandle[0]; + auto port = &link->Ports[m_adapter.EnlPortIndex]; + auto queue = &port->TxQueue[0]; + + NT_ASSERT(queue->State == Stopped); + + queue->QueueNext = queue->QueueEnd = 0U; + + EnlIndicateQueueState(EnlQueueHandle, Started); +} + +void +NetvTxQueue::Stop( + void +) +{ + EnlIndicateQueueState(EnlQueueHandle, Stopped); +} + +_Use_decl_annotations_ +void +NetvTxQueue::Advance( + void +) +{ + auto pr = GetPacketRing(); + auto pi = NetRingGetAllPackets(m_rings); + + // drain Tx packets + for (; NetPacketIteratorHasAny(&pi); NetPacketIteratorAdvance(&pi)) + { + auto packet = NetPacketIteratorGetPacket(&pi); + if (! packet->Scratch) + { + break; + } + + auto fi = NetPacketIteratorGetFragments(&pi); + for (; NetFragmentIteratorHasAny(&fi); NetFragmentIteratorAdvance(&fi)) + { + continue; + } + + m_rings->Rings[NetRingTypeFragment]->BeginIndex = + NetFragmentIteratorGetIndex(&fi); + } + + NetPacketIteratorSet(&pi); + + // post Tx packets + EnlRingDoorBell(EnlQueueHandle, pr->EndIndex); +} + +_Use_decl_annotations_ +void +NetvTxQueue::Cancel( + void +) +{ + auto ringBuffer = GetPacketRing(); + + EnlRingDoorBell(EnlQueueHandle, ringBuffer->EndIndex); +} + +_Use_decl_annotations_ +void +NetvTxQueue::SetNotify( + bool NotificationEnabled +) +{ + EnlArmInterrupt(EnlQueueHandle, NotificationEnabled); +} diff --git a/network/netadaptercx/netvadapterlibrary/code/txqueue.h b/network/netadaptercx/netvadapterlibrary/code/txqueue.h new file mode 100644 index 000000000..425a38e9a --- /dev/null +++ b/network/netadaptercx/netvadapterlibrary/code/txqueue.h @@ -0,0 +1,51 @@ +// Copyright (c) Microsoft Corporation. All rights reserved + +#include "queue.h" + +class NetvTxQueue final + : public NetvQueue +{ + +public: + + NetvTxQueue( + NETPACKETQUEUE Handle, + NetvAdapter & Adapter + ) noexcept; + + void + Destroy( + void + ); + + void + Start( + void + ); + + void + Stop( + void + ); + + void + Advance( + void + ); + + void + Cancel( + void + ); + + void + SetNotify( + bool Enable + ); + + ENLP_QUEUE * EnlQueueHandle; + NET_EXTENSION VirtualAddressExtension; + NET_EXTENSION UsoExtension; +}; + +WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(NetvTxQueue, NetvTxQueueGetContext); diff --git a/network/netadaptercx/netvadapterlibrary/ethernet_km/netvadapterlibrarykm.filters b/network/netadaptercx/netvadapterlibrary/ethernet_km/netvadapterlibrarykm.filters new file mode 100644 index 000000000..1b227cbb1 --- /dev/null +++ b/network/netadaptercx/netvadapterlibrary/ethernet_km/netvadapterlibrarykm.filters @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup> + <Filter Include="Source Files"> + <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier> + <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions> + </Filter> + <Filter Include="Header Files"> + <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier> + <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions> + </Filter> + <Filter Include="Resource Files"> + <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier> + <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions> + </Filter> + <Filter Include="Driver Files"> + <UniqueIdentifier>{8E41214B-6785-4CFE-B992-037D68949A14}</UniqueIdentifier> + <Extensions>inf;inv;inx;mof;mc;</Extensions> + </Filter> + </ItemGroup> + <ItemGroup> + <Inf Include="KMDFDriver1.inf"> + <Filter>Driver Files</Filter> + </Inf> + </ItemGroup> +</Project> \ No newline at end of file diff --git a/network/netadaptercx/netvadapterlibrary/ethernet_km/netvadapterlibrarykm.vcxproj b/network/netadaptercx/netvadapterlibrary/ethernet_km/netvadapterlibrarykm.vcxproj new file mode 100644 index 000000000..8167e9061 --- /dev/null +++ b/network/netadaptercx/netvadapterlibrary/ethernet_km/netvadapterlibrarykm.vcxproj @@ -0,0 +1,189 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|x64"> + <Configuration>Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|x64"> + <Configuration>Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Debug|ARM64"> + <Configuration>Debug</Configuration> + <Platform>ARM64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|ARM64"> + <Configuration>Release</Configuration> + <Platform>ARM64</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{E2A65EFD-25CC-4AF0-B180-0CD56EE277A9}</ProjectGuid> + <TemplateGuid>{1bc93793-694f-48fe-9372-81e2b05556fd}</TemplateGuid> + <TargetFrameworkVersion>v4.5</TargetFrameworkVersion> + <MinimumVisualStudioVersion>12.0</MinimumVisualStudioVersion> + <Configuration>Debug</Configuration> + <Platform Condition="'$(Platform)' == ''">x64</Platform> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset> + <ConfigurationType>StaticLibrary</ConfigurationType> + <DriverType>KMDF</DriverType> + <DriverTargetPlatform>Windows Driver</DriverTargetPlatform> + <KMDF_VERSION_MAJOR>1</KMDF_VERSION_MAJOR> + <KMDF_VERSION_MINOR>33</KMDF_VERSION_MINOR> + <NetAdapterDriver>true</NetAdapterDriver> + <NETADAPTER_VERSION_MAJOR>2</NETADAPTER_VERSION_MAJOR> + <NETADAPTER_VERSION_MINOR>5</NETADAPTER_VERSION_MINOR> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset> + <ConfigurationType>StaticLibrary</ConfigurationType> + <DriverType>KMDF</DriverType> + <DriverTargetPlatform>Windows Driver</DriverTargetPlatform> + <KMDF_VERSION_MAJOR>1</KMDF_VERSION_MAJOR> + <KMDF_VERSION_MINOR>33</KMDF_VERSION_MINOR> + <NetAdapterDriver>true</NetAdapterDriver> + <NETADAPTER_VERSION_MAJOR>2</NETADAPTER_VERSION_MAJOR> + <NETADAPTER_VERSION_MINOR>5</NETADAPTER_VERSION_MINOR> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset> + <ConfigurationType>StaticLibrary</ConfigurationType> + <DriverType>KMDF</DriverType> + <DriverTargetPlatform>Windows Driver</DriverTargetPlatform> + <KMDF_VERSION_MAJOR>1</KMDF_VERSION_MAJOR> + <KMDF_VERSION_MINOR>33</KMDF_VERSION_MINOR> + <NetAdapterDriver>true</NetAdapterDriver> + <NETADAPTER_VERSION_MAJOR>2</NETADAPTER_VERSION_MAJOR> + <NETADAPTER_VERSION_MINOR>5</NETADAPTER_VERSION_MINOR> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset> + <ConfigurationType>StaticLibrary</ConfigurationType> + <DriverType>KMDF</DriverType> + <DriverTargetPlatform>Windows Driver</DriverTargetPlatform> + <KMDF_VERSION_MAJOR>1</KMDF_VERSION_MAJOR> + <KMDF_VERSION_MINOR>33</KMDF_VERSION_MINOR> + <NetAdapterDriver>true</NetAdapterDriver> + <NETADAPTER_VERSION_MAJOR>2</NETADAPTER_VERSION_MAJOR> + <NETADAPTER_VERSION_MINOR>5</NETADAPTER_VERSION_MINOR> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor> + <IncludePath>$(MSBuildProjectDirectory)\..\Interface;$(MSBuildProjectDirectory)\..\code\rtl;$(IncludePath)</IncludePath> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor> + <IncludePath>$(MSBuildProjectDirectory)\..\Interface;$(MSBuildProjectDirectory)\..\code\rtl;$(IncludePath)</IncludePath> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'"> + <DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor> + <IncludePath>$(MSBuildProjectDirectory)\..\Interface;$(MSBuildProjectDirectory)\..\code\rtl;$(IncludePath)</IncludePath> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'"> + <DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor> + <IncludePath>$(MSBuildProjectDirectory)\..\Interface;$(MSBuildProjectDirectory)\..\code\rtl;$(IncludePath)</IncludePath> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <DriverSign> + <FileDigestAlgorithm>sha256</FileDigestAlgorithm> + </DriverSign> + <ClCompile> + <WppEnabled>true</WppEnabled> + </ClCompile> + <ClCompile> + <WppMinimalRebuildFromTracking>false</WppMinimalRebuildFromTracking> + <WppScanConfigurationData>..\code\trace.h</WppScanConfigurationData> + <WppRecorderEnabled>true</WppRecorderEnabled> + <AdditionalIncludeDirectories>..\..\..\..\wil\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <DriverSign> + <FileDigestAlgorithm>sha256</FileDigestAlgorithm> + </DriverSign> + <ClCompile> + <WppEnabled>true</WppEnabled> + </ClCompile> + <ClCompile> + <WppMinimalRebuildFromTracking>false</WppMinimalRebuildFromTracking> + <WppScanConfigurationData>..\code\trace.h</WppScanConfigurationData> + <WppRecorderEnabled>true</WppRecorderEnabled> + <AdditionalIncludeDirectories>..\..\..\..\wil\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'"> + <DriverSign> + <FileDigestAlgorithm>sha256</FileDigestAlgorithm> + </DriverSign> + <ClCompile> + <WppEnabled>true</WppEnabled> + </ClCompile> + <ClCompile> + <WppMinimalRebuildFromTracking>false</WppMinimalRebuildFromTracking> + <WppScanConfigurationData>..\code\trace.h</WppScanConfigurationData> + <WppRecorderEnabled>true</WppRecorderEnabled> + <AdditionalIncludeDirectories>..\..\..\..\wil\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'"> + <DriverSign> + <FileDigestAlgorithm>sha256</FileDigestAlgorithm> + </DriverSign> + <ClCompile> + <WppEnabled>true</WppEnabled> + </ClCompile> + <ClCompile> + <WppMinimalRebuildFromTracking>false</WppMinimalRebuildFromTracking> + <WppScanConfigurationData>..\code\trace.h</WppScanConfigurationData> + <WppRecorderEnabled>true</WppRecorderEnabled> + <AdditionalIncludeDirectories>..\..\..\..\wil\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + </ClCompile> + </ItemDefinitionGroup> + <ItemGroup> + <FilesToPackage Include="$(TargetPath)" /> + </ItemGroup> + <ItemGroup> + <ClInclude Include="..\code\configuration.h" /> + <ClInclude Include="..\code\enl.h" /> + <ClInclude Include="..\code\enlthreads.h" /> + <ClInclude Include="..\code\memory.h" /> + <ClInclude Include="..\code\pch.hpp" /> + <ClInclude Include="..\code\queue.h" /> + <ClInclude Include="..\code\rxqueue.h" /> + <ClInclude Include="..\code\trace.h" /> + <ClInclude Include="..\code\txqueue.h" /> + <ClInclude Include="..\Interface\netvadapter.h" /> + <ClInclude Include="..\netvInterface.h" /> + </ItemGroup> + <ItemGroup> + <ClCompile Include="..\code\adapter.cpp" /> + <ClCompile Include="..\code\configuration.cpp" /> + <ClCompile Include="..\code\enl.cpp" /> + <ClCompile Include="..\code\enlthreads.cpp" /> + <ClCompile Include="..\code\memory.cpp" /> + <ClCompile Include="..\code\queue.cpp" /> + <ClCompile Include="..\code\rxqueue.cpp" /> + <ClCompile Include="..\code\txqueue.cpp" /> + </ItemGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> +</Project> \ No newline at end of file diff --git a/network/netadaptercx/netvadapterlibrary/ethernet_um/netvadapterlibraryum.filters b/network/netadaptercx/netvadapterlibrary/ethernet_um/netvadapterlibraryum.filters new file mode 100644 index 000000000..1b227cbb1 --- /dev/null +++ b/network/netadaptercx/netvadapterlibrary/ethernet_um/netvadapterlibraryum.filters @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup> + <Filter Include="Source Files"> + <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier> + <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions> + </Filter> + <Filter Include="Header Files"> + <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier> + <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions> + </Filter> + <Filter Include="Resource Files"> + <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier> + <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions> + </Filter> + <Filter Include="Driver Files"> + <UniqueIdentifier>{8E41214B-6785-4CFE-B992-037D68949A14}</UniqueIdentifier> + <Extensions>inf;inv;inx;mof;mc;</Extensions> + </Filter> + </ItemGroup> + <ItemGroup> + <Inf Include="KMDFDriver1.inf"> + <Filter>Driver Files</Filter> + </Inf> + </ItemGroup> +</Project> \ No newline at end of file diff --git a/network/netadaptercx/netvadapterlibrary/ethernet_um/netvadapterlibraryum.vcxproj b/network/netadaptercx/netvadapterlibrary/ethernet_um/netvadapterlibraryum.vcxproj new file mode 100644 index 000000000..0ed7a3719 --- /dev/null +++ b/network/netadaptercx/netvadapterlibrary/ethernet_um/netvadapterlibraryum.vcxproj @@ -0,0 +1,185 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|x64"> + <Configuration>Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|x64"> + <Configuration>Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Debug|ARM64"> + <Configuration>Debug</Configuration> + <Platform>ARM64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|ARM64"> + <Configuration>Release</Configuration> + <Platform>ARM64</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{612F33AD-430C-4FE7-8000-35E15A5EB757}</ProjectGuid> + <TemplateGuid>{1bc93793-694f-48fe-9372-81e2b05556fd}</TemplateGuid> + <TargetFrameworkVersion>v4.5</TargetFrameworkVersion> + <MinimumVisualStudioVersion>12.0</MinimumVisualStudioVersion> + <Configuration>Debug</Configuration> + <Platform Condition="'$(Platform)' == ''">x64</Platform> + <RootNamespace>KMDF_Driver1</RootNamespace> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>WindowsUserModeDriver10.0</PlatformToolset> + <ConfigurationType>StaticLibrary</ConfigurationType> + <DriverTargetPlatform>Universal</DriverTargetPlatform> + <UMDF_VERSION_MAJOR>2</UMDF_VERSION_MAJOR> + <UMDF_VERSION_MINOR>33</UMDF_VERSION_MINOR> + <NetAdapterDriver>true</NetAdapterDriver> + <NETADAPTER_VERSION_MAJOR>2</NETADAPTER_VERSION_MAJOR> + <NETADAPTER_VERSION_MINOR>5</NETADAPTER_VERSION_MINOR> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>WindowsUserModeDriver10.0</PlatformToolset> + <ConfigurationType>StaticLibrary</ConfigurationType> + <DriverTargetPlatform>Universal</DriverTargetPlatform> + <UMDF_VERSION_MAJOR>2</UMDF_VERSION_MAJOR> + <UMDF_VERSION_MINOR>33</UMDF_VERSION_MINOR> + <NetAdapterDriver>true</NetAdapterDriver> + <NETADAPTER_VERSION_MAJOR>2</NETADAPTER_VERSION_MAJOR> + <NETADAPTER_VERSION_MINOR>5</NETADAPTER_VERSION_MINOR> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>WindowsUserModeDriver10.0</PlatformToolset> + <ConfigurationType>StaticLibrary</ConfigurationType> + <DriverTargetPlatform>Universal</DriverTargetPlatform> + <UMDF_VERSION_MAJOR>2</UMDF_VERSION_MAJOR> + <UMDF_VERSION_MINOR>33</UMDF_VERSION_MINOR> + <NetAdapterDriver>true</NetAdapterDriver> + <NETADAPTER_VERSION_MAJOR>2</NETADAPTER_VERSION_MAJOR> + <NETADAPTER_VERSION_MINOR>5</NETADAPTER_VERSION_MINOR> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>WindowsUserModeDriver10.0</PlatformToolset> + <ConfigurationType>StaticLibrary</ConfigurationType> + <DriverTargetPlatform>Universal</DriverTargetPlatform> + <UMDF_VERSION_MAJOR>2</UMDF_VERSION_MAJOR> + <UMDF_VERSION_MINOR>33</UMDF_VERSION_MINOR> + <NetAdapterDriver>true</NetAdapterDriver> + <NETADAPTER_VERSION_MAJOR>2</NETADAPTER_VERSION_MAJOR> + <NETADAPTER_VERSION_MINOR>5</NETADAPTER_VERSION_MINOR> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor> + <IncludePath>$(MSBuildProjectDirectory)\..\Interface;$(MSBuildProjectDirectory)\..\code\rtl;$(IncludePath)</IncludePath> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor> + <IncludePath>$(MSBuildProjectDirectory)\..\Interface;$(MSBuildProjectDirectory)\..\code\rtl;$(IncludePath)</IncludePath> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'"> + <DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor> + <IncludePath>$(MSBuildProjectDirectory)\..\Interface;$(MSBuildProjectDirectory)\..\code\rtl;$(IncludePath)</IncludePath> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'"> + <DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor> + <IncludePath>$(MSBuildProjectDirectory)\..\Interface;$(MSBuildProjectDirectory)\..\code\rtl;$(IncludePath)</IncludePath> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <DriverSign> + <FileDigestAlgorithm>sha256</FileDigestAlgorithm> + </DriverSign> + <ClCompile> + <WppEnabled>true</WppEnabled> + </ClCompile> + <ClCompile> + <WppMinimalRebuildFromTracking>false</WppMinimalRebuildFromTracking> + <WppRecorderEnabled>true</WppRecorderEnabled> + <WppScanConfigurationData>..\code\trace.h</WppScanConfigurationData> + <AdditionalIncludeDirectories>..\..\..\..\wil\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <DriverSign> + <FileDigestAlgorithm>sha256</FileDigestAlgorithm> + </DriverSign> + <ClCompile> + <WppEnabled>true</WppEnabled> + </ClCompile> + <ClCompile> + <WppMinimalRebuildFromTracking>false</WppMinimalRebuildFromTracking> + <WppRecorderEnabled>true</WppRecorderEnabled> + <WppScanConfigurationData>..\code\trace.h</WppScanConfigurationData> + <AdditionalIncludeDirectories>..\..\..\..\wil\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'"> + <DriverSign> + <FileDigestAlgorithm>sha256</FileDigestAlgorithm> + </DriverSign> + <ClCompile> + <WppEnabled>true</WppEnabled> + </ClCompile> + <ClCompile> + <WppMinimalRebuildFromTracking>false</WppMinimalRebuildFromTracking> + <WppRecorderEnabled>true</WppRecorderEnabled> + <WppScanConfigurationData>..\code\trace.h</WppScanConfigurationData> + <AdditionalIncludeDirectories>..\..\..\..\wil\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'"> + <DriverSign> + <FileDigestAlgorithm>sha256</FileDigestAlgorithm> + </DriverSign> + <ClCompile> + <WppEnabled>true</WppEnabled> + </ClCompile> + <ClCompile> + <WppMinimalRebuildFromTracking>false</WppMinimalRebuildFromTracking> + <WppRecorderEnabled>true</WppRecorderEnabled> + <WppScanConfigurationData>..\code\trace.h</WppScanConfigurationData> + <AdditionalIncludeDirectories>..\..\..\..\wil\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + </ClCompile> + </ItemDefinitionGroup> + <ItemGroup> + <FilesToPackage Include="$(TargetPath)" /> + </ItemGroup> + <ItemGroup> + <ClInclude Include="..\code\configuration.h" /> + <ClInclude Include="..\code\enl.h" /> + <ClInclude Include="..\code\enlthreads.h" /> + <ClInclude Include="..\code\memory.h" /> + <ClInclude Include="..\code\pch.hpp" /> + <ClInclude Include="..\code\queue.h" /> + <ClInclude Include="..\code\rxqueue.h" /> + <ClInclude Include="..\code\trace.h" /> + <ClInclude Include="..\code\txqueue.h" /> + <ClInclude Include="..\Interface\netvadapter.h" /> + </ItemGroup> + <ItemGroup> + <ClCompile Include="..\code\adapter.cpp" /> + <ClCompile Include="..\code\configuration.cpp" /> + <ClCompile Include="..\code\enl.cpp" /> + <ClCompile Include="..\code\enlthreads.cpp" /> + <ClCompile Include="..\code\memory.cpp" /> + <ClCompile Include="..\code\queue.cpp" /> + <ClCompile Include="..\code\rxqueue.cpp" /> + <ClCompile Include="..\code\txqueue.cpp" /> + </ItemGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> +</Project> \ No newline at end of file diff --git a/network/netadaptercx/netvadapterlibrary/wifi_km/netvadapterlibrarykm.filters b/network/netadaptercx/netvadapterlibrary/wifi_km/netvadapterlibrarykm.filters new file mode 100644 index 000000000..1b227cbb1 --- /dev/null +++ b/network/netadaptercx/netvadapterlibrary/wifi_km/netvadapterlibrarykm.filters @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup> + <Filter Include="Source Files"> + <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier> + <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions> + </Filter> + <Filter Include="Header Files"> + <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier> + <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions> + </Filter> + <Filter Include="Resource Files"> + <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier> + <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions> + </Filter> + <Filter Include="Driver Files"> + <UniqueIdentifier>{8E41214B-6785-4CFE-B992-037D68949A14}</UniqueIdentifier> + <Extensions>inf;inv;inx;mof;mc;</Extensions> + </Filter> + </ItemGroup> + <ItemGroup> + <Inf Include="KMDFDriver1.inf"> + <Filter>Driver Files</Filter> + </Inf> + </ItemGroup> +</Project> \ No newline at end of file diff --git a/network/netadaptercx/netvadapterlibrary/wifi_km/netvadapterlibrarykm.vcxproj b/network/netadaptercx/netvadapterlibrary/wifi_km/netvadapterlibrarykm.vcxproj new file mode 100644 index 000000000..f674c91af --- /dev/null +++ b/network/netadaptercx/netvadapterlibrary/wifi_km/netvadapterlibrarykm.vcxproj @@ -0,0 +1,189 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|x64"> + <Configuration>Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|x64"> + <Configuration>Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Debug|ARM64"> + <Configuration>Debug</Configuration> + <Platform>ARM64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|ARM64"> + <Configuration>Release</Configuration> + <Platform>ARM64</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{E2A65EFD-25CC-4AF0-B180-0CD56EE277A9}</ProjectGuid> + <TemplateGuid>{1bc93793-694f-48fe-9372-81e2b05556fd}</TemplateGuid> + <TargetFrameworkVersion>v4.5</TargetFrameworkVersion> + <MinimumVisualStudioVersion>12.0</MinimumVisualStudioVersion> + <Configuration>Debug</Configuration> + <Platform Condition="'$(Platform)' == ''">x64</Platform> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset> + <ConfigurationType>StaticLibrary</ConfigurationType> + <DriverType>KMDF</DriverType> + <DriverTargetPlatform>Windows Driver</DriverTargetPlatform> + <KMDF_VERSION_MAJOR>1</KMDF_VERSION_MAJOR> + <KMDF_VERSION_MINOR>33</KMDF_VERSION_MINOR> + <NetAdapterDriver>true</NetAdapterDriver> + <NETADAPTER_VERSION_MAJOR>2</NETADAPTER_VERSION_MAJOR> + <NETADAPTER_VERSION_MINOR>6</NETADAPTER_VERSION_MINOR> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset> + <ConfigurationType>StaticLibrary</ConfigurationType> + <DriverType>KMDF</DriverType> + <DriverTargetPlatform>Windows Driver</DriverTargetPlatform> + <KMDF_VERSION_MAJOR>1</KMDF_VERSION_MAJOR> + <KMDF_VERSION_MINOR>33</KMDF_VERSION_MINOR> + <NetAdapterDriver>true</NetAdapterDriver> + <NETADAPTER_VERSION_MAJOR>2</NETADAPTER_VERSION_MAJOR> + <NETADAPTER_VERSION_MINOR>5</NETADAPTER_VERSION_MINOR> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset> + <ConfigurationType>StaticLibrary</ConfigurationType> + <DriverType>KMDF</DriverType> + <DriverTargetPlatform>Windows Driver</DriverTargetPlatform> + <KMDF_VERSION_MAJOR>1</KMDF_VERSION_MAJOR> + <KMDF_VERSION_MINOR>33</KMDF_VERSION_MINOR> + <NetAdapterDriver>true</NetAdapterDriver> + <NETADAPTER_VERSION_MAJOR>2</NETADAPTER_VERSION_MAJOR> + <NETADAPTER_VERSION_MINOR>5</NETADAPTER_VERSION_MINOR> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset> + <ConfigurationType>StaticLibrary</ConfigurationType> + <DriverType>KMDF</DriverType> + <DriverTargetPlatform>Windows Driver</DriverTargetPlatform> + <KMDF_VERSION_MAJOR>1</KMDF_VERSION_MAJOR> + <KMDF_VERSION_MINOR>33</KMDF_VERSION_MINOR> + <NetAdapterDriver>true</NetAdapterDriver> + <NETADAPTER_VERSION_MAJOR>2</NETADAPTER_VERSION_MAJOR> + <NETADAPTER_VERSION_MINOR>5</NETADAPTER_VERSION_MINOR> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor> + <IncludePath>$(MSBuildProjectDirectory)\..\Interface;$(MSBuildProjectDirectory)\..\code\rtl;$(IncludePath)</IncludePath> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor> + <IncludePath>$(MSBuildProjectDirectory)\..\Interface;$(MSBuildProjectDirectory)\..\code\rtl;$(IncludePath)</IncludePath> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'"> + <DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor> + <IncludePath>$(MSBuildProjectDirectory)\..\Interface;$(MSBuildProjectDirectory)\..\code\rtl;$(IncludePath)</IncludePath> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'"> + <DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor> + <IncludePath>$(MSBuildProjectDirectory)\..\Interface;$(MSBuildProjectDirectory)\..\code\rtl;$(IncludePath)</IncludePath> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <DriverSign> + <FileDigestAlgorithm>sha256</FileDigestAlgorithm> + </DriverSign> + <ClCompile> + <WppEnabled>true</WppEnabled> + </ClCompile> + <ClCompile> + <WppMinimalRebuildFromTracking>false</WppMinimalRebuildFromTracking> + <WppScanConfigurationData>..\code\trace.h</WppScanConfigurationData> + <WppRecorderEnabled>true</WppRecorderEnabled> + <AdditionalIncludeDirectories>..\..\..\..\wil\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <DriverSign> + <FileDigestAlgorithm>sha256</FileDigestAlgorithm> + </DriverSign> + <ClCompile> + <WppEnabled>true</WppEnabled> + </ClCompile> + <ClCompile> + <WppMinimalRebuildFromTracking>false</WppMinimalRebuildFromTracking> + <WppScanConfigurationData>..\code\trace.h</WppScanConfigurationData> + <WppRecorderEnabled>true</WppRecorderEnabled> + <AdditionalIncludeDirectories>..\..\..\..\wil\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'"> + <DriverSign> + <FileDigestAlgorithm>sha256</FileDigestAlgorithm> + </DriverSign> + <ClCompile> + <WppEnabled>true</WppEnabled> + </ClCompile> + <ClCompile> + <WppMinimalRebuildFromTracking>false</WppMinimalRebuildFromTracking> + <WppScanConfigurationData>..\code\trace.h</WppScanConfigurationData> + <WppRecorderEnabled>true</WppRecorderEnabled> + <AdditionalIncludeDirectories>..\..\..\..\wil\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'"> + <DriverSign> + <FileDigestAlgorithm>sha256</FileDigestAlgorithm> + </DriverSign> + <ClCompile> + <WppEnabled>true</WppEnabled> + </ClCompile> + <ClCompile> + <WppMinimalRebuildFromTracking>false</WppMinimalRebuildFromTracking> + <WppScanConfigurationData>..\code\trace.h</WppScanConfigurationData> + <WppRecorderEnabled>true</WppRecorderEnabled> + <AdditionalIncludeDirectories>..\..\..\..\wil\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + </ClCompile> + </ItemDefinitionGroup> + <ItemGroup> + <FilesToPackage Include="$(TargetPath)" /> + </ItemGroup> + <ItemGroup> + <ClInclude Include="..\code\configuration.h" /> + <ClInclude Include="..\code\enl.h" /> + <ClInclude Include="..\code\enlthreads.h" /> + <ClInclude Include="..\code\memory.h" /> + <ClInclude Include="..\code\pch.hpp" /> + <ClInclude Include="..\code\queue.h" /> + <ClInclude Include="..\code\rxqueue.h" /> + <ClInclude Include="..\code\trace.h" /> + <ClInclude Include="..\code\txqueue.h" /> + <ClInclude Include="..\Interface\netvadapter.h" /> + <ClInclude Include="..\netvInterface.h" /> + </ItemGroup> + <ItemGroup> + <ClCompile Include="..\code\adapter.cpp" /> + <ClCompile Include="..\code\configuration.cpp" /> + <ClCompile Include="..\code\enl.cpp" /> + <ClCompile Include="..\code\enlthreads.cpp" /> + <ClCompile Include="..\code\memory.cpp" /> + <ClCompile Include="..\code\queue.cpp" /> + <ClCompile Include="..\code\rxqueue.cpp" /> + <ClCompile Include="..\code\txqueue.cpp" /> + </ItemGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> +</Project> \ No newline at end of file diff --git a/network/netadaptercx/netvadapterlibrary/wifi_um/netvadapterlibraryum.filters b/network/netadaptercx/netvadapterlibrary/wifi_um/netvadapterlibraryum.filters new file mode 100644 index 000000000..1b227cbb1 --- /dev/null +++ b/network/netadaptercx/netvadapterlibrary/wifi_um/netvadapterlibraryum.filters @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup> + <Filter Include="Source Files"> + <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier> + <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions> + </Filter> + <Filter Include="Header Files"> + <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier> + <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions> + </Filter> + <Filter Include="Resource Files"> + <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier> + <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions> + </Filter> + <Filter Include="Driver Files"> + <UniqueIdentifier>{8E41214B-6785-4CFE-B992-037D68949A14}</UniqueIdentifier> + <Extensions>inf;inv;inx;mof;mc;</Extensions> + </Filter> + </ItemGroup> + <ItemGroup> + <Inf Include="KMDFDriver1.inf"> + <Filter>Driver Files</Filter> + </Inf> + </ItemGroup> +</Project> \ No newline at end of file diff --git a/network/netadaptercx/netvadapterlibrary/wifi_um/netvadapterlibraryum.vcxproj b/network/netadaptercx/netvadapterlibrary/wifi_um/netvadapterlibraryum.vcxproj new file mode 100644 index 000000000..e7c260cf8 --- /dev/null +++ b/network/netadaptercx/netvadapterlibrary/wifi_um/netvadapterlibraryum.vcxproj @@ -0,0 +1,189 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|x64"> + <Configuration>Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|x64"> + <Configuration>Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Debug|ARM64"> + <Configuration>Debug</Configuration> + <Platform>ARM64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|ARM64"> + <Configuration>Release</Configuration> + <Platform>ARM64</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{612F33AD-430C-4FE7-8000-35E15A5EB757}</ProjectGuid> + <TemplateGuid>{1bc93793-694f-48fe-9372-81e2b05556fd}</TemplateGuid> + <TargetFrameworkVersion>v4.5</TargetFrameworkVersion> + <MinimumVisualStudioVersion>12.0</MinimumVisualStudioVersion> + <Configuration>Debug</Configuration> + <Platform Condition="'$(Platform)' == ''">x64</Platform> + <RootNamespace>KMDF_Driver1</RootNamespace> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>WindowsUserModeDriver10.0</PlatformToolset> + <ConfigurationType>StaticLibrary</ConfigurationType> + <DriverType>KMDF</DriverType> + <DriverTargetPlatform>Universal</DriverTargetPlatform> + <UMDF_VERSION_MAJOR>2</UMDF_VERSION_MAJOR> + <UMDF_VERSION_MINOR>35</UMDF_VERSION_MINOR> + <NetAdapterDriver>true</NetAdapterDriver> + <NETADAPTER_VERSION_MAJOR>2</NETADAPTER_VERSION_MAJOR> + <NETADAPTER_VERSION_MINOR>6</NETADAPTER_VERSION_MINOR> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>WindowsUserModeDriver10.0</PlatformToolset> + <ConfigurationType>StaticLibrary</ConfigurationType> + <DriverType>KMDF</DriverType> + <DriverTargetPlatform>Universal</DriverTargetPlatform> + <UMDF_VERSION_MAJOR>2</UMDF_VERSION_MAJOR> + <UMDF_VERSION_MINOR>35</UMDF_VERSION_MINOR> + <NetAdapterDriver>true</NetAdapterDriver> + <NETADAPTER_VERSION_MAJOR>2</NETADAPTER_VERSION_MAJOR> + <NETADAPTER_VERSION_MINOR>5</NETADAPTER_VERSION_MINOR> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>WindowsUserModeDriver10.0</PlatformToolset> + <ConfigurationType>StaticLibrary</ConfigurationType> + <DriverType>KMDF</DriverType> + <DriverTargetPlatform>Universal</DriverTargetPlatform> + <UMDF_VERSION_MAJOR>2</UMDF_VERSION_MAJOR> + <UMDF_VERSION_MINOR>35</UMDF_VERSION_MINOR> + <NetAdapterDriver>true</NetAdapterDriver> + <NETADAPTER_VERSION_MAJOR>2</NETADAPTER_VERSION_MAJOR> + <NETADAPTER_VERSION_MINOR>5</NETADAPTER_VERSION_MINOR> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>WindowsUserModeDriver10.0</PlatformToolset> + <ConfigurationType>StaticLibrary</ConfigurationType> + <DriverType>KMDF</DriverType> + <DriverTargetPlatform>Universal</DriverTargetPlatform> + <UMDF_VERSION_MAJOR>2</UMDF_VERSION_MAJOR> + <UMDF_VERSION_MINOR>35</UMDF_VERSION_MINOR> + <NetAdapterDriver>true</NetAdapterDriver> + <NETADAPTER_VERSION_MAJOR>2</NETADAPTER_VERSION_MAJOR> + <NETADAPTER_VERSION_MINOR>5</NETADAPTER_VERSION_MINOR> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor> + <IncludePath>$(MSBuildProjectDirectory)\..\Interface;$(MSBuildProjectDirectory)\..\code\rtl;$(IncludePath)</IncludePath> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor> + <IncludePath>$(MSBuildProjectDirectory)\..\Interface;$(MSBuildProjectDirectory)\..\code\rtl;$(IncludePath)</IncludePath> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'"> + <DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor> + <IncludePath>$(MSBuildProjectDirectory)\..\Interface;$(MSBuildProjectDirectory)\..\code\rtl;$(IncludePath)</IncludePath> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'"> + <DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor> + <IncludePath>$(MSBuildProjectDirectory)\..\Interface;$(MSBuildProjectDirectory)\..\code\rtl;$(IncludePath)</IncludePath> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <DriverSign> + <FileDigestAlgorithm>sha256</FileDigestAlgorithm> + </DriverSign> + <ClCompile> + <WppEnabled>true</WppEnabled> + </ClCompile> + <ClCompile> + <WppMinimalRebuildFromTracking>false</WppMinimalRebuildFromTracking> + <WppRecorderEnabled>true</WppRecorderEnabled> + <WppScanConfigurationData>..\code\trace.h</WppScanConfigurationData> + <AdditionalIncludeDirectories>..\..\..\..\wil\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <DriverSign> + <FileDigestAlgorithm>sha256</FileDigestAlgorithm> + </DriverSign> + <ClCompile> + <WppEnabled>true</WppEnabled> + </ClCompile> + <ClCompile> + <WppMinimalRebuildFromTracking>false</WppMinimalRebuildFromTracking> + <WppRecorderEnabled>true</WppRecorderEnabled> + <WppScanConfigurationData>..\code\trace.h</WppScanConfigurationData> + <AdditionalIncludeDirectories>..\..\..\..\wil\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'"> + <DriverSign> + <FileDigestAlgorithm>sha256</FileDigestAlgorithm> + </DriverSign> + <ClCompile> + <WppEnabled>true</WppEnabled> + </ClCompile> + <ClCompile> + <WppMinimalRebuildFromTracking>false</WppMinimalRebuildFromTracking> + <WppRecorderEnabled>true</WppRecorderEnabled> + <WppScanConfigurationData>..\code\trace.h</WppScanConfigurationData> + <AdditionalIncludeDirectories>..\..\..\..\wil\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + </ClCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'"> + <DriverSign> + <FileDigestAlgorithm>sha256</FileDigestAlgorithm> + </DriverSign> + <ClCompile> + <WppEnabled>true</WppEnabled> + </ClCompile> + <ClCompile> + <WppMinimalRebuildFromTracking>false</WppMinimalRebuildFromTracking> + <WppRecorderEnabled>true</WppRecorderEnabled> + <WppScanConfigurationData>..\code\trace.h</WppScanConfigurationData> + <AdditionalIncludeDirectories>..\..\..\..\wil\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + </ClCompile> + </ItemDefinitionGroup> + <ItemGroup> + <FilesToPackage Include="$(TargetPath)" /> + </ItemGroup> + <ItemGroup> + <ClInclude Include="..\code\configuration.h" /> + <ClInclude Include="..\code\enl.h" /> + <ClInclude Include="..\code\enlthreads.h" /> + <ClInclude Include="..\code\memory.h" /> + <ClInclude Include="..\code\pch.hpp" /> + <ClInclude Include="..\code\queue.h" /> + <ClInclude Include="..\code\rxqueue.h" /> + <ClInclude Include="..\code\trace.h" /> + <ClInclude Include="..\code\txqueue.h" /> + <ClInclude Include="..\Interface\netvadapter.h" /> + </ItemGroup> + <ItemGroup> + <ClCompile Include="..\code\adapter.cpp" /> + <ClCompile Include="..\code\configuration.cpp" /> + <ClCompile Include="..\code\enl.cpp" /> + <ClCompile Include="..\code\enlthreads.cpp" /> + <ClCompile Include="..\code\memory.cpp" /> + <ClCompile Include="..\code\queue.cpp" /> + <ClCompile Include="..\code\rxqueue.cpp" /> + <ClCompile Include="..\code\txqueue.cpp" /> + </ItemGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> +</Project> \ No newline at end of file diff --git a/network/wlan/wificx/OEM/OemDeviceService.vcxproj b/network/wlan/wificx/OEM/OemDeviceService.vcxproj new file mode 100644 index 000000000..c48f5bb86 --- /dev/null +++ b/network/wlan/wificx/OEM/OemDeviceService.vcxproj @@ -0,0 +1,50 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|x64"> + <Configuration>Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|x64"> + <Configuration>Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Debug|ARM64"> + <Configuration>Debug</Configuration> + <Platform>ARM64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|ARM64"> + <Configuration>Release</Configuration> + <Platform>ARM64</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{B3C9A1E2-7F4D-4B2A-9C5E-1A2B3C4D5E6F}</ProjectGuid> + <RootNamespace>OemDeviceService</RootNamespace> + <ConfigurationType>Application</ConfigurationType> + <CharacterSet>Unicode</CharacterSet> + <ProjectName>OemDeviceServiceApplication</ProjectName> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup> + <PlatformToolset>WindowsApplicationForDrivers10.0</PlatformToolset> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ItemDefinitionGroup> + <ClCompile> + <WarningLevel>Level4</WarningLevel> + <PreprocessorDefinitions>_UNICODE;UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <Link> + <SubSystem>Console</SubSystem> + <AdditionalDependencies>wlanapi.lib;ole32.lib;%(AdditionalDependencies)</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemGroup> + <ClCompile Include="OemDeviceServiceApp.cpp" /> + </ItemGroup> + <ItemGroup> + <None Include="README.md" /> + </ItemGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> +</Project> \ No newline at end of file diff --git a/network/wlan/wificx/OEM/OemDeviceServiceApp.cpp b/network/wlan/wificx/OEM/OemDeviceServiceApp.cpp new file mode 100644 index 000000000..74c0e3d32 --- /dev/null +++ b/network/wlan/wificx/OEM/OemDeviceServiceApp.cpp @@ -0,0 +1,158 @@ +// Copyright (C) Microsoft Corporation. All rights reserved. +// +// OEM sample: enumerates supported device services, then sends "Hello, My Driver" +// to the WiFiCx sample driver via WlanDeviceServiceCommand and prints the +// driver's "Nice to meet you, My OEM". + +#define NOMINMAX // use std::min/std::max instead of the windows.h min/max macros +#include <windows.h> +#include <wlanapi.h> +#include <objbase.h> // StringFromGUID2 +#include <algorithm> // std::min +#include <cstdio> + +#pragma comment(lib, "wlanapi.lib") +#pragma comment(lib, "ole32.lib") // StringFromGUID2 + +// WlanGetSupportedDeviceServices, WlanDeviceServiceCommand and +// WLAN_DEVICE_SERVICE_GUID_LIST are all declared by wlanapi.h. + +// This GUID/opcode pair MUST match the driver (drivercode\SharedTypes.h). +// {2d6f9a14-3a1d-4f0a-9b7e-1c2e3a4b5c6d} +static const GUID GUID_OEM_SAMPLE_DEVICE_SERVICE = +{ 0x2d6f9a14, 0x3a1d, 0x4f0a, { 0x9b, 0x7e, 0x1c, 0x2e, 0x3a, 0x4b, 0x5c, 0x6d } }; + +#define OEM_DEVICE_SERVICE_OPCODE_HELLO 0x00000001 +#define OEM_DEVICE_SERVICE_REQUEST_STRING "Hello, My Driver" + +static void PrintGuid(const GUID& g) +{ + wchar_t buf[64] = { 0 }; + StringFromGUID2(g, buf, ARRAYSIZE(buf)); + wprintf(L"%s", buf); +} + +// Enumerate the device services the driver advertises (via WDI_GET_SUPPORTED_DEVICE_SERVICES). +static bool QuerySupportedServices(HANDLE hClient, const GUID& interfaceGuid) +{ + PWLAN_DEVICE_SERVICE_GUID_LIST pList = nullptr; + DWORD result = WlanGetSupportedDeviceServices(hClient, &interfaceGuid, &pList); + if (result != ERROR_SUCCESS || pList == nullptr) + { + printf("WlanGetSupportedDeviceServices failed with error %u\n", result); + return false; + } + + bool found = false; + printf("Supported device services: %u\n", pList->dwNumberOfItems); + for (DWORD i = 0; i < pList->dwNumberOfItems; i++) + { + printf(" [%u] ", i); + PrintGuid(pList->DeviceService[i]); + if (IsEqualGUID(pList->DeviceService[i], GUID_OEM_SAMPLE_DEVICE_SERVICE)) + { + found = true; + printf(" <-- OEM sample service"); + } + printf("\n"); + } + + WlanFreeMemory(pList); + return found; +} + +static void SendHelloToInterface(HANDLE hClient, const GUID& interfaceGuid) +{ + char inBuffer[] = OEM_DEVICE_SERVICE_REQUEST_STRING; // includes null terminator + DWORD inBufferSize = static_cast<DWORD>(sizeof(inBuffer)); + + BYTE outBuffer[256] = { 0 }; + DWORD outBufferSize = static_cast<DWORD>(sizeof(outBuffer)); + DWORD bytesReturned = 0; + + printf("Sending device service command: \"%s\"\n", inBuffer); + + DWORD result = WlanDeviceServiceCommand( + hClient, + &interfaceGuid, + const_cast<LPGUID>(&GUID_OEM_SAMPLE_DEVICE_SERVICE), + OEM_DEVICE_SERVICE_OPCODE_HELLO, + inBufferSize, + inBuffer, + outBufferSize, + outBuffer, + &bytesReturned); + + if (result != ERROR_SUCCESS) + { + printf("WlanDeviceServiceCommand failed with error %u\n", result); + return; + } + + if (bytesReturned > 0) + { + outBuffer[std::min(bytesReturned, static_cast<DWORD>(sizeof(outBuffer) - 1))] = '\0'; + printf("Driver responded: \"%s\" (%u bytes)\n", reinterpret_cast<char*>(outBuffer), bytesReturned); + } + else + { + printf("Driver returned no data.\n"); + } +} + +int __cdecl main() +{ + HANDLE hClient = nullptr; + DWORD negotiatedVersion = 0; + PWLAN_INTERFACE_INFO_LIST pIfList = nullptr; + + // 1) WlanOpenHandle + DWORD result = WlanOpenHandle(WLAN_API_VERSION_2_0, nullptr, &negotiatedVersion, &hClient); + if (result != ERROR_SUCCESS) + { + printf("WlanOpenHandle failed with error %u\n", result); + return 1; + } + + // 2) WlanEnumInterfaces + result = WlanEnumInterfaces(hClient, nullptr, &pIfList); + if (result != ERROR_SUCCESS) + { + printf("WlanEnumInterfaces failed with error %u\n", result); + WlanCloseHandle(hClient, nullptr); + return 1; + } + + printf("Found %u WLAN interface(s).\n", pIfList->dwNumberOfItems); + + for (DWORD i = 0; i < pIfList->dwNumberOfItems; i++) + { + const WLAN_INTERFACE_INFO& ifInfo = pIfList->InterfaceInfo[i]; + printf("\nInterface[%u]: %ws\n", i, ifInfo.strInterfaceDescription); + + // Enumerate supported device services first. + bool supported = QuerySupportedServices(hClient, ifInfo.InterfaceGuid); + + // 3) WlanDeviceServiceCommand (only if our service is advertised) + if (supported) + { + SendHelloToInterface(hClient, ifInfo.InterfaceGuid); + } + else + { + printf("OEM sample device service not advertised on this interface; skipping command.\n"); + } + } + + // 4) WlanFreeMemory(pIfList); + if (pIfList != nullptr) + { + WlanFreeMemory(pIfList); + pIfList = nullptr; + } + + // 5) WlanCloseHandle(hClient, nullptr); + WlanCloseHandle(hClient, nullptr); + + return 0; +} diff --git a/network/wlan/wificx/OEM/README.md b/network/wlan/wificx/OEM/README.md new file mode 100644 index 000000000..984199328 --- /dev/null +++ b/network/wlan/wificx/OEM/README.md @@ -0,0 +1,90 @@ +# OEM Device Service Sample (`OemDeviceServiceApplication`) + +A user-mode console application that demonstrates how an OEM/IHV utility communicates +with the WiFiCx sample driver through a **WLAN device service**. The app sends the +request string `"Hello, My Driver"` and prints the driver's reply +`"Nice to meet you, My OEM"`. + +## What it does + +The tool walks through the standard WLAN client flow: + +1. **`WlanOpenHandle`** — opens a client handle using `WLAN_API_VERSION_2_0`. +2. **`WlanEnumInterfaces`** — enumerates all WLAN interfaces on the machine. +3. **`WlanGetSupportedDeviceServices`** — for each interface, enumerates the device + service GUIDs the driver advertises and checks whether the OEM sample service + (`GUID_OEM_SAMPLE_DEVICE_SERVICE`) is present. +4. **`WlanDeviceServiceCommand`** — when the service is advertised, sends the + `OEM_DEVICE_SERVICE_OPCODE_HELLO` opcode with the request payload and prints the + bytes returned by the driver. +5. **`WlanFreeMemory` / `WlanCloseHandle`** — releases the interface list and the + client handle. + +If the OEM sample device service is not advertised on an interface, the command is +skipped for that interface. + +## Device service contract + +These values **must stay in sync** with the driver-side definitions in +[`drivercode/SharedTypes.h`](../drivercode/SharedTypes.h): + +| Item | Value | +| --- | --- | +| Service GUID | `{2d6f9a14-3a1d-4f0a-9b7e-1c2e3a4b5c6d}` (`GUID_OEM_SAMPLE_DEVICE_SERVICE`) | +| Opcode | `0x00000001` (`OEM_DEVICE_SERVICE_OPCODE_HELLO`) | +| Request string | `"Hello, My Driver"` | +| Response string | `"Nice to meet you, My OEM"` | + +The driver advertises the service GUID via `WDI_GET_SUPPORTED_DEVICE_SERVICES`, so the +GUID must match on both sides for the exchange to succeed. + +## Source layout + +| File | Purpose | +| --- | --- | +| [`OemDeviceServiceApp.cpp`](OemDeviceServiceApp.cpp) | Application entry point and device service logic. | +| [`OemDeviceService.vcxproj`](OemDeviceService.vcxproj) | MSBuild project for the console app. | + +## Build + +The project (`OemDeviceService.vcxproj`) builds as a console **Application** using the +`WindowsApplicationForDrivers10.0` platform toolset. + +- **Configurations:** `Debug`, `Release` +- **Platforms:** `x64`, `ARM64` +- **Linked libraries:** `wlanapi.lib`, `ole32.lib` + +Build it from Visual Studio as part of the solution, or from the command line: + +```cmd +msbuild OEM\OemDeviceService.vcxproj /p:Configuration=Release /p:Platform=x64 +``` + +## Run + +Run the resulting executable from an elevated command prompt on a machine where the +WiFiCx sample driver is installed: + +```cmd +OemDeviceServiceApplication.exe +``` + +### Example output + +```text +Found 1 WLAN interface(s). + +Interface[0]: WiFiCx Sample Client Device +Supported device services: 1 + [0] {2D6F9A14-3A1D-4F0A-9B7E-1C2E3A4B5C6D} <-- OEM sample service +Sending device service command: "Hello, My Driver" +Driver responded: "Nice to meet you, My OEM" (25 bytes) +``` + +## Requirements + +- The WiFiCx sample driver must be installed and the adapter present. +- The driver must advertise `GUID_OEM_SAMPLE_DEVICE_SERVICE`; otherwise the app prints + that the service is not advertised and skips the command. +- WLAN API (`wlanapi.lib`) and COM (`ole32.lib` for `StringFromGUID2`) are available on + the host. diff --git a/network/wlan/wificx/README.md b/network/wlan/wificx/README.md new file mode 100644 index 000000000..fb4ca92af --- /dev/null +++ b/network/wlan/wificx/README.md @@ -0,0 +1,50 @@ +--- +page_type: sample +description: "Demonstrates how to use WIFICX for control flow and NetAdapterCx for data flow." +languages: +- cpp +products: +- windows +- windows-wdk +--- + +# WIFICX and NetAdapterCx Samples + +This sample illustrates how to leverage **WIFICX** for control flow and **NetAdapterCx** for data flow. It supports both **KMDF** and **UMDF(In Preview Stage)** drivers. + +## How to Build +1. Mount the EWDK ISO from a local drive (network share paths are not supported). +2. Run `LaunchBuildEnv.cmd`. +3. In the environment created in step 2, type `SetupVSEnv` and press **Enter**. +4. Navigate to the current folder and open the solution file, for example: + `X:\Windows-driver-samples\network\wlan\WIFICX\wificxsampleclient.sln` +5. Build the solution from the Visual Studio UI. + +## Interfaces and Abstraction +The sample interacts with three OS components: + +- **WDF** + `driver.cpp`, `device.cpp`, and `adapter.cpp` demonstrate proper registration for PnP and power event callbacks. WDF manages system PnP and power requests (e.g., power IRPs), so IHV drivers should follow the flow triggered through these callbacks. + +- **WDF Wi-Fi Class Extension (WIFICX)** + `wifixxxxx.cpp` files implement the **control path**, handling commands sent to Wi-Fi firmware (e.g., scan access points, connect, disconnect). + +- **WDF NetAdapter Class Extension (NetAdapterCx)** + `netvxxxx` files and classes implement the **data path**, managing network buffers and synchronizing with the control path for transfer start/stop operations. + +## Data Buffers from Firmware +The control path uses hardcoded data since this sample does not target real hardware. The data path uses **Emulated Network Link (ENL)**, which connects two virtual network adapters directly. Packets sent over one adapter are delivered to the other and vice versa. + +## Supported Scenarios +- [x] Scan access points and report BSS entries to the Windows UI. +- [x] Connect to an open access point from the Windows UI. +- [x] Disconnect from the connected access point. +- [x] Transfer data between two Wi-Fi device instances (e.g., ping and throughput test). + +## 🎥 Control & Data Path Demo Video +A walkthrough video demonstrating the Control & Data Path flow are available here: + +[▶ Watch Control Path Demo](video/ControlPath.mp4) + +[▶ Watch Data Path Demo](video/DataPath.mp4) + diff --git a/network/wlan/wificx/drivercode/SharedTypes.h b/network/wlan/wificx/drivercode/SharedTypes.h new file mode 100644 index 000000000..e454378b1 --- /dev/null +++ b/network/wlan/wificx/drivercode/SharedTypes.h @@ -0,0 +1,31 @@ +// Copyright (C) Microsoft Corporation. All rights reserved. +#pragma once + +// +// SharedTypes.h +// Central header for global definitions, macros, and shared structures. +// +#include "precomp.h" +#include <initguid.h> // for GUID defination + +// ============================= +// GUIDs or Constants +// ============================= +// {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 + +// ============================= +// OEM Device Service contract +// ============================= +// This GUID/opcode pair MUST match the OEM user-mode app (OEM\OemDeviceService.cpp). +// {2d6f9a14-3a1d-4f0a-9b7e-1c2e3a4b5c6d} +DEFINE_GUID(GUID_OEM_SAMPLE_DEVICE_SERVICE, + 0x2d6f9a14, 0x3a1d, 0x4f0a, 0x9b, 0x7e, 0x1c, 0x2e, 0x3a, 0x4b, 0x5c, 0x6d); + +// Opcode understood by the driver for the "hello / nice to meet you" exchange. +#define OEM_DEVICE_SERVICE_OPCODE_HELLO 0x00000001 + +// Payload strings exchanged with the OEM app. +#define OEM_DEVICE_SERVICE_REQUEST_STRING "Hello, My Driver" +#define OEM_DEVICE_SERVICE_RESPONSE_STRING "Nice to meet you, My OEM" \ No newline at end of file diff --git a/network/wlan/wificx/drivercode/adapter.cpp b/network/wlan/wificx/drivercode/adapter.cpp new file mode 100644 index 000000000..fd44c72b5 --- /dev/null +++ b/network/wlan/wificx/drivercode/adapter.cpp @@ -0,0 +1,83 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +#include "precomp.h" +#include "adapter.h" +#include "adapter.tmh" + +extern UCHAR NetvMacAddressBase[MAC_ADDR_LEN]; + +NetvAdapter* NetvAdapterGetContextFromWDFObject(NETADAPTER netAdapter) +{ + WifiNetvAdapter* wifiNetvAdapter = WifiNetvAdapterGetContext(netAdapter); + NetvAdapter* netvAdapter{ wifiNetvAdapter }; + return netvAdapter; +} + +WifiNetvAdapter::WifiNetvAdapter(NETADAPTER Handle, WDFDEVICE Device) : NetvAdapter(Handle, Device) +{ +} + +NTSTATUS WifiNetvAdapter::Initialize() +{ + if (WifiGetIhvDeviceContext(m_device)->netAdapters[WifiAdapterGetPortId(m_handle)] != WDF_NO_HANDLE) + { + return STATUS_SUCCESS; + } + return NetvAdapter::Initialize(); +} + +NTSTATUS WifiNetvAdapter::AdapterStart() +{ + TraceEntry(); + + NTSTATUS status = STATUS_SUCCESS; + + NET_ADAPTER_WAKE_MEDIA_CHANGE_CAPABILITIES wakeMediaChangeCapabilities; + NET_ADAPTER_WAKE_MEDIA_CHANGE_CAPABILITIES_INIT(&wakeMediaChangeCapabilities); + + wakeMediaChangeCapabilities.MediaConnect = TRUE; + wakeMediaChangeCapabilities.MediaDisconnect = TRUE; + + NetAdapterWakeSetMediaChangeCapabilities(m_handle, &wakeMediaChangeCapabilities); + + WIFI_ADAPTER_WAKE_CAPABILITIES wakeCap{}; + WIFI_ADAPTER_WAKE_CAPABILITIES_INIT(&wakeCap); + if (WIFI_IS_FIELD_AVAILABLE(WIFI_ADAPTER_WAKE_CAPABILITIES, ClientDriverDiagnostic)) + { + wakeCap.ClientDriverDiagnostic = true; + } + WifiAdapterSetWakeCapabilities(m_handle, &wakeCap); + + status = NetvAdapter::ConfigureDataCapabilities(); + if (!NT_SUCCESS(status)) + { + WFCError("%!FUNC!: NetvAdapter::ConfigureDataCapabilities failed with %!STATUS!", status); + return status; + } + + status = NetAdapterStart(m_handle); + if (!NT_SUCCESS(status)) + { + WFCError("%!FUNC!: NetAdapterStart failed with %!STATUS!", status); + return status; + } + + ASSERT(STATUS_SUCCESS == status); + TraceExit(status); + + return status; +} + +NTSTATUS WifiNetvAdapter::CreateRxQueue(NETRXQUEUE_INIT* NetRxQueueInit) +{ + return NetvAdapter::CreateRxQueue(NetRxQueueInit); +} + +NTSTATUS WifiNetvAdapter::CreateTxQueue(NETTXQUEUE_INIT* NetTxQueueInit) +{ + return NetvAdapter::CreateTxQueue(NetTxQueueInit); +} + +void WifiNetvAdapter::Destroy(void) +{ + return NetvAdapter::Destroy(); +} \ No newline at end of file diff --git a/network/wlan/wificx/drivercode/adapter.h b/network/wlan/wificx/drivercode/adapter.h new file mode 100644 index 000000000..0b7aa0931 --- /dev/null +++ b/network/wlan/wificx/drivercode/adapter.h @@ -0,0 +1,42 @@ +// Copyright (C) Microsoft Corporation. All rights reserved. +#pragma once +#include "device.h" +#include "netvadapter.h" + +// for STA TX DEMUX +#define MaxNumOfPeers 1 + +// 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); + +class WifiNetvAdapter : public NetvAdapter +{ +public: + WifiNetvAdapter(NETADAPTER Handle, WDFDEVICE Device); + + NTSTATUS + Initialize(); + + NTSTATUS + AdapterStart(); + + NTSTATUS + CreateRxQueue(NETRXQUEUE_INIT* NetRxQueueInit); + + NTSTATUS + CreateTxQueue(NETTXQUEUE_INIT* NetTxQueueInit); + + void Destroy(void); + + bool CanReportWifiWakeSourceTypeClientDriverDiagnostic; + +}; + +WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(WifiNetvAdapter, WifiNetvAdapterGetContext); \ No newline at end of file diff --git a/network/wlan/wificx/drivercode/device.cpp b/network/wlan/wificx/drivercode/device.cpp new file mode 100644 index 000000000..0e04d5625 --- /dev/null +++ b/network/wlan/wificx/drivercode/device.cpp @@ -0,0 +1,131 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. + +#include "precomp.h" + +#include "adapter.h" +#include "device.h" +#include "device.tmh" + +_Use_decl_annotations_ +NTSTATUS EvtDevicePrepareHardware(WDFDEVICE device, WDFCMRESLIST resourcesRaw, WDFCMRESLIST resourcesTranslated) +{ + UNREFERENCED_PARAMETER(resourcesRaw); + UNREFERENCED_PARAMETER(resourcesTranslated); + + WX_RETURN_NTSTATUS_IF_NOT_NT_SUCCESS_MSG( + WifiHAL::_Create(device), + "WifiHAL::_Create failed"); + + WFCInfo("Device=0x%p", device); + return STATUS_SUCCESS; +} + +_Use_decl_annotations_ +NTSTATUS EvtDeviceReleaseHardware(WDFDEVICE device, WDFCMRESLIST resourcesTranslated) +{ + UNREFERENCED_PARAMETER(resourcesTranslated); + + WFCInfo("Device=0x%p", device); + + return STATUS_SUCCESS; +} + +_Use_decl_annotations_ +NTSTATUS EvtWifiDeviceCreateAdapter(WDFDEVICE Device, NETADAPTER_INIT* AdapterInit) +{ + if (WifiAdapterInitGetType(AdapterInit) != WIFI_ADAPTER_EXTENSIBLE_STATION) + { + WFCError("%!FUNC!: Unsupported adapter type = 0x%x != 0x%x", WifiAdapterInitGetType(AdapterInit), WIFI_ADAPTER_EXTENSIBLE_STATION); + return STATUS_NOT_SUPPORTED; + } + + NET_ADAPTER_DATAPATH_CALLBACKS datapathCallbacks; + NET_ADAPTER_DATAPATH_CALLBACKS_INIT(&datapathCallbacks, EvtAdapterCreateTxQueue, EvtAdapterCreateRxQueue); + + NetAdapterInitSetDatapathCallbacks(AdapterInit, &datapathCallbacks); + + WDF_OBJECT_ATTRIBUTES adapterAttributes; + WDF_OBJECT_ATTRIBUTES_INIT(&adapterAttributes); + WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&adapterAttributes, WifiNetvAdapter); + adapterAttributes.EvtCleanupCallback = EvtAdapterCleanup; + +#ifdef NETV_SUPPORT_TX_DEMUXING + WIFI_ADAPTER_TX_DEMUX peerInfoDemux; + WIFI_ADAPTER_TX_PEER_ADDRESS_DEMUX_INIT(&peerInfoDemux, MaxNumOfPeers); + WifiAdapterInitAddTxDemux(AdapterInit, &peerInfoDemux); +#endif // NETV_SUPPORT_TX_DEMUXING + + + NETADAPTER netAdapter; + NTSTATUS ntStatus = NetAdapterCreate(AdapterInit, &adapterAttributes, &netAdapter); + if (!NT_SUCCESS(ntStatus)) + { + WFCError("%!FUNC!: NetAdapterCreate failed, status=0x%x", ntStatus); + return ntStatus; + } + + ntStatus = WifiAdapterInitialize(netAdapter); + ASSERT(NT_SUCCESS(ntStatus)); + if (!NT_SUCCESS(ntStatus)) + { + WFCError("%!FUNC!: WifiAdapterInitialize failed with %!STATUS!", ntStatus); + return ntStatus; + } + auto wifiNetvAdapter = new (reinterpret_cast<void*>(WifiNetvAdapterGetContext(netAdapter))) WifiNetvAdapter(netAdapter, Device); + ntStatus = wifiNetvAdapter->Initialize(); + if (!NT_SUCCESS(ntStatus)) + { + WFCError("%!FUNC!: WifiNetvAdapter::Initialize failed with %!STATUS!", ntStatus); + return ntStatus; + } + + ntStatus = wifiNetvAdapter->AdapterStart(); + ASSERT(NT_SUCCESS(ntStatus)); + if (!NT_SUCCESS(ntStatus)) + { + WFCError("%!FUNC!: WifiNetvAdapter::AdapterStart failed with %!STATUS!", ntStatus); + return ntStatus; + } + + auto wifiNetvDevice = WifiGetIhvDeviceContext(Device); + wifiNetvDevice->netAdapters[WifiAdapterGetPortId(netAdapter)] = netAdapter; + + WFCInfo("%!FUNC!: Success!"); + return ntStatus; +} + +_Use_decl_annotations_ +void EvtAdapterCleanup(_In_ WDFOBJECT NetAdapter) +{ + TraceEntry(); + auto wifiNetvAdapter = WifiNetvAdapterGetContext(NetAdapter); + wifiNetvAdapter->Destroy(); + TraceExit(STATUS_SUCCESS); +} + + +_Use_decl_annotations_ +NTSTATUS EvtWifiDeviceCreateWifiDirectDevice(WDFDEVICE, WIFIDIRECT_DEVICE_INIT*) +{ + NTSTATUS status = STATUS_SUCCESS; + TraceEntry(); + TraceExit(status); + return status; +} + + +_Use_decl_annotations_ +NTSTATUS +EvtAdapterCreateTxQueue(NETADAPTER Adapter, NETTXQUEUE_INIT* Init) +{ + TraceEntry(); + return WifiNetvAdapterGetContext(Adapter)->CreateTxQueue(Init); +} + +_Use_decl_annotations_ +NTSTATUS +EvtAdapterCreateRxQueue(NETADAPTER Adapter, NETRXQUEUE_INIT* Init) +{ + TraceEntry(); + return WifiNetvAdapterGetContext(Adapter)->CreateRxQueue(Init); +} diff --git a/network/wlan/wificx/drivercode/device.h b/network/wlan/wificx/drivercode/device.h new file mode 100644 index 000000000..c0dfac3c8 --- /dev/null +++ b/network/wlan/wificx/drivercode/device.h @@ -0,0 +1,29 @@ +// 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_WIFI_DEVICE_CREATE_ADAPTER EvtWifiDeviceCreateAdapter; +EVT_WIFI_DEVICE_CREATE_WIFIDIRECTDEVICE EvtWifiDeviceCreateWifiDirectDevice; +EVT_WIFI_DEVICE_SEND_COMMAND EvtWifiDeviceSendCommand; +EVT_WDF_OBJECT_CONTEXT_CLEANUP EvtAdapterCleanup; + +EVT_NET_ADAPTER_CREATE_TXQUEUE EvtAdapterCreateTxQueue; +EVT_NET_ADAPTER_CREATE_RXQUEUE EvtAdapterCreateRxQueue; + +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; + TLV_CONTEXT TlvContext; + NETADAPTER netAdapters[5]{}; +} 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 new file mode 100644 index 000000000..bbc4d1512 --- /dev/null +++ b/network/wlan/wificx/drivercode/driver.cpp @@ -0,0 +1,210 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +#include "precomp.h" + +#include "device.h" +#include "driver.h" +#include "driver.tmh" + +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. + +Return Value: + + 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(); + + // + // 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; + + 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 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); + + TraceEntry(); + + NTSTATUS status = STATUS_SUCCESS; + + // Configure the device init for NetAdapterCx (Data Path) + status = NetDeviceInitConfig(deviceInit); + if (!NT_SUCCESS(status)) + { + WFCError("NetDeviceInitConfig failed, status=0x%x", status); + goto Exit; + } + + // Configure the device init for WifiCx (Control Path) + status = WifiDeviceInitConfig(deviceInit); + if (!NT_SUCCESS(status)) + { + WFCError("WifiDeviceInitConfig failed, status=0x%x", status); + goto Exit; + } + + // 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; + WdfDeviceInitSetPnpPowerEventCallbacks(deviceInit, &pnpPowerCallbacks); + + // [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; + } + + // + // 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; + } + + // 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, // 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. + EvtWifiDeviceCreateWifiDirectDevice); // [Scope: No WiFi Direct support in this sample] + + // 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; + } + + // 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(); + + deviceIhvContext->TlvContext.AllocationContext = 0; + deviceIhvContext->TlvContext.PeerVersion = WifiDeviceGetOsWdiVersion(wdfIhvDevice); + +Exit: + TraceExit(status); + return status; +} + +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. + +--*/ +{ +#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 000000000..8573b30e6 --- /dev/null +++ b/network/wlan/wificx/drivercode/driver.h @@ -0,0 +1,12 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +#pragma once +#include "precomp.h" + +WDF_EXTERN_C_START + +DRIVER_INITIALIZE DriverEntry; + +EVT_WDF_DRIVER_DEVICE_ADD EvtWifiDriverDeviceAdd; +EVT_WDF_OBJECT_CONTEXT_CLEANUP EvtWifiDriverContextCleanup; + +WDF_EXTERN_C_END \ No newline at end of file diff --git a/network/wlan/wificx/drivercode/memorymanagement.cpp b/network/wlan/wificx/drivercode/memorymanagement.cpp new file mode 100644 index 000000000..088bad880 --- /dev/null +++ b/network/wlan/wificx/drivercode/memorymanagement.cpp @@ -0,0 +1,149 @@ +// Copyright (C) Microsoft Corporation. All rights reserved. +#include "precomp.h" + +#ifndef _KERNEL_MODE +#include <intrin.h> // for _ReturnAddress for user mode +#endif // UM + +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); + + +void* AllocateWdfMemoryBuffer(size_t Size, _In_ void* CallerForMemoryLeakTracking) +{ + size_t totalSize = 0; + if (!NT_SUCCESS(Wifi::SizeTAddSafe(Size, sizeof(WIFI_IHV_MEMORY_HEADER), &totalSize))) + { + NT_ASSERT(FALSE); + WFCError("Failed to calculate total size"); + return nullptr; + } + + // allocate the context memory to store the WIFI_IHV_MEMORY_CONTEXT + WDF_OBJECT_ATTRIBUTES attributes; + WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&attributes, WIFI_IHV_MEMORY_CONTEXT); + WDFMEMORY wdfMemoryBufferHandle = WDF_NO_HANDLE; + void* pWdfMemoryBuffer = nullptr; + + if (!NT_SUCCESS(WdfMemoryCreate(&attributes, NonPagedPoolNx, WIFI_DRIVER_DEFAULT_POOL_TAG, totalSize, &wdfMemoryBufferHandle, &pWdfMemoryBuffer))) + { + WFCError("Failed to allocate memory buffer"); + return nullptr; + } + + RtlZeroMemory(pWdfMemoryBuffer, totalSize); + + // store the wdf memory handle in the header for FreeWdfMemoryBuffer to find the handle + WIFI_IHV_MEMORY_HEADER* pMemoryHeader = static_cast<WIFI_IHV_MEMORY_HEADER*>(pWdfMemoryBuffer); + pMemoryHeader->HeaderSize = sizeof(WIFI_IHV_MEMORY_HEADER); + pMemoryHeader->WdfMemoryHandle = wdfMemoryBufferHandle; + + // store the caller and caller's caller for tracking memory leaks + auto memoryContext = GetWificxIhvMemoryContextFromHandle(wdfMemoryBufferHandle); + RtlZeroMemory(memoryContext, sizeof(WIFI_IHV_MEMORY_CONTEXT)); + memoryContext->ContextSize = sizeof(WIFI_IHV_MEMORY_CONTEXT); + memoryContext->pvCaller = CallerForMemoryLeakTracking; + + // hide the wdf memory header to the caller. + const ULONG_PTR wdfMemoryWithHeaderBuffer = reinterpret_cast<ULONG_PTR>(pWdfMemoryBuffer); + ULONG_PTR wdfMemoryPayloadOnlyBuffer{ 0 }; + if (!NT_SUCCESS(Wifi::ULongPtrAddSafe(wdfMemoryWithHeaderBuffer, sizeof(WIFI_IHV_MEMORY_HEADER), &wdfMemoryPayloadOnlyBuffer))) + { + NT_ASSERT(FALSE); + WFCError("Failed to calculate payload buffer address"); + return nullptr; + } + + return reinterpret_cast<void*>(wdfMemoryPayloadOnlyBuffer); +} + +void FreeWdfMemoryBuffer(_In_opt_ void* pBuffer) +{ + if (pBuffer == nullptr) // existing wdi code not checking for nullptr before delete, so we have to leave it as is + { + return; + } + const ULONG_PTR wdfMemoryPayloadOnlyBuffer = reinterpret_cast<ULONG_PTR>(pBuffer); + ULONG_PTR wdfMemoryWithHeaderBuffer{ 0 }; + if (!NT_SUCCESS(Wifi::ULongPtrSubSafe(wdfMemoryPayloadOnlyBuffer, sizeof(WIFI_IHV_MEMORY_HEADER), &wdfMemoryWithHeaderBuffer))) + { + NT_ASSERT(FALSE); + WFCError("Failed to calculate header buffer address"); + return; + } + + const auto wificxMemoryHeader = static_cast<WIFI_IHV_MEMORY_HEADER*>(reinterpret_cast<void*>(wdfMemoryWithHeaderBuffer)); + + // This is memory corruption detection logic, + // keep it, don't remove it. + NT_ASSERT(wificxMemoryHeader->HeaderSize == sizeof(WIFI_IHV_MEMORY_HEADER)); + + WdfObjectDelete(wificxMemoryHeader->WdfMemoryHandle); +} + +_Ret_writes_bytes_maybenull_(_Size) void* PlacementNewHelper(size_t _Size, PCPLACEMENT_NEW_ALLOCATION_CONTEXT AllocationContext) +{ + if (_Size <= AllocationContext->cbMaxSize) + { + RtlZeroMemory(AllocationContext->pbBuffer, _Size); + return AllocationContext->pbBuffer; + } + WFCError( + "Placement operator new called with insufficient buffer space (desired: %Iu, availible: %Iu)", _Size, AllocationContext->cbMaxSize); + return nullptr; +} + +void* __cdecl operator new(size_t Size) noexcept +{ + return AllocateWdfMemoryBuffer(Size, _ReturnAddress()); +} + +__forceinline void* __cdecl operator new(size_t _Size, ULONG_PTR AllocationContext) noexcept // for WIFICX TLV +{ + if (AllocationContext != 0) + { + return PlacementNewHelper(_Size, (PPLACEMENT_NEW_ALLOCATION_CONTEXT)AllocationContext); + } + return AllocateWdfMemoryBuffer(_Size, _ReturnAddress()); +} + +void __cdecl operator delete(void* pData) noexcept +{ + FreeWdfMemoryBuffer(pData); +} + +void __cdecl operator delete[](void* pData) noexcept +{ + FreeWdfMemoryBuffer(pData); +} + +void __cdecl operator delete(void* pData, ULONG_PTR) noexcept // For WIFICX TLV +{ + FreeWdfMemoryBuffer(pData); +} + +void __cdecl operator delete[](void* pData, ULONG_PTR) noexcept // For WIFICX TLV +{ + FreeWdfMemoryBuffer(pData); +} \ No newline at end of file diff --git a/network/wlan/wificx/drivercode/precomp.h b/network/wlan/wificx/drivercode/precomp.h new file mode 100644 index 000000000..1b0f808e0 --- /dev/null +++ b/network/wlan/wificx/drivercode/precomp.h @@ -0,0 +1,33 @@ +// Copyright (C) Microsoft Corporation. All rights reserved. +#pragma once + +#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 +#include <wdf.h> + +// Network Device Headers +#include <netadaptercx.h> +#include <netiodef.h> + +// WIFI Device Headers +#include <wificx.h> +#include "umkmfusion.h" +#include "dot11wificxintf.h" +#include "dot11wificxtypes.hpp" +#include "TLVGeneratorParser.hpp" +#include "SharedTypes.h" + +// WPP Tracing Headers +#include "trace.h" + +// Minimal placement-new to match operator new(size_t, void*) +// TLV generator/parser memory interface has the ULONG_PTR version +inline void* operator new(size_t, void* p) noexcept { return p; } +inline void operator delete(void*, void*) noexcept { /* no-op */ } diff --git a/network/wlan/wificx/drivercode/trace.h b/network/wlan/wificx/drivercode/trace.h new file mode 100644 index 000000000..324e1c87e --- /dev/null +++ b/network/wlan/wificx/drivercode/trace.h @@ -0,0 +1,183 @@ +// +// Copyright (C) Microsoft. All rights reserved. +// +#pragma once +#ifndef TRACE_H +#define TRACE_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) + +#define WPP_RECORDER_LEVEL_ARGS(LEVEL) WPP_RECORDER_LEVEL_FLAGS_ARGS(LEVEL, DUMMY) +#define WPP_RECORDER_LEVEL_FILTER(LEVEL) WPP_RECORDER_LEVEL_FLAGS_FILTER(LEVEL, DUMMY) + +#define WPP_RECORDER_LEVEL_EXP_FILTER(LEVEL, EXP) WPP_RECORDER_LEVEL_FILTER(LEVEL) +#define WPP_RECORDER_LEVEL_EXP_ARGS(LEVEL, EXP) WPP_RECORDER_LEVEL_ARGS(LEVEL) + +// Suppress warnings about constants in logical expressions because the +// level is often a constant +#define WPP_LEVEL_PRE(LEVEL) __pragma(warning(suppress : 25039 25040)) +#define WPP_LEVEL_EXP_PRE(LEVEL, EXP) __pragma(warning(suppress : 25039 25040)) + +#define TraceEntry(...) +#define TraceExit(Status) +#define WFCTrace(Format, ...) +#define WFCError(Format, ...) +#define WFCInfo(Format, ...) + +// begin_wpp config +// USEPREFIX (TraceEntry, "%!STDPREFIX!"); +// FUNC TraceEntry{LEVEL=TRACE_LEVEL_VERBOSE}(...); +// USESUFFIX (TraceEntry, "--> %!FUNC!"); +// end_wpp + +// begin_wpp config +// USEPREFIX (TraceExit, "%!STDPREFIX!"); +// FUNC TraceExit{LEVEL=TRACE_LEVEL_VERBOSE}(EXP); +// USESUFFIX (TraceExit, "<-- %!FUNC!: 0x%x", EXP); +// end_wpp + +// +// Flat-C trace commands +// +// begin_wpp config +// +// USEPREFIX (WFCError, "%!STDPREFIX! %!FUNC!: [ERROR]"); +// FUNC WFCError{LEVEL=TRACE_LEVEL_ERROR}(MSG, ...); +// +// USEPREFIX (WFCInfo, "%!STDPREFIX! %!FUNC!: [INFO]"); +// FUNC WFCInfo{LEVEL=TRACE_LEVEL_INFORMATION}(MSG, ...); +// +// USEPREFIX (WFCTrace, "%!STDPREFIX! %!FUNC!: [TRACE]"); +// FUNC WFCTrace{LEVEL=TRACE_LEVEL_VERBOSE}(MSG, ...); +// +// end_wpp +// + +#define MACRO_START \ + do \ + { +#define MACRO_END \ + } \ + while (0) + +// +// WPP Macros: WX_RETURN_NTSTATUS_IF_NOT_NT_SUCCESS_MSG +// +// begin_wpp config +// 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) \ + MACRO_START NTSTATUS nt__wpp = (ntexpr); \ + if (!NT_SUCCESS(nt__wpp)) \ + { +#define WPP_COMPNAME_LEVEL_NTEXPR_POST(comp, level, ntexpr) \ + ; \ + return nt__wpp; \ + } \ + MACRO_END +#define WPP_RECORDER_COMPNAME_LEVEL_NTEXPR_FILTER(comp, level, ntexpr) WPP_RECORDER_LEVEL_FLAGS_FILTER(level, comp) +#define WPP_RECORDER_COMPNAME_LEVEL_NTEXPR_ARGS(comp, level, ntexpr) WPP_RECORDER_LEVEL_FLAGS_ARGS(level, comp) + +// +// WPP Macros: WX_RETURN_INSUFFICIENT_RESOURCES_IF_NULL_MSG +// +// 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! !! WifiIhv - %!FUNC!: "); +// USESUFFIX (WX_RETURN_INSUFFICIENT_RESOURCES_IF_NULL_MSG, "%!s! is null", #PTR2); +// end_wpp + +#define WPP_COMPNAME_LEVEL_PTR2_PRE(comp, level, ptr) \ + MACRO_START if ((ptr == nullptr)) \ + { +#define WPP_COMPNAME_LEVEL_PTR2_POST(comp, level, ptr) \ + ; \ + return STATUS_INSUFFICIENT_RESOURCES; \ + } \ + MACRO_END +#define WPP_RECORDER_COMPNAME_LEVEL_PTR2_FILTER(comp, level, ptr) WPP_RECORDER_LEVEL_FLAGS_FILTER(level, comp) +#define WPP_RECORDER_COMPNAME_LEVEL_PTR2_ARGS(comp, level, ptr) WPP_RECORDER_LEVEL_FLAGS_ARGS(level, comp) + +// +// WPP Macros: WX_RETURN_IF_NULL_MSG +// +// begin_wpp config +// FUNC WX_RETURN_IF_NULL_MSG{COMPNAME=DUMMY,LEVEL=TRACE_LEVEL_ERROR}(PTR3,MSG,...); +// USEPREFIX (WX_RETURN_IF_NULL_MSG, "%!STDPREFIX! !! WifiIhv - %!FUNC!: "); +// USESUFFIX (WX_RETURN_IF_NULL_MSG, "%!s! is null", #PTR3); +// end_wpp + +#define WPP_COMPNAME_LEVEL_PTR3_PRE(comp, level, ptr) \ + MACRO_START if ((ptr == nullptr)) \ + { +#define WPP_COMPNAME_LEVEL_PTR3_POST(comp, level, ptr) \ + ; \ + return; \ + } \ + MACRO_END +#define WPP_RECORDER_COMPNAME_LEVEL_PTR3_FILTER(comp, level, ptr) WPP_RECORDER_LEVEL_FLAGS_FILTER(level, comp) +#define WPP_RECORDER_COMPNAME_LEVEL_PTR3_ARGS(comp, level, ptr) WPP_RECORDER_LEVEL_FLAGS_ARGS(level, comp) + +typedef struct _ByteArray +{ + USHORT usLength; + const void* pvBuffer; +} ByteArray; + +__inline ByteArray log_lenstr(ULONG len, const void* buf) +{ + ByteArray xs{}; + xs.usLength = (USHORT)len; + xs.pvBuffer = buf; + return xs; +} + +#define WPP_LOGHEXDUMP(x) \ + WPP_LOGPAIR(2, &((x).usLength)) \ + WPP_LOGPAIR((x).usLength, (x).pvBuffer) + +#define WPP_LOGANSISTRING(x) \ + WPP_LOGPAIR(2, &((x).usLength)) \ + WPP_LOGPAIR((x).usLength, (x).pvBuffer) + +#define WPP_LOGMACADDR(x) WPP_LOGPAIR(6, x) + +#define WPP_LOGDOT11SSID(x) \ + WPP_LOGPAIR(2, &((*(x)).uSSIDLength)) \ + WPP_LOGPAIR((*(x)).uSSIDLength, ((const char*)(*(x)).ucSSID)) + +// +// Custom types +// +// begin_wpp config +// +// DEFINE_CPLX_TYPE(HEXDUMP, WPP_LOGHEXDUMP, ByteArray, ItemHEXDump,"s", _HEX_, 0,2); +// WPP_FLAGS(-DLOG_HEXDUMP(len,str)=log_lenstr(len,str)); +// +// DEFINE_CPLX_TYPE(ANSISTRING, WPP_LOGANSISTRING, ByteArray, ItemPString,"s", _SSID_, 0,2); +// WPP_FLAGS(-DLOG_ANSISTRING(len,str)=log_lenstr(len,str)); +// +// DEFINE_CPLX_TYPE(DOT11SSID, WPP_LOGDOT11SSID, DOT11_SSID*, ItemPString,"s", _SSID_, 0,2); +// +// DEFINE_CPLX_TYPE(MACADDR, WPP_LOGMACADDR, DOT11_MAC_ADDRESS, ItemMACAddr,"s", _MAC_, 0); +// +// CUSTOM_TYPE(MESSAGE_ID, ItemEnum(WDI_TLV::ENUMS::MESSAGE_ID)); +// end_wpp +// + +#endif diff --git a/network/wlan/wificx/drivercode/umkmfusion.h b/network/wlan/wificx/drivercode/umkmfusion.h new file mode 100644 index 000000000..8f0db3f8a --- /dev/null +++ b/network/wlan/wificx/drivercode/umkmfusion.h @@ -0,0 +1,131 @@ +// Copyright (C) Microsoft Corporation. All rights reserved. +#pragma once +#include "precomp.h" + +#include "winerror.h" + +#ifdef _KERNEL_MODE +#include "ntintsafe.h" +#else +#include "intsafe.h" +#endif + +namespace Wifi +{ + _inline + NTSTATUS ConvertHRESULTToNTSTATUS(HRESULT hr) { + if ((hr & FACILITY_NT_BIT) == FACILITY_NT_BIT) { + return static_cast<NTSTATUS>(hr & ~FACILITY_NT_BIT); // Strip NT bit safely + } + + // Trace the HRESULT value for diagnostics + return SUCCEEDED(hr) ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL; + } + + __inline + NTSTATUS ConvertNDISSTATUSToNTSTATUS(NDIS_STATUS NdisStatus) + { + if (NT_SUCCESS(NdisStatus) && NdisStatus != NDIS_STATUS_SUCCESS && NdisStatus != NDIS_STATUS_PENDING && + NdisStatus != NDIS_STATUS_INDICATION_REQUIRED) + { + // Case where an NDIS error is incorrectly mapped as a success by NT_SUCCESS macro + return STATUS_UNSUCCESSFUL; + } + else + { + switch (NdisStatus) + { + case NDIS_STATUS_BUFFER_TOO_SHORT: + return STATUS_BUFFER_TOO_SMALL; + break; + default: + return (NTSTATUS)NdisStatus; + break; + } + } + } + + __inline + NDIS_STATUS ConvertNTSTATUSToNDISSTATUS(NTSTATUS NtStatus) + { + if (NT_SUCCESS(NtStatus) && NtStatus != STATUS_PENDING && NtStatus != STATUS_NDIS_INDICATION_REQUIRED) + { + return NDIS_STATUS_SUCCESS; + } + else + { + switch (NtStatus) + { + case STATUS_BUFFER_TOO_SMALL: + return NDIS_STATUS_BUFFER_TOO_SHORT; + break; + default: + return (NDIS_STATUS)NtStatus; + break; + } + } + } + + _Must_inspect_result_ + _inline + NTSTATUS SizeTAddSafe(_In_ size_t Augend, _In_ size_t Addend, _Out_ _Deref_out_range_(== , Augend + Addend) size_t* pResult) + { +#ifdef _KERNEL_MODE + return RtlSizeTAdd(Augend, Addend, pResult); +#else + return ConvertHRESULTToNTSTATUS(SizeTAdd(Augend, Addend, pResult)); +#endif + } + + _Must_inspect_result_ + __inline + NTSTATUS ULongPtrAddSafe( + _In_ ULONGLONG ullAugend, + _In_ ULONGLONG ullAddend, + _Out_ _Deref_out_range_(== , ullAugend + ullAddend) ULONGLONG* pullResult) + { +#ifdef _KERNEL_MODE + return RtlULongPtrAdd(ullAugend, ullAddend, pullResult); +#else + return ConvertHRESULTToNTSTATUS(ULongPtrAdd(ullAugend, ullAddend, pullResult)); +#endif + } + + _Must_inspect_result_ + __inline + NTSTATUS ULongPtrSubSafe( + _In_ ULONGLONG ullMinuend, + _In_ ULONGLONG ullSubtrahend, + _Out_ _Deref_out_range_(== , ullMinuend - ullSubtrahend) ULONGLONG* pullResult) + { +#ifdef _KERNEL_MODE + return RtlULongPtrSub(ullMinuend, ullSubtrahend, pullResult); +#else + return ConvertHRESULTToNTSTATUS(ULongPtrSub(ullMinuend, ullSubtrahend, pullResult)); +#endif + } +} + +#ifndef _KERNEL_MODE +// TODO: Cleanup when EWDK contains the payload of https://microsoft.visualstudio.com/OS/_workitems/edit/58447986 +typedef enum _NDIS_FRAME_HEADER +{ + NdisFrameHeaderUndefined, + NdisFrameHeaderMac, + NdisFrameHeaderArp, + NdisFrameHeaderIPv4, + NdisFrameHeaderIPv6, + NdisFrameHeaderUdp, + NdisFrameHeaderMaximum +}NDIS_FRAME_HEADER, * PNDIS_FRAME_HEADER; + +typedef enum _NDIS_RECEIVE_FILTER_TEST +{ + NdisReceiveFilterTestUndefined, + NdisReceiveFilterTestEqual, + NdisReceiveFilterTestMaskEqual, + NdisReceiveFilterTestNotEqual, + NdisReceiveFilterTestMaximum +}NDIS_RECEIVE_FILTER_TEST, * PNDIS_RECEIVE_FILTER_TEST; +// End of TODO +#endif // !_KERNEL_MODE \ No newline at end of file diff --git a/network/wlan/wificx/drivercode/wifihal.cpp b/network/wlan/wificx/drivercode/wifihal.cpp new file mode 100644 index 000000000..e7aaec1f1 --- /dev/null +++ b/network/wlan/wificx/drivercode/wifihal.cpp @@ -0,0 +1,1118 @@ +// Copyright (C) Microsoft Corporation. All rights reserved. + +#include "precomp.h" +#include "wifirequest.h" +#include "wifiHALtestdata.h" +#include "WifiHal.h" +#include "WifiHal.tmh" + +_Use_decl_annotations_ +NTSTATUS WifiHAL::_Create(WDFDEVICE Device) +{ + // Download firmware, initialize hardware, etc. + + // Create WifiHAL object and associate it with Device context after FW ready + WDF_OBJECT_ATTRIBUTES attributes; + WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&attributes, WifiHAL); + attributes.EvtCleanupCallback = WifiHAL::_OnCleanup; + + void* memory = nullptr; + WX_RETURN_NTSTATUS_IF_NOT_NT_SUCCESS_MSG( + WdfObjectAllocateContext(Device, &attributes, &memory), "Failed to allocate WifiHAL context. Device=%p", Device); + + // Obtain the context and initialize it + auto* wifiHal = reinterpret_cast<WifiHAL*>(memory); + wifiHal->Initialize(Device, &WifiGetIhvDeviceContext(Device)->TlvContext); + + WX_RETURN_NTSTATUS_IF_NOT_NT_SUCCESS_MSG( + wifiHal->WifiIhvSetDeviceCapabilities(), + "Failed to set device capabilities. Device=%p", Device); + + return STATUS_SUCCESS; +} + +_Use_decl_annotations_ +void WifiHAL::_OnCleanup(WDFOBJECT Object) +{ + UNREFERENCED_PARAMETER(Object); +} + +_Use_decl_annotations_ +void WifiHAL::Initialize(WDFDEVICE Device, PCTLV_CONTEXT TlvContext) +{ + m_Device = Device; + m_TlvContext = TlvContext; + m_CurrentRadioState = 1; // On by default + m_LastConnectEntryId = 0; + m_LastConnectTransactionId = 0; + m_LastAuthAlgo = WDI_AUTH_ALGO_UNKNOWN; + RtlZeroMemory(&m_ConnectedPeer, sizeof(m_ConnectedPeer)); + // Initialize link addresses and supported bands (previously in-class const init) + m_LocalLinkAddresses[0] = { 0x11, 0x01, 0x02, 0x03, 0x04, 0x21 }; + m_LocalLinkAddresses[1] = { 0x11, 0x01, 0x02, 0x03, 0x04, 0x22 }; + m_SupportedBands = (WDI_BAND_ID_2400 | WDI_BAND_ID_5000 | WDI_BAND_ID_6000); +} + +NTSTATUS WifiHAL::WifiIhvIsDeviceReadyForRequest() +{ + NTSTATUS status = + ((m_Device != WDF_NO_HANDLE) // Make sure device is initialized (since this is hardware abstraction layer, IHV can replace with firmware state) + && (WifiGetIhvDeviceContext(m_Device)->netAdapters[0] != WDF_NO_HANDLE) ? STATUS_SUCCESS : STATUS_DEVICE_NOT_READY);// In WIFICX, the logic sits on top of primary STA adapter, make sure it is initialized + if(NT_SUCCESS(status) == FALSE) + { + WFCError( + "Device not ready for request. Device=%p, primaryStaAdapter=%p", + m_Device, + (m_Device != WDF_NO_HANDLE) ? WifiGetIhvDeviceContext(m_Device)->netAdapters[0] : WDF_NO_HANDLE); + } + return status; +} + +NTSTATUS WifiHAL::WifiIhvGetPendingTransitionStatus() +{ + return m_LastConnectTransactionId ==0 ? STATUS_SUCCESS : STATUS_PENDING; +} + +NTSTATUS WifiHAL::WifiIhvSetDeviceCapabilities() +{ + WIFI_DEVICE_CAPABILITIES deviceCaps = {}; + WIFI_DEVICE_CAPABILITIES_INIT(&deviceCaps); + + deviceCaps.HardwareRadioState = TRUE; + deviceCaps.SoftwareRadioState = TRUE; + RtlCopyMemory(deviceCaps.FirmwareVersion, "1.0.0", sizeof("1.0.0")); + 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(m_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(m_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(m_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(m_Device, &PhyCaps), + "Failed to set PHY capabilities"); + + return STATUS_SUCCESS; +} + +_Use_decl_annotations_ +NTSTATUS WifiHAL::WifiIhvReset(const WDI_TASK_DOT11_RESET_PARAMETERS& ResetParameters, const PWDI_MESSAGE_HEADER, UINT) +{ + 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; + + return STATUS_SUCCESS; +} + +_Use_decl_annotations_ +NTSTATUS WifiHAL::WifiIhvSetRadioState(const WDI_SET_RADIO_STATE_PARAMETERS& RadioState, const PWDI_MESSAGE_HEADER pWdiHeader, UINT) +{ + WFCInfo("Setting OS requested Radio State: SoftwareRadioState=%u\n", RadioState.SoftwareRadioState); + 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, m_TlvContext, &cbOutput, &pOutput) == NDIS_STATUS_SUCCESS) + { + WFCInfo("Indicate OS with Radio State: SoftwareRadioState=%u\n", m_CurrentRadioState); + WifiIhvSendUnsolicitedIndicationToOs(m_Device, pWdiHeader, WDI_INDICATION_RADIO_STATUS, pOutput, cbOutput); + FreeGenerated(pOutput); + } + } + + return STATUS_SUCCESS; +} + +_Use_decl_annotations_ +NTSTATUS WifiHAL::WifiIhvScan(const WDI_SCAN_PARAMETERS& ScanParameters, const PWDI_MESSAGE_HEADER pWdiHeader, UINT) +{ + 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 + WifiIhvSendUnsolicitedIndicationToOs( + m_Device, + pWdiHeader, + WDI_INDICATION_BSS_ENTRY_LIST, + 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')) + { + WifiIhvSendUnsolicitedIndicationToOs( + m_Device, pWdiHeader, WDI_INDICATION_BSS_ENTRY_LIST, s_TLV_BSS_Entry_ProbeResponse_8_Hidden, sizeof(s_TLV_BSS_Entry_ProbeResponse_8_Hidden)); + } + + return STATUS_SUCCESS; +} + +_Use_decl_annotations_ +NTSTATUS WifiHAL::WifiIhvConnect(const WDI_TASK_CONNECT_PARAMETERS& ConnectParameters, const PWDI_MESSAGE_HEADER pWdiHeader, UINT) +{ + NT_ASSERT(m_LastConnectEntryId == 0); +#ifdef NETV_SUPPORT_TX_DEMUXING + if (m_LastConnectEntryId != 0) // Not Disconnected State + { + WifiAdapterRemovePeer( + WifiGetIhvDeviceContext(m_Device)->netAdapters[pWdiHeader->PortId], + reinterpret_cast<NET_EUI48_ADDRESS*>(&m_ConnectedPeer)); + } +#endif //NETV_SUPPORT_TX_DEMUXING + WX_RETURN_NTSTATUS_IF_NOT_NT_SUCCESS_MSG(WifiIhvPerformAssociation( + &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) + { + m_LastConnectTransactionId = pWdiHeader->TransactionId; + } + else + { + m_LastConnectTransactionId = 0; + } + return STATUS_SUCCESS; +} + +_Use_decl_annotations_ +NTSTATUS WifiHAL::WifiIhvSendLinkStateIndication(_In_ PWDI_MESSAGE_HEADER pWdiHeader, ULONG numLinks) +{ + // Report link quality + NTSTATUS ntStatus = STATUS_SUCCESS; + PWIFI_IHV_DEVICE_CONTEXT pDeviceContext = WifiGetIhvDeviceContext(m_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) + { + WifiIhvSendUnsolicitedIndicationToOs(m_Device, pWdiHeader, WDI_INDICATION_LINK_STATE_CHANGE, 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( + const struct ArrayOfElements<WDI_CONNECT_BSS_ENTRY_CONTAINER>* pPreferredBSSEntryList, + const struct ArrayOfElements<WDI_AUTH_ALGORITHM>* pAuthenticationAlgorithms, + const 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_IHV_DEVICE_CONTEXT pDeviceContext = WifiGetIhvDeviceContext(m_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; + m_LastConnectTransactionId = pWdiHeader->TransactionId; +#ifdef NETV_SUPPORT_TX_DEMUXING + // add peer on datapath + WifiAdapterAddPeer(pDeviceContext->netAdapters[pWdiHeader->PortId], + reinterpret_cast<NET_EUI48_ADDRESS*>(g_ConnectEntries[connectEntry].pMacAddress)); +#endif // NETV_SUPPORT_TX_DEMUXING +#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 ..."); + + WifiIhvSendUnsolicitedIndicationToOs(m_Device, pWdiHeader, WDI_INDICATION_SAE_AUTH_PARAMS_NEEDED, pOutput, cbOutput); + + FreeGenerated(pOutput); + + break; + } + } + + // Get the assoc status + RtlCopyMemory(&assocStatus, &pAssociationResult[18], sizeof(ULONG)); + + // Send the association indication + WifiIhvSendUnsolicitedIndicationToOs( + m_Device, + pWdiHeader, + WDI_INDICATION_ASSOCIATION_RESULT, + 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(pWdiHeader, 2); + } + + return ntStatus; +} + +_Use_decl_annotations_ +NTSTATUS WifiHAL::WifiIhvSetSaeAuthParams(const WDI_SET_SAE_AUTH_PARAMS_COMMAND& setSAEAuthParams, const PWDI_MESSAGE_HEADER pWdiHeader, UINT) +{ + //Since this is DIRECT OID, need to check the m_LastConnectTransactionId match + if (pWdiHeader->TransactionId != m_LastConnectTransactionId) + { + WFCError("WDI_SET_SAE_AUTH_PARAMS called with invalid TransactionId: %llu, expected: %llu\n", + pWdiHeader->TransactionId, m_LastConnectTransactionId); + return STATUS_INVALID_DEVICE_REQUEST; + } + + 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; + } + + WifiIhvSendUnsolicitedIndicationToOs( + m_Device, + pWdiHeader, + WDI_INDICATION_ASSOCIATION_RESULT, + 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(pWdiHeader, 1), + "Failed WifiIhvSendLinkStateIndication"); + + // Complete the transaction to let the M4 hanlder WifiIhvGetPendingTransitionStatus know that association is complete + m_LastConnectTransactionId = 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 + return STATUS_SUCCESS; + } + + RtlCopyMemory(SAEAuthParamsNeeded.BssId.Address, &g_ConnectEntries[m_LastConnectEntryId].pMacAddress, sizeof(DOT11_MAC_ADDRESS)); + + auto ndisStatus = + GenerateWdiIndicationSaeAuthParamsNeeded(&SAEAuthParamsNeeded, 0, m_TlvContext, &cbOutput, &pOutput); + if (ndisStatus == NDIS_STATUS_SUCCESS) + { + WifiIhvSendUnsolicitedIndicationToOs(m_Device, pWdiHeader, WDI_INDICATION_SAE_AUTH_PARAMS_NEEDED, 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_ +NTSTATUS WifiHAL::WifiIhvDisconnect(const WDI_TASK_DISCONNECT_PARAMETERS&, const PWDI_MESSAGE_HEADER pWdiHeader, UINT) +{ + 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 + }; + WDI_ASSOC_STATUS DisassocStatus = WDI_ASSOC_STATUS_DISASSOCIATED_BY_HOST; + + RtlCopyMemory(&s_TLV_Disassociation[4], &m_ConnectedPeer, sizeof(DOT11_MAC_ADDRESS)); + RtlCopyMemory(&s_TLV_Disassociation[10], &DisassocStatus, sizeof(ULONG)); + + // Send the disassociation indication + WifiIhvSendUnsolicitedIndicationToOs(m_Device, pWdiHeader, WDI_INDICATION_DISASSOCIATION, s_TLV_Disassociation, sizeof(s_TLV_Disassociation)); + + m_LastConnectEntryId = 0; // Disconnected State + +#ifdef NETV_SUPPORT_TX_DEMUXING + WifiAdapterRemovePeer( + WifiGetIhvDeviceContext(m_Device)->netAdapters[pWdiHeader->PortId], + reinterpret_cast<NET_EUI48_ADDRESS*>(&m_ConnectedPeer)); +#endif + RtlZeroMemory(&m_ConnectedPeer, sizeof(DOT11_MAC_ADDRESS)); + + return STATUS_SUCCESS; +} + +// -------- WDI_GET_SUPPORTED_DEVICE_SERVICES (OID_WDI_GET_SUPPORTED_DEVICES) -------- +// Property GET: the request has no input (Inputs is empty). Builds the +// WDI_TLV_DEVICE_SERVICE_GUID_LIST result advertising GUID_OEM_SAMPLE_DEVICE_SERVICE and +// serializes it via the generated TLV generator, so the OS learns which device services +// this driver supports. +// OutBuffer receives the full WDI message (header + TLVs); BytesWritten = total length. +_Use_decl_annotations_ +NTSTATUS WifiHAL::WifiIhvGetSupportedDeviceServices(const WDI_GET_SUPPORTED_DEVICE_SERVICES_INPUTS& Inputs, void* OutBuffer, ULONG OutBufferLen, ULONG& BytesWritten) +{ + UNREFERENCED_PARAMETER(Inputs); // GET request carries no input data + + BytesWritten = sizeof(WDI_MESSAGE_HEADER); + + if (OutBuffer == nullptr || OutBufferLen < sizeof(WDI_MESSAGE_HEADER)) + { + WFCError("GetSupportedDeviceServices: invalid out buffer (OutBufferLen=%u)", OutBufferLen); + return STATUS_INVALID_PARAMETER; + } + + // WDI_TLV_DEVICE_SERVICE_GUID_LIST: a list containing our single device service GUID. + // WDI_GUID_LIST_CONTAINER is ArrayOfElements<GUID>; SimpleAssign points it at our + // stack array (the generator copies the data while serializing the TLV). + GUID supportedServices[] = { GUID_OEM_SAMPLE_DEVICE_SERVICE }; + + WDI_GET_SUPPORTED_DEVICE_SERVICES_PARAMETERS results{}; + results.DeviceServiceGUIDList.SimpleAssign(supportedServices, ARRAYSIZE(supportedServices)); + + // Generate the TLV byte stream. ReservedHeaderLength reserves room for the + // WDI_MESSAGE_HEADER at the front of the produced buffer. + ULONG generatedLength = 0; + UINT8* pGenerated = nullptr; + + NDIS_STATUS genStatus = GenerateWdiGetSupportedDeviceServices( + &results, sizeof(WDI_MESSAGE_HEADER), m_TlvContext, &generatedLength, &pGenerated); + + NTSTATUS ntStatus = Wifi::ConvertNDISSTATUSToNTSTATUS(genStatus); + if (!NT_SUCCESS(ntStatus) || pGenerated == nullptr) + { + WFCError("GetSupportedDeviceServices: Generate failed, status=%!STATUS!", ntStatus); + return ntStatus; + } + + if (OutBufferLen < generatedLength) + { + WFCError("GetSupportedDeviceServices: out buffer too small (have=%u need=%u)", + OutBufferLen, generatedLength); + FreeGenerated(pGenerated); + return STATUS_BUFFER_TOO_SMALL; + } + + RtlCopyMemory(OutBuffer, pGenerated, generatedLength); + BytesWritten = generatedLength; + FreeGenerated(pGenerated); + + WFCInfo("GetSupportedDeviceServices: advertised %u device service(s), %u bytes", + ARRAYSIZE(supportedServices), BytesWritten); + return STATUS_SUCCESS; +} + +// -------- OEM Device Service Command (OID_WDI_DEVICE_SERVICE_COMMAND) -------- +// Reads the request data blob (WDI_TLV_DEVICE_SERVICE_PARAMS_DATA_BLOB) parsed into +// Inputs.Params, expects "Hello, My Driver", and returns "Nice to meet you, My OEM" +// as the response data blob, serialized via the generated TLV generator. +// OutBuffer receives the full WDI message (header + TLVs); BytesWritten = total length. +_Use_decl_annotations_ +NTSTATUS WifiHAL::WifiIhvDeviceServiceCommand(const WDI_DEVICE_SERVICE_COMMAND_INPUTS& Inputs, void* OutBuffer, ULONG OutBufferLen, ULONG& BytesWritten) +{ + BytesWritten = sizeof(WDI_MESSAGE_HEADER); + + if (OutBuffer == nullptr || OutBufferLen < sizeof(WDI_MESSAGE_HEADER)) + { + WFCError("OEM device service: invalid out buffer (OutBufferLen=%u)", OutBufferLen); + return STATUS_INVALID_PARAMETER; + } + + // Log the request data blob ("Hello, My Driver"), if present. + if (Inputs.Optional.Params_IsPresent && + Inputs.Params.ElementCount > 0 && + Inputs.Params.pElements[0].ElementCount > 0 && + Inputs.Params.pElements[0].pElements != nullptr) + { + WFCInfo("OEM device service: opcode=0x%08X, received %u-byte data blob: %hs", + Inputs.Opcode, + Inputs.Params.pElements[0].ElementCount, + reinterpret_cast<const char*>(Inputs.Params.pElements[0].pElements)); + } + else + { + WFCInfo("OEM device service: opcode=0x%08X, no input data blob", Inputs.Opcode); + } + + // Build the response data blob ("Nice to meet you, My OEM"), including the null terminator. + // SimpleAssign points the blob at this buffer (no copy); the generator copies the bytes + // while serializing, and the buffer outlives that call. + UINT8 responseBytes[] = OEM_DEVICE_SERVICE_RESPONSE_STRING; + + WDI_BYTE_BLOB responseBlob{}; + responseBlob.SimpleAssign(responseBytes, static_cast<UINT32>(sizeof(responseBytes))); + + WDI_DEVICE_SERVICE_COMMAND_PARAMETERS params{}; + params.Optional.Params_IsPresent = TRUE; + params.Params.SimpleAssign(&responseBlob, 1); + + // Serialize WDI_TLV_DEVICE_SERVICE_PARAMS_DATA_BLOB into the response message. + ULONG generatedLength = 0; + UINT8* pGenerated = nullptr; + + NDIS_STATUS genStatus = GenerateWdiDeviceServiceCommand( + &params, sizeof(WDI_MESSAGE_HEADER), m_TlvContext, &generatedLength, &pGenerated); + + NTSTATUS ntStatus = Wifi::ConvertNDISSTATUSToNTSTATUS(genStatus); + if (!NT_SUCCESS(ntStatus) || pGenerated == nullptr) + { + WFCError("OEM device service: Generate failed, status=%!STATUS!", ntStatus); + return ntStatus; + } + + if (OutBufferLen < generatedLength) + { + WFCError("OEM device service: out buffer too small (have=%u need=%u)", + OutBufferLen, generatedLength); + FreeGenerated(pGenerated); + return STATUS_BUFFER_TOO_SMALL; + } + + RtlCopyMemory(OutBuffer, pGenerated, generatedLength); + BytesWritten = generatedLength; + FreeGenerated(pGenerated); + + WFCInfo("OEM device service: responded with \"%hs\" (%u bytes)", + reinterpret_cast<const char*>(responseBytes), BytesWritten); + return STATUS_SUCCESS; +} diff --git a/network/wlan/wificx/drivercode/wifihal.h b/network/wlan/wificx/drivercode/wifihal.h new file mode 100644 index 000000000..f776f4252 --- /dev/null +++ b/network/wlan/wificx/drivercode/wifihal.h @@ -0,0 +1,63 @@ +// Copyright (C) Microsoft Corporation. All rights reserved. +#pragma once + +// The class for Wifi IHV device's HAL functionalities +class WifiHAL +{ +public: + static NTSTATUS _Create(_In_ WDFDEVICE Device); + static void _OnCleanup(_In_ WDFOBJECT Object); + + // Default ctor so context memory can be zeroed by WDF without placement new + WifiHAL() = default; + + // Initialization routine replacing the previous parameterized ctor usage + void Initialize(_In_ WDFDEVICE Device, _In_ PCTLV_CONTEXT TlvContext); + + // Wifi request M3 working condition verification function + NTSTATUS WifiIhvIsDeviceReadyForRequest(); + + // Wifi request pending transition status check function + // for example, during SAE authentication, the connect request is pending until SAE exchange is complete + NTSTATUS WifiIhvGetPendingTransitionStatus(); + + NTSTATUS WifiIhvSetDeviceCapabilities(); + NTSTATUS WifiIhvReset(_In_ const WDI_TASK_DOT11_RESET_PARAMETERS& ResetParameters, _In_ const PWDI_MESSAGE_HEADER pWdiHeader, _In_ UINT BytesWritten); + NTSTATUS WifiIhvSetRadioState(_In_ const WDI_SET_RADIO_STATE_PARAMETERS& RadioState, _In_ const PWDI_MESSAGE_HEADER pWdiHeader, _In_ UINT BytesWritten); + NTSTATUS WifiIhvScan(_In_ const WDI_SCAN_PARAMETERS& ScanParameters, _In_ const PWDI_MESSAGE_HEADER pWdiHeader, _In_ UINT BytesWritten); + NTSTATUS WifiIhvConnect(_In_ const WDI_TASK_CONNECT_PARAMETERS& ConnectParameters, _In_ const PWDI_MESSAGE_HEADER pWdiHeader, _In_ UINT BytesWritten); + NTSTATUS WifiIhvSetSaeAuthParams(_In_ const WDI_SET_SAE_AUTH_PARAMS_COMMAND& setSAEAuthParams, _In_ const PWDI_MESSAGE_HEADER pWdiHeader, _In_ UINT BytesWritten); + NTSTATUS WifiIhvDisconnect(_In_ const WDI_TASK_DISCONNECT_PARAMETERS& disconnectParameters, _In_ const PWDI_MESSAGE_HEADER pWdiHeader, _In_ UINT BytesWritten); + + // Device service property handlers (OID_WDI_GET_SUPPORTED_DEVICES / OID_WDI_DEVICE_SERVICE_COMMAND). + // Match the PropertyTransitionTraits handler shape: (const parsed input&, out-buffer, + // out-buffer length, bytesWritten&). The handler serializes the response TLV stream into + // OutBuffer and reports the number of bytes written; the dispatch layer completes the request. + NTSTATUS WifiIhvGetSupportedDeviceServices( + _In_ const WDI_GET_SUPPORTED_DEVICE_SERVICES_INPUTS& Inputs, + _Out_writes_bytes_to_(OutBufferLen, BytesWritten) void* OutBuffer, + _In_ ULONG OutBufferLen, + _Out_ ULONG& BytesWritten); + NTSTATUS WifiIhvDeviceServiceCommand( + _In_ const WDI_DEVICE_SERVICE_COMMAND_INPUTS& Inputs, + _Out_writes_bytes_to_(OutBufferLen, BytesWritten) void* OutBuffer, + _In_ ULONG OutBufferLen, + _Out_ ULONG& BytesWritten); +private: + NTSTATUS WifiIhvPerformAssociation(_In_ const struct ArrayOfElements<WDI_CONNECT_BSS_ENTRY_CONTAINER>* pPreferredBSSEntryList, _In_ const struct ArrayOfElements<WDI_AUTH_ALGORITHM>* pAuthenticationAlgorithms, _In_ const PWDI_MESSAGE_HEADER pWdiHeader); + NTSTATUS WifiIhvSendLinkStateIndication(_In_ const PWDI_MESSAGE_HEADER pWdiHeader, ULONG numLinks); + + WDFDEVICE m_Device{}; + PCTLV_CONTEXT m_TlvContext{}; + + UCHAR m_CurrentRadioState{}; + UINT32 m_LastConnectEntryId{}; + UINT32 m_LastConnectTransactionId{}; + WDI_AUTH_ALGORITHM m_LastAuthAlgo{}; + DOT11_MAC_ADDRESS m_ConnectedPeer{}; + + // Removed const so we can initialize without running a constructor via placement new + WDI_MAC_ADDRESS m_LocalLinkAddresses[2]; + ULONG m_SupportedBands; +}; +WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(WifiHAL, GetWifiHalFromHandle); diff --git a/network/wlan/wificx/drivercode/wifihaltestdata.h b/network/wlan/wificx/drivercode/wifihaltestdata.h new file mode 100644 index 000000000..7ded0f2bc --- /dev/null +++ b/network/wlan/wificx/drivercode/wifihaltestdata.h @@ -0,0 +1,8290 @@ +// Copyright (C) Microsoft Corporation. All rights reserved. +#pragma once + +#define TESTMP_BAND_IHV 0x00000010 + +// clang-format on + +#define ConnectEntryId_MAX ARRAYSIZE(g_ConnectEntries) + +// +//=============================================================================== +// Set alternate local addresses based on simulation parameters +//=============================================================================== +// +UCHAR s_ArubaSimLocalAddress[] = {0xd4, 0x6a, 0x6a, 0x52, 0x18, 0x07}; // For Wpa3SuiteB - Aruba +UCHAR g_IntelSimLocalAddress[] = {0x34, 0x13, 0xe8, 0xb3, 0x14, 0x4c}; // For Wpa3SuiteB - Intel +UCHAR g_SaeSimLocalAddress[] = {0x9c, 0xda, 0x3e, 0xf2, 0x7d, 0xd5}; // For Wpa3Sae + +#ifdef WPA3_ARUBA_SIM +PUCHAR g_AlternateLocalAddress = s_ArubaSimLocalAddress; +#elif WPA3_INTEL_SIM +PUCHAR g_AlternateLocalAddress = g_IntelSimLocalAddress; +#elif WPA3_SAE +PUCHAR g_AlternateLocalAddress = g_SaeSimLocalAddress; +#else +PUCHAR g_AlternateLocalAddress = NULL; +#endif + +// clang-format off + +// +//=============================================================================== +// + +UCHAR s_DeviceServiceTestBlob[] = +{ + 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa +}; + +// +//=============================================================================== +// + +UCHAR s_TLV_AssociationParametersRequestedType[] = +{ + // WDI_TLV_ASSOCIATION_PARAMETERS_REQUESTED_TYPE + 0xBB, 0x00, + 0x02, 0x00, + 0x9F, 0x00 // PMKID +}; + +UCHAR s_TLV_RoamingNeededIndication[] = +{ + // WDI_TLV_ROAMING_NEEDED_PARAMETERS + 0x55, 0x00, + 0x04, 0x00, + 0x0a, 0x00, 0x00, 0x00 +}; + +UCHAR s_TLV_NeighborReport[] = +{ + // WDI_TLV_BSSID + 0x02, 0x00, + 0x06, 0x00, + 0x00, 0x20, 0x30, 0x40, 0x50, 0x60, + + // WDI_TLV_ACTION_FRAME_BODY + 0xBE, 0x00, + 0x14, 0x00, + 0x05, // Category = Radio Measurement + 0x05, // Action = Neighbor Report Response + 0x01, // Dialog Token + 0x34, // Element ID = Neighbor Report + 0x0F, // Length + 0x00, 0x20, 0x30, 0x40, 0x50, 0x60, // BSSID + 0x00, 0x00, 0x00, 0x00, // BSSID Information + 0x00, // Operating class + 0x06, // Channel Number + 0x00, // PHY Type + 0x00, 0x00, // Optional IEs +}; + +// +//=============================================================================== +// + +// +//=============================================================================== +// BSs entries +//=============================================================================== +// + +WDI_MAC_ADDRESS s_Connect_Addr = {0x00, 0x20, 0x30, 0x40, 0x50, 0x60}; + +UCHAR s_TLV_BSS_Entry_1 [] = +{ + // WDI_TLV_BSS_ENTRY + 0x08, 0x00, //Type + 0x63, 0x00, //Len + + // WDI_TLV_BSSID + 0x02, 0x00, // Type + 0x06, 0x00, // Length + 0x00, 0x20, 0x30, 0x40, 0x50, 0x60, + + // WDI_TLV_PROBE_RESPONSE_FRAME + 0x09, 0x00, // Type + 0x35, 0x00, // Length + 0x00, 0x11, 0x22, 0x33, 0x00, 0x00, 0x00, 0x00, // Timestamp + 0x64, 0x00, // Beacon Interval + 0x00, 0x04, // Capability + 0x00, 0x08, + 'W', 'F', 'C', '_', 'O', 'P', 'E', 'N', // SSID + 0x01, 0x04, // Supported Rates + 0x02, 0x04, 0x0B, 0x16, + 0x03, 0x01, // DSSS Parameter + 0x01, + 0x05, 0x04, // TIM + 0x00, 0x01, 0x00, 0x00, + 0x46, 0x05, // RM Enabled Capabilities + 0x02, 0x00, 0x00, 0x00, 0x00, + 0xDD, 0x07, // Vendor specific - MBO-OCE IE + 0x50, 0x6F, 0x9A, // WFA OUI + 0x16, // MBO-OCE IE OUI Type + 0x01, // Attribute ID - AP capability + 0x01, // Attrib length + 0x00, // Not cellular data aware + + // WDI_TLV_BSS_ENTRY_DEVICE_CONTEXT + 0x0d, 0x00, + 0x04, 0x00, + 0x04, 0x05, 0x06, 0x07, + + // 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_CHANNEL_INFO + 0x3a, 0x00, + 0x08, 0x00, + 0x06, 0x00, 0x00, 0x00, // Channel + 0x01, 0x00, 0x00, 0x00 // Band ID +}; + +UCHAR s_TLV_SuccessOpenAssociationResult[] = +{ + // WDI_TLV_ASSOCIATION_RESULT + 0x35, 0x00, + 0xD7, 0x00, + + // WDI_TLV_BSSID + 0x02, 0x00, + 0x06, 0x00, + 0x00, 0x20, 0x30, 0x40, 0x50, 0x60, + + // WDI_TLV_ASSOCIATION_RESULT_PARAMETERS + 0x2D, 0x00, + 0x30, 0x00, + 0x00, 0x00, 0x00, 0x00, //Association Status + 0x00, 0x00, 0x00, 0x00, //Status Code + 0x00, //ReAssociationRequest + 0x01, 0x00, 0x00, 0x00, //AuthAlgorithm + 0x00, 0x00, 0x00, 0x00, //UnicastCipherAlgorithm + 0x00, 0x00, 0x00, 0x00, //MulticastDataCipherAlgorithm + 0x00, 0x00, 0x00, 0x00, //MulticastMgmtCipherAlgorithm + 0x00, //FourAddressSupported + 0x00, //Port Authorized + 0x00, // WMM QoS Enabled + 0x00, 0x00, 0x00, 0x00, //DSInfo + 0x00, 0x00, 0x00, 0x00, //AssociationComebackTime + 0x01, 0x00, 0x00, 0x00, // Band ID + 0x00, 0x00, 0x00, 0x00, // IHV Association Status + 0x00, 0x00, 0x00, 0x00, //DisableDataPathOffloadsScenario + + // WDI_TLV_ASSOCIATION_REQUEST_FRAME + 0x2E, 0x00, + 0x30, 0x00, + 0x21, 0x04, // Capabilities + 0x0A, 0x00, // Listen Interval + 0x00, 0x08, + 'W', 'F', 'C', '_', 'O', 'P', 'E', 'N', // SSID + 0x01, 0x08, // Rates + 0x82, 0x84, 0x8B, 0x96, 0x24, 0x30, 0x48, 0x6C, + 0x21, 0x02, // Power Capability + 0x07, 0x12, + 0x24, 0x02, // Supported Channels + 0x01, 0x0B, + 0x32, 0x04, // Extended Rates + 0x0C, 0x12, 0x18, 0x60, + 0xDD, 0x07, // WMM settings + 0x00, 0x50, 0xF2, 0x02, 0x00, 0x01, 0x00, 0x03, + + // WDI_TLV_ASSOCIATION_RESPONSE_FRAME + 0x2F, 0x00, + 0x30, 0x00, + 0x01, 0x04, //Capability + 0x00, 0x00, //Status + 0x01, 0xC0, //Association ID + 0x01, 0x08, //Rates + 0x82, 0x84, 0x8B, 0x96, 0x24, 0x30, 0x48, 0x6C, + 0x32, 0x04, //Extended Rates + 0x0C, 0x12, 0x18, 0x60, + 0xDD, 0x18, //WMM settings + 0x00, 0x50, 0xF2, 0x02, 0x01, 0x01, 0x80, 0x00, 0x03, 0xA4, 0x00, 0x00, 0x27, 0xA4, 0x00, 0x00, + 0x42, 0x43, 0x5E, 0x00, 0x62, 0x32, 0x2F, 0x00, + + // WDI_TLV_BEACON_PROBE_RESPONSE + 0x30, 0x00, // Type + 0x25, 0x00, // Length + 0x00, 0x11, 0x22, 0x33, 0x00, 0x00, 0x00, 0x00, // Timestamp + 0x64, 0x00, // Beacon Interval + 0x00, 0x04, // Capability + 0x00, 0x08, + 'W', 'F', 'C', '_', 'O', 'P', 'E', 'N', // SSID + 0x01, 0x04, 0x02, 0x04, 0x0B, 0x16, // Supported Rates + 0x03, 0x01, 0x01, // DSSS Parameter + 0x05, 0x04, 0x00, 0x01, 0x00, 0x00, // TIM + + // WDI_TLV_ETHERTYPE_ENCAP_TABLE (optional) + // 0x00, 0x00, + // 0x04, 0x00, + // 0x00, 0x00, 0x00, 0x00 + + // WDI_TLV_PHY_TYPE_LIST + 0x19, 0x00, + 0x04, 0x00, + 0x07, 0x00, 0x00, 0x00, + +}; + + +UCHAR s_TLV_OpenDisassociation[] = +{ + // WDI_TLV_ASSOCIATION_RESULT + 0xBC, 0x00, + 0x0A, 0x00, + 0x00, 0x20, 0x30, 0x40, 0x50, 0x60, + 0x01, 0x00, 0x00, 0x00, + + // WDI_TLV Need Peer Cleanup Params + 0xb4, 0x00, + 0x01, 0x00, + 0x00 +}; + +WDI_MAC_ADDRESS s_Connect_Addr_2_Open = {0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xE2}; + +UCHAR s_TLV_BSS_Entry_2_Open [] = +{ + // WDI_TLV_BSS_ENTRY + 0x08, 0x00, //Type + 0x59, 0x00, //Len + + // WDI_TLV_BSSID + 0x02, 0x00, // Type + 0x06, 0x00, // Length + 0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xE2, + + // WDI_TLV_BEACON_FRAME + 0x0a, 0x00, + 0x26, 0x00, + 0x44, 0x55, 0x66, 0x77, 0x00, 0x00, 0x00, 0x00, // Timestamp + 0x64, 0x00, // Beacon Interval + 0x00, 0x04, // Capability + 0x00, 0x08, // SSID + 'W', 'D', 'I', '_', 'O', 'P', 'E', 'N', + 0x03, 0x01, // DSSS Parameter + 0x01, + 0x01, 0x04, // Supported Rates + 0x02, 0x04, 0x0B, 0x16, + 0x46, 0x05, // RM Enabled Capabilities + 0x02, 0x00, 0x00, 0x00, 0x00, + + // 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 + 0x28, 0x00, 0x00, 0x00, // Link Quality + + // WDI_TLV_BSS_ENTRY_CHANNEL_INFO + 0x3a, 0x00, + 0x08, 0x00, + 0x06, 0x00, 0x00, 0x00, // Channel + 0x01, 0x00, 0x00, 0x00 // Band ID + +}; + +UCHAR s_TLV_Success_AssociationResult_2_Open[] = +{ + // WDI_TLV_ASSOCIATION_RESULT + 0x35, 0x00, + 0xD7, 0x00, + + // WDI_TLV_BSSID + 0x02, 0x00, + 0x06, 0x00, + 0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xE2, + + // WDI_TLV_ASSOCIATION_RESULT_PARAMETERS + 0x2D, 0x00, + 0x30, 0x00, + 0x00, 0x00, 0x00, 0x00, //Association Status + 0x00, 0x00, 0x00, 0x00, //Status Code + 0x00, //ReAssociationRequest + 0x01, 0x00, 0x00, 0x00, //AuthAlgorithm + 0x00, 0x00, 0x00, 0x00, //UnicastCipherAlgorithm + 0x00, 0x00, 0x00, 0x00, //MulticastDataCipherAlgorithm + 0x00, 0x00, 0x00, 0x00, //MulticastMgmtCipherAlgorithm + 0x00, //FourAddressSupported + 0x00, //Port Authorized + 0x00, // WMM QoS Enabled + 0x00, 0x00, 0x00, 0x00, //DSInfo + 0x00, 0x00, 0x00, 0x00, //AssociationComebackTime + 0x01, 0x00, 0x00, 0x00, // Band ID + 0x00, 0x00, 0x00, 0x00, // IHV Association Status + 0x00, 0x00, 0x00, 0x00, //DisableDataPathOffloadsScenario + + // WDI_TLV_ASSOCIATION_REQUEST_FRAME + 0x2E, 0x00, + 0x30, 0x00, + 0x21, 0x04, // Capabilities + 0x0A, 0x00, // Listen Interval + 0x00, 0x08, // SSID + 'W', 'D', 'I', '_', 'O', 'P', 'E', 'N', + 0x01, 0x08, // Rates + 0x82, 0x84, 0x8B, 0x96, 0x24, 0x30, 0x48, 0x6C, + 0x21, 0x02, // Power Capability + 0x07, 0x12, + 0x24, 0x02, // Supported Channels + 0x01, 0x0B, + 0x32, 0x04, // Extended Rates + 0x0C, 0x12, 0x18, 0x60, + 0xDD, 0x07, // WMM settings + 0x00, 0x50, 0xF2, 0x02, 0x00, 0x01, 0x00, 0x03, + + // WDI_TLV_ASSOCIATION_RESPONSE_FRAME + 0x2F, 0x00, + 0x30, 0x00, + 0x01, 0x04, // Capability + 0x00, 0x00, // Status + 0x01, 0xC0, // Association ID + 0x01, 0x08, + 0x82, 0x84, 0x8B, 0x96, 0x24, 0x30, 0x48, 0x6C, // Rates + 0x32, 0x04, // Extended Rates + 0x0C, 0x12, 0x18, 0x60, + 0xDD, 0x18, // WMM settings + 0x00, 0x50, 0xF2, 0x02, 0x01, 0x01, 0x80, 0x00, 0x03, 0xA4, 0x00, 0x00, 0x27, 0xA4, 0x00, 0x00, + 0x42, 0x43, 0x5E, 0x00, 0x62, 0x32, 0x2F, 0x00, + + // WDI_TLV_BEACON_PROBE_RESPONSE + 0x30, 0x00, + 0x25, 0x00, + 0x00, 0x11, 0x22, 0x33, 0x00, 0x00, 0x00, 0x00, // Timestamp + 0x64, 0x00, // Beacon Interval + 0x00, 0x04, // Capability + 0x00, 0x08, // SSID + 'W', 'D', 'I', '_', 'O', 'P', 'E', 'N', + 0x01, 0x04, + 0x02, 0x04, 0x0B, 0x16, // Supported Rates + 0x03, 0x01, // DSSS Parameter + 0x01, + 0x05, 0x04, // TIM + 0x00, 0x01, 0x00, 0x00, + + // WDI_TLV_ETHERTYPE_ENCAP_TABLE (optional) + // 0x00, 0x00, + // 0x04, 0x00, + // 0x00, 0x00, 0x00, 0x00 + + // WDI_TLV_PHY_TYPE_LIST + 0x19, 0x00, + 0x04, 0x00, + 0x04, 0x00, 0x00, 0x00, + +}; + +// +//=============================================================================== +// + +WDI_MAC_ADDRESS s_Connect_Addr_3_WEP = {0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xE3}; + +UCHAR s_TLV_BSS_Entry_3_WEP [] = +{ + // WDI_TLV_BSS_ENTRY + 0x08, 0x00, //Type + 0x52, 0x00, //Len + + // WDI_TLV_BSSID + 0x02, 0x00, // Type + 0x06, 0x00, // Length + 0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xE3, + + // WDI_TLV_BEACON_FRAME + 0x0a, 0x00, + 0x1f, 0x00, + 0x44, 0x55, 0x66, 0x77, 0x00, 0x00, 0x00, 0x00, // Timestamp + 0x64, 0x00, // Beacon Interval + 0x10, 0x04, // Capability + 0x00, 0x08, // SSID + 'W', 'D', 'I', '_', '_', 'W', 'E', 'P', + 0x03, 0x01, 0x01, // DSSS Parameter (Offset: 42) + 0x01, 0x04, 0x02, 0x04, 0x0B, 0x16, // Supported Rates + + // WDI_TLV_BSS_ENTRY_SIGNAL_INFO + 0x0b, 0x00, + 0x08, 0x00, + 0xCE, 0xFF, 0xFF, 0xFF, // RSSI + 0x3C, 0x00, 0x00, 0x00, // Link Quality (Offset: 57) + + // WDI_TLV_BSS_ENTRY_PHY_INFO + 0x3a, 0x00, + 0x08, 0x00, + 0x06, 0x00, 0x00, 0x00, // Channel (Offset: 64) + 0x01, 0x00, 0x00, 0x00, // Band ID + + // WDI_TLV_BSS_ENTRY_DEVICE_CONTEXT + 0x0d, 0x00, + 0x09, 0x00, + 0x04, 0x05, 0x06, 0x07, 0x04, 0x05, 0x06, 0x07, 0x00 +}; + + +UCHAR s_TLV_Success_AssociationResult_3_WEP[] = +{ + // WDI_TLV_ASSOCIATION_RESULT + 0x35, 0x00, + 0xD9, 0x00, + + // WDI_TLV_BSSID + 0x02, 0x00, + 0x06, 0x00, + 0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xE3, + + // 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 + 0x00, 0x00, 0x00, 0x00, //UnicastCipherAlgorithm + 0x00, 0x00, 0x00, 0x00, //MulticastDataCipherAlgorithm + 0x00, 0x00, 0x00, 0x00, //MulticastMgmtCipherAlgorithm + 0x00, //FourAddressSupported + 0x00, //Port Authorized + 0x00, // WMM QoS Enabled + 0x00, 0x00, 0x00, 0x00, //DSInfo + 0x00, 0x00, 0x00, 0x00, //AssociationComebackTime + 0x01, 0x00, 0x00, 0x00, // Band ID + 0x00, 0x00, 0x00, 0x00, // IHV Association Status + 0x00, 0x00, 0x00, 0x00, //DisableDataPathOffloadsScenario + + // WDI_TLV_ASSOCIATION_REQUEST_FRAME + 0x2E, 0x00, + 0x32, 0x00, + 0x10, 0x04, // Capability + 0x21, 0x04, // Capabilities + 0x0A, 0x00, // Listen Interval + 0x00, 0x08, // SSID + 'W', 'D', 'I', '_', '_', 'W', 'E', 'P', + 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, 0x07, 0x00, 0x50, 0xF2, 0x02, 0x00, 0x01, 0x00, 0x03, // WMM settings + + // WDI_TLV_ASSOCIATION_RESPONSE_FRAME + 0x2F, 0x00, + 0x30, 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 + + // WDI_TLV_BEACON_PROBE_RESPONSE + 0x30, 0x00, // Type + 0x25, 0x00, // Length + 0x00, 0x11, 0x22, 0x33, 0x00, 0x00, 0x00, 0x00, // Timestamp + 0x64, 0x00, // Beacon Interval + 0x10, 0x04, // Capability + 0x00, 0x08, // SSID + 'W', 'D', 'I', '_', '_', 'W', 'E', 'P', + 0x01, 0x04, 0x02, 0x04, 0x0B, 0x16, // Supported Rates + 0x03, 0x01, 0x01, // DSSS Parameter + 0x05, 0x04, 0x00, 0x01, 0x00, 0x00, // TIM + + // WDI_TLV_ETHERTYPE_ENCAP_TABLE (optional) + // 0x00, 0x00, + // 0x04, 0x00, + // 0x00, 0x00, 0x00, 0x00 + + // WDI_TLV_PHY_TYPE_LIST + 0x19, 0x00, + 0x04, 0x00, + 0x04, 0x00, 0x00, 0x00, + +}; + + +// +//=============================================================================== +// + +WDI_MAC_ADDRESS s_Connect_Addr_4_RSNA_CCMP = {0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xE4}; + +#define WFA_TEST_MIN_RSN_IE 1 + +UCHAR s_TLV_BSS_Entry_4_RSNA_CCMP [] = +{ + // WDI_TLV_BSS_ENTRY + 0x08, 0x00, //Type +#ifdef WFA_TEST_MIN_RSN_IE + 0x79, 0x00, //Len +#else + 0x8B, 0x00, //Len +#endif // WFA_TEST_MIN_RSN_IE + + // WDI_TLV_BSSID + 0x02, 0x00, // Type + 0x06, 0x00, // Length + 0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xE4, + + // WDI_TLV_BEACON_FRAME + 0x0a, 0x00, +#ifdef WFA_TEST_MIN_RSN_IE + 0x46, 0x00, +#else + 0x58, 0x00, +#endif // WFA_TEST_MIN_RSN_IE + + 0x22, 0x02, 0x2C, 0x01, 0x00, 0x00, 0x00, 0x00, // Timestamp + 0x64, 0x00, // Beacon Interval + 0x31, 0x04, // Capability + 0x00, 0x0A, // SSID + 'W', 'D', 'I', '_', 'S', 'E', 'C', 'U', 'R', 'E', + 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 +#ifdef WFA_TEST_MIN_RSN_IE + 0x30, 0x02, + 0x01, 0x00, +#else + 0x30, 0x14, + 0x01, 0x00, // Version + 0x00, 0x0F, 0xAC, 0x04, // Group Cipher -- CCMP + 0x01, 0x00, // Pairwise Cipher Count + 0x00, 0x0F, 0xAC, 0x04, // Pairwise Cipher -- CCMP + 0x01, 0x00, // AKM Suite count + 0x00, 0x0F, 0xAC, 0x02, // AKM Suite -- RSNA_PSK + 0x00, 0x00, // RSN Capability +#endif // WFA_TEST_MIN_RSN_IE + 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, + 0x0B, 0x00, 0x00, 0x00, // Channel + 0x01, 0x00, 0x00, 0x00 // BandId +}; + +UCHAR s_TLV_Success_AssociationResult_4_RSNA_CCMP[] = +{ + // WDI_TLV_ASSOCIATION_RESULT + 0x35, 0x00, + 0x22, 0x01, + + // WDI_TLV_BSSID + 0x02, 0x00, + 0x06, 0x00, + 0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xE4, + + // WDI_TLV_ASSOCIATION_RESULT_PARAMETERS + 0x2D, 0x00, + 0x30, 0x00, + 0x00, 0x00, 0x00, 0x00, //Association Status + 0x00, 0x00, 0x00, 0x00, //Status Code + 0x00, //ReAssociationRequest + 0x07, 0x00, 0x00, 0x00, //AuthAlgorithm + 0x04, 0x00, 0x00, 0x00, //UnicastCipherAlgorithm + 0x04, 0x00, 0x00, 0x00, //MulticastDataCipherAlgorithm + 0x00, 0x00, 0x00, 0x00, //MulticastMgmtCipherAlgorithm + 0x00, //FourAddressSupported + 0x00, //Port Authorized + 0x00, // WMM QoS Enabled + 0x00, 0x00, 0x00, 0x00, //DSInfo + 0x00, 0x00, 0x00, 0x00, //AssociationComebackTime + 0x01, 0x00, 0x00, 0x00, // Band ID + 0x00, 0x00, 0x00, 0x00, // IHV Association Status + 0x00, 0x00, 0x00, 0x00, //DisableDataPathOffloadsScenario + + // WDI_TLV_ASSOCIATION_REQUEST_FRAME + 0x2E, 0x00, + 0x48, 0x00, + 0x21, 0x04, // Capabilities + 0x0A, 0x00, // Listen Interval + 0x00, 0x0A, // SSID + 'W', 'D', 'I', '_', 'S', 'E', 'C', 'U', 'R', 'E', + 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 + 0x30, 0x14, 0x01, 0x00, 0x00, 0x0F, 0xAC, 0x04, 0x01, 0x00, 0x00, 0x0F, 0xAC, 0x04, 0x01, 0x00, 0x00, 0x0F, 0xAC, 0x02, 0x00, 0x00, // RSN + + + // WDI_TLV_ASSOCIATION_RESPONSE_FRAME + 0x2F, 0x00, + 0x30, 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 + + + // WDI_TLV_BEACON_FRAME + 0x30, 0x00, + 0x58, 0x00, + + 0x22, 0x02, 0x2C, 0x01, 0x00, 0x00, 0x00, 0x00, // Timestamp + 0x64, 0x00, // Beacon Interval + 0x31, 0x04, // Capability + 0x00, 0x0A, // SSID + 'W', 'D', 'I', '_', 'S', 'E', 'C', 'U', 'R', 'E', + 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 + 0x30, 0x14, 0x01, 0x00, 0x00, 0x0F, 0xAC, 0x04, 0x01, 0x00, 0x00, 0x0F, 0xAC, 0x04, 0x01, 0x00, 0x00, 0x0F, 0xAC, 0x02, 0x00, 0x00, // RSN + 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, + 0x04, 0x00, 0x00, 0x00, + +}; + + +// +//=============================================================================== +// + +WDI_MAC_ADDRESS s_Connect_Addr_5_IHV = {0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xE5}; + +UCHAR s_TLV_BSS_Entry_5_IHV [] = +{ + // WDI_TLV_BSS_ENTRY + 0x08, 0x00, //Type + 0x52, 0x00, //Len + + // WDI_TLV_BSSID + 0x02, 0x00, // Type + 0x06, 0x00, // Length + 0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xE5, + + // WDI_TLV_BEACON_FRAME + 0x0a, 0x00, + 0x1f, 0x00, + 0x44, 0x55, 0x66, 0x77, 0x00, 0x00, 0x00, 0x00, // Timestamp + 0x64, 0x00, // Beacon Interval + 0x10, 0x04, // Capability + 0x00, 0x08, // SSID + 'W', 'D', 'I', '_', '_', 'I', 'H', 'V', + 0x03, 0x01, 0x01, // DSSS Parameter + 0x01, 0x04, 0x02, 0x04, 0x0B, 0x16, // Supported Rates + + // WDI_TLV_BSS_ENTRY_SIGNAL_INFO + 0x0b, 0x00, + 0x08, 0x00, + 0xCE, 0xFF, 0xFF, 0xFF, // RSSI + 0x3C, 0x00, 0x00, 0x00, // Link Quality + + // WDI_TLV_BSS_ENTRY_PHY_INFO + 0x3a, 0x00, + 0x08, 0x00, + 0x24, 0x00, 0x00, 0x00, // Channel = 36 + 0x08, 0x00, 0x00, 0x00, // Band ID = Custom +// 0x02, 0x00, 0x00, 0x00, // Band ID + + // WDI_TLV_BSS_ENTRY_DEVICE_CONTEXT + 0x0d, 0x00, + 0x09, 0x00, + 0x04, 0x05, 0x06, 0x07, 0x04, 0x05, 0x06, 0x07, 0x00 +}; + + +UCHAR s_TLV_Success_AssociationResult_5_IHV[] = +{ + // WDI_TLV_ASSOCIATION_RESULT + 0x35, 0x00, + 0xD9, 0x00, + + // WDI_TLV_BSSID + 0x02, 0x00, + 0x06, 0x00, + 0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xE5, + + // WDI_TLV_ASSOCIATION_RESULT_PARAMETERS + 0x2D, 0x00, + 0x30, 0x00, + 0x00, 0x00, 0x00, 0x00, //Association Status + 0x00, 0x00, 0x00, 0x00, //Status Code + 0x00, //ReAssociationRequest + 0x02, 0x00, 0x00, 0x80, //AuthAlgorithm = Custom + 0x01, 0x00, 0x00, 0x80, //UnicastCipherAlgorithm + 0x01, 0x00, 0x00, 0x80, //MulticastDataCipherAlgorithm + 0x01, 0x00, 0x00, 0x80, //MulticastMgmtCipherAlgorithm + 0x00, //FourAddressSupported + 0x00, //Port Authorized + 0x00, // WMM QoS Enabled + 0x00, 0x00, 0x00, 0x00, //DSInfo + 0x00, 0x00, 0x00, 0x00, //AssociationComebackTime + 0x01, 0x00, 0x00, 0x80, // Band ID + 0x00, 0x00, 0x00, 0x00, // IHV Association Status + 0x00, 0x00, 0x00, 0x00, //DisableDataPathOffloadsScenario + + // WDI_TLV_ASSOCIATION_REQUEST_FRAME + 0x2E, 0x00, + 0x32, 0x00, + 0x10, 0x04, // Capability + 0x21, 0x04, // Capabilities + 0x0A, 0x00, // Listen Interval + 0x00, 0x08, // SSID + 'W', 'D', 'I', '_', '_', 'I', 'H', 'V', + 0x01, 0x08, 0x82, 0x84, 0x8B, 0x96, 0x24, 0x30, 0x48, 0x6C, // Rates + 0x21, 0x02, 0x07, 0x12, //Power Capability + 0x24, 0x02, 0x24, 0x0B, //Supported Channels + 0x32, 0x04, 0x0C, 0x12, 0x18, 0x60, //Extended Rates + 0xDD, 0x07, 0x00, 0x50, 0xF2, 0x02, 0x00, 0x01, 0x00, 0x03, // WMM settings + + // WDI_TLV_ASSOCIATION_RESPONSE_FRAME + 0x2F, 0x00, + 0x30, 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 + + // WDI_TLV_BEACON_PROBE_RESPONSE + 0x30, 0x00, // Type + 0x25, 0x00, // Length + 0x00, 0x11, 0x22, 0x33, 0x00, 0x00, 0x00, 0x00, // Timestamp + 0x64, 0x00, // Beacon Interval + 0x10, 0x04, // Capability + 0x00, 0x08, // SSID + 'W', 'D', 'I', '_', '_', 'I', 'H', 'V', + 0x01, 0x04, 0x02, 0x04, 0x0B, 0x16, // Supported Rates + 0x03, 0x01, 0x01, // DSSS Parameter + 0x05, 0x04, 0x00, 0x01, 0x00, 0x00, // TIM + + // WDI_TLV_ETHERTYPE_ENCAP_TABLE (optional) + // 0x00, 0x00, + // 0x04, 0x00, + // 0x00, 0x00, 0x00, 0x00 + + // WDI_TLV_PHY_TYPE_LIST + 0x19, 0x00, + 0x04, 0x00, + 0x02, 0x00, 0x00, 0x80, // Phy = IHV Phy 2 + +}; + + +UCHAR s_TLV_IhvRequestComplete[] = +{ + // WDI_TLV_IHV_DATA + 0xBD, 0x00, + 0x0A, 0x00, + + 0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xE5, + 0x00, 0x00, 0x00, 0x01 +}; + + +UCHAR s_TLV_IhvIndication[] = +{ + // WDI_TLV_IHV_DATA + 0xBD, 0x00, + 0x30, 0x00, + + 0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xE5, + 0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xE5, + 0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xE5, + 0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xE5, + 0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xE5, + 0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xE5, + 0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xE5, + 0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xE5 +}; + +//=============================================================================== + +WDI_MAC_ADDRESS s_Connect_Addr_6_FT_CCMP = {0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xE6}; + +UCHAR s_TLV_BSS_Entry_6_FT_CCMP [] = +{ + // WDI_TLV_BSS_ENTRY + 0x08, 0x00, //Type + 0xEA, 0x00, + + // WDI_TLV_BSSID + 0x02, 0x00, + 0x06, 0x00, + 0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xE6, + + // WDI_TLV_BEACON_FRAME + 0x0a, 0x00, + 0xB7, 0x00, + 0x38, 0xE3, 0x3B, 0x64, 0x11, 0x00, 0x00, 0x00, // TimeStamp + 0x64, 0x00, // Beacon Interval + 0x31, 0x04, // Capability + 0x00, 0x07, // SSID + 'W', 'D', 'I', '_', '_', 'F', 'T', // WDI__FT + 0x01, 0x08, // Supported Rates + 0x0C, 0x12, 0x96, 0x18, 0x24, 0x30, 0x48, 0x60, + 0x03, 0x01, // DSS Parameters + 0x01, + 0x05, 0x04, // TIM + 0x00, 0x01, 0x00, 0x00, + 0x07, 0x06, // Country + 0x55, 0x53, 0x20, 0x01, 0x0B, 0x1E, + 0x0B, 0x05, + 0x00, 0x00, 0x53, 0x8D, 0x5B, + 0x2A, 0x01, + 0x00, + 0x30, 0x14, // RSN IE + 0x01, 0x00, // Version + 0x00, 0x0F, 0xAC, 0x04, // Group Cipher + 0x01, 0x00, // Pairwise Cipher Count + 0x00, 0x0F, 0xAC, 0x04, // Pairwise Cipher + 0x01, 0x00, // AKM Suite count + 0x00, 0x0F, 0xAC, 0x03, // AKM Suite + 0x28, 0x00, // RSN Capability + 0x32, 0x01, + 0x6C, + 0x36, 0x03, // MDID IE + 0x0B, 0x47, // MDID + 0x00, // FT Capability and Policy + 0x85, 0x1E, + 0x00, 0x00, 0x8F, 0x00, 0x0F, 0x00, 0xFF, 0x03, 0x59, 0x00, 0x41, 0x50, 0x30, 0x30, 0x31, 0x34, + 0x2E, 0x36, 0x39, 0x34, 0x30, 0x2E, 0x38, 0x35, 0x32, 0x00, 0x00, 0x00, 0x00, 0x27, + 0x96, 0x06, + 0x00, 0x40, 0x96, 0x00, 0x0B, 0x00, + 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, + 0xDD, 0x06, + 0x00, 0x40, 0x96, 0x01, 0x01, 0x04, + 0xDD, 0x05, + 0x00, 0x40, 0x96, 0x03, 0x05, + 0xDD, 0x05, + 0x00, 0x40, 0x96, 0x0B, 0x09, + 0xDD, 0x05, + 0x00, 0x40, 0x96, 0x14, 0x01, + + // WDI_TLV_BSS_ENTRY_SIGNAL_INFO + 0x0b, 0x00, + 0x08, 0x00, + 0xC1, 0xFF, 0xFF, 0xFF, // RSSI + 0x4A, 0x00, 0x00, 0x00, // Link Quality + + // WDI_TLV_BSS_ENTRY_DEVICE_CONTEXT + 0x0d, 0x00, + 0x09, 0x00, + 0x04, 0x05, 0x06, 0x07, 0x04, 0x05, 0x06, 0x07, 0x00, + + // WDI_TLV_BSS_ENTRY_PHY_INFO + 0x3a, 0x00, + 0x08, 0x00, + 0x01, 0x00, 0x00, 0x00, // Channel + 0x01, 0x00, 0x00, 0x00 // BandId +}; + +UCHAR s_TLV_Success_AssociationResult_6_FT_CCMP[] = +{ + // WDI_TLV_ASSOCIATION_RESULT + 0x35, 0x00, + 0x0C, 0x02, + + // WDI_TLV_BSSID + 0x02, 0x00, + 0x06, 0x00, + 0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xE6, + + + // WDI_TLV_ASSOCIATION_RESULT_PARAMETERS + 0x2D, 0x00, + 0x30, 0x00, + 0x00, 0x00, 0x00, 0x00, //Association Status + 0x00, 0x00, 0x00, 0x00, //Status Code + 0x00, //ReAssociationRequest + 0x06, 0x00, 0x00, 0x00, //AuthAlgorithm -- RSNA + 0x04, 0x00, 0x00, 0x00, //UnicastCipherAlgorithm + 0x04, 0x00, 0x00, 0x00, //MulticastDataCipherAlgorithm + 0x00, 0x00, 0x00, 0x00, //MulticastMgmtCipherAlgorithm + 0x00, //FourAddressSupported + 0x00, //Port Authorized + 0x01, // WMM QoS Enabled + 0x03, 0x00, 0x00, 0x00, //DSInfo + 0x00, 0x00, 0x00, 0x00, //AssociationComebackTime + 0x01, 0x00, 0x00, 0x00, // Band ID + 0x00, 0x00, 0x00, 0x00, // IHV Association Status + 0x00, 0x00, 0x00, 0x00, //DisableDataPathOffloadsScenario + + // WDI_TLV_ASSOCIATION_REQUEST_FRAME + 0x2E, 0x00, + 0x3E, 0x00, + 0x31, 0x04, // Capabilities + 0x01, 0x00, // Listen Interval + 0x00, 0x07, // SSID + 'W', 'D', 'I', '_', '_', 'F', 'T', // WDI__FT + 0x01, 0x08, // Supported Rates + 0x0C, 0x12, 0x96, 0x18, 0x24, 0x30, 0x48, 0x60, + 0x30, 0x14, // RSN IE + 0x01, 0x00, // Version + 0x00, 0x0F, 0xAC, 0x04, // Group Cipher -- CCMP + 0x01, 0x00, // Pairwise Cipher Count + 0x00, 0x0F, 0xAC, 0x04, // Pairwise Cipher -- CCMP + 0x01, 0x00, // AKM Suite count + 0x00, 0x0F, 0xAC, 0x03, // AKM Suite -- FT + 0x0C, 0x00, // RSN Capability + 0x32, 0x01, // Extended Rates + 0x6C, + 0x36, 0x03, // MDID IE + 0x0B, 0x47, // MDID + 0x00, // FT Capability and Policy + 0xDD, 0x07, + 0x00, 0x50, 0xF2, 0x02, 0x00, 0x01, 0x00, + + // WDI_TLV_ASSOCIATION_RESPONSE_FRAME + 0x2F, 0x00, + 0xC5, 0x00, + 0x31, 0x04, // Capability + 0x00, 0x00, // Status + 0x01, 0xC0, // Association ID + 0x01, 0x08, // Supported Rates + 0x96, 0x0C, 0x12, 0x18, 0x24, 0x30, 0x48, 0x60, + 0x30, 0x26, // RSN IE + 0x01, 0x00, // Version + 0x00, 0x0F, 0xAC, 0x04, // Group Cipher -- CCMP + 0x01, 0x00, // Pairwise Cipher Count + 0x00, 0x0F, 0xAC, 0x04, // Pairwise Cipher -- CCMP + 0x01, 0x00, // AKM Suite count + 0x00, 0x0F, 0xAC, 0x03, // AKM Suite -- FT + 0x28, 0x00, // RSN Capability + 0x01, 0x00, // PMKID Count -- PMKR1Name + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //PMKID + 0x32, 0x01, // Extended Rates + 0x6C, + 0x36, 0x03, // MDID IE + 0x0B, 0x47, // MDID + 0x00, // FT Capability and Policy + 0x37, 0x69, // FTE IE + 0x00, 0x00, // MIC Control - 0 => no MIC + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //MIC + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //ANonce + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //SNonce + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x06, // R1KH-ID + 0xB4, 0xC7, 0x99, 0x8A, 0xB6, 0x30, + 0x03, 0x0D, // R0KH-ID + 'a', 'p', '8', '1', '3', '2', '-', '7', '3', '4', 'E', 'B', '0', + 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, + + // WDI_TLV_BEACON_FRAME + 0x30, 0x00, + 0xB7, 0x00, + 0xDD, 0x50, 0x3D, 0xF7, 0xE2, 0x01, 0x00, 0x00, // Supported Rates + 0x64, 0x00, // Beacon Interval + 0x31, 0x04, // Capability + 0x00, 0x07, // SSID + 'W', 'D', 'I', '_', '_', 'F', 'T', // WDI__FT + 0x01, 0x08, + 0x0C, 0x12, 0x96, 0x18, 0x24, 0x30, 0x48, 0x60, + 0x03, 0x01, // DSS Parameters + 0x01, + 0x05, 0x04, // TIM + 0x00, 0x01, 0x00, 0x00, + 0x07, 0x06, // Country + 0x55, 0x53, 0x20, 0x01, 0x0B, 0x1E, + 0x0B, 0x05, + 0x00, 0x00, 0x6E, 0x8D, 0x5B, + 0x2A, 0x01, // ERP + 0x00, + 0x30, 0x14, // RSN + 0x01, 0x00, // Version + 0x00, 0x0F, 0xAC, 0x04, // Group Cipher + 0x01, 0x00, // Pairwise cipher count + 0x00, 0x0F, 0xAC, 0x04, // Pairwise cipher + 0x01, 0x00, // AKM Suite Count + 0x00, 0x0F, 0xAC, 0x03, // AKM Suite + 0x0C, 0x00, // RSN Capability + 0x32, 0x01, // Extended Supported Rates + 0x6C, + 0x36, 0x03, // MDID IE + 0x0B, 0x47, // MDID + 0x00, // FT Capability and Policy + 0x85, 0x1E, + 0x03, 0x00, 0x8F, 0x00, 0x0F, 0x00, 0xFF, 0x03, 0x59, 0x00, 0x41, 0x50, 0x30, 0x30, 0x31, 0x34, + 0x2E, 0x36, 0x39, 0x34, 0x30, 0x2E, 0x38, 0x31, 0x65, 0x00, 0x00, 0x00, 0x00, 0x27, + 0x96, 0x06, + 0x00, 0x40, 0x96, 0x00, 0x0E, 0x00, + 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, + 0xDD, 0x06, + 0x00, 0x40, 0x96, 0x01, 0x01, 0x04, + 0xDD, 0x05, + 0x00, 0x40, 0x96, 0x03, 0x05, + 0xDD, 0x05, + 0x00, 0x40, 0x96, 0x0B, 0x09, + 0xDD, 0x05, + 0x00, 0x40, 0x96, 0x14, 0x01, + + // WDI_TLV_PHY_TYPE_LIST + 0x19, 0x00, + 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00 +}; + + +//=============================================================================== + +WDI_MAC_ADDRESS s_Connect_Addr_7_FT_PSK_CCMP = {0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xE7}; + +UCHAR s_TLV_BSS_Entry_7_FT_PSK_CCMP [] = +{ + // WDI_TLV_BSS_ENTRY + 0x08, 0x00, //Type + 0xED, 0x00, + + // WDI_TLV_BSSID + 0x02, 0x00, + 0x06, 0x00, + 0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xE7, + + // WDI_TLV_BEACON_FRAME + 0x0a, 0x00, + 0xBA, 0x00, + 0x38, 0xE3, 0x3B, 0x64, 0x11, 0x00, 0x00, 0x00, // TimeStamp + 0x64, 0x00, // Beacon Interval + 0x31, 0x04, // Capability + 0x00, 0x0A, // SSID + 'W', 'D', 'I', '_', '_', 'F', 'T', 'P', 'S', 'K', // WDI__FTPSK + 0x01, 0x08, // Supported Rates + 0x0C, 0x12, 0x96, 0x18, 0x24, 0x30, 0x48, 0x60, + 0x03, 0x01, // DSS Parameters + 0x01, + 0x05, 0x04, // TIM + 0x00, 0x01, 0x00, 0x00, + 0x07, 0x06, // Country + 0x55, 0x53, 0x20, 0x01, 0x0B, 0x1E, + 0x0B, 0x05, + 0x00, 0x00, 0x53, 0x8D, 0x5B, + 0x2A, 0x01, + 0x00, + 0x30, 0x14, // RSN IE + 0x01, 0x00, // Version + 0x00, 0x0F, 0xAC, 0x04, // Group Cipher + 0x01, 0x00, // Pairwise Cipher Count + 0x00, 0x0F, 0xAC, 0x04, // Pairwise Cipher + 0x01, 0x00, // AKM Suite count + 0x00, 0x0F, 0xAC, 0x04, // AKM Suite + 0x28, 0x00, // RSN Capability + 0x32, 0x01, + 0x6C, + 0x36, 0x03, // MDID IE + 0x12, 0x34, // MDID + 0x80, // FT Capability and Policy + 0x85, 0x1E, + 0x00, 0x00, 0x8F, 0x00, 0x0F, 0x00, 0xFF, 0x03, 0x59, 0x00, 0x41, 0x50, 0x30, 0x30, 0x31, 0x34, + 0x2E, 0x36, 0x39, 0x34, 0x30, 0x2E, 0x38, 0x35, 0x32, 0x00, 0x00, 0x00, 0x00, 0x27, + 0x96, 0x06, + 0x00, 0x40, 0x96, 0x00, 0x0B, 0x00, + 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, + 0xDD, 0x06, + 0x00, 0x40, 0x96, 0x01, 0x01, 0x04, + 0xDD, 0x05, + 0x00, 0x40, 0x96, 0x03, 0x05, + 0xDD, 0x05, + 0x00, 0x40, 0x96, 0x0B, 0x09, + 0xDD, 0x05, + 0x00, 0x40, 0x96, 0x14, 0x01, + + // WDI_TLV_BSS_ENTRY_SIGNAL_INFO + 0x0b, 0x00, + 0x08, 0x00, + 0xC1, 0xFF, 0xFF, 0xFF, // RSSI + 0x4A, 0x00, 0x00, 0x00, // Link Quality + + // WDI_TLV_BSS_ENTRY_DEVICE_CONTEXT + 0x0d, 0x00, + 0x09, 0x00, + 0x04, 0x05, 0x06, 0x07, 0x04, 0x05, 0x06, 0x07, 0x00, + + // WDI_TLV_BSS_ENTRY_PHY_INFO + 0x3a, 0x00, + 0x08, 0x00, + 0x01, 0x00, 0x00, 0x00, // Channel + 0x01, 0x00, 0x00, 0x00 // BandId +}; + +UCHAR s_TLV_Success_AssociationResult_7_FT_PSK_CCMP[] = +{ + // WDI_TLV_ASSOCIATION_RESULT + 0x35, 0x00, + 0x0C, 0x02, + + // WDI_TLV_BSSID + 0x02, 0x00, + 0x06, 0x00, + 0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xE7, + + + // WDI_TLV_ASSOCIATION_RESULT_PARAMETERS + 0x2D, 0x00, + 0x30, 0x00, + 0x00, 0x00, 0x00, 0x00, //Association Status + 0x00, 0x00, 0x00, 0x00, //Status Code + 0x00, //ReAssociationRequest + 0x07, 0x00, 0x00, 0x00, //AuthAlgorithm -- RSNA_PSK + 0x04, 0x00, 0x00, 0x00, //UnicastCipherAlgorithm + 0x04, 0x00, 0x00, 0x00, //MulticastDataCipherAlgorithm + 0x00, 0x00, 0x00, 0x00, //MulticastMgmtCipherAlgorithm + 0x00, //FourAddressSupported + 0x00, //Port Authorized + 0x01, // WMM QoS Enabled + 0x03, 0x00, 0x00, 0x00, //DSInfo + 0x00, 0x00, 0x00, 0x00, //AssociationComebackTime + 0x01, 0x00, 0x00, 0x00, // Band ID + 0x00, 0x00, 0x00, 0x00, // IHV Association Status + 0x00, 0x00, 0x00, 0x00, //DisableDataPathOffloadsScenario + + // WDI_TLV_ASSOCIATION_REQUEST_FRAME + 0x2E, 0x00, + 0x41, 0x00, + 0x31, 0x04, // Capabilities + 0x01, 0x00, // Listen Interval + 0x00, 0x0A, // SSID + 'W', 'D', 'I', '_', '_', 'F', 'T', 'P', 'S', 'K', // WDI__FTPSK + 0x01, 0x08, // Supported Rates + 0x0C, 0x12, 0x96, 0x18, 0x24, 0x30, 0x48, 0x60, + 0x30, 0x14, // RSN IE + 0x01, 0x00, 0x00, 0x0F, 0xAC, 0x04, 0x01, 0x00, 0x00, 0x0F, 0xAC, 0x04, 0x01, 0x00, 0x00, 0x0F, + 0xAC, 0x01, 0x00, 0x00, + 0x32, 0x01, // Extended Rates + 0x6C, + 0x36, 0x03, // MDID IE + 0x12, 0x34, // MDID + 0x80, // FT Capability and Policy + 0xDD, 0x07, + 0x00, 0x50, 0xF2, 0x02, 0x00, 0x01, 0x00, + + // WDI_TLV_ASSOCIATION_RESPONSE_FRAME + 0x2F, 0x00, + 0xBF, 0x00, + 0x31, 0x04, // Capability + 0x00, 0x00, // Status + 0x01, 0xC0, // Association ID + 0x01, 0x08, // Supported Rates + 0x96, 0x0C, 0x12, 0x18, 0x24, 0x30, 0x48, 0x60, + 0x30, 0x26, // RSN IE + 0x01, 0x00, // Version + 0x00, 0x0F, 0xAC, 0x04, // Group Cipher -- CCMP + 0x01, 0x00, // Pairwise Cipher Count + 0x00, 0x0F, 0xAC, 0x04, // Pairwise Cipher -- CCMP + 0x01, 0x00, // AKM Suite count + 0x00, 0x0F, 0xAC, 0x04, // AKM Suite -- FT-PSK + 0x28, 0x00, // RSN Capability + 0x01, 0x00, // PMKID Count -- PMKR1Name + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //PMKID + 0x32, 0x01, // Extended Rates + 0x6C, + 0x36, 0x03, // MDID IE + 0x12, 0x34, // MDID + 0x80, // FT Capability and Policy + 0x37, 0x63, // FTE IE + 0x00, 0x02, // MIC Control + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //MIC + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //ANonce + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //SNonce + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x06, // R1KH-ID + 0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xE7, + 0x03, 0x07, // R0KH-ID + 'x', '@', 'y', '.', 'c', 'o', 'm', + 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, + + // WDI_TLV_BEACON_FRAME + 0x30, 0x00, + 0xBA, 0x00, + 0xDD, 0x50, 0x3D, 0xF7, 0xE2, 0x01, 0x00, 0x00, // Supported Rates + 0x64, 0x00, // Beacon Interval + 0x31, 0x04, // Capability + 0x00, 0x0A, // SSID + 'W', 'D', 'I', '_', '_', 'F', 'T', 'P', 'S', 'K', // WDI__FTPSK + 0x01, 0x08, + 0x0C, 0x12, 0x96, 0x18, 0x24, 0x30, 0x48, 0x60, + 0x03, 0x01, // DSS Parameters + 0x01, + 0x05, 0x04, // TIM + 0x00, 0x01, 0x00, 0x00, + 0x07, 0x06, // Country + 0x55, 0x53, 0x20, 0x01, 0x0B, 0x1E, + 0x0B, 0x05, + 0x00, 0x00, 0x6E, 0x8D, 0x5B, + 0x2A, 0x01, // ERP + 0x00, + 0x30, 0x14, // RSN + 0x01, 0x00, // Version + 0x00, 0x0F, 0xAC, 0x04, // Group Cipher + 0x01, 0x00, // Pairwise cipher count + 0x00, 0x0F, 0xAC, 0x04, // Pairwise cipher + 0x01, 0x00, // AKM Suite Count + 0x00, 0x0F, 0xAC, 0x04, // AKM Suite + 0x28, 0x00, // RSN Capability + 0x32, 0x01, // Extended Supported Rates + 0x6C, + 0x36, 0x03, // MDID IE + 0x12, 0x34, // MDID + 0x80, // FT Capability and Policy + 0x85, 0x1E, + 0x03, 0x00, 0x8F, 0x00, 0x0F, 0x00, 0xFF, 0x03, 0x59, 0x00, 0x41, 0x50, 0x30, 0x30, 0x31, 0x34, + 0x2E, 0x36, 0x39, 0x34, 0x30, 0x2E, 0x38, 0x31, 0x65, 0x00, 0x00, 0x00, 0x00, 0x27, + 0x96, 0x06, + 0x00, 0x40, 0x96, 0x00, 0x0E, 0x00, + 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, + 0xDD, 0x06, + 0x00, 0x40, 0x96, 0x01, 0x01, 0x04, + 0xDD, 0x05, + 0x00, 0x40, 0x96, 0x03, 0x05, + 0xDD, 0x05, + 0x00, 0x40, 0x96, 0x0B, 0x09, + 0xDD, 0x05, + 0x00, 0x40, 0x96, 0x14, 0x01, + + // WDI_TLV_PHY_TYPE_LIST + 0x19, 0x00, + 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00 +}; + + +// +//=============================================================================== +// + +WDI_MAC_ADDRESS s_Connect_Addr_8_Hidden = {0x00, 0xA0, 0xB0, 0xC0, 0xD0,0xE8}; + +UCHAR s_TLV_BSS_Entry_Beacon_8_Hidden [] = +{ + // WDI_TLV_BSS_ENTRY + 0x08, 0x00, //Type + 0x52, 0x00, //Len + + // WDI_TLV_BSSID + 0x02, 0x00, // Type + 0x06, 0x00, // Length + 0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xE8, + + // WDI_TLV_BEACON_FRAME + 0x0a, 0x00, + 0x24, 0x00, // Length + 0x00, 0x11, 0x22, 0x33, 0x00, 0x00, 0x00, 0x00, // Timestamp + 0x64, 0x00, // Beacon Interval + 0x00, 0x04, // Capability + 0x00, 0x00, // SSID + 0x01, 0x04, 0x02, 0x04, 0x0B, 0x16, // Supported Rates + 0x03, 0x01, 0x01, // DSSS Parameter + 0x05, 0x04, 0x00, 0x01, 0x00, 0x00, // TIM + 0x46, 0x05, 0x02, 0x00, 0x00, 0x00, 0x00, // RM Enabled Capabilities + + // WDI_TLV_BSS_ENTRY_DEVICE_CONTEXT + 0x0d, 0x00, + 0x04, 0x00, + 0x04, 0x05, 0x06, 0x07, + + // 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, + 0x06, 0x00, 0x00, 0x00, // Channel + 0x01, 0x00, 0x00, 0x00 // Band ID +}; + +UCHAR s_TLV_BSS_Entry_ProbeResponse_8_Hidden [] = +{ + // WDI_TLV_BSS_ENTRY + 0x08, 0x00, //Type + 0x5a, 0x00, //Len + + // WDI_TLV_BSSID + 0x02, 0x00, // Type + 0x06, 0x00, // Length + 0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xE8, + + // WDI_TLV_PROBE_RESPONSE_FRAME + 0x09, 0x00, // Type + 0x2C, 0x00, // Length + 0x00, 0x11, 0x22, 0x33, 0x00, 0x00, 0x00, 0x00, // Timestamp + 0x64, 0x00, // Beacon Interval + 0x00, 0x04, // Capability + 0x00, 0x08, // SSID + 'W', 'D', 'I', '_', 'H', 'I', 'D', 'E', + 0x01, 0x04, 0x02, 0x04, 0x0B, 0x16, // Supported Rates + 0x03, 0x01, 0x01, // DSSS Parameter + 0x05, 0x04, 0x00, 0x01, 0x00, 0x00, // TIM + 0x46, 0x05, 0x02, 0x00, 0x00, 0x00, 0x00, // RM Enabled Capabilities + + // WDI_TLV_BSS_ENTRY_DEVICE_CONTEXT + 0x0d, 0x00, + 0x04, 0x00, + 0x04, 0x05, 0x06, 0x07, + + // 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, + 0x06, 0x00, 0x00, 0x00, // Channel + 0x01, 0x00, 0x00, 0x00 // Band ID +}; + + +UCHAR s_TLV_Success_AssociationResult_8_Hidden[] = +{ + // WDI_TLV_ASSOCIATION_RESULT + 0x35, 0x00, + 0xD7, 0x00, + + // WDI_TLV_BSSID + 0x02, 0x00, + 0x06, 0x00, + 0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xE8, + + // WDI_TLV_ASSOCIATION_RESULT_PARAMETERS + 0x2D, 0x00, + 0x30, 0x00, + 0x00, 0x00, 0x00, 0x00, //Association Status + 0x00, 0x00, 0x00, 0x00, //Status Code + 0x00, //ReAssociationRequest + 0x01, 0x00, 0x00, 0x00, //AuthAlgorithm + 0x00, 0x00, 0x00, 0x00, //UnicastCipherAlgorithm + 0x00, 0x00, 0x00, 0x00, //MulticastDataCipherAlgorithm + 0x00, 0x00, 0x00, 0x00, //MulticastMgmtCipherAlgorithm + 0x00, //FourAddressSupported + 0x00, //Port Authorized + 0x00, // WMM QoS Enabled + 0x00, 0x00, 0x00, 0x00, //DSInfo + 0x00, 0x00, 0x00, 0x00, //AssociationComebackTime + 0x01, 0x00, 0x00, 0x00, // Band ID + 0x00, 0x00, 0x00, 0x00, // IHV Association Status + 0x00, 0x00, 0x00, 0x00, //DisableDataPathOffloadsScenario + + // WDI_TLV_ASSOCIATION_REQUEST_FRAME + 0x2E, 0x00, + 0x30, 0x00, + 0x21, 0x04, // Capabilities + 0x0A, 0x00, // Listen Interval + 0x00, 0x08, // SSID + 'W', 'D', 'I', '_', 'H', 'I', 'D', 'E', + 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, 0x07, 0x00, 0x50, 0xF2, 0x02, 0x00, 0x01, 0x00, 0x03, // WMM settings + + // WDI_TLV_ASSOCIATION_RESPONSE_FRAME + 0x2F, 0x00, + 0x30, 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 + + // WDI_TLV_BEACON_PROBE_RESPONSE + 0x30, 0x00, // Type + 0x25, 0x00, // Length + 0x00, 0x11, 0x22, 0x33, 0x00, 0x00, 0x00, 0x00, // Timestamp + 0x64, 0x00, // Beacon Interval + 0x00, 0x04, // Capability + 0x00, 0x08, // SSID + 'W', 'D', 'I', '_', 'H', 'I', 'D', 'E', + 0x01, 0x04, 0x02, 0x04, 0x0B, 0x16, // Supported Rates + 0x03, 0x01, 0x01, // DSSS Parameter + 0x05, 0x04, 0x00, 0x01, 0x00, 0x00, // TIM + + // WDI_TLV_ETHERTYPE_ENCAP_TABLE (optional) + // 0x00, 0x00, + // 0x04, 0x00, + // 0x00, 0x00, 0x00, 0x00 + + // WDI_TLV_PHY_TYPE_LIST + 0x19, 0x00, + 0x04, 0x00, + 0x04, 0x00, 0x00, 0x00, + +}; + + +//=============================================================================== +// +// 11ad +// +//=============================================================================== + +WDI_MAC_ADDRESS s_Connect_Addr_9_11ad_PSK = {0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xE9}; + +UCHAR s_TLV_BSS_Entry_9_11ad_Beacon_PSK [] = +{ + // WDI_TLV_BSS_ENTRY + 0x08, 0x00, //Type + 0x3F, 0x00, + + // WDI_TLV_BSSID + 0x02, 0x00, + 0x06, 0x00, + 0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xE9, + + // WDI_TLV_BEACON_FRAME (8.3.3.2, Table 8-33a) + 0x0A, 0x00, + 0x0C, 0x00, // For WiFi Beacon + // WiFi Beacon + 0x38, 0xE3, 0x3B, 0x64, 0x11, 0x00, 0x00, 0x00, // TimeStamp (9.4.1.10) + 0x64, 0x00, // Beacon Interval (8.4.1.3) + 0x31, 0x04, // Capability + + // WDI_TLV_BSS_ENTRY_SIGNAL_INFO + 0x0b, 0x00, + 0x08, 0x00, + 0xC1, 0xFF, 0xFF, 0xFF, // RSSI + 0x64, 0x00, 0x00, 0x00, // Link Quality + + // WDI_TLV_BSS_ENTRY_DEVICE_CONTEXT + 0x0d, 0x00, + 0x09, 0x00, + 0x04, 0x05, 0x06, 0x07, 0x04, 0x05, 0x06, 0x07, 0x00, + + // WDI_TLV_BSS_ENTRY_CHANNEL_INFO + 0x3a, 0x00, + 0x08, 0x00, + 0x01, 0x00, 0x00, 0x00, // Channel + 0x03, 0x00, 0x00, 0x00 // BandId +}; + +UCHAR s_TLV_BSS_Entry_9_11ad_Beacon_Dmg_PSK [] = +{ + // WDI_TLV_BSS_ENTRY + 0x08, 0x00, //Type + 0x47, 0x00, + + // WDI_TLV_BSSID + 0x02, 0x00, + 0x06, 0x00, + 0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xE9, + + // WDI_TLV_BEACON_FRAME (8.3.3.2, Table 8-33a) + 0x0A, 0x00, + 0x14, 0x00, // For WiFi Beacon + // DMG Beacon + 0x38, 0xE3, 0x3B, 0x64, 0x11, 0x00, 0x00, 0x00, // TimeStamp (9.4.1.10) + 0x00, 0x0c, 0x38, // 3 - Sector Sweep (9.5.1) + 0x64, 0x00, // 2 - Beacon Interval (9.4.1.3) + 0xc0, 0x7c, 0x18, 0x08, 0x20, 0x18, // 6 - Beacon Interval Control (Fig 9-60) + 0x07, // 1 - DMG Parameters (9.4.1.47) + + // WDI_TLV_BSS_ENTRY_SIGNAL_INFO + 0x0b, 0x00, + 0x08, 0x00, + 0xC1, 0xFF, 0xFF, 0xFF, // RSSI + 0x64, 0x00, 0x00, 0x00, // Link Quality + + // WDI_TLV_BSS_ENTRY_DEVICE_CONTEXT + 0x0d, 0x00, + 0x09, 0x00, + 0x04, 0x05, 0x06, 0x07, 0x04, 0x05, 0x06, 0x07, 0x00, + + // WDI_TLV_BSS_ENTRY_CHANNEL_INFO + 0x3a, 0x00, + 0x08, 0x00, + 0x01, 0x00, 0x00, 0x00, // Channel + 0x03, 0x00, 0x00, 0x00 // BandId +}; + +UCHAR s_TLV_BSS_Entry_9_11ad_ProbeResponse_PSK [] = +{ + // WDI_TLV_BSS_ENTRY + 0x08, 0x00, //Type + 0xCB, 0x00, + + // WDI_TLV_BSSID + 0x02, 0x00, + 0x06, 0x00, + 0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xE9, + + // WDI_TLV_PROBE_RESPONSE_FRAME (8.3.3.2, Table 8-33a) + 0x09, 0x00, + 0x98, 0x00, // For WiFi Beacon + // WiFi Beacon + 0x38, 0xE3, 0x3B, 0x64, 0x11, 0x00, 0x00, 0x00, // TimeStamp (9.4.1.10) + 0x64, 0x00, // Beacon Interval (8.4.1.3) + 0x31, 0x04, // Capability + + 0x00, 0x09, // SSID + 'W', 'D', 'I', '_', 'a', 'd', 'P', 'S', 'K', // WDI_adPSK + 0x03, 0x01, // DSS Parameters + 0x02, + 0x30, 0x14, // RSN IE + 0x01, 0x00, // Version + 0x00, 0x0F, 0xAC, 0x08, // Group Cipher + 0x01, 0x00, // Pairwise Cipher Count + 0x00, 0x0F, 0xAC, 0x08, // Pairwise Cipher + 0x01, 0x00, // AKM Suite count + 0x00, 0x0F, 0xAC, 0x02, // AKM Suite + 0x00, 0x00, // RSN Capability + 0x7F, 0x04, + 0x00, 0x00, 0x00, 0x02, + 0x94, 0x11, + 0x04, 0xCE, 0x14, 0x07, 0x34, 0x6B, 0x01, 0x11, 0xD1, 0xB7, 0x06, 0x00, 0x00, 0x40, 0x00, 0x00, + 0x00, + 0x97, 0x0A, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, + 0xBE, 0x04, + 0x00, 0x00, 0x00, 0x00, + 0xDD, 0x18, + 0x00, 0x50, 0xF2, 0x02, 0x01, 0x01, 0x00, 0x00, 0x03, 0xA4, 0x00, 0x00, 0x27, 0xA4, 0x00, 0x00, + 0x42, 0x43, 0x5E, 0x00, 0x62, 0x32, 0x2F, 0x00, + 0xDD, 0x21, + 0x04, 0xCE, 0x14, 0x05, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x02, 0x00, 0x00, 0x00, 0x06, 0x00, 0x02, 0x00, 0x05, + 0x00, + + // WDI_TLV_BSS_ENTRY_SIGNAL_INFO + 0x0b, 0x00, + 0x08, 0x00, + 0xC1, 0xFF, 0xFF, 0xFF, // RSSI + 0x64, 0x00, 0x00, 0x00, // Link Quality + + // WDI_TLV_BSS_ENTRY_DEVICE_CONTEXT + 0x0d, 0x00, + 0x09, 0x00, + 0x04, 0x05, 0x06, 0x07, 0x04, 0x05, 0x06, 0x07, 0x00, + + // WDI_TLV_BSS_ENTRY_CHANNEL_INFO + 0x3a, 0x00, + 0x08, 0x00, + 0x01, 0x00, 0x00, 0x00, // Channel + 0x03, 0x00, 0x00, 0x00 // BandId +}; + +UCHAR s_TLV_BSS_Entry_9_11ad_ProbeResponse_Dmg_PSK [] = +{ + // WDI_TLV_BSS_ENTRY + 0x08, 0x00, //Type + 0xCB, 0x00, + + // WDI_TLV_BSSID + 0x02, 0x00, + 0x06, 0x00, + 0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xE9, + + // WDI_TLV_PROBE_RESPONSE_FRAME (8.3.3.2, Table 8-33a) + 0x09, 0x00, + 0x98, 0x00, // For WiFi Beacon + // Dmg + 0x38, 0xE3, 0x3B, 0x64, 0x11, 0x00, 0x00, 0x00, // TimeStamp (9.4.1.10) + 0x64, 0x00, // Beacon Interval (8.4.1.3) + 0x17, 0x00, // Capability + + 0x00, 0x09, // SSID + 'W', 'D', 'I', '_', 'a', 'd', 'P', 'S', 'K', // WDI_adPSK + 0x03, 0x01, // DSS Parameters + 0x02, + 0x30, 0x14, // RSN IE + 0x01, 0x00, // Version + 0x00, 0x0F, 0xAC, 0x08, // Group Cipher + 0x01, 0x00, // Pairwise Cipher Count + 0x00, 0x0F, 0xAC, 0x08, // Pairwise Cipher + 0x01, 0x00, // AKM Suite count + 0x00, 0x0F, 0xAC, 0x02, // AKM Suite + 0x00, 0x00, // RSN Capability + 0x7F, 0x04, + 0x00, 0x00, 0x00, 0x02, + 0x94, 0x11, + 0x04, 0xCE, 0x14, 0x07, 0x34, 0x6B, 0x01, 0x11, 0xD1, 0xB7, 0x06, 0x00, 0x00, 0x40, 0x00, 0x00, + 0x00, + 0x97, 0x0A, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, + 0xBE, 0x04, + 0x00, 0x00, 0x00, 0x00, + 0xDD, 0x18, + 0x00, 0x50, 0xF2, 0x02, 0x01, 0x01, 0x00, 0x00, 0x03, 0xA4, 0x00, 0x00, 0x27, 0xA4, 0x00, 0x00, + 0x42, 0x43, 0x5E, 0x00, 0x62, 0x32, 0x2F, 0x00, + 0xDD, 0x21, + 0x04, 0xCE, 0x14, 0x05, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x02, 0x00, 0x00, 0x00, 0x06, 0x00, 0x02, 0x00, 0x05, + 0x00, + + // WDI_TLV_BSS_ENTRY_SIGNAL_INFO + 0x0b, 0x00, + 0x08, 0x00, + 0xC1, 0xFF, 0xFF, 0xFF, // RSSI + 0x64, 0x00, 0x00, 0x00, // Link Quality + + // WDI_TLV_BSS_ENTRY_DEVICE_CONTEXT + 0x0d, 0x00, + 0x09, 0x00, + 0x04, 0x05, 0x06, 0x07, 0x04, 0x05, 0x06, 0x07, 0x00, + + // WDI_TLV_BSS_ENTRY_CHANNEL_INFO + 0x3a, 0x00, + 0x08, 0x00, + 0x01, 0x00, 0x00, 0x00, // Channel + 0x03, 0x00, 0x00, 0x00 // BandId +}; + +UCHAR s_TLV_Success_AssociationResult_9_11ad_PSK [] = +{ + // WDI_TLV_ASSOCIATION_RESULT + 0x35, 0x00, + 0x96, 0x01, + + // WDI_TLV_BSSID + 0x02, 0x00, + 0x06, 0x00, + 0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xE9, + + // WDI_TLV_ASSOCIATION_RESULT_PARAMETERS + 0x2D, 0x00, + 0x30, 0x00, + 0x00, 0x00, 0x00, 0x00, //Association Status + 0x00, 0x00, 0x00, 0x00, //Status Code + 0x00, //ReAssociationRequest + 0x07, 0x00, 0x00, 0x00, //AuthAlgorithm -- RSNA_PSK + 0x08, 0x00, 0x00, 0x00, //UnicastCipherAlgorithm + 0x08, 0x00, 0x00, 0x00, //MulticastDataCipherAlgorithm + 0x00, 0x00, 0x00, 0x00, //MulticastMgmtCipherAlgorithm + 0x00, //FourAddressSupported + 0x00, //Port Authorized + 0x01, // WMM QoS Enabled + 0x03, 0x00, 0x00, 0x00, //DSInfo + 0x00, 0x00, 0x00, 0x00, //AssociationComebackTime + 0x03, 0x00, 0x00, 0x00, // Band ID + 0x00, 0x00, 0x00, 0x00, // IHV Association Status + 0x00, 0x00, 0x00, 0x00, //DisableDataPathOffloadsScenario + + // WDI_TLV_ASSOCIATION_REQUEST_FRAME + 0x2E, 0x00, + 0x65, 0x00, + 0x31, 0x04, // Capabilities + 0x01, 0x00, // Listen Interval + 0x00, 0x09, // SSID + 'W', 'D', 'I', '_', 'a', 'd', 'P', 'S', 'K', // WDI_adPSK + 0x01, 0x08, // Supported Rates + 0x0C, 0x12, 0x96, 0x18, 0x24, 0x30, 0x48, 0x60, + + 0x30, 0x14, // RSN IE + 0x01, 0x00, // Version + 0x00, 0x0F, 0xAC, 0x08, // Group Cipher + 0x01, 0x00, // Pairwise Cipher Count + 0x00, 0x0F, 0xAC, 0x08, // Pairwise Cipher + 0x01, 0x00, // AKM Suite count + 0x00, 0x0F, 0xAC, 0x02, // AKM Suite + 0x00, 0x00, // RSN Capability + 0x94, 11, + 0x04, 0xCE, 0x14, 0x0A, 0x3B, 0x61, 0x01, 0x11, 0xD1, 0xB7, 0x06, 0x00, 0x00, 0x40, 0x00, 0x00, + 0x00, + 0xDD, 0x21, + 0x04, 0xCE, 0x14, 0x05, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x02, 0x00, 0x00, 0x00, 0x06, 0x00, 0x02, 0x00, 0x05, + 0x00, + + // WDI_TLV_ASSOCIATION_RESPONSE_FRAME + 0x2F, 0x00, + 0x47, 0x00, + 0x17, 0x00, // Capabilities + 0x00, 0x00, // Status code + 0x02, 0x00, // Association ID + 0x00, 0x09, // SSID + 'W', 'D', 'I', '_', 'a', 'd', 'P', 'S', 'K', // WDI_adPSK + 0x94, 0x11, // DMG Capabilities + 0x04, 0xCE, 0x14, 0x07, 0x34, 0x6B, // STA address + 0x03, // AID + 0x11, 0xD1, 0xB7, 0x06, 0x00, 0x00, 0x40, 0x00, // DOT11_DMG_STA_CAPABILITY_INFO + 0x00, 0x00, // DOT11_DMG_PCP_AP_CAPABILITY_INFO + 0xDD, 0x21, + 0x04, 0xCE, 0x14, 0x05, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x02, 0x00, 0x00, 0x00, 0x06, 0x00, 0x02, 0x00, 0x05, + 0x00, + + // WDI_TLV_BEACON_PROBE_RESPONSE + 0x30, 0x00, + 0x98, 0x00, + 0x38, 0xE3, 0x3B, 0x64, 0x11, 0x00, 0x00, 0x00, // TimeStamp + 0x64, 0x00, // Beacon Interval + 0x31, 0x04, // Capability + 0x00, 0x09, // SSID + 'W', 'D', 'I', '_', 'a', 'd', 'P', 'S', 'K', // WDI_adPSK + 0x03, 0x01, // DSS Parameters + 0x02, + 0x30, 0x14, // RSN IE + 0x01, 0x00, // Version + 0x00, 0x0F, 0xAC, 0x08, // Group Cipher + 0x01, 0x00, // Pairwise Cipher Count + 0x00, 0x0F, 0xAC, 0x08, // Pairwise Cipher + 0x01, 0x00, // AKM Suite count + 0x00, 0x0F, 0xAC, 0x02, // AKM Suite + 0x00, 0x00, // RSN Capability + 0x7F, 0x04, + 0x00, 0x00, 0x00, 0x02, + 0x94, 0x11, + 0x04, 0xCE, 0x14, 0x07, 0x34, 0x6B, 0x01, 0x11, 0xD1, 0xB7, 0x06, 0x00, 0x00, 0x40, 0x00, 0x00, + 0x00, + 0x97, 0x0A, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, + 0xBE, 0x04, + 0x00, 0x00, 0x00, 0x00, + 0xDD, 0x18, + 0x00, 0x50, 0xF2, 0x02, 0x01, 0x01, 0x00, 0x00, 0x03, 0xA4, 0x00, 0x00, 0x27, 0xA4, 0x00, 0x00, + 0x42, 0x43, 0x5E, 0x00, 0x62, 0x32, 0x2F, 0x00, + 0xDD, 0x21, + 0x04, 0xCE, 0x14, 0x05, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x02, 0x00, 0x00, 0x00, 0x06, 0x00, 0x02, 0x00, 0x05, + 0x00, + + // WDI_TLV_PHY_TYPE_LIST + 0x19, 0x00, + 0x04, 0x00, + 0x09, 0x00, 0x00, 0x00 +}; + + +UCHAR s_TLV_Success_AssociationResult_9_11ad_Dmg_PSK [] = +{ + // WDI_TLV_ASSOCIATION_RESULT + 0x35, 0x00, + 0x96, 0x01, + + // WDI_TLV_BSSID + 0x02, 0x00, + 0x06, 0x00, + 0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xE9, + + // WDI_TLV_ASSOCIATION_RESULT_PARAMETERS + 0x2D, 0x00, + 0x30, 0x00, + 0x00, 0x00, 0x00, 0x00, //Association Status + 0x00, 0x00, 0x00, 0x00, //Status Code + 0x00, //ReAssociationRequest + 0x07, 0x00, 0x00, 0x00, //AuthAlgorithm -- RSNA_PSK + 0x08, 0x00, 0x00, 0x00, //UnicastCipherAlgorithm + 0x08, 0x00, 0x00, 0x00, //MulticastDataCipherAlgorithm + 0x00, 0x00, 0x00, 0x00, //MulticastMgmtCipherAlgorithm + 0x00, //FourAddressSupported + 0x00, //Port Authorized + 0x01, // WMM QoS Enabled + 0x03, 0x00, 0x00, 0x00, //DSInfo + 0x00, 0x00, 0x00, 0x00, //AssociationComebackTime + 0x03, 0x00, 0x00, 0x00, // Band ID + 0x00, 0x00, 0x00, 0x00, // IHV Association Status + 0x00, 0x00, 0x00, 0x00, //DisableDataPathOffloadsScenario + + // WDI_TLV_ASSOCIATION_REQUEST_FRAME + 0x2E, 0x00, + 0x65, 0x00, + 0x05, 0x00, // Capabilities + 0x01, 0x00, // Listen Interval + 0x00, 0x09, // SSID + 'W', 'D', 'I', '_', 'a', 'd', 'P', 'S', 'K', // WDI_adPSK + 0x01, 0x08, // Supported Rates + 0x0C, 0x12, 0x96, 0x18, 0x24, 0x30, 0x48, 0x60, + + 0x30, 0x14, // RSN IE + 0x01, 0x00, // Version + 0x00, 0x0F, 0xAC, 0x08, // Group Cipher + 0x01, 0x00, // Pairwise Cipher Count + 0x00, 0x0F, 0xAC, 0x08, // Pairwise Cipher + 0x01, 0x00, // AKM Suite count + 0x00, 0x0F, 0xAC, 0x02, // AKM Suite + 0x00, 0x00, // RSN Capability + 0x94, 11, + 0x04, 0xCE, 0x14, 0x0A, 0x3B, 0x61, 0x01, 0x11, 0xD1, 0xB7, 0x06, 0x00, 0x00, 0x40, 0x00, 0x00, + 0x00, + 0xDD, 0x21, + 0x04, 0xCE, 0x14, 0x05, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x02, 0x00, 0x00, 0x00, 0x06, 0x00, 0x02, 0x00, 0x05, + 0x00, + + // WDI_TLV_ASSOCIATION_RESPONSE_FRAME + 0x2F, 0x00, + 0x47, 0x00, + 0x17, 0x00, // Capabilities + 0x00, 0x00, // Status code + 0x02, 0x00, // Association ID + 0x00, 0x09, // SSID + 'W', 'D', 'I', '_', 'a', 'd', 'P', 'S', 'K', // WDI_adPSK + 0x94, 0x11, // DMG Capabilities + 0x04, 0xCE, 0x14, 0x07, 0x34, 0x6B, // STA address + 0x03, // AID + 0x11, 0xD1, 0xB7, 0x06, 0x00, 0x00, 0x40, 0x00, // DOT11_DMG_STA_CAPABILITY_INFO + 0x00, 0x00, // DOT11_DMG_PCP_AP_CAPABILITY_INFO + 0xDD, 0x21, + 0x04, 0xCE, 0x14, 0x05, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x02, 0x00, 0x00, 0x00, 0x06, 0x00, 0x02, 0x00, 0x05, + 0x00, + + // WDI_TLV_BEACON_PROBE_RESPONSE + 0x30, 0x00, + 0x98, 0x00, + 0x38, 0xE3, 0x3B, 0x64, 0x11, 0x00, 0x00, 0x00, // TimeStamp + 0x64, 0x00, // Beacon Interval + 0x31, 0x04, // Capability + 0x00, 0x09, // SSID + 'W', 'D', 'I', '_', 'a', 'd', 'P', 'S', 'K', // WDI_adPSK + 0x03, 0x01, // DSS Parameters + 0x02, + 0x30, 0x14, // RSN IE + 0x01, 0x00, // Version + 0x00, 0x0F, 0xAC, 0x08, // Group Cipher + 0x01, 0x00, // Pairwise Cipher Count + 0x00, 0x0F, 0xAC, 0x08, // Pairwise Cipher + 0x01, 0x00, // AKM Suite count + 0x00, 0x0F, 0xAC, 0x02, // AKM Suite + 0x00, 0x00, // RSN Capability + 0x7F, 0x04, + 0x00, 0x00, 0x00, 0x02, + 0x94, 0x11, + 0x04, 0xCE, 0x14, 0x07, 0x34, 0x6B, 0x01, 0x11, 0xD1, 0xB7, 0x06, 0x00, 0x00, 0x40, 0x00, 0x00, + 0x00, + 0x97, 0x0A, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, + 0xBE, 0x04, + 0x00, 0x00, 0x00, 0x00, + 0xDD, 0x18, + 0x00, 0x50, 0xF2, 0x02, 0x01, 0x01, 0x00, 0x00, 0x03, 0xA4, 0x00, 0x00, 0x27, 0xA4, 0x00, 0x00, + 0x42, 0x43, 0x5E, 0x00, 0x62, 0x32, 0x2F, 0x00, + 0xDD, 0x21, + 0x04, 0xCE, 0x14, 0x05, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x02, 0x00, 0x00, 0x00, 0x06, 0x00, 0x02, 0x00, 0x05, + 0x00, + + // WDI_TLV_PHY_TYPE_LIST + 0x19, 0x00, + 0x04, 0x00, + 0x09, 0x00, 0x00, 0x00 +}; + + +//=============================================================================== + +WDI_MAC_ADDRESS s_Connect_Addr_10_11ad_1x = {0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xEA}; + +UCHAR s_TLV_BSS_Entry_10_11ad_Beacon_1x [] = +{ + // WDI_TLV_BSS_ENTRY + 0x08, 0x00, //Type + 0x3F, 0x00, + + // WDI_TLV_BSSID + 0x02, 0x00, + 0x06, 0x00, + 0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xEA, + + // WDI_TLV_BEACON_FRAME (8.3.3.2, Table 8-33a) + 0x0A, 0x00, + 0x0C, 0x00, // For WiFi Beacon + // WiFi Beacon + 0x38, 0xE3, 0x3B, 0x64, 0x11, 0x00, 0x00, 0x00, // TimeStamp (9.4.1.10) + 0x64, 0x00, // Beacon Interval (8.4.1.3) + 0x31, 0x04, // Capability + + // WDI_TLV_BSS_ENTRY_SIGNAL_INFO + 0x0b, 0x00, + 0x08, 0x00, + 0xC1, 0xFF, 0xFF, 0xFF, // RSSI + 0x64, 0x00, 0x00, 0x00, // Link Quality + + // WDI_TLV_BSS_ENTRY_DEVICE_CONTEXT + 0x0d, 0x00, + 0x09, 0x00, + 0x04, 0x05, 0x06, 0x07, 0x04, 0x05, 0x06, 0x07, 0x00, + + // WDI_TLV_BSS_ENTRY_CHANNEL_INFO + 0x3a, 0x00, + 0x08, 0x00, + 0x01, 0x00, 0x00, 0x00, // Channel + 0x03, 0x00, 0x00, 0x00 // BandId +}; + +UCHAR s_TLV_BSS_Entry_10_11ad_Beacon_Dmg_1x [] = +{ + // WDI_TLV_BSS_ENTRY + 0x08, 0x00, //Type + 0x47, 0x00, + + // WDI_TLV_BSSID + 0x02, 0x00, + 0x06, 0x00, + 0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xEA, + + // WDI_TLV_BEACON_FRAME (8.3.3.2, Table 8-33a) + 0x0A, 0x00, + 0x14, 0x00, // For WiFi Beacon + // DMG Beacon + 0x38, 0xE3, 0x3B, 0x64, 0x11, 0x00, 0x00, 0x00, // TimeStamp (9.4.1.10) + 0x00, 0x0c, 0x38, // 3 - Sector Sweep (9.5.1) + 0x64, 0x00, // 2 - Beacon Interval (9.4.1.3) + 0xc0, 0x7c, 0x18, 0x08, 0x20, 0x18, // 6 - Beacon Interval Control (Fig 9-60) + 0x07, // 1 - DMG Parameters (9.4.1.47) + + // WDI_TLV_BSS_ENTRY_SIGNAL_INFO + 0x0b, 0x00, + 0x08, 0x00, + 0xC1, 0xFF, 0xFF, 0xFF, // RSSI + 0x64, 0x00, 0x00, 0x00, // Link Quality + + // WDI_TLV_BSS_ENTRY_DEVICE_CONTEXT + 0x0d, 0x00, + 0x09, 0x00, + 0x04, 0x05, 0x06, 0x07, 0x04, 0x05, 0x06, 0x07, 0x00, + + // WDI_TLV_BSS_ENTRY_CHANNEL_INFO + 0x3a, 0x00, + 0x08, 0x00, + 0x01, 0x00, 0x00, 0x00, // Channel + 0x03, 0x00, 0x00, 0x00 // BandId +}; + +UCHAR s_TLV_BSS_Entry_10_11ad_ProbeResponse_1x [] = +{ + // WDI_TLV_BSS_ENTRY + 0x08, 0x00, //Type + 0xCB, 0x00, + + // WDI_TLV_BSSID + 0x02, 0x00, + 0x06, 0x00, + 0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xEA, + + // WDI_TLV_PROBE_RESPONSE_FRAME (8.3.3.2, Table 8-33a) + 0x09, 0x00, + 0x98, 0x00, // For WiFi Beacon + // WiFi Beacon + 0x38, 0xE3, 0x3B, 0x64, 0x11, 0x00, 0x00, 0x00, // TimeStamp (9.4.1.10) + 0x64, 0x00, // Beacon Interval (8.4.1.3) + 0x31, 0x04, // Capability + + 0x00, 0x09, // SSID + 'W', 'D', 'I', '_', 'a', 'd', '_', '1', 'x', // WDI_ad_1x + 0x03, 0x01, // DSS Parameters + 0x02, + 0x30, 0x14, // RSN IE + 0x01, 0x00, // Version + 0x00, 0x0F, 0xAC, 0x08, // Group Cipher + 0x01, 0x00, // Pairwise Cipher Count + 0x00, 0x0F, 0xAC, 0x08, // Pairwise Cipher + 0x01, 0x00, // AKM Suite count + 0x00, 0x0F, 0xAC, 0x01, // AKM Suite + 0x00, 0x00, // RSN Capability + 0x7F, 0x04, + 0x00, 0x00, 0x00, 0x02, + 0x94, 0x11, + 0x04, 0xCE, 0x14, 0x07, 0x34, 0x6B, 0x01, 0x11, 0xD1, 0xB7, 0x06, 0x00, 0x00, 0x40, 0x00, 0x00, + 0x00, + 0x97, 0x0A, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, + 0xBE, 0x04, + 0x00, 0x00, 0x00, 0x00, + 0xDD, 0x18, + 0x00, 0x50, 0xF2, 0x02, 0x01, 0x01, 0x00, 0x00, 0x03, 0xA4, 0x00, 0x00, 0x27, 0xA4, 0x00, 0x00, + 0x42, 0x43, 0x5E, 0x00, 0x62, 0x32, 0x2F, 0x00, + 0xDD, 0x21, + 0x04, 0xCE, 0x14, 0x05, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x02, 0x00, 0x00, 0x00, 0x06, 0x00, 0x02, 0x00, 0x05, + 0x00, + + // WDI_TLV_BSS_ENTRY_SIGNAL_INFO + 0x0b, 0x00, + 0x08, 0x00, + 0xC1, 0xFF, 0xFF, 0xFF, // RSSI + 0x64, 0x00, 0x00, 0x00, // Link Quality + + // WDI_TLV_BSS_ENTRY_DEVICE_CONTEXT + 0x0d, 0x00, + 0x09, 0x00, + 0x04, 0x05, 0x06, 0x07, 0x04, 0x05, 0x06, 0x07, 0x00, + + // WDI_TLV_BSS_ENTRY_CHANNEL_INFO + 0x3a, 0x00, + 0x08, 0x00, + 0x01, 0x00, 0x00, 0x00, // Channel + 0x03, 0x00, 0x00, 0x00 // BandId +}; + +UCHAR s_TLV_BSS_Entry_10_11ad_ProbeResponse_Dmg_1x [] = +{ + // WDI_TLV_BSS_ENTRY + 0x08, 0x00, //Type + 0xCB, 0x00, + + // WDI_TLV_BSSID + 0x02, 0x00, + 0x06, 0x00, + 0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xEA, + + // WDI_TLV_PROBE_RESPONSE_FRAME (8.3.3.2, Table 8-33a) + 0x09, 0x00, + 0x98, 0x00, // For WiFi Beacon + // Dmg + 0x38, 0xE3, 0x3B, 0x64, 0x11, 0x00, 0x00, 0x00, // TimeStamp (9.4.1.10) + 0x64, 0x00, // Beacon Interval (8.4.1.3) + 0x17, 0x00, // Capability + + 0x00, 0x09, // SSID + 'W', 'D', 'I', '_', 'a', 'd', '_', '1', 'x', // WDI_ad_1x + 0x03, 0x01, // DSS Parameters + 0x02, + 0x30, 0x14, // RSN IE + 0x01, 0x00, // Version + 0x00, 0x0F, 0xAC, 0x08, // Group Cipher + 0x01, 0x00, // Pairwise Cipher Count + 0x00, 0x0F, 0xAC, 0x08, // Pairwise Cipher + 0x01, 0x00, // AKM Suite count + 0x00, 0x0F, 0xAC, 0x01, // AKM Suite + 0x00, 0x00, // RSN Capability + 0x7F, 0x04, + 0x00, 0x00, 0x00, 0x02, + 0x94, 0x11, + 0x04, 0xCE, 0x14, 0x07, 0x34, 0x6B, 0x01, 0x11, 0xD1, 0xB7, 0x06, 0x00, 0x00, 0x40, 0x00, 0x00, + 0x00, + 0x97, 0x0A, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, + 0xBE, 0x04, + 0x00, 0x00, 0x00, 0x00, + 0xDD, 0x18, + 0x00, 0x50, 0xF2, 0x02, 0x01, 0x01, 0x00, 0x00, 0x03, 0xA4, 0x00, 0x00, 0x27, 0xA4, 0x00, 0x00, + 0x42, 0x43, 0x5E, 0x00, 0x62, 0x32, 0x2F, 0x00, + 0xDD, 0x21, + 0x04, 0xCE, 0x14, 0x05, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x02, 0x00, 0x00, 0x00, 0x06, 0x00, 0x02, 0x00, 0x05, + 0x00, + + // WDI_TLV_BSS_ENTRY_SIGNAL_INFO + 0x0b, 0x00, + 0x08, 0x00, + 0xC1, 0xFF, 0xFF, 0xFF, // RSSI + 0x64, 0x00, 0x00, 0x00, // Link Quality + + // WDI_TLV_BSS_ENTRY_DEVICE_CONTEXT + 0x0d, 0x00, + 0x09, 0x00, + 0x04, 0x05, 0x06, 0x07, 0x04, 0x05, 0x06, 0x07, 0x00, + + // WDI_TLV_BSS_ENTRY_CHANNEL_INFO + 0x3a, 0x00, + 0x08, 0x00, + 0x01, 0x00, 0x00, 0x00, // Channel + 0x03, 0x00, 0x00, 0x00 // BandId +}; + +UCHAR s_TLV_Success_AssociationResult_10_11ad_1x [] = +{ + // WDI_TLV_ASSOCIATION_RESULT + 0x35, 0x00, + 0x96, 0x01, + // WDI_TLV_BSSID + 0x02, 0x00, + 0x06, 0x00, + 0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xEA, + + // WDI_TLV_ASSOCIATION_RESULT_PARAMETERS + 0x2D, 0x00, + 0x30, 0x00, + 0x00, 0x00, 0x00, 0x00, //Association Status + 0x00, 0x00, 0x00, 0x00, //Status Code + 0x00, //ReAssociationRequest + 0x07, 0x00, 0x00, 0x00, //AuthAlgorithm -- RSNA_PSK + 0x08, 0x00, 0x00, 0x00, //UnicastCipherAlgorithm + 0x08, 0x00, 0x00, 0x00, //MulticastDataCipherAlgorithm + 0x00, 0x00, 0x00, 0x00, //MulticastMgmtCipherAlgorithm + 0x00, //FourAddressSupported + 0x00, //Port Authorized + 0x01, // WMM QoS Enabled + 0x03, 0x00, 0x00, 0x00, //DSInfo + 0x00, 0x00, 0x00, 0x00, //AssociationComebackTime + 0x03, 0x00, 0x00, 0x00, // Band ID + 0x00, 0x00, 0x00, 0x00, // IHV Association Status + 0x00, 0x00, 0x00, 0x00, //DisableDataPathOffloadsScenario + + // WDI_TLV_ASSOCIATION_REQUEST_FRAME + 0x2E, 0x00, + 0x65, 0x00, + 0x31, 0x04, // Capabilities + 0x01, 0x00, // Listen Interval + 0x00, 0x09, // SSID + 'W', 'D', 'I', '_', 'a', 'd', '_', '1', 'x', // WDI_ad_1x + 0x01, 0x08, // Supported Rates + 0x0C, 0x12, 0x96, 0x18, 0x24, 0x30, 0x48, 0x60, + + 0x30, 0x14, // RSN IE + 0x01, 0x00, // Version + 0x00, 0x0F, 0xAC, 0x08, // Group Cipher + 0x01, 0x00, // Pairwise Cipher Count + 0x00, 0x0F, 0xAC, 0x08, // Pairwise Cipher + 0x01, 0x00, // AKM Suite count + 0x00, 0x0F, 0xAC, 0x01, // AKM Suite + 0x00, 0x00, // RSN Capability + 0x94, 11, + 0x04, 0xCE, 0x14, 0x0A, 0x3B, 0x61, 0x01, 0x11, 0xD1, 0xB7, 0x06, 0x00, 0x00, 0x40, 0x00, 0x00, + 0x00, + 0xDD, 0x21, + 0x04, 0xCE, 0x14, 0x05, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x02, 0x00, 0x00, 0x00, 0x06, 0x00, 0x02, 0x00, 0x05, + 0x00, + + // WDI_TLV_ASSOCIATION_RESPONSE_FRAME + 0x2F, 0x00, + 0x47, 0x00, + 0x17, 0x00, // Capabilities + 0x00, 0x00, // Status code + 0x02, 0x00, // Association ID + 0x00, 0x09, // SSID + 'W', 'D', 'I', '_', 'a', 'd', 'P', 'S', 'K', // WDI_adPSK + 0x94, 0x11, // DMG Capabilities + 0x04, 0xCE, 0x14, 0x07, 0x34, 0x6B, // STA address + 0x03, // AID + 0x11, 0xD1, 0xB7, 0x06, 0x00, 0x00, 0x40, 0x00, // DOT11_DMG_STA_CAPABILITY_INFO + 0x00, 0x00, // DOT11_DMG_PCP_AP_CAPABILITY_INFO + 0xDD, 0x21, + 0x04, 0xCE, 0x14, 0x05, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x02, 0x00, 0x00, 0x00, 0x06, 0x00, 0x02, 0x00, 0x05, + 0x00, + + // WDI_TLV_BEACON_PROBE_RESPONSE + 0x30, 0x00, + 0x98, 0x00, + 0x38, 0xE3, 0x3B, 0x64, 0x11, 0x00, 0x00, 0x00, // TimeStamp + 0x64, 0x00, // Beacon Interval + 0x31, 0x04, // Capability + 0x00, 0x09, // SSID + 'W', 'D', 'I', '_', 'a', 'd', 'P', 'S', 'K', // WDI_adPSK + 0x03, 0x01, // DSS Parameters + 0x02, + 0x30, 0x14, // RSN IE + 0x01, 0x00, // Version + 0x00, 0x0F, 0xAC, 0x08, // Group Cipher + 0x01, 0x00, // Pairwise Cipher Count + 0x00, 0x0F, 0xAC, 0x08, // Pairwise Cipher + 0x01, 0x00, // AKM Suite count + 0x00, 0x0F, 0xAC, 0x01, // AKM Suite + 0x00, 0x00, // RSN Capability + 0x7F, 0x04, + 0x00, 0x00, 0x00, 0x02, + 0x94, 0x11, + 0x04, 0xCE, 0x14, 0x07, 0x34, 0x6B, 0x01, 0x11, 0xD1, 0xB7, 0x06, 0x00, 0x00, 0x40, 0x00, 0x00, + 0x00, + 0x97, 0x0A, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, + 0xBE, 0x04, + 0x00, 0x00, 0x00, 0x00, + 0xDD, 0x18, + 0x00, 0x50, 0xF2, 0x02, 0x01, 0x01, 0x00, 0x00, 0x03, 0xA4, 0x00, 0x00, 0x27, 0xA4, 0x00, 0x00, + 0x42, 0x43, 0x5E, 0x00, 0x62, 0x32, 0x2F, 0x00, + 0xDD, 0x21, + 0x04, 0xCE, 0x14, 0x05, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x02, 0x00, 0x00, 0x00, 0x06, 0x00, 0x02, 0x00, 0x05, + 0x00, + + // WDI_TLV_PHY_TYPE_LIST + 0x19, 0x00, + 0x04, 0x00, + 0x09, 0x00, 0x00, 0x00 +}; + + +UCHAR s_TLV_Success_AssociationResult_10_11ad_Dmg_1x [] = +{ + // WDI_TLV_ASSOCIATION_RESULT + 0x35, 0x00, + 0x96, 0x01, + + // WDI_TLV_BSSID + 0x02, 0x00, + 0x06, 0x00, + 0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xEA, + + // WDI_TLV_ASSOCIATION_RESULT_PARAMETERS + 0x2D, 0x00, + 0x30, 0x00, + 0x00, 0x00, 0x00, 0x00, //Association Status + 0x00, 0x00, 0x00, 0x00, //Status Code + 0x00, //ReAssociationRequest + 0x07, 0x00, 0x00, 0x00, //AuthAlgorithm -- RSNA_PSK + 0x08, 0x00, 0x00, 0x00, //UnicastCipherAlgorithm + 0x08, 0x00, 0x00, 0x00, //MulticastDataCipherAlgorithm + 0x00, 0x00, 0x00, 0x00, //MulticastMgmtCipherAlgorithm + 0x00, //FourAddressSupported + 0x00, //Port Authorized + 0x01, // WMM QoS Enabled + 0x03, 0x00, 0x00, 0x00, //DSInfo + 0x00, 0x00, 0x00, 0x00, //AssociationComebackTime + 0x03, 0x00, 0x00, 0x00, // Band ID + 0x00, 0x00, 0x00, 0x00, // IHV Association Status + 0x00, 0x00, 0x00, 0x00, //DisableDataPathOffloadsScenario + + // WDI_TLV_ASSOCIATION_REQUEST_FRAME + 0x2E, 0x00, + 0x65, 0x00, + 0x05, 0x00, // Capabilities + 0x01, 0x00, // Listen Interval + 0x00, 0x09, // SSID + 'W', 'D', 'I', '_', 'a', 'd', 'P', 'S', 'K', // WDI_adPSK + 0x01, 0x08, // Supported Rates + 0x0C, 0x12, 0x96, 0x18, 0x24, 0x30, 0x48, 0x60, + + 0x30, 0x14, // RSN IE + 0x01, 0x00, // Version + 0x00, 0x0F, 0xAC, 0x08, // Group Cipher + 0x01, 0x00, // Pairwise Cipher Count + 0x00, 0x0F, 0xAC, 0x08, // Pairwise Cipher + 0x01, 0x00, // AKM Suite count + 0x00, 0x0F, 0xAC, 0x01, // AKM Suite + 0x00, 0x00, // RSN Capability + 0x94, 11, + 0x04, 0xCE, 0x14, 0x0A, 0x3B, 0x61, 0x01, 0x11, 0xD1, 0xB7, 0x06, 0x00, 0x00, 0x40, 0x00, 0x00, + 0x00, + 0xDD, 0x21, + 0x04, 0xCE, 0x14, 0x05, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x02, 0x00, 0x00, 0x00, 0x06, 0x00, 0x02, 0x00, 0x05, + 0x00, + + // WDI_TLV_ASSOCIATION_RESPONSE_FRAME + 0x2F, 0x00, + 0x47, 0x00, + 0x17, 0x00, // Capabilities + 0x00, 0x00, // Status code + 0x02, 0x00, // Association ID + 0x00, 0x09, // SSID + 'W', 'D', 'I', '_', 'a', 'd', 'P', 'S', 'K', // WDI_adPSK + 0x94, 0x11, // DMG Capabilities + 0x04, 0xCE, 0x14, 0x07, 0x34, 0x6B, // STA address + 0x03, // AID + 0x11, 0xD1, 0xB7, 0x06, 0x00, 0x00, 0x40, 0x00, // DOT11_DMG_STA_CAPABILITY_INFO + 0x00, 0x00, // DOT11_DMG_PCP_AP_CAPABILITY_INFO + 0xDD, 0x21, + 0x04, 0xCE, 0x14, 0x05, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x02, 0x00, 0x00, 0x00, 0x06, 0x00, 0x02, 0x00, 0x05, + 0x00, + + // WDI_TLV_BEACON_PROBE_RESPONSE + 0x30, 0x00, + 0x98, 0x00, + 0x38, 0xE3, 0x3B, 0x64, 0x11, 0x00, 0x00, 0x00, // TimeStamp + 0x64, 0x00, // Beacon Interval + 0x31, 0x04, // Capability + 0x00, 0x09, // SSID + 'W', 'D', 'I', '_', 'a', 'd', 'P', 'S', 'K', // WDI_adPSK + 0x03, 0x01, // DSS Parameters + 0x02, + 0x30, 0x14, // RSN IE + 0x01, 0x00, // Version + 0x00, 0x0F, 0xAC, 0x08, // Group Cipher + 0x01, 0x00, // Pairwise Cipher Count + 0x00, 0x0F, 0xAC, 0x08, // Pairwise Cipher + 0x01, 0x00, // AKM Suite count + 0x00, 0x0F, 0xAC, 0x01, // AKM Suite + 0x00, 0x00, // RSN Capability + 0x7F, 0x04, + 0x00, 0x00, 0x00, 0x02, + 0x94, 0x11, + 0x04, 0xCE, 0x14, 0x07, 0x34, 0x6B, 0x01, 0x11, 0xD1, 0xB7, 0x06, 0x00, 0x00, 0x40, 0x00, 0x00, + 0x00, + 0x97, 0x0A, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, + 0xBE, 0x04, + 0x00, 0x00, 0x00, 0x00, + 0xDD, 0x18, + 0x00, 0x50, 0xF2, 0x02, 0x01, 0x01, 0x00, 0x00, 0x03, 0xA4, 0x00, 0x00, 0x27, 0xA4, 0x00, 0x00, + 0x42, 0x43, 0x5E, 0x00, 0x62, 0x32, 0x2F, 0x00, + 0xDD, 0x21, + 0x04, 0xCE, 0x14, 0x05, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x02, 0x00, 0x00, 0x00, 0x06, 0x00, 0x02, 0x00, 0x05, + 0x00, + + // WDI_TLV_PHY_TYPE_LIST + 0x19, 0x00, + 0x04, 0x00, + 0x09, 0x00, 0x00, 0x00 +}; + + +//=============================================================================== + +WDI_MAC_ADDRESS s_Connect_Addr_11_11ad_Open = {0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xEB}; + +UCHAR s_TLV_BSS_Entry_11_11ad_Beacon_Open [] = +{ + // WDI_TLV_BSS_ENTRY + 0x08, 0x00, //Type + 0x3F, 0x00, + + // WDI_TLV_BSSID + 0x02, 0x00, + 0x06, 0x00, + 0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xEB, + + // WDI_TLV_BEACON_FRAME (8.3.3.2, Table 8-33a) + 0x0A, 0x00, + 0x0C, 0x00, // For WiFi Beacon + // WiFi Beacon + 0x38, 0xE3, 0x3B, 0x64, 0x11, 0x00, 0x00, 0x00, // TimeStamp (9.4.1.10) + 0x64, 0x00, // Beacon Interval (8.4.1.3) + 0x05, 0x00, // Capability + + // WDI_TLV_BSS_ENTRY_SIGNAL_INFO + 0x0b, 0x00, + 0x08, 0x00, + 0xC1, 0xFF, 0xFF, 0xFF, // RSSI + 0x64, 0x00, 0x00, 0x00, // Link Quality + + // WDI_TLV_BSS_ENTRY_DEVICE_CONTEXT + 0x0d, 0x00, + 0x09, 0x00, + 0x04, 0x05, 0x06, 0x07, 0x04, 0x05, 0x06, 0x07, 0x00, + + // WDI_TLV_BSS_ENTRY_CHANNEL_INFO + 0x3a, 0x00, + 0x08, 0x00, + 0x01, 0x00, 0x00, 0x00, // Channel + 0x03, 0x00, 0x00, 0x00 // BandId +}; + +UCHAR s_TLV_BSS_Entry_11_11ad_Beacon_Dmg_Open [] = +{ + // WDI_TLV_BSS_ENTRY + 0x08, 0x00, //Type + 0x47, 0x00, + + // WDI_TLV_BSSID + 0x02, 0x00, + 0x06, 0x00, + 0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xEB, + + // WDI_TLV_BEACON_FRAME (8.3.3.2, Table 8-33a) + 0x0A, 0x00, + 0x05, 0x00, // For WiFi Beacon + // DMG Beacon + 0x38, 0xE3, 0x3B, 0x64, 0x11, 0x00, 0x00, 0x00, // TimeStamp (9.4.1.10) + 0x00, 0x0c, 0x38, // 3 - Sector Sweep (9.5.1) + 0x64, 0x00, // 2 - Beacon Interval (9.4.1.3) + 0xc0, 0x7c, 0x18, 0x08, 0x20, 0x18, // 6 - Beacon Interval Control (Fig 9-60) + 0x07, // 1 - DMG Parameters (9.4.1.47) + + // WDI_TLV_BSS_ENTRY_SIGNAL_INFO + 0x0b, 0x00, + 0x08, 0x00, + 0xC1, 0xFF, 0xFF, 0xFF, // RSSI + 0x64, 0x00, 0x00, 0x00, // Link Quality + + // WDI_TLV_BSS_ENTRY_DEVICE_CONTEXT + 0x0d, 0x00, + 0x09, 0x00, + 0x04, 0x05, 0x06, 0x07, 0x04, 0x05, 0x06, 0x07, 0x00, + + // WDI_TLV_BSS_ENTRY_CHANNEL_INFO + 0x3a, 0x00, + 0x08, 0x00, + 0x01, 0x00, 0x00, 0x00, // Channel + 0x03, 0x00, 0x00, 0x00 // BandId +}; + +UCHAR s_TLV_BSS_Entry_11_11ad_ProbeResponse_Open [] = +{ + // WDI_TLV_BSS_ENTRY + 0x08, 0x00, //Type + 0xC9, 0x00, + + // WDI_TLV_BSSID + 0x02, 0x00, + 0x06, 0x00, + 0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xEB, + + // WDI_TLV_PROBE_RESPONSE_FRAME (8.3.3.2, Table 8-33a) + 0x09, 0x00, + 0x96, 0x00, // For WiFi Beacon + // WiFi Beacon + 0x38, 0xE3, 0x3B, 0x64, 0x11, 0x00, 0x00, 0x00, // TimeStamp (9.4.1.10) + 0x64, 0x00, // Beacon Interval (8.4.1.3) + 0x05, 0x00, // Capability + + 0x00, 0x09, // SSID + 'W', 'D', 'I', '_', 'a', 'd', '_', 'O', 'N', // WDI_ad_ON + 0x03, 0x01, // DSS Parameters + 0x02, + 0x7F, 0x04, + 0x00, 0x00, 0x00, 0x02, + 0x94, 0x11, + 0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xEB, // STA address + 0x00, // AID + 0x01, 0xD2, 0xB7, 0x06, 0x00, 0x00, 0x40, 0x10, // DOT11_DMG_STA_CAPABILITY_INFO + 0x00, 0x00, // DOT11_DMG_PCP_AP_CAPABILITY_INFO + 0x97, 0x0A, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, + 0xBE, 0x04, + 0x00, 0x00, 0x00, 0x00, + 0x0C, 0x12, + 0x00, 0x00, 0x03, 0xA4, 0x28, 0x00, 0x27, 0xA4, 0x00, 0x00, 0x42, 0x43, 0x40, 0x00, 0x62, 0x32, + 0x10, 0x00, + 0x2E, 0x01, + 0x28, + 0xDD, 0x27, + 0x04, 0xCE, 0x14, 0x05, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x10, 0x00, 0x03, 0x00, 0x02, 0x00, 0x00, 0x00, 0x06, 0x00, 0x02, 0x00, 0x05, + 0x00, 0x07, 0x00, 0x02, 0x00, 0x01, 0x00, + 0xDD, 0x0F, + 0x50, 0x6F, 0x9A, 0x17, 0x01, 0x09, 0x00, 0x07, 0x04, 0xCE, 0x14, 0x07, 0xA3, 0x66, 0x00, + + + // WDI_TLV_BSS_ENTRY_SIGNAL_INFO + 0x0b, 0x00, + 0x08, 0x00, + 0xC1, 0xFF, 0xFF, 0xFF, // RSSI + 0x64, 0x00, 0x00, 0x00, // Link Quality + + // WDI_TLV_BSS_ENTRY_DEVICE_CONTEXT + 0x0d, 0x00, + 0x09, 0x00, + 0x04, 0x05, 0x06, 0x07, 0x04, 0x05, 0x06, 0x07, 0x00, + + // WDI_TLV_BSS_ENTRY_CHANNEL_INFO + 0x3a, 0x00, + 0x08, 0x00, + 0x01, 0x00, 0x00, 0x00, // Channel + 0x03, 0x00, 0x00, 0x00 // BandId +}; + +UCHAR s_TLV_BSS_Entry_11_11ad_ProbeResponse_Dmg_Open [] = +{ + // WDI_TLV_BSS_ENTRY + 0x08, 0x00, //Type + 0xC9, 0x00, + + // WDI_TLV_BSSID + 0x02, 0x00, + 0x06, 0x00, + 0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xEB, + + // WDI_TLV_PROBE_RESPONSE_FRAME (8.3.3.2, Table 8-33a) + 0x09, 0x00, + 0x96, 0x00, // For WiFi Beacon + // WiFi Beacon + 0x38, 0xE3, 0x3B, 0x64, 0x11, 0x00, 0x00, 0x00, // TimeStamp (9.4.1.10) + 0x64, 0x00, // Beacon Interval (8.4.1.3) + 0x05, 0x00, // Capability + + 0x00, 0x09, // SSID + 'W', 'D', 'I', '_', 'a', 'd', '_', 'O', 'N', // WDI_ad_ON + 0x03, 0x01, // DSS Parameters + 0x02, + 0x7F, 0x04, + 0x00, 0x00, 0x00, 0x02, + 0x94, 0x11, + 0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xEB, // STA address + 0x00, // AID + 0x01, 0xD2, 0xB7, 0x06, 0x00, 0x00, 0x40, 0x10, // DOT11_DMG_STA_CAPABILITY_INFO + 0x00, 0x00, // DOT11_DMG_PCP_AP_CAPABILITY_INFO + 0x97, 0x0A, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, + 0xBE, 0x04, + 0x00, 0x00, 0x00, 0x00, + 0x0C, 0x12, + 0x00, 0x00, 0x03, 0xA4, 0x28, 0x00, 0x27, 0xA4, 0x00, 0x00, 0x42, 0x43, 0x40, 0x00, 0x62, 0x32, + 0x10, 0x00, + 0x2E, 0x01, + 0x28, + 0xDD, 0x27, + 0x04, 0xCE, 0x14, 0x05, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x10, 0x00, 0x03, 0x00, 0x02, 0x00, 0x00, 0x00, 0x06, 0x00, 0x02, 0x00, 0x05, + 0x00, 0x07, 0x00, 0x02, 0x00, 0x01, 0x00, + 0xDD, 0x0F, + 0x50, 0x6F, 0x9A, 0x17, 0x01, 0x09, 0x00, 0x07, 0x04, 0xCE, 0x14, 0x07, 0xA3, 0x66, 0x00, + + + // WDI_TLV_BSS_ENTRY_SIGNAL_INFO + 0x0b, 0x00, + 0x08, 0x00, + 0xC1, 0xFF, 0xFF, 0xFF, // RSSI + 0x64, 0x00, 0x00, 0x00, // Link Quality + + // WDI_TLV_BSS_ENTRY_DEVICE_CONTEXT + 0x0d, 0x00, + 0x09, 0x00, + 0x04, 0x05, 0x06, 0x07, 0x04, 0x05, 0x06, 0x07, 0x00, + + // WDI_TLV_BSS_ENTRY_CHANNEL_INFO + 0x3a, 0x00, + 0x08, 0x00, + 0x01, 0x00, 0x00, 0x00, // Channel + 0x03, 0x00, 0x00, 0x00 // BandId +}; + +UCHAR s_TLV_Success_AssociationResult_11_11ad_Open [] = +{ + // WDI_TLV_ASSOCIATION_RESULT + 0x35, 0x00, + 0x71, 0x01, + + // WDI_TLV_BSSID + 0x02, 0x00, + 0x06, 0x00, + 0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xEB, + + // WDI_TLV_ASSOCIATION_RESULT_PARAMETERS + 0x2D, 0x00, + 0x30, 0x00, + 0x00, 0x00, 0x00, 0x00, //Association Status + 0x00, 0x00, 0x00, 0x00, //Status Code + 0x00, //ReAssociationRequest + 0x01, 0x00, 0x00, 0x00, //AuthAlgorithm -- RSNA_PSK + 0x00, 0x00, 0x00, 0x00, //UnicastCipherAlgorithm + 0x00, 0x00, 0x00, 0x00, //MulticastDataCipherAlgorithm + 0x00, 0x00, 0x00, 0x00, //MulticastMgmtCipherAlgorithm + 0x00, //FourAddressSupported + 0x00, //Port Authorized + 0x00, // WMM QoS Enabled + 0x03, 0x00, 0x00, 0x00, //DSInfo + 0x00, 0x00, 0x00, 0x00, //AssociationComebackTime + 0x03, 0x00, 0x00, 0x00, // Band ID + 0x00, 0x00, 0x00, 0x00, // IHV Association Status + 0x00, 0x00, 0x00, 0x00, //DisableDataPathOffloadsScenario + + // WDI_TLV_ASSOCIATION_REQUEST_FRAME + 0x2E, 0x00, + 0x36, 0x00, + 0x05, 0x00, // Capabilities + 0x01, 0x00, // Listen Interval + 0x00, 0x09, // SSID + 'W', 'D', 'I', '_', 'a', 'd', '_', 'O', 'N', // WDI_ad_ON + 0x2E, 0x01, + 0x08, + 0x94, 11, + 0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xEB, // STA address + 0x00, // AID + 0x11, 0xD1, 0xB7, 0x06, 0x00, 0x00, 0x40, 0x10, // DOT11_DMG_STA_CAPABILITY_INFO + 0x00, 0x00, // DOT11_DMG_PCP_AP_CAPABILITY_INFO + 0xDD, 0x0F, + 0x50, 0x6F, 0x9A, 0x17, 0x01, 0x09, 0x00, 0x07, 0x04, 0xCE, 0x14, 0x07, 0x49, 0x2D, 0x00, + + // WDI_TLV_ASSOCIATION_RESPONSE_FRAME + 0x2F, 0x00, + 0x53, 0x00, + 0x07, 0x00, // Capabilities + 0x00, 0x00, // Status code + 0x02, 0x00, // Association ID + 0x7F, 0x04, + 0x00, 0x00, 0x00, 0x02, + 0x94, 0x11, // DMG Capabilities + 0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xEB, // STA address + 0x02, // AID + 0x01, 0xD2, 0xB7, 0x06, 0x00, 0x00, 0x40, 0x10, // DOT11_DMG_STA_CAPABILITY_INFO + 0x00, 0x00, // DOT11_DMG_PCP_AP_CAPABILITY_INFO + 0x97, 0x0A, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, + 0x0C, 0x12, + 0x00, 0x00, 0x03, 0xA4, 0x28, 0x00, 0x27, 0xA4, 0x00, 0x00, 0x42, 0x43, 0x40, 0x00, 0x62, 0x32, + 0x10, 0x00, + 0x2E, 0x01, + 0x2C, + 0xDD, 0x0F, + 0x50, 0x6F, 0x9A, 0x17, 0x01, 0x09, 0x00, 0x07, 0x04, 0xCE, 0x14, 0x07, 0xA3, 0x66, 0x00, + + // WDI_TLV_BEACON_PROBE_RESPONSE + 0x30, 0x00, + 0x96, 0x00, // For WiFi Beacon + // WiFi Beacon + 0x38, 0xE3, 0x3B, 0x64, 0x11, 0x00, 0x00, 0x00, // TimeStamp (9.4.1.10) + 0x64, 0x00, // Beacon Interval (8.4.1.3) + 0x05, 0x00, // Capability + + 0x00, 0x09, // SSID + 'W', 'D', 'I', '_', 'a', 'd', '_', 'O', 'N', // WDI_ad_ON + 0x03, 0x01, // DSS Parameters + 0x02, + 0x7F, 0x04, + 0x00, 0x00, 0x00, 0x02, + 0x94, 0x11, + 0x04, 0xCE, 0x14, 0x07, 0xA3, 0x66, 0x00, 0x01, 0xD2, 0xB7, 0x06, 0x00, 0x00, 0x40, 0x10, 0x00, + 0x00, + 0x97, 0x0A, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, + 0xBE, 0x04, + 0x00, 0x00, 0x00, 0x00, + 0x0C, 0x12, + 0x00, 0x00, 0x03, 0xA4, 0x28, 0x00, 0x27, 0xA4, 0x00, 0x00, 0x42, 0x43, 0x40, 0x00, 0x62, 0x32, + 0x10, 0x00, + 0x2E, 0x01, + 0x28, + 0xDD, 0x27, + 0x04, 0xCE, 0x14, 0x05, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x10, 0x00, 0x03, 0x00, 0x02, 0x00, 0x00, 0x00, 0x06, 0x00, 0x02, 0x00, 0x05, + 0x00, 0x07, 0x00, 0x02, 0x00, 0x01, 0x00, + 0xDD, 0x0F, + 0x50, 0x6F, 0x9A, 0x17, 0x01, 0x09, 0x00, 0x07, 0x04, 0xCE, 0x14, 0x07, 0xA3, 0x66, 0x00, + + // WDI_TLV_PHY_TYPE_LIST + 0x19, 0x00, + 0x04, 0x00, + 0x09, 0x00, 0x00, 0x00 +}; + + +UCHAR s_TLV_Success_AssociationResult_11_11ad_Dmg_Open [] = +{ + // WDI_TLV_ASSOCIATION_RESULT + 0x35, 0x00, + 0x71, 0x01, + + // WDI_TLV_BSSID + 0x02, 0x00, + 0x06, 0x00, + 0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xEB, + + // WDI_TLV_ASSOCIATION_RESULT_PARAMETERS + 0x2D, 0x00, + 0x30, 0x00, + 0x00, 0x00, 0x00, 0x00, //Association Status + 0x00, 0x00, 0x00, 0x00, //Status Code + 0x00, //ReAssociationRequest + 0x01, 0x00, 0x00, 0x00, //AuthAlgorithm -- RSNA_PSK + 0x00, 0x00, 0x00, 0x00, //UnicastCipherAlgorithm + 0x00, 0x00, 0x00, 0x00, //MulticastDataCipherAlgorithm + 0x00, 0x00, 0x00, 0x00, //MulticastMgmtCipherAlgorithm + 0x00, //FourAddressSupported + 0x00, //Port Authorized + 0x00, // WMM QoS Enabled + 0x03, 0x00, 0x00, 0x00, //DSInfo + 0x00, 0x00, 0x00, 0x00, //AssociationComebackTime + 0x03, 0x00, 0x00, 0x00, // Band ID + 0x00, 0x00, 0x00, 0x00, // IHV Association Status + 0x00, 0x00, 0x00, 0x00, //DisableDataPathOffloadsScenario + + // WDI_TLV_ASSOCIATION_REQUEST_FRAME + 0x2E, 0x00, + 0x36, 0x00, + 0x05, 0x00, // Capabilities + 0x01, 0x00, // Listen Interval + 0x00, 0x09, // SSID + 'W', 'D', 'I', '_', 'a', 'd', '_', 'O', 'N', // WDI_ad_ON + 0x2E, 0x01, + 0x08, + 0x94, 11, + 0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xEB, // STA address + 0x00, // AID + 0x11, 0xD1, 0xB7, 0x06, 0x00, 0x00, 0x40, 0x10, // DOT11_DMG_STA_CAPABILITY_INFO + 0x00, 0x00, // DOT11_DMG_PCP_AP_CAPABILITY_INFO + 0xDD, 0x0F, + 0x50, 0x6F, 0x9A, 0x17, 0x01, 0x09, 0x00, 0x07, 0x04, 0xCE, 0x14, 0x07, 0x49, 0x2D, 0x00, + + // WDI_TLV_ASSOCIATION_RESPONSE_FRAME + 0x2F, 0x00, + 0x53, 0x00, + 0x07, 0x00, // Capabilities + 0x00, 0x00, // Status code + 0x02, 0x00, // Association ID + 0x7F, 0x04, + 0x00, 0x00, 0x00, 0x02, + 0x94, 0x11, // DMG Capabilities + 0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xEB, // STA address + 0x02, // AID + 0x01, 0xD2, 0xB7, 0x06, 0x00, 0x00, 0x40, 0x10, // DOT11_DMG_STA_CAPABILITY_INFO + 0x00, 0x00, // DOT11_DMG_PCP_AP_CAPABILITY_INFO + 0x97, 0x0A, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, + 0x0C, 0x12, + 0x00, 0x00, 0x03, 0xA4, 0x28, 0x00, 0x27, 0xA4, 0x00, 0x00, 0x42, 0x43, 0x40, 0x00, 0x62, 0x32, + 0x10, 0x00, + 0x2E, 0x01, + 0x2C, + 0xDD, 0x0F, + 0x50, 0x6F, 0x9A, 0x17, 0x01, 0x09, 0x00, 0x07, 0x04, 0xCE, 0x14, 0x07, 0xA3, 0x66, 0x00, + + // WDI_TLV_BEACON_PROBE_RESPONSE + 0x30, 0x00, + 0x96, 0x00, // For WiFi Beacon + // WiFi Beacon + 0x38, 0xE3, 0x3B, 0x64, 0x11, 0x00, 0x00, 0x00, // TimeStamp (9.4.1.10) + 0x64, 0x00, // Beacon Interval (8.4.1.3) + 0x05, 0x00, // Capability + + 0x00, 0x09, // SSID + 'W', 'D', 'I', '_', 'a', 'd', '_', 'O', 'N', // WDI_ad_ON + 0x03, 0x01, // DSS Parameters + 0x02, + 0x7F, 0x04, + 0x00, 0x00, 0x00, 0x02, + 0x94, 0x11, + 0x04, 0xCE, 0x14, 0x07, 0xA3, 0x66, 0x00, 0x01, 0xD2, 0xB7, 0x06, 0x00, 0x00, 0x40, 0x10, 0x00, + 0x00, + 0x97, 0x0A, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, + 0xBE, 0x04, + 0x00, 0x00, 0x00, 0x00, + 0x0C, 0x12, + 0x00, 0x00, 0x03, 0xA4, 0x28, 0x00, 0x27, 0xA4, 0x00, 0x00, 0x42, 0x43, 0x40, 0x00, 0x62, 0x32, + 0x10, 0x00, + 0x2E, 0x01, + 0x28, + 0xDD, 0x27, + 0x04, 0xCE, 0x14, 0x05, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x10, 0x00, 0x03, 0x00, 0x02, 0x00, 0x00, 0x00, 0x06, 0x00, 0x02, 0x00, 0x05, + 0x00, 0x07, 0x00, 0x02, 0x00, 0x01, 0x00, + 0xDD, 0x0F, + 0x50, 0x6F, 0x9A, 0x17, 0x01, 0x09, 0x00, 0x07, 0x04, 0xCE, 0x14, 0x07, 0xA3, 0x66, 0x00, + + // WDI_TLV_PHY_TYPE_LIST + 0x19, 0x00, + 0x04, 0x00, + 0x09, 0x00, 0x00, 0x00 +}; + + +//=============================================================================== +// +// 11ax +// +//=============================================================================== + +// +// Open on 2.4 GHz +// +WDI_MAC_ADDRESS s_Connect_Addr_12_11ax_24_Open = {0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xEC}; + + +UCHAR s_TLV_BSS_Entry_12_11ax_24_Open [] = +{ + // WDI_TLV_BSS_ENTRY + 0x08, 0x00, //Type + 0x78, 0x00, //Len + + // WDI_TLV_BSSID + 0x02, 0x00, // Type + 0x06, 0x00, // Length + 0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xEC, + + // WDI_TLV_PROBE_RESPONSE_FRAME + 0x09, 0x00, // Type + 0x4A, 0x00, // Length + 0x00, 0x11, 0x22, 0x33, 0x00, 0x00, 0x00, 0x00, // Timestamp + 0x64, 0x00, // Beacon Interval + 0x00, 0x04, // Capability + 0x00, 0x11, // SSID + 'W', 'D', 'I', '_', 'O', 'P', 'E', 'N', '_', '1', '1', 'a', 'x', '.', '2', '.', '4', + 0x01, 0x04, + 0x02, 0x04, 0x0B, 0x16, // Supported Rates + 0x03, 0x01, + 0x01, // DSSS Parameter + 0x05, 0x04, + 0x00, 0x01, 0x00, 0x00, // TIM + 0x46, 0x05, + 0x02, 0x00, 0x00, 0x00, 0x00, // RM Enabled Capabilities + 0xFF, 0x13, // Extension IE + 0x23, // HE Capabilities + 0x00, 0x00, 0x00, 0x00, 0x00, // MAC Capabilities + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // PHY Capabilities + 0x00, + 0x00, 0x00, 0x00, 0x00, // HE-MCS and NSS + + // WDI_TLV_BSS_ENTRY_DEVICE_CONTEXT + 0x0d, 0x00, + 0x04, 0x00, + 0x04, 0x05, 0x06, 0x07, + + // 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, + 0x06, 0x00, 0x00, 0x00, // Channel + 0x01, 0x00, 0x00, 0x00 // Band ID +}; + +UCHAR s_TLV_Success_AssociationResult_12_11ax_24_Open [] = +{ + // WDI_TLV_ASSOCIATION_RESULT + 0x35, 0x00, + 0x28, 0x01, + + // WDI_TLV_BSSID + 0x02, 0x00, + 0x06, 0x00, + 0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xEC, + + // WDI_TLV_ASSOCIATION_RESULT_PARAMETERS + 0x2D, 0x00, + 0x30, 0x00, + 0x00, 0x00, 0x00, 0x00, //Association Status + 0x00, 0x00, 0x00, 0x00, //Status Code + 0x00, //ReAssociationRequest + 0x01, 0x00, 0x00, 0x00, //AuthAlgorithm + 0x00, 0x00, 0x00, 0x00, //UnicastCipherAlgorithm + 0x00, 0x00, 0x00, 0x00, //MulticastDataCipherAlgorithm + 0x00, 0x00, 0x00, 0x00, //MulticastMgmtCipherAlgorithm + 0x00, //FourAddressSupported + 0x00, //Port Authorized + 0x00, // WMM QoS Enabled + 0x00, 0x00, 0x00, 0x00, //DSInfo + 0x00, 0x00, 0x00, 0x00, //AssociationComebackTime + 0x01, 0x00, 0x00, 0x00, // Band ID + 0x00, 0x00, 0x00, 0x00, // IHV Association Status + 0x00, 0x00, 0x00, 0x00, //DisableDataPathOffloadsScenario + + // WDI_TLV_ASSOCIATION_REQUEST_FRAME + 0x2E, 0x00, + 0x4E, 0x00, + 0x21, 0x04, // Capabilities + 0x0A, 0x00, // Listen Interval + 0x00, 0x11, // SSID + 'W', 'D', 'I', '_', 'O', 'P', 'E', 'N', '_', '1', '1', 'a', 'x', '.', '2', '.', '4', + 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, 0x13, // Extension IE + 0x23, // HE Capabilities + 0x00, 0x00, 0x00, 0x00, 0x00, // MAC Capabilities + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // PHY Capabilities + 0x00, + 0x00, 0x00, 0x00, 0x00, // HE-MCS and NSS + + + // WDI_TLV_ASSOCIATION_RESPONSE_FRAME + 0x2F, 0x00, + 0x45, 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, 0x13, // Extension IE + 0x23, // HE Capabilities + 0x00, 0x00, 0x00, 0x00, 0x00, // MAC Capabilities + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // PHY Capabilities + 0x00, + 0x00, 0x00, 0x00, 0x00, // HE-MCS and NSS + + + // WDI_TLV_BEACON_PROBE_RESPONSE + 0x30, 0x00, // Type + 0x43, 0x00, // Length + 0x00, 0x11, 0x22, 0x33, 0x00, 0x00, 0x00, 0x00, // Timestamp + 0x64, 0x00, // Beacon Interval + 0x00, 0x04, // Capability + 0x00, 0x11, // SSID + 'W', 'D', 'I', '_', 'O', 'P', 'E', 'N', '_', '1', '1', 'a', 'x', '.', '2', '.', '4', + 0x01, 0x04, + 0x02, 0x04, 0x0B, 0x16, // Supported Rates + 0x03, 0x01, + 0x01, // DSSS Parameter + 0x05, 0x04, + 0x00, 0x01, 0x00, 0x00, // TIM + 0xFF, 0x13, // Extension IE + 0x23, // HE Capabilities + 0x00, 0x00, 0x00, 0x00, 0x00, // MAC Capabilities + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // PHY Capabilities + 0x00, + 0x00, 0x00, 0x00, 0x00, // HE-MCS and NSS + + // WDI_TLV_PHY_TYPE_LIST + 0x19, 0x00, + 0x04, 0x00, + 0x0A, 0x00, 0x00, 0x00, + +}; + + +//=============================================================================== + +// +// Open on 5 GHz +// +WDI_MAC_ADDRESS s_Connect_Addr_13_11ax_5_Open = {0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xED}; + + +UCHAR s_TLV_BSS_Entry_13_11ax_5_Open [] = +{ + // WDI_TLV_BSS_ENTRY + 0x08, 0x00, //Type + 0x76, 0x00, //Len + + // WDI_TLV_BSSID + 0x02, 0x00, // Type + 0x06, 0x00, // Length + 0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xED, + + // WDI_TLV_PROBE_RESPONSE_FRAME + 0x09, 0x00, // Type + 0x48, 0x00, // Length + 0x00, 0x11, 0x22, 0x33, 0x00, 0x00, 0x00, 0x00, // Timestamp + 0x64, 0x00, // Beacon Interval + 0x00, 0x04, // Capability + 0x00, 0x0F, // SSID + 'W', 'D', 'I', '_', 'O', 'P', 'E', 'N', '_', '1', '1', 'a', 'x', '.', '5', + 0x01, 0x04, + 0x02, 0x04, 0x0B, 0x16, // Supported Rates + 0x03, 0x01, + 0x01, // DSSS Parameter + 0x05, 0x04, + 0x00, 0x01, 0x00, 0x00, // TIM + 0x46, 0x05, + 0x02, 0x00, 0x00, 0x00, 0x00, // RM Enabled Capabilities + 0xFF, 0x13, // Extension IE + 0x23, // HE Capabilities + 0x00, 0x00, 0x00, 0x00, 0x00, // MAC Capabilities + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // PHY Capabilities + 0x00, + 0x00, 0x00, 0x00, 0x00, // HE-MCS and NSS + + // WDI_TLV_BSS_ENTRY_DEVICE_CONTEXT + 0x0d, 0x00, + 0x04, 0x00, + 0x04, 0x05, 0x06, 0x07, + + // 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, + 0x24, 0x00, 0x00, 0x00, // Channel 36 + 0x02, 0x00, 0x00, 0x00 // Band ID +}; + +UCHAR s_TLV_Success_AssociationResult_13_11ax_5_Open [] = +{ + // WDI_TLV_ASSOCIATION_RESULT + 0x35, 0x00, + 0x0F, 0x01, + + // WDI_TLV_BSSID + 0x02, 0x00, + 0x06, 0x00, + 0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xED, + + // WDI_TLV_ASSOCIATION_RESULT_PARAMETERS + 0x2D, 0x00, + 0x30, 0x00, + 0x00, 0x00, 0x00, 0x00, //Association Status + 0x00, 0x00, 0x00, 0x00, //Status Code + 0x00, //ReAssociationRequest + 0x01, 0x00, 0x00, 0x00, //AuthAlgorithm + 0x00, 0x00, 0x00, 0x00, //UnicastCipherAlgorithm + 0x00, 0x00, 0x00, 0x00, //MulticastDataCipherAlgorithm + 0x00, 0x00, 0x00, 0x00, //MulticastMgmtCipherAlgorithm + 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, + 0x4C, 0x00, + 0x21, 0x04, // Capabilities + 0x0A, 0x00, // Listen Interval + 0x00, 0xF, // SSID + 'W', 'D', 'I', '_', 'O', 'P', 'E', 'N', '_', '1', '1', 'a', 'x', '.', '5', + 0x01, 0x08, + 0x82, 0x84, 0x8B, 0x96, 0x24, 0x30, 0x48, 0x6C, // Rates + 0x21, 0x02, + 0x07, 0x12, //Power Capability + 0x24, 0x02, + 0x24, 0x30, //Supported Channels + 0x32, 0x04, + 0x0C, 0x12, 0x18, 0x60, //Extended Rates + 0xDD, 0x08, + 0x00, 0x50, 0xF2, 0x02, 0x00, 0x01, 0x00, 0x03, // WMM settings + 0xFF, 0x13, // Extension IE + 0x23, // HE Capabilities + 0x00, 0x00, 0x00, 0x00, 0x00, // MAC Capabilities + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // PHY Capabilities + 0x00, + 0x00, 0x00, 0x00, 0x00, // HE-MCS and NSS + + // WDI_TLV_ASSOCIATION_RESPONSE_FRAME + 0x2F, 0x00, + 0x45, 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, 0x13, // Extension IE + 0x23, // HE Capabilities + 0x00, 0x00, 0x00, 0x00, 0x00, // MAC Capabilities + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // PHY Capabilities + 0x00, + 0x00, 0x00, 0x00, 0x00, // HE-MCS and NSS + + // WDI_TLV_BEACON_PROBE_RESPONSE + 0x30, 0x00, // Type + 0x2C, 0x00, // Length + 0x00, 0x11, 0x22, 0x33, 0x00, 0x00, 0x00, 0x00, // Timestamp + 0x64, 0x00, // Beacon Interval + 0x00, 0x04, // Capability + 0x00, 0xF, // SSID + 'W', 'D', 'I', '_', 'O', 'P', 'E', 'N', '_', '1', '1', 'a', 'x', '.', '5', + 0x01, 0x04, + 0x02, 0x04, 0x0B, 0x16, // Supported Rates + 0x03, 0x01, + 0x01, // DSSS Parameter + 0x05, 0x04, + 0x00, 0x01, 0x00, 0x00, // TIM + + // WDI_TLV_PHY_TYPE_LIST + 0x19, 0x00, + 0x04, 0x00, + 0x0A, 0x00, 0x00, 0x00, + +}; + +// +//=============================================================================== +// + +// #define SAE_MIXED_MODE 1 + +WDI_MAC_ADDRESS s_Connect_Addr_14_WPA3_SAE_CCMP = { 0x34, 0x13, 0xe8, 0xbc, 0x4d, 0x32 }; + +UCHAR s_TLV_BSS_Entry_14_WPA3_SAE_CCMP [] = +{ + // WDI_TLV_BSS_ENTRY + 0x08, 0x00, //Type +#ifdef SAE_MIXED_MODE + 0x91, 0x00, //Len +#else + 0x8D, 0x00, //Len +#endif // SAE_MIXED_MODE + + // WDI_TLV_BSSID + 0x02, 0x00, // Type + 0x06, 0x00, // Length + 0x34, 0x13, 0xe8, 0xbc, 0x4d, 0x32, + + // WDI_TLV_BEACON_FRAME + 0x0a, 0x00, +#ifdef SAE_MIXED_MODE + 0x5E, 0x00, +#else + 0x5A, 0x00, +#endif // SAE_MIXED_MODE + + 0x22, 0x02, 0x2C, 0x01, 0x00, 0x00, 0x00, 0x00, // Timestamp + 0x64, 0x00, // Beacon Interval + 0x31, 0x04, // Capability + 0x00, 0x0C, // SSID + 'W', 'D', 'I', '_', 'W', 'P', 'A', '3', '-', 'S', 'A', 'E', + 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 +#ifdef SAE_MIXED_MODE + 0x30, 0x18, +#else + 0x30, 0x14, +#endif // SAE_MIXED_MODE + 0x01, 0x00, // Version + 0x00, 0x0F, 0xAC, 0x04, // Group Cipher + 0x01, 0x00, // Pairwise Cipher Count + 0x00, 0x0F, 0xAC, 0x04, // Pairwise Cipher +#ifdef SAE_MIXED_MODE + 0x02, 0x00, // AKM Suite Count + 0x00, 0x0F, 0xAC, 0x02, // AKM Suite - WPA2PSK + 0x00, 0x0F, 0xAC, 0x08, // AKM Suite - WPA3SAE + 0x80, 0x00, // RSN Capability - no MFPR or MFPC +#else + 0x01, 0x00, // AKM Suite Count + 0x00, 0x0F, 0xAC, 0x08, // AKM Suite - WPA3SAE + 0xC0, 0x00, // RSN Capability = MFP-Capable +#endif // SAE_MIXED_MODE + 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, + 0x0B, 0x00, 0x00, 0x00, // Channel + 0x01, 0x00, 0x00, 0x00 // BandId + +}; + +UCHAR s_TLV_Success_AssociationResult_14_WPA3_SAE_CCMP[] = +{ + // WDI_TLV_ASSOCIATION_RESULT + 0x35, 0x00, +#ifdef SAE_MIXED_MODE + 0x2A, 0x01, +#else + 0x26, 0x01, +#endif // SAE_MIXED_MODE + + // WDI_TLV_BSSID + 0x02, 0x00, + 0x06, 0x00, + 0x34, 0x13, 0xe8, 0xbc, 0x4d, 0x32, + + // WDI_TLV_ASSOCIATION_RESULT_PARAMETERS + 0x2D, 0x00, + 0x30, 0x00, + 0x00, 0x00, 0x00, 0x00, //Association Status + 0x00, 0x00, 0x00, 0x00, //Status Code + 0x00, //ReAssociationRequest + 0x07, 0x00, 0x00, 0x00, //AuthAlgorithm + 0x04, 0x00, 0x00, 0x00, //UnicastCipherAlgorithm + 0x04, 0x00, 0x00, 0x00, //MulticastDataCipherAlgorithm + 0x00, 0x00, 0x00, 0x00, //MulticastMgmtCipherAlgorithm + 0x00, //FourAddressSupported + 0x00, //Port Authorized + 0x00, // WMM QoS Enabled + 0x00, 0x00, 0x00, 0x00, //DSInfo + 0x00, 0x00, 0x00, 0x00, //AssociationComebackTime + 0x01, 0x00, 0x00, 0x00, // Band ID + 0x00, 0x00, 0x00, 0x00, // IHV Association Status + 0x00, 0x00, 0x00, 0x00, //DisableDataPathOffloadsScenario + + // WDI_TLV_ASSOCIATION_REQUEST_FRAME + 0x2E, 0x00, + 0x4A, 0x00, + 0x21, 0x04, // Capabilities + 0x0A, 0x00, // Listen Interval + 0x00, 0x0C, // SSID + 'W', 'D', 'I', '_', 'W', 'P', 'A', '3', '-', 'S', 'A', 'E', + 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 + 0x30, 0x14, + 0x01, 0x00, // Version + 0x00, 0x0F, 0xAC, 0x04, // Group Cipher + 0x01, 0x00, // Pairwise cipher count + 0x00, 0x0F, 0xAC, 0x04, // Pairwise Cipher + 0x01, 0x00, // AMK Suite Count + 0x00, 0x0F, 0xAC, 0x08, // AMK Suite - WPA3SAE + 0xC0, 0x00, // RSN Capability = MFP-Capable + MFP-Required + + + // WDI_TLV_ASSOCIATION_RESPONSE_FRAME + 0x2F, 0x00, + 0x30, 0x00, + 0x01, 0x04, //Capability + 0x00, 0x00, //Status + 0x01, 0xC0, //Association ID + 0x01, 0x08, // Rates + 0x82, 0x84, 0x8B, 0x96, 0x24, 0x30, 0x48, 0x6C, + 0x32, 0x04, // Extended Rates + 0x0C, 0x12, 0x18, 0x60, + 0xDD, 0x18, // WMM settings + 0x00, 0x50, 0xF2, 0x02, 0x01, 0x01, 0x80, 0x00, 0x03, 0xA4, 0x00, 0x00, 0x27, 0xA4, 0x00, 0x00, + 0x42, 0x43, 0x5E, 0x00, 0x62, 0x32, 0x2F, 0x00, + + + // WDI_TLV_BEACON_FRAME + 0x30, 0x00, +#ifdef SAE_MIXED_MODE + 0x5E, 0x00, +#else + 0x5A, 0x00, +#endif // SAE_MIXED_MODE + 0x22, 0x02, 0x2C, 0x01, 0x00, 0x00, 0x00, 0x00, // Timestamp + 0x64, 0x00, // Beacon Interval + 0x31, 0x04, // Capability + 0x00, 0x0C, // SSID + 'W', 'D', 'I', '_', 'W', 'P', 'A', '3', '-', 'S', 'A', 'E', + 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 +#ifdef SAE_MIXED_MODE + 0x30, 0x18, +#else + 0x30, 0x14, +#endif // SAE_MIXED_MODE + 0x01, 0x00, // Version + 0x00, 0x0F, 0xAC, 0x04, // Multicast Cipher + 0x01, 0x00, // Pairwise Cipher Count + 0x00, 0x0F, 0xAC, 0x04, // Pairwise Cipher +#ifdef SAE_MIXED_MODE + 0x02, 0x00, // AKM Suite Count + 0x00, 0x0F, 0xAC, 0x02, // AKM Suite - WPA2PSK + 0x00, 0x0F, 0xAC, 0x08, // AKM Suite - WPA3SAE + 0x80, 0x00, // RSN Cap = MFP-Capable +#else + 0x01, 0x00, // AKM Suite Count + 0x00, 0x0F, 0xAC, 0x08, // AKM Suite - WPA3SAE + 0xC0, 0x00, // RSN Cap = MFP-Capable + MFP required +#endif // SAE_MIXED_MODE + 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, + 0x0A, 0x00, 0x00, 0x00, + +}; + + +// +// SAE-Specific definitions :: Start +// +DWORD g_dwSaeResendConfirmRequested = 0; + +UCHAR pucSAECommitResponse [] = + { + 0x03, 0x00, // [1] usAlgorithmNumber = DOT11_AUTH_SAE (not-IE, 2 octets) + 0x01, 0x00, // [2] usXid: Commit=1, Confirm=2 (not-IE, 2 octets) + 0x00, 0x00, // [3] usStatusCode = 0 or 76 (ANTI_CLOGGING_TOKEN_REQUIRED) (not-IE, 2 octets) + 0x13, 0x00, // [10] FiniteCyclicGroup (not-IE, 2 octets) +// 0x00, 0x00, 0x00, 0x00, // [11] AntiCloggingToken (not-IE, variable octets) + // [13] AP Scalar + 0x93, 0x48, 0x89, 0xab, 0x38, 0x6b, 0x72, 0xd5, 0xff, 0x0d, 0x3c, 0xaa, 0x09, 0x56, 0x50, 0x20, + 0x2b, 0xd0, 0x3e, 0x26, 0x96, 0xb5, 0x90, 0x5f, 0x7b, 0x49, 0x5f, 0x3b, 0x7d, 0xc3, 0x5b, 0x48, + + // [14] AP Element + 0x58, 0x54, 0x5e, 0x6c, 0xa0, 0xe8, 0x86, 0xef, 0xfb, 0x05, 0x2a, 0xfb, 0x63, 0x2c, 0xa2, 0x19, + 0x5b, 0xb0, 0xb0, 0xa8, 0x25, 0xe5, 0x9d, 0xba, 0x6b, 0xaa, 0x0e, 0x93, 0xaf, 0x04, 0x6e, 0xf4, + 0xc9, 0x45, 0x5f, 0xec, 0x43, 0xfe, 0x5e, 0xb0, 0x2a, 0x6b, 0x8a, 0xbc, 0x8f, 0xd7, 0x07, 0x87, + 0x87, 0x3d, 0xd1, 0xd5, 0xd7, 0xfd, 0xe3, 0x07, 0x3a, 0x4c, 0xf3, 0xc2, 0xc7, 0x6f, 0x59, 0x5c, + }; +UCHAR pucSAECommitResponseReflection [] = + { + 0x03, 0x00, // [1] usAlgorithmNumber = DOT11_AUTH_SAE (not-IE, 2 octets) + 0x01, 0x00, // [2] usXid: Commit=1, Confirm=2 (not-IE, 2 octets) + 0x00, 0x00, // [3] usStatusCode = 0 or 76 (ANTI_CLOGGING_TOKEN_REQUIRED) (not-IE, 2 octets) + 0x13, 0x00, // [10] FiniteCyclicGroup (not-IE, 2 octets) +// 0x00, 0x00, 0x00, 0x00, // [11] AntiCloggingToken (not-IE, variable octets) + // [13] AP Scalar + + 0x49, 0x5c, 0x2c, 0xb4, 0x20, 0xec, 0xc9, 0xe8, 0xe8, 0x03, 0x2d, 0x00, 0x8d, 0xab, 0x4d, 0x91, + 0x70, 0x16, 0x06, 0x28, 0x40, 0x83, 0xb9, 0x8d, 0x19, 0xc6, 0x43, 0xcb, 0x63, 0x29, 0x9f, 0x03, + + // [14] AP Element + 0x13, 0x2e, 0xfc, 0x90, 0xb9, 0xd7, 0xb5, 0xc1, 0x2a, 0x1d, 0xe9, 0x05, 0x9c, 0xb3, 0xba, 0xc8, + 0xa6, 0x93, 0xff, 0xbf, 0x23, 0x02, 0x42, 0x3e, 0x58, 0xc2, 0x0d, 0x00, 0x10, 0xe8, 0x44, 0x60, + 0x9d, 0xfc, 0x34, 0x5e, 0x98, 0x8e, 0xf2, 0x12, 0x67, 0x24, 0xd0, 0x80, 0xfb, 0x2f, 0x1e, 0x7a, + 0xe6, 0x54, 0x01, 0x00, 0x50, 0xd4, 0xfe, 0x66, 0x47, 0x62, 0xc0, 0x3c, 0x9f, 0x7a, 0x10, 0x27, + }; + +UCHAR pucSAEConfirmResponse [] = + { + 0x03, 0x00, // [1] usAlgorithmNumber = DOT11_AUTH_SAE (not-IE, 2 octets) + 0x02, 0x00, // [2] usXid: Commit=1, Confirm=2 (not-IE, 2 octets) + 0x00, 0x00, // [3] usStatusCode = 0 or 76 (DOT11_FRAME_STATUS_ANTI_CLOGGING_TOKEN_REQUIRED) (not-Element, 2 octets) + 0x00, 0x00, // [12] SendConfirm (not-IE, 2 octets) + // [15] Confirm + 0xc7, 0xd1, 0x04, 0x94, 0x29, 0xec, 0xdf, 0x25, 0xda, 0xaa, 0x79, 0x6f, 0xda, 0xe9, 0x91, 0x9f, + 0x4b, 0x83, 0xad, 0xa3, 0x08, 0xde, 0x62, 0xca, 0xcd, 0x59, 0xfc, 0xf5, 0xc5, 0x4d, 0xeb, 0xd9, + }; + +UCHAR pucM1SaeFrame[] = +{ + // DOT11_MGMT_HEADER - DOT11_DATA_SHORT_HEADER + 0x88, 0x02, // Frame Control: Version = 0x0, Type = DOT11_FRAME_TYPE_DATA, Subtype = DOT11_DATA_SUBTYPE_DATA + 0x30, 0x00, // Duration + 0x9c, 0xda, 0x3e, 0xf2, 0x7d, 0xd5, // Address1: Receiver/Destination/STA address + 0x34, 0x13, 0xe8, 0xbc, 0x4d, 0x32, // Address2: Transmittor/Bssid address + 0x34, 0x13, 0xe8, 0xbc, 0x4d, 0x32, // Address3: Source address + 0x00, 0x00, 0x07, 0x00, // Sequence Control + // IEEE_8022_LLC_SNAP + 0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00, // NWF_802_LLC_SNAP + 0x88, 0x8e, // sh_etype = DOT11_ETH_TYPE_EAPOL + // NWF_EAPOL_HEADER + 0x02, // Version = NWF_EAPOL_PROTOCOL_VERSION_V1 = 1 OR NWF_EAPOL_PROTOCOL_VERSION_V2 = 2 + 0x03, // Type = EAPOL_Key = 2 + 0x00, 0x75, // Length + // NWF_EAPOL_RSNA_KEY_DESC + 0x02, // Type + 0x00, 0x8a, // Info + 0x00, 0x10, // Length + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, // Replay Counter + 0x57, 0x63, 0xf3, 0xb6, 0x6e, 0xc8, 0x90, 0xe4, 0xae, 0xfc, 0x2c, 0x50, 0xb0, 0xa9, 0x04, 0x29, // Nonce + 0x97, 0xb9, 0x80, 0x26, 0x13, 0x1a, 0xe2, 0xf0, 0x24, 0x30, 0x4b, 0x87, 0x57, 0x15, 0xcf, 0x87, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // IV + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // RSC + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Reserved + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // MIC + 0x00, 0x16, // Key length + 0xdd, 0x14, // KeyData -> DOT11_INFO_ELEMENT_ID_VENDOR_SPECIFIC + Len + 0x00, 0x0f, 0xac, 0x04, // OUI -> RSN_KEY_DATA_OUI + RSN_KEY_DATA_OUI_TYPE_PMKID -> {0x00,0x0F,0xAC} + {0x04) + 0x37, 0xfb, 0x9a, 0x24, 0xc1, 0x57, 0x8c, 0xce, 0xc3, 0x60, 0x6c, 0x6f, 0x39, 0xe0, 0xb7, 0x02, // PMKID +}; + + +UCHAR pucExpectedM2SaeFrame[] = +{ + // DOT11_MGMT_HEADER - DOT11_DATA_SHORT_HEADER + 0x88, 0x01, // Frame Control + 0x2c, 0x00, // Duration + 0x34, 0x13, 0xe8, 0xbc, 0x4d, 0x32, // Receiver/Destination/STA address + 0x9c, 0xda, 0x3e, 0xf2, 0x7d, 0xd5, // Transmittor/Bssid address + 0x34, 0x13, 0xe8, 0xbc, 0x4d, 0x32, // Source address + 0x00, 0x00, 0x07, 0x00, + // IEEE_8022_LLC_SNAP + 0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00, // NWF_802_LLC_SNAP + 0x88, 0x8e, // sh_etype + // NWF_EAPOL_HEADER + 0x01, // Version = bProtocolVersion = NWF_EAPOL_PROTOCOL_VERSION_V1 = 1 + 0x03, // Type = EAPOL_Key = 2 + 0x00, 0x75, // Length + // NWF_EAPOL_RSNA_KEY_DESC + 0x02, // Type = bKeyDesc = NWF_EAPOL_KEY_DESC_RSNA = 2 + 0x01, 0x0a, // Info = usKeyInfo, ResponseKeyInfo.Version = KEY_DESC_VERSION_AES, Type=RSN_KEY_TYPE_PAIRWISE, MIC=1, Secure=0 + 0x00, 0x00, // Length + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, // Replay Counter + 0x80, 0xf8, 0x10, 0x83, 0x4f, 0x0f, 0x40, 0xa1, 0xe5, 0x5d, 0x51, 0x92, 0x83, 0x4f, 0x8e, 0x98, // Nonce + 0x09, 0xca, 0xd5, 0x14, 0xc6, 0x08, 0x4c, 0xa9, 0xed, 0xc3, 0xa8, 0xff, 0xce, 0xc9, 0x36, 0xb6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // IV + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // RSC + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Reserved + 0xa1, 0x79, 0x5f, 0x05, 0xa4, 0x12, 0x84, 0xf2, 0xf9, 0x0c, 0x79, 0x88, 0xeb, 0x92, 0x71, 0x62, // MIC + 0x00, 0x16, // Key Length + 0x30, 0x14, 0x01, 0x00, 0x00, 0x0f, 0xac, 0x04, 0x01, 0x00, 0x00, 0x0f, 0xac, 0x04, 0x01, 0x00, // Key Data = RSN + 0x00, 0x0f, 0xac, 0x08, 0x80, 0x00 + +}; + +UCHAR pucM3SaeFrame[] = +{ + // DOT11_MGMT_HEADER - DOT11_DATA_SHORT_HEADER + 0x88, 0x02, // Frame Control + 0x30, 0x00, // Duration + 0x9c, 0xda, 0x3e, 0xf2, 0x7d, 0xd5, // Receiver/Destination/STA address + 0x34, 0x13, 0xe8, 0xbc, 0x4d, 0x32, // Transmittor/Bssid address + 0x34, 0x13, 0xe8, 0xbc, 0x4d, 0x32, // Source address + 0x00, 0x00, 0x07, 0x00, // Sequence Control + // IEEE_8022_LLC_SNAP + 0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00, // NWF_802_LLC_SNAP + 0x88, 0x8e, // sh_etype + // NWF_EAPOL_HEADER + 0x02, // Version + 0x03, // Type + 0x00, 0x97, // Length + // NWF_EAPOL_RSNA_KEY_DESC + 0x02, // Type + 0x13, 0xca, // Info + 0x00, 0x10, // Length + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, // Replay Counter + 0x57, 0x63, 0xf3, 0xb6, 0x6e, 0xc8, 0x90, 0xe4, 0xae, 0xfc, 0x2c, 0x50, 0xb0, 0xa9, 0x04, 0x29, // Nonce + 0x97, 0xb9, 0x80, 0x26, 0x13, 0x1a, 0xe2, 0xf0, 0x24, 0x30, 0x4b, 0x87, 0x57, 0x15, 0xcf, 0x87, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // IV + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // RSC + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Reserved + 0xa5, 0xea, 0xdc, 0xfd, 0x97, 0xc7, 0x72, 0x76, 0x24, 0xe2, 0x7e, 0x71, 0x45, 0x3a, 0x24, 0xca, // MIC + 0x00, 0x38, // Key Length + 0x6f, 0x39, 0x30, 0x2c, 0x46, 0xb4, 0x3c, 0xf8, 0x42, 0x07, 0x8e, 0xc9, 0x65, 0x05, 0x2c, 0xd0, // Encrypted Key data + 0xe1, 0x7b, 0xdd, 0x2e, 0xbd, 0x69, 0x09, 0x1e, 0x39, 0xcc, 0x1a, 0xb3, 0x6e, 0x55, 0xd1, 0xad, + 0x5c, 0x45, 0x52, 0x4b, 0x83, 0x5d, 0x39, 0xe3, 0x1c, 0xb6, 0xed, 0x35, 0x52, 0x76, 0xb1, 0xc6, + 0x5a, 0x2c, 0x96, 0x07, 0x77, 0x15, 0x15, 0x5c, +}; + + +UCHAR pucExpectedM4SaeFrame[] = +{ + // DOT11_MGMT_HEADER - DOT11_DATA_SHORT_HEADER + 0x88, 0x01, // Frame Control + 0x2c, 0x00, // Duration + 0x34, 0x13, 0xe8, 0xbc, 0x4d, 0x32, // Receiver/Destination/STA address + 0x9c, 0xda, 0x3e, 0xf2, 0x7d, 0xd5, // Transmittor/Bssid address + 0x34, 0x13, 0xe8, 0xbc, 0x4d, 0x32, // Source address + 0x10, 0x00, 0x07, 0x00, // Sequence Control + // IEEE_8022_LLC_SNAP + 0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00, // NWF_802_LLC_SNAP + 0x88, 0x8e, // sh_etype + // NWF_EAPOL_HEADER + 0x01, // Version + 0x03, // Type + 0x00, 0x5f, // Length + // NWF_EAPOL_RSNA_KEY_DESC + 0x02, // Type + 0x03, 0x0a, // Info + 0x00, 0x00, // Length + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, // Replay Counter + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Nonce + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // IV + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // RSC + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Reserved + 0x52, 0x97, 0x0f, 0x90, 0x69, 0x7d, 0xcd, 0xeb, 0x98, 0xbf, 0xb1, 0x2a, 0xb2, 0x3e, 0xcc, 0x49, // MIC + 0x00, 0x00, // Key Length +}; + +// +// SAE-Specific definitions :: End +// + +// +//=============================================================================== +// + +WDI_MAC_ADDRESS s_Connect_Addr_15_WPA2PSK_SHA256 = {0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xEF}; + +UCHAR s_TLV_BSS_Entry_15_WPA2PSK_SHA256 [] = +{ + // WDI_TLV_BSS_ENTRY + 0x08, 0x00, //Type + 0x91, 0x00, //Len + + // WDI_TLV_BSSID + 0x02, 0x00, // Type + 0x06, 0x00, // Length + 0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xEF, + + // WDI_TLV_BEACON_FRAME + 0x0a, 0x00, + 0x5e, 0x00, + + 0x22, 0x02, 0x2C, 0x01, 0x00, 0x00, 0x00, 0x00, // Timestamp + 0x64, 0x00, // Beacon Interval + 0x31, 0x04, // Capability + 0x00, 0x0A, // SSID + 'W', 'D', 'I', '_', 'S', 'H', 'A', '2', '5', '6', + 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 + 0x30, 0x1a, // RSN IE + 0x01, 0x00, // Version + 0x00, 0x0F, 0xAC, 0x04, // Group Cipher + 0x01, 0x00, // Pairwise Cipher Count + 0x00, 0x0F, 0xAC, 0x04, // Pairwise Cipher + 0x01, 0x00, // AKM Suite count + 0x00, 0x0F, 0xAC, 0x06, // AKM Suite + 0xCC, 0x00, // RSN Capability + 0x00, 0x00, + 0x00, 0x0F, 0xAC, 0x06, // Group Cipher + 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, + 0x0B, 0x00, 0x00, 0x00, // Channel + 0x01, 0x00, 0x00, 0x00 // BandId +}; + +UCHAR s_TLV_Success_AssociationResult_15_WPA2PSK_SHA256[] = +{ + // WDI_TLV_ASSOCIATION_RESULT + 0x35, 0x00, + 0x28, 0x01, + + // WDI_TLV_BSSID + 0x02, 0x00, + 0x06, 0x00, + 0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xEF, + + // WDI_TLV_ASSOCIATION_RESULT_PARAMETERS + 0x2D, 0x00, + 0x30, 0x00, + 0x00, 0x00, 0x00, 0x00, //Association Status + 0x00, 0x00, 0x00, 0x00, //Status Code + 0x00, //ReAssociationRequest + 0x07, 0x00, 0x00, 0x00, //AuthAlgorithm + 0x04, 0x00, 0x00, 0x00, //UnicastCipherAlgorithm + 0x04, 0x00, 0x00, 0x00, //MulticastDataCipherAlgorithm + 0x00, 0x00, 0x00, 0x00, //MulticastMgmtCipherAlgorithm + 0x00, //FourAddressSupported + 0x00, //Port Authorized + 0x00, // WMM QoS Enabled + 0x00, 0x00, 0x00, 0x00, //DSInfo + 0x00, 0x00, 0x00, 0x00, //AssociationComebackTime + 0x01, 0x00, 0x00, 0x00, // Band ID + 0x00, 0x00, 0x00, 0x00, // IHV Association Status + 0x00, 0x00, 0x00, 0x00, //DisableDataPathOffloadsScenario + + // WDI_TLV_ASSOCIATION_REQUEST_FRAME + 0x2E, 0x00, + 0x48, 0x00, + 0x21, 0x04, // Capabilities + 0x0A, 0x00, // Listen Interval + 0x00, 0x0A, // SSID + 'W', 'D', 'I', '_', 'S', 'E', 'C', 'U', 'R', 'E', + 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 + 0x30, 0x14, + 0x01, 0x00, // Version + 0x00, 0x0F, 0xAC, 0x04, // Group Cipher + 0x01, 0x00, // Pairwise cipher count + 0x00, 0x0F, 0xAC, 0x04, // Pairwise Cipher + 0x01, 0x00, // AMK Suite Count + 0x00, 0x0F, 0xAC, 0x06, // AMK Suite - WPA2PSK_SHA256 + 0xC0, 0x00, // RSN Capability = MFP-Capable + MFP-Required + + // WDI_TLV_ASSOCIATION_RESPONSE_FRAME + 0x2F, 0x00, + 0x30, 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 + + + // WDI_TLV_BEACON_FRAME + 0x30, 0x00, + 0x5e, 0x00, + + 0x22, 0x02, 0x2C, 0x01, 0x00, 0x00, 0x00, 0x00, // Timestamp + 0x64, 0x00, // Beacon Interval + 0x31, 0x04, // Capability + 0x00, 0x0A, // SSID + 'W', 'D', 'I', '_', 'S', 'E', 'C', 'U', 'R', 'E', + 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 + 0x30, 0x1a, // RSN IE + 0x01, 0x00, // Version + 0x00, 0x0F, 0xAC, 0x04, // Group Cipher + 0x01, 0x00, // Pairwise Cipher Count + 0x00, 0x0F, 0xAC, 0x04, // Pairwise Cipher + 0x01, 0x00, // AKM Suite count + 0x00, 0x0F, 0xAC, 0x02, // AKM Suite + 0xCC, 0x00, // RSN Capability + 0x00, 0x00, + 0x00, 0x0F, 0xAC, 0x06, // Group Cipher + 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, + 0x04, 0x00, 0x00, 0x00, + +}; + + +// +//=============================================================================== +// + +#ifdef WPA3_ARUBA_SIM +WDI_MAC_ADDRESS s_Connect_Addr_16_WPA3_SUITEB = {0xa8, 0xbd, 0x27, 0xcd, 0xe0, 0xa5}; // For Aruba +#elif WPA3_INTEL_SIM +WDI_MAC_ADDRESS s_Connect_Addr_16_WPA3_SUITEB = {0x8c, 0xfd, 0xf0, 0x0f, 0x7f, 0x4a}; // For Intel +#else +WDI_MAC_ADDRESS s_Connect_Addr_16_WPA3_SUITEB = {0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xF0}; +#endif + +UCHAR s_TLV_BSS_Entry_16_WPA3_SUITEB [] = +{ + // WDI_TLV_BSS_ENTRY + 0x08, 0x00, //Type + 0x97, 0x00, //Len + + // WDI_TLV_BSSID + 0x02, 0x00, // Type + 0x06, 0x00, // Length +#ifdef WPA3_ARUBA_SIM + 0xa8, 0xbd, 0x27, 0xcd, 0xe0, 0xa5, // For Aruba +#elif WPA3_INTEL_SIM + 0x8c, 0xfd, 0xf0, 0x0f, 0x7f, 0x4a, // For Intel +#else + 0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xF0, +#endif + // WDI_TLV_BEACON_FRAME + 0x0a, 0x00, + 0x64, 0x00, + + 0x22, 0x02, 0x2C, 0x01, 0x00, 0x00, 0x00, 0x00, // Timestamp + 0x64, 0x00, // Beacon Interval + 0x31, 0x04, // Capability + 0x00, 0x10, // SSID + 'W', 'D', 'I', '_', 'W', 'P', 'A', '3', '-', 'S', 'U', 'I', 'T', 'E', '_', 'B', + 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 + 0x30, 0x1A, + 0x01, 0x00, // Version + 0x00, 0x0F, 0xAC, 0x09, // Group Cipher = GCMP + 0x01, 0x00, // Pairwise Cipher Count + 0x00, 0x0F, 0xAC, 0x09, // Pairwise Cipher = GCMP + 0x01, 0x00, // AKM Suite Count + 0x00, 0x0F, 0xAC, 0x0C, // AKM Suite - WPA3-SuiteB + 0xC0, 0x00, // RSN Capability = MFPC + MFPR + ... + 0x00, 0x00, // PMKID Count + 0x00, 0x0F, 0xAC, 0x0C, // Group Mgmt Cipher = GMAC + 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, + 0x0B, 0x00, 0x00, 0x00, // Channel + 0x01, 0x00, 0x00, 0x00 // BandId + +}; + +UCHAR s_TLV_Success_AssociationResult_16_WPA3_SUITEB[] = +{ + // WDI_TLV_ASSOCIATION_RESULT + 0x35, 0x00, + 0x3A, 0x01, + + // WDI_TLV_BSSID + 0x02, 0x00, + 0x06, 0x00, +#ifdef WPA3_ARUBA_SIM + 0xa8, 0xbd, 0x27, 0xcd, 0xe0, 0xa5, // For Aruba +#elif WPA3_INTEL_SIM + 0x8c, 0xfd, 0xf0, 0x0f, 0x7f, 0x4a, // For Intel +#else + 0x00, 0xA0, 0xB0, 0xC0, 0xD0, 0xF0, +#endif + + // WDI_TLV_ASSOCIATION_RESULT_PARAMETERS + 0x2D, 0x00, + 0x30, 0x00, + 0x00, 0x00, 0x00, 0x00, // Association Status + 0x00, 0x00, 0x00, 0x00, // Status Code + 0x00, // ReAssociationRequest + 0x08, 0x00, 0x00, 0x00, // AuthAlgorithm = WDI_AUTH_ALGO_WPA3_ENT_192 = 8 + 0x09, 0x00, 0x00, 0x00, // UnicastCipherAlgorithm = WDI_CIPHER_ALGO_GCMP_256 = 9 + 0x09, 0x00, 0x00, 0x00, // MulticastDataCipherAlgorithm = WDI_CIPHER_ALGO_GCMP_256 = 9 + 0x0C, 0x00, 0x00, 0x00, // MulticastMgmtCipherAlgorithm = WDI_CIPHER_ALGO_BIP_GMAC_256 = C + 0x00, // FourAddressSupported + 0x00, // Port Authorized + 0x00, // WMM QoS Enabled + 0x00, 0x00, 0x00, 0x00, // DSInfo + 0x00, 0x00, 0x00, 0x00, // AssociationComebackTime + 0x01, 0x00, 0x00, 0x00, // Band ID + 0x00, 0x00, 0x00, 0x00, // IHV Association Status + 0x00, 0x00, 0x00, 0x00, //DisableDataPathOffloadsScenario + + // WDI_TLV_ASSOCIATION_REQUEST_FRAME + 0x2E, 0x00, + 0x54, 0x00, + 0x21, 0x04, // Capabilities + 0x0A, 0x00, // Listen Interval + 0x00, 0x10, // SSID + 'W', 'D', 'I', '_', 'W', 'P', 'A', '3', '-', 'S', 'U', 'I', 'T', 'E', '_', 'B', + 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 + 0x30, 0x1A, + 0x01, 0x00, // Version + 0x00, 0x0F, 0xAC, 0x09, // Group Cipher = GCMP + 0x01, 0x00, // Pairwise Cipher Count + 0x00, 0x0F, 0xAC, 0x09, // Pairwise Cipher = GCMP + 0x01, 0x00, // AKM Suite Count + 0x00, 0x0F, 0xAC, 0x0C, // AKM Suite - WPA3-SuiteB + 0xC0, 0x00, // RSN Capability = MFPC + MFPR + ... + 0x00, 0x00, // PMKID Count + 0x00, 0x0F, 0xAC, 0x0C, // Group Mgmt Cipher = GMAC + + + // WDI_TLV_ASSOCIATION_RESPONSE_FRAME + 0x2F, 0x00, + 0x30, 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 + + + // WDI_TLV_BEACON_FRAME + 0x30, 0x00, + 0x64, 0x00, + + 0x22, 0x02, 0x2C, 0x01, 0x00, 0x00, 0x00, 0x00, // Timestamp + 0x64, 0x00, // Beacon Interval + 0x31, 0x04, // Capability + 0x00, 0x10, // SSID + 'W', 'D', 'I', '_', 'W', 'P', 'A', '3', '-', 'S', 'U', 'I', 'T', 'E', '_', 'B', + 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 + 0x30, 0x1A, + 0x01, 0x00, // Version + 0x00, 0x0F, 0xAC, 0x09, // Group Cipher = GCMP + 0x01, 0x00, // Pairwise Cipher Count + 0x00, 0x0F, 0xAC, 0x09, // Pairwise Cipher = GCMP + 0x01, 0x00, // AKM Suite Count + 0x00, 0x0F, 0xAC, 0x0C, // AKM Suite - WPA3-SuiteB + 0xC0, 0x00, // RSN Capability = MFPC + MFPR + ... + 0x00, 0x00, // PMKID Count + 0x00, 0x0F, 0xAC, 0x0C, // Group Mgmt Cipher = GMAC + 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, + 0x04, 0x00, 0x00, 0x00, + +}; + +//=============================================================================== +// +// 6 GHz +// +//=============================================================================== + +// +// RNR IE has the following format (only care about TBTT length = 8 or 12): +// 0xc9, 0x<IELength> +// 0x<TBTTInformationHeader> -> 2 bytes (contains number and size of each element) +// 0x<OperatingClass>, 0x<Channel> -> 2 bytes (applies to all element in this list) +// 0x<TBTTOffset> -> 1 byte +// 0x<Bssid> -> 6 bytes +// [0x<SHortSsid>] -> 4 bytes +// 0x<BssParameters> -> 1 byte +// + +// +// Mac addresses have the following nomenclature for 6GHz Ssids +// +// 1st 3 bytes are 0x00 0xA1, 0xB0 +// 4th byte is for SSID: +// 01 = 6E__1 +// 02 = 6E__2 +// 03 = SSID3 +// 04 = SSID4 +// 5th Byte is for band: +// 02 = 2.4 GHz +// 05 = 5 GHz +// 06 = 6 GHz +// 6th byte is instance +// 01 = 1st instance +// 02 - 2nd instance +// : +// + +//=============================================================================== +// SIX_G: 6E__1: +// (1 * 2.4 GHz) + (1 * 5 GHz) + (2 * 6 GHz) +// 2.4 GHz: +// S1_24_1: S1_5_1 (In+Out) + S1_6_1 (Out) + S1_6_2 (Out) +// 5 GHz: +// S1_5_1: S1_24_1 (In+Out) + S1_6_1 (Out) + S1_6_2 (Out) +// 6 GHz: +// S1_6_1: S1_24_1 (In) + S1_5_1 (In) +// S1_6_2: S1_24_1 (In) + S1_5_1 (In) +//=============================================================================== + +// +// 6E__1: 1 * 2.4 GHz Bss's +// 1 RNR IE with 3 entries: Band:Channel = [5:36 + 6:101 + 6:133] +// +WDI_MAC_ADDRESS s_Connect_Addr_17_6G_S1_2_4_Ghz = {0x00, 0xA1, 0xB0, 0x01, 0x02, 0x01}; +UCHAR s_TLV_BSS_Entry_17_6G_S1_2_4_Ghz [] = +{ + // WDI_TLV_BSS_ENTRY + 0x08, 0x00, //Type + 0xE9, 0x00, //Len + + // WDI_TLV_BSSID + 0x02, 0x00, // Type + 0x06, 0x00, // Length + 0x00, 0xA1, 0xB0, 0x01, 0x02, 0x01, + + // WDI_TLV_BEACON_FRAME + 0x0a, 0x00, + 0xB6, 0x00, + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Timestamp + 0x64, 0x00, // Beacon Inteval + 0x01, 0x00, // Capabilities + 0x00, 0x05, // SSID + '6', 'E', '_', '_', '1', + 0x01, 0x08, // Supported Rates + 0x82, 0x84, 0x0b, 0x16, 0x8c, 0x12, 0x98, 0xa4, + 0x03, 0x01, // DS Parameter Set + 0x01, + 0x05, 0x04, // TIM - DTIM 0 of 0 + 0x00, 0x02, 0x00, 0x6c, + 0x0b, 0x05, // QBSS Load Element 802.11e CCA Version + 0x00, 0x00, 0x00, 0x12, 0x7a, + 0x2a, 0x01, // ERP Information + 0x00, + 0x2d, 0x1a, // HT Capabilities (802.11n D1.10) + 0x76, 0x08, 0x17, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x32, 0x04, // Extended Supported Rates 24, 36, 48, 54 [Mbits/sec] + 0x30, 0x48, 0x60, 0x6c, + 0x3d, 0x16, // HT Information (802.11n D1.10) + 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + + 0xc9, 0x30, // RNR IE + 0x04, 0x0c, // TBTT: 0x04 => B2=1(FilteredAP),B4-B7=0(TBTT Information Count=0+1) :: 0x0c = TBTT Length + 0x73, 0x24, // Operating Class = 115 (5 GHz), Channel = 36 + 0x00, 0x00, 0xA1, 0xB0, 0x01, 0x05, 0x01, 0x18, 0x3a, 0x94, 0x4f, 0x40, // 6E__1 on 5 GHz + 0x00, 0x0c, // TBTT: 0x00 => B4-B7=0(TBTT Information Count=0+1) :: 0x0c = TBTT Length + 0x83, 0x65, // Operating Class = 131, Channel = 101 + 0x00, 0x00, 0xA1, 0xB0, 0x01, 0x06, 0x01, 0x18, 0x3a, 0x94, 0x4f, 0x40, // 6E__1 on 6 Ghz + 0x0c, 0x0c, // TBTT: 0x0c => B2:3=1(FilteredAP:Reserved),B4-B7=f(TBTT Information Count=3+1) :: 0x0c = TBTT Length + 0x83, 0x85, // Operating Class = 131, Channel = 133 + 0x00, 0x00, 0xA1, 0xB0, 0x01, 0x06, 0x02, 0x18, 0x3a, 0x94, 0x4f, 0x40, // 6E__1 on 6 GHz + + 0xdd, 0x18, // Vendor Specific: Microsoft Corp.: WMM/WME: Parameter Element + 0x00, 0x50, 0xf2, 0x02, 0x01, 0x01, 0x80, 0x00, 0x03, 0xa4, 0x00, 0x00, 0x27, 0xa4, 0x00, 0x00, + 0x42, 0x43, 0x5e, 0x00, 0x62, 0x32, 0x2f, 0x00, + + // 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, + 0x01, 0x00, 0x00, 0x00, // Channel / Freq = 2412 MHz + 0x01, 0x00, 0x00, 0x00 // BandId +}; + +UCHAR s_TLV_Success_AssociationResult_17_6G_S1_2_4_Ghz[] = +{ + // WDI_TLV_ASSOCIATION_RESULT + 0x35, 0x00, + 0x0B, 0x02, + + // WDI_TLV_BSSID + 0x02, 0x00, + 0x06, 0x00, + 0x00, 0xA1, 0xB0, 0x01, 0x02, 0x01, + + // WDI_TLV_ASSOCIATION_RESULT_PARAMETERS + 0x2D, 0x00, + 0x30, 0x00, + 0x00, 0x00, 0x00, 0x00, //Association Status + 0x00, 0x00, 0x00, 0x00, //Status Code + 0x00, //ReAssociationRequest + 0x07, 0x00, 0x00, 0x00, //AuthAlgorithm + 0x04, 0x00, 0x00, 0x00, //UnicastCipherAlgorithm + 0x04, 0x00, 0x00, 0x00, //MulticastDataCipherAlgorithm + 0x00, 0x00, 0x00, 0x00, //MulticastMgmtCipherAlgorithm + 0x00, //FourAddressSupported + 0x00, //Port Authorized + 0x00, // WMM QoS Enabled + 0x00, 0x00, 0x00, 0x00, //DSInfo + 0x00, 0x00, 0x00, 0x00, //AssociationComebackTime + 0x01, 0x00, 0x00, 0x00, // Band ID + 0x00, 0x00, 0x00, 0x00, // IHV Association Status + 0x00, 0x00, 0x00, 0x00, // DisableDataPathOffloadsScenario + + // WDI_TLV_ASSOCIATION_REQUEST_FRAME + 0x2E, 0x00, + 0x8B, 0x00, + + 0x01, 0x11, // Capabilities + 0xfa, 0x00, // Listen Interval + 0x00, 0x05, // SSID + '6', 'E', '_', '_', '1', + 0x01, 0x08, // Supported Rates + 0x82, 0x84, 0x0b, 0x16, 0x8c, 0x12, 0x98, 0xa4, + 0x21, 0x02, // Power Capability Min: 0, Max: 15 + 0x00, 0x0f, + 0x24, 0x32, // Supported Channels + 0x24, 0x01, 0x28, 0x01, 0x2c, 0x01, 0x30, 0x01, 0x34, 0x01, 0x38, 0x01, 0x3c, 0x01, 0x40, 0x01, + 0x64, 0x01, 0x68, 0x01, 0x6c, 0x01, 0x70, 0x01, 0x74, 0x01, 0x78, 0x01, 0x7c, 0x01, 0x80, 0x01, + 0x84, 0x01, 0x88, 0x01, 0x8c, 0x01, 0x90, 0x01, 0x95, 0x01, 0x99, 0x01, 0x9d, 0x01, 0xa1, 0x01, + 0xa5, 0x01, + 0x2d, 0x1a, // HT Capabilities (802.11n D1.10) + 0xa5, 0x09, 0x17, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x32, 0x04, // Extended Supported Rates + 0x30, 0x48, 0x60, 0x6c, + 0x46, 0x05, // RM Enabled Capabilities + 0x72, 0x00, 0x00, 0x00, 0x00, + 0x7f, 0x0a, // Extended Capabilities + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, + 0xdd, 0x07, // Vendor Specific: Microsoft Corp.: WMM/WME: Information Element + 0x00, 0x50, 0xf2, 0x02, 0x00, 0x01, 0x00, + + // WDI_TLV_ASSOCIATION_RESPONSE_FRAME + 0x2F, 0x00, + 0x78, 0x00, + + 0x01, 0x11, // Capabilities + 0x00, 0x00, // Status Code: Successful + 0x00, 0xc0, // Association ID: 0x0000 + 0x00, 0x05, // SSID Parameter set + 0x53, 0x53, 0x49, 0x44, 0x31, + 0x01, 0x08, // Supported Rates + 0x82, 0x84, 0x0b, 0x16, 0x8c, 0x12, 0x98, 0xa4, + 0x03, 0x01, // DS Parameter set: Current Channel: 10 + 0x01, + 0x0b, 0x05, // QBSS Load Element 802.11e CCA Version + 0x00, 0x00, 0x00, 0x12, 0x7a, + 0x2a, 0x01, // ERP Information + 0x00, + 0x2d, 0x1a, // HT Capabilities (802.11n D1.10) + 0x76, 0x08, 0x17, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x32, 0x04, // Extended Supported Rates 24, 36, 48, 54 [Mbit/sec] + 0x30, 0x48, 0x60, 0x6c, + 0x3d, 0x16, // HT Information (802.11n D1.10) + 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xdd, 0x18, // Vendor Specific: Microsoft Corp.: WMM/WME: Parameter Element + 0x00, 0x50, 0xf2, 0x02, 0x01, 0x01, 0x80, 0x00, 0x03, 0xa4, 0x00, 0x00, 0x27, 0xa4, 0x00, 0x00, + 0x42, 0x43, 0x5e, 0x00, 0x62, 0x32, 0x2f, 0x00, + + // WDI_TLV_BEACON_FRAME + 0x30, 0x00, + 0xb6, 0x00, + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Timestamp + 0x64, 0x00, // Beacon Inteval + 0x01, 0x00, // Capabilities + 0x00, 0x05, // SSID + '6', 'E', '_', '_', '1', + 0x01, 0x08, // Supported Rates + 0x82, 0x84, 0x0b, 0x16, 0x8c, 0x12, 0x98, 0xa4, + 0x03, 0x01, // DS Parameter Set + 0x01, + 0x05, 0x04, // TIM - DTIM 0 of 0 + 0x00, 0x02, 0x00, 0x6c, + 0x0b, 0x05, // QBSS Load Element 802.11e CCA Version + 0x00, 0x00, 0x00, 0x12, 0x7a, + 0x2a, 0x01, // ERP Information + 0x00, + 0x2d, 0x1a, // HT Capabilities (802.11n D1.10) + 0x76, 0x08, 0x17, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x32, 0x04, // Extended Supported Rates 24, 36, 48, 54 [Mbits/sec] + 0x30, 0x48, 0x60, 0x6c, + 0x3d, 0x16, // HT Information (802.11n D1.10) + 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc9, 0x30, // RNR IE + 0x04, 0x0c, // TBTT: 0x04 => B2=1(FilteredAP),B4-B7=0(TBTT Information Count=0+1) :: 0x0c = TBTT Length + 0x73, 0x24, // Operating Class = 115 (5 GHz), Channel = 36 + 0x00, 0x00, 0xA1, 0xB0, 0x01, 0x05, 0x01, 0x18, 0x3a, 0x94, 0x4f, 0x40, // 6E__1 on 5 GHz + 0x00, 0x0c, // TBTT: 0x00 => B4-B7=0(TBTT Information Count=0+1) :: 0x0c = TBTT Length + 0x83, 0x65, // Operating Class = 131, Channel = 101 + 0x00, 0x00, 0xA1, 0xB0, 0x01, 0x06, 0x01, 0x18, 0x3a, 0x94, 0x4f, 0x40, // 6E__1 on 6 Ghz + 0x0c, 0x0c, // TBTT: 0x0c => B2:3=1(FilteredAP:Reserved),B4-B7=f(TBTT Information Count=3+1) :: 0x0c = TBTT Length + 0x83, 0x85, // Operating Class = 131, Channel = 133 + 0x00, 0x00, 0xA1, 0xB0, 0x01, 0x06, 0x02, 0x18, 0x3a, 0x94, 0x4f, 0x40, // 6E__1 on 6 GHz + + 0xdd, 0x18, // Vendor Specific: Microsoft Corp.: WMM/WME: Parameter Element + 0x00, 0x50, 0xf2, 0x02, 0x01, 0x01, 0x80, 0x00, 0x03, 0xa4, 0x00, 0x00, 0x27, 0xa4, 0x00, 0x00, + 0x42, 0x43, 0x5e, 0x00, 0x62, 0x32, 0x2f, 0x00, + + // WDI_TLV_PHY_TYPE_LIST + 0x19, 0x00, + 0x04, 0x00, + 0x0A, 0x00, 0x00, 0x00, + +}; + +// +// 6E__1: 1 * 5 GHz Bss's +// 1 RNR IE with 3 entries: Band:Channel = [2.4:1 + 6:101 + 6:133] +// +WDI_MAC_ADDRESS s_Connect_Addr_18_6G_S1_5_Ghz = {0x00, 0xA1, 0xB0, 0x01, 0x05, 0x01}; +UCHAR s_TLV_BSS_Entry_18_6G_S1_5_Ghz [] = +{ + // WDI_TLV_BSS_ENTRY + 0x08, 0x00, //Type + 0xe9, 0x00, //Len + + // WDI_TLV_BSSID + 0x02, 0x00, // Type + 0x06, 0x00, // Length + 0x00, 0xA1, 0xB0, 0x01, 0x05, 0x01, + + // WDI_TLV_BEACON_FRAME + 0x0a, 0x00, + 0xb6, 0x00, + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Timestamp + 0x64, 0x00, // Beacon Inteval + 0x01, 0x00, // Capabilities + 0x00, 0x05, // SSID + '6', 'E', '_', '_', '1', + 0x01, 0x08, // Supported Rates + 0x82, 0x84, 0x0b, 0x16, 0x8c, 0x12, 0x98, 0xa4, + 0x03, 0x01, // DS Parameter Set + 0x24, + 0x05, 0x04, // TIM - DTIM 0 of 0 + 0x00, 0x02, 0x00, 0x6c, + 0x0b, 0x05, // QBSS Load Element 802.11e CCA Version + 0x00, 0x00, 0x00, 0x12, 0x7a, + 0x2a, 0x01, // ERP Information + 0x00, + 0x2d, 0x1a, // HT Capabilities (802.11n D1.10) + 0x76, 0x08, 0x17, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x32, 0x04, // Extended Supported Rates 24, 36, 48, 54 [Mbits/sec] + 0x30, 0x48, 0x60, 0x6c, + 0x3d, 0x16, // HT Information (802.11n D1.10) + 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc9, 0x30, // RNR IE + 0x04, 0x0c, // TBTT: 0x04 => B2=1(FilteredAP),B4-B7=0(TBTT Information Count=0+1) :: 0x0c = TBTT Length + 0x51, 0x01, // Operating Class = 81 (2.4 GHz), Channel = 1 + 0x00, 0x00, 0xA1, 0xB0, 0x01, 0x02, 0x01, 0x18, 0x3a, 0x94, 0x4f, 0x40, // 6E__1 on 2.4 GHz + 0x00, 0x0c, // TBTT: 0x00 => B4-B7=0(TBTT Information Count=0+1) :: 0x0c = TBTT Length + 0x83, 0x65, // Operating Class = 131, Channel = 101 + 0x00, 0x00, 0xA1, 0xB0, 0x01, 0x06, 0x01, 0x18, 0x3a, 0x94, 0x4f, 0x40, // 6E__1 on 6 Ghz + 0x0c, 0x0c, // TBTT: 0x0c => B2:3=1(FilteredAP:Reserved),B4-B7=f(TBTT Information Count=3+1) :: 0x0c = TBTT Length + 0x83, 0x85, // Operating Class = 131, Channel = 133 + 0x00, 0x00, 0xA1, 0xB0, 0x01, 0x06, 0x02, 0x18, 0x3a, 0x94, 0x4f, 0x40, // 6E__1 on 6 GHz + + 0xdd, 0x18, // Vendor Specific: Microsoft Corp.: WMM/WME: Parameter Element + 0x00, 0x50, 0xf2, 0x02, 0x01, 0x01, 0x80, 0x00, 0x03, 0xa4, 0x00, 0x00, 0x27, 0xa4, 0x00, 0x00, + 0x42, 0x43, 0x5e, 0x00, 0x62, 0x32, 0x2f, 0x00, + + // 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, + 0x24, 0x00, 0x00, 0x00, // Channel / Freq = 36 / 5180 MHz + 0x02, 0x00, 0x00, 0x00 // BandId +}; + +UCHAR s_TLV_Success_AssociationResult_18_6G_S1_5_Ghz[] = +{ + // WDI_TLV_ASSOCIATION_RESULT + 0x35, 0x00, + 0x0B, 0x02, + + // WDI_TLV_BSSID + 0x02, 0x00, + 0x06, 0x00, + 0x00, 0xA1, 0xB0, 0x01, 0x05, 0x01, + + // WDI_TLV_ASSOCIATION_RESULT_PARAMETERS + 0x2D, 0x00, + 0x30, 0x00, + 0x00, 0x00, 0x00, 0x00, //Association Status + 0x00, 0x00, 0x00, 0x00, //Status Code + 0x00, //ReAssociationRequest + 0x07, 0x00, 0x00, 0x00, //AuthAlgorithm + 0x04, 0x00, 0x00, 0x00, //UnicastCipherAlgorithm + 0x04, 0x00, 0x00, 0x00, //MulticastDataCipherAlgorithm + 0x00, 0x00, 0x00, 0x00, //MulticastMgmtCipherAlgorithm + 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, + 0x8B, 0x00, + + 0x01, 0x11, // Capabilities + 0xfa, 0x00, // Listen Interval + 0x00, 0x05, // SSID + '6', 'E', '_', '_', '1', + 0x01, 0x08, // Supported Rates + 0x82, 0x84, 0x0b, 0x16, 0x8c, 0x12, 0x98, 0xa4, + 0x21, 0x02, // Power Capability Min: 0, Max: 15 + 0x00, 0x0f, + 0x24, 0x32, // Supported Channels + 0x24, 0x01, 0x28, 0x01, 0x2c, 0x01, 0x30, 0x01, 0x34, 0x01, 0x38, 0x01, 0x3c, 0x01, 0x40, 0x01, + 0x64, 0x01, 0x68, 0x01, 0x6c, 0x01, 0x70, 0x01, 0x74, 0x01, 0x78, 0x01, 0x7c, 0x01, 0x80, 0x01, + 0x84, 0x01, 0x88, 0x01, 0x8c, 0x01, 0x90, 0x01, 0x95, 0x01, 0x99, 0x01, 0x9d, 0x01, 0xa1, 0x01, + 0xa5, 0x01, + 0x2d, 0x1a, // HT Capabilities (802.11n D1.10) + 0xa5, 0x09, 0x17, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x32, 0x04, // Extended Supported Rates + 0x30, 0x48, 0x60, 0x6c, + 0x46, 0x05, // RM Enabled Capabilities + 0x72, 0x00, 0x00, 0x00, 0x00, + 0x7f, 0x0a, // Extended Capabilities + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, + 0xdd, 0x07, // Vendor Specific: Microsoft Corp.: WMM/WME: Information Element + 0x00, 0x50, 0xf2, 0x02, 0x00, 0x01, 0x00, + + // WDI_TLV_ASSOCIATION_RESPONSE_FRAME + 0x2F, 0x00, + 0x78, 0x00, + + 0x01, 0x11, // Capabilities + 0x00, 0x00, // Status Code: Successful + 0x00, 0xc0, // Association ID: 0x0000 + 0x00, 0x05, // SSID Parameter set + 0x53, 0x53, 0x49, 0x44, 0x31, + 0x01, 0x08, // Supported Rates + 0x82, 0x84, 0x0b, 0x16, 0x8c, 0x12, 0x98, 0xa4, + 0x03, 0x01, // DS Parameter set: Current Channel: 10 + 0x24, + 0x0b, 0x05, // QBSS Load Element 802.11e CCA Version + 0x00, 0x00, 0x00, 0x12, 0x7a, + 0x2a, 0x01, // ERP Information + 0x00, + 0x2d, 0x1a, // HT Capabilities (802.11n D1.10) + 0x76, 0x08, 0x17, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x32, 0x04, // Extended Supported Rates 24, 36, 48, 54 [Mbit/sec] + 0x30, 0x48, 0x60, 0x6c, + 0x3d, 0x16, // HT Information (802.11n D1.10) + 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xdd, 0x18, // Vendor Specific: Microsoft Corp.: WMM/WME: Parameter Element + 0x00, 0x50, 0xf2, 0x02, 0x01, 0x01, 0x80, 0x00, 0x03, 0xa4, 0x00, 0x00, 0x27, 0xa4, 0x00, 0x00, + 0x42, 0x43, 0x5e, 0x00, 0x62, 0x32, 0x2f, 0x00, + + // WDI_TLV_BEACON_FRAME + 0x30, 0x00, + 0xb6, 0x00, + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Timestamp + 0x64, 0x00, // Beacon Inteval + 0x01, 0x00, // Capabilities + 0x00, 0x05, // SSID + '6', 'E', '_', '_', '1', + 0x01, 0x08, // Supported Rates + 0x82, 0x84, 0x0b, 0x16, 0x8c, 0x12, 0x98, 0xa4, + 0x03, 0x01, // DS Parameter Set + 0x24, + 0x05, 0x04, // TIM - DTIM 0 of 0 + 0x00, 0x02, 0x00, 0x6c, + 0x0b, 0x05, // QBSS Load Element 802.11e CCA Version + 0x00, 0x00, 0x00, 0x12, 0x7a, + 0x2a, 0x01, // ERP Information + 0x00, + 0x2d, 0x1a, // HT Capabilities (802.11n D1.10) + 0x76, 0x08, 0x17, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x32, 0x04, // Extended Supported Rates 24, 36, 48, 54 [Mbits/sec] + 0x30, 0x48, 0x60, 0x6c, + 0x3d, 0x16, // HT Information (802.11n D1.10) + 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc9, 0x30, // RNR IE + 0x04, 0x0c, // TBTT: 0x04 => B2=1(FilteredAP),B4-B7=0(TBTT Information Count=0+1) :: 0x0c = TBTT Length + 0x51, 0x01, // Operating Class = 81 (2.4 GHz), Channel = 1 + 0x00, 0x00, 0xA1, 0xB0, 0x01, 0x02, 0x01, 0x18, 0x3a, 0x94, 0x4f, 0x40, // 6E__1 on 2.4 GHz + 0x00, 0x0c, // TBTT: 0x00 => B4-B7=0(TBTT Information Count=0+1) :: 0x0c = TBTT Length + 0x83, 0x65, // Operating Class = 131, Channel = 101 + 0x00, 0x00, 0xA1, 0xB0, 0x01, 0x06, 0x01, 0x18, 0x3a, 0x94, 0x4f, 0x40, // 6E__1 on 6 Ghz + 0x0c, 0x0c, // TBTT: 0x0c => B2:3=1(FilteredAP:Reserved),B4-B7=f(TBTT Information Count=3+1) :: 0x0c = TBTT Length + 0x83, 0x85, // Operating Class = 131, Channel = 133 + 0x00, 0x00, 0xA1, 0xB0, 0x01, 0x06, 0x02, 0x18, 0x3a, 0x94, 0x4f, 0x40, // 6E__1 on 6 GHz + + 0xdd, 0x18, // Vendor Specific: Microsoft Corp.: WMM/WME: Parameter Element + 0x00, 0x50, 0xf2, 0x02, 0x01, 0x01, 0x80, 0x00, 0x03, 0xa4, 0x00, 0x00, 0x27, 0xa4, 0x00, 0x00, + 0x42, 0x43, 0x5e, 0x00, 0x62, 0x32, 0x2f, 0x00, + + // WDI_TLV_PHY_TYPE_LIST + 0x19, 0x00, + 0x04, 0x00, + 0x0A, 0x00, 0x00, 0x00, + +}; + +// +// 6E__1: 1/2 * 6 GHz Bss's +// +WDI_MAC_ADDRESS s_Connect_Addr_19_6G_S1a_6_Ghz = {0x00, 0xA1, 0xB0, 0x01, 0x06, 0x01}; +UCHAR s_TLV_BSS_Entry_19_6G_S1a_6_Ghz [] = +{ + // WDI_TLV_BSS_ENTRY + 0x08, 0x00, //Type + 0xC6, 0x00, //Len + + // WDI_TLV_BSSID + 0x02, 0x00, // Type + 0x06, 0x00, // Length + 0x00, 0xA1, 0xB0, 0x01, 0x06, 0x01, + + // WDI_TLV_BEACON_FRAME + 0x0a, 0x00, + 0x93, 0x00, + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Timestamp + 0x64, 0x00, // Beacon Inteval + 0x01, 0x00, // Capabilities + 0x00, 0x05, // SSID + '6', 'E', '_', '_', '1', + 0x01, 0x08, // Supported Rates + 0x8c, 0x12, 0x98, 0xa4, 0x30, 0x48, 0x60, 0x6c, + 0x05, 0x04, // TIM - DTIM 0 of 0 + 0x00, 0x02, 0x00, 0xa4, + 0x0b, 0x05, + 0x00, 0x00, 0x00, 0x12, 0x7a, + 0x2a, 0x01, // ERP Information + 0x00, + 0xdd, 0x18, // Vendor Specific: Microsoft Corp.: WMM/WME: Parameter Element + 0x00, 0x50, 0xf2, 0x02, 0x01, 0x01, 0x80, 0x00, 0x03, 0xa4, 0x00, 0x00, 0x27, 0xa4, 0x00, 0x00, + 0x42, 0x43, 0x5e, 0x00, 0x62, 0x32, 0x2f, 0x00, + 0xff, 0x03, // Ext Tag: HE Extended Capabilities (802.11ax/D3.0) + 0x3b, + 0xbd, 0x02, + 0xff, 0x27, // Ext Tag: HE Capabilities (802.11ax/D3.0) + 0x23, + 0xf7, 0x70, 0x99, 0x16, 0x64, 0x00, 0x0e, 0x30, 0x0c, 0xb6, 0x02, 0x1b, 0xb4, 0x0c, 0xcf, 0x30, + 0x00, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0x7b, 0x1c, 0xc7, 0x71, 0x1c, 0xc7, 0x71, + 0x1c, 0xc7, 0x71, 0x1c, 0xc7, 0x71, + 0xff, 0x0c, // Ext Tag: HE Operation (802.11ax/D3.0) + 0x24, + 0xf4, 0x3f, 0x02, 0x00, 0xf0, 0xff, 0x05, 0x03, 0x07, 0x0f, 0x00, + 0xff, 0x0e, // Ext Tag: MU EDCA Parameter Set + 0x26, + 0xc0, 0x07, 0xa4, 0x01, 0x23, 0xa4, 0x01, 0x42, 0x43, 0x01, 0x62, 0x32, 0x01, + + + // 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, + 0x65, 0x00, 0x00, 0x00, // Channel / Freq = 101 / 6445 MHz + 0x05, 0x00, 0x00, 0x00 // BandId +}; + +UCHAR s_TLV_Success_AssociationResult_19_6G_S1a_6_Ghz[] = +{ + // WDI_TLV_ASSOCIATION_RESULT + 0x35, 0x00, + 0xfD, 0x01, + + // WDI_TLV_BSSID + 0x02, 0x00, + 0x06, 0x00, + 0x00, 0xA1, 0xB0, 0x01, 0x06, 0x01, + + // WDI_TLV_ASSOCIATION_RESULT_PARAMETERS + 0x2D, 0x00, + 0x30, 0x00, + 0x00, 0x00, 0x00, 0x00, //Association Status + 0x00, 0x00, 0x00, 0x00, //Status Code + 0x00, //ReAssociationRequest + 0x07, 0x00, 0x00, 0x00, //AuthAlgorithm + 0x04, 0x00, 0x00, 0x00, //UnicastCipherAlgorithm + 0x04, 0x00, 0x00, 0x00, //MulticastDataCipherAlgorithm + 0x00, 0x00, 0x00, 0x00, //MulticastMgmtCipherAlgorithm + 0x00, //FourAddressSupported + 0x00, //Port Authorized + 0x00, // WMM QoS Enabled + 0x00, 0x00, 0x00, 0x00, //DSInfo + 0x00, 0x00, 0x00, 0x00, //AssociationComebackTime + 0x05, 0x00, 0x00, 0x00, // Band ID + 0x00, 0x00, 0x00, 0x00, // IHV Association Status + 0x00, 0x00, 0x00, 0x00, // DisableDataPathOffloadsScenario + + // WDI_TLV_ASSOCIATION_REQUEST_FRAME + 0x2E, 0x00, + 0x8E, 0x00, + + 0x01, 0x11, // Capabilities + 0xfa, 0x00, // Listen Interval + 0x00, 0x05, // SSID + '6', 'E', '_', '_', '1', + 0x01, 0x08, // Supported Rates + 0x8c, 0x12, 0x98, 0xa4, 0x30, 0x48, 0x60, 0x6c, + 0x21, 0x02, // Power Capability Min: 0, Max: 15 + 0x00, 0x0f, + 0x24, 0x32, // Supported Channels + 0x24, 0x01, 0x28, 0x01, 0x2c, 0x01, 0x30, 0x01, 0x34, 0x01, 0x38, 0x01, 0x3c, 0x01, 0x40, 0x01, + 0x64, 0x01, 0x68, 0x01, 0x6c, 0x01, 0x70, 0x01, 0x74, 0x01, 0x78, 0x01, 0x7c, 0x01, 0x80, 0x01, + 0x84, 0x01, 0x88, 0x01, 0x8c, 0x01, 0x90, 0x01, 0x95, 0x01, 0x99, 0x01, 0x9d, 0x01, 0xa1, 0x01, + 0xa5, 0x01, + 0x46, 0x05, // RM Enabled Capabilities + 0x72, 0x00, 0x00, 0x00, 0x00, + 0x7f, 0x0a, // Extended Capabilities + 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xdd, 0x07, // Vendor Specific: Microsoft Corp.: WMM/WME: Information Element + 0x00, 0x50, 0xf2, 0x02, 0x00, 0x01, 0x00, + 0xff, 0x1e, // Ext Tag: HE Capabilities (802.11ax/D3.0) + 0x23, + 0x01, 0x78, 0x20, 0x0a, 0xc0, 0x8b, 0x0e, 0x30, 0x02, 0x00, 0xfd, 0x09, 0x8c, 0x0e, 0xcf, 0xf2, + 0x00, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0x61, 0x1c, 0xc7, 0x71, + 0xff, 0x03, // Ext Tag: HE Extended Capabilities (802.11ax/D3.0) + 0x3b, + 0x7d, 0x02, + + // WDI_TLV_ASSOCIATION_RESPONSE_FRAME + 0x2F, 0x00, + 0x8A, 0x00, + + 0x01, 0x11, // Capabilities + 0x00, 0x00, // Status Code: Successful + 0x00, 0xc0, // Association ID: 0x0000 + 0x00, 0x05, // SSID Parameter set + '6', 'E', '_', '_', '1', + 0x01, 0x08, // Supported Rates + 0x8c, 0x12, 0x98, 0xa4, 0x30, 0x48, 0x60, 0x6c, + 0x03, 0x01, // DS Parameter set: Current Channel: 10 + 0x65, + 0x0b, 0x05, // QBSS Load Element 802.11e CCA Version + 0x00, 0x00, 0x00, 0x12, 0x7a, + 0x2a, 0x01, // ERP Information + 0x00, + 0xdd, 0x18, // Vendor Specific: Microsoft Corp.: WMM/WME: Parameter Element + 0x00, 0x50, 0xf2, 0x02, 0x01, 0x01, 0x80, 0x00, 0x03, 0xa4, 0x00, 0x00, 0x27, 0xa4, 0x00, 0x00, + 0x42, 0x43, 0x5e, 0x00, 0x62, 0x32, 0x2f, 0x00, + 0xff, 0x03, // Ext Tag: HE Extended Capabilities (802.11ax/D3.0) + 0x3b, + 0xbd, 0x02, + 0xff, 0x27, // Ext Tag: HE Capabilities (802.11ax/D3.0) + 0x23, + 0xf7, 0x70, 0x99, 0x16, 0x64, 0x00, 0x0e, 0x30, 0x0c, 0xb6, 0x02, 0x1b, 0xb4, 0x0c, 0xcf, 0x30, + 0x00, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0x7b, 0x1c, 0xc7, 0x71, 0x1c, 0xc7, 0x71, + 0x1c, 0xc7, 0x71, 0x1c, 0xc7, 0x71, + 0xff, 0x0c, // Ext Tag: HE Operation (802.11ax/D3.0) + 0x24, + 0xf4, 0x3f, 0x02, 0x00, 0xf0, 0xff, 0x05, 0x03, 0x07, 0x0f, 0x00, + 0xff, 0x0e, // Ext Tag: MU EDCA Parameter Set + 0x26, + 0xc0, 0x07, 0xa4, 0x01, 0x23, 0xa4, 0x01, 0x42, 0x43, 0x01, 0x62, 0x32, 0x01, + + // WDI_TLV_BEACON_FRAME + 0x0a, 0x00, + 0x93, 0x00, + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Timestamp + 0x64, 0x00, // Beacon Inteval + 0x01, 0x00, // Capabilities + 0x00, 0x05, // SSID + '6', 'E', '_', '_', '1', + 0x01, 0x08, // Supported Rates + 0x8c, 0x12, 0x98, 0xa4, 0x30, 0x48, 0x60, 0x6c, + 0x05, 0x04, // TIM - DTIM 0 of 0 + 0x00, 0x02, 0x00, 0xa4, + 0x0b, 0x05, + 0x00, 0x00, 0x00, 0x12, 0x7a, + 0x2a, 0x01, // ERP Information + 0x65, + 0xdd, 0x18, // Vendor Specific: Microsoft Corp.: WMM/WME: Parameter Element + 0x00, 0x50, 0xf2, 0x02, 0x01, 0x01, 0x80, 0x00, 0x03, 0xa4, 0x00, 0x00, 0x27, 0xa4, 0x00, 0x00, + 0x42, 0x43, 0x5e, 0x00, 0x62, 0x32, 0x2f, 0x00, + 0xff, 0x03, // Ext Tag: HE Extended Capabilities (802.11ax/D3.0) + 0x3b, + 0xbd, 0x02, + 0xff, 0x27, // Ext Tag: HE Capabilities (802.11ax/D3.0) + 0x23, + 0xf7, 0x70, 0x99, 0x16, 0x64, 0x00, 0x0e, 0x30, 0x0c, 0xb6, 0x02, 0x1b, 0xb4, 0x0c, 0xcf, 0x30, + 0x00, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0x7b, 0x1c, 0xc7, 0x71, 0x1c, 0xc7, 0x71, + 0x1c, 0xc7, 0x71, 0x1c, 0xc7, 0x71, + 0xff, 0x0c, // Ext Tag: HE Operation (802.11ax/D3.0) + 0x24, + 0xf4, 0x3f, 0x02, 0x00, 0xf0, 0xff, 0x05, 0x03, 0x07, 0x0f, 0x00, + 0xff, 0x0e, // Ext Tag: MU EDCA Parameter Set + 0x26, + 0xc0, 0x07, 0xa4, 0x01, 0x23, 0xa4, 0x01, 0x42, 0x43, 0x01, 0x62, 0x32, 0x01, + + + // WDI_TLV_PHY_TYPE_LIST + 0x19, 0x00, + 0x04, 0x00, + 0x0A, 0x00, 0x00, 0x00, + +}; + +// +// 6E__1: 2/2 * 6 GHz Bss's +// +WDI_MAC_ADDRESS s_Connect_Addr_20_6G_S1b_6_Ghz = {0x00, 0xA1, 0xB0, 0x01, 0x06, 0x02}; +UCHAR s_TLV_BSS_Entry_20_6G_S1b_6_Ghz [] = +{ + // WDI_TLV_BSS_ENTRY + 0x08, 0x00, //Type + 0xC6, 0x00, //Len + + // WDI_TLV_BSSID + 0x02, 0x00, // Type + 0x06, 0x00, // Length + 0x00, 0xA1, 0xB0, 0x01, 0x06, 0x02, + + // WDI_TLV_BEACON_FRAME + 0x0a, 0x00, + 0x93, 0x00, + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Timestamp + 0x64, 0x00, // Beacon Inteval + 0x01, 0x00, // Capabilities + 0x00, 0x05, // SSID + '6', 'E', '_', '_', '1', + 0x01, 0x08, // Supported Rates + 0x8c, 0x12, 0x98, 0xa4, 0x30, 0x48, 0x60, 0x6c, + 0x05, 0x04, // TIM - DTIM 0 of 0 + 0x00, 0x02, 0x00, 0xa4, + 0x0b, 0x05, + 0x00, 0x00, 0x00, 0x12, 0x7a, + 0x2a, 0x01, // ERP Information + 0x00, + 0xdd, 0x18, // Vendor Specific: Microsoft Corp.: WMM/WME: Parameter Element + 0x00, 0x50, 0xf2, 0x02, 0x01, 0x01, 0x80, 0x00, 0x03, 0xa4, 0x00, 0x00, 0x27, 0xa4, 0x00, 0x00, + 0x42, 0x43, 0x5e, 0x00, 0x62, 0x32, 0x2f, 0x00, + 0xff, 0x03, // Ext Tag: HE Extended Capabilities (802.11ax/D3.0) + 0x3b, + 0xbd, 0x02, + 0xff, 0x27, // Ext Tag: HE Capabilities (802.11ax/D3.0) + 0x23, + 0xf7, 0x70, 0x99, 0x16, 0x64, 0x00, 0x0e, 0x30, 0x0c, 0xb6, 0x02, 0x1b, 0xb4, 0x0c, 0xcf, 0x30, + 0x00, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0x7b, 0x1c, 0xc7, 0x71, 0x1c, 0xc7, 0x71, + 0x1c, 0xc7, 0x71, 0x1c, 0xc7, 0x71, + 0xff, 0x0c, // Ext Tag: HE Operation (802.11ax/D3.0) + 0x24, + 0xf4, 0x3f, 0x02, 0x00, 0xf0, 0xff, 0x05, 0x03, 0x07, 0x0f, 0x00, + 0xff, 0x0e, // Ext Tag: MU EDCA Parameter Set + 0x26, + 0xc0, 0x07, 0xa4, 0x01, 0x23, 0xa4, 0x01, 0x42, 0x43, 0x01, 0x62, 0x32, 0x01, + + + // 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, + 0x85, 0x00, 0x00, 0x00, // Channel / Freq = 133 / 6605 MHz + 0x05, 0x00, 0x00, 0x00 // BandId +}; + +UCHAR s_TLV_Success_AssociationResult_20_6G_S1b_6_Ghz[] = +{ + // WDI_TLV_ASSOCIATION_RESULT + 0x35, 0x00, + 0xFD, 0x01, + + // WDI_TLV_BSSID + 0x02, 0x00, + 0x06, 0x00, + 0x00, 0xA1, 0xB0, 0x01, 0x06, 0x02, + + // WDI_TLV_ASSOCIATION_RESULT_PARAMETERS + 0x2D, 0x00, + 0x30, 0x00, + 0x00, 0x00, 0x00, 0x00, //Association Status + 0x00, 0x00, 0x00, 0x00, //Status Code + 0x00, //ReAssociationRequest + 0x07, 0x00, 0x00, 0x00, //AuthAlgorithm + 0x04, 0x00, 0x00, 0x00, //UnicastCipherAlgorithm + 0x04, 0x00, 0x00, 0x00, //MulticastDataCipherAlgorithm + 0x00, 0x00, 0x00, 0x00, //MulticastMgmtCipherAlgorithm + 0x00, //FourAddressSupported + 0x00, //Port Authorized + 0x00, // WMM QoS Enabled + 0x00, 0x00, 0x00, 0x00, //DSInfo + 0x00, 0x00, 0x00, 0x00, //AssociationComebackTime + 0x05, 0x00, 0x00, 0x00, // Band ID + 0x00, 0x00, 0x00, 0x00, // IHV Association Status + 0x00, 0x00, 0x00, 0x00, // DisableDataPathOffloadsScenario + + // WDI_TLV_ASSOCIATION_REQUEST_FRAME + 0x2E, 0x00, + 0x8E, 0x00, + + 0x01, 0x11, // Capabilities + 0xfa, 0x00, // Listen Interval + 0x00, 0x05, // SSID + '6', 'E', '_', '_', '1', + 0x01, 0x08, // Supported Rates + 0x8c, 0x12, 0x98, 0xa4, 0x30, 0x48, 0x60, 0x6c, + 0x21, 0x02, // Power Capability Min: 0, Max: 15 + 0x00, 0x0f, + 0x24, 0x32, // Supported Channels + 0x24, 0x01, 0x28, 0x01, 0x2c, 0x01, 0x30, 0x01, 0x34, 0x01, 0x38, 0x01, 0x3c, 0x01, 0x40, 0x01, + 0x64, 0x01, 0x68, 0x01, 0x6c, 0x01, 0x70, 0x01, 0x74, 0x01, 0x78, 0x01, 0x7c, 0x01, 0x80, 0x01, + 0x84, 0x01, 0x88, 0x01, 0x8c, 0x01, 0x90, 0x01, 0x95, 0x01, 0x99, 0x01, 0x9d, 0x01, 0xa1, 0x01, + 0xa5, 0x01, + 0x46, 0x05, // RM Enabled Capabilities + 0x72, 0x00, 0x00, 0x00, 0x00, + 0x7f, 0x0a, // Extended Capabilities + 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xdd, 0x07, // Vendor Specific: Microsoft Corp.: WMM/WME: Information Element + 0x00, 0x50, 0xf2, 0x02, 0x00, 0x01, 0x00, + 0xff, 0x1e, // Ext Tag: HE Capabilities (802.11ax/D3.0) + 0x23, + 0x01, 0x78, 0x20, 0x0a, 0xc0, 0x8b, 0x0e, 0x30, 0x02, 0x00, 0xfd, 0x09, 0x8c, 0x0e, 0xcf, 0xf2, + 0x00, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0x61, 0x1c, 0xc7, 0x71, + 0xff, 0x03, // Ext Tag: HE Extended Capabilities (802.11ax/D3.0) + 0x3b, + 0x7d, 0x02, + + // WDI_TLV_ASSOCIATION_RESPONSE_FRAME + 0x2F, 0x00, + 0x8A, 0x00, + + 0x01, 0x11, // Capabilities + 0x00, 0x00, // Status Code: Successful + 0x00, 0xc0, // Association ID: 0x0000 + 0x00, 0x05, // SSID Parameter set + '6', 'E', '_', '_', '1', + 0x01, 0x08, // Supported Rates + 0x8c, 0x12, 0x98, 0xa4, 0x30, 0x48, 0x60, 0x6c, + 0x03, 0x01, // DS Parameter set: Current Channel: 10 + 0x85, + 0x0b, 0x05, // QBSS Load Element 802.11e CCA Version + 0x00, 0x00, 0x00, 0x12, 0x7a, + 0x2a, 0x01, // ERP Information + 0x00, + 0xdd, 0x18, // Vendor Specific: Microsoft Corp.: WMM/WME: Parameter Element + 0x00, 0x50, 0xf2, 0x02, 0x01, 0x01, 0x80, 0x00, 0x03, 0xa4, 0x00, 0x00, 0x27, 0xa4, 0x00, 0x00, + 0x42, 0x43, 0x5e, 0x00, 0x62, 0x32, 0x2f, 0x00, + 0xff, 0x03, // Ext Tag: HE Extended Capabilities (802.11ax/D3.0) + 0x3b, + 0xbd, 0x02, + 0xff, 0x27, // Ext Tag: HE Capabilities (802.11ax/D3.0) + 0x23, + 0xf7, 0x70, 0x99, 0x16, 0x64, 0x00, 0x0e, 0x30, 0x0c, 0xb6, 0x02, 0x1b, 0xb4, 0x0c, 0xcf, 0x30, + 0x00, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0x7b, 0x1c, 0xc7, 0x71, 0x1c, 0xc7, 0x71, + 0x1c, 0xc7, 0x71, 0x1c, 0xc7, 0x71, + 0xff, 0x0c, // Ext Tag: HE Operation (802.11ax/D3.0) + 0x24, + 0xf4, 0x3f, 0x02, 0x00, 0xf0, 0xff, 0x05, 0x03, 0x07, 0x0f, 0x00, + 0xff, 0x0e, // Ext Tag: MU EDCA Parameter Set + 0x26, + 0xc0, 0x07, 0xa4, 0x01, 0x23, 0xa4, 0x01, 0x42, 0x43, 0x01, 0x62, 0x32, 0x01, + + // WDI_TLV_BEACON_FRAME + 0x0a, 0x00, + 0x93, 0x00, + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Timestamp + 0x64, 0x00, // Beacon Inteval + 0x01, 0x00, // Capabilities + 0x00, 0x05, // SSID + '6', 'E', '_', '_', '1', + 0x01, 0x08, // Supported Rates + 0x8c, 0x12, 0x98, 0xa4, 0x30, 0x48, 0x60, 0x6c, + 0x05, 0x04, // TIM - DTIM 0 of 0 + 0x00, 0x02, 0x00, 0xa4, + 0x0b, 0x05, + 0x00, 0x00, 0x00, 0x12, 0x7a, + 0x2a, 0x01, // ERP Information + 0x00, + 0xdd, 0x18, // Vendor Specific: Microsoft Corp.: WMM/WME: Parameter Element + 0x00, 0x50, 0xf2, 0x02, 0x01, 0x01, 0x80, 0x00, 0x03, 0xa4, 0x00, 0x00, 0x27, 0xa4, 0x00, 0x00, + 0x42, 0x43, 0x5e, 0x00, 0x62, 0x32, 0x2f, 0x00, + 0xff, 0x03, // Ext Tag: HE Extended Capabilities (802.11ax/D3.0) + 0x3b, + 0xbd, 0x02, + 0xff, 0x27, // Ext Tag: HE Capabilities (802.11ax/D3.0) + 0x23, + 0xf7, 0x70, 0x99, 0x16, 0x64, 0x00, 0x0e, 0x30, 0x0c, 0xb6, 0x02, 0x1b, 0xb4, 0x0c, 0xcf, 0x30, + 0x00, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0x7b, 0x1c, 0xc7, 0x71, 0x1c, 0xc7, 0x71, + 0x1c, 0xc7, 0x71, 0x1c, 0xc7, 0x71, + 0xff, 0x0c, // Ext Tag: HE Operation (802.11ax/D3.0) + 0x24, + 0xf4, 0x3f, 0x02, 0x00, 0xf0, 0xff, 0x05, 0x03, 0x07, 0x0f, 0x00, + 0xff, 0x0e, // Ext Tag: MU EDCA Parameter Set + 0x26, + 0xc0, 0x07, 0xa4, 0x01, 0x23, 0xa4, 0x01, 0x42, 0x43, 0x01, 0x62, 0x32, 0x01, + + + // WDI_TLV_PHY_TYPE_LIST + 0x19, 0x00, + 0x04, 0x00, + 0x0A, 0x00, 0x00, 0x00, + +}; + +//=============================================================================== +// SIX_G: 6E__2: +// (1 * 2.4 GHz) + (1 * 5 GHz) + (1 * 6 GHz) +// 2.4 GHz: +// S2_24_1: S2_5_1 (In+Out) + [S2_6_2 (Out)] +// 5 GHz: +// S2_5_1: S2_24_1 (In+Out) + S2_6_1 (Out) + [S2_6_2 (Out)] +// 6 GHz: +// S2_6_1: S2_5_1 (In) +//=============================================================================== + +// +// 6E__2: 1 * 2.4 GHz Bss's +// 2 RNR IEs with 1 entry each: Band:Channel = [5:44] + [6:101] +// +WDI_MAC_ADDRESS s_Connect_Addr_21_6G_S2_2_4_Ghz = {0x00, 0xA1, 0xB0, 0x02, 0x24, 0x01}; +UCHAR s_TLV_BSS_Entry_21_6G_S2_2_4_Ghz [] = +{ + // WDI_TLV_BSS_ENTRY + 0x08, 0x00, //Type + 0xD3, 0x00, //Len + + // WDI_TLV_BSSID + 0x02, 0x00, // Type + 0x06, 0x00, // Length + 0x00, 0xA1, 0xB0, 0x02, 0x02, 0x01, + + // WDI_TLV_BEACON_FRAME + 0x0a, 0x00, + 0xA0, 0x00, + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Timestamp + 0x64, 0x00, // Beacon Inteval + 0x01, 0x00, // Capabilities + 0x00, 0x05, // SSID + '6', 'E', '_', '_', '2', + 0x01, 0x08, // Supported Rates + 0x82, 0x84, 0x0b, 0x16, 0x8c, 0x12, 0x98, 0xa4, + 0x03, 0x01, // DS Parameter Set + 0x06, + 0x05, 0x04, // TIM - DTIM 0 of 0 + 0x00, 0x02, 0x00, 0x6c, + 0x0b, 0x05, // QBSS Load Element 802.11e CCA Version + 0x00, 0x00, 0x00, 0x12, 0x7a, + 0x2a, 0x01, // ERP Information + 0x00, + 0x2d, 0x1a, // HT Capabilities (802.11n D1.10) + 0x76, 0x08, 0x17, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x32, 0x04, // Extended Supported Rates 24, 36, 48, 54 [Mbits/sec] + 0x30, 0x48, 0x60, 0x6c, + 0x3d, 0x16, // HT Information (802.11n D1.10) + 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + + 0xc9, 0x0c, // RNR IE + 0x04, 0x08, // TBTT: 0x04 => B2=1(FilteredAP),B4-B7=0(TBTT Information Count=0+1) :: 0x08 = TBTT Length + 0x73, 0x2e, // Operating Class = 115 (5 GHz), Channel = 44 + 0x00, 0x00, 0xA1, 0xB0, 0x02, 0x05, 0x01, 0x40, // 6E__2 on 5 GHz + 0xc9, 0x0c, // RNR IE + 0x00, 0x08, // TBTT: 0x00 => B4-B7=0(TBTT Information Count=0+1) :: 0x08 = TBTT Length + 0x83, 0x65, // Operating Class = 131, Channel = 101 + 0x00, 0x00, 0xA1, 0xB0, 0x02, 0x06, 0x02, 0x42, // 6E__2 on 6 Ghz (Sabe Ssid) + + 0xdd, 0x18, // Vendor Specific: Microsoft Corp.: WMM/WME: Parameter Element + 0x00, 0x50, 0xf2, 0x02, 0x01, 0x01, 0x80, 0x00, 0x03, 0xa4, 0x00, 0x00, 0x27, 0xa4, 0x00, 0x00, + 0x42, 0x43, 0x5e, 0x00, 0x62, 0x32, 0x2f, 0x00, + + // 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, + 0x06, 0x00, 0x00, 0x00, // Channel / Freq = 2437 MHz + 0x01, 0x00, 0x00, 0x00 // BandId +}; + +UCHAR s_TLV_Success_AssociationResult_21_6G_S2_2_4_Ghz[] = +{ + // WDI_TLV_ASSOCIATION_RESULT + 0x35, 0x00, + 0xF5, 0x01, + + // WDI_TLV_BSSID + 0x02, 0x00, + 0x06, 0x00, + 0x00, 0xA1, 0xB0, 0x02, 0x02, 0x01, + + // WDI_TLV_ASSOCIATION_RESULT_PARAMETERS + 0x2D, 0x00, + 0x30, 0x00, + 0x00, 0x00, 0x00, 0x00, //Association Status + 0x00, 0x00, 0x00, 0x00, //Status Code + 0x00, //ReAssociationRequest + 0x07, 0x00, 0x00, 0x00, //AuthAlgorithm + 0x04, 0x00, 0x00, 0x00, //UnicastCipherAlgorithm + 0x04, 0x00, 0x00, 0x00, //MulticastDataCipherAlgorithm + 0x00, 0x00, 0x00, 0x00, //MulticastMgmtCipherAlgorithm + 0x00, //FourAddressSupported + 0x00, //Port Authorized + 0x00, // WMM QoS Enabled + 0x00, 0x00, 0x00, 0x00, //DSInfo + 0x00, 0x00, 0x00, 0x00, //AssociationComebackTime + 0x01, 0x00, 0x00, 0x00, // Band ID + 0x00, 0x00, 0x00, 0x00, // IHV Association Status + 0x00, 0x00, 0x00, 0x00, // DisableDataPathOffloadsScenario + + // WDI_TLV_ASSOCIATION_REQUEST_FRAME + 0x2E, 0x00, + 0x8B, 0x00, + + 0x01, 0x11, // Capabilities + 0xfa, 0x00, // Listen Interval + 0x00, 0x05, // SSID + '6', 'E', '_', '_', '2', + 0x01, 0x08, // Supported Rates + 0x82, 0x84, 0x0b, 0x16, 0x8c, 0x12, 0x98, 0xa4, + 0x21, 0x02, // Power Capability Min: 0, Max: 15 + 0x00, 0x0f, + 0x24, 0x32, // Supported Channels + 0x24, 0x01, 0x28, 0x01, 0x2c, 0x01, 0x30, 0x01, 0x34, 0x01, 0x38, 0x01, 0x3c, 0x01, 0x40, 0x01, + 0x64, 0x01, 0x68, 0x01, 0x6c, 0x01, 0x70, 0x01, 0x74, 0x01, 0x78, 0x01, 0x7c, 0x01, 0x80, 0x01, + 0x84, 0x01, 0x88, 0x01, 0x8c, 0x01, 0x90, 0x01, 0x95, 0x01, 0x99, 0x01, 0x9d, 0x01, 0xa1, 0x01, + 0xa5, 0x01, + 0x2d, 0x1a, // HT Capabilities (802.11n D1.10) + 0xa5, 0x09, 0x17, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x32, 0x04, // Extended Supported Rates + 0x30, 0x48, 0x60, 0x6c, + 0x46, 0x05, // RM Enabled Capabilities + 0x72, 0x00, 0x00, 0x00, 0x00, + 0x7f, 0x0a, // Extended Capabilities + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, + 0xdd, 0x07, // Vendor Specific: Microsoft Corp.: WMM/WME: Information Element + 0x00, 0x50, 0xf2, 0x02, 0x00, 0x01, 0x00, + + // WDI_TLV_ASSOCIATION_RESPONSE_FRAME + 0x2F, 0x00, + 0x78, 0x00, + + 0x01, 0x11, // Capabilities + 0x00, 0x00, // Status Code: Successful + 0x00, 0xc0, // Association ID: 0x0000 + 0x00, 0x05, // SSID Parameter set + 0x53, 0x53, 0x49, 0x44, 0x31, + 0x01, 0x08, // Supported Rates + 0x82, 0x84, 0x0b, 0x16, 0x8c, 0x12, 0x98, 0xa4, + 0x03, 0x01, // DS Parameter set: Current Channel: 10 + 0x06, + 0x0b, 0x05, // QBSS Load Element 802.11e CCA Version + 0x00, 0x00, 0x00, 0x12, 0x7a, + 0x2a, 0x01, // ERP Information + 0x00, + 0x2d, 0x1a, // HT Capabilities (802.11n D1.10) + 0x76, 0x08, 0x17, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x32, 0x04, // Extended Supported Rates 24, 36, 48, 54 [Mbit/sec] + 0x30, 0x48, 0x60, 0x6c, + 0x3d, 0x16, // HT Information (802.11n D1.10) + 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xdd, 0x18, // Vendor Specific: Microsoft Corp.: WMM/WME: Parameter Element + 0x00, 0x50, 0xf2, 0x02, 0x01, 0x01, 0x80, 0x00, 0x03, 0xa4, 0x00, 0x00, 0x27, 0xa4, 0x00, 0x00, + 0x42, 0x43, 0x5e, 0x00, 0x62, 0x32, 0x2f, 0x00, + + // WDI_TLV_BEACON_FRAME + 0x30, 0x00, + 0xa0, 0x00, + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Timestamp + 0x64, 0x00, // Beacon Inteval + 0x01, 0x00, // Capabilities + 0x00, 0x05, // SSID + '6', 'E', '_', '_', '2', + 0x01, 0x08, // Supported Rates + 0x82, 0x84, 0x0b, 0x16, 0x8c, 0x12, 0x98, 0xa4, + 0x03, 0x01, // DS Parameter Set + 0x06, + 0x05, 0x04, // TIM - DTIM 0 of 0 + 0x00, 0x02, 0x00, 0x6c, + 0x0b, 0x05, // QBSS Load Element 802.11e CCA Version + 0x00, 0x00, 0x00, 0x12, 0x7a, + 0x2a, 0x01, // ERP Information + 0x00, + 0x2d, 0x1a, // HT Capabilities (802.11n D1.10) + 0x76, 0x08, 0x17, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x32, 0x04, // Extended Supported Rates 24, 36, 48, 54 [Mbits/sec] + 0x30, 0x48, 0x60, 0x6c, + 0x3d, 0x16, // HT Information (802.11n D1.10) + 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + + 0xc9, 0x0c, // RNR IE + 0x04, 0x08, // TBTT: 0x04 => B2=1(FilteredAP),B4-B7=0(TBTT Information Count=0+1) :: 0x08 = TBTT Length + 0x73, 0x2e, // Operating Class = 115 (5 GHz), Channel = 44 + 0x00, 0x00, 0xA1, 0xB0, 0x02, 0x05, 0x01, 0x40, // 6E__2 on 5 GHz + 0xc9, 0x0c, // RNR IE + 0x00, 0x08, // TBTT: 0x00 => B4-B7=0(TBTT Information Count=0+1) :: 0x08 = TBTT Length + 0x83, 0x65, // Operating Class = 131, Channel = 101 + 0x00, 0x00, 0xA1, 0xB0, 0x02, 0x06, 0x02, 0x42, // 6E__2 on 6 Ghz (Sabe Ssid) + + 0xdd, 0x18, // Vendor Specific: Microsoft Corp.: WMM/WME: Parameter Element + 0x00, 0x50, 0xf2, 0x02, 0x01, 0x01, 0x80, 0x00, 0x03, 0xa4, 0x00, 0x00, 0x27, 0xa4, 0x00, 0x00, + 0x42, 0x43, 0x5e, 0x00, 0x62, 0x32, 0x2f, 0x00, + + // WDI_TLV_PHY_TYPE_LIST + 0x19, 0x00, + 0x04, 0x00, + 0x0A, 0x00, 0x00, 0x00, + +}; + +// +// 6E__2: 1 * 5 GHz Bss's +// 3 RNR IEs with 1 entry each: Band:Channel = [2.4:6] + [6:101] + [6:133] +// +WDI_MAC_ADDRESS s_Connect_Addr_22_6G_S2_5_Ghz = {0x00, 0xA1, 0xB0, 0x02, 0x05, 0x01}; +UCHAR s_TLV_BSS_Entry_22_6G_S2_5_Ghz [] = +{ + // WDI_TLV_BSS_ENTRY + 0x08, 0x00, //Type + 0xed, 0x00, //Len + + // WDI_TLV_BSSID + 0x02, 0x00, // Type + 0x06, 0x00, // Length + 0x00, 0xA1, 0xB0, 0x02, 0x05, 0x01, + + // WDI_TLV_BEACON_FRAME + 0x0a, 0x00, + 0xba, 0x00, + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Timestamp + 0x64, 0x00, // Beacon Inteval + 0x01, 0x00, // Capabilities + 0x00, 0x05, // SSID + '6', 'E', '_', '_', '2', + 0x01, 0x08, // Supported Rates + 0x82, 0x84, 0x0b, 0x16, 0x8c, 0x12, 0x98, 0xa4, + 0x03, 0x01, // DS Parameter Set + 0x2c, + 0x05, 0x04, // TIM - DTIM 0 of 0 + 0x00, 0x02, 0x00, 0x6c, + 0x0b, 0x05, // QBSS Load Element 802.11e CCA Version + 0x00, 0x00, 0x00, 0x12, 0x7a, + 0x2a, 0x01, // ERP Information + 0x00, + 0x2d, 0x1a, // HT Capabilities (802.11n D1.10) + 0x76, 0x08, 0x17, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x32, 0x04, // Extended Supported Rates 24, 36, 48, 54 [Mbits/sec] + 0x30, 0x48, 0x60, 0x6c, + 0x3d, 0x16, // HT Information (802.11n D1.10) + 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + + 0xc9, 0x10, // RNR IE + 0x04, 0x0c, // 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, 0x00, 0xA1, 0xB0, 0x02, 0x02, 0x01, 0xa2, 0x6b, 0x9d, 0xd6, 0x40, // 6E__2 on 2.4 GHz + 0xc9, 0x10, // RNR IE + 0x00, 0x0c, // TBTT: 0x00 => B4-B7=0(TBTT Information Count=0+1) :: 0x0c = TBTT Length + 0x83, 0x65, // Operating Class = 131, (6 GHz) Channel = 101 + 0x00, 0x00, 0xA1, 0xB0, 0x02, 0x06, 0x01, 0xa2, 0x6b, 0x9d, 0xd6, 0x42, // 6E__2 on 6 Ghz + 0xc9, 0x10, // RNR IE + 0x0c, 0x0c, // TBTT: 0x0c => B2:3=1(FilteredAP:Reserved),B4-B7=f(TBTT Information Count=3+1) :: 0x0c = TBTT Length + 0x83, 0x85, // Operating Class = 131, (6 GHz) Channel = 133 + 0x00, 0x00, 0xA1, 0xB0, 0x02, 0x06, 0x02, 0xa2, 0x6b, 0x9d, 0xd6, 0x00, // 6E__2 on 6 GHz + + 0xdd, 0x18, // Vendor Specific: Microsoft Corp.: WMM/WME: Parameter Element + 0x00, 0x50, 0xf2, 0x02, 0x01, 0x01, 0x80, 0x00, 0x03, 0xa4, 0x00, 0x00, 0x27, 0xa4, 0x00, 0x00, + 0x42, 0x43, 0x5e, 0x00, 0x62, 0x32, 0x2f, 0x00, + + // 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, + 0x2c, 0x00, 0x00, 0x00, // Channel / Freq = 44 / 5220 MHz + 0x02, 0x00, 0x00, 0x00 // BandId +}; + +UCHAR s_TLV_Success_AssociationResult_22_6G_S2_5_Ghz[] = +{ + // WDI_TLV_ASSOCIATION_RESULT + 0x35, 0x00, + 0x0F, 0x02, + + // WDI_TLV_BSSID + 0x02, 0x00, + 0x06, 0x00, + 0x00, 0xA1, 0xB0, 0x02, 0x05, 0x01, + + // WDI_TLV_ASSOCIATION_RESULT_PARAMETERS + 0x2D, 0x00, + 0x30, 0x00, + 0x00, 0x00, 0x00, 0x00, //Association Status + 0x00, 0x00, 0x00, 0x00, //Status Code + 0x00, //ReAssociationRequest + 0x07, 0x00, 0x00, 0x00, //AuthAlgorithm + 0x04, 0x00, 0x00, 0x00, //UnicastCipherAlgorithm + 0x04, 0x00, 0x00, 0x00, //MulticastDataCipherAlgorithm + 0x00, 0x00, 0x00, 0x00, //MulticastMgmtCipherAlgorithm + 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, + 0x8B, 0x00, + + 0x01, 0x11, // Capabilities + 0xfa, 0x00, // Listen Interval + 0x00, 0x05, // SSID + '6', 'E', '_', '_', '2', + 0x01, 0x08, // Supported Rates + 0x82, 0x84, 0x0b, 0x16, 0x8c, 0x12, 0x98, 0xa4, + 0x21, 0x02, // Power Capability Min: 0, Max: 15 + 0x00, 0x0f, + 0x24, 0x32, // Supported Channels + 0x24, 0x01, 0x28, 0x01, 0x2c, 0x01, 0x30, 0x01, 0x34, 0x01, 0x38, 0x01, 0x3c, 0x01, 0x40, 0x01, + 0x64, 0x01, 0x68, 0x01, 0x6c, 0x01, 0x70, 0x01, 0x74, 0x01, 0x78, 0x01, 0x7c, 0x01, 0x80, 0x01, + 0x84, 0x01, 0x88, 0x01, 0x8c, 0x01, 0x90, 0x01, 0x95, 0x01, 0x99, 0x01, 0x9d, 0x01, 0xa1, 0x01, + 0xa5, 0x01, + 0x2d, 0x1a, // HT Capabilities (802.11n D1.10) + 0xa5, 0x09, 0x17, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x32, 0x04, // Extended Supported Rates + 0x30, 0x48, 0x60, 0x6c, + 0x46, 0x05, // RM Enabled Capabilities + 0x72, 0x00, 0x00, 0x00, 0x00, + 0x7f, 0x0a, // Extended Capabilities + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, + 0xdd, 0x07, // Vendor Specific: Microsoft Corp.: WMM/WME: Information Element + 0x00, 0x50, 0xf2, 0x02, 0x00, 0x01, 0x00, + + // WDI_TLV_ASSOCIATION_RESPONSE_FRAME + 0x2F, 0x00, + 0x78, 0x00, + + 0x01, 0x11, // Capabilities + 0x00, 0x00, // Status Code: Successful + 0x00, 0xc0, // Association ID: 0x0000 + 0x00, 0x05, // SSID Parameter set + 0x53, 0x53, 0x49, 0x44, 0x31, + 0x01, 0x08, // Supported Rates + 0x82, 0x84, 0x0b, 0x16, 0x8c, 0x12, 0x98, 0xa4, + 0x03, 0x01, // DS Parameter set: Current Channel: 10 + 0x2c, + 0x0b, 0x05, // QBSS Load Element 802.11e CCA Version + 0x00, 0x00, 0x00, 0x12, 0x7a, + 0x2a, 0x01, // ERP Information + 0x00, + 0x2d, 0x1a, // HT Capabilities (802.11n D1.10) + 0x76, 0x08, 0x17, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x32, 0x04, // Extended Supported Rates 24, 36, 48, 54 [Mbit/sec] + 0x30, 0x48, 0x60, 0x6c, + 0x3d, 0x16, // HT Information (802.11n D1.10) + 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xdd, 0x18, // Vendor Specific: Microsoft Corp.: WMM/WME: Parameter Element + 0x00, 0x50, 0xf2, 0x02, 0x01, 0x01, 0x80, 0x00, 0x03, 0xa4, 0x00, 0x00, 0x27, 0xa4, 0x00, 0x00, + 0x42, 0x43, 0x5e, 0x00, 0x62, 0x32, 0x2f, 0x00, + + // WDI_TLV_BEACON_FRAME + 0x30, 0x00, + 0xba, 0x00, + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Timestamp + 0x64, 0x00, // Beacon Inteval + 0x01, 0x00, // Capabilities + 0x00, 0x05, // SSID + '6', 'E', '_', '_', '2', + 0x01, 0x08, // Supported Rates + 0x82, 0x84, 0x0b, 0x16, 0x8c, 0x12, 0x98, 0xa4, + 0x03, 0x01, // DS Parameter Set + 0x2c, + 0x05, 0x04, // TIM - DTIM 0 of 0 + 0x00, 0x02, 0x00, 0x6c, + 0x0b, 0x05, // QBSS Load Element 802.11e CCA Version + 0x00, 0x00, 0x00, 0x12, 0x7a, + 0x2a, 0x01, // ERP Information + 0x00, + 0x2d, 0x1a, // HT Capabilities (802.11n D1.10) + 0x76, 0x08, 0x17, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x32, 0x04, // Extended Supported Rates 24, 36, 48, 54 [Mbits/sec] + 0x30, 0x48, 0x60, 0x6c, + 0x3d, 0x16, // HT Information (802.11n D1.10) + 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc9, 0x10, // RNR IE + 0x04, 0x0c, // 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, 0x00, 0xA1, 0xB0, 0x02, 0x02, 0x01, 0xa2, 0x6b, 0x9d, 0xd6, 0x40, // 6E__2 on 2.4 GHz + 0xc9, 0x10, // RNR IE + 0x00, 0x0c, // TBTT: 0x00 => B4-B7=0(TBTT Information Count=0+1) :: 0x0c = TBTT Length + 0x83, 0x65, // Operating Class = 131, (6 GHz) Channel = 101 + 0x00, 0x00, 0xA1, 0xB0, 0x02, 0x06, 0x01, 0xa2, 0x6b, 0x9d, 0xd6, 0x42, // 6E__2 on 6 Ghz + 0xc9, 0x10, // RNR IE + 0x0c, 0x0c, // TBTT: 0x0c => B2:3=1(FilteredAP:Reserved),B4-B7=f(TBTT Information Count=3+1) :: 0x0c = TBTT Length + 0x83, 0x85, // Operating Class = 131, (6 GHz) Channel = 133 + 0x00, 0x00, 0xA1, 0xB0, 0x02, 0x06, 0x02, 0xa2, 0x6b, 0x9d, 0xd6, 0x00, // 6E__2 on 6 GHz + + + 0xdd, 0x18, // Vendor Specific: Microsoft Corp.: WMM/WME: Parameter Element + 0x00, 0x50, 0xf2, 0x02, 0x01, 0x01, 0x80, 0x00, 0x03, 0xa4, 0x00, 0x00, 0x27, 0xa4, 0x00, 0x00, + 0x42, 0x43, 0x5e, 0x00, 0x62, 0x32, 0x2f, 0x00, + + // WDI_TLV_PHY_TYPE_LIST + 0x19, 0x00, + 0x04, 0x00, + 0x0A, 0x00, 0x00, 0x00, + +}; + +// +// 6E__2: 1 * 6 GHz Bss's +// +WDI_MAC_ADDRESS s_Connect_Addr_23_6G_S2_6_Ghz = {0x00, 0xA1, 0xB0, 0x02, 0x06, 0x01}; +UCHAR s_TLV_BSS_Entry_23_6G_S2_6_Ghz [] = +{ + // WDI_TLV_BSS_ENTRY + 0x08, 0x00, //Type + 0xC6, 0x00, //Len + + // WDI_TLV_BSSID + 0x02, 0x00, // Type + 0x06, 0x00, // Length + 0x00, 0xA1, 0xB0, 0x02, 0x06, 0x01, + + // WDI_TLV_BEACON_FRAME + 0x0a, 0x00, + 0x93, 0x00, + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Timestamp + 0x64, 0x00, // Beacon Inteval + 0x01, 0x00, // Capabilities + 0x00, 0x05, // SSID + '6', 'E', '_', '_', '2', + 0x01, 0x08, // Supported Rates + 0x8c, 0x12, 0x98, 0xa4, 0x30, 0x48, 0x60, 0x6c, + 0x05, 0x04, // TIM - DTIM 0 of 0 + 0x00, 0x02, 0x00, 0xa4, + 0x0b, 0x05, + 0x00, 0x00, 0x00, 0x12, 0x7a, + 0x2a, 0x01, // ERP Information + 0x00, + 0xdd, 0x18, // Vendor Specific: Microsoft Corp.: WMM/WME: Parameter Element + 0x00, 0x50, 0xf2, 0x02, 0x01, 0x01, 0x80, 0x00, 0x03, 0xa4, 0x00, 0x00, 0x27, 0xa4, 0x00, 0x00, + 0x42, 0x43, 0x5e, 0x00, 0x62, 0x32, 0x2f, 0x00, + 0xff, 0x03, // Ext Tag: HE Extended Capabilities (802.11ax/D3.0) + 0x3b, + 0xbd, 0x02, + 0xff, 0x27, // Ext Tag: HE Capabilities (802.11ax/D3.0) + 0x23, + 0xf7, 0x70, 0x99, 0x16, 0x64, 0x00, 0x0e, 0x30, 0x0c, 0xb6, 0x02, 0x1b, 0xb4, 0x0c, 0xcf, 0x30, + 0x00, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0x7b, 0x1c, 0xc7, 0x71, 0x1c, 0xc7, 0x71, + 0x1c, 0xc7, 0x71, 0x1c, 0xc7, 0x71, + 0xff, 0x0c, // Ext Tag: HE Operation (802.11ax/D3.0) + 0x24, + 0xf4, 0x3f, 0x02, 0x00, 0xf0, 0xff, 0x05, 0x03, 0x07, 0x0f, 0x00, + 0xff, 0x0e, // Ext Tag: MU EDCA Parameter Set + 0x26, + 0xc0, 0x07, 0xa4, 0x01, 0x23, 0xa4, 0x01, 0x42, 0x43, 0x01, 0x62, 0x32, 0x01, + + + // 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, + 0x79, 0x00, 0x00, 0x00, // Channel / Freq = 121 / 6545 MHz + 0x05, 0x00, 0x00, 0x00 // BandId +}; + +UCHAR s_TLV_Success_AssociationResult_23_6G_S2_6_Ghz[] = +{ + // WDI_TLV_ASSOCIATION_RESULT + 0x35, 0x00, + 0xFD, 0x01, + + // WDI_TLV_BSSID + 0x02, 0x00, + 0x06, 0x00, + 0x00, 0xA1, 0xB0, 0x02, 0x06, 0x01, + + // WDI_TLV_ASSOCIATION_RESULT_PARAMETERS + 0x2D, 0x00, + 0x30, 0x00, + 0x00, 0x00, 0x00, 0x00, //Association Status + 0x00, 0x00, 0x00, 0x00, //Status Code + 0x00, //ReAssociationRequest + 0x07, 0x00, 0x00, 0x00, //AuthAlgorithm + 0x04, 0x00, 0x00, 0x00, //UnicastCipherAlgorithm + 0x04, 0x00, 0x00, 0x00, //MulticastDataCipherAlgorithm + 0x00, 0x00, 0x00, 0x00, //MulticastMgmtCipherAlgorithm + 0x00, //FourAddressSupported + 0x00, //Port Authorized + 0x00, // WMM QoS Enabled + 0x00, 0x00, 0x00, 0x00, //DSInfo + 0x00, 0x00, 0x00, 0x00, //AssociationComebackTime + 0x05, 0x00, 0x00, 0x00, // Band ID + 0x00, 0x00, 0x00, 0x00, // IHV Association Status + 0x00, 0x00, 0x00, 0x00, // DisableDataPathOffloadsScenario + + // WDI_TLV_ASSOCIATION_REQUEST_FRAME + 0x2E, 0x00, + 0x8E, 0x00, + + 0x01, 0x11, // Capabilities + 0xfa, 0x00, // Listen Interval + 0x00, 0x05, // SSID + '6', 'E', '_', '_', '2', + 0x01, 0x08, // Supported Rates + 0x8c, 0x12, 0x98, 0xa4, 0x30, 0x48, 0x60, 0x6c, + 0x21, 0x02, // Power Capability Min: 0, Max: 15 + 0x00, 0x0f, + 0x24, 0x32, // Supported Channels + 0x24, 0x01, 0x28, 0x01, 0x2c, 0x01, 0x30, 0x01, 0x34, 0x01, 0x38, 0x01, 0x3c, 0x01, 0x40, 0x01, + 0x64, 0x01, 0x68, 0x01, 0x6c, 0x01, 0x70, 0x01, 0x74, 0x01, 0x78, 0x01, 0x7c, 0x01, 0x80, 0x01, + 0x84, 0x01, 0x88, 0x01, 0x8c, 0x01, 0x90, 0x01, 0x95, 0x01, 0x99, 0x01, 0x9d, 0x01, 0xa1, 0x01, + 0xa5, 0x01, + 0x46, 0x05, // RM Enabled Capabilities + 0x72, 0x00, 0x00, 0x00, 0x00, + 0x7f, 0x0a, // Extended Capabilities + 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xdd, 0x07, // Vendor Specific: Microsoft Corp.: WMM/WME: Information Element + 0x00, 0x50, 0xf2, 0x02, 0x00, 0x01, 0x00, + 0xff, 0x1e, // Ext Tag: HE Capabilities (802.11ax/D3.0) + 0x23, + 0x01, 0x78, 0x20, 0x0a, 0xc0, 0x8b, 0x0e, 0x30, 0x02, 0x00, 0xfd, 0x09, 0x8c, 0x0e, 0xcf, 0xf2, + 0x00, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0x61, 0x1c, 0xc7, 0x71, + 0xff, 0x03, // Ext Tag: HE Extended Capabilities (802.11ax/D3.0) + 0x3b, + 0x7d, 0x02, + + // WDI_TLV_ASSOCIATION_RESPONSE_FRAME + 0x2F, 0x00, + 0x8A, 0x00, + + 0x01, 0x11, // Capabilities + 0x00, 0x00, // Status Code: Successful + 0x00, 0xc0, // Association ID: 0x0000 + 0x00, 0x05, // SSID Parameter set + '6', 'E', '_', '_', '2', + 0x01, 0x08, // Supported Rates + 0x8c, 0x12, 0x98, 0xa4, 0x30, 0x48, 0x60, 0x6c, + 0x03, 0x01, // DS Parameter set: Current Channel: 10 + 0x79, + 0x0b, 0x05, // QBSS Load Element 802.11e CCA Version + 0x00, 0x00, 0x00, 0x12, 0x7a, + 0x2a, 0x01, // ERP Information + 0x00, + 0xdd, 0x18, // Vendor Specific: Microsoft Corp.: WMM/WME: Parameter Element + 0x00, 0x50, 0xf2, 0x02, 0x01, 0x01, 0x80, 0x00, 0x03, 0xa4, 0x00, 0x00, 0x27, 0xa4, 0x00, 0x00, + 0x42, 0x43, 0x5e, 0x00, 0x62, 0x32, 0x2f, 0x00, + 0xff, 0x03, // Ext Tag: HE Extended Capabilities (802.11ax/D3.0) + 0x3b, + 0xbd, 0x02, + 0xff, 0x27, // Ext Tag: HE Capabilities (802.11ax/D3.0) + 0x23, + 0xf7, 0x70, 0x99, 0x16, 0x64, 0x00, 0x0e, 0x30, 0x0c, 0xb6, 0x02, 0x1b, 0xb4, 0x0c, 0xcf, 0x30, + 0x00, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0x7b, 0x1c, 0xc7, 0x71, 0x1c, 0xc7, 0x71, + 0x1c, 0xc7, 0x71, 0x1c, 0xc7, 0x71, + 0xff, 0x0c, // Ext Tag: HE Operation (802.11ax/D3.0) + 0x24, + 0xf4, 0x3f, 0x02, 0x00, 0xf0, 0xff, 0x05, 0x03, 0x07, 0x0f, 0x00, + 0xff, 0x0e, // Ext Tag: MU EDCA Parameter Set + 0x26, + 0xc0, 0x07, 0xa4, 0x01, 0x23, 0xa4, 0x01, 0x42, 0x43, 0x01, 0x62, 0x32, 0x01, + + // WDI_TLV_BEACON_FRAME + 0x0a, 0x00, + 0x93, 0x00, + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Timestamp + 0x64, 0x00, // Beacon Inteval + 0x01, 0x00, // Capabilities + 0x00, 0x05, // SSID + '6', 'E', '_', '_', '2', + 0x01, 0x08, // Supported Rates + 0x8c, 0x12, 0x98, 0xa4, 0x30, 0x48, 0x60, 0x6c, + 0x05, 0x04, // TIM - DTIM 0 of 0 + 0x00, 0x02, 0x00, 0xa4, + 0x0b, 0x05, + 0x00, 0x00, 0x00, 0x12, 0x7a, + 0x2a, 0x01, // ERP Information + 0x00, + 0xdd, 0x18, // Vendor Specific: Microsoft Corp.: WMM/WME: Parameter Element + 0x00, 0x50, 0xf2, 0x02, 0x01, 0x01, 0x80, 0x00, 0x03, 0xa4, 0x00, 0x00, 0x27, 0xa4, 0x00, 0x00, + 0x42, 0x43, 0x5e, 0x00, 0x62, 0x32, 0x2f, 0x00, + 0xff, 0x03, // Ext Tag: HE Extended Capabilities (802.11ax/D3.0) + 0x3b, + 0xbd, 0x02, + 0xff, 0x27, // Ext Tag: HE Capabilities (802.11ax/D3.0) + 0x23, + 0xf7, 0x70, 0x99, 0x16, 0x64, 0x00, 0x0e, 0x30, 0x0c, 0xb6, 0x02, 0x1b, 0xb4, 0x0c, 0xcf, 0x30, + 0x00, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0x7b, 0x1c, 0xc7, 0x71, 0x1c, 0xc7, 0x71, + 0x1c, 0xc7, 0x71, 0x1c, 0xc7, 0x71, + 0xff, 0x0c, // Ext Tag: HE Operation (802.11ax/D3.0) + 0x24, + 0xf4, 0x3f, 0x02, 0x00, 0xf0, 0xff, 0x05, 0x03, 0x07, 0x0f, 0x00, + 0xff, 0x0e, // Ext Tag: MU EDCA Parameter Set + 0x26, + 0xc0, 0x07, 0xa4, 0x01, 0x23, 0xa4, 0x01, 0x42, 0x43, 0x01, 0x62, 0x32, 0x01, + + + // WDI_TLV_PHY_TYPE_LIST + 0x19, 0x00, + 0x04, 0x00, + 0x0A, 0x00, 0x00, 0x00, + +}; + +//=============================================================================== +// SIX_G: SSID3: +// (1 * 2.4 GHz) +// 2.4 GHz: +// S3_24_1: *S2_5_1 (Out)* +//=============================================================================== + +// +// SSID3: 1 * 2.4 GHz Bss's +// 2 RNR IEs with 1 entry each Band:Channel = [5:44 + 6:133] +// +WDI_MAC_ADDRESS s_Connect_Addr_24_6G_S3_2_4_Ghz = {0x00, 0xA1, 0xB0, 0x03, 0x02, 0x01}; +UCHAR s_TLV_BSS_Entry_24_6G_S3_2_4_Ghz [] = +{ + // WDI_TLV_BSS_ENTRY + 0x08, 0x00, //Type + 0xDB, 0x00, //Len + + // WDI_TLV_BSSID + 0x02, 0x00, // Type + 0x06, 0x00, // Length + 0x00, 0xA1, 0xB0, 0x03, 0x02, 0x01, + + // WDI_TLV_BEACON_FRAME + 0x0a, 0x00, + 0xa8, 0x00, + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Timestamp + 0x64, 0x00, // Beacon Inteval + 0x01, 0x00, // Capabilities + 0x00, 0x05, // SSID + '6', 'E', '_', '_', '3', + 0x01, 0x08, // Supported Rates + 0x82, 0x84, 0x0b, 0x16, 0x8c, 0x12, 0x98, 0xa4, + 0x03, 0x01, // DS Parameter Set + 0x0a, + 0x05, 0x04, // TIM - DTIM 0 of 0 + 0x00, 0x02, 0x00, 0x6c, + 0x0b, 0x05, // QBSS Load Element 802.11e CCA Version + 0x00, 0x00, 0x00, 0x12, 0x7a, + 0x2a, 0x01, // ERP Information + 0x00, + 0x2d, 0x1a, // HT Capabilities (802.11n D1.10) + 0x76, 0x08, 0x17, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x32, 0x04, // Extended Supported Rates 24, 36, 48, 54 [Mbits/sec] + 0x30, 0x48, 0x60, 0x6c, + 0x3d, 0x16, // HT Information (802.11n D1.10) + 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + + 0xc9, 0x10, // RNR IE + 0x00, 0x0c, // TBTT: 0x00,B4-B7=0(TBTT Information Count=0+1) :: 0x0c = TBTT Length + 0x73, 0x2e, // Operating Class = 115 (5 GHz), Channel = 44 + 0x00, 0x00, 0xA1, 0xB0, 0x02, 0x05, 0x01, 0xa2, 0x6b, 0x9d, 0xd6, 0x40, // 6E__2 on 5 GHz + 0xc9, 0x10, // RNR IE + 0x00, 0x0c, // TBTT: 0x00,B4-B7=0(TBTT Information Count=0+1) :: 0x0c = TBTT Length + 0x83, 0x85, // Operating Class = 131 (6 GHz), Channel = 133 + 0x00, 0x00, 0xA1, 0xB0, 0x02, 0x06, 0x02, 0xa2, 0x6b, 0x9d, 0xd6, 0x40, // 6E__2 on 6 GHz + + 0xdd, 0x18, // Vendor Specific: Microsoft Corp.: WMM/WME: Parameter Element + 0x00, 0x50, 0xf2, 0x02, 0x01, 0x01, 0x80, 0x00, 0x03, 0xa4, 0x00, 0x00, 0x27, 0xa4, 0x00, 0x00, + 0x42, 0x43, 0x5e, 0x00, 0x62, 0x32, 0x2f, 0x00, + + // 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, + 0x0B, 0x00, 0x00, 0x00, // Channel / Freq = 2457 MHz + 0x01, 0x00, 0x00, 0x00 // BandId +}; + +UCHAR s_TLV_Success_AssociationResult_24_6G_S3_2_4_Ghz[] = +{ + // WDI_TLV_ASSOCIATION_RESULT + 0x35, 0x00, + 0xFD, 0x01, + + // WDI_TLV_BSSID + 0x02, 0x00, + 0x06, 0x00, + 0x00, 0xA1, 0xB0, 0x03, 0x02, 0x01, + + // WDI_TLV_ASSOCIATION_RESULT_PARAMETERS + 0x2D, 0x00, + 0x30, 0x00, + 0x00, 0x00, 0x00, 0x00, //Association Status + 0x00, 0x00, 0x00, 0x00, //Status Code + 0x00, //ReAssociationRequest + 0x07, 0x00, 0x00, 0x00, //AuthAlgorithm + 0x04, 0x00, 0x00, 0x00, //UnicastCipherAlgorithm + 0x04, 0x00, 0x00, 0x00, //MulticastDataCipherAlgorithm + 0x00, 0x00, 0x00, 0x00, //MulticastMgmtCipherAlgorithm + 0x00, //FourAddressSupported + 0x00, //Port Authorized + 0x00, // WMM QoS Enabled + 0x00, 0x00, 0x00, 0x00, //DSInfo + 0x00, 0x00, 0x00, 0x00, //AssociationComebackTime + 0x01, 0x00, 0x00, 0x00, // Band ID + 0x00, 0x00, 0x00, 0x00, // IHV Association Status + 0x00, 0x00, 0x00, 0x00, // DisableDataPathOffloadsScenario + + // WDI_TLV_ASSOCIATION_REQUEST_FRAME + 0x2E, 0x00, + 0x8B, 0x00, + + 0x01, 0x11, // Capabilities + 0xfa, 0x00, // Listen Interval + 0x00, 0x05, // SSID + '6', 'E', '_', '_', '3', + 0x01, 0x08, // Supported Rates + 0x82, 0x84, 0x0b, 0x16, 0x8c, 0x12, 0x98, 0xa4, + 0x21, 0x02, // Power Capability Min: 0, Max: 15 + 0x00, 0x0f, + 0x24, 0x32, // Supported Channels + 0x24, 0x01, 0x28, 0x01, 0x2c, 0x01, 0x30, 0x01, 0x34, 0x01, 0x38, 0x01, 0x3c, 0x01, 0x40, 0x01, + 0x64, 0x01, 0x68, 0x01, 0x6c, 0x01, 0x70, 0x01, 0x74, 0x01, 0x78, 0x01, 0x7c, 0x01, 0x80, 0x01, + 0x84, 0x01, 0x88, 0x01, 0x8c, 0x01, 0x90, 0x01, 0x95, 0x01, 0x99, 0x01, 0x9d, 0x01, 0xa1, 0x01, + 0xa5, 0x01, + 0x2d, 0x1a, // HT Capabilities (802.11n D1.10) + 0xa5, 0x09, 0x17, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x32, 0x04, // Extended Supported Rates + 0x30, 0x48, 0x60, 0x6c, + 0x46, 0x05, // RM Enabled Capabilities + 0x72, 0x00, 0x00, 0x00, 0x00, + 0x7f, 0x0a, // Extended Capabilities + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, + 0xdd, 0x07, // Vendor Specific: Microsoft Corp.: WMM/WME: Information Element + 0x00, 0x50, 0xf2, 0x02, 0x00, 0x01, 0x00, + + // WDI_TLV_ASSOCIATION_RESPONSE_FRAME + 0x2F, 0x00, + 0x78, 0x00, + + 0x01, 0x11, // Capabilities + 0x00, 0x00, // Status Code: Successful + 0x00, 0xc0, // Association ID: 0x0000 + 0x00, 0x05, // SSID Parameter set + 0x53, 0x53, 0x49, 0x44, 0x31, + 0x01, 0x08, // Supported Rates + 0x82, 0x84, 0x0b, 0x16, 0x8c, 0x12, 0x98, 0xa4, + 0x03, 0x01, // DS Parameter set: Current Channel: 10 + 0x0a, + 0x0b, 0x05, // QBSS Load Element 802.11e CCA Version + 0x00, 0x00, 0x00, 0x12, 0x7a, + 0x2a, 0x01, // ERP Information + 0x00, + 0x2d, 0x1a, // HT Capabilities (802.11n D1.10) + 0x76, 0x08, 0x17, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x32, 0x04, // Extended Supported Rates 24, 36, 48, 54 [Mbit/sec] + 0x30, 0x48, 0x60, 0x6c, + 0x3d, 0x16, // HT Information (802.11n D1.10) + 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xdd, 0x18, // Vendor Specific: Microsoft Corp.: WMM/WME: Parameter Element + 0x00, 0x50, 0xf2, 0x02, 0x01, 0x01, 0x80, 0x00, 0x03, 0xa4, 0x00, 0x00, 0x27, 0xa4, 0x00, 0x00, + 0x42, 0x43, 0x5e, 0x00, 0x62, 0x32, 0x2f, 0x00, + + // WDI_TLV_BEACON_FRAME + 0x30, 0x00, + 0xa8, 0x00, + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Timestamp + 0x64, 0x00, // Beacon Inteval + 0x01, 0x00, // Capabilities + 0x00, 0x05, // SSID + '6', 'E', '_', '_', '3', + 0x01, 0x08, // Supported Rates + 0x82, 0x84, 0x0b, 0x16, 0x8c, 0x12, 0x98, 0xa4, + 0x03, 0x01, // DS Parameter Set + 0x0a, + 0x05, 0x04, // TIM - DTIM 0 of 0 + 0x00, 0x02, 0x00, 0x6c, + 0x0b, 0x05, // QBSS Load Element 802.11e CCA Version + 0x00, 0x00, 0x00, 0x12, 0x7a, + 0x2a, 0x01, // ERP Information + 0x00, + 0x2d, 0x1a, // HT Capabilities (802.11n D1.10) + 0x76, 0x08, 0x17, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x32, 0x04, // Extended Supported Rates 24, 36, 48, 54 [Mbits/sec] + 0x30, 0x48, 0x60, 0x6c, + 0x3d, 0x16, // HT Information (802.11n D1.10) + 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + + 0xc9, 0x10, // RNR IE + 0x00, 0x0c, // TBTT: 0x00,B4-B7=0(TBTT Information Count=0+1) :: 0x0c = TBTT Length + 0x73, 0x2e, // Operating Class = 115 (5 GHz), Channel = 44 + 0x00, 0x00, 0xA1, 0xB0, 0x02, 0x05, 0x01, 0xa2, 0x6b, 0x9d, 0xd6, 0x40, // 6E__2 on 5 GHz + 0xc9, 0x10, // RNR IE + 0x00, 0x0c, // TBTT: 0x00,B4-B7=0(TBTT Information Count=0+1) :: 0x0c = TBTT Length + 0x83, 0x85, // Operating Class = 131 (6 GHz), Channel = 133 + 0x00, 0x00, 0xA1, 0xB0, 0x02, 0x06, 0x02, 0xa2, 0x6b, 0x9d, 0xd6, 0x40, // 6E__2 on 6 GHz + + 0xdd, 0x18, // Vendor Specific: Microsoft Corp.: WMM/WME: Parameter Element + 0x00, 0x50, 0xf2, 0x02, 0x01, 0x01, 0x80, 0x00, 0x03, 0xa4, 0x00, 0x00, 0x27, 0xa4, 0x00, 0x00, + 0x42, 0x43, 0x5e, 0x00, 0x62, 0x32, 0x2f, 0x00, + + // WDI_TLV_PHY_TYPE_LIST + 0x19, 0x00, + 0x04, 0x00, + 0x0A, 0x00, 0x00, 0x00, + +}; + + +//=============================================================================== +// SIX_G: SSID4 (non-colocated AP): +// (1 * 6 GHz) +// 6 GHz: +// S4_6_1: +//=============================================================================== + +// +// SSID4: 1 * 6 GHz Bss's +// +WDI_MAC_ADDRESS s_Connect_Addr_25_6G_S4_6_Ghz = {0x00, 0xA1, 0xB0, 0x04, 0x06, 0x01}; +UCHAR s_TLV_BSS_Entry_25_6G_S4_6_Ghz [] = +{ + // WDI_TLV_BSS_ENTRY + 0x08, 0x00, //Type + 0xC6, 0x00, //Len + + // WDI_TLV_BSSID + 0x02, 0x00, // Type + 0x06, 0x00, // Length + 0x00, 0xA1, 0xB0, 0x04, 0x06, 0x01, + + // WDI_TLV_BEACON_FRAME + 0x0a, 0x00, + 0x93, 0x00, + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Timestamp + 0x64, 0x00, // Beacon Inteval + 0x01, 0x00, // Capabilities + 0x00, 0x05, // SSID + '6', 'E', '_', '_', '4', + 0x01, 0x08, // Supported Rates + 0x8c, 0x12, 0x98, 0xa4, 0x30, 0x48, 0x60, 0x6c, + 0x05, 0x04, // TIM - DTIM 0 of 0 + 0x00, 0x02, 0x00, 0xa4, + 0x0b, 0x05, + 0x00, 0x00, 0x00, 0x12, 0x7a, + 0x2a, 0x01, // ERP Information + 0x00, + 0xdd, 0x18, // Vendor Specific: Microsoft Corp.: WMM/WME: Parameter Element + 0x00, 0x50, 0xf2, 0x02, 0x01, 0x01, 0x80, 0x00, 0x03, 0xa4, 0x00, 0x00, 0x27, 0xa4, 0x00, 0x00, + 0x42, 0x43, 0x5e, 0x00, 0x62, 0x32, 0x2f, 0x00, + 0xff, 0x03, // Ext Tag: HE Extended Capabilities (802.11ax/D3.0) + 0x3b, + 0xbd, 0x02, + 0xff, 0x27, // Ext Tag: HE Capabilities (802.11ax/D3.0) + 0x23, + 0xf7, 0x70, 0x99, 0x16, 0x64, 0x00, 0x0e, 0x30, 0x0c, 0xb6, 0x02, 0x1b, 0xb4, 0x0c, 0xcf, 0x30, + 0x00, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0x7b, 0x1c, 0xc7, 0x71, 0x1c, 0xc7, 0x71, + 0x1c, 0xc7, 0x71, 0x1c, 0xc7, 0x71, + 0xff, 0x0c, // Ext Tag: HE Operation (802.11ax/D3.0) + 0x24, + 0xf4, 0x3f, 0x02, 0x00, 0xf0, 0xff, 0x05, 0x03, 0x07, 0x0f, 0x00, + 0xff, 0x0e, // Ext Tag: MU EDCA Parameter Set + 0x26, + 0xc0, 0x07, 0xa4, 0x01, 0x23, 0xa4, 0x01, 0x42, 0x43, 0x01, 0x62, 0x32, 0x01, + + + // 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, + 0xe5, 0x00, 0x00, 0x00, // Channel / Freq = 229 / 7085 MHz + 0x05, 0x00, 0x00, 0x00 // BandId +}; + +UCHAR s_TLV_Success_AssociationResult_25_6G_S4_6_Ghz[] = +{ + // WDI_TLV_ASSOCIATION_RESULT + 0x35, 0x00, + 0xFD, 0x01, + + // WDI_TLV_BSSID + 0x02, 0x00, + 0x06, 0x00, + 0x00, 0xA1, 0xB0, 0x04, 0x06, 0x01, + + // WDI_TLV_ASSOCIATION_RESULT_PARAMETERS + 0x2D, 0x00, + 0x30, 0x00, + 0x00, 0x00, 0x00, 0x00, //Association Status + 0x00, 0x00, 0x00, 0x00, //Status Code + 0x00, //ReAssociationRequest + 0x07, 0x00, 0x00, 0x00, //AuthAlgorithm + 0x04, 0x00, 0x00, 0x00, //UnicastCipherAlgorithm + 0x04, 0x00, 0x00, 0x00, //MulticastDataCipherAlgorithm + 0x00, 0x00, 0x00, 0x00, //MulticastMgmtCipherAlgorithm + 0x00, //FourAddressSupported + 0x00, //Port Authorized + 0x00, // WMM QoS Enabled + 0x00, 0x00, 0x00, 0x00, //DSInfo + 0x00, 0x00, 0x00, 0x00, //AssociationComebackTime + 0x05, 0x00, 0x00, 0x00, // Band ID + 0x00, 0x00, 0x00, 0x00, // IHV Association Status + 0x00, 0x00, 0x00, 0x00, // DisableDataPathOffloadsScenario + + // WDI_TLV_ASSOCIATION_REQUEST_FRAME + 0x2E, 0x00, + 0x8E, 0x00, + + 0x01, 0x11, // Capabilities + 0xfa, 0x00, // Listen Interval + 0x00, 0x05, // SSID + '6', 'E', '_', '_', '4', + 0x01, 0x08, // Supported Rates + 0x8c, 0x12, 0x98, 0xa4, 0x30, 0x48, 0x60, 0x6c, + 0x21, 0x02, // Power Capability Min: 0, Max: 15 + 0x00, 0x0f, + 0x24, 0x32, // Supported Channels + 0x24, 0x01, 0x28, 0x01, 0x2c, 0x01, 0x30, 0x01, 0x34, 0x01, 0x38, 0x01, 0x3c, 0x01, 0x40, 0x01, + 0x64, 0x01, 0x68, 0x01, 0x6c, 0x01, 0x70, 0x01, 0x74, 0x01, 0x78, 0x01, 0x7c, 0x01, 0x80, 0x01, + 0x84, 0x01, 0x88, 0x01, 0x8c, 0x01, 0x90, 0x01, 0x95, 0x01, 0x99, 0x01, 0x9d, 0x01, 0xa1, 0x01, + 0xa5, 0x01, + 0x46, 0x05, // RM Enabled Capabilities + 0x72, 0x00, 0x00, 0x00, 0x00, + 0x7f, 0x0a, // Extended Capabilities + 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xdd, 0x07, // Vendor Specific: Microsoft Corp.: WMM/WME: Information Element + 0x00, 0x50, 0xf2, 0x02, 0x00, 0x01, 0x00, + 0xff, 0x1e, // Ext Tag: HE Capabilities (802.11ax/D3.0) + 0x23, + 0x01, 0x78, 0x20, 0x0a, 0xc0, 0x8b, 0x0e, 0x30, 0x02, 0x00, 0xfd, 0x09, 0x8c, 0x0e, 0xcf, 0xf2, + 0x00, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0x61, 0x1c, 0xc7, 0x71, + 0xff, 0x03, // Ext Tag: HE Extended Capabilities (802.11ax/D3.0) + 0x3b, + 0x7d, 0x02, + + // WDI_TLV_ASSOCIATION_RESPONSE_FRAME + 0x2F, 0x00, + 0x8A, 0x00, + + 0x01, 0x11, // Capabilities + 0x00, 0x00, // Status Code: Successful + 0x00, 0xc0, // Association ID: 0x0000 + 0x00, 0x05, // SSID Parameter set + '6', 'E', '_', '_', '2', + 0x01, 0x08, // Supported Rates + 0x8c, 0x12, 0x98, 0xa4, 0x30, 0x48, 0x60, 0x6c, + 0x03, 0x01, // DS Parameter set: Current Channel: 10 + 0xe5, + 0x0b, 0x05, // QBSS Load Element 802.11e CCA Version + 0x00, 0x00, 0x00, 0x12, 0x7a, + 0x2a, 0x01, // ERP Information + 0x00, + 0xdd, 0x18, // Vendor Specific: Microsoft Corp.: WMM/WME: Parameter Element + 0x00, 0x50, 0xf2, 0x02, 0x01, 0x01, 0x80, 0x00, 0x03, 0xa4, 0x00, 0x00, 0x27, 0xa4, 0x00, 0x00, + 0x42, 0x43, 0x5e, 0x00, 0x62, 0x32, 0x2f, 0x00, + 0xff, 0x03, // Ext Tag: HE Extended Capabilities (802.11ax/D3.0) + 0x3b, + 0xbd, 0x02, + 0xff, 0x27, // Ext Tag: HE Capabilities (802.11ax/D3.0) + 0x23, + 0xf7, 0x70, 0x99, 0x16, 0x64, 0x00, 0x0e, 0x30, 0x0c, 0xb6, 0x02, 0x1b, 0xb4, 0x0c, 0xcf, 0x30, + 0x00, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0x7b, 0x1c, 0xc7, 0x71, 0x1c, 0xc7, 0x71, + 0x1c, 0xc7, 0x71, 0x1c, 0xc7, 0x71, + 0xff, 0x0c, // Ext Tag: HE Operation (802.11ax/D3.0) + 0x24, + 0xf4, 0x3f, 0x02, 0x00, 0xf0, 0xff, 0x05, 0x03, 0x07, 0x0f, 0x00, + 0xff, 0x0e, // Ext Tag: MU EDCA Parameter Set + 0x26, + 0xc0, 0x07, 0xa4, 0x01, 0x23, 0xa4, 0x01, 0x42, 0x43, 0x01, 0x62, 0x32, 0x01, + + // WDI_TLV_BEACON_FRAME + 0x0a, 0x00, + 0x93, 0x00, + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Timestamp + 0x64, 0x00, // Beacon Inteval + 0x01, 0x00, // Capabilities + 0x00, 0x05, // SSID + '6', 'E', '_', '_', '4', + 0x01, 0x08, // Supported Rates + 0x8c, 0x12, 0x98, 0xa4, 0x30, 0x48, 0x60, 0x6c, + 0x05, 0x04, // TIM - DTIM 0 of 0 + 0x00, 0x02, 0x00, 0xa4, + 0x0b, 0x05, + 0x00, 0x00, 0x00, 0x12, 0x7a, + 0x2a, 0x01, // ERP Information + 0x00, + 0xdd, 0x18, // Vendor Specific: Microsoft Corp.: WMM/WME: Parameter Element + 0x00, 0x50, 0xf2, 0x02, 0x01, 0x01, 0x80, 0x00, 0x03, 0xa4, 0x00, 0x00, 0x27, 0xa4, 0x00, 0x00, + 0x42, 0x43, 0x5e, 0x00, 0x62, 0x32, 0x2f, 0x00, + 0xff, 0x03, // Ext Tag: HE Extended Capabilities (802.11ax/D3.0) + 0x3b, + 0xbd, 0x02, + 0xff, 0x27, // Ext Tag: HE Capabilities (802.11ax/D3.0) + 0x23, + 0xf7, 0x70, 0x99, 0x16, 0x64, 0x00, 0x0e, 0x30, 0x0c, 0xb6, 0x02, 0x1b, 0xb4, 0x0c, 0xcf, 0x30, + 0x00, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0xfa, 0xff, 0x7b, 0x1c, 0xc7, 0x71, 0x1c, 0xc7, 0x71, + 0x1c, 0xc7, 0x71, 0x1c, 0xc7, 0x71, + 0xff, 0x0c, // Ext Tag: HE Operation (802.11ax/D3.0) + 0x24, + 0xf4, 0x3f, 0x02, 0x00, 0xf0, 0xff, 0x05, 0x03, 0x07, 0x0f, 0x00, + 0xff, 0x0e, // Ext Tag: MU EDCA Parameter Set + 0x26, + 0xc0, 0x07, 0xa4, 0x01, 0x23, 0xa4, 0x01, 0x42, 0x43, 0x01, 0x62, 0x32, 0x01, + + + // WDI_TLV_PHY_TYPE_LIST + 0x19, 0x00, + 0x04, 0x00, + 0x0A, 0x00, 0x00, 0x00, + +}; + +//=============================================================================== +// WDI_OWE_RNR +//=============================================================================== + + +/// WDI_OWE_RNR +/// +/// Description +/// - Non-Transition mode OWE network +/// - Advertises Reduced Neighbor Reports (RNRs) for the OWE Transition Mode BSSes WDI_OWE_TM_OWE and WDI_OWE_TM_OPEN +/// - Note: The OWE TM BSSes do not advertise RNR IEs +/// - Definitions for these two Transition Mode networks follows this one +/// +/// Intention +/// - Test Non-Transition Mode OWE networks +/// - Test discovery of OWE Transition Mode network via RNR prior to receiving beacon or probe +/// - Since the networks are indicated in order during scans (i.e. the OWE TM networks will be indicated after this one) +/// it is expected that RNR for the OWE TM networks will be received before their beacons and probes. +/// +/// Expectation +/// - Scan results display WDI_OWE_RNR as an Enhanced Open network to which connections are supported +/// - The RNR will not effect connections to or display of OWE Transition Mode networks that it contains +/// +/// Limitations +/// - Connections to this network will fail because the driver does not OWE DH Handshake +WDI_MAC_ADDRESS s_ConnectAddr_26_OWE_With_RNR = {00, 0xA0, 0xB0, 0xC0, 0xD1, 0xFF}; +UCHAR s_TLV_BSS_Entry_26_OWE_With_RNR [] = +{ + // WDI_TLV_BSS_ENTRY + 0x08, 0x00, //Type + 0xB6, 0x00, //Len + + // WDI_TLV_BSSID + 0x02, 0x00, // Type + 0x06, 0x00, // Length + 0x00, 0xA0, 0xB0, 0xC0, 0xD1, 0xFF, + + // WDI_TLV_BEACON_FRAME + 0x0a, 0x00, + 0x83, 0x00, + + 0x22, 0x02, 0x2C, 0x01, 0x00, 0x00, 0x00, 0x00, // Timestamp + 0x64, 0x00, // Beacon Interval + 0x31, 0x04, // Capability + 0x00, 0x0B, // SSID + 'W', 'D', 'I', '_', 'O', 'W', 'E', '_', 'R', 'N', 'R', + 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 + 0x30, 0x1a, // RSN IE + 0x01, 0x00, // Version + 0x00, 0x0F, 0xAC, 0x04, // Group Cipher + 0x01, 0x00, // Pairwise Cipher Count + 0x00, 0x0F, 0xAC, 0x04, // Pairwise Cipher + 0x01, 0x00, // AKM Suite count + 0x00, 0x0F, 0xAC, 0x12, // AKM Suite - OWE + 0xC0, 0x00, // RSN Capability - MFP Req + Capable + 0x00, 0x00, + 0x00, 0x0F, 0xAC, 0x06, // Group Cipher + 0x32, 0x04, 0x0C, 0x12, 0x18, 0x60, // Extended Supported Rates + + 0xc9, 0x10, // RNR IE + 0x00, 0x0c, // TBTT: 0x00,B4-B7=0(TBTT Information Count=0+1) :: 0x0c = TBTT Length + 0x51, 0x0B, // Operating Class = 81 (2.4 GHz), Channel = B + 0x00, // TBTT Offset + 0x00, 0xA0, 0xB0, 0xC0, 0xD1, 0x00, // MAC Address --> OWE Transition Mode OWE (Defined below) + 0xFD, 0x1F, 0x3F, 0x49, // Short SSID for WDI_OWE_TM_OWE + 0x00, // BssParameters + + 0xc9, 0x10, // RNR IE + 0x00, 0x0c, // TBTT: 0x00,B4-B7=0(TBTT Information Count=0+1) :: 0x0c = TBTT Length + 0x51, 0x0B, // Operating Class = 81 (2.4 GHz), Channel = B + 0x00, // TBTT Offset + 0x00, 0xA0, 0xB0, 0xC0, 0xD1, 0x01, // MAC Address --> OWE Transition Mode Open (Defined below) + 0x21, 0x24, 0x6C, 0x85, // Short SSID for WDI_OWE_TM_OPEN + 0x00, // BssParameters + + 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, + 0x0B, 0x00, 0x00, 0x00, // Channel + 0x01, 0x00, 0x00, 0x00 // BandId +}; + +// Test client hasn't implemented OWE DH handshake, so just indicate assoc failure +UCHAR s_TLV_Failure_AssociationResult_26_OWE_With_RNR [] = +{ + // WDI_TLV_ASSOCIATION_RESULT + 0x35, 0x00, + 0x46, 0x00, + + // WDI_TLV_BSSID + 0x02, 0x00, + 0x06, 0x00, + 0x00, 0xA1, 0xB0, 0xC0, 0xD1, 0xFF, + + // WDI_TLV_ASSOCIATION_RESULT_PARAMETERS + 0x2D, 0x00, + 0x30, 0x00, + 0x01, 0x00, 0x00, 0x00, // Association Status: WDI_ASSOC_STATUS_FAILURE + 0x00, 0x00, 0x00, 0x00, // Status Code + 0x00, // ReAssociationRequest + 0x00, 0x00, 0x00, 0x00, // AuthAlgorithm + 0x00, 0x00, 0x00, 0x00, // UnicastCipherAlgorithm + 0x00, 0x00, 0x00, 0x00, // MulticastDataCipherAlgorithm + 0x00, 0x00, 0x00, 0x00, // MulticastMgmtCipherAlgorithm + 0x00, // FourAddressSupported + 0x00, // Port Authorized + 0x00, // WMM QoS Enabled + 0x00, 0x00, 0x00, 0x00, // DSInfo + 0x00, 0x00, 0x00, 0x00, // AssociationComebackTime + 0x00, 0x00, 0x00, 0x00, // Band ID + 0x00, 0x00, 0x00, 0x00, // IHV Association Status + 0x00, 0x00, 0x00, 0x00, // DisableDataPathOffloadsScenario + + // WDI_TLV_PHY_TYPE_LIST + 0x19, 0x00, + 0x04, 0x00, + 0x00, 0x00, 0x00, 0x00 +}; + +/// WDI_OWE_TM_OWE +/// Description +/// - OWE BSS of OWE Transition Mode network +/// - Auth Type is OWE +/// - Partner BSS is the OWE Transition Mode Open BSS "WDI_OWE_TM_OPEN" +/// - Per the spec, this network is hidden and contains an OWE TM element listing information about the partner BSS +/// - Listed in RNR of BSS WDI_OWE_RNR +/// - RNR IEs are not avertised by this BSS +/// +/// Intention +/// - Test OWE Transition Mode +/// - Test discovery of OWE Transition Mode network via RNR prior to receiving a beacon or probe +/// - Since the networks are indicated in order during scans, the RNR for this network will be received before its beacon. +/// +/// Expectation +/// - The OWE spec requires the STA to display the SSID of the Open BSS to the user for interoperability. User initiated connections to the SSID of the Open BSS +/// will initiate a connection to the OWE BSS and this is reflected in the security type in the UI. This allows STAs to view the same network SSID regardless of their +/// support for OWE, while also allowing the most secure connection to be made. +/// +/// - The UI will display: +/// - SSID: "WDI_OWE_TM_OPEN" (The SSID of the Open BSS) +/// - A hidden BSS may also be displayed, but only a single entry with an SSID is expected +/// - Security Description: "Enhanced Open" +/// - "Secured" or a lock icon should not be displayed +/// - No password prompt on connect +/// - "Connect" will initiate a connection to the OWE Transition Mode BSS Entry +/// - In the entry containing the BSSID of the OWE TM OWE BSS, "netsh wlan show networks mode=bss" displays +/// - SSID: "WDI_OWE_TM_OPEN" +/// - Authentication: OWE +/// - Encryption: CCMP +/// - MFP Required: 1 +/// +/// Limitations +/// - Connections to this network will fail because the driver does not OWE DH Handshake +WDI_MAC_ADDRESS s_ConnectAddr_27_OWE_TM_OWE = {0x00, 0xA0, 0xB0, 0xC0, 0xD1, 0x00}; +UCHAR s_TLV_BSS_Entry_27_OWE_TM_OWE [] = +{ + // WDI_TLV_BSS_ENTRY + 0x08, 0x00, //Type + 0xA1, 0x00, //Len + + // WDI_TLV_BSSID + 0x02, 0x00, // Type + 0x06, 0x00, // Length + 0x00, 0xA0, 0xB0, 0xC0, 0xD1, 0x00, + + // WDI_TLV_BEACON_FRAME + 0x0a, 0x00, + 0x6e, 0x00, + + 0x22, 0x02, 0x2C, 0x01, 0x00, 0x00, 0x00, 0x00, // Timestamp + 0x64, 0x00, // Beacon Interval + 0x31, 0x04, // Capability + 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 + 0x30, 0x1a, // RSN IE + 0x01, 0x00, // Version + 0x00, 0x0F, 0xAC, 0x04, // Group Cipher + 0x01, 0x00, // Pairwise Cipher Count + 0x00, 0x0F, 0xAC, 0x04, // Pairwise Cipher + 0x01, 0x00, // AKM Suite count + 0x00, 0x0F, 0xAC, 0x12, // AKM Suite - OWE + 0xC0, 0x00, // RSN Capability - MFP Req + Capable + 0x00, 0x00, + 0x00, 0x0F, 0xAC, 0x06, // Group Cipher + 0x32, 0x04, 0x0C, 0x12, 0x18, 0x60, // Extended Supported Rates + 0xDD, 0x09, 0x00, 0x10, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, // Vendor Specific + + 0xDD, 0x1A, // Vendor specific - OWE Transition Mode + 0x50, 0x6F, 0x9A, 0x1C, // WFA OUI + OWE TM OUI (0x1C) + 0x00, 0xA0, 0xB0, 0xC0, 0xD1, 0x01, // Partner BSS BSSID + 0x0F, // Partner BSS SSID Length + 'W', 'D', 'I', '_', 'O', 'W', 'E', '_', 'T', 'M', '_', 'O', 'P', 'E', 'N', // Partner BSS SSID + + // 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, + 0x0B, 0x00, 0x00, 0x00, // Channel + 0x01, 0x00, 0x00, 0x00 // BandId +}; + +// Test client hasn't implemented simulated OWE DH handshake, so just indicate assoc failure +UCHAR s_TLV_Failure_AssociationResult_27_OWE_TM_OWE [] = +{ + // WDI_TLV_ASSOCIATION_RESULT + 0x35, 0x00, + 0x46, 0x00, + + // WDI_TLV_BSSID + 0x02, 0x00, + 0x06, 0x00, + 0x00, 0xA1, 0xB0, 0xC0, 0xD1, 0x00, + + // WDI_TLV_ASSOCIATION_RESULT_PARAMETERS + 0x2D, 0x00, + 0x30, 0x00, + 0x01, 0x00, 0x00, 0x00, //Association Status: WDI_ASSOC_STATUS_FAILURE + 0x00, 0x00, 0x00, 0x00, //Status Code + 0x00, //ReAssociationRequest + 0x00, 0x00, 0x00, 0x00, //AuthAlgorithm + 0x00, 0x00, 0x00, 0x00, //UnicastCipherAlgorithm + 0x00, 0x00, 0x00, 0x00, //MulticastDataCipherAlgorithm + 0x00, 0x00, 0x00, 0x00, //MulticastMgmtCipherAlgorithm + 0x00, //FourAddressSupported + 0x00, //Port Authorized + 0x00, // WMM QoS Enabled + 0x00, 0x00, 0x00, 0x00, //DSInfo + 0x00, 0x00, 0x00, 0x00, //AssociationComebackTime + 0x00, 0x00, 0x00, 0x00, // Band ID + 0x00, 0x00, 0x00, 0x00, // IHV Association Status + 0x00, 0x00, 0x00, 0x00, // DisableDataPathOffloadsScenario + + // WDI_TLV_PHY_TYPE_LIST + 0x19, 0x00, + 0x04, 0x00, + 0x00, 0x00, 0x00, 0x00 +}; + +/// WDI_OWE_TM_OPEN +/// Description +/// - Open BSS of OWE Transition Mode network +/// - Open network +/// - Partner BSS is the OWE Transition Mode OWE BSS "WDI_OWE_TM_OWE" +/// - Per the spec, this network is hidden and contains an OWE TM element listing information about the partner BSS +/// - Listed in RNR of BSS WDI_OWE_RNR +/// - RNR IEs are not avertised by this BSS +/// +/// Intention +/// - Test OWE Transition Mode +/// - Test discovery of OWE Transition Mode network via RNR prior to receiving a beacon or probe +/// - Since the networks are indicated in order during scans, the RNR for this network will be received before its beacon. +/// +/// Expectation +/// - The OWE spec requires the STA to display the SSID of the Open BSS to the user for interoperability. User initiated connections to the SSID of the Open BSS +/// will initiate a connection to the OWE BSS and this is reflected in the security type in the UI. This allows STAs to view the same network SSID regardless of their +/// support for OWE, while also allowing the most secure connection to be made. +/// +/// - The UI will display: +/// - SSID: "WDI_OWE_TM_OPEN" (The SSID of the Open BSS) +/// - A hidden BSS may also be displayed, but only a single entry with an SSID is expected +/// - Security Description: "Enhanced Open" +/// - "Secured" or a lock icon should not be displayed +/// - No password prompt on connect +/// - "Connect" will initiate a connection to the OWE Transition Mode BSS Entry +/// - In the entry containing the BSSID of this BSS, "netsh wlan show networks mode=bss" displays +/// - SSID: (Hidden) +/// - Authentication: Open +/// - Encryption: None +/// +/// Limitations +/// - Connections to this network will fail because the driver does not OWE DH Handshake +WDI_MAC_ADDRESS s_ConnectAddr_28_OWE_TM_Open = {0x00, 0xA0, 0xB0, 0xC0, 0xD1, 0x01}; +UCHAR s_TLV_BSS_Entry_28_OWE_TM_Open_Beacon [] = +{ + // WDI_TLV_BSS_ENTRY + 0x08, 0x00, //Type + 0x95, 0x00, // Len + + // WDI_TLV_BSSID + 0x02, 0x00, // Type + 0x06, 0x00, // Length + 0x00, 0xA0, 0xB0, 0xC0, 0xD1, 0x01, + + // WDI_TLV_BEACON_FRAME + 0x0a, 0x00, + 0x62, 0x00, // Length + + 0x22, 0x02, 0x2C, 0x01, 0x00, 0x00, 0x00, 0x00, // Timestamp + 0x64, 0x00, // Beacon Interval + 0x00, 0x04, // Capability + 0x00, 0x0F, // SSID + 'W', 'D', 'I', '_', 'O', 'W', 'E', '_', 'T', 'M', '_', 'O', 'P', 'E', 'N', + 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 + 0x32, 0x04, 0x0C, 0x12, 0x18, 0x60, // Extended Supported Rates + 0xDD, 0x09, 0x00, 0x10, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, // Vendor Specific + + 0xDD, 0x19, // Vendor specific - OWE Transition Mode + 0x50, 0x6F, 0x9A, 0x1C, // WFA OUI + OWE TM OUI (0x1C) + 0x00, 0xA0, 0xB0, 0xC0, 0xD1, 0x00, // Partner BSS BSSID + 0x0E, // Partner BSS SSID Length + 'W', 'D', 'I', '_', 'O', 'W', 'E', '_', 'T', 'M', '_', 'O', 'W', 'E', // Partner BSS SSID + + // 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, + 0x0B, 0x00, 0x00, 0x00, // Channel + 0x01, 0x00, 0x00, 0x00 // BandId +}; + +// Test client hasn't implemented OWE DH handshake, so just indicate assoc failure +UCHAR s_TLV_Failure_AssociationResult_28_OWE_TM_Open [] = +{ + // WDI_TLV_ASSOCIATION_RESULT + 0x35, 0x00, + 0x46, 0x00, + + // WDI_TLV_BSSID + 0x02, 0x00, + 0x06, 0x00, + 0x00, 0xA0, 0xB0, 0xC0, 0xD1, 0x01, + + // WDI_TLV_ASSOCIATION_RESULT_PARAMETERS + 0x2D, 0x00, + 0x30, 0x00, + 0x01, 0x00, 0x00, 0x00, //Association Status: WDI_ASSOC_STATUS_FAILURE + 0x00, 0x00, 0x00, 0x00, //Status Code + 0x00, //ReAssociationRequest + 0x00, 0x00, 0x00, 0x00, //AuthAlgorithm + 0x00, 0x00, 0x00, 0x00, //UnicastCipherAlgorithm + 0x00, 0x00, 0x00, 0x00, //MulticastDataCipherAlgorithm + 0x00, 0x00, 0x00, 0x00, //MulticastMgmtCipherAlgorithm + 0x00, //FourAddressSupported + 0x00, //Port Authorized + 0x00, // WMM QoS Enabled + 0x00, 0x00, 0x00, 0x00, //DSInfo + 0x00, 0x00, 0x00, 0x00, //AssociationComebackTime + 0x00, 0x00, 0x00, 0x00, // Band ID + 0x00, 0x00, 0x00, 0x00, // IHV Association Status + 0x00, 0x00, 0x00, 0x00, // DisableDataPathOffloadsScenario + + // WDI_TLV_PHY_TYPE_LIST + 0x19, 0x00, + 0x04, 0x00, + 0x00, 0x00, 0x00, 0x00 +}; + +//=============================================================================== +// +// Wi-Fi 7 +// +//=============================================================================== + +WDI_MAC_ADDRESS s_Connect_Addr_29_WiFi7_Mixed_MLD = {0x00, 0xA0, 0xB0, 0xC0, 0xD1, 0x02}; +WDI_MAC_ADDRESS s_Connect_Addr_30_WiFi7_Mixed_Link_1 = {0x00, 0xA0, 0xB0, 0xC0, 0xD1, 0x03}; +WDI_MAC_ADDRESS s_Connect_Addr_31_WiFi7_Mixed_Link_2 = {0x00, 0xA0, 0xB0, 0xC0, 0xD1, 0x04}; +WDI_MAC_ADDRESS s_Connect_Addr_32_WiFi7_Mixed_Link_3 = {0x00, 0xA0, 0xB0, 0xC0, 0xD1, 0x05}; + +UCHAR s_TLV_BSS_Entry_30_WiFi7_Mixed_Link_1 [] = +{ + // WDI_TLV_BSS_ENTRY + 0x08, 0x00, //Type + 0xfa, 0x00, //Len + + // WDI_TLV_BSSID + 0x02, 0x00, // Type + 0x06, 0x00, // Length + 0x00, 0xA0, 0xB0, 0xC0, 0xD1, 0x03, // Link 1 MAC address + // WDI_TLV_BEACON_FRAME + 0x0a, 0x00, + 0xc7, 0x00, + + 0x22, 0x02, 0x2C, 0x01, 0x00, 0x00, 0x00, 0x00, // Timestamp + 0x64, 0x00, // Beacon Interval + 0x31, 0x04, // Capability + 0x00, 0x0f, // SSID + 'W', 'i', '-', 'F', 'i', ' ', '7', ' ', '-', ' ', 'M', 'i', 'x', 'e', 'd', + 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 + 0x32, 0x01, // DOT11_INFO_ELEMENT_ID_EXTD_SUPPORTED_RATES + 0xFB, // BSS_MEMBERSHIP_SELECTOR_SAE_H2E_ONLY + 0x30, 0x2a, + 0x01, 0x00, // Version + 0x00, 0x0F, 0xAC, 0x04, // Group Cipher = CCMP + 0x03, 0x00, // Pairwise Cipher Count + 0x00, 0x0F, 0xAC, 0x04, // Pairwise Cipher = CCMP-128 + 0x00, 0x0F, 0xAC, 0x08, // Pairwise Cipher = GCMP-128 + 0x00, 0x0F, 0xAC, 0x09, // Pairwise Cipher = GCMP-256 + 0x03, 0x00, // AKM Suite Count + 0x00, 0x0F, 0xAC, 0x02, // AKM Suite - PSK + 0x00, 0x0F, 0xAC, 0x08, // AKM Suite - SAE-256 + 0x00, 0x0F, 0xAC, 0x18, // AKM Suite - SAE-384 (Wi-Fi 7) + 0xCC, 0x00, // RSN Capability = MFPC + MFPR + ... + 0x00, 0x00, // PMKID Count + 0x00, 0x0F, 0xAC, 0x0C, // Group Mgmt Cipher = GMAC + + 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, 0x02, // 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, 0x04, // STA Info : AP Link 1 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] + 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, 0x05, // STA Info : AP Link 2 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, 0x04, // 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, 0x05, // 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, + 0x24, 0x00, 0x00, 0x00, // Channel + 0x02, 0x00, 0x00, 0x00 // BandId + +}; + +UCHAR s_TLV_Success_AssociationResult_30_WiFi7_Mixed_Link_1[] = +{ + // WDI_TLV_ASSOCIATION_RESULT + 0x35, 0x00, + 0xc0, 0x01, + + // WDI_TLV_BSSID + 0x02, 0x00, + 0x06, 0x00, + 0x00, 0xA0, 0xB0, 0xC0, 0xD1, 0x03, // 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 + 0x08, 0x00, 0x00, 0x00, // AuthAlgorithm = WDI_AUTH_ALGO_WPA3_SAE = 9 + 0x09, 0x00, 0x00, 0x00, // UnicastCipherAlgorithm = WDI_CIPHER_ALGO_GCMP_256 = 9 + 0x09, 0x00, 0x00, 0x00, // MulticastDataCipherAlgorithm = WDI_CIPHER_ALGO_GCMP_256 = 9 + 0x0C, 0x00, 0x00, 0x00, // MulticastMgmtCipherAlgorithm = WDI_CIPHER_ALGO_BIP_GMAC_256 = C + 0x00, // FourAddressSupported + 0x00, // Port Authorized + 0x00, // WMM QoS Enabled + 0x00, 0x00, 0x00, 0x00, // DSInfo + 0x00, 0x00, 0x00, 0x00, // AssociationComebackTime + 0x01, 0x00, 0x00, 0x00, // Band ID + 0x00, 0x00, 0x00, 0x00, // IHV Association Status + 0x00, 0x00, 0x00, 0x00, //DisableDataPathOffloadsScenario + + // WDI_TLV_ASSOCIATION_REQUEST_FRAME + 0x2E, 0x00, + 0x7e, 0x00, + 0x21, 0x04, // Capabilities + 0x0A, 0x00, // Listen Interval + 0x00, 0x0f, // SSID + 'W', 'i', '-', 'F', 'i', ' ', '7', ' ', '-', ' ', 'M', 'i', 'x', 'e', 'd', + 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 + 0x30, 0x1A, + 0x01, 0x00, // Version + 0x00, 0x0F, 0xAC, 0x04, // Group Cipher = CCMP + 0x01, 0x00, // Pairwise Cipher Count + 0x00, 0x0F, 0xAC, 0x09, // Pairwise Cipher = GCMP-256 + 0x01, 0x00, // AKM Suite Count + 0x00, 0x0F, 0xAC, 0x18, // AKM Suite - SAE-384 (Wi-Fi 7) + 0xC0, 0x00, // RSN Capability = MFPC + MFPR + ... + 0x00, 0x00, // PMKID Count + 0x00, 0x0F, 0xAC, 0x0C, // Group Mgmt Cipher = GMAC + 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, 0x01, 0x02, 0x03, 0x04, 0x05, // Sta 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 + 0x11, 0x01, 0x02, 0x03, 0x04, 0x21, // STA Info : STA 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 + 0x11, 0x01, 0x02, 0x03, 0x04, 0x22, // STA Info : Sta Link 2 MAC address + // STA Profile + + + // 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, 0x02, // 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, 0x04, // 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, 0x05, // STA Info : AP Link 2 MAC address + // STA Profile + + // WDI_TLV_BEACON_FRAME + 0x30, 0x00, + 0x9b, 0x00, + 0x22, 0x02, 0x2C, 0x01, 0x00, 0x00, 0x00, 0x00, // Timestamp + 0x64, 0x00, // Beacon Interval + 0x31, 0x04, // Capability + 0x00, 0x0f, // SSID + 'W', 'i', '-', 'F', 'i', ' ', '7', ' ', '-', ' ', 'M', 'i', 'x', 'e', 'd', + 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 + 0x32, 0x01, + 0xFB, // H2E Only + 0x30, 0x2a, + 0x01, 0x00, // Version + 0x00, 0x0F, 0xAC, 0x09, // Group Cipher = GCMP + 0x03, 0x00, // Pairwise Cipher Count + 0x00, 0x0F, 0xAC, 0x04, // Pairwise Cipher = CCMP-128 + 0x00, 0x0F, 0xAC, 0x08, // Pairwise Cipher = GCMP-128 + 0x00, 0x0F, 0xAC, 0x09, // Pairwise Cipher = GCMP-256 + 0x03, 0x00, // AKM Suite Count + 0x00, 0x0F, 0xAC, 0x02, // AKM Suite - PSK + 0x00, 0x0F, 0xAC, 0x08, // AKM Suite - SAE-256 + 0x00, 0x0F, 0xAC, 0x18, // AKM Suite - SAE-384 (Wi-Fi 7) + 0xC0, 0x00, // RSN Capability = MFPC + MFPR + ... + 0x00, 0x00, // PMKID Count + 0x00, 0x0F, 0xAC, 0x0C, // Group Mgmt Cipher = GMAC + 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, 0x02, // 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, 0x04, // STA Info : 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, 0x05, // STA Info : MAC address + // STA Profile + 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 + +}; + +//=============================================================================== + +WDI_MAC_ADDRESS s_Connect_Addr_33_WiFi7_Open_MLD = {0x00, 0xA0, 0xB0, 0xC0, 0xD1, 0x06}; +WDI_MAC_ADDRESS s_Connect_Addr_34_WiFi7_Open_Link_1 = {0x00, 0xA0, 0xB0, 0xC0, 0xD1, 0x07}; +WDI_MAC_ADDRESS s_Connect_Addr_35_WiFi7_Open_Link_2 = {0x00, 0xA0, 0xB0, 0xC0, 0xD1, 0x08}; +WDI_MAC_ADDRESS s_Connect_Addr_36_WiFi7_Open_Link_3 = {0x00, 0xA0, 0xB0, 0xC0, 0xD1, 0x09}; + +UCHAR s_TLV_BSS_Entry_34_WiFi7_Open_Link_1 [] = +{ + // WDI_TLV_BSS_ENTRY + 0x08, 0x00, //Type + 0xca, 0x00, //Len + + // WDI_TLV_BSSID + 0x02, 0x00, // Type + 0x06, 0x00, // Length + 0x00, 0xA0, 0xB0, 0xC0, 0xD1, 0x07, // 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', ' ', '-', ' ', 'O', 'p', 'e', 'n', + 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 + +}; + +UCHAR s_TLV_Success_AssociationResult_34_WiFi7_Open_Link_1[] = +{ + // WDI_TLV_ASSOCIATION_RESULT + 0x35, 0x00, + 0xb3, 0x01, + + // WDI_TLV_BSSID + 0x02, 0x00, + 0x06, 0x00, + 0x00, 0xA0, 0xB0, 0xC0, 0xD1, 0x07, // 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', ' ', '-', ' ', 'O', 'p', 'e', 'n', + 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 + 0x00, 0xA0, 0xB0, 0xC0, 0xD1, 0x07, // 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, 0x08, // 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', ' ', '-', ' ', 'O', 'p', 'e', 'n', + 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 + +}; + +//=============================================================================== + +WDI_MAC_ADDRESS s_Connect_Addr_37_WiFi7_Only_MLD = {0x00, 0xA0, 0xB0, 0xC0, 0xD1, 0x0a}; +WDI_MAC_ADDRESS s_Connect_Addr_38_WiFi7_Only_Link_1 = {0x00, 0xA0, 0xB0, 0xC0, 0xD1, 0x0b}; +WDI_MAC_ADDRESS s_Connect_Addr_39_WiFi7_Only_Link_2 = {0x00, 0xA0, 0xB0, 0xC0, 0xD1, 0x0c}; +WDI_MAC_ADDRESS s_Connect_Addr_40_WiFi7_Only_Link_3 = {0x00, 0xA0, 0xB0, 0xC0, 0xD1, 0x0d}; + +UCHAR s_TLV_BSS_Entry_38_WiFi7_Only_Link_1 [] = +{ + // WDI_TLV_BSS_ENTRY + 0x08, 0x00, //Type + 0xe8, 0x00, //Len + + // WDI_TLV_BSSID = 10 = 0xa + 0x02, 0x00, // Type + 0x06, 0x00, // Length + 0x00, 0xA0, 0xB0, 0xC0, 0xD1, 0x0b, // Link 1 MAC address + + // WDI_TLV_BEACON_FRAME = 143 = 0x8f + 0x0a, 0x00, + 0xb5, 0x00, + 0x22, 0x02, 0x2C, 0x01, 0x00, 0x00, 0x00, 0x00, // Timestamp + 0x64, 0x00, // Beacon Interval + 0x31, 0x04, // Capability + 0x00, 0x10, // SSID + 'W', 'i', '-', 'F', 'i', ' ', '7', ' ', '-', ' ', 'a', 'k', 'm', ':', '2', '4', + 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 + 0x30, 0x1a, + 0x01, 0x00, // Version + 0x00, 0x0F, 0xAC, 0x04, // Group Cipher = CCMP + 0x01, 0x00, // Pairwise Cipher Count + 0x00, 0x0F, 0xAC, 0x09, // Pairwise Cipher = GCMP-256 + 0x01, 0x00, // AKM Suite Count + 0x00, 0x0F, 0xAC, 0x18, // AKM Suite - SAE-384 (Wi-Fi 7) + 0xCC, 0x00, // RSN Capability = MFPC + MFPR + ... + 0x00, 0x00, // PMKID Count + 0x00, 0x0F, 0xAC, 0x0C, // Group Mgmt Cipher = GMAC + 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, 0x0a, // 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, 0x0c, // STA Info : AP Link 1 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] + 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, 0x0d, // STA Info : AP Link 2 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, 0x0c, // Bssid + 0x1d, 0xc5, 0x3b, 0x12, // ShortSsid + 0x40, // BssParameters + 0x00, // 20 MHz + 0x32, 0x01, 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, 0x0d, // Bssid + 0x1d, 0xc5, 0x3b, 0x12, // ShortSsid + 0x40, // BssParameters + 0x00, // 20 MHz + 0x32, 0x03, 0x56, // Mld Parameters: MLD ID(8 bits) : LinkID (4 bits) + ... + + 0x32, 0x04, // Extended Supported Rates: DOT11_INFO_ELEMENT_ID_EXTD_SUPPORTED_RATES + 0x0C, 0x12, 0x18, 0xFB, // 0xFB = BSS_MEMBERSHIP_SELECTOR_SAE_H2E_ONLY + 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, + 0x01, 0x00, 0x00, 0x00, // Channel + 0x05, 0x00, 0x00, 0x00 // BandId +}; + +UCHAR s_TLV_Success_AssociationResult_38_WiFi7_Only_Link_1[] = +{ + // WDI_TLV_ASSOCIATION_RESULT + 0x35, 0x00, + 0xaf, 0x01, + + // WDI_TLV_BSSID + 0x02, 0x00, + 0x06, 0x00, + 0x00, 0xA0, 0xB0, 0xC0, 0xD1, 0x0b, // 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 + 0x08, 0x00, 0x00, 0x00, // AuthAlgorithm = WDI_AUTH_ALGO_WPA3_SAE = 9 + 0x09, 0x00, 0x00, 0x00, // UnicastCipherAlgorithm = WDI_CIPHER_ALGO_GCMP_256 = 9 + 0x09, 0x00, 0x00, 0x00, // MulticastDataCipherAlgorithm = WDI_CIPHER_ALGO_GCMP_256 = 9 + 0x0C, 0x00, 0x00, 0x00, // MulticastMgmtCipherAlgorithm = WDI_CIPHER_ALGO_BIP_GMAC_256 = C + 0x00, // FourAddressSupported + 0x00, // Port Authorized + 0x00, // WMM QoS Enabled + 0x00, 0x00, 0x00, 0x00, // DSInfo + 0x00, 0x00, 0x00, 0x00, // AssociationComebackTime + 0x01, 0x00, 0x00, 0x00, // Band ID + 0x00, 0x00, 0x00, 0x00, // IHV Association Status + 0x00, 0x00, 0x00, 0x00, //DisableDataPathOffloadsScenario + + // WDI_TLV_ASSOCIATION_REQUEST_FRAME + 0x2E, 0x00, + 0x7f, 0x00, + 0x21, 0x04, // Capabilities + 0x0A, 0x00, // Listen Interval + 0x00, 0x10, // SSID + 'W', 'i', '-', 'F', 'i', ' ', '7', ' ', '-', ' ', 'a', 'k', 'm', ':', '2', '4', + 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 + 0x30, 0x1A, + 0x01, 0x00, // Version + 0x00, 0x0F, 0xAC, 0x04, // Group Cipher = CCMP + 0x01, 0x00, // Pairwise Cipher Count + 0x00, 0x0F, 0xAC, 0x09, // Pairwise Cipher = GCMP + 0x01, 0x00, // AKM Suite Count + 0x00, 0x0F, 0xAC, 0x18, // AKM Suite - SAE-384 (Wi-Fi 7) + 0xC0, 0x00, // RSN Capability = MFPC + MFPR + ... + 0x00, 0x00, // PMKID Count + 0x00, 0x0F, 0xAC, 0x0C, // Group Mgmt Cipher = GMAC + 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, 0x01, 0x02, 0x03, 0x04, 0x05, // Sta 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 + 0x11, 0x01, 0x02, 0x03, 0x04, 0x21, // STA Info : STA 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 + 0x11, 0x01, 0x02, 0x03, 0x04, 0x22, // STA Info : Sta Link 2 MAC address + // STA Profile + + + // 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, 0x0a, // 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, 0x0c, // 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, 0x0d, // STA Info : AP Link 2 MAC address + // STA Profile + + // WDI_TLV_BEACON_FRAME + 0x30, 0x00, + 0x89, 0x00, + 0x22, 0x02, 0x2C, 0x01, 0x00, 0x00, 0x00, 0x00, // Timestamp + 0x64, 0x00, // Beacon Interval + 0x31, 0x04, // Capability + 0x00, 0x10, // SSID + 'W', 'i', '-', 'F', 'i', ' ', '7', ' ', '-', ' ', 'a', 'k', 'm', ':', '2', '4', + 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 + 0x30, 0x1a, + 0x01, 0x00, // Version + 0x00, 0x0F, 0xAC, 0x09, // Group Cipher = GCMP + 0x01, 0x00, // Pairwise Cipher Count + 0x00, 0x0F, 0xAC, 0x09, // Pairwise Cipher = GCMP + 0x01, 0x00, // AKM Suite Count + 0x00, 0x0F, 0xAC, 0x18, // AKM Suite - SAE-384 (Wi-Fi 7) + 0xC0, 0x00, // RSN Capability = MFPC + MFPR + ... + 0x00, 0x00, // PMKID Count + 0x00, 0x0F, 0xAC, 0x0C, // Group Mgmt Cipher = GMAC + 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, 0x0a, // 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, 0x0c, // STA Info : 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, 0x0d, // STA Info : MAC address + // STA Profile + 0x32, 0x04, // Extended Supported Rates: DOT11_INFO_ELEMENT_ID_EXTD_SUPPORTED_RATES + 0x0C, 0x12, 0x18, 0xFB, // 0xFB = BSS_MEMBERSHIP_SELECTOR_SAE_H2E_ONLY + 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 + +}; + +//=============================================================================== +// DualSta networks +//=============================================================================== +// + +WDI_MAC_ADDRESS s_Connect_Addr_41_DualSta_5Ghz = {0x00, 0x51, 0x30, 0x40, 0x50, 0x60}; +UCHAR s_TLV_BSS_Entry_41_DualSta_5Ghz [] = +{ + // WDI_TLV_BSS_ENTRY + 0x08, 0x00, //Type + 0x63, 0x00, //Len + + // WDI_TLV_BSSID + 0x02, 0x00, // Type + 0x06, 0x00, // Length + 0x00, 0x51, 0x30, 0x40, 0x50, 0x60, + + // WDI_TLV_PROBE_RESPONSE_FRAME + 0x09, 0x00, // Type + 0x35, 0x00, // Length + 0x00, 0x11, 0x22, 0x33, 0x00, 0x00, 0x00, 0x00, // Timestamp + 0x64, 0x00, // Beacon Interval + 0x00, 0x04, // Capability + 0x00, 0x08, + 'D', 'u', 'a', 'l', '-', 'S', 't', 'a', // SSID + 0x01, 0x04, // Supported Rates + 0x02, 0x04, 0x0B, 0x16, + 0x03, 0x01, // DSSS Parameter + 0x01, + 0x05, 0x04, // TIM + 0x00, 0x01, 0x00, 0x00, + 0x46, 0x05, // RM Enabled Capabilities + 0x02, 0x00, 0x00, 0x00, 0x00, + 0xDD, 0x07, // Vendor specific - MBO-OCE IE + 0x50, 0x6F, 0x9A, // WFA OUI + 0x16, // MBO-OCE IE OUI Type + 0x01, // Attribute ID - AP capability + 0x01, // Attrib length + 0x00, // Not cellular data aware + + // WDI_TLV_BSS_ENTRY_DEVICE_CONTEXT + 0x0d, 0x00, + 0x04, 0x00, + 0x04, 0x05, 0x06, 0x07, + + // 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_CHANNEL_INFO + 0x3a, 0x00, + 0x08, 0x00, + 0x24, 0x00, 0x00, 0x00, // Channel + 0x02, 0x00, 0x00, 0x00 // Band ID +}; + +UCHAR s_TLV_SuccessOpenAssociationResult_41_DualSta_5Ghz[] = +{ + // WDI_TLV_ASSOCIATION_RESULT + 0x35, 0x00, + 0xD7, 0x00, + + // WDI_TLV_BSSID + 0x02, 0x00, + 0x06, 0x00, + 0x00, 0x51, 0x30, 0x40, 0x50, 0x60, + + // WDI_TLV_ASSOCIATION_RESULT_PARAMETERS + 0x2D, 0x00, + 0x30, 0x00, + 0x00, 0x00, 0x00, 0x00, //Association Status + 0x00, 0x00, 0x00, 0x00, //Status Code + 0x00, //ReAssociationRequest + 0x01, 0x00, 0x00, 0x00, //AuthAlgorithm + 0x00, 0x00, 0x00, 0x00, //UnicastCipherAlgorithm + 0x00, 0x00, 0x00, 0x00, //MulticastDataCipherAlgorithm + 0x00, 0x00, 0x00, 0x00, //MulticastMgmtCipherAlgorithm + 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, + 0x30, 0x00, + 0x21, 0x04, // Capabilities + 0x0A, 0x00, // Listen Interval + 0x00, 0x08, + 'D', 'u', 'a', 'l', '-', 'S', 't', 'a', // SSID + 0x01, 0x08, // Rates + 0x82, 0x84, 0x8B, 0x96, 0x24, 0x30, 0x48, 0x6C, + 0x21, 0x02, // Power Capability + 0x07, 0x12, + 0x24, 0x02, // Supported Channels + 0x01, 0x0B, + 0x32, 0x04, // Extended Rates + 0x0C, 0x12, 0x18, 0x60, + 0xDD, 0x07, // WMM settings + 0x00, 0x50, 0xF2, 0x02, 0x00, 0x01, 0x00, 0x03, + + // WDI_TLV_ASSOCIATION_RESPONSE_FRAME + 0x2F, 0x00, + 0x30, 0x00, + 0x01, 0x04, //Capability + 0x00, 0x00, //Status + 0x01, 0xC0, //Association ID + 0x01, 0x08, //Rates + 0x82, 0x84, 0x8B, 0x96, 0x24, 0x30, 0x48, 0x6C, + 0x32, 0x04, //Extended Rates + 0x0C, 0x12, 0x18, 0x60, + 0xDD, 0x18, //WMM settings + 0x00, 0x50, 0xF2, 0x02, 0x01, 0x01, 0x80, 0x00, 0x03, 0xA4, 0x00, 0x00, 0x27, 0xA4, 0x00, 0x00, + 0x42, 0x43, 0x5E, 0x00, 0x62, 0x32, 0x2F, 0x00, + + // WDI_TLV_BEACON_PROBE_RESPONSE + 0x30, 0x00, // Type + 0x25, 0x00, // Length + 0x00, 0x11, 0x22, 0x33, 0x00, 0x00, 0x00, 0x00, // Timestamp + 0x64, 0x00, // Beacon Interval + 0x00, 0x04, // Capability + 0x00, 0x08, + 'D', 'u', 'a', 'l', '-', 'S', 't', 'a', // SSID + 0x01, 0x04, 0x02, 0x04, 0x0B, 0x16, // Supported Rates + 0x03, 0x01, 0x01, // DSSS Parameter + 0x05, 0x04, 0x00, 0x01, 0x00, 0x00, // TIM + + // WDI_TLV_PHY_TYPE_LIST + 0x19, 0x00, + 0x04, 0x00, + 0x07, 0x00, 0x00, 0x00, + +}; + +// ----- + +WDI_MAC_ADDRESS s_Connect_Addr_42_DualSta_6Ghz = {0x00, 0x52, 0x30, 0x40, 0x50, 0x60}; +UCHAR s_TLV_BSS_Entry_42_DualSta_6Ghz [] = +{ + // WDI_TLV_BSS_ENTRY + 0x08, 0x00, //Type + 0x63, 0x00, //Len + + // WDI_TLV_BSSID + 0x02, 0x00, // Type + 0x06, 0x00, // Length + 0x00, 0x52, 0x30, 0x40, 0x50, 0x60, + + // WDI_TLV_PROBE_RESPONSE_FRAME + 0x09, 0x00, // Type + 0x35, 0x00, // Length + 0x00, 0x11, 0x22, 0x33, 0x00, 0x00, 0x00, 0x00, // Timestamp + 0x64, 0x00, // Beacon Interval + 0x00, 0x04, // Capability + 0x00, 0x08, + 'D', 'u', 'a', 'l', '-', 'S', 't', 'a', // SSID + 0x01, 0x04, // Supported Rates + 0x02, 0x04, 0x0B, 0x16, + 0x03, 0x01, // DSSS Parameter + 0x01, + 0x05, 0x04, // TIM + 0x00, 0x01, 0x00, 0x00, + 0x46, 0x05, // RM Enabled Capabilities + 0x02, 0x00, 0x00, 0x00, 0x00, + 0xDD, 0x07, // Vendor specific - MBO-OCE IE + 0x50, 0x6F, 0x9A, // WFA OUI + 0x16, // MBO-OCE IE OUI Type + 0x01, // Attribute ID - AP capability + 0x01, // Attrib length + 0x00, // Not cellular data aware + + // WDI_TLV_BSS_ENTRY_DEVICE_CONTEXT + 0x0d, 0x00, + 0x04, 0x00, + 0x04, 0x05, 0x06, 0x07, + + // 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_CHANNEL_INFO + 0x3a, 0x00, + 0x08, 0x00, + 0x09, 0x00, 0x00, 0x00, // Channel + 0x05, 0x00, 0x00, 0x00 // Band ID +}; + +UCHAR s_TLV_SuccessOpenAssociationResult_42_DualSta_6Ghz[] = +{ + // WDI_TLV_ASSOCIATION_RESULT + 0x35, 0x00, + 0xD7, 0x00, + + // WDI_TLV_BSSID + 0x02, 0x00, + 0x06, 0x00, + 0x00, 0x52, 0x30, 0x40, 0x50, 0x60, + + // WDI_TLV_ASSOCIATION_RESULT_PARAMETERS + 0x2D, 0x00, + 0x30, 0x00, + 0x00, 0x00, 0x00, 0x00, //Association Status + 0x00, 0x00, 0x00, 0x00, //Status Code + 0x00, //ReAssociationRequest + 0x01, 0x00, 0x00, 0x00, //AuthAlgorithm + 0x00, 0x00, 0x00, 0x00, //UnicastCipherAlgorithm + 0x00, 0x00, 0x00, 0x00, //MulticastDataCipherAlgorithm + 0x00, 0x00, 0x00, 0x00, //MulticastMgmtCipherAlgorithm + 0x00, //FourAddressSupported + 0x00, //Port Authorized + 0x00, // WMM QoS Enabled + 0x00, 0x00, 0x00, 0x00, //DSInfo + 0x00, 0x00, 0x00, 0x00, //AssociationComebackTime + 0x05, 0x00, 0x00, 0x00, // Band ID + 0x00, 0x00, 0x00, 0x00, // IHV Association Status + 0x00, 0x00, 0x00, 0x00, //DisableDataPathOffloadsScenario + + // WDI_TLV_ASSOCIATION_REQUEST_FRAME + 0x2E, 0x00, + 0x30, 0x00, + 0x21, 0x04, // Capabilities + 0x0A, 0x00, // Listen Interval + 0x00, 0x08, + 'D', 'u', 'a', 'l', '-', 'S', 't', 'a', // SSID + 0x01, 0x08, // Rates + 0x82, 0x84, 0x8B, 0x96, 0x24, 0x30, 0x48, 0x6C, + 0x21, 0x02, // Power Capability + 0x07, 0x12, + 0x24, 0x02, // Supported Channels + 0x01, 0x0B, + 0x32, 0x04, // Extended Rates + 0x0C, 0x12, 0x18, 0x60, + 0xDD, 0x07, // WMM settings + 0x00, 0x50, 0xF2, 0x02, 0x00, 0x01, 0x00, 0x03, + + // WDI_TLV_ASSOCIATION_RESPONSE_FRAME + 0x2F, 0x00, + 0x30, 0x00, + 0x01, 0x04, //Capability + 0x00, 0x00, //Status + 0x01, 0xC0, //Association ID + 0x01, 0x08, //Rates + 0x82, 0x84, 0x8B, 0x96, 0x24, 0x30, 0x48, 0x6C, + 0x32, 0x04, //Extended Rates + 0x0C, 0x12, 0x18, 0x60, + 0xDD, 0x18, //WMM settings + 0x00, 0x50, 0xF2, 0x02, 0x01, 0x01, 0x80, 0x00, 0x03, 0xA4, 0x00, 0x00, 0x27, 0xA4, 0x00, 0x00, + 0x42, 0x43, 0x5E, 0x00, 0x62, 0x32, 0x2F, 0x00, + + // WDI_TLV_BEACON_PROBE_RESPONSE + 0x30, 0x00, // Type + 0x25, 0x00, // Length + 0x00, 0x11, 0x22, 0x33, 0x00, 0x00, 0x00, 0x00, // Timestamp + 0x64, 0x00, // Beacon Interval + 0x00, 0x04, // Capability + 0x00, 0x08, + 'D', 'u', 'a', 'l', '-', 'S', 't', 'a', // SSID + 0x01, 0x04, 0x02, 0x04, 0x0B, 0x16, // Supported Rates + 0x03, 0x01, 0x01, // DSSS Parameter + 0x05, 0x04, 0x00, 0x01, 0x00, 0x00, // TIM + + // WDI_TLV_PHY_TYPE_LIST + 0x19, 0x00, + 0x04, 0x00, + 0x07, 0x00, 0x00, 0x00, + +}; + +//=============================================================================== +// 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 new file mode 100644 index 000000000..c84c1d977 --- /dev/null +++ b/network/wlan/wificx/drivercode/wifirequest.cpp @@ -0,0 +1,98 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. + +#include "precomp.h" +#include "wifitransition.h" +#include "wifirequest.h" +#include "wifirequest.tmh" + +_Use_decl_annotations_ +void EvtWifiDeviceSendCommand(WDFDEVICE Device, WIFIREQUEST SendRequest) +{ + UINT InBufferLen = 0; + UINT OutBufferLen = 0; + void* Buffer = WifiRequestGetInOutBuffer(SendRequest, &InBufferLen, &OutBufferLen); + UINT16 MessageId = WifiRequestGetMessageId(SendRequest); + + TransitionContext tctx{ + Device, + WifiGetIhvDeviceContext(Device), + SendRequest, + static_cast<PWDI_MESSAGE_HEADER>(Buffer), + Buffer, + InBufferLen, + OutBufferLen + }; + + if(!NT_SUCCESS(RunTransitionByMessage(tctx, MessageId))) + { + WFCError("RunTransitionByMessage failed for MessageId: 0x%04X", MessageId); + return; + } +} + +void WifiIhvSendIndicationToOs( + _In_ WDFDEVICE Device, + _In_ const PWDI_MESSAGE_HEADER pOriginalWdiHeader, + _In_ UINT16 WifiRequestMessageId, + _In_ UINT32 WifiRequestTransactionId, + _In_ NTSTATUS WifiRquestM4Status, + _In_opt_bytecount_(TlvDataSize) PUCHAR pTlvData, + _In_ UINT32 TlvDataSize) +{ + WDFMEMORY data = WDF_NO_HANDLE; + PUCHAR pIndicationBuffer = nullptr; + PWDI_MESSAGE_HEADER pIndicationHeader = nullptr; + SIZE_T indicationSize = sizeof(WDI_MESSAGE_HEADER) + TlvDataSize; + WDF_OBJECT_ATTRIBUTES objectAttribs; + + WDF_OBJECT_ATTRIBUTES_INIT(&objectAttribs); + objectAttribs.ParentObject = Device; + + if(!NT_SUCCESS(WdfMemoryCreate(&objectAttribs, NonPagedPoolNx, 0, indicationSize, &data, reinterpret_cast<void**>(&pIndicationBuffer)))) + { + WFCError("Failed to create indication buffer"); + return; + } + + RtlZeroMemory(pIndicationBuffer, indicationSize); + pIndicationHeader = reinterpret_cast<PWDI_MESSAGE_HEADER>(pIndicationBuffer); + pIndicationHeader->PortId = pOriginalWdiHeader->PortId; + pIndicationHeader->Reserved = pOriginalWdiHeader->Reserved; + pIndicationHeader->Status = Wifi::ConvertNDISSTATUSToNTSTATUS(WifiRquestM4Status); + pIndicationHeader->TransactionId = WifiRequestTransactionId; + pIndicationHeader->IhvSpecificId = pOriginalWdiHeader->IhvSpecificId; + + if (TlvDataSize > 0 && pTlvData != nullptr) + { + RtlCopyMemory(pIndicationBuffer + sizeof(WDI_MESSAGE_HEADER), pTlvData, TlvDataSize); + } + + // Send the indication up to WifiCx + WifiDeviceReceiveIndication(Device, WifiRequestMessageId, data); + + // Don't need to keep this around + WdfObjectDelete(data); +} + +_Use_decl_annotations_ +void WifiIhvSendUnsolicitedIndicationToOs(WDFDEVICE Device, PWDI_MESSAGE_HEADER pWdiHeader, UINT16 MessageId, PUCHAR pTlvData, UINT32 TlvDataSize) +{ + WifiIhvSendIndicationToOs(Device, pWdiHeader, MessageId, 0, STATUS_SUCCESS, pTlvData, TlvDataSize); //TransactionId required to be 0 for unsolicited indications. +} +_Use_decl_annotations_ +void WifiIhvNotifyM3Completion(WIFIREQUEST Request, NTSTATUS WifiRequestM3Status, UINT BytesWritten) +{ + if(!NT_SUCCESS(WifiRequestM3Status)) + { + WFCError("WifiRequest M3 failed: %!STATUS!, BytesWritten: %d\n", WifiRequestM3Status, BytesWritten); + } + // Report the M3 status back to OS + // OS expects M3 before the M4 + WifiRequestComplete(Request, WifiRequestM3Status, BytesWritten); +} + +_Use_decl_annotations_ +void WifiIhvSendM4IndicationToOs(WDFDEVICE Device, UINT16 WifiRequestMessageId, const PWDI_MESSAGE_HEADER pWdiHeader, NTSTATUS WifiRequestM4Status) +{ + WifiIhvSendIndicationToOs(Device, pWdiHeader, WifiRequestMessageId, pWdiHeader->TransactionId, WifiRequestM4Status, nullptr, 0); +} diff --git a/network/wlan/wificx/drivercode/wifirequest.h b/network/wlan/wificx/drivercode/wifirequest.h new file mode 100644 index 000000000..74380548f --- /dev/null +++ b/network/wlan/wificx/drivercode/wifirequest.h @@ -0,0 +1,23 @@ +// Copyright (C) Microsoft Corporation. All rights reserved. +#pragma once +#include "device.h" + +EVT_WIFI_DEVICE_SEND_COMMAND EvtWifiDeviceSendCommand; + +void WifiIhvSendUnsolicitedIndicationToOs( + _In_ WDFDEVICE Device, + _In_ PWDI_MESSAGE_HEADER pWdiHeader, + _In_ UINT16 MessageId, + _In_opt_bytecount_(TlvDataSize) PUCHAR pTlvData, + _In_ UINT32 TlvDataSize); + +void WifiIhvNotifyM3Completion( + _In_ WIFIREQUEST Request, + _In_ NTSTATUS WifiRequestM3Status, + _In_ UINT BytesWritten); + +void WifiIhvSendM4IndicationToOs( + _In_ WDFDEVICE Device, + _In_ UINT16 WifiRequestMessageId, + _In_ const PWDI_MESSAGE_HEADER pOriginalWdiHeader, + _In_ NTSTATUS WifiRequestM4Status); \ No newline at end of file diff --git a/network/wlan/wificx/drivercode/wifitransition.cpp b/network/wlan/wificx/drivercode/wifitransition.cpp new file mode 100644 index 000000000..2e1b7ef24 --- /dev/null +++ b/network/wlan/wificx/drivercode/wifitransition.cpp @@ -0,0 +1,466 @@ +// Copyright (C) Microsoft Corporation. All rights reserved. + +#include "wifitransition.h" + +// Common TLV parsing helper: computes TLV span, optional dump, calls a parser, converts status. +template<typename Param, typename ParserFn> +NTSTATUS ParseTlvCommon(TransitionContext& ctx, + UINT16 messageId, + ParserFn parser, + Param& outParams, + bool dumpStream = true) +{ + if (ctx.InLen < sizeof(WDI_MESSAGE_HEADER)) + { + return STATUS_INVALID_PARAMETER; + } + + auto* tlvBytes = static_cast<UCHAR*>(ctx.RawBuffer) + sizeof(WDI_MESSAGE_HEADER); + auto tlvLen = static_cast<ULONG>(ctx.InLen - sizeof(WDI_MESSAGE_HEADER)); + + if (dumpStream) + { + DumpMessageTlvByteStream( + messageId, + TRUE, + ctx.DevCtx->TlvContext.PeerVersion, + tlvLen, + tlvBytes, + 0, + nullptr); + } + + auto ndisStatus = parser(tlvLen, tlvBytes, &ctx.DevCtx->TlvContext, &outParams); + return Wifi::ConvertNDISSTATUSToNTSTATUS(ndisStatus); +} + + +// Primary traits template (specialize per MessageId) +template<UINT16 MsgId> +struct TransitionTraits; + +// --- Generic pure-type traits template (add before existing specializations) --- +// WIFIREQUEST always needs M3 notification, so TPreM3Fn is mandatory. +// and WIFICX expectes the M3 then M4 order, so we always execute M3 then M4. +// using template parameters to configure parsing, cleanup, M3/M4 steps. +// to make sure that all transitions have consistent implementations. +template< + UINT16 TMsgId, + typename TParam, + UINT16 TCompleteIndication, + bool TDumpTlvStream, + NDIS_STATUS (*TParseFn)(ULONG, const UINT8*, PCTLV_CONTEXT, TParam*), + void (*TCleanupFn)(TParam*), + NTSTATUS (WifiHAL::*TPreM3Fn)(), // mandatory pre-M3 hook + NTSTATUS (WifiHAL::*THalM3Fn)(const TParam&, const PWDI_MESSAGE_HEADER, UINT BytesWriten), // optional HAL M3 (may be nullptr) + NTSTATUS (WifiHAL::*TPreM4Fn)(), // optional pre-M4 hook (may be nullptr) + NTSTATUS (WifiHAL::*THalM4Fn)(const PWDI_MESSAGE_HEADER) // optional HAL M4 (may be nullptr) +> +struct GenericTransitionTraits +{ + using ParamType = TParam; + enum : UINT16 { CompleteIndication = TCompleteIndication }; + + NTSTATUS Parse(TransitionContext& ctx, ParamType& p) + { + if (ctx.InLen < sizeof(WDI_MESSAGE_HEADER)) + { + return STATUS_INVALID_PARAMETER; + } + + auto* tlvBytes = static_cast<UCHAR*>(ctx.RawBuffer) + sizeof(WDI_MESSAGE_HEADER); + auto tlvLen = static_cast<ULONG>(ctx.InLen - sizeof(WDI_MESSAGE_HEADER)); + + if (TDumpTlvStream) + { + DumpMessageTlvByteStream( + TMsgId, + TRUE, + ctx.DevCtx->TlvContext.PeerVersion, + tlvLen, + tlvBytes, + 0, + nullptr); + } + + auto ndisStatus = TParseFn(tlvLen, tlvBytes, &ctx.DevCtx->TlvContext, &p); + return Wifi::ConvertNDISSTATUSToNTSTATUS(ndisStatus); + } + + void Cleanup(ParamType& p) { TCleanupFn(&p); } + + // Make static so pointer matches ExecuteSteps expected callable type (no implicit this) + static NTSTATUS StepM3(TransitionContext& c, ParamType& p, UINT& bytesWritten) + { + bytesWritten = sizeof(WDI_MESSAGE_HEADER); + ASSERT(TPreM3Fn); + + if (TPreM3Fn) + { + // Call member function pointer on WifiHAL instance + NTSTATUS preStatus = (GetWifiHalFromHandle(c.DevCtx->WdfDevice)->*TPreM3Fn)(); + if (!NT_SUCCESS(preStatus)) + { + return preStatus; + } + } + + if (THalM3Fn) + { + // Pass required third argument (BytesWriten) to HAL M3 function + return (GetWifiHalFromHandle(c.DevCtx->WdfDevice)->*THalM3Fn)(p, c.Header, bytesWritten); + } + + return STATUS_SUCCESS; + } + + static NTSTATUS StepM4(TransitionContext& c, ParamType&) + { + if (TPreM4Fn) + { + NTSTATUS preStatus = (GetWifiHalFromHandle(c.DevCtx->WdfDevice)->*TPreM4Fn)(); + if (!NT_SUCCESS(preStatus)) + { + return preStatus; + } + } + + if (THalM4Fn) + { + return (GetWifiHalFromHandle(c.DevCtx->WdfDevice)->*THalM4Fn)(c.Header); + } + + return (TPreM4Fn == nullptr && THalM4Fn == nullptr) ? STATUS_PENDING : STATUS_SUCCESS; + } + + NTSTATUS Handle(TransitionContext& ctx, ParamType& p) + { + return ExecuteSteps(ctx, p, &GenericTransitionTraits::StepM3, &GenericTransitionTraits::StepM4); + } + + bool ShouldSendComplete(NTSTATUS s) const { return s != STATUS_PENDING; } +}; + +// Execute two step callables. +// StepM3Fn signature: NTSTATUS (TransitionContext&, Param&, UINT& bytesWritten) +// StepM4Fn signature: NTSTATUS (TransitionContext&, Param&) +// Always calls WifiRequestComplete after StepM3 with the bytesWritten produced by StepM3. +// Skips StepM4 if StepM3 failed +template<typename Param, typename StepM3Fn, typename StepM4Fn> +NTSTATUS ExecuteSteps(TransitionContext& ctx, Param& p, StepM3Fn stepM3, StepM4Fn stepM4) +{ + UINT bytesWritten = sizeof(WDI_MESSAGE_HEADER); // default minimum + NTSTATUS m3Status = stepM3(ctx, p, bytesWritten); + // Report the M3 status back to OS + // OS expects M3 before the M4 + WifiIhvNotifyM3Completion(ctx.WifiRequest, m3Status, bytesWritten); + if (!NT_SUCCESS(m3Status)) + { + return m3Status; + } + return stepM4(ctx, p); +} + +// -------- Generic runner (compile-time) -------- +template<UINT16 MsgId> +NTSTATUS RunTransition(TransitionContext& ctx) +{ + TransitionTraits<MsgId> traits; + typename TransitionTraits<MsgId>::ParamType params{}; + NTSTATUS parseStatus = traits.Parse(ctx, params); + if (!NT_SUCCESS(parseStatus)) + { + traits.Cleanup(params); + // Report Failed M3 to OS + // Note: No M4 indication on parse failure + WifiIhvNotifyM3Completion(ctx.WifiRequest, parseStatus, 0); + return parseStatus; + } + + NTSTATUS m4Status = traits.Handle(ctx, params); + + if (traits.ShouldSendComplete(m4Status)) + { + WifiIhvSendM4IndicationToOs( + ctx.Device, + TransitionTraits<MsgId>::CompleteIndication, + ctx.Header, + m4Status); + } + + traits.Cleanup(params); + return m4Status; +} + +// ============================================================================ +// Property GET/SET messages (single M3 completion) +// ---------------------------------------------------------------------------- +// Unlike the M3/M4 task flow above, a property GET/SET is a single M3 step that +// returns its result synchronously in the request's in/out buffer. The HAL +// handler writes the response TLV stream and reports the real number of bytes +// written (by reference); the request is completed (M3) with that length. +// No M4 indication. +// ============================================================================ +template< + UINT16 TMsgId, + typename TParam, + bool TDumpTlvStream, + NDIS_STATUS (*TParseFn)(ULONG, const UINT8*, PCTLV_CONTEXT, TParam*), + void (*TCleanupFn)(TParam*), + NTSTATUS (WifiHAL::*TPreFn)(), // optional pre-check hook (may be nullptr) + NTSTATUS (WifiHAL::*TPropertyFn)(const TParam&, void*, ULONG, ULONG&) // mandatory property HAL handler +> +struct PropertyM3Traits +{ + using ParamType = TParam; + + NTSTATUS Parse(TransitionContext& ctx, ParamType& p) + { + if (ctx.InLen < sizeof(WDI_MESSAGE_HEADER)) + { + return STATUS_INVALID_PARAMETER; + } + + auto* tlvBytes = static_cast<UCHAR*>(ctx.RawBuffer) + sizeof(WDI_MESSAGE_HEADER); + auto tlvLen = static_cast<ULONG>(ctx.InLen - sizeof(WDI_MESSAGE_HEADER)); + + if (TDumpTlvStream) + { + DumpMessageTlvByteStream(TMsgId, TRUE, ctx.DevCtx->TlvContext.PeerVersion, tlvLen, tlvBytes, 0, nullptr); + } + + auto ndisStatus = TParseFn(tlvLen, tlvBytes, &ctx.DevCtx->TlvContext, &p); + return Wifi::ConvertNDISSTATUSToNTSTATUS(ndisStatus); + } + + void Cleanup(ParamType& p) { TCleanupFn(&p); } + + // Runs the optional pre-check then the property handler. The handler writes the + // out-buffer and reports the number of bytes written. + NTSTATUS Handle(TransitionContext& ctx, ParamType& p, ULONG& bytesWritten) + { + bytesWritten = sizeof(WDI_MESSAGE_HEADER); + + WifiHAL* hal = GetWifiHalFromHandle(ctx.Device); + + if (TPreFn) + { + NTSTATUS preStatus = (hal->*TPreFn)(); + if (!NT_SUCCESS(preStatus)) + { + return preStatus; + } + } + + return (hal->*TPropertyFn)(p, ctx.RawBuffer, ctx.OutLen, bytesWritten); + } +}; + +// Primary traits template for property GET/SET messages (specialize per MessageId) +template<UINT16 MsgId> +struct PropertyTraits; + +// Generic runner for property GET/SET messages: parse -> handle -> complete (M3). +// Completes the request synchronously with the number of bytes the HAL wrote. +template<UINT16 MsgId> +NTSTATUS RunPropertyM3(TransitionContext& ctx) +{ + PropertyTraits<MsgId> traits; + typename PropertyTraits<MsgId>::ParamType params{}; + + NTSTATUS status = traits.Parse(ctx, params); + if (!NT_SUCCESS(status)) + { + traits.Cleanup(params); + WifiRequestComplete(ctx.WifiRequest, status, sizeof(WDI_MESSAGE_HEADER)); + return status; + } + + ULONG bytesWritten = sizeof(WDI_MESSAGE_HEADER); + status = traits.Handle(ctx, params, bytesWritten); + + traits.Cleanup(params); + WifiRequestComplete(ctx.WifiRequest, status, bytesWritten); + return status; +} + +//// -------- SCENARIO: [Connect with a SAE WI-FI7 network -------- +/// Demo: Handle WDI_TASK_CONNECT + WDI_SET_SAE_AUTH_PARAMS then WDI_TASK_DISCONNECT +/// Scope: +/// -WifiRequest WDI_TASK_CONNECT & WDI_TASK_DISCONNECT are both WIFICX task commands, which is a two step M3/M4 transition +/// -The direct WifiRequest WDI_SET_SAE_AUTH_PARAMS, which is a single step transition but +/// is logically part of the connect scenario. since WDI_SET_SAE_AUTH_PARAMS is WIFICX property command, +/// it only has M3 step, no M4 step. +/// - The WifiCx unsolicited indication e.g. WDI_INDICATION_SAE_AUTH_PARAMS_NEEDED is sent from the HAL during the connect process, +/// Notes: +/// - M3 and M4 status mainly used for WifiCx to track progress of the transition. e.g. the hung detection and trigger recovery. +/// - The actual scenario result is reported through unsolicited indication. +/// + +// -------- WDI_TASK_CONNECT -------- +template<> +struct TransitionTraits<WDI_TASK_CONNECT> + : GenericTransitionTraits < + WDI_TASK_CONNECT, + WDI_TASK_CONNECT_PARAMETERS, + WDI_INDICATION_CONNECT_COMPLETE, + true, // dump TLV stream? (was true in original) + ParseWdiTaskConnect, + CleanupParsedWdiTaskConnect, + &WifiHAL::WifiIhvIsDeviceReadyForRequest, // pre-M3 + &WifiHAL::WifiIhvConnect, // HAL M3 + &WifiHAL::WifiIhvGetPendingTransitionStatus, // pre-M4 + nullptr + > +{ +}; + +// --- WDI_SET_SAE_AUTH_PARAMS --- +template<> +struct TransitionTraits<WDI_SET_SAE_AUTH_PARAMS> + : GenericTransitionTraits< + WDI_SET_SAE_AUTH_PARAMS, + WDI_SET_SAE_AUTH_PARAMS_COMMAND, + WDI_INDICATION_CONNECT_COMPLETE, + false, // dump TLV stream? (was false in original) + ParseWdiSetSaeAuthParams, + CleanupParsedWdiSetSaeAuthParams, + &WifiHAL::WifiIhvIsDeviceReadyForRequest, // pre-M3 + &WifiHAL::WifiIhvSetSaeAuthParams, // HAL M3 + &WifiHAL::WifiIhvGetPendingTransitionStatus, // pre-M4 + nullptr// HAL M4 + > +{}; + +// -------- WDI_TASK_DISCONNECT -------- +template<> +struct TransitionTraits<WDI_TASK_DISCONNECT> + : GenericTransitionTraits< + WDI_TASK_DISCONNECT, + WDI_TASK_DISCONNECT_PARAMETERS, + WDI_INDICATION_DISCONNECT_COMPLETE, + false, // dump TLV stream? (was false in original) + ParseWdiTaskDisconnect, + CleanupParsedWdiTaskDisconnect, + &WifiHAL::WifiIhvIsDeviceReadyForRequest, // pre-M3 + &WifiHAL::WifiIhvDisconnect, // HAL M3 + &WifiHAL::WifiIhvGetPendingTransitionStatus, // pre-M4 + nullptr // HAL M4 + > +{ +}; +/// ----- End of scenario [Connect with a SAE WI-FI7 network]----- + +// -------- WDI_TASK_DOT11_RESET -------- +template<> +struct TransitionTraits<WDI_TASK_DOT11_RESET> + : GenericTransitionTraits < + WDI_TASK_DOT11_RESET, + WDI_TASK_DOT11_RESET_PARAMETERS, + WDI_INDICATION_DOT11_RESET_COMPLETE, + false, // dump TLV stream? (was false in original) + ParseWdiTaskDot11Reset, + CleanupParsedWdiTaskDot11Reset, + &WifiHAL::WifiIhvIsDeviceReadyForRequest, // pre-M3 + &WifiHAL::WifiIhvReset, // HAL M3 + &WifiHAL::WifiIhvGetPendingTransitionStatus, // pre-M4 + nullptr // HAL M4 + > +{ +}; + +// -------- WDI_TASK_SCAN -------- +template<> +struct TransitionTraits<WDI_TASK_SCAN> + : GenericTransitionTraits < + WDI_TASK_SCAN, + WDI_SCAN_PARAMETERS, + WDI_INDICATION_SCAN_COMPLETE, + true, // dump TLV stream? (was true in original) + ParseWdiTaskScan, + CleanupParsedWdiTaskScan, + &WifiHAL::WifiIhvIsDeviceReadyForRequest, // pre-M3 + &WifiHAL::WifiIhvScan, // HAL M3 + &WifiHAL::WifiIhvGetPendingTransitionStatus, // pre-M4 + nullptr // HAL M4 + > +{ +}; + +// -------- WDI_TASK_SET_RADIO_STATE -------- +template<> +struct TransitionTraits<WDI_TASK_SET_RADIO_STATE> + : GenericTransitionTraits < + WDI_TASK_SET_RADIO_STATE, + WDI_SET_RADIO_STATE_PARAMETERS, + WDI_INDICATION_SET_RADIO_STATE_COMPLETE, + true, // dump TLV stream? (was true in original) + ParseWdiTaskSetRadioState, + CleanupParsedWdiTaskSetRadioState, + &WifiHAL::WifiIhvIsDeviceReadyForRequest, // pre-M3 + &WifiHAL::WifiIhvSetRadioState, // HAL M3 + &WifiHAL::WifiIhvGetPendingTransitionStatus, // pre-M4 + nullptr // HAL M4 + > +{ +}; + +// -------- WDI_GET_SUPPORTED_DEVICE_SERVICES (property GET) -------- +// Request body is empty (header sufficient); the HAL produces the +// WDI_TLV_DEVICE_SERVICE_GUID_LIST result into the out-buffer. +template<> +struct PropertyTraits<WDI_GET_SUPPORTED_DEVICE_SERVICES> + : PropertyM3Traits< + WDI_GET_SUPPORTED_DEVICE_SERVICES, + WDI_GET_SUPPORTED_DEVICE_SERVICES_INPUTS, + true, // dump TLV stream + ParseWdiGetSupportedDeviceServices, + CleanupParsedWdiGetSupportedDeviceServices, + &WifiHAL::WifiIhvIsDeviceReadyForRequest, // pre-check + &WifiHAL::WifiIhvGetSupportedDeviceServices // property handler + > +{}; + +// -------- WDI_DEVICE_SERVICE_COMMAND (property SET/GET) -------- +// Reads the request data blob (WDI_TLV_DEVICE_SERVICE_PARAMS_*) and the HAL writes +// the response data blob into the out-buffer. +template<> +struct PropertyTraits<WDI_DEVICE_SERVICE_COMMAND> + : PropertyM3Traits< + WDI_DEVICE_SERVICE_COMMAND, + WDI_DEVICE_SERVICE_COMMAND_INPUTS, + true, // dump TLV stream + ParseWdiDeviceServiceCommand, + CleanupParsedWdiDeviceServiceCommand, + &WifiHAL::WifiIhvIsDeviceReadyForRequest, // pre-check + &WifiHAL::WifiIhvDeviceServiceCommand // property handler + > +{}; + +// Runtime dispatcher switches on MessageId and invokes the matching compile-time runner. +NTSTATUS RunTransitionByMessage(TransitionContext& ctx, UINT16 messageId) +{ + switch (messageId) + { + case WDI_TASK_SET_RADIO_STATE: + return RunTransition<WDI_TASK_SET_RADIO_STATE>(ctx); + case WDI_TASK_SCAN: + return RunTransition<WDI_TASK_SCAN>(ctx); + case WDI_TASK_DOT11_RESET: + return RunTransition<WDI_TASK_DOT11_RESET>(ctx); + case WDI_TASK_CONNECT: + return RunTransition<WDI_TASK_CONNECT>(ctx); + case WDI_TASK_DISCONNECT: + return RunTransition<WDI_TASK_DISCONNECT>(ctx); + case WDI_SET_SAE_AUTH_PARAMS: + return RunTransition<WDI_SET_SAE_AUTH_PARAMS>(ctx); + case WDI_GET_SUPPORTED_DEVICE_SERVICES: + return RunPropertyM3<WDI_GET_SUPPORTED_DEVICE_SERVICES>(ctx); + case WDI_DEVICE_SERVICE_COMMAND: + return RunPropertyM3<WDI_DEVICE_SERVICE_COMMAND>(ctx); + default: + UINT bytesWritten = sizeof(WDI_MESSAGE_HEADER); + WifiRequestComplete(ctx.WifiRequest, STATUS_NOT_SUPPORTED, bytesWritten); + return STATUS_NOT_SUPPORTED; + } +} \ No newline at end of file diff --git a/network/wlan/wificx/drivercode/wifitransition.h b/network/wlan/wificx/drivercode/wifitransition.h new file mode 100644 index 000000000..c48d4a78f --- /dev/null +++ b/network/wlan/wificx/drivercode/wifitransition.h @@ -0,0 +1,20 @@ +// Copyright (C) Microsoft Corporation. All rights reserved. +#pragma once +#include "precomp.h" +#include "wifiHAL.h" +#include "wifirequest.h" + +// Generic execution context passed between steps and parse/handle +struct TransitionContext +{ + WDFDEVICE Device; + PWIFI_IHV_DEVICE_CONTEXT DevCtx; + WIFIREQUEST WifiRequest; + PWDI_MESSAGE_HEADER Header; + void* RawBuffer; // from WifiRequestGetInOutBuffer in EvtWifiDeviceSendCommand + UINT InLen; + UINT OutLen; +}; + +// -------- Runtime dispatcher (decl) -------- +NTSTATUS RunTransitionByMessage(TransitionContext& ctx, UINT16 messageId); \ No newline at end of file diff --git a/network/wlan/wificx/km/wificxsampleclientkm.inf b/network/wlan/wificx/km/wificxsampleclientkm.inf new file mode 100644 index 000000000..1968ff32f --- /dev/null +++ b/network/wlan/wificx/km/wificxsampleclientkm.inf @@ -0,0 +1,96 @@ +;Copyright (c) Microsoft Corporation. All rights reserved. +; wificxsampleclientkm.inf +; + +[Version] +Signature = "$WINDOWS NT$" +Class = NET +ClassGuid = {4d36e972-e325-11ce-bfc1-08002be10318} +Provider = %ManufacturerName% +CatalogFile = wificxsampleclientkm.cat +DriverVer = ; TODO: set DriverVer in stampinf property pages +PnpLockdown = 1 + +[DestinationDirs] +DefaultDestDir = 13 + +[SourceDisksNames] +1 = %DiskName%,,,"" + +[SourceDisksFiles] +wificxsampleclientkm.sys = 1,, + +;***************************************** +; Install Section +;***************************************** + +[Manufacturer] +%ManufacturerName% = Standard,NT$ARCH$.10.0...16299 ; %13% support introduced in build 16299 + +[Standard.NT$ARCH$.10.0...16299] +%wificxsampleclientkm.DeviceDesc% = wificxsampleclientkm_Device.ndi, Root\wificxsampleclientkm + +; +; Normal device - Networking Section +; +[wificxsampleclientkm_Device.ndi.NT] +CopyFiles = File_Copy +Characteristics = 0x84 ; NCF_HAS_UI, NCF_PHYSICAL +BusType = 0 ; Internal +AddReg = wificxsampleclientkm.reg, netvadapter.params +*IfType = 71 ; IF_TYPE_IEEE80211 +*MediaType = 16 ; NdisMediumNative802_11 +*PhysicalMediaType = 9 ; NdisPhysicalMediumNative802_11 + +[File_Copy] +wificxsampleclientkm.sys + +;-------------- Service installation +[wificxsampleclientkm_Device.ndi.NT.Services] +AddService = wificxsampleclientkm,%SPSVCINST_ASSOCSERVICE%, wificxsampleclientkm_Service_Inst + +; -------------- wificxsampleclientkm driver install sections +[wificxsampleclientkm_Service_Inst] +DisplayName = %wificxsampleclientkm.SVCDESC% +ServiceType = 1 ; SERVICE_KERNEL_DRIVER +StartType = 3 ; SERVICE_DEMAND_START +ErrorControl = 1 ; SERVICE_ERROR_NORMAL +ServiceBinary = %13%\wificxsampleclientkm.sys + +[wificxsampleclientkm_Device.ndi.NT.Wdf] +KmdfService = wificxsampleclientkm, wificxsampleclientkm_wdfsect + +[wificxsampleclientkm_wdfsect] +KmdfLibraryVersion = $KMDFVERSION$ + + +[wificxsampleclientkm.reg] +HKR, Ndi, Service, 0, "wificxsampleclientkm" +HKR, Ndi\Interfaces, UpperRange, 0, "ndis5" +HKR, Ndi\Interfaces, LowerRange, 0, "wlan,ethernet" +; standard INF keywords for NetAdapter drivers +; using AddReg directive so they will work when this INF being Includes/Needs + +HKR, NetworkInterface, *IfConnectorPresent, 0x00010001, 1 +HKR, NetworkInterface, *ConnectionType, 0x00010001, 1 +HKR, NetworkInterface, *DirectionType, 0x00010001, 0 +HKR, NetworkInterface, *AccessType, 0x00010001, 2 +HKR, NetworkInterface, *HardwareLoopback, 0x00010001, 0 +HKR, , NumberOfNetworkInterfaces, 0x00010001, 11 + +[Strings] +SPSVCINST_ASSOCSERVICE = 0x00000002 +ManufacturerName = "WDK Sample" +DiskName = "Wificxsampleclientkm Installation Disk" +wificxsampleclientkm.DeviceDesc = "[KMDF]Wificx Sample Client Device" +wificxsampleclientkm.SVCDESC = "Wificxsampleclientkm Service" + +[netvadapter.params] +; MACLastByte + HKR, Ndi\params\MACLastByte, ParamDesc, 0, "MACLastByte" + HKR, Ndi\params\MACLastByte, default, 0, "1" + HKR, Ndi\params\MACLastByte, type, 0, "int" + HKR, Ndi\params\MACLastByte, min, 0, "1" + HKR, Ndi\params\MACLastByte, max, 0, "254" + HKR, Ndi\params\MACLastByte, step, 0, "1" + HKR, Ndi\params\MACLastByte, Optional, 0, "0" \ No newline at end of file diff --git a/network/wlan/wificx/km/wificxsampleclientkm.vcxproj b/network/wlan/wificx/km/wificxsampleclientkm.vcxproj new file mode 100644 index 000000000..08f69e0f6 --- /dev/null +++ b/network/wlan/wificx/km/wificxsampleclientkm.vcxproj @@ -0,0 +1,246 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|x64"> + <Configuration>Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|x64"> + <Configuration>Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Debug|ARM64"> + <Configuration>Debug</Configuration> + <Platform>ARM64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|ARM64"> + <Configuration>Release</Configuration> + <Platform>ARM64</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{272D3E7B-C7BA-66D1-E05D-B9723A6F0777}</ProjectGuid> + <TemplateGuid>{1bc93793-694f-48fe-9372-81e2b05556fd}</TemplateGuid> + <TargetFrameworkVersion>v4.5</TargetFrameworkVersion> + <MinimumVisualStudioVersion>12.0</MinimumVisualStudioVersion> + <Configuration>Debug</Configuration> + <Platform Condition="'$(Platform)' == ''">x64</Platform> + <RootNamespace>wificxsampleclientkm</RootNamespace> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset> + <ConfigurationType>Driver</ConfigurationType> + <DriverType>KMDF</DriverType> + <DriverTargetPlatform>Windows Driver</DriverTargetPlatform> + <KMDF_VERSION_MAJOR>1</KMDF_VERSION_MAJOR> + <KMDF_VERSION_MINOR>33</KMDF_VERSION_MINOR> + <KMDF_MINIMUM_VERSION_REQUIRED>33</KMDF_MINIMUM_VERSION_REQUIRED> + <NetAdapterDriver>true</NetAdapterDriver> + <NETADAPTER_VERSION_MAJOR>2</NETADAPTER_VERSION_MAJOR> + <NETADAPTER_VERSION_MINOR>6</NETADAPTER_VERSION_MINOR> + <NETADAPTER_MINIMUM_VERSION_REQUIRED> + </NETADAPTER_MINIMUM_VERSION_REQUIRED> + <WifiDriver>true</WifiDriver> + <WIFI_VERSION_MAJOR>1</WIFI_VERSION_MAJOR> + <WIFI_VERSION_MINOR>2</WIFI_VERSION_MINOR> + <SupportsPackaging>true</SupportsPackaging> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset> + <ConfigurationType>Driver</ConfigurationType> + <DriverType>KMDF</DriverType> + <DriverTargetPlatform>Windows Driver</DriverTargetPlatform> + <KMDF_VERSION_MAJOR>1</KMDF_VERSION_MAJOR> + <KMDF_VERSION_MINOR>33</KMDF_VERSION_MINOR> + <KMDF_MINIMUM_VERSION_REQUIRED>33</KMDF_MINIMUM_VERSION_REQUIRED> + <NetAdapterDriver>true</NetAdapterDriver> + <NETADAPTER_VERSION_MAJOR>2</NETADAPTER_VERSION_MAJOR> + <NETADAPTER_VERSION_MINOR>5</NETADAPTER_VERSION_MINOR> + <NETADAPTER_MINIMUM_VERSION_REQUIRED>4</NETADAPTER_MINIMUM_VERSION_REQUIRED> + <WifiDriver>true</WifiDriver> + <WIFI_VERSION_MAJOR>1</WIFI_VERSION_MAJOR> + <WIFI_VERSION_MINOR>2</WIFI_VERSION_MINOR> + <SupportsPackaging>true</SupportsPackaging> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset> + <ConfigurationType>Driver</ConfigurationType> + <DriverType>KMDF</DriverType> + <DriverTargetPlatform>Windows Driver</DriverTargetPlatform> + <KMDF_VERSION_MAJOR>1</KMDF_VERSION_MAJOR> + <KMDF_VERSION_MINOR>33</KMDF_VERSION_MINOR> + <KMDF_MINIMUM_VERSION_REQUIRED>33</KMDF_MINIMUM_VERSION_REQUIRED> + <NetAdapterDriver>true</NetAdapterDriver> + <NETADAPTER_VERSION_MAJOR>2</NETADAPTER_VERSION_MAJOR> + <NETADAPTER_VERSION_MINOR>5</NETADAPTER_VERSION_MINOR> + <NETADAPTER_MINIMUM_VERSION_REQUIRED>4</NETADAPTER_MINIMUM_VERSION_REQUIRED> + <WifiDriver>true</WifiDriver> + <WIFI_VERSION_MAJOR>1</WIFI_VERSION_MAJOR> + <WIFI_VERSION_MINOR>2</WIFI_VERSION_MINOR> + <SupportsPackaging>true</SupportsPackaging> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset> + <ConfigurationType>Driver</ConfigurationType> + <DriverType>KMDF</DriverType> + <DriverTargetPlatform>Windows Driver</DriverTargetPlatform> + <KMDF_VERSION_MAJOR>1</KMDF_VERSION_MAJOR> + <KMDF_VERSION_MINOR>33</KMDF_VERSION_MINOR> + <KMDF_MINIMUM_VERSION_REQUIRED>33</KMDF_MINIMUM_VERSION_REQUIRED> + <NetAdapterDriver>true</NetAdapterDriver> + <NETADAPTER_VERSION_MAJOR>2</NETADAPTER_VERSION_MAJOR> + <NETADAPTER_VERSION_MINOR>5</NETADAPTER_VERSION_MINOR> + <NETADAPTER_MINIMUM_VERSION_REQUIRED>4</NETADAPTER_MINIMUM_VERSION_REQUIRED> + <WifiDriver>true</WifiDriver> + <WIFI_VERSION_MAJOR>1</WIFI_VERSION_MAJOR> + <WIFI_VERSION_MINOR>2</WIFI_VERSION_MINOR> + <SupportsPackaging>true</SupportsPackaging> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor> + <RunCodeAnalysis>false</RunCodeAnalysis> + <EnableInf2cat>false</EnableInf2cat> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor> + <RunCodeAnalysis>false</RunCodeAnalysis> + <EnableInf2cat>false</EnableInf2cat> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'"> + <DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor> + <RunCodeAnalysis>false</RunCodeAnalysis> + <EnableInf2cat>false</EnableInf2cat> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'"> + <DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor> + <RunCodeAnalysis>false</RunCodeAnalysis> + <EnableInf2cat>false</EnableInf2cat> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <DriverSign> + <FileDigestAlgorithm>sha256</FileDigestAlgorithm> + </DriverSign> + <ClCompile> + <WppEnabled>true</WppEnabled> + <AdditionalIncludeDirectories>..\..\..\netadaptercx\netvadapterlibrary\Interface;$(DDK_INC_PATH)wlan\2.0;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <WppRecorderEnabled>true</WppRecorderEnabled> + <WppScanConfigurationData>..\drivercode\trace.h</WppScanConfigurationData> + <WppMinimalRebuildFromTracking>false</WppMinimalRebuildFromTracking> + <PreprocessorDefinitions>_HAS_EXCEPTIONS=0;%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <Link> + <AdditionalDependencies>$(DDK_LIB_PATH)wlan\2.0\WificxTLVGenParse.lib;%(AdditionalDependencies)</AdditionalDependencies> + </Link> + <Inf> + <TimeStamp>1.0</TimeStamp> + </Inf> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <DriverSign> + <FileDigestAlgorithm>sha256</FileDigestAlgorithm> + </DriverSign> + <ClCompile> + <AdditionalIncludeDirectories>..\..\..\netadaptercx\netvadapterlibrary\Interface;$(DDK_INC_PATH)wlan\2.0;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <WppEnabled>true</WppEnabled> + <WppRecorderEnabled>true</WppRecorderEnabled> + <WppScanConfigurationData>..\drivercode\trace.h</WppScanConfigurationData> + <WppMinimalRebuildFromTracking>false</WppMinimalRebuildFromTracking> + <PreprocessorDefinitions>_HAS_EXCEPTIONS=0;%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <Link> + <AdditionalDependencies>$(DDK_LIB_PATH)wlan\2.0\WificxTLVGenParse.lib;%(AdditionalDependencies)</AdditionalDependencies> + </Link> + <Inf> + <TimeStamp>1.0</TimeStamp> + </Inf> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'"> + <DriverSign> + <FileDigestAlgorithm>sha256</FileDigestAlgorithm> + </DriverSign> + <ClCompile> + <AdditionalIncludeDirectories>..\..\..\netadaptercx\netvadapterlibrary\Interface;$(DDK_INC_PATH)wlan\2.0;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <WppEnabled>true</WppEnabled> + <WppRecorderEnabled>true</WppRecorderEnabled> + <WppScanConfigurationData>..\drivercode\trace.h</WppScanConfigurationData> + <WppMinimalRebuildFromTracking>false</WppMinimalRebuildFromTracking> + <PreprocessorDefinitions>_HAS_EXCEPTIONS=0;%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <Link> + <AdditionalDependencies>$(DDK_LIB_PATH)wlan\2.0\WificxTLVGenParse.lib;%(AdditionalDependencies)</AdditionalDependencies> + </Link> + <Inf> + <TimeStamp>1.0</TimeStamp> + </Inf> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'"> + <DriverSign> + <FileDigestAlgorithm>sha256</FileDigestAlgorithm> + </DriverSign> + <ClCompile> + <AdditionalIncludeDirectories>..\..\..\netadaptercx\netvadapterlibrary\Interface;$(DDK_INC_PATH)wlan\2.0;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <WppEnabled>true</WppEnabled> + <WppRecorderEnabled>true</WppRecorderEnabled> + <WppScanConfigurationData>..\drivercode\trace.h</WppScanConfigurationData> + <WppMinimalRebuildFromTracking>false</WppMinimalRebuildFromTracking> + <PreprocessorDefinitions>_HAS_EXCEPTIONS=0;%(PreprocessorDefinitions)</PreprocessorDefinitions> + </ClCompile> + <Link> + <AdditionalDependencies>$(DDK_LIB_PATH)wlan\2.0\WificxTLVGenParse.lib;%(AdditionalDependencies)</AdditionalDependencies> + </Link> + <Inf> + <TimeStamp>1.0</TimeStamp> + </Inf> + </ItemDefinitionGroup> + <ItemGroup> + <Inf Include="wificxsampleclientkm.inf" /> + </ItemGroup> + <ItemGroup> + <FilesToPackage Include="$(TargetPath)" /> + </ItemGroup> + <ItemGroup> + <ClCompile Include="..\drivercode\adapter.cpp" /> + <ClCompile Include="..\drivercode\wifirequest.cpp" /> + <ClCompile Include="..\drivercode\device.cpp" /> + <ClCompile Include="..\drivercode\driver.cpp" /> + <ClCompile Include="..\drivercode\memorymanagement.cpp" /> + <ClCompile Include="..\drivercode\wifihal.cpp" /> + <ClCompile Include="..\drivercode\wifitransition.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\precomp.h" /> + <ClInclude Include="..\drivercode\trace.h" /> + <ClInclude Include="..\drivercode\wifihal.h" /> + <ClInclude Include="..\drivercode\wifitransition.h" /> + </ItemGroup> + <ItemGroup> + <ProjectReference Include="..\..\..\netadaptercx\netvadapterlibrary\wifi_km\netvadapterlibrarykm.vcxproj"> + <Project>{e2a65efd-25cc-4af0-b180-0cd56ee277a9}</Project> + </ProjectReference> + </ItemGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> +</Project> \ No newline at end of file diff --git a/network/wlan/wificx/km/wificxsampleclientkm.vcxproj.filters b/network/wlan/wificx/km/wificxsampleclientkm.vcxproj.filters new file mode 100644 index 000000000..2930b24dd --- /dev/null +++ b/network/wlan/wificx/km/wificxsampleclientkm.vcxproj.filters @@ -0,0 +1,84 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup> + <Filter Include="Source Files"> + <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier> + <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions> + </Filter> + <Filter Include="Header Files"> + <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier> + <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions> + </Filter> + <Filter Include="Resource Files"> + <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier> + <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions> + </Filter> + <Filter Include="Driver Files"> + <UniqueIdentifier>{8E41214B-6785-4CFE-B992-037D68949A14}</UniqueIdentifier> + <Extensions>inf;inv;inx;mof;mc;</Extensions> + </Filter> + </ItemGroup> + <ItemGroup> + <Inf Include="wificxsampleclientkm.inf"> + <Filter>Driver Files</Filter> + </Inf> + </ItemGroup> + <ItemGroup> + <ClCompile Include="..\drivercode\adapter.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="..\drivercode\wifirequest.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="..\drivercode\device.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="..\drivercode\driver.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="..\drivercode\memorymanagement.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="..\drivercode\wifihal.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="..\drivercode\wifitransition.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + </ItemGroup> + <ItemGroup> + <ClInclude Include="..\drivercode\adapter.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="..\drivercode\device.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="..\drivercode\driver.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="..\drivercode\sharedtypes.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="..\drivercode\umkmfusion.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="..\drivercode\wifihaltestdata.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="..\drivercode\wifirequest.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="..\drivercode\precomp.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="..\drivercode\trace.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="..\drivercode\wifihal.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="..\drivercode\wifitransition.h"> + <Filter>Header Files</Filter> + </ClInclude> + </ItemGroup> +</Project> \ No newline at end of file diff --git a/network/wlan/wificx/um/wificxsampleclientum.inf b/network/wlan/wificx/um/wificxsampleclientum.inf new file mode 100644 index 000000000..986332342 --- /dev/null +++ b/network/wlan/wificx/um/wificxsampleclientum.inf @@ -0,0 +1,107 @@ +;Copyright (c) Microsoft Corporation. All rights reserved. +; wificxsampleclientum.inf +; + +[Version] +Signature = $Windows NT$ +Class = NET +ClassGuid = {4d36e972-e325-11ce-bfc1-08002be10318} +Provider = %ManufacturerName% +CatalogFile = wificxsampleclientum.cat +DriverVer = ; TODO: set DriverVer in stampinf property pages +PnpLockdown = 1 + +[Manufacturer] +; This driver package is only installable on Win11+ +%ManufacturerName% = Standard,NT$ARCH$.10.0...22000 ; wudfrd.inf introduced in build 22000 + +[Standard.NT$ARCH$.10.0...22000] +%DeviceName% = Wificxsampleclientum_Device.ndi, Root\wificxsampleclientum + +; +; Normal device - Networking Section +; +[Wificxsampleclientum_Device.ndi] +Include=wudfrd.inf, netcxrd.inf +Needs=WUDFRD.NT, netcxrd_Filter.NT + +Characteristics = 0x1 ; NCF_VIRTUAL +*IfType = 71 ; IF_TYPE_IEEE80211 +*MediaType = 16 ; NdisMediumNative802_11 +*PhysicalMediaType = 9 ; NdisPhysicalMediumNative802_11 +BusType = 15 ; PnpBus +NumberOfNetworkInterfaces = 5 +AddReg = Wificxsampleclientum.reg, netvadapter.params +CopyFiles = Wificxsampleclientum.Copy + +[Wificxsampleclientum_Device.ndi.Hw] +Include=wudfrd.inf, netcxrd.inf +Needs=WUDFRD.NT.HW, netcxrd_Filter.NT.HW + +[Wificxsampleclientum_Device.ndi.Filters] +Include=netcxrd.inf +Needs=netcxrd_Filter.NT.Filters + +[Wificxsampleclientum_Device.ndi.Services] +Include=wudfrd.inf, netcxrd.inf +Needs=WUDFRD.NT.Services, netcxrd_Filter.NT.Services + +[Wificxsampleclientum_Device.ndi.Wdf] +UmdfService = "Wificxsampleclientum", wdf +UmdfServiceOrder=wificxsampleclientum +UmdfHostProcessSharing=ProcessSharingDisabled +UmdfKernelModeClientPolicy=AllowKernelModeClients +UmdfDirectHardwareAccess=AllowDirectHardwareAccessAndDma +UmdfRegisterAccessMode=RegisterAccessUsingUserModeMapping +UmdfFsContextUsePolicy=CanUseFsContext2 + +[wdf] +UmdfLibraryVersion = 2.33.0 +UmdfExtensions = NetAdapterCx0202,WifiCx0102 +ServiceBinary=%13%\wificxtestclient.dll +; +; Common - Generic INF sections +; +[Wificxsampleclientum.reg] +HKR, , BusNumber, 0, "0" +HKR, Ndi, Service, 0, "Wificxsampleclientum" +HKR, Ndi\Interfaces, UpperRange, 0, "ndis5" +HKR, Ndi\Interfaces, LowerRange, 0, "wlan,ethernet" + +; standard INF keywords for NetAdapter drivers +; using AddReg directive so they will work when this INF being Includes/Needs +HKR, NetworkInterface, *IfConnectorPresent, 0x00010001, 1 +HKR, NetworkInterface, *ConnectionType, 0x00010001, 1 +HKR, NetworkInterface, *DirectionType, 0x00010001, 0 +HKR, NetworkInterface, *AccessType, 0x00010001, 2 +HKR, NetworkInterface, *HardwareLoopback, 0x00010001, 0 +HKR, , NumberOfNetworkInterfaces, 0x00010001, 11 + +[Wificxsampleclientum.Copy] +wificxsampleclientum.dll + +[SourceDisksNames] +1 = %DiskName%,,,"" + +[DestinationDirs] +Wificxsampleclientum.Copy = 13 + +[SourceDisksFiles] +wificxsampleclientum.dll = 1 + +; =================== Generic ================================== + +[Strings] +ManufacturerName = "WDK Sample" +DiskName = "wificxsampleclientum Installation Disk" +DeviceName = "[UMDF] Wificx Sample Client Device" + +[netvadapter.params] +; MACLastByte + HKR, Ndi\params\MACLastByte, ParamDesc, 0, "MACLastByte" + HKR, Ndi\params\MACLastByte, default, 0, "1" + HKR, Ndi\params\MACLastByte, type, 0, "int" + HKR, Ndi\params\MACLastByte, min, 0, "1" + HKR, Ndi\params\MACLastByte, max, 0, "254" + HKR, Ndi\params\MACLastByte, step, 0, "1" + HKR, Ndi\params\MACLastByte, Optional, 0, "0" \ No newline at end of file diff --git a/network/wlan/wificx/um/wificxsampleclientum.vcxproj b/network/wlan/wificx/um/wificxsampleclientum.vcxproj new file mode 100644 index 000000000..5bb17f54a --- /dev/null +++ b/network/wlan/wificx/um/wificxsampleclientum.vcxproj @@ -0,0 +1,229 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|x64"> + <Configuration>Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|x64"> + <Configuration>Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Debug|ARM64"> + <Configuration>Debug</Configuration> + <Platform>ARM64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|ARM64"> + <Configuration>Release</Configuration> + <Platform>ARM64</Platform> + </ProjectConfiguration> + </ItemGroup> + <ItemGroup> + <Inf Include="wificxsampleclientum.inf" /> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{C804D7D0-80D8-1409-44DA-91EF3260D07F}</ProjectGuid> + <TemplateGuid>{2177f19c-eb4c-4687-9e7f-f9eec1f12cf1}</TemplateGuid> + <TargetFrameworkVersion>v4.5</TargetFrameworkVersion> + <MinimumVisualStudioVersion>12.0</MinimumVisualStudioVersion> + <Configuration>Debug</Configuration> + <Platform Condition="'$(Platform)' == ''">x64</Platform> + <RootNamespace>wificxsampleclientum</RootNamespace> + </PropertyGroup> + <PropertyGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <PlatformToolset>WindowsUserModeDriver10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <DriverTargetPlatform>Universal</DriverTargetPlatform> + </PropertyGroup> + <PropertyGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <PlatformToolset>WindowsUserModeDriver10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <DriverTargetPlatform>Universal</DriverTargetPlatform> + </PropertyGroup> + <PropertyGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'"> + <PlatformToolset>WindowsUserModeDriver10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <DriverTargetPlatform>Universal</DriverTargetPlatform> + </PropertyGroup> + <PropertyGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'"> + <PlatformToolset>WindowsUserModeDriver10.0</PlatformToolset> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <DriverTargetPlatform>Universal</DriverTargetPlatform> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>true</UseDebugLibraries> + <UMDF_VERSION_MAJOR>2</UMDF_VERSION_MAJOR> + <UMDF_VERSION_MINOR>35</UMDF_VERSION_MINOR> + <UMDF_MINIMUM_VERSION_REQUIRED>35</UMDF_MINIMUM_VERSION_REQUIRED> + <NetAdapterDriver>true</NetAdapterDriver> + <NETADAPTER_VERSION_MAJOR>2</NETADAPTER_VERSION_MAJOR> + <NETADAPTER_VERSION_MINOR>6</NETADAPTER_VERSION_MINOR> + <WifiDriver>true</WifiDriver> + <WIFI_VERSION_MAJOR>1</WIFI_VERSION_MAJOR> + <WIFI_VERSION_MINOR>2</WIFI_VERSION_MINOR> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>false</UseDebugLibraries> + <UMDF_VERSION_MAJOR>2</UMDF_VERSION_MAJOR> + <UMDF_VERSION_MINOR>35</UMDF_VERSION_MINOR> + <UMDF_MINIMUM_VERSION_REQUIRED>35</UMDF_MINIMUM_VERSION_REQUIRED> + <NetAdapterDriver>true</NetAdapterDriver> + <NETADAPTER_VERSION_MAJOR>2</NETADAPTER_VERSION_MAJOR> + <NETADAPTER_VERSION_MINOR>5</NETADAPTER_VERSION_MINOR> + <WifiDriver>true</WifiDriver> + <WIFI_VERSION_MAJOR>1</WIFI_VERSION_MAJOR> + <WIFI_VERSION_MINOR>2</WIFI_VERSION_MINOR> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>true</UseDebugLibraries> + <UMDF_VERSION_MAJOR>2</UMDF_VERSION_MAJOR> + <UMDF_VERSION_MINOR>35</UMDF_VERSION_MINOR> + <UMDF_MINIMUM_VERSION_REQUIRED>35</UMDF_MINIMUM_VERSION_REQUIRED> + <NetAdapterDriver>true</NetAdapterDriver> + <NETADAPTER_VERSION_MAJOR>2</NETADAPTER_VERSION_MAJOR> + <NETADAPTER_VERSION_MINOR>5</NETADAPTER_VERSION_MINOR> + <WifiDriver>true</WifiDriver> + <WIFI_VERSION_MAJOR>1</WIFI_VERSION_MAJOR> + <WIFI_VERSION_MINOR>2</WIFI_VERSION_MINOR> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" Label="Configuration"> + <TargetVersion>Windows10</TargetVersion> + <UseDebugLibraries>false</UseDebugLibraries> + <UMDF_VERSION_MAJOR>2</UMDF_VERSION_MAJOR> + <UMDF_VERSION_MINOR>35</UMDF_VERSION_MINOR> + <UMDF_MINIMUM_VERSION_REQUIRED>35</UMDF_MINIMUM_VERSION_REQUIRED> + <NetAdapterDriver>true</NetAdapterDriver> + <NETADAPTER_VERSION_MAJOR>2</NETADAPTER_VERSION_MAJOR> + <NETADAPTER_VERSION_MINOR>5</NETADAPTER_VERSION_MINOR> + <WifiDriver>true</WifiDriver> + <WIFI_VERSION_MAJOR>1</WIFI_VERSION_MAJOR> + <WIFI_VERSION_MINOR>2</WIFI_VERSION_MINOR> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <DebuggerFlavor>DbgengRemoteDebugger</DebuggerFlavor> + <EnableInf2cat>false</EnableInf2cat> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <DebuggerFlavor>DbgengRemoteDebugger</DebuggerFlavor> + <EnableInf2cat>false</EnableInf2cat> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'"> + <DebuggerFlavor>DbgengRemoteDebugger</DebuggerFlavor> + <EnableInf2cat>false</EnableInf2cat> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'"> + <DebuggerFlavor>DbgengRemoteDebugger</DebuggerFlavor> + <EnableInf2cat>false</EnableInf2cat> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <DriverSign> + <FileDigestAlgorithm>sha256</FileDigestAlgorithm> + </DriverSign> + <ClCompile> + <AdditionalIncludeDirectories>..\..\..\netadaptercx\netvadapterlibrary\Interface;$(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> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <DriverSign> + <FileDigestAlgorithm>sha256</FileDigestAlgorithm> + </DriverSign> + <ClCompile> + <AdditionalIncludeDirectories>..\..\..\netadaptercx\netvadapterlibrary\Interface;$(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> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'"> + <DriverSign> + <FileDigestAlgorithm>sha256</FileDigestAlgorithm> + </DriverSign> + <ClCompile> + <AdditionalIncludeDirectories>..\..\..\netadaptercx\netvadapterlibrary\Interface;$(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> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'"> + <DriverSign> + <FileDigestAlgorithm>sha256</FileDigestAlgorithm> + </DriverSign> + <ClCompile> + <AdditionalIncludeDirectories>..\..\..\netadaptercx\netvadapterlibrary\Interface;$(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> + </Link> + </ItemDefinitionGroup> + <ItemGroup> + <FilesToPackage Include="$(TargetPath)" /> + </ItemGroup> + <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\wifihaltestdata.h" /> + <ClInclude Include="..\drivercode\trace.h" /> + <ClInclude Include="..\drivercode\wifihal.h" /> + <ClInclude Include="..\drivercode\wifirequest.h" /> + <ClInclude Include="..\drivercode\umkmfusion.h" /> + <ClInclude Include="..\drivercode\wifitransition.h" /> + </ItemGroup> + <ItemGroup> + <ClCompile Include="..\drivercode\adapter.cpp" /> + <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" /> + <ClCompile Include="..\drivercode\wifitransition.cpp" /> + </ItemGroup> + <ItemGroup> + <ProjectReference Include="..\..\..\netadaptercx\netvadapterlibrary\wifi_um\netvadapterlibraryum.vcxproj"> + <Project>{612f33ad-430c-4fe7-8000-35e15a5eb757}</Project> + </ProjectReference> + </ItemGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> +</Project> \ No newline at end of file diff --git a/network/wlan/wificx/um/wificxsampleclientum.vcxproj.filters b/network/wlan/wificx/um/wificxsampleclientum.vcxproj.filters new file mode 100644 index 000000000..a10fb659f --- /dev/null +++ b/network/wlan/wificx/um/wificxsampleclientum.vcxproj.filters @@ -0,0 +1,84 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup> + <Filter Include="Source Files"> + <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier> + <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions> + </Filter> + <Filter Include="Header Files"> + <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier> + <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions> + </Filter> + <Filter Include="Resource Files"> + <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier> + <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions> + </Filter> + <Filter Include="Driver Files"> + <UniqueIdentifier>{8E41214B-6785-4CFE-B992-037D68949A14}</UniqueIdentifier> + <Extensions>inf;inv;inx;mof;mc;</Extensions> + </Filter> + </ItemGroup> + <ItemGroup> + <Inf Include="wificxsampleclientum.inf"> + <Filter>Driver Files</Filter> + </Inf> + </ItemGroup> + <ItemGroup> + <ClInclude Include="..\drivercode\adapter.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="..\drivercode\device.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="..\drivercode\driver.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="..\drivercode\precomp.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="..\drivercode\sharedtypes.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="..\drivercode\wifihaltestdata.h"> + <Filter>Header Files</Filter> + </ClInclude> + <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> + <ClInclude Include="..\drivercode\wifitransition.h"> + <Filter>Header Files</Filter> + </ClInclude> + </ItemGroup> + <ItemGroup> + <ClCompile Include="..\drivercode\adapter.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="..\drivercode\device.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="..\drivercode\driver.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="..\drivercode\memorymanagement.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="..\drivercode\wifirequest.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="..\drivercode\wifihal.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="..\drivercode\wifitransition.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + </ItemGroup> +</Project> \ No newline at end of file diff --git a/network/wlan/wificx/video/ControlPath.mp4 b/network/wlan/wificx/video/ControlPath.mp4 new file mode 100644 index 000000000..15ec3d625 Binary files /dev/null and b/network/wlan/wificx/video/ControlPath.mp4 differ diff --git a/network/wlan/wificx/video/DataPath.mp4 b/network/wlan/wificx/video/DataPath.mp4 new file mode 100644 index 000000000..fda748e5d Binary files /dev/null and b/network/wlan/wificx/video/DataPath.mp4 differ diff --git a/network/wlan/wificx/wificxsampleclient.sln b/network/wlan/wificx/wificxsampleclient.sln new file mode 100644 index 000000000..c3bf1f22a --- /dev/null +++ b/network/wlan/wificx/wificxsampleclient.sln @@ -0,0 +1,92 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 18 +VisualStudioVersion = 18.7.11903.348 +MinimumVisualStudioVersion = 12.0 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "wificxsampleclientkm", "km\wificxsampleclientkm.vcxproj", "{272D3E7B-C7BA-66D1-E05D-B9723A6F0777}" + ProjectSection(ProjectDependencies) = postProject + {E2A65EFD-25CC-4AF0-B180-0CD56EE277A9} = {E2A65EFD-25CC-4AF0-B180-0CD56EE277A9} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "wificxsampleclientum", "um\wificxsampleclientum.vcxproj", "{C804D7D0-80D8-1409-44DA-91EF3260D07F}" + ProjectSection(ProjectDependencies) = postProject + {612F33AD-430C-4FE7-8000-35E15A5EB757} = {612F33AD-430C-4FE7-8000-35E15A5EB757} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "OemDeviceServiceApplication", "OEM\OemDeviceService.vcxproj", "{B3C9A1E2-7F4D-4B2A-9C5E-1A2B3C4D5E6F}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "netvadapterlibrarykm", "..\..\netadaptercx\netvadapterlibrary\wifi_km\netvadapterlibrarykm.vcxproj", "{E2A65EFD-25CC-4AF0-B180-0CD56EE277A9}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "netvadapterlibraryum", "..\..\netadaptercx\netvadapterlibrary\wifi_um\netvadapterlibraryum.vcxproj", "{612F33AD-430C-4FE7-8000-35E15A5EB757}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|ARM64 = Debug|ARM64 + Debug|x64 = Debug|x64 + Release|ARM64 = Release|ARM64 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {272D3E7B-C7BA-66D1-E05D-B9723A6F0777}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {272D3E7B-C7BA-66D1-E05D-B9723A6F0777}.Debug|ARM64.Build.0 = Debug|ARM64 + {272D3E7B-C7BA-66D1-E05D-B9723A6F0777}.Debug|ARM64.Deploy.0 = Debug|ARM64 + {272D3E7B-C7BA-66D1-E05D-B9723A6F0777}.Debug|x64.ActiveCfg = Debug|x64 + {272D3E7B-C7BA-66D1-E05D-B9723A6F0777}.Debug|x64.Build.0 = Debug|x64 + {272D3E7B-C7BA-66D1-E05D-B9723A6F0777}.Debug|x64.Deploy.0 = Debug|x64 + {272D3E7B-C7BA-66D1-E05D-B9723A6F0777}.Release|ARM64.ActiveCfg = Release|ARM64 + {272D3E7B-C7BA-66D1-E05D-B9723A6F0777}.Release|ARM64.Build.0 = Release|ARM64 + {272D3E7B-C7BA-66D1-E05D-B9723A6F0777}.Release|ARM64.Deploy.0 = Release|ARM64 + {272D3E7B-C7BA-66D1-E05D-B9723A6F0777}.Release|x64.ActiveCfg = Release|x64 + {272D3E7B-C7BA-66D1-E05D-B9723A6F0777}.Release|x64.Build.0 = Release|x64 + {272D3E7B-C7BA-66D1-E05D-B9723A6F0777}.Release|x64.Deploy.0 = Release|x64 + {C804D7D0-80D8-1409-44DA-91EF3260D07F}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {C804D7D0-80D8-1409-44DA-91EF3260D07F}.Debug|ARM64.Build.0 = Debug|ARM64 + {C804D7D0-80D8-1409-44DA-91EF3260D07F}.Debug|ARM64.Deploy.0 = Debug|ARM64 + {C804D7D0-80D8-1409-44DA-91EF3260D07F}.Debug|x64.ActiveCfg = Debug|x64 + {C804D7D0-80D8-1409-44DA-91EF3260D07F}.Debug|x64.Build.0 = Debug|x64 + {C804D7D0-80D8-1409-44DA-91EF3260D07F}.Debug|x64.Deploy.0 = Debug|x64 + {C804D7D0-80D8-1409-44DA-91EF3260D07F}.Release|ARM64.ActiveCfg = Release|ARM64 + {C804D7D0-80D8-1409-44DA-91EF3260D07F}.Release|ARM64.Build.0 = Release|ARM64 + {C804D7D0-80D8-1409-44DA-91EF3260D07F}.Release|ARM64.Deploy.0 = Release|ARM64 + {C804D7D0-80D8-1409-44DA-91EF3260D07F}.Release|x64.ActiveCfg = Release|x64 + {C804D7D0-80D8-1409-44DA-91EF3260D07F}.Release|x64.Build.0 = Release|x64 + {C804D7D0-80D8-1409-44DA-91EF3260D07F}.Release|x64.Deploy.0 = Release|x64 + {B3C9A1E2-7F4D-4B2A-9C5E-1A2B3C4D5E6F}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {B3C9A1E2-7F4D-4B2A-9C5E-1A2B3C4D5E6F}.Debug|ARM64.Build.0 = Debug|ARM64 + {B3C9A1E2-7F4D-4B2A-9C5E-1A2B3C4D5E6F}.Debug|x64.ActiveCfg = Debug|x64 + {B3C9A1E2-7F4D-4B2A-9C5E-1A2B3C4D5E6F}.Debug|x64.Build.0 = Debug|x64 + {B3C9A1E2-7F4D-4B2A-9C5E-1A2B3C4D5E6F}.Release|ARM64.ActiveCfg = Release|ARM64 + {B3C9A1E2-7F4D-4B2A-9C5E-1A2B3C4D5E6F}.Release|ARM64.Build.0 = Release|ARM64 + {B3C9A1E2-7F4D-4B2A-9C5E-1A2B3C4D5E6F}.Release|x64.ActiveCfg = Release|x64 + {B3C9A1E2-7F4D-4B2A-9C5E-1A2B3C4D5E6F}.Release|x64.Build.0 = Release|x64 + {E2A65EFD-25CC-4AF0-B180-0CD56EE277A9}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {E2A65EFD-25CC-4AF0-B180-0CD56EE277A9}.Debug|ARM64.Build.0 = Debug|ARM64 + {E2A65EFD-25CC-4AF0-B180-0CD56EE277A9}.Debug|ARM64.Deploy.0 = Debug|ARM64 + {E2A65EFD-25CC-4AF0-B180-0CD56EE277A9}.Debug|x64.ActiveCfg = Debug|x64 + {E2A65EFD-25CC-4AF0-B180-0CD56EE277A9}.Debug|x64.Build.0 = Debug|x64 + {E2A65EFD-25CC-4AF0-B180-0CD56EE277A9}.Debug|x64.Deploy.0 = Debug|x64 + {E2A65EFD-25CC-4AF0-B180-0CD56EE277A9}.Release|ARM64.ActiveCfg = Release|ARM64 + {E2A65EFD-25CC-4AF0-B180-0CD56EE277A9}.Release|ARM64.Build.0 = Release|ARM64 + {E2A65EFD-25CC-4AF0-B180-0CD56EE277A9}.Release|ARM64.Deploy.0 = Release|ARM64 + {E2A65EFD-25CC-4AF0-B180-0CD56EE277A9}.Release|x64.ActiveCfg = Release|x64 + {E2A65EFD-25CC-4AF0-B180-0CD56EE277A9}.Release|x64.Build.0 = Release|x64 + {E2A65EFD-25CC-4AF0-B180-0CD56EE277A9}.Release|x64.Deploy.0 = Release|x64 + {612F33AD-430C-4FE7-8000-35E15A5EB757}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {612F33AD-430C-4FE7-8000-35E15A5EB757}.Debug|ARM64.Build.0 = Debug|ARM64 + {612F33AD-430C-4FE7-8000-35E15A5EB757}.Debug|ARM64.Deploy.0 = Debug|ARM64 + {612F33AD-430C-4FE7-8000-35E15A5EB757}.Debug|x64.ActiveCfg = Debug|x64 + {612F33AD-430C-4FE7-8000-35E15A5EB757}.Debug|x64.Build.0 = Debug|x64 + {612F33AD-430C-4FE7-8000-35E15A5EB757}.Debug|x64.Deploy.0 = Debug|x64 + {612F33AD-430C-4FE7-8000-35E15A5EB757}.Release|ARM64.ActiveCfg = Release|ARM64 + {612F33AD-430C-4FE7-8000-35E15A5EB757}.Release|ARM64.Build.0 = Release|ARM64 + {612F33AD-430C-4FE7-8000-35E15A5EB757}.Release|ARM64.Deploy.0 = Release|ARM64 + {612F33AD-430C-4FE7-8000-35E15A5EB757}.Release|x64.ActiveCfg = Release|x64 + {612F33AD-430C-4FE7-8000-35E15A5EB757}.Release|x64.Build.0 = Release|x64 + {612F33AD-430C-4FE7-8000-35E15A5EB757}.Release|x64.Deploy.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {37680CDC-EACB-499B-BA11-7C376F53DB71} + EndGlobalSection +EndGlobal