1172 lines
36 KiB
C
1172 lines
36 KiB
C
//============================================================================
|
|
// Copyright (c) 1995, Microsoft Corporation
|
|
//
|
|
// File: ipmgm.h
|
|
//
|
|
// History:
|
|
// V Raman Aug-6-1997 Created.
|
|
//
|
|
// Contains type definitions and declarations for IP MGM.
|
|
//============================================================================
|
|
|
|
#ifndef _IPMGM_H_
|
|
#define _IPMGM_H_
|
|
|
|
|
|
|
|
//
|
|
// various codes describing states of IPMGM.
|
|
//
|
|
|
|
typedef enum _IPMGM_STATUS_CODE {
|
|
IPMGM_STATUS_STARTING = 100,
|
|
IPMGM_STATUS_RUNNING = 101,
|
|
IPMGM_STATUS_STOPPING = 102,
|
|
IPMGM_STATUS_STOPPED = 103
|
|
} IPMGM_STATUS_CODE, *PIPMGM_STATUS_CODE;
|
|
|
|
|
|
//
|
|
// Structure of global information maintained by MGM.
|
|
//
|
|
//
|
|
|
|
typedef struct _IPMGM_GLOBALS
|
|
{
|
|
//------------------------------------------------------------------------
|
|
// global stuff.
|
|
//------------------------------------------------------------------------
|
|
|
|
CRITICAL_SECTION csGlobal;
|
|
|
|
IPMGM_STATUS_CODE imscStatus;
|
|
|
|
HANDLE hIpMgmGlobalHeap;
|
|
|
|
LONG lActivityCount;
|
|
|
|
HANDLE hActivitySemaphore;
|
|
|
|
ROUTER_MANAGER_CONFIG rmcRmConfig;
|
|
|
|
|
|
//------------------------------------------------------------------------
|
|
// hash table sizes
|
|
//------------------------------------------------------------------------
|
|
|
|
DWORD dwRouteTableSize;
|
|
|
|
DWORD dwTimerQTableSize;
|
|
|
|
|
|
//------------------------------------------------------------------------
|
|
// Timer handles
|
|
//------------------------------------------------------------------------
|
|
|
|
HANDLE hRouteCheckTimer;
|
|
|
|
|
|
//------------------------------------------------------------------------
|
|
// lists and tables
|
|
//------------------------------------------------------------------------
|
|
|
|
LOCK_LIST llStackOfLocks;
|
|
|
|
DWORD dwNumProtocols;
|
|
|
|
MGM_LOCKED_LIST mllProtocolList;
|
|
|
|
MGM_LOCKED_LIST mllOutstandingJoinList;
|
|
|
|
PMGM_LOCKED_LIST pmllIfHashTable;
|
|
|
|
PMGM_LOCKED_LIST pmllRouteHashTable;
|
|
|
|
|
|
DWORD dwNumTempEntries;
|
|
|
|
MGM_LOCKED_LIST mllTempGrpList;
|
|
|
|
MGM_LOCKED_LIST mllGrpList;
|
|
|
|
PMGM_LOCKED_LIST pmllGrpHashTable;
|
|
|
|
PHANDLE phTimerQHandleTable;
|
|
|
|
|
|
//------------------------------------------------------------------------
|
|
// trace stuff.
|
|
//------------------------------------------------------------------------
|
|
|
|
DWORD dwTraceID;
|
|
|
|
DWORD dwLogLevel;
|
|
|
|
HANDLE hLogHandle;
|
|
|
|
} IPMGM_GLOBALS, *PIPMGM_GLOBALS;
|
|
|
|
|
|
|
|
|
|
//============================================================================
|
|
// external declaration of the global IPMGM struct
|
|
//============================================================================
|
|
|
|
extern IPMGM_GLOBALS ig;
|
|
|
|
|
|
//============================================================================
|
|
// Macros to access hash functions and hash table sizes
|
|
//============================================================================
|
|
|
|
#define IF_TABLE_SIZE ig.rmcRmConfig.dwIfTableSize
|
|
|
|
#define IF_TABLE_HASH( Index ) \
|
|
( ( Index ) % IF_TABLE_SIZE )
|
|
|
|
|
|
#define ROUTE_TABLE_SIZE ig.dwRouteTableSize
|
|
|
|
#define ROUTE_TABLE_HASH( p ) \
|
|
( ( (p)-> RR_Network.N_NetNumber ) % ROUTE_TABLE_SIZE )
|
|
|
|
|
|
#define GROUP_TABLE_SIZE ig.rmcRmConfig.dwGrpTableSize
|
|
|
|
#define GROUP_TABLE_HASH( Group, Mask ) \
|
|
( Group ? ( Group % ( GROUP_TABLE_SIZE - 1 ) + 1 ) : 0 )
|
|
|
|
|
|
#define SOURCE_TABLE_SIZE ig.rmcRmConfig.dwSrcTableSize
|
|
|
|
#define SOURCE_TABLE_HASH( Source, Mask ) \
|
|
( Source ? ( Source % ( SOURCE_TABLE_SIZE - 1 ) + 1 ) : 0 )
|
|
|
|
|
|
#define TIMER_TABLE_SIZE ig.dwTimerQTableSize
|
|
|
|
#define TIMER_TABLE_HASH( Group ) \
|
|
( ( Group ) % TIMER_TABLE_SIZE )
|
|
|
|
|
|
//============================================================================
|
|
// Max number of entries in the temp group list.
|
|
// if more entries are added to the temp group list then
|
|
// the temp group list is merged with the master group list
|
|
//============================================================================
|
|
|
|
#define TEMP_GROUP_LIST_MAXSIZE 16
|
|
|
|
#define TEMP_SOURCE_LIST_MAXSIZE 16
|
|
|
|
|
|
//============================================================================
|
|
// macros to access list heads
|
|
//============================================================================
|
|
|
|
#define PROTOCOL_LIST_HEAD() &ig.mllProtocolList.leHead
|
|
|
|
#define JOIN_LIST_HEAD() &ig.mllOutstandingJoinList.leHead
|
|
|
|
#define IF_BUCKET_HEAD( i ) &ig.pmllIfHashTable[ (i) ].leHead
|
|
|
|
#define ROUTE_BUCKET_HEAD( i ) &ig.pmllRouteHashTable[ (i) ].leHead
|
|
|
|
|
|
#define GROUP_BUCKET_HEAD( i ) &ig.pmllGrpHashTable[ (i) ].leHead
|
|
|
|
#define TEMP_GROUP_LIST_HEAD() &ig.mllTempGrpList.leHead
|
|
|
|
#define MASTER_GROUP_LIST_HEAD() &ig.mllGrpList.leHead
|
|
|
|
|
|
#define SOURCE_BUCKET_HEAD( a, b ) &(a)-> pleSrcHashTable[ (b) ]
|
|
|
|
#define MASTER_SOURCE_LIST_HEAD(a) &(a)-> leSourceList
|
|
|
|
#define TEMP_SOURCE_LIST_HEAD( a ) &(a)-> leTempSrcList
|
|
|
|
#define TIMER_QUEUE_HANDLE( i ) ig.phTimerQHandleTable[ i ]
|
|
|
|
|
|
//============================================================================
|
|
// Macros to access router manager callback for kernel mode forwarder
|
|
//============================================================================
|
|
|
|
#define IS_ADD_MFE_CALLBACK() \
|
|
ig.rmcRmConfig.pfnAddMfeCallback != NULL
|
|
|
|
#define ADD_MFE_CALLBACK() \
|
|
( *(ig.rmcRmConfig.pfnAddMfeCallback) )
|
|
|
|
#define IS_DELETE_MFE_CALLBACK()\
|
|
ig.rmcRmConfig.pfnDeleteMfeCallback != NULL
|
|
|
|
#define DELETE_MFE_CALLBACK() \
|
|
( *(ig.rmcRmConfig.pfnDeleteMfeCallback) )
|
|
|
|
#define IS_GET_MFE_CALLBACK() \
|
|
ig.rmcRmConfig.pfnGetMfeCallback != NULL
|
|
|
|
#define GET_MFE_CALLBACK() \
|
|
( *(ig.rmcRmConfig.pfnGetMfeCallback) )
|
|
|
|
#define IS_HAS_BOUNDARY_CALLBACK() \
|
|
ig.rmcRmConfig.pfnHasBoundaryCallback != NULL
|
|
|
|
#define HAS_BOUNDARY_CALLBACK() \
|
|
( *(ig.rmcRmConfig.pfnHasBoundaryCallback) )
|
|
|
|
|
|
//============================================================================
|
|
// memory-allocation constants and macros
|
|
//============================================================================
|
|
|
|
#define GLOBAL_HEAP ig.hIpMgmGlobalHeap
|
|
#define MGM_ALLOC(size) HeapAlloc(GLOBAL_HEAP, 0, size)
|
|
#define MGM_FREE(ptr) HeapFree(GLOBAL_HEAP, 0, ptr)
|
|
|
|
|
|
|
|
//============================================================================
|
|
// macros invoked when entering API or worker functions
|
|
//============================================================================
|
|
|
|
#define ENTER_MGM_API() EnterMgmAPI()
|
|
#define ENTER_MGM_WORKER() EnterMgmWorker()
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
// macro invoked when leaving API or worker functions
|
|
//----------------------------------------------------------------------------
|
|
|
|
#define LEAVE_MGM_API() LeaveMgmWorker()
|
|
#define LEAVE_MGM_WORKER() LeaveMgmWorker()
|
|
|
|
|
|
//============================================================================
|
|
// constants used for tracing
|
|
//============================================================================
|
|
|
|
#define IPMGM_TRACE_ANY ((DWORD)0xFFFF0000 | TRACE_USE_MASK)
|
|
#define IPMGM_TRACE_ENTER ((DWORD)0x00010000 | TRACE_USE_MASK)
|
|
#define IPMGM_TRACE_LEAVE ((DWORD)0x00020000 | TRACE_USE_MASK)
|
|
#define IPMGM_TRACE_TIMER ((DWORD)0x00040000 | TRACE_USE_MASK)
|
|
#define IPMGM_TRACE_IF ((DWORD)0x00080000 | TRACE_USE_MASK)
|
|
#define IPMGM_TRACE_GROUP ((DWORD)0x00100000 | TRACE_USE_MASK)
|
|
#define IPMGM_TRACE_PROTOCOL ((DWORD)0x00200000 | TRACE_USE_MASK)
|
|
#define IPMGM_TRACE_LOCK ((DWORD)0x00400000 | TRACE_USE_MASK)
|
|
#define IPMGM_TRACE_LOCK_COUNT ((DWORD)0x00800000 | TRACE_USE_MASK)
|
|
#define IPMGM_TRACE_START ((DWORD)0x01000000 | TRACE_USE_MASK)
|
|
#define IPMGM_TRACE_STOP ((DWORD)0x02000000 | TRACE_USE_MASK)
|
|
#define IPMGM_TRACE_PACKET ((DWORD)0x04000000 | TRACE_USE_MASK)
|
|
#define IPMGM_TRACE_FORWARD ((DWORD)0x08000000 | TRACE_USE_MASK)
|
|
#define IPMGM_TRACE_CALLBACK ((DWORD)0x10000000 | TRACE_USE_MASK)
|
|
#define IPMGM_TRACE_ENUM ((DWORD)0x20000000 | TRACE_USE_MASK)
|
|
#define IPMGM_TRACE_ROUTE ((DWORD)0x40000000 | TRACE_USE_MASK)
|
|
#define IPMGM_TRACE_SCOPE ((DWORD)0x80000000 | TRACE_USE_MASK)
|
|
|
|
|
|
//============================================================================
|
|
//
|
|
// macros used for locking and unlocking protected structures
|
|
//
|
|
//============================================================================
|
|
|
|
#ifdef LOCK_DEBUG
|
|
|
|
|
|
//
|
|
// Sync functions/lock creation-deletion tracing
|
|
//
|
|
|
|
#define TRACELOCK0(a) \
|
|
TracePrintfEx(TRACEID, IPMGM_TRACE_LOCK, a)
|
|
|
|
#define TRACELOCK1(a, b) \
|
|
TracePrintfEx(TRACEID, IPMGM_TRACE_LOCK, a, b)
|
|
|
|
#define TRACELOCK2(a, b, c) \
|
|
TracePrintfEx(TRACEID, IPMGM_TRACE_LOCK, a, b, c)
|
|
|
|
#define TRACELOCK3(a, b, c, d) \
|
|
TracePrintfEx(TRACEID, IPMGM_TRACE_LOCK, a, b, c, d)
|
|
|
|
|
|
#define TRACECOUNT0(a) \
|
|
TracePrintfEx(TRACEID, IPMGM_TRACE_LOCK_COUNT, a)
|
|
|
|
#define TRACECOUNT1(a, b) \
|
|
TracePrintfEx(TRACEID, IPMGM_TRACE_LOCK_COUNT, a, b)
|
|
|
|
#define TRACECOUNT2(a, b, c) \
|
|
TracePrintfEx(TRACEID, IPMGM_TRACE_LOCK_COUNT, a, b, c)
|
|
|
|
#else
|
|
|
|
#define TRACELOCK0(a)
|
|
|
|
#define TRACELOCK1(a, b)
|
|
|
|
#define TRACELOCK2(a, b, c)
|
|
|
|
#define TRACELOCK3(a, b, c, d)
|
|
|
|
#define TRACECOUNT0(a)
|
|
|
|
#define TRACECOUNT1(a, b)
|
|
|
|
#define TRACECOUNT2(a, b, c)
|
|
|
|
#endif
|
|
|
|
|
|
//
|
|
// Protocol locks
|
|
//
|
|
|
|
#define ACQUIRE_PROTOCOL_LOCK_EXCLUSIVE() \
|
|
{ \
|
|
TRACELOCK0( "Acquiring protocol lock exclusive" ); \
|
|
AcquireWriteLock(&ig.mllProtocolList.pmrwlLock); \
|
|
TRACELOCK0( "Acquired protocol lock exclusive" ); \
|
|
}
|
|
|
|
#define RELEASE_PROTOCOL_LOCK_EXCLUSIVE() \
|
|
{ \
|
|
TRACELOCK0( "Releasing protocol lock exclusive" ); \
|
|
ReleaseWriteLock(&ig.mllProtocolList.pmrwlLock); \
|
|
TRACELOCK0( "Released protocol lock exclusive" ); \
|
|
}
|
|
|
|
#define ACQUIRE_PROTOCOL_LOCK_SHARED() \
|
|
{ \
|
|
TRACELOCK0( "Acquiring protocol lock shared" ); \
|
|
AcquireReadLock(&ig.mllProtocolList.pmrwlLock); \
|
|
TRACELOCK0( "Acquired protocol lock shared" ); \
|
|
}
|
|
|
|
#define RELEASE_PROTOCOL_LOCK_SHARED() \
|
|
{ \
|
|
TRACELOCK0( "Releasing protocol lock shared" ); \
|
|
ReleaseReadLock(&ig.mllProtocolList.pmrwlLock); \
|
|
TRACELOCK0( "Released protocol lock shared" ); \
|
|
}
|
|
|
|
|
|
//
|
|
// scope boundaries lock
|
|
//
|
|
|
|
#define ACQUIRE_JOIN_LIST_LOCK_EXCLUSIVE() \
|
|
{ \
|
|
TRACELOCK0( "Acquiring Join list lock exclusive" ); \
|
|
AcquireWriteLock(&ig.mllOutstandingJoinList.pmrwlLock); \
|
|
TRACELOCK0( "Acquired Join list lock exclusive" ); \
|
|
}
|
|
|
|
#define RELEASE_JOIN_LIST_LOCK_EXCLUSIVE() \
|
|
{ \
|
|
TRACELOCK0( "Releasing join list lock exclusive" ); \
|
|
ReleaseWriteLock(&ig.mllOutstandingJoinList.pmrwlLock); \
|
|
TRACELOCK0( "Released join list lock exclusive" ); \
|
|
}
|
|
|
|
#define ACQUIRE_JOIN_LIST_LOCK_SHARED() \
|
|
{ \
|
|
TRACELOCK0( "Acquiring join list lock shared" ); \
|
|
AcquireReadLock(&ig.mllOutstandingJoinList.pmrwlLock); \
|
|
TRACELOCK0( "Acquired join list lock shared" ); \
|
|
}
|
|
|
|
#define RELEASE_JOIN_LIST_LOCK_SHARED() \
|
|
{ \
|
|
TRACELOCK0( "Releasing join list lock shared" ); \
|
|
ReleaseReadLock(&ig.mllOutstandingJoinList.pmrwlLock); \
|
|
TRACELOCK0( "Released join list lock shared" ); \
|
|
}
|
|
|
|
|
|
//
|
|
// Interfaces locking
|
|
//
|
|
|
|
#define ACQUIRE_IF_LOCK_EXCLUSIVE( i ) \
|
|
{ \
|
|
TRACELOCK1( "Acquiring interface lock exclusive : %d", i ); \
|
|
AcquireWriteLock(&ig.pmllIfHashTable[ i ].pmrwlLock); \
|
|
TRACELOCK1( "Acquired interface lock exclusive : %d", i ); \
|
|
}
|
|
|
|
#define RELEASE_IF_LOCK_EXCLUSIVE( i ) \
|
|
{ \
|
|
TRACELOCK1( "Releasing interface lock exclusive : %d", i ); \
|
|
ReleaseWriteLock(&ig.pmllIfHashTable[ i ].pmrwlLock); \
|
|
TRACELOCK1( "Released interface lock exclusive : %d", i ); \
|
|
}
|
|
|
|
#define ACQUIRE_IF_LOCK_SHARED( i ) \
|
|
{ \
|
|
TRACELOCK1( "Acquiring interface lock shared : %d", i ); \
|
|
AcquireReadLock(&ig.pmllIfHashTable[ i ].pmrwlLock); \
|
|
TRACELOCK1( "Acquired interface lock shared : %d", i ); \
|
|
}
|
|
|
|
#define RELEASE_IF_LOCK_SHARED( i ) \
|
|
{ \
|
|
TRACELOCK1( "Releasing interface lock shared : %d", i ); \
|
|
ReleaseReadLock(&ig.pmllIfHashTable[ i ].pmrwlLock); \
|
|
TRACELOCK1( "Released interface lock shared : %d", i ); \
|
|
}
|
|
|
|
|
|
//
|
|
// Route references lock
|
|
//
|
|
|
|
#define ACQUIRE_ROUTE_LOCK_EXCLUSIVE( p ) \
|
|
{ \
|
|
TRACELOCK0( "Acquiring route lock exclusive" ); \
|
|
AcquireWriteLock(&(p)->pmrwlLock); \
|
|
TRACELOCK0( "Acquired route lock exclusive"); \
|
|
}
|
|
|
|
#define RELEASE_ROUTE_LOCK_EXCLUSIVE( p ) \
|
|
{ \
|
|
TRACELOCK0( "Releasing route lock exclusive"); \
|
|
ReleaseWriteLock(&(p)->pmrwlLock); \
|
|
TRACELOCK0( "Released route lock exclusive" ); \
|
|
}
|
|
|
|
#define ACQUIRE_ROUTE_LOCK_SHARED( p ) \
|
|
{ \
|
|
TRACELOCK0( "Acquiring route lock shared : %x"); \
|
|
AcquireReadLock(&(p)->pmrwlLock); \
|
|
TRACELOCK0( "Acquired route lock shared : %x"); \
|
|
}
|
|
|
|
#define RELEASE_ROUTE_LOCK_SHARED( p ) \
|
|
{ \
|
|
TRACELOCK0( "Releasing route lock shared : %x"); \
|
|
ReleaseReadLock(&(p)->pmrwlLock); \
|
|
TRACELOCK0( "Released route lock shared : %x"); \
|
|
}
|
|
|
|
|
|
//
|
|
// Group table locks
|
|
//
|
|
|
|
#define ACQUIRE_GROUP_LOCK_EXCLUSIVE( i ) \
|
|
{ \
|
|
TRACELOCK1( "Acquiring group lock exclusive : %d", i ); \
|
|
AcquireWriteLock(&ig.pmllGrpHashTable[ i ].pmrwlLock); \
|
|
TRACELOCK1( "Acquired group lock exclusive : %d", i ); \
|
|
}
|
|
|
|
#define RELEASE_GROUP_LOCK_EXCLUSIVE( i ) \
|
|
{ \
|
|
TRACELOCK1( "Releasing group lock exclusive : %d", i ); \
|
|
ReleaseWriteLock(&ig.pmllGrpHashTable[ i ].pmrwlLock); \
|
|
TRACELOCK1( "Released group lock exclusive : %d", i ); \
|
|
}
|
|
|
|
#define ACQUIRE_GROUP_LOCK_SHARED( i ) \
|
|
{ \
|
|
TRACELOCK1( "Acquiring group lock shared : %d", i ); \
|
|
AcquireReadLock(&ig.pmllGrpHashTable[ i ].pmrwlLock); \
|
|
TRACELOCK1( "Acquired group lock shared : %d", i ); \
|
|
}
|
|
|
|
#define RELEASE_GROUP_LOCK_SHARED( i ) \
|
|
{ \
|
|
TRACELOCK1( "Releasing group lock shared : %d", i ); \
|
|
ReleaseReadLock(&ig.pmllGrpHashTable[ i ].pmrwlLock); \
|
|
TRACELOCK1( "Released group lock shared : %d", i ); \
|
|
}
|
|
|
|
|
|
//
|
|
// Master group list locks
|
|
//
|
|
|
|
#define ACQUIRE_MASTER_GROUP_LOCK_EXCLUSIVE() \
|
|
{ \
|
|
TRACELOCK0( "Acquiring master group lock exclusive" ); \
|
|
AcquireWriteLock(&ig.mllGrpList.pmrwlLock); \
|
|
TRACELOCK0( "Acquired master group lock exclusive" ); \
|
|
}
|
|
|
|
#define RELEASE_MASTER_GROUP_LOCK_EXCLUSIVE() \
|
|
{ \
|
|
TRACELOCK0( "Releasing master group lock exclusive" ); \
|
|
ReleaseWriteLock(&ig.mllGrpList.pmrwlLock); \
|
|
TRACELOCK0( "Released master group lock exclusive" ); \
|
|
}
|
|
|
|
#define ACQUIRE_MASTER_GROUP_LOCK_SHARED() \
|
|
{ \
|
|
TRACELOCK0( "Acquiring master group lock shared" ); \
|
|
AcquireReadLock(&ig.mllGrpList.pmrwlLock); \
|
|
TRACELOCK0( "Acquired master group lock shared" ); \
|
|
}
|
|
|
|
#define RELEASE_MASTER_GROUP_LOCK_SHARED() \
|
|
{ \
|
|
TRACELOCK0( "Releasing master group lock shared" ); \
|
|
ReleaseReadLock(&ig.mllGrpList.pmrwlLock); \
|
|
TRACELOCK0( "Released master group lock shared" ); \
|
|
}
|
|
|
|
|
|
//
|
|
// Temp group list locks
|
|
//
|
|
|
|
#define ACQUIRE_TEMP_GROUP_LOCK_EXCLUSIVE() \
|
|
{ \
|
|
TRACELOCK0( "Acquiring temp group lock exclusive" ); \
|
|
AcquireWriteLock(&ig.mllTempGrpList.pmrwlLock); \
|
|
TRACELOCK0( "Acquired temp group lock exclusive" ); \
|
|
}
|
|
|
|
#define RELEASE_TEMP_GROUP_LOCK_EXCLUSIVE() \
|
|
{ \
|
|
TRACELOCK0( "Releasing temp group lock exclusive" ); \
|
|
ReleaseWriteLock(&ig.mllTempGrpList.pmrwlLock); \
|
|
TRACELOCK0( "Released temp group lock exclusive" ); \
|
|
}
|
|
|
|
#define ACQUIRE_TEMP_GROUP_LOCK_SHARED() \
|
|
{ \
|
|
TRACELOCK0( "Acquiring temp group lock shared" ); \
|
|
AcquireReadLock(&ig.mllTempGrpList.pmrwlLock); \
|
|
TRACELOCK0( "Acquired temp group lock shared" ); \
|
|
}
|
|
|
|
#define RELEASE_TEMP_GROUP_LOCK_SHARED() \
|
|
{ \
|
|
TRACELOCK0( "Releasing temp group lock shared" ); \
|
|
ReleaseReadLock(&ig.mllTempGrpList.pmrwlLock); \
|
|
TRACELOCK0( "Released temp group lock shared" ); \
|
|
}
|
|
|
|
|
|
//
|
|
// Group entry locks
|
|
//
|
|
|
|
#define ACQUIRE_GROUP_ENTRY_LOCK_EXCLUSIVE( p ) \
|
|
{ \
|
|
TRACELOCK3( "Acquiring group entry lock exclusive : %x, %d, %s", (p)-> dwGroupAddr, __LINE__, __FILE__ ); \
|
|
AcquireWriteLock(&(p)->pmrwlLock); \
|
|
TRACELOCK1( "Acquired group entry lock exclusive : %x", (p)-> dwGroupAddr ); \
|
|
}
|
|
|
|
#define RELEASE_GROUP_ENTRY_LOCK_EXCLUSIVE( p ) \
|
|
{ \
|
|
TRACELOCK3( "Releasing group entry lock exclusive : %x, %d, %s", (p)-> dwGroupAddr,, __LINE__, __FILE__ ); \
|
|
ReleaseWriteLock(&(p)->pmrwlLock); \
|
|
TRACELOCK1( "Released group entry lock exclusive : %x", (p)-> dwGroupAddr ); \
|
|
}
|
|
|
|
#define ACQUIRE_GROUP_ENTRY_LOCK_SHARED( p ) \
|
|
{ \
|
|
TRACELOCK3( "Acquiring group entry lock shared : %x, %d, %s", (p)-> dwGroupAddr, __LINE__, __FILE__ ); \
|
|
AcquireReadLock(&(p)->pmrwlLock); \
|
|
TRACELOCK1( "Acquired group entry lock shared : %x", (p)-> dwGroupAddr ); \
|
|
}
|
|
|
|
#define RELEASE_GROUP_ENTRY_LOCK_SHARED( p ) \
|
|
{ \
|
|
TRACELOCK3( "Releasing group entry lock shared : %x, %d, %s", (p)-> dwGroupAddr, __LINE__, __FILE__ ); \
|
|
ReleaseReadLock(&(p)->pmrwlLock); \
|
|
TRACELOCK1( "Released group entry lock shared : %x", (p)-> dwGroupAddr ); \
|
|
}
|
|
|
|
|
|
#define ENTER_GLOBAL_SECTION() \
|
|
EnterCriticalSection(&ig.csGlobal)
|
|
|
|
#define LEAVE_GLOBAL_SECTION() \
|
|
LeaveCriticalSection(&ig.csGlobal)
|
|
|
|
|
|
#define ENTER_GLOBAL_LOCK_LIST_SECTION() \
|
|
EnterCriticalSection(&ig.llStackOfLocks.csListLock)
|
|
|
|
#define LEAVE_GLOBAL_LOCK_LIST_SECTION() \
|
|
LeaveCriticalSection(&ig.llStackOfLocks.csListLock)
|
|
|
|
|
|
|
|
//============================================================================
|
|
// macros used for tracing
|
|
//============================================================================
|
|
|
|
#define TRACEID ig.dwTraceID
|
|
|
|
|
|
#define TRACESTART() \
|
|
TRACEID = TraceRegister("IPMGM")
|
|
#define TRACESTOP() \
|
|
TraceDeregister(TRACEID)
|
|
#define TRACE0(l,a) \
|
|
TracePrintfEx(TRACEID, IPMGM_TRACE_ ## l, a)
|
|
#define TRACE1(l,a,b) \
|
|
TracePrintfEx(TRACEID, IPMGM_TRACE_ ## l, a, b)
|
|
#define TRACE2(l,a,b,c) \
|
|
TracePrintfEx(TRACEID, IPMGM_TRACE_ ## l, a, b, c)
|
|
#define TRACE3(l,a,b,c,d) \
|
|
TracePrintfEx(TRACEID, IPMGM_TRACE_ ## l, a, b, c, d)
|
|
#define TRACE4(l,a,b,c,d,e) \
|
|
TracePrintfEx(TRACEID, IPMGM_TRACE_ ## l, a, b, c, d, e)
|
|
#define TRACE5(l,a,b,c,d,e,f) \
|
|
TracePrintfEx(TRACEID, IPMGM_TRACE_ ## l, a, b, c, d, e, f)
|
|
#define TRACE6(l,a,b,c,d,e,f,g) \
|
|
TracePrintfEx(TRACEID, IPMGM_TRACE_ ## l, a, b, c, d, e, f, g)
|
|
|
|
#define TRACEDUMP(l,a,b,c) \
|
|
TraceDumpEx(TRACEID,l,a,b,c,TRUE)
|
|
|
|
|
|
//============================================================================
|
|
// macros for debug trace only
|
|
//============================================================================
|
|
|
|
//
|
|
// enum trace
|
|
//
|
|
|
|
#if ENUM_DBG
|
|
|
|
#define TRACEENUM0 TRACE0
|
|
|
|
#define TRACEENUM1 TRACE1
|
|
|
|
#define TRACEENUM2 TRACE2
|
|
|
|
#define TRACEENUM3 TRACE3
|
|
|
|
#define TRACEENUM4 TRACE4
|
|
|
|
#else
|
|
|
|
#define TRACEENUM0(l,a)
|
|
|
|
#define TRACEENUM1(l,a,b)
|
|
|
|
#define TRACEENUM2(l,a,b,c)
|
|
|
|
#define TRACEENUM3(l,a,b,c,d)
|
|
|
|
#define TRACEENUM4(l,a,b,c,d,e)
|
|
|
|
#endif
|
|
|
|
|
|
//
|
|
// forward trace
|
|
//
|
|
|
|
#if FORWARD_DBG
|
|
|
|
#define TRACEFORWARD0 TRACE0
|
|
|
|
#define TRACEFORWARD1 TRACE1
|
|
|
|
#define TRACEFORWARD2 TRACE2
|
|
|
|
#define TRACEFORWARD3 TRACE3
|
|
|
|
#define TRACEFORWARD4 TRACE4
|
|
|
|
#define TRACEFORWARD5 TRACE5
|
|
|
|
#define TRACEFORWARD6 TRACE6
|
|
|
|
|
|
#else
|
|
|
|
#define TRACEFORWARD0(l,a)
|
|
|
|
#define TRACEFORWARD1(l,a,b)
|
|
|
|
#define TRACEFORWARD2(l,a,b,c)
|
|
|
|
#define TRACEFORWARD3(l,a,b,c,d)
|
|
|
|
#define TRACEFORWARD4(l,a,b,c,d,e)
|
|
|
|
#define TRACEFORWARD5(l,a,b,c,d,e,f)
|
|
|
|
#define TRACEFORWARD6(l,a,b,c,d,e,f,g)
|
|
|
|
#endif
|
|
|
|
|
|
//
|
|
// group trace
|
|
//
|
|
|
|
#if GROUP_DBG
|
|
|
|
#define TRACEGROUP0 TRACE0
|
|
|
|
#define TRACEGROUP1 TRACE1
|
|
|
|
#define TRACEGROUP2 TRACE2
|
|
|
|
#define TRACEGROUP3 TRACE3
|
|
|
|
#define TRACEGROUP4 TRACE4
|
|
|
|
#define TRACEGROUP5 TRACE5
|
|
|
|
#define TRACEGROUP6 TRACE6
|
|
|
|
|
|
#else
|
|
|
|
#define TRACEGROUP0(l,a)
|
|
|
|
#define TRACEGROUP1(l,a,b)
|
|
|
|
#define TRACEGROUP2(l,a,b,c)
|
|
|
|
#define TRACEGROUP3(l,a,b,c,d)
|
|
|
|
#define TRACEGROUP4(l,a,b,c,d,e)
|
|
|
|
#define TRACEGROUP5(l,a,b,c,d,e,f)
|
|
|
|
#define TRACEGROUP6(l,a,b,c,d,e,f,g)
|
|
|
|
#endif
|
|
|
|
|
|
//
|
|
// Interface trace
|
|
//
|
|
|
|
#if IF_DBG
|
|
|
|
#define TRACEIF0 TRACE0
|
|
|
|
#define TRACEIF1 TRACE1
|
|
|
|
#define TRACEIF2 TRACE2
|
|
|
|
#define TRACEIF3 TRACE3
|
|
|
|
#define TRACEIF4 TRACE4
|
|
|
|
#define TRACEIF5 TRACE5
|
|
|
|
#define TRACEIF6 TRACE6
|
|
|
|
|
|
#else
|
|
|
|
#define TRACEIF0(l,a)
|
|
|
|
#define TRACEIF1(l,a,b)
|
|
|
|
#define TRACEIF2(l,a,b,c)
|
|
|
|
#define TRACEIF3(l,a,b,c,d)
|
|
|
|
#define TRACEIF4(l,a,b,c,d,e)
|
|
|
|
#define TRACEIF5(l,a,b,c,d,e,f)
|
|
|
|
#define TRACEIF6(l,a,b,c,d,e,f,g)
|
|
|
|
#endif
|
|
|
|
|
|
//
|
|
// packet trace
|
|
//
|
|
|
|
#if PACKET_DBG
|
|
|
|
#define TRACEPACKET0 TRACE0
|
|
|
|
#define TRACEPACKET1 TRACE1
|
|
|
|
#define TRACEPACKET2 TRACE2
|
|
|
|
#define TRACEPACKET3 TRACE3
|
|
|
|
#define TRACEPACKET4 TRACE4
|
|
|
|
#define TRACEPACKET5 TRACE5
|
|
|
|
#define TRACEPACKET6 TRACE6
|
|
|
|
|
|
#else
|
|
|
|
#define TRACEPACKET0(l,a)
|
|
|
|
#define TRACEPACKET1(l,a,b)
|
|
|
|
#define TRACEPACKET2(l,a,b,c)
|
|
|
|
#define TRACEPACKET3(l,a,b,c,d)
|
|
|
|
#define TRACEPACKET4(l,a,b,c,d,e)
|
|
|
|
#define TRACEPACKET5(l,a,b,c,d,e,f)
|
|
|
|
#define TRACEPACKET6(l,a,b,c,d,e,f,g)
|
|
|
|
#endif
|
|
|
|
|
|
//
|
|
// route trace
|
|
//
|
|
|
|
#if ROUTE_DBG
|
|
|
|
#define TRACEROUTE0 TRACE0
|
|
|
|
#define TRACEROUTE1 TRACE1
|
|
|
|
#define TRACEROUTE2 TRACE2
|
|
|
|
#define TRACEROUTE3 TRACE3
|
|
|
|
#define TRACEROUTE4 TRACE4
|
|
|
|
#define TRACEROUTE5 TRACE5
|
|
|
|
#define TRACEROUTE6 TRACE6
|
|
|
|
|
|
#else
|
|
|
|
#define TRACEROUTE0(l,a)
|
|
|
|
#define TRACEROUTE1(l,a,b)
|
|
|
|
#define TRACEROUTE2(l,a,b,c)
|
|
|
|
#define TRACEROUTE3(l,a,b,c,d)
|
|
|
|
#define TRACEROUTE4(l,a,b,c,d,e)
|
|
|
|
#define TRACEROUTE5(l,a,b,c,d,e,f)
|
|
|
|
#define TRACEROUTE6(l,a,b,c,d,e,f,g)
|
|
|
|
#endif
|
|
|
|
|
|
//
|
|
// scope trace
|
|
//
|
|
|
|
#if SCOPE_DBG
|
|
|
|
#define TRACESCOPE0 TRACE0
|
|
|
|
#define TRACESCOPE1 TRACE1
|
|
|
|
#define TRACESCOPE2 TRACE2
|
|
|
|
#define TRACESCOPE3 TRACE3
|
|
|
|
#define TRACESCOPE4 TRACE4
|
|
|
|
#define TRACESCOPE5 TRACE5
|
|
|
|
#define TRACESCOPE6 TRACE6
|
|
|
|
|
|
#else
|
|
|
|
#define TRACESCOPE0(l,a)
|
|
|
|
#define TRACESCOPE1(l,a,b)
|
|
|
|
#define TRACESCOPE2(l,a,b,c)
|
|
|
|
#define TRACESCOPE3(l,a,b,c,d)
|
|
|
|
#define TRACESCOPE4(l,a,b,c,d,e)
|
|
|
|
#define TRACESCOPE5(l,a,b,c,d,e,f)
|
|
|
|
#define TRACESCOPE6(l,a,b,c,d,e,f,g)
|
|
|
|
#endif
|
|
|
|
|
|
//============================================================================
|
|
// Event logging macros
|
|
//============================================================================
|
|
|
|
#define LOGLEVEL ig.dwLogLevel
|
|
#define LOGHANDLE ig.hLogHandle
|
|
#define LOGERR RouterLogError
|
|
#define LOGWARN RouterLogWarning
|
|
#define LOGINFO RouterLogInformation
|
|
#define LOGWARNDATA RouterLogWarningData
|
|
|
|
|
|
//
|
|
// Error logging
|
|
//
|
|
|
|
#define LOGERR0(msg,err) \
|
|
if (LOGLEVEL >= IPMGM_LOGGING_ERROR) \
|
|
LOGERR(LOGHANDLE,IPMGMLOG_ ## msg,0,NULL,(err))
|
|
#define LOGERR1(msg,a,err) \
|
|
if (LOGLEVEL >= IPMGM_LOGGING_ERROR) \
|
|
LOGERR(LOGHANDLE,IPMGMLOG_ ## msg,1,&(a),(err))
|
|
#define LOGERR2(msg,a,b,err) \
|
|
if (LOGLEVEL >= IPMGM_LOGGING_ERROR) { \
|
|
LPSTR _asz[2] = { (a), (b) }; \
|
|
LOGERR(LOGHANDLE,IPMGMLOG_ ## msg,2,_asz,(err)); \
|
|
}
|
|
#define LOGERR3(msg,a,b,c,err) \
|
|
if (LOGLEVEL >= IPMGM_LOGGING_ERROR) { \
|
|
LPSTR _asz[3] = { (a), (b), (c) }; \
|
|
LOGERR(LOGHANDLE,IPMGMLOG_ ## msg,3,_asz,(err)); \
|
|
}
|
|
#define LOGERR4(msg,a,b,c,d,err) \
|
|
if (LOGLEVEL >= IPMGM_LOGGING_ERROR) { \
|
|
LPSTR _asz[4] = { (a), (b), (c), (d) }; \
|
|
LOGERR(LOGHANDLE,IPMGMLOG_ ## msg,4,_asz,(err)); \
|
|
}
|
|
|
|
|
|
//
|
|
// Warning logging
|
|
//
|
|
|
|
#define LOGWARN0(msg,err) \
|
|
if (LOGLEVEL >= IPMGM_LOGGING_WARN) \
|
|
LOGWARN(LOGHANDLE,IPMGMLOG_ ## msg,0,NULL,(err))
|
|
#define LOGWARN1(msg,a,err) \
|
|
if (LOGLEVEL >= IPMGM_LOGGING_WARN) \
|
|
LOGWARN(LOGHANDLE,IPMGMLOG_ ## msg,1,&(a),(err))
|
|
#define LOGWARN2(msg,a,b,err) \
|
|
if (LOGLEVEL >= IPMGM_LOGGING_WARN) { \
|
|
LPSTR _asz[2] = { (a), (b) }; \
|
|
LOGWARN(LOGHANDLE,IPMGMLOG_ ## msg,2,_asz,(err)); \
|
|
}
|
|
#define LOGWARN3(msg,a,b,c,err) \
|
|
if (LOGLEVEL >= IPMGM_LOGGING_WARN) { \
|
|
LPSTR _asz[3] = { (a), (b), (c) }; \
|
|
LOGWARN(LOGHANDLE,IPMGMLOG_ ## msg,3,_asz,(err)); \
|
|
}
|
|
#define LOGWARN4(msg,a,b,c,d,err) \
|
|
if (LOGLEVEL >= IPMGM_LOGGING_WARN) { \
|
|
LPSTR _asz[4] = { (a), (b), (c), (d) }; \
|
|
LOGWARN(LOGHANDLE,IPMGMLOG_ ## msg,4,_asz,(err)); \
|
|
}
|
|
|
|
#define LOGWARNDATA2(msg,a,b,dw,buf) \
|
|
if (LOGLEVEL >= IPMGM_LOGGING_WARN) { \
|
|
LPSTR _asz[2] = { (a), (b) }; \
|
|
LOGWARNDATA(LOGHANDLE,IPMGMLOG_ ## msg,2,_asz,(dw),(buf)); \
|
|
}
|
|
|
|
|
|
//
|
|
// Information logging
|
|
//
|
|
|
|
#define LOGINFO0(msg,err) \
|
|
if (LOGLEVEL >= IPMGM_LOGGING_INFO) \
|
|
LOGINFO(LOGHANDLE,IPMGMLOG_ ## msg,0,NULL,(err))
|
|
#define LOGINFO1(msg,a,err) \
|
|
if (LOGLEVEL >= IPMGM_LOGGING_INFO) \
|
|
LOGINFO(LOGHANDLE,IPMGMLOG_ ## msg,1,&(a),(err))
|
|
#define LOGINFO2(msg,a,b,err) \
|
|
if (LOGLEVEL >= IPMGM_LOGGING_INFO) { \
|
|
LPSTR _asz[2] = { (a), (b) }; \
|
|
LOGINFO(LOGHANDLE,IPMGMLOG_ ## msg,2,_asz,(err)); \
|
|
}
|
|
#define LOGINFO3(msg,a,b,c,err) \
|
|
if (LOGLEVEL >= IPMGM_LOGGING_INFO) { \
|
|
LPSTR _asz[3] = { (a), (b), (c) }; \
|
|
LOGINFO(LOGHANDLE,IPMGMLOG_ ## msg,3,_asz,(err)); \
|
|
}
|
|
#define LOGINFO4(msg,a,b,c,d,err) \
|
|
if (LOGLEVEL >= IPMGM_LOGGING_INFO) { \
|
|
LPSTR _asz[4] = { (a), (b), (c), (d) }; \
|
|
LOGINFO(LOGHANDLE,IPMGMLOG_ ## msg,4,_asz,(err)); \
|
|
}
|
|
|
|
|
|
//============================================================================
|
|
// Macros to access routing protocol callbacks
|
|
//============================================================================
|
|
|
|
#define IS_JOIN_ALERT( p ) \
|
|
(p)-> rpcProtocolConfig.pfnJoinAlertCallback != NULL
|
|
|
|
#define IS_PRUNE_ALERT( p ) \
|
|
(p)-> rpcProtocolConfig.pfnPruneAlertCallback != NULL
|
|
|
|
#define IS_LOCAL_JOIN_ALERT( p ) \
|
|
(p)-> rpcProtocolConfig.pfnLocalJoinCallback != NULL
|
|
|
|
#define IS_LOCAL_LEAVE_ALERT( p ) \
|
|
(p)-> rpcProtocolConfig.pfnLocalLeaveCallback != NULL
|
|
|
|
#define IS_RPF_CALLBACK( p ) \
|
|
(p)-> rpcProtocolConfig.pfnRpfCallback != NULL
|
|
|
|
#define IS_CREATION_ALERT( p ) \
|
|
(p)-> rpcProtocolConfig.pfnCreationAlertCallback != NULL
|
|
|
|
|
|
#define RPF_CALLBACK( p ) \
|
|
( *( (p)-> rpcProtocolConfig.pfnRpfCallback ) )
|
|
|
|
|
|
#if CALLBACK_DEBUG
|
|
|
|
#define JOIN_ALERT( p ) \
|
|
{ \
|
|
TRACE2( \
|
|
CALLBACK, "Invoked Join Alert for protocol %x, %x", \
|
|
(p)-> dwProtocolId, (p)-> dwComponentId \
|
|
); \
|
|
} \
|
|
( *( (p)-> rpcProtocolConfig.pfnJoinAlertCallback ) )
|
|
|
|
|
|
#define PRUNE_ALERT( p ) \
|
|
{ \
|
|
TRACE2( \
|
|
CALLBACK, "Invoked Prune Alert for protocol %x, %x", \
|
|
(p)-> dwProtocolId, (p)-> dwComponentId \
|
|
); \
|
|
} \
|
|
( *( (p)-> rpcProtocolConfig.pfnPruneAlertCallback ) )
|
|
|
|
|
|
#define LOCAL_JOIN_ALERT( p ) \
|
|
{ \
|
|
TRACE2( \
|
|
CALLBACK, "Invoked Local Join Alert for protocol %x, %x", \
|
|
(p)-> dwProtocolId, (p)-> dwComponentId \
|
|
); \
|
|
} \
|
|
( *( (p)-> rpcProtocolConfig.pfnLocalJoinCallback ) )
|
|
|
|
|
|
#define LOCAL_LEAVE_ALERT( p ) \
|
|
{ \
|
|
TRACE2( \
|
|
CALLBACK, "Invoked Local Leave Alert for protocol %x, %x", \
|
|
(p)-> dwProtocolId, (p)-> dwComponentId \
|
|
); \
|
|
} \
|
|
( *( (p)-> rpcProtocolConfig.pfnLocalLeaveCallback ) )
|
|
|
|
|
|
|
|
#define CREATION_ALERT( p ) \
|
|
{ \
|
|
TRACE2( \
|
|
CALLBACK, "Invoked Creation Alert for protocol %x, %x", \
|
|
(p)-> dwProtocolId, (p)-> dwComponentId \
|
|
); \
|
|
} \
|
|
( *( (p)-> rpcProtocolConfig.pfnCreationAlertCallback ) )
|
|
|
|
|
|
#define IGMP_DISABLE_CALLBACK( p ) \
|
|
{ \
|
|
TRACE0( \
|
|
CALLBACK, "Invoked Disable IGMP Alert ", \
|
|
); \
|
|
} \
|
|
( *( (p)-> rpcProtocolConfig.pfnDisableIgmpCallback ) )
|
|
|
|
#define IGMP_ENABLE_CALLBACK( p ) \
|
|
{ \
|
|
TRACE0( \
|
|
CALLBACK, "Invoked Enable IGMP Alert ", \
|
|
); \
|
|
} \
|
|
( *( (p)-> rpcProtocolConfig.pfnEnableIgmpCallback ) )
|
|
|
|
|
|
#else
|
|
|
|
#define JOIN_ALERT( p ) \
|
|
( *( (p)-> rpcProtocolConfig.pfnJoinAlertCallback ) )
|
|
|
|
#define PRUNE_ALERT( p ) \
|
|
( *( (p)-> rpcProtocolConfig.pfnPruneAlertCallback ) )
|
|
|
|
#define LOCAL_JOIN_ALERT( p ) \
|
|
( *( (p)-> rpcProtocolConfig.pfnLocalJoinCallback ) )
|
|
|
|
#define LOCAL_LEAVE_ALERT( p ) \
|
|
( *( (p)-> rpcProtocolConfig.pfnLocalLeaveCallback ) )
|
|
|
|
#define CREATION_ALERT( p ) \
|
|
( *( (p)-> rpcProtocolConfig.pfnCreationAlertCallback ) )
|
|
|
|
#define IGMP_DISABLE_CALLBACK( p ) \
|
|
( *( (p)-> rpcProtocolConfig.pfnDisableIgmpCallback ) )
|
|
|
|
#define IGMP_ENABLE_CALLBACK( p ) \
|
|
( *( (p)-> rpcProtocolConfig.pfnEnableIgmpCallback ) )
|
|
|
|
#endif
|
|
|
|
|
|
|
|
//============================================================================
|
|
// Client count and worker thread related stuff.
|
|
//============================================================================
|
|
|
|
DWORD
|
|
QueueMgmWorker(
|
|
WORKERFUNCTION pFunction,
|
|
PVOID pContext
|
|
);
|
|
|
|
BOOL
|
|
EnterMgmAPI(
|
|
);
|
|
|
|
BOOL
|
|
EnterMgmWorker(
|
|
);
|
|
|
|
VOID
|
|
LeaveMgmWorker(
|
|
);
|
|
|
|
VOID
|
|
DisplayGroupTable(
|
|
);
|
|
|
|
|
|
|
|
extern RTM_ENTITY_INFO g_reiRtmEntity;
|
|
|
|
extern RTM_REGN_PROFILE g_rrpRtmProfile;
|
|
|
|
extern RTM_ENTITY_HANDLE g_hRtmHandle;
|
|
|
|
extern RTM_NOTIFY_HANDLE g_hNotificationHandle;
|
|
|
|
extern RTM_REGN_PROFILE g_rrpRtmProfile;
|
|
|
|
#endif // _IPMGM_H_
|
|
|