Skip to content

Commit 2eb9b1b

Browse files
committed
wificx: gate datapath debug tracing behind off-by-default macros
The DbgPrintEx diagnostics used while bringing up the two-instance data path are useful for future debugging but must not be active in a normal build. Gate them all behind preprocessor switches that are undefined by default: - netvadapterlibrary (enl.cpp, rxqueue.cpp, adapter.cpp): the ENL forward / rx-indication probes and queue-event traces compile only when NETV_DATAPATH_DEBUG is defined. - wificx drivercode: DbgPrintEx calls route through a WFC_TRACE macro (precomp.h) that expands to nothing unless WIFICX_DATAPATH_DEBUG is defined. Keeping the instrumentation in one self-contained, off-by-default commit makes it easy to enable for diagnosis or drop entirely. Signed-off-by: Chaitanya Tata <Chaitanya@Dotstarsystems.com> Assisted-by: Claude:claude-opus-4.8
1 parent e8de1a4 commit 2eb9b1b

7 files changed

Lines changed: 118 additions & 1 deletion

File tree

network/netadaptercx/netvadapterlibrary/code/adapter.cpp

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -307,7 +307,11 @@ EvtSetReceiveFilter(
307307
)
308308
{
309309
NetvAdapter* adapter = NetvAdapterGetContextFromWDFObject(NetAdapter);
310-
310+
#if defined(_KERNEL_MODE) && defined(NETV_DATAPATH_DEBUG)
311+
DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL,
312+
"ENL EvtSetReceiveFilter port=%u filter=0x%x\n",
313+
adapter->EnlPortIndex, (ULONG)NetReceiveFilterGetPacketFilter(Handle));
314+
#endif
311315
adapter->PacketFilter = NetReceiveFilterGetPacketFilter(Handle);
312316

313317
adapter->NumMulticastAddresses = (ULONG)NetReceiveFilterGetMulticastAddressCount(Handle);
@@ -507,6 +511,11 @@ EvtTxQueueStart(
507511
NETPACKETQUEUE Queue
508512
)
509513
{
514+
#if defined(_KERNEL_MODE) && defined(NETV_DATAPATH_DEBUG)
515+
DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL,
516+
"ENL EvtTxQueueStart port=%u\n",
517+
NetvTxQueueGetContext(Queue)->m_adapter.EnlPortIndex);
518+
#endif
510519
NetvTxQueueGetContext(Queue)->Start();
511520
}
512521

@@ -525,6 +534,13 @@ EvtTxQueueAdvance(
525534
NETPACKETQUEUE Queue
526535
)
527536
{
537+
#if defined(_KERNEL_MODE) && defined(NETV_DATAPATH_DEBUG)
538+
static LONG txAdvCount = 0;
539+
if (InterlockedIncrement(&txAdvCount) <= 3)
540+
DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL,
541+
"ENL EvtTxQueueAdvance port=%u\n",
542+
NetvTxQueueGetContext(Queue)->m_adapter.EnlPortIndex);
543+
#endif
528544
NetvTxQueueGetContext(Queue)->Advance();
529545
}
530546

@@ -553,6 +569,11 @@ EvtRxQueueStart(
553569
NETPACKETQUEUE Queue
554570
)
555571
{
572+
#if defined(_KERNEL_MODE) && defined(NETV_DATAPATH_DEBUG)
573+
DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL,
574+
"ENL EvtRxQueueStart port=%u\n",
575+
NetvRxQueueGetContext(Queue)->m_adapter.EnlPortIndex);
576+
#endif
556577
NetvRxQueueGetContext(Queue)->Start();
557578
}
558579

network/netadaptercx/netvadapterlibrary/code/enl.cpp

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,12 @@
1515

1616
ENL_MLINK NetvEnlMLink[MAX_ADAPTER_COUNT / 2];
1717

18+
#if defined(_KERNEL_MODE) && defined(NETV_DATAPATH_DEBUG)
19+
// Forward-logging budgets, reset when the link goes idle so each tx burst
20+
// starts fresh. g_rxAdvDbg is defined in rxqueue.cpp.
21+
static LONG g_enlFwdDbg = 0;
22+
extern LONG g_rxAdvDbg;
23+
#endif
1824

