//============================================================================ // 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_