332 lines
12 KiB
C
332 lines
12 KiB
C
/*++
|
|
|
|
Copyright (c) 1998-1999 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
dbg.h
|
|
|
|
Abstract:
|
|
|
|
Debug-related definitions for ARP1394
|
|
|
|
Author:
|
|
|
|
|
|
Revision History:
|
|
|
|
Who When What
|
|
-------- -------- ----
|
|
josephj 11-20-98 created, adapted from L2TP.
|
|
|
|
--*/
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Debug constants
|
|
//-----------------------------------------------------------------------------
|
|
|
|
// Memory tags used with NdisAllocateMemoryWithTag to identify allocations
|
|
// made by the L2TP driver. Also, several context blocks define a first field
|
|
// of 'ulTag' set to these values for ASSERT sanity checking and eased memory
|
|
// dump browsing. Such tags are set to MTAG_FREED just before NdisFreeMemory
|
|
// is called.
|
|
//
|
|
|
|
// Rm/generic tags
|
|
//
|
|
#define MTAG_DBGINFO 'd31A'
|
|
#define MTAG_TASK 't31A'
|
|
#define MTAG_STRING 's31A'
|
|
#define MTAG_FREED 'z31A'
|
|
#define MTAG_RMINTERNAL 'r31A'
|
|
|
|
// Arp-sepcific
|
|
//
|
|
#define MTAG_ADAPTER 'A31A'
|
|
#define MTAG_INTERFACE 'I31A'
|
|
#define MTAG_LOCAL_IP 'L31A'
|
|
#define MTAG_REMOTE_IP 'R31A'
|
|
#define MTAG_REMOTE_ETH 'E31A'
|
|
#define MTAG_DEST 'D31A'
|
|
#define MTAG_PKT 'P31A'
|
|
#define MTAG_MCAP_GD 'G31A'
|
|
#define MTAG_ICS_BUF 'i31A'
|
|
#define MTAG_ARP_GENERIC 'g31A'
|
|
|
|
|
|
// Trace levels.
|
|
//
|
|
#define TL_FATAL 0x0 // Fatal errors -- always printed in checked build.
|
|
#define TL_WARN 0x1 // Warnings
|
|
#define TL_INFO 0x2 // Informational (highest level workable for general use)
|
|
#define TL_VERB 0x3 // VERBOSE
|
|
|
|
// Trace mask bits.
|
|
//
|
|
#define TM_MISC (0x1<<0) // Misc.
|
|
#define TM_NT (0x1<<1) // Driver entry, dispatch, ioctl handling (nt.c)
|
|
#define TM_ND (0x1<<2) // Ndis handlers except connection-oriented (nd.c)
|
|
#define TM_CO (0x1<<3) // Connection-oriented handlers (co.c)
|
|
#define TM_IP (0x1<<4) // Interface to IP (ip.c)
|
|
#define TM_WMI (0x1<<5) // WMI (wmi.c)
|
|
#define TM_CFG (0x1<<6) // Configuration (cfg.c)
|
|
#define TM_RM (0x1<<7) // RM APIs (rm.c)
|
|
#define TM_UT (0x1<<8) // UTIL APIs (util.c)
|
|
#define TM_BUF (0x1<<9) // Buffer management (buf.c)
|
|
#define TM_FAKE (0x1<<10) // FAKE ndis and ip entrypoints (fake.c)
|
|
#define TM_ARP (0x1<<11) // ARP request/response handling code (arp.c)
|
|
#define TM_PKT (0x1<<12) // ARP control packet management (pkt.c)
|
|
#define TM_MCAP (0x1<<13) // MCAP protocol (mcap.c)
|
|
#define TM_ETH (0x1<<14) // Ethernet-emulation (eth.c)
|
|
|
|
// Bytes to appear on each line of dump output.
|
|
//
|
|
#define DUMP_BytesPerLine 16
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Debug global declarations (defined in debug.c)
|
|
//-----------------------------------------------------------------------------
|
|
|
|
// Active debug trace level and active trace set mask. Set these variables
|
|
// with the debugger at startup to enable and filter the debug output. All
|
|
// messages with (TL_*) level less than or equal to 'g_ulTraceLevel' and from
|
|
// any (TM_*) set(s) present in 'g_ulTraceMask' are displayed.
|
|
//
|
|
extern INT g_ulTraceLevel;
|
|
extern ULONG g_ulTraceMask;
|
|
extern INT g_SkipAll;
|
|
extern INT g_DiscardNonUnicastPackets;
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Debug macros
|
|
//-----------------------------------------------------------------------------
|
|
|
|
#if DBG
|
|
|
|
// TRACE sends printf style output to the kernel debugger. Caller indicates a
|
|
// "verbosity" level with the 'ulLevel' argument and associates the trace with
|
|
// one or more trace sets with the 'ulMask' bit mask argument. Notice that
|
|
// the variable count printf arguments 'Args' must be parenthesized.
|
|
//
|
|
#define TRACE(ulLevel, Args) \
|
|
{ \
|
|
if (ulLevel <= g_ulTraceLevel && (g_ulTraceMask & TM_CURRENT)) \
|
|
{ \
|
|
DbgPrint( "A13: %s:", dbg_func_name); \
|
|
DbgPrint Args; \
|
|
DbgPrint ("\n"); \
|
|
} \
|
|
}
|
|
|
|
// TRACE0 is like TRACE, except that it doesn't print the prefix.
|
|
//
|
|
#define TRACE0(ulLevel, Args) \
|
|
{ \
|
|
if (ulLevel <= g_ulTraceLevel && (g_ulTraceMask & TM_CURRENT)) \
|
|
{ \
|
|
DbgPrint Args; \
|
|
} \
|
|
}
|
|
|
|
#define TR_FATAL(Args) \
|
|
TRACE(TL_FATAL, Args)
|
|
|
|
#define TR_INFO(Args) \
|
|
TRACE(TL_INFO, Args)
|
|
|
|
#define TR_WARN(Args) \
|
|
TRACE(TL_WARN, Args)
|
|
|
|
#define TR_VERB(Args) \
|
|
TRACE(TL_VERB, Args)
|
|
|
|
#define ENTER(_Name, _locid) \
|
|
char *dbg_func_name = (_Name); \
|
|
UINT dbg_func_locid = (_locid);
|
|
|
|
#define EXIT()
|
|
|
|
|
|
// ASSERT checks caller's assertion expression and if false, prints a kernel
|
|
// debugger message and breaks.
|
|
//
|
|
#undef ASSERT
|
|
#define ASSERT(x) \
|
|
{ \
|
|
if (!(x)) \
|
|
{ \
|
|
DbgPrint( "A13: !ASSERT( %s ) L:%d,F:%s\n", \
|
|
#x, __LINE__, __FILE__ ); \
|
|
DbgBreakPoint(); \
|
|
} \
|
|
}
|
|
|
|
#define ASSERTEX(x, ctxt) \
|
|
{ \
|
|
if (!(x)) \
|
|
{ \
|
|
DbgPrint( "A13: !ASSERT( %s ) C:0x%p L:%d,F:%s\n", \
|
|
#x, (ctxt), __LINE__, __FILE__ ); \
|
|
DbgBreakPoint(); \
|
|
} \
|
|
}
|
|
|
|
// DUMP prints to the kernel debugger a hex dump of 'cb' bytes starting at 'p'
|
|
// in groups of 'ul'. If 'f' is set the address of each line in shown before
|
|
// the dump. DUMPB, DUMPW, and DUMPDW are BYTE, WORD, and DWORD dumps
|
|
// respectively. Note that the multi-byte dumps do not reflect little-endian
|
|
// (Intel) byte order. The 'ulLevel' and 'ulMask' are described for TRACE.
|
|
//
|
|
#define DUMP(ulLevel,ulMask,p,cb,f,ul) \
|
|
{ \
|
|
if (ulLevel <= g_ulTraceLevel && (g_ulTraceMask & ulMask)) \
|
|
{ \
|
|
Dump( (CHAR* )p, cb, f, ul ); \
|
|
} \
|
|
}
|
|
|
|
#define DUMPB(ulLevel,ulMask,p,cb) \
|
|
{ \
|
|
if (ulLevel <= g_ulTraceLevel && (g_ulTraceMask & ulMask)) \
|
|
{ \
|
|
Dump( (CHAR* )p, cb, 0, 1 ); \
|
|
} \
|
|
}
|
|
|
|
#define DUMPW(ulLevel,ulMask,p,cb) \
|
|
{ \
|
|
if (ulLevel <= g_ulTraceLevel && (g_ulTraceMask & ulMask)) \
|
|
{ \
|
|
Dump( (CHAR* )p, cb, 0, 2 ); \
|
|
} \
|
|
}
|
|
|
|
#define DUMPDW(ulLevel,ulMask,p,cb) \
|
|
{ \
|
|
if (ulLevel <= g_ulTraceLevel && (g_ulTraceMask & ulMask)) \
|
|
{ \
|
|
Dump( (CHAR* )p, cb, 0, 4 ); \
|
|
} \
|
|
}
|
|
|
|
// DbgMark does nothing useful. But it is convenient to insert DBGMARK in
|
|
// places in your code while debugging, and set a breakpoint on DbgMark, so that
|
|
// the debugger will stop at the places you inserted DBGMARK. It's a bit more
|
|
// flexible than inserting a hardcoded DbgBreakPoint.
|
|
//
|
|
void DbgMark(UINT Luid);
|
|
#define DBGMARK(_Luid) DbgMark(_Luid)
|
|
|
|
|
|
#define DBGSTMT(_stmt) _stmt
|
|
|
|
#define RETAILASSERTEX ASSERTEX
|
|
#define RETAILASSERT ASSERT
|
|
|
|
#define ARP_INIT_REENTRANCY_COUNT() \
|
|
static LONG ReentrancyCount=1;
|
|
|
|
#define ARP_INC_REENTRANCY() \
|
|
arpDbgIncrementReentrancy(&ReentrancyCount)
|
|
|
|
#define ARP_DEC_REENTRANCY() \
|
|
arpDbgDecrementReentrancy(&ReentrancyCount)
|
|
|
|
#else // !DBG
|
|
|
|
// Debug macros compile out of non-DBG builds.
|
|
//
|
|
#define TRACE(ulLevel,ulMask,Args)
|
|
#define TR_FATAL(Args)
|
|
#define TR_INFO(Args)
|
|
#define TR_WARN(Args)
|
|
#define TR_VERB(Args)
|
|
#undef ASSERT
|
|
#define ASSERT(x)
|
|
#define ASSERTEX(x, ctxt)
|
|
#define DUMP(ulLevel,ulMask,p,cb,f,dw)
|
|
#define DUMPB(ulLevel,ulMask,p,cb)
|
|
#define DUMPW(ulLevel,ulMask,p,cb)
|
|
#define DUMPDW(ulLevel,ulMask,p,cb)
|
|
#define ENTER(_Name, _locid)
|
|
#define EXIT()
|
|
#define DBGMARK(_Luid) (0)
|
|
#define DBGSTMT(_stmt)
|
|
|
|
#if 1
|
|
#define ARP_INIT_REENTRANCY_COUNT()
|
|
#define ARP_INC_REENTRANCY() 0
|
|
#define ARP_DEC_REENTRANCY() 0
|
|
|
|
#else // !0
|
|
|
|
#define ARP_INIT_REENTRANCY_COUNT() \
|
|
static LONG ReentrancyCount=1;
|
|
|
|
#define ARP_INC_REENTRANCY() \
|
|
arpDbgIncrementReentrancy(&ReentrancyCount)
|
|
|
|
#define ARP_DEC_REENTRANCY() \
|
|
arpDbgDecrementReentrancy(&ReentrancyCount)
|
|
#endif // 0
|
|
|
|
#define RETAILASSERT(x) \
|
|
{ \
|
|
if (!(x)) \
|
|
{ \
|
|
DbgPrint( "A13: !RETAILASSERT( %s ) L:%d,F:%s\n", \
|
|
#x, __LINE__, __FILE__ ); \
|
|
DbgBreakPoint(); \
|
|
} \
|
|
}
|
|
|
|
#define RETAILASSERTEX(x, ctxt) \
|
|
{ \
|
|
if (!(x)) \
|
|
{ \
|
|
DbgPrint( "A13: !RETAILASSERT( %s ) C:0x%p L:%d,F:%s\n",\
|
|
#x, (ctxt), __LINE__, __FILE__ ); \
|
|
DbgBreakPoint(); \
|
|
} \
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#if BINARY_COMPATIBLE
|
|
#define ASSERT_PASSIVE() (0)
|
|
#else // !BINARY_COMPATIBLE
|
|
#define ASSERT_PASSIVE() \
|
|
ASSERT(KeGetCurrentIrql() < DISPATCH_LEVEL)
|
|
|
|
#endif // !BINARY_COMPATIBLE
|
|
//-----------------------------------------------------------------------------
|
|
// Prototypes
|
|
//-----------------------------------------------------------------------------
|
|
|
|
VOID
|
|
CheckList(
|
|
IN LIST_ENTRY* pList,
|
|
IN BOOLEAN fShowLinks );
|
|
|
|
VOID
|
|
Dump(
|
|
CHAR* p,
|
|
ULONG cb,
|
|
BOOLEAN fAddress,
|
|
ULONG ulGroup );
|
|
|
|
VOID
|
|
DumpLine(
|
|
CHAR* p,
|
|
ULONG cb,
|
|
BOOLEAN fAddress,
|
|
ULONG ulGroup );
|
|
|
|
|