-> 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 += "$($st.Label) "
+ 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("$enc $cells `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 = "_NT_TARGET_VERSION Pass Flaky Partial Fail n/a Combos OK Sporadic Failed Excluded Pass rate "
+$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 += "$t $($x.pass) $($x.flaky) $($x.partial) $($x.fail) $($x.na) $($x.S) $($x.O) $($x.F) $($x.E) $rate `n"
+}
+$matHead = "Sample "
+foreach ($t in $tags) { $matHead += "$t " }
+$matHead += " "
+
+$html = @"
+
+WDK Driver Samples - Build Overview
+
+WDK Driver Samples — Build Overview
+Generated: $generated | columns are _NT_TARGET_VERSION (library link version); hover a cell for the per-combination breakdown.
+PASS PASS* (retry) PARTIAL FAIL -- n/a
+Summary by _NT_TARGET_VERSION
+
+Sample × _NT_TARGET_VERSION
+$matHead
+$($bodyRows.ToString())
+
+"@
+$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 — 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.' or the
+ short '' 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`` · _NT_TARGET_VERSION ``$NtTargetVersion``")
+ [void]$md.AppendLine()
+ [void]$md.AppendLine("Environment **$($buildEnv.Name)** · WDK build **$buildNumber** · **$($sampleSet.Count)** samples · $($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(":x: $($buildState.FailSet.Count) failed ")
+ [void]$md.AppendLine()
+ [void]$md.AppendLine("| Sample | Config/Platform | First error |")
+ [void]$md.AppendLine("|---|---|---|")
+ foreach ($entry in ($buildState.FailSet | Sort-Object)) {
+ if ($entry -match '^(?.*)\s+(?\w+)\|(?\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(" ")
+ [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.`) or the short
+`` 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+(?10\.0\.(?\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\\:
+Inf2Cat /driver:.\netvadapterkm /os:10_X64,Server10_X64
+Inf2Cat /driver:.\netvadapterum /os:10_X64,Server10_X64
+
+signtool sign /fd SHA256 /sha1 /tr http://timestamp.digicert.com /td SHA256 .\netvadapterkm\netvadapter.cat
+signtool sign /fd SHA256 /sha1 /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
+
+#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;
+
+ 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(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
+
+#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(buffer);
+ header->HeaderSize = sizeof(NETV_MEMORY_HEADER);
+ header->WdfMemoryHandle = wdfMemory;
+
+ return reinterpret_cast(reinterpret_cast(buffer) + sizeof(NETV_MEMORY_HEADER));
+}
+
+static void FreeBuffer(void* Buffer)
+{
+ if (Buffer == nullptr)
+ {
+ return;
+ }
+
+ auto header = reinterpret_cast(
+ reinterpret_cast(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
+
+#ifdef _KERNEL_MODE
+#include
+#else
+#include
+#include
+#endif
+
+#include
+#include
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 @@
+
+
+
+
+ Debug
+ x64
+
+
+ Release
+ x64
+
+
+ Debug
+ ARM64
+
+
+ Release
+ ARM64
+
+
+
+ {B4044984-19DD-456F-9D47-565F59A47F5E}
+ {1bc93793-694f-48fe-9372-81e2b05556fd}
+ v4.5
+ 12.0
+ Debug
+ x64
+ netvadapterkm
+
+
+
+ Windows10
+ true
+ WindowsKernelModeDriver10.0
+ Driver
+ KMDF
+ Windows Driver
+ 1
+ 33
+ 33
+ true
+ 2
+ 5
+ 4
+ true
+
+
+ Windows10
+ false
+ WindowsKernelModeDriver10.0
+ Driver
+ KMDF
+ Windows Driver
+ 1
+ 33
+ 33
+ true
+ 2
+ 5
+ 4
+ true
+
+
+ Windows10
+ true
+ WindowsKernelModeDriver10.0
+ Driver
+ KMDF
+ Windows Driver
+ 1
+ 33
+ 33
+ true
+ 2
+ 5
+ 4
+ true
+
+
+ Windows10
+ false
+ WindowsKernelModeDriver10.0
+ Driver
+ KMDF
+ Windows Driver
+ 1
+ 33
+ 33
+ true
+ 2
+ 5
+ 4
+ true
+
+
+
+
+
+
+
+
+
+
+ true
+
+
+ DbgengKernelDebugger
+ false
+ false
+ netvadapter
+
+
+ DbgengKernelDebugger
+ false
+ false
+ netvadapter
+
+
+ DbgengKernelDebugger
+ false
+ false
+ netvadapter
+
+
+ DbgengKernelDebugger
+ false
+ false
+ netvadapter
+
+
+
+ sha256
+
+
+ true
+ ..\..\netvadapterlibrary\Interface;..\..\netvadapterlibrary\code;..\..\..\..\wil\include;%(AdditionalIncludeDirectories)
+ true
+ ..\..\netvadapterlibrary\code\trace.h
+ false
+ _HAS_EXCEPTIONS=0;%(PreprocessorDefinitions)
+
+
+ 1.0
+
+
+
+
+ sha256
+
+
+ true
+ ..\..\netvadapterlibrary\Interface;..\..\netvadapterlibrary\code;..\..\..\..\wil\include;%(AdditionalIncludeDirectories)
+ true
+ ..\..\netvadapterlibrary\code\trace.h
+ false
+ _HAS_EXCEPTIONS=0;%(PreprocessorDefinitions)
+
+
+ 1.0
+
+
+
+
+ sha256
+
+
+ true
+ ..\..\netvadapterlibrary\Interface;..\..\netvadapterlibrary\code;..\..\..\..\wil\include;%(AdditionalIncludeDirectories)
+ true
+ ..\..\netvadapterlibrary\code\trace.h
+ false
+ _HAS_EXCEPTIONS=0;%(PreprocessorDefinitions)
+
+
+ 1.0
+
+
+
+
+ sha256
+
+
+ true
+ ..\..\netvadapterlibrary\Interface;..\..\netvadapterlibrary\code;..\..\..\..\wil\include;%(AdditionalIncludeDirectories)
+ true
+ ..\..\netvadapterlibrary\code\trace.h
+ false
+ _HAS_EXCEPTIONS=0;%(PreprocessorDefinitions)
+
+
+ 1.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {e2a65efd-25cc-4af0-b180-0cd56ee277a9}
+
+
+
+
\ 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 @@
+
+
+
+
+ {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
+ cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx
+
+
+ {93995380-89BD-4b04-88EB-625FBE52EBFB}
+ h;hpp;hxx;hm;inl;inc;xsd
+
+
+ {67DA6AB6-F800-4c08-8B7A-83BB121AAD01}
+ rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms
+
+
+ {8E41214B-6785-4CFE-B992-037D68949A14}
+ inf;inv;inx;mof;mc;
+
+
+
+
+ Driver Files
+
+
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+
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 @@
+
+
+
+
+ Debug
+ x64
+
+
+ Release
+ x64
+
+
+ Debug
+ ARM64
+
+
+ Release
+ ARM64
+
+
+
+
+
+
+ {1CDC2CE3-19F3-4200-87C7-C343FB2D8ED3}
+ {2177f19c-eb4c-4687-9e7f-f9eec1f12cf1}
+ v4.5
+ 12.0
+ Debug
+ x64
+ netvadapterum
+
+
+ WindowsUserModeDriver10.0
+ DynamicLibrary
+ Universal
+
+
+ WindowsUserModeDriver10.0
+ DynamicLibrary
+ Universal
+
+
+ WindowsUserModeDriver10.0
+ DynamicLibrary
+ Universal
+
+
+ WindowsUserModeDriver10.0
+ DynamicLibrary
+ Universal
+
+
+
+ Windows10
+ true
+ 2
+ 33
+ 33
+ true
+ 2
+ 5
+
+
+ Windows10
+ false
+ 2
+ 33
+ 33
+ true
+ 2
+ 5
+
+
+ Windows10
+ true
+ 2
+ 33
+ 33
+ true
+ 2
+ 5
+
+
+ Windows10
+ false
+ 2
+ 33
+ 33
+ true
+ 2
+ 5
+
+
+
+
+
+
+
+
+
+
+ true
+
+
+ DbgengRemoteDebugger
+ false
+ netvadapterum
+
+
+ DbgengRemoteDebugger
+ false
+ netvadapterum
+
+
+ DbgengRemoteDebugger
+ false
+ netvadapterum
+
+
+ DbgengRemoteDebugger
+ false
+ netvadapterum
+
+
+
+ sha256
+
+
+ ..\..\netvadapterlibrary\Interface;..\..\netvadapterlibrary\code;..\..\..\..\wil\include;$(KIT_SHARED_INC_PATH_WDK);%(AdditionalIncludeDirectories)
+ true
+ ..\..\netvadapterlibrary\code\trace.h
+ false
+ false
+ true
+
+
+
+
+ sha256
+
+
+ ..\..\netvadapterlibrary\Interface;..\..\netvadapterlibrary\code;..\..\..\..\wil\include;$(KIT_SHARED_INC_PATH_WDK);%(AdditionalIncludeDirectories)
+ true
+ ..\..\netvadapterlibrary\code\trace.h
+ false
+ false
+ true
+
+
+
+
+ sha256
+
+
+ ..\..\netvadapterlibrary\Interface;..\..\netvadapterlibrary\code;..\..\..\..\wil\include;$(KIT_SHARED_INC_PATH_WDK);%(AdditionalIncludeDirectories)
+ true
+ ..\..\netvadapterlibrary\code\trace.h
+ false
+ false
+ true
+
+
+
+
+ sha256
+
+
+ ..\..\netvadapterlibrary\Interface;..\..\netvadapterlibrary\code;..\..\..\..\wil\include;$(KIT_SHARED_INC_PATH_WDK);%(AdditionalIncludeDirectories)
+ true
+ ..\..\netvadapterlibrary\code\trace.h
+ false
+ false
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {612f33ad-430c-4fe7-8000-35e15a5eb757}
+
+
+
+
\ 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 @@
+
+
+
+
+ {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
+ cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx
+
+
+ {93995380-89BD-4b04-88EB-625FBE52EBFB}
+ h;hpp;hxx;hm;inl;inc;xsd
+
+
+ {67DA6AB6-F800-4c08-8B7A-83BB121AAD01}
+ rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms
+
+
+ {8E41214B-6785-4CFE-B992-037D68949A14}
+ inf;inv;inx;mof;mc;
+
+
+
+
+ Driver Files
+
+
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+
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
+#ifdef _KERNEL_MODE
+#include
+#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(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(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
+#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(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(rxVirtualAddress->VirtualAddress);
+
+ fragment->Offset = 0;
+ fragment->ValidLength =
+ CopyTxPacketDataToBuffer(
+ fragmentBuffer,
+ &txPi,
+ &txq->TxQueue->VirtualAddressExtension,
+ static_cast(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(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(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();
+ 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
+#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(&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
+// #include
+
+#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;
+ using unique_pkthread = wil::unique_any;
+ using unique_pkevent = wil::unique_any;
+ using unique_completionport = wil::unique_any;
+
+ 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(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
+
+//
+// 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
+
+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
+
+#ifndef _KERNEL_MODE
+// This is a user-mode driver
+#include
+
+#else
+// This is a kernel-mode driver
+#include
+#define NTSTRSAFE_LIB
+#include
+#endif
+
+// This is a common WDF header (for both KMDF and UMDF)
+#include
+
+#include
+//#include
+#include "net/netringiterator.h"
+#include "net/netpacketlibrary.h"
+#include
+#include
+#include
+#include
+#include
+
+#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
+
+#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
+
+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
+#include
+
+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
+
+#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
+#include
+
+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
+
+#if _KERNEL_MODE
+typedef wistd::integral_constant auto_reset_event_t;
+#else
+typedef wistd::integral_constant auto_reset_event_t;
+#endif
+
+#if _KERNEL_MODE
+typedef wistd::integral_constant manual_reset_event_t;
+#else
+typedef wistd::integral_constant manual_reset_event_t;
+#endif
+
+#define WIN_VERIFY NT_VERIFY
+#define WIN_ASSERT NT_ASSERT
+
+template
+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(&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
+{
+public:
+
+ PAGED KWaitEvent() noexcept
+ {
+ InitializeBase();
+ }
+
+ NONPAGED ~KWaitEvent()
+ {
+ CleanupBase();
+ }
+};
+
+class KWaitEventManualConstruct : public KWaitEventBase
+{
+public:
+
+ PAGED void Initialize()
+ {
+ InitializeBase();
+ }
+
+ PAGED void Cleanup()
+ {
+ CleanupBase();
+ }
+};
+
+
+class KAutoEvent : public KWaitEventBase
+{
+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(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
+
+// 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 @@
+
+
+
+
+ {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
+ cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx
+
+
+ {93995380-89BD-4b04-88EB-625FBE52EBFB}
+ h;hpp;hxx;hm;inl;inc;xsd
+
+
+ {67DA6AB6-F800-4c08-8B7A-83BB121AAD01}
+ rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms
+
+
+ {8E41214B-6785-4CFE-B992-037D68949A14}
+ inf;inv;inx;mof;mc;
+
+
+
+
+ Driver Files
+
+
+
\ 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 @@
+
+
+
+
+ Debug
+ x64
+
+
+ Release
+ x64
+
+
+ Debug
+ ARM64
+
+
+ Release
+ ARM64
+
+
+
+ {E2A65EFD-25CC-4AF0-B180-0CD56EE277A9}
+ {1bc93793-694f-48fe-9372-81e2b05556fd}
+ v4.5
+ 12.0
+ Debug
+ x64
+
+
+
+ Windows10
+ true
+ WindowsKernelModeDriver10.0
+ StaticLibrary
+ KMDF
+ Windows Driver
+ 1
+ 33
+ true
+ 2
+ 5
+
+
+ Windows10
+ false
+ WindowsKernelModeDriver10.0
+ StaticLibrary
+ KMDF
+ Windows Driver
+ 1
+ 33
+ true
+ 2
+ 5
+
+
+ Windows10
+ true
+ WindowsKernelModeDriver10.0
+ StaticLibrary
+ KMDF
+ Windows Driver
+ 1
+ 33
+ true
+ 2
+ 5
+
+
+ Windows10
+ false
+ WindowsKernelModeDriver10.0
+ StaticLibrary
+ KMDF
+ Windows Driver
+ 1
+ 33
+ true
+ 2
+ 5
+
+
+
+
+
+
+
+
+
+
+ DbgengKernelDebugger
+ $(MSBuildProjectDirectory)\..\Interface;$(MSBuildProjectDirectory)\..\code\rtl;$(IncludePath)
+
+
+ DbgengKernelDebugger
+ $(MSBuildProjectDirectory)\..\Interface;$(MSBuildProjectDirectory)\..\code\rtl;$(IncludePath)
+
+
+ DbgengKernelDebugger
+ $(MSBuildProjectDirectory)\..\Interface;$(MSBuildProjectDirectory)\..\code\rtl;$(IncludePath)
+
+
+ DbgengKernelDebugger
+ $(MSBuildProjectDirectory)\..\Interface;$(MSBuildProjectDirectory)\..\code\rtl;$(IncludePath)
+
+
+
+ sha256
+
+
+ true
+
+
+ false
+ ..\code\trace.h
+ true
+ ..\..\..\..\wil\include;%(AdditionalIncludeDirectories)
+
+
+
+
+ sha256
+
+
+ true
+
+
+ false
+ ..\code\trace.h
+ true
+ ..\..\..\..\wil\include;%(AdditionalIncludeDirectories)
+
+
+
+
+ sha256
+
+
+ true
+
+
+ false
+ ..\code\trace.h
+ true
+ ..\..\..\..\wil\include;%(AdditionalIncludeDirectories)
+
+
+
+
+ sha256
+
+
+ true
+
+
+ false
+ ..\code\trace.h
+ true
+ ..\..\..\..\wil\include;%(AdditionalIncludeDirectories)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ 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 @@
+
+
+
+
+ {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
+ cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx
+
+
+ {93995380-89BD-4b04-88EB-625FBE52EBFB}
+ h;hpp;hxx;hm;inl;inc;xsd
+
+
+ {67DA6AB6-F800-4c08-8B7A-83BB121AAD01}
+ rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms
+
+
+ {8E41214B-6785-4CFE-B992-037D68949A14}
+ inf;inv;inx;mof;mc;
+
+
+
+
+ Driver Files
+
+
+
\ 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 @@
+
+
+
+
+ Debug
+ x64
+
+
+ Release
+ x64
+
+
+ Debug
+ ARM64
+
+
+ Release
+ ARM64
+
+
+
+ {612F33AD-430C-4FE7-8000-35E15A5EB757}
+ {1bc93793-694f-48fe-9372-81e2b05556fd}
+ v4.5
+ 12.0
+ Debug
+ x64
+ KMDF_Driver1
+
+
+
+ Windows10
+ true
+ WindowsUserModeDriver10.0
+ StaticLibrary
+ Universal
+ 2
+ 33
+ true
+ 2
+ 5
+
+
+ Windows10
+ false
+ WindowsUserModeDriver10.0
+ StaticLibrary
+ Universal
+ 2
+ 33
+ true
+ 2
+ 5
+
+
+ Windows10
+ true
+ WindowsUserModeDriver10.0
+ StaticLibrary
+ Universal
+ 2
+ 33
+ true
+ 2
+ 5
+
+
+ Windows10
+ false
+ WindowsUserModeDriver10.0
+ StaticLibrary
+ Universal
+ 2
+ 33
+ true
+ 2
+ 5
+
+
+
+
+
+
+
+
+
+
+ DbgengKernelDebugger
+ $(MSBuildProjectDirectory)\..\Interface;$(MSBuildProjectDirectory)\..\code\rtl;$(IncludePath)
+
+
+ DbgengKernelDebugger
+ $(MSBuildProjectDirectory)\..\Interface;$(MSBuildProjectDirectory)\..\code\rtl;$(IncludePath)
+
+
+ DbgengKernelDebugger
+ $(MSBuildProjectDirectory)\..\Interface;$(MSBuildProjectDirectory)\..\code\rtl;$(IncludePath)
+
+
+ DbgengKernelDebugger
+ $(MSBuildProjectDirectory)\..\Interface;$(MSBuildProjectDirectory)\..\code\rtl;$(IncludePath)
+
+
+
+ sha256
+
+
+ true
+
+
+ false
+ true
+ ..\code\trace.h
+ ..\..\..\..\wil\include;%(AdditionalIncludeDirectories)
+
+
+
+
+ sha256
+
+
+ true
+
+
+ false
+ true
+ ..\code\trace.h
+ ..\..\..\..\wil\include;%(AdditionalIncludeDirectories)
+
+
+
+
+ sha256
+
+
+ true
+
+
+ false
+ true
+ ..\code\trace.h
+ ..\..\..\..\wil\include;%(AdditionalIncludeDirectories)
+
+
+
+
+ sha256
+
+
+ true
+
+
+ false
+ true
+ ..\code\trace.h
+ ..\..\..\..\wil\include;%(AdditionalIncludeDirectories)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ 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 @@
+
+
+
+
+ {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
+ cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx
+
+
+ {93995380-89BD-4b04-88EB-625FBE52EBFB}
+ h;hpp;hxx;hm;inl;inc;xsd
+
+
+ {67DA6AB6-F800-4c08-8B7A-83BB121AAD01}
+ rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms
+
+
+ {8E41214B-6785-4CFE-B992-037D68949A14}
+ inf;inv;inx;mof;mc;
+
+
+
+
+ Driver Files
+
+
+
\ 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 @@
+
+
+
+
+ Debug
+ x64
+
+
+ Release
+ x64
+
+
+ Debug
+ ARM64
+
+
+ Release
+ ARM64
+
+
+
+ {E2A65EFD-25CC-4AF0-B180-0CD56EE277A9}
+ {1bc93793-694f-48fe-9372-81e2b05556fd}
+ v4.5
+ 12.0
+ Debug
+ x64
+
+
+
+ Windows10
+ true
+ WindowsKernelModeDriver10.0
+ StaticLibrary
+ KMDF
+ Windows Driver
+ 1
+ 33
+ true
+ 2
+ 6
+
+
+ Windows10
+ false
+ WindowsKernelModeDriver10.0
+ StaticLibrary
+ KMDF
+ Windows Driver
+ 1
+ 33
+ true
+ 2
+ 5
+
+
+ Windows10
+ true
+ WindowsKernelModeDriver10.0
+ StaticLibrary
+ KMDF
+ Windows Driver
+ 1
+ 33
+ true
+ 2
+ 5
+
+
+ Windows10
+ false
+ WindowsKernelModeDriver10.0
+ StaticLibrary
+ KMDF
+ Windows Driver
+ 1
+ 33
+ true
+ 2
+ 5
+
+
+
+
+
+
+
+
+
+
+ DbgengKernelDebugger
+ $(MSBuildProjectDirectory)\..\Interface;$(MSBuildProjectDirectory)\..\code\rtl;$(IncludePath)
+
+
+ DbgengKernelDebugger
+ $(MSBuildProjectDirectory)\..\Interface;$(MSBuildProjectDirectory)\..\code\rtl;$(IncludePath)
+
+
+ DbgengKernelDebugger
+ $(MSBuildProjectDirectory)\..\Interface;$(MSBuildProjectDirectory)\..\code\rtl;$(IncludePath)
+
+
+ DbgengKernelDebugger
+ $(MSBuildProjectDirectory)\..\Interface;$(MSBuildProjectDirectory)\..\code\rtl;$(IncludePath)
+
+
+
+ sha256
+
+
+ true
+
+
+ false
+ ..\code\trace.h
+ true
+ ..\..\..\..\wil\include;%(AdditionalIncludeDirectories)
+
+
+
+
+ sha256
+
+
+ true
+
+
+ false
+ ..\code\trace.h
+ true
+ ..\..\..\..\wil\include;%(AdditionalIncludeDirectories)
+
+
+
+
+ sha256
+
+
+ true
+
+
+ false
+ ..\code\trace.h
+ true
+ ..\..\..\..\wil\include;%(AdditionalIncludeDirectories)
+
+
+
+
+ sha256
+
+
+ true
+
+
+ false
+ ..\code\trace.h
+ true
+ ..\..\..\..\wil\include;%(AdditionalIncludeDirectories)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ 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 @@
+
+
+
+
+ {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
+ cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx
+
+
+ {93995380-89BD-4b04-88EB-625FBE52EBFB}
+ h;hpp;hxx;hm;inl;inc;xsd
+
+
+ {67DA6AB6-F800-4c08-8B7A-83BB121AAD01}
+ rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms
+
+
+ {8E41214B-6785-4CFE-B992-037D68949A14}
+ inf;inv;inx;mof;mc;
+
+
+
+
+ Driver Files
+
+
+
\ 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 @@
+
+
+
+
+ Debug
+ x64
+
+
+ Release
+ x64
+
+
+ Debug
+ ARM64
+
+
+ Release
+ ARM64
+
+
+
+ {612F33AD-430C-4FE7-8000-35E15A5EB757}
+ {1bc93793-694f-48fe-9372-81e2b05556fd}
+ v4.5
+ 12.0
+ Debug
+ x64
+ KMDF_Driver1
+
+
+
+ Windows10
+ true
+ WindowsUserModeDriver10.0
+ StaticLibrary
+ KMDF
+ Universal
+ 2
+ 35
+ true
+ 2
+ 6
+
+
+ Windows10
+ false
+ WindowsUserModeDriver10.0
+ StaticLibrary
+ KMDF
+ Universal
+ 2
+ 35
+ true
+ 2
+ 5
+
+
+ Windows10
+ true
+ WindowsUserModeDriver10.0
+ StaticLibrary
+ KMDF
+ Universal
+ 2
+ 35
+ true
+ 2
+ 5
+
+
+ Windows10
+ false
+ WindowsUserModeDriver10.0
+ StaticLibrary
+ KMDF
+ Universal
+ 2
+ 35
+ true
+ 2
+ 5
+
+
+
+
+
+
+
+
+
+
+ DbgengKernelDebugger
+ $(MSBuildProjectDirectory)\..\Interface;$(MSBuildProjectDirectory)\..\code\rtl;$(IncludePath)
+
+
+ DbgengKernelDebugger
+ $(MSBuildProjectDirectory)\..\Interface;$(MSBuildProjectDirectory)\..\code\rtl;$(IncludePath)
+
+
+ DbgengKernelDebugger
+ $(MSBuildProjectDirectory)\..\Interface;$(MSBuildProjectDirectory)\..\code\rtl;$(IncludePath)
+
+
+ DbgengKernelDebugger
+ $(MSBuildProjectDirectory)\..\Interface;$(MSBuildProjectDirectory)\..\code\rtl;$(IncludePath)
+
+
+
+ sha256
+
+
+ true
+
+
+ false
+ true
+ ..\code\trace.h
+ ..\..\..\..\wil\include;%(AdditionalIncludeDirectories)
+
+
+
+
+ sha256
+
+
+ true
+
+
+ false
+ true
+ ..\code\trace.h
+ ..\..\..\..\wil\include;%(AdditionalIncludeDirectories)
+
+
+
+
+ sha256
+
+
+ true
+
+
+ false
+ true
+ ..\code\trace.h
+ ..\..\..\..\wil\include;%(AdditionalIncludeDirectories)
+
+
+
+
+ sha256
+
+
+ true
+
+
+ false
+ true
+ ..\code\trace.h
+ ..\..\..\..\wil\include;%(AdditionalIncludeDirectories)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ 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 @@
+
+
+
+
+ Debug
+ x64
+
+
+ Release
+ x64
+
+
+ Debug
+ ARM64
+
+
+ Release
+ ARM64
+
+
+
+ {B3C9A1E2-7F4D-4B2A-9C5E-1A2B3C4D5E6F}
+ OemDeviceService
+ Application
+ Unicode
+ OemDeviceServiceApplication
+
+
+
+ WindowsApplicationForDrivers10.0
+
+
+
+
+ Level4
+ _UNICODE;UNICODE;%(PreprocessorDefinitions)
+
+
+ Console
+ wlanapi.lib;ole32.lib;%(AdditionalDependencies)
+
+
+
+
+
+
+
+
+
+
\ 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
+#include
+#include // StringFromGUID2
+#include // std::min
+#include
+
+#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(sizeof(inBuffer));
+
+ BYTE outBuffer[256] = { 0 };
+ DWORD outBufferSize = static_cast(sizeof(outBuffer));
+ DWORD bytesReturned = 0;
+
+ printf("Sending device service command: \"%s\"\n", inBuffer);
+
+ DWORD result = WlanDeviceServiceCommand(
+ hClient,
+ &interfaceGuid,
+ const_cast(&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(sizeof(outBuffer) - 1))] = '\0';
+ printf("Driver responded: \"%s\" (%u bytes)\n", reinterpret_cast(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 // 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(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(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 // 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(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(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(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(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(reinterpret_cast(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
+#else
+ #include
+ #include // For NDIS_STATUS
+ #include // For NDIS_STATUS codes
+ #include
+#endif
+// WDF Headers
+#include
+
+// Network Device Headers
+#include
+#include
+
+// WIFI Device Headers
+#include
+#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(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(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(UnicastAlgos);
+ StationCaps.NumSupportedMulticastDataAlgorithms = ARRAYSIZE(UnicastAlgos);
+ StationCaps.MulticastDataAlgorithmsList = const_cast(UnicastAlgos);
+ StationCaps.NumSupportedMulticastMgmtAlgorithms = ARRAYSIZE(McastMgmtAlgos);
+ StationCaps.MulticastMgmtAlgorithmsList = const_cast(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_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(Phy24GHz);
+ BandInfo[bandInfoCount].NumValidChannelTypes = ARRAYSIZE(ChannelMap24);
+ BandInfo[bandInfoCount].ValidChannelTypes = const_cast(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(Phy5GHz);
+ BandInfo[bandInfoCount].NumValidChannelTypes = ARRAYSIZE(ChannelMap5);
+ BandInfo[bandInfoCount].ValidChannelTypes = const_cast(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(Phy6GHz);
+ BandInfo[bandInfoCount].NumValidChannelTypes = ARRAYSIZE(channelMap6);
+ BandInfo[bandInfoCount].ValidChannelTypes = const_cast(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(pPhy60GHz);
+ BandInfo[bandInfoCount].NumValidChannelTypes = ARRAYSIZE(channelMap60);
+ BandInfo[bandInfoCount].ValidChannelTypes = const_cast(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(&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* pPreferredBSSEntryList,
+ const struct ArrayOfElements* 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(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(&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; 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(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(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(
+ ¶ms, 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(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* pPreferredBSSEntryList, _In_ const struct ArrayOfElements* 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
+// 0x -> 2 bytes (contains number and size of each element)
+// 0x, 0x -> 2 bytes (applies to all element in this list)
+// 0x -> 1 byte
+// 0x -> 6 bytes
+// [0x] -> 4 bytes
+// 0x -> 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_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(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(&pIndicationBuffer))))
+ {
+ WFCError("Failed to create indication buffer");
+ return;
+ }
+
+ RtlZeroMemory(pIndicationBuffer, indicationSize);
+ pIndicationHeader = reinterpret_cast(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
+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(ctx.RawBuffer) + sizeof(WDI_MESSAGE_HEADER);
+ auto tlvLen = static_cast(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
+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(ctx.RawBuffer) + sizeof(WDI_MESSAGE_HEADER);
+ auto tlvLen = static_cast(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
+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
+NTSTATUS RunTransition(TransitionContext& ctx)
+{
+ TransitionTraits traits;
+ typename TransitionTraits::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::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(ctx.RawBuffer) + sizeof(WDI_MESSAGE_HEADER);
+ auto tlvLen = static_cast(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
+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
+NTSTATUS RunPropertyM3(TransitionContext& ctx)
+{
+ PropertyTraits traits;
+ typename PropertyTraits::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
+ : 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
+ : 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
+ : 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
+ : 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
+ : 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
+ : 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
+ : 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
+ : 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(ctx);
+ case WDI_TASK_SCAN:
+ return RunTransition(ctx);
+ case WDI_TASK_DOT11_RESET:
+ return RunTransition(ctx);
+ case WDI_TASK_CONNECT:
+ return RunTransition(ctx);
+ case WDI_TASK_DISCONNECT:
+ return RunTransition(ctx);
+ case WDI_SET_SAE_AUTH_PARAMS:
+ return RunTransition(ctx);
+ case WDI_GET_SUPPORTED_DEVICE_SERVICES:
+ return RunPropertyM3(ctx);
+ case WDI_DEVICE_SERVICE_COMMAND:
+ return RunPropertyM3(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 @@
+
+
+
+
+ Debug
+ x64
+
+
+ Release
+ x64
+
+
+ Debug
+ ARM64
+
+
+ Release
+ ARM64
+
+
+
+ {272D3E7B-C7BA-66D1-E05D-B9723A6F0777}
+ {1bc93793-694f-48fe-9372-81e2b05556fd}
+ v4.5
+ 12.0
+ Debug
+ x64
+ wificxsampleclientkm
+
+
+
+ Windows10
+ true
+ WindowsKernelModeDriver10.0
+ Driver
+ KMDF
+ Windows Driver
+ 1
+ 33
+ 33
+ true
+ 2
+ 6
+
+
+ true
+ 1
+ 2
+ true
+
+
+ Windows10
+ false
+ WindowsKernelModeDriver10.0
+ Driver
+ KMDF
+ Windows Driver
+ 1
+ 33
+ 33
+ true
+ 2
+ 5
+ 4
+ true
+ 1
+ 2
+ true
+
+
+ Windows10
+ true
+ WindowsKernelModeDriver10.0
+ Driver
+ KMDF
+ Windows Driver
+ 1
+ 33
+ 33
+ true
+ 2
+ 5
+ 4
+ true
+ 1
+ 2
+ true
+
+
+ Windows10
+ false
+ WindowsKernelModeDriver10.0
+ Driver
+ KMDF
+ Windows Driver
+ 1
+ 33
+ 33
+ true
+ 2
+ 5
+ 4
+ true
+ 1
+ 2
+ true
+
+
+
+
+
+
+
+
+
+
+ DbgengKernelDebugger
+ false
+ false
+
+
+ DbgengKernelDebugger
+ false
+ false
+
+
+ DbgengKernelDebugger
+ false
+ false
+
+
+ DbgengKernelDebugger
+ false
+ false
+
+
+
+ sha256
+
+
+ true
+ ..\..\..\netadaptercx\netvadapterlibrary\Interface;$(DDK_INC_PATH)wlan\2.0;%(AdditionalIncludeDirectories)
+ true
+ ..\drivercode\trace.h
+ false
+ _HAS_EXCEPTIONS=0;%(PreprocessorDefinitions)
+
+
+ $(DDK_LIB_PATH)wlan\2.0\WificxTLVGenParse.lib;%(AdditionalDependencies)
+
+
+ 1.0
+
+
+
+
+ sha256
+
+
+ ..\..\..\netadaptercx\netvadapterlibrary\Interface;$(DDK_INC_PATH)wlan\2.0;%(AdditionalIncludeDirectories)
+ true
+ true
+ ..\drivercode\trace.h
+ false
+ _HAS_EXCEPTIONS=0;%(PreprocessorDefinitions)
+
+
+ $(DDK_LIB_PATH)wlan\2.0\WificxTLVGenParse.lib;%(AdditionalDependencies)
+
+
+ 1.0
+
+
+
+
+ sha256
+
+
+ ..\..\..\netadaptercx\netvadapterlibrary\Interface;$(DDK_INC_PATH)wlan\2.0;%(AdditionalIncludeDirectories)
+ true
+ true
+ ..\drivercode\trace.h
+ false
+ _HAS_EXCEPTIONS=0;%(PreprocessorDefinitions)
+
+
+ $(DDK_LIB_PATH)wlan\2.0\WificxTLVGenParse.lib;%(AdditionalDependencies)
+
+
+ 1.0
+
+
+
+
+ sha256
+
+
+ ..\..\..\netadaptercx\netvadapterlibrary\Interface;$(DDK_INC_PATH)wlan\2.0;%(AdditionalIncludeDirectories)
+ true
+ true
+ ..\drivercode\trace.h
+ false
+ _HAS_EXCEPTIONS=0;%(PreprocessorDefinitions)
+
+
+ $(DDK_LIB_PATH)wlan\2.0\WificxTLVGenParse.lib;%(AdditionalDependencies)
+
+
+ 1.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {e2a65efd-25cc-4af0-b180-0cd56ee277a9}
+
+
+
+
\ 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 @@
+
+
+
+
+ {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
+ cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx
+
+
+ {93995380-89BD-4b04-88EB-625FBE52EBFB}
+ h;hpp;hxx;hm;inl;inc;xsd
+
+
+ {67DA6AB6-F800-4c08-8B7A-83BB121AAD01}
+ rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms
+
+
+ {8E41214B-6785-4CFE-B992-037D68949A14}
+ inf;inv;inx;mof;mc;
+
+
+
+
+ Driver Files
+
+
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+
\ 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 @@
+
+
+
+
+ Debug
+ x64
+
+
+ Release
+ x64
+
+
+ Debug
+ ARM64
+
+
+ Release
+ ARM64
+
+
+
+
+
+
+ {C804D7D0-80D8-1409-44DA-91EF3260D07F}
+ {2177f19c-eb4c-4687-9e7f-f9eec1f12cf1}
+ v4.5
+ 12.0
+ Debug
+ x64
+ wificxsampleclientum
+
+
+ WindowsUserModeDriver10.0
+ DynamicLibrary
+ Universal
+
+
+ WindowsUserModeDriver10.0
+ DynamicLibrary
+ Universal
+
+
+ WindowsUserModeDriver10.0
+ DynamicLibrary
+ Universal
+
+
+ WindowsUserModeDriver10.0
+ DynamicLibrary
+ Universal
+
+
+
+ Windows10
+ true
+ 2
+ 35
+ 35
+ true
+ 2
+ 6
+ true
+ 1
+ 2
+
+
+ Windows10
+ false
+ 2
+ 35
+ 35
+ true
+ 2
+ 5
+ true
+ 1
+ 2
+
+
+ Windows10
+ true
+ 2
+ 35
+ 35
+ true
+ 2
+ 5
+ true
+ 1
+ 2
+
+
+ Windows10
+ false
+ 2
+ 35
+ 35
+ true
+ 2
+ 5
+ true
+ 1
+ 2
+
+
+
+
+
+
+
+
+
+
+ DbgengRemoteDebugger
+ false
+
+
+ DbgengRemoteDebugger
+ false
+
+
+ DbgengRemoteDebugger
+ false
+
+
+ DbgengRemoteDebugger
+ false
+
+
+
+ sha256
+
+
+ ..\..\..\netadaptercx\netvadapterlibrary\Interface;$(WDK_UM_INC_PATH)wlan\2.0;$(KIT_SHARED_INC_PATH_WDK);%(AdditionalIncludeDirectories)
+ WIFICX_TEMPORARY_REMOVED_FOR_USERMODE;%(PreprocessorDefinitions)
+ true
+ ..\drivercode\trace.h
+ false
+ false
+ true
+
+
+ $(WDK_UM_LIB_PATH)wlan\2.0\WificxTLVGenParse.lib;%(AdditionalDependencies)
+
+
+
+
+ sha256
+
+
+ ..\..\..\netadaptercx\netvadapterlibrary\Interface;$(WDK_UM_INC_PATH)wlan\2.0;$(KIT_SHARED_INC_PATH_WDK);%(AdditionalIncludeDirectories)
+ WIFICX_TEMPORARY_REMOVED_FOR_USERMODE;%(PreprocessorDefinitions)
+ true
+ ..\drivercode\trace.h
+ false
+ false
+ true
+
+
+ $(WDK_UM_LIB_PATH)wlan\2.0\WificxTLVGenParse.lib;%(AdditionalDependencies)
+
+
+
+
+ sha256
+
+
+ ..\..\..\netadaptercx\netvadapterlibrary\Interface;$(WDK_UM_INC_PATH)wlan\2.0;$(KIT_SHARED_INC_PATH_WDK);%(AdditionalIncludeDirectories)
+ WIFICX_TEMPORARY_REMOVED_FOR_USERMODE;%(PreprocessorDefinitions)
+ true
+ ..\drivercode\trace.h
+ false
+ false
+ true
+
+
+ $(WDK_UM_LIB_PATH)wlan\2.0\WificxTLVGenParse.lib;%(AdditionalDependencies)
+
+
+
+
+ sha256
+
+
+ ..\..\..\netadaptercx\netvadapterlibrary\Interface;$(WDK_UM_INC_PATH)wlan\2.0;$(KIT_SHARED_INC_PATH_WDK);%(AdditionalIncludeDirectories)
+ WIFICX_TEMPORARY_REMOVED_FOR_USERMODE;%(PreprocessorDefinitions)
+ true
+ ..\drivercode\trace.h
+ false
+ false
+ true
+
+
+ $(WDK_UM_LIB_PATH)wlan\2.0\WificxTLVGenParse.lib;%(AdditionalDependencies)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {612f33ad-430c-4fe7-8000-35e15a5eb757}
+
+
+
+
\ 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 @@
+
+
+
+
+ {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
+ cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx
+
+
+ {93995380-89BD-4b04-88EB-625FBE52EBFB}
+ h;hpp;hxx;hm;inl;inc;xsd
+
+
+ {67DA6AB6-F800-4c08-8B7A-83BB121AAD01}
+ rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms
+
+
+ {8E41214B-6785-4CFE-B992-037D68949A14}
+ inf;inv;inx;mof;mc;
+
+
+
+
+ Driver Files
+
+
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+
\ 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