1925
/*++
2026
The iteration routine performs one full pass over all input queues and
@@ -383,10 +389,18 @@ EnlpIterationRoutine(
383389
EnlDisarmWake(enlLink);
384390
}
385391

392+
#if defined(_KERNEL_MODE) && defined(NETV_DATAPATH_DEBUG)
393+
int dbgRxState = -1;
394+
int dbgHasFrag = -1;
395+
int dbgHasPkt = -1;
396+
#endif
386397
if (rxport->RxQueueCount > 0)
387398
{
388399
//TODO: Currently does 1:1 mapping between Tx and Rx. Need to set up indirection table
389400
auto rxq = &rxport->RxQueue[ci];
401+
#if defined(_KERNEL_MODE) && defined(NETV_DATAPATH_DEBUG)
402+
dbgRxState = rxq->State;
403+
#endif
390404

391405
if (rxq->State == Started)
392406
{
@@ -395,6 +409,10 @@ EnlpIterationRoutine(
395409
};
396410

397411
auto rxPi = NetRingGetPostPackets(rxq->Queue->m_rings);
412+
#if defined(_KERNEL_MODE) && defined(NETV_DATAPATH_DEBUG)
413+
dbgHasFrag = NetFragmentIteratorHasAny(&rxFi) ? 1 : 0;
414+
dbgHasPkt = NetPacketIteratorHasAny(&rxPi) ? 1 : 0;
415+
#endif
398416

399417
if (NetFragmentIteratorHasAny(&rxFi) && NetPacketIteratorHasAny(&rxPi))
400418
{
@@ -512,6 +530,13 @@ EnlpIterationRoutine(
512530
}
513531
}
514532

533+
#if defined(_KERNEL_MODE) && defined(NETV_DATAPATH_DEBUG)
534+
if (InterlockedIncrement(&g_enlFwdDbg) <= 30)
535+
DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL,
536+
"ENL fwd tx-port=%zu rx-port=%zu rxQCount=%lu rxState=%d hasFrag=%d hasPkt=%d drop=%d\n",
537+
pi, pi ^ 0x1, (ULONG)rxport->RxQueueCount,
538+
dbgRxState, dbgHasFrag, dbgHasPkt, rxDrop ? 1 : 0);
539+
#endif
515540
if (rxDrop)
516541
{
517542
// TODO - add rxdrop stat
@@ -539,6 +564,11 @@ EnlpIterationRoutine(
539564

540565
if (emptyTx)
541566
{
567+
#if defined(_KERNEL_MODE) && defined(NETV_DATAPATH_DEBUG)
568+
// Link idle: give the next tx burst a fresh logging budget.
569+
InterlockedExchange(&g_enlFwdDbg, 0);
570+
InterlockedExchange(&g_rxAdvDbg, 0);
571+
#endif
542572
if (enlLink->Poll == FALSE)
543573
{
544574
enlpArmAndWait(enlLink);

network/netadaptercx/netvadapterlibrary/code/rxqueue.cpp

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,12 @@
55
#include "rxqueue.h"
66
#include "memory.h"
77

8+
#if defined(_KERNEL_MODE) && defined(NETV_DATAPATH_DEBUG)
9+
// Rx-indication logging budget. Non-static so enl.cpp can reset it when the
10+
// link goes idle (see g_enlFwdDbg).
11+
LONG g_rxAdvDbg = 0;
12+
#endif
13+
814
static
915
void
1016
CheckForWakeFrame(
@@ -117,11 +123,25 @@ NetvRxQueue::Advance(
117123

118124
// Ideally this would run in EvtQueueStart, but at that point the receive buffers are not
119125
// attached to the fragment yet
126+
#if defined(_KERNEL_MODE) && defined(NETV_DATAPATH_DEBUG)
127+
bool const ranWake = ! CheckedWakeFrame;
128+
#endif
120129
if (! CheckedWakeFrame)
121130
{
122131
CheckForWakeFrame(this);
123132
}
124133

134+
#if defined(_KERNEL_MODE) && defined(NETV_DATAPATH_DEBUG)
135+
ULONG const dbgFBegin = fr->BeginIndex;
136+
ULONG const dbgFEnd = fr->EndIndex;
137+
int const dbgHaveFrag = NetFragmentIteratorHasAny(&fi) ? 1 : 0;
138+
int const dbgHavePkt = NetPacketIteratorHasAny(&pi) ? 1 : 0;
139+
int dbgFirstScratch = -1;
140+
if (dbgHaveFrag)
141+
dbgFirstScratch = (int)NetFragmentIteratorGetFragment(&fi)->Scratch;
142+
ULONG dbgDrained = 0;
143+
#endif
144+
125145
// Move begin index forward for all fragments with Scratch == 1, thus returning them to the OS since we're done processing them.
126146
for (; NetFragmentIteratorHasAny(&fi) && NetPacketIteratorHasAny(&pi); NetPacketIteratorAdvance(&pi), NetFragmentIteratorAdvance(&fi))
127147
{
@@ -130,11 +150,23 @@ NetvRxQueue::Advance(
130150
{
131151
break;
132152
}
153+
#if defined(_KERNEL_MODE) && defined(NETV_DATAPATH_DEBUG)
154+
dbgDrained++;
155+
#endif
133156
}
134157

135158
NetFragmentIteratorSet(&fi);
136159
NetPacketIteratorSet(&pi);
137160
EnlRingDoorBell(EnlQueueHandle, fr->EndIndex);
161+
162+
#if defined(_KERNEL_MODE) && defined(NETV_DATAPATH_DEBUG)
163+
if ((dbgDrained > 0 || ranWake || dbgFirstScratch == 1) &&
164+
InterlockedIncrement(&g_rxAdvDbg) <= 40)
165+
DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL,
166+
"RX adv port=%u fBegin=%lu fEnd=%lu haveFrag=%d havePkt=%d firstScr=%d drained=%lu wake=%d\n",
167+
(ULONG)m_adapter.EnlPortIndex, dbgFBegin, dbgFEnd,
168+
dbgHaveFrag, dbgHavePkt, dbgFirstScratch, dbgDrained, ranWake ? 1 : 0);
169+
#endif
138170
}
139171

140172
_Use_decl_annotations_

network/wlan/wificx/drivercode/device.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,8 @@ _Use_decl_annotations_
135135
NTSTATUS
136136
EvtAdapterCreateTxQueue(NETADAPTER Adapter, NETTXQUEUE_INIT* Init)
137137
{
138+
WFC_TRACE(
139+
"WiFiCx EvtAdapterCreateTxQueue called\n");
138140
TraceEntry();
139141
return WifiNetvAdapterGetContext(Adapter)->CreateTxQueue(Init);
140142
}
@@ -143,6 +145,8 @@ _Use_decl_annotations_
143145
NTSTATUS
144146
EvtAdapterCreateRxQueue(NETADAPTER Adapter, NETRXQUEUE_INIT* Init)
145147
{
148+
WFC_TRACE(
149+
"WiFiCx EvtAdapterCreateRxQueue called\n");
146150
TraceEntry();
147151
return WifiNetvAdapterGetContext(Adapter)->CreateRxQueue(Init);
148152
}

network/wlan/wificx/drivercode/precomp.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,14 @@
2727
// WPP Tracing Headers
2828
#include "trace.h"
2929

30+
// Off-by-default datapath trace. Define WIFICX_DATAPATH_DEBUG in the project
31+
// preprocessor definitions to emit DbgPrintEx diagnostics.
32+
#if defined(WIFICX_DATAPATH_DEBUG) && defined(_KERNEL_MODE)
33+
#define WFC_TRACE(...) DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, __VA_ARGS__)
34+
#else
35+
#define WFC_TRACE(...) ((void)0)
36+
#endif
37+
3038
// Minimal placement-new to match operator new(size_t, void*)
3139
// TLV generator/parser memory interface has the ULONG_PTR version
3240
inline void* operator new(size_t, void* p) noexcept { return p; }

network/wlan/wificx/drivercode/wifihal.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -544,6 +544,8 @@ NTSTATUS WifiHAL::WifiIhvSetRadioState(const WDI_SET_RADIO_STATE_PARAMETERS& Rad
544544
RadioStatusParams.RadioState.SoftwareState = TRUE;
545545
if (GenerateWdiIndicationRadioStatus(&RadioStatusParams, 0, m_TlvContext, &cbOutput, &pOutput) == NDIS_STATUS_SUCCESS)
546546
{
547+
WFC_TRACE(
548+
"WiFiCx WifiIhvSetRadioState: forcing Software=On\n");
547549
WifiIhvSendUnsolicitedIndicationToOs(m_Device, pWdiHeader, WDI_INDICATION_RADIO_STATUS, pOutput, cbOutput);
548550
FreeGenerated(pOutput);
549551
}
@@ -602,6 +604,9 @@ NTSTATUS WifiHAL::WifiIhvScan(const WDI_SCAN_PARAMETERS& ScanParameters, const P
602604
_Use_decl_annotations_
603605
NTSTATUS WifiHAL::WifiIhvConnect(const WDI_TASK_CONNECT_PARAMETERS& ConnectParameters, const PWDI_MESSAGE_HEADER pWdiHeader, UINT)
604606
{
607+
WFC_TRACE(
608+
"WiFiCx WifiIhvConnect ENTER PortId=%u BSSCount=%u\n",
609+
pWdiHeader->PortId, ConnectParameters.PreferredBSSEntryList.ElementCount);
605610
NT_ASSERT(m_LastConnectEntryId == 0);
606611
#ifdef NETV_SUPPORT_TX_DEMUXING
607612
if (m_LastConnectEntryId != 0) // Not Disconnected State
@@ -613,6 +618,8 @@ NTSTATUS WifiHAL::WifiIhvConnect(const WDI_TASK_CONNECT_PARAMETERS& ConnectParam
613618
#endif //NETV_SUPPORT_TX_DEMUXING
614619
NTSTATUS assocStatus = WifiIhvPerformAssociation(
615620
&ConnectParameters.PreferredBSSEntryList, &ConnectParameters.ConnectParameters.AuthenticationAlgorithms, pWdiHeader);
621+
WFC_TRACE(
622+
"WiFiCx WifiIhvPerformAssociation returned 0x%08X\n", assocStatus);
616623
if (!NT_SUCCESS(assocStatus))
617624
{
618625
return assocStatus;
@@ -630,7 +637,13 @@ NTSTATUS WifiHAL::WifiIhvConnect(const WDI_TASK_CONNECT_PARAMETERS& ConnectParam
630637
m_LastConnectTransactionId = 0;
631638
}
632639

640+
WFC_TRACE(
641+
"WiFiCx WifiIhvConnect done PortId=%u AuthAlgo=%u EntryId=%u\n",
642+
pWdiHeader->PortId, m_LastAuthAlgo, m_LastConnectEntryId);
633643
NETADAPTER netAdapter = WifiGetIhvDeviceContext(m_Device)->netAdapters[pWdiHeader->PortId];
644+
WFC_TRACE(
645+
"WiFiCx netAdapter[%u]=%p\n",
646+
pWdiHeader->PortId, (void*)netAdapter);
634647
if (netAdapter != WDF_NO_HANDLE)
635648
{
636649
NET_ADAPTER_LINK_STATE linkState;
@@ -642,6 +655,9 @@ NTSTATUS WifiHAL::WifiIhvConnect(const WDI_TASK_CONNECT_PARAMETERS& ConnectParam
642655
NetAdapterPauseFunctionTypeUnsupported,
643656
NetAdapterAutoNegotiationFlagNone);
644657
NetAdapterSetLinkState(netAdapter, &linkState);
658+
WFC_TRACE(
659+
"WiFiCx SetLinkState(Connected) PortId=%u\n",
660+
pWdiHeader->PortId);
645661
}
646662

647663
return STATUS_SUCCESS;

network/wlan/wificx/drivercode/wifitransition.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -495,11 +495,17 @@ NTSTATUS RunTransitionByMessage(TransitionContext& ctx, UINT16 messageId)
495495
UINT16 indicationId = GetTaskCompletionIndication(messageId);
496496
if (indicationId != 0)
497497
{
498+
WFC_TRACE(
499+
"WiFiCx UNHANDLED task MessageId=0x%04X PortId=%u (M3+M4)\n",
500+
messageId, ctx.Header->PortId);
498501
WifiIhvNotifyM3Completion(ctx.WifiRequest, STATUS_SUCCESS, bytesWritten);
499502
WifiIhvSendM4IndicationToOs(ctx.Device, indicationId, ctx.Header, STATUS_SUCCESS);
500503
}
501504
else
502505
{
506+
WFC_TRACE(
507+
"WiFiCx UNHANDLED property MessageId=0x%04X PortId=%u (M3)\n",
508+
messageId, ctx.Header->PortId);
503509
WifiRequestComplete(ctx.WifiRequest, STATUS_SUCCESS, bytesWritten);
504510
}
505511
return STATUS_SUCCESS;

0 commit comments

Comments
 (0)