541 lines
20 KiB
C
541 lines
20 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 1995 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
routing\ip\rtrmgr\defs.c
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
IP Router Manager defines
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
Gurdeep Singh Pall 6/16/95 Created
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#ifndef __DEFS_H__
|
||
|
#define __DEFS_H__
|
||
|
|
||
|
#include "logtrdef.h"
|
||
|
|
||
|
//
|
||
|
// Neat macros to avoid errors
|
||
|
//
|
||
|
|
||
|
#define is ==
|
||
|
#define isnot !=
|
||
|
#define and &&
|
||
|
#define or ||
|
||
|
|
||
|
#define INVALID_INDEX_OR_INSTANCE 0xffffffff
|
||
|
|
||
|
#define INVALID_ADAPTER_ID INVALID_INDEX_OR_INSTANCE
|
||
|
#define INVALID_IF_INSTANCE INVALID_INDEX_OR_INSTANCE
|
||
|
#define INVALID_AT_INSTANCE INVALID_INDEX_OR_INSTANCE
|
||
|
#define INVALID_IF_INDEX INVALID_INDEX_OR_INSTANCE
|
||
|
|
||
|
#define INVALID_IP_ADDRESS 0x00000000
|
||
|
|
||
|
#define HOST_ROUTE_MASK 0xFFFFFFFF
|
||
|
#define IP_LOOPBACK_ADDRESS 0x0100007F
|
||
|
#define ALL_ONES_BROADCAST 0xFFFFFFFF
|
||
|
#define ALL_ONES_MASK 0xFFFFFFFF
|
||
|
#define LOCAL_NET_MULTICAST 0x000000E0
|
||
|
#define LOCAL_NET_MULTICAST_MASK 0x000000F0
|
||
|
|
||
|
#define CLASSA_ADDR(a) (( (*((uchar *)&(a))) & 0x80) == 0)
|
||
|
#define CLASSB_ADDR(a) (( (*((uchar *)&(a))) & 0xc0) == 0x80)
|
||
|
#define CLASSC_ADDR(a) (( (*((uchar *)&(a))) & 0xe0) == 0xc0)
|
||
|
#define CLASSE_ADDR(a) ((( (*((uchar *)&(a))) & 0xf0) == 0xf0) && \
|
||
|
((a) != 0xffffffff))
|
||
|
|
||
|
#define CLASSA_MASK 0x000000ff
|
||
|
#define CLASSB_MASK 0x0000ffff
|
||
|
#define CLASSC_MASK 0x00ffffff
|
||
|
#define CLASSD_MASK 0x000000e0
|
||
|
#define CLASSE_MASK 0xffffffff
|
||
|
|
||
|
#define INET_CMP(a,b,c) \
|
||
|
(((c) = (((a) & 0x000000ff) - ((b) & 0x000000ff))) ? (c) : \
|
||
|
(((c) = (((a) & 0x0000ff00) - ((b) & 0x0000ff00))) ? (c) : \
|
||
|
(((c) = (((a) & 0x00ff0000) - ((b) & 0x00ff0000))) ? (c) : \
|
||
|
(((c) = ((((a)>>8) & 0x00ff0000) - (((b)>>8) & 0x00ff0000)))))))
|
||
|
|
||
|
#define GetClassMask(a)\
|
||
|
(CLASSA_ADDR((a)) ? CLASSA_MASK : \
|
||
|
(CLASSB_ADDR((a)) ? CLASSB_MASK : \
|
||
|
(CLASSC_ADDR((a)) ? CLASSC_MASK : CLASSE_MASK)))
|
||
|
|
||
|
#define IsValidIpAddress(a) \
|
||
|
((((ULONG)((a) & 0x000000FF)) < ((ULONG)0x000000E0)) && \
|
||
|
(((a) & 0x000000FF) != 0))
|
||
|
|
||
|
//
|
||
|
// Number of pending IRPs
|
||
|
//
|
||
|
|
||
|
#define NUM_MCAST_IRPS 3
|
||
|
#define NUM_ROUTE_CHANGE_IRPS 3
|
||
|
|
||
|
#define EVENT_DEMANDDIAL 0
|
||
|
#define EVENT_IPINIP (EVENT_DEMANDDIAL + 1)
|
||
|
#define EVENT_STOP_ROUTER (EVENT_IPINIP + 1)
|
||
|
#define EVENT_SET_FORWARDING (EVENT_STOP_ROUTER + 1)
|
||
|
#define EVENT_FORWARDING_CHANGE (EVENT_SET_FORWARDING + 1)
|
||
|
#define EVENT_STACK_CHANGE (EVENT_FORWARDING_CHANGE + 1)
|
||
|
#define EVENT_ROUTINGPROTOCOL (EVENT_STACK_CHANGE + 1)
|
||
|
#define EVENT_RTRDISCTIMER (EVENT_ROUTINGPROTOCOL + 1)
|
||
|
#define EVENT_RTRDISCSOCKET (EVENT_RTRDISCTIMER + 1)
|
||
|
#define EVENT_MCMISCSOCKET (EVENT_RTRDISCSOCKET + 1)
|
||
|
#define EVENT_MHBEAT (EVENT_MCMISCSOCKET + 1)
|
||
|
#define EVENT_MZAPTIMER (EVENT_MHBEAT + 1)
|
||
|
#define EVENT_MZAPSOCKET (EVENT_MZAPTIMER + 1)
|
||
|
#define EVENT_RASADVTIMER (EVENT_MZAPSOCKET + 1)
|
||
|
#define EVENT_MCAST_0 (EVENT_RASADVTIMER + 1)
|
||
|
#define EVENT_MCAST_1 (EVENT_MCAST_0 + 1)
|
||
|
#define EVENT_MCAST_2 (EVENT_MCAST_1 + 1)
|
||
|
#define EVENT_ROUTE_CHANGE_0 (EVENT_MCAST_2 + 1)
|
||
|
#define EVENT_ROUTE_CHANGE_1 (EVENT_ROUTE_CHANGE_0 + 1)
|
||
|
#define EVENT_ROUTE_CHANGE_2 (EVENT_ROUTE_CHANGE_1 + 1)
|
||
|
|
||
|
|
||
|
//
|
||
|
// Last one + 1
|
||
|
//
|
||
|
|
||
|
#define NUMBER_OF_EVENTS (EVENT_ROUTE_CHANGE_2 + 1)
|
||
|
|
||
|
//
|
||
|
// The polling time to see if all interfaces have been deleted
|
||
|
//
|
||
|
|
||
|
#define INTERFACE_DELETE_POLL_TIME 2500
|
||
|
|
||
|
//
|
||
|
// Number of times we try to read the server adapter address
|
||
|
//
|
||
|
|
||
|
#define MAX_SERVER_INIT_TRIES 1
|
||
|
|
||
|
//
|
||
|
// Number of millisecs we sleep between tries
|
||
|
//
|
||
|
|
||
|
#define SERVER_INIT_SLEEP_TIME 3000
|
||
|
|
||
|
|
||
|
#define REGISTER register
|
||
|
|
||
|
#define IP_ROUTE_HASH_TABLE_SIZE 257
|
||
|
#define IP_ROUTE_TABLE_MEMORY 64 * 50000 // 64 approx size of route, 50000 routes
|
||
|
|
||
|
#define MGM_IF_TABLE_SIZE 29
|
||
|
#define MGM_GROUP_TABLE_SIZE 257
|
||
|
#define MGM_SOURCE_TABLE_SIZE 257
|
||
|
|
||
|
#define ICB_HASH_TABLE_SIZE 57
|
||
|
|
||
|
#define BINDING_HASH_TABLE_SIZE 57
|
||
|
|
||
|
#define BIND_HASH(X) ((X) % BINDING_HASH_TABLE_SIZE)
|
||
|
|
||
|
//#define ADAPTER_HASH_TABLE_SIZE 57
|
||
|
//#define ADAPTER_HASH(X) ((X) % ADAPTER_HASH_TABLE_SIZE)
|
||
|
|
||
|
|
||
|
//
|
||
|
// A coherency number put into the ICBs. It is incremented with each added
|
||
|
// interface. The internal interface is 1, and the loopback interface is 2
|
||
|
// hence this must be > 2
|
||
|
//
|
||
|
|
||
|
#define LOOPBACK_INTERFACE_INDEX 1
|
||
|
//#define SERVER_INTERFACE_INDEX 2
|
||
|
#define INITIAL_SEQUENCE_NUMBER 1
|
||
|
|
||
|
//
|
||
|
// For links we dont know about, we set the MTU to 1500
|
||
|
//
|
||
|
|
||
|
#define DEFAULT_MTU 1500
|
||
|
|
||
|
|
||
|
#define LOOPBACK_STRID 9990
|
||
|
#define INTERNAL_STRID 9991
|
||
|
#define WAN_STRID 9992
|
||
|
#define IPIP_STRID 9993
|
||
|
|
||
|
//
|
||
|
// Macros called each time an api is called and exited. This is to
|
||
|
// facilitate RouterStop() functionality.
|
||
|
//
|
||
|
|
||
|
#define EnterRouterApi() { \
|
||
|
EnterCriticalSection(&RouterStateLock) ; \
|
||
|
if (RouterState.IRS_State == RTR_STATE_RUNNING) { \
|
||
|
RouterState.IRS_RefCount++ ; \
|
||
|
LeaveCriticalSection(&RouterStateLock) ; \
|
||
|
} else { \
|
||
|
LeaveCriticalSection(&RouterStateLock) ; \
|
||
|
Trace1(ANY, "error %d on RM API", ERROR_ROUTER_STOPPED); \
|
||
|
return ERROR_ROUTER_STOPPED ; \
|
||
|
} \
|
||
|
}
|
||
|
|
||
|
#define ExitRouterApi() { \
|
||
|
EnterCriticalSection(&RouterStateLock) ; \
|
||
|
RouterState.IRS_RefCount-- ; \
|
||
|
LeaveCriticalSection(&RouterStateLock) ; \
|
||
|
}
|
||
|
|
||
|
|
||
|
//++
|
||
|
//
|
||
|
// BOOL
|
||
|
// IsIfP2P(
|
||
|
// IN DWORD dwRouterIfType
|
||
|
// )
|
||
|
//
|
||
|
//--
|
||
|
|
||
|
|
||
|
#define IsIfP2P(t) \
|
||
|
(((t) == ROUTER_IF_TYPE_FULL_ROUTER) || \
|
||
|
((t) == ROUTER_IF_TYPE_HOME_ROUTER) || \
|
||
|
((t) == ROUTER_IF_TYPE_TUNNEL1) || \
|
||
|
((t) == ROUTER_IF_TYPE_DIALOUT))
|
||
|
|
||
|
|
||
|
//
|
||
|
// Additional flags for the IP route structure
|
||
|
// These are not in RTM.H because we dont want to expose them
|
||
|
// to the public's prying eyes.
|
||
|
//
|
||
|
// NOTE IP_VALID_ROUTE is #defined as 0x00000001
|
||
|
//
|
||
|
|
||
|
#define IP_VALID_ROUTE 0x00000001
|
||
|
#define IP_STACK_ROUTE 0x00000002
|
||
|
#define IP_P2P_ROUTE 0x00000004
|
||
|
|
||
|
#define IP_SETTABLE_ROUTE (IP_VALID_ROUTE | IP_STACK_ROUTE)
|
||
|
|
||
|
#define ClearRouteFlags(pRoute) \
|
||
|
((pRoute)->Flags1 = 0x00000000)
|
||
|
|
||
|
|
||
|
#define IsRouteValid(pRoute) \
|
||
|
((pRoute)->Flags1 & IP_VALID_ROUTE)
|
||
|
|
||
|
#define SetRouteValid(pRoute) \
|
||
|
((pRoute)->Flags1 |= IP_VALID_ROUTE)
|
||
|
|
||
|
#define ClearRouteValid(pRoute) \
|
||
|
((pRoute)->Flags1 &= ~IP_VALID_ROUTE)
|
||
|
|
||
|
|
||
|
#define IsRouteStack(pRoute) \
|
||
|
((pRoute)->Flags1 & IP_STACK_ROUTE)
|
||
|
|
||
|
#define SetRouteStack(pRoute) \
|
||
|
((pRoute)->Flags1 |= IP_STACK_ROUTE)
|
||
|
|
||
|
#define ClearRouteStack(pRoute) \
|
||
|
((pRoute)->Flags1 &= ~IP_STACK_ROUTE)
|
||
|
|
||
|
|
||
|
#define IsRouteP2P(pRoute) \
|
||
|
((pRoute)->Flags1 & IP_P2P_ROUTE)
|
||
|
|
||
|
#define SetRouteP2P(pRoute) \
|
||
|
((pRoute)->Flags1 |= IP_P2P_ROUTE)
|
||
|
|
||
|
#define ClearRouteP2P(pRoute) \
|
||
|
((pRoute)->Flags1 &= ~IP_P2P_ROUTE)
|
||
|
|
||
|
/*
|
||
|
|
||
|
//
|
||
|
// VOID
|
||
|
// ConvertRTMToForward(PMIB_IPFORWARDROW forwardRow, RTM_IP_ROUTE *route)
|
||
|
//
|
||
|
|
||
|
#define ConvertRTMToForward(f,route){ \
|
||
|
(f)->dwForwardDest = (route)->RR_Network.N_NetNumber; \
|
||
|
(f)->dwForwardIfIndex = (route)->RR_InterfaceID; \
|
||
|
(f)->dwForwardMetric1 = (route)->RR_FamilySpecificData.FSD_Metric1; \
|
||
|
(f)->dwForwardMetric2 = (route)->RR_FamilySpecificData.FSD_Metric2; \
|
||
|
(f)->dwForwardMetric3 = (route)->RR_FamilySpecificData.FSD_Metric3; \
|
||
|
(f)->dwForwardMetric4 = (route)->RR_FamilySpecificData.FSD_Metric4; \
|
||
|
(f)->dwForwardMetric5 = (route)->RR_FamilySpecificData.FSD_Metric5; \
|
||
|
(f)->dwForwardNextHop = (route)->RR_NextHopAddress.N_NetNumber; \
|
||
|
(f)->dwForwardType = (route)->RR_FamilySpecificData.FSD_Type; \
|
||
|
(f)->dwForwardProto = (route)->RR_RoutingProtocol; \
|
||
|
(f)->dwForwardAge = RtmGetRouteAge((route)); \
|
||
|
(f)->dwForwardMask = (route)->RR_Network.N_NetMask; \
|
||
|
(f)->dwForwardNextHopAS = (route)->RR_FamilySpecificData.FSD_NextHopAS; \
|
||
|
(f)->dwForwardPolicy = (route)->RR_FamilySpecificData.FSD_Policy;}
|
||
|
|
||
|
//
|
||
|
// VOID
|
||
|
// ConvertForwardToRTM(PMIB_IPFORWARDROW forwardRow,
|
||
|
// RTM_IP_ROUTE *route,
|
||
|
// DWORD dwNextHopMask)
|
||
|
//
|
||
|
|
||
|
#define ConvertForwardToRTM(f,route,mask){ \
|
||
|
(route)->RR_Network.N_NetNumber = (f)->dwForwardDest; \
|
||
|
(route)->RR_InterfaceID = (f)->dwForwardIfIndex; \
|
||
|
(route)->RR_FamilySpecificData.FSD_Metric = \
|
||
|
(route)->RR_FamilySpecificData.FSD_Metric1 = (f)->dwForwardMetric1; \
|
||
|
(route)->RR_FamilySpecificData.FSD_Metric2 = (f)->dwForwardMetric2; \
|
||
|
(route)->RR_FamilySpecificData.FSD_Metric3 = (f)->dwForwardMetric3; \
|
||
|
(route)->RR_FamilySpecificData.FSD_Metric4 = (f)->dwForwardMetric4; \
|
||
|
(route)->RR_FamilySpecificData.FSD_Metric5 = (f)->dwForwardMetric5; \
|
||
|
(route)->RR_FamilySpecificData.FSD_Priority = 0; \
|
||
|
(route)->RR_NextHopAddress.N_NetNumber = (f)->dwForwardNextHop; \
|
||
|
(route)->RR_NextHopAddress.N_NetMask = (mask); \
|
||
|
(route)->RR_Network.N_NetMask = (f)->dwForwardMask; \
|
||
|
(route)->RR_FamilySpecificData.FSD_Policy = (f)->dwForwardPolicy; \
|
||
|
(route)->RR_FamilySpecificData.FSD_NextHopAS = (f)->dwForwardNextHopAS;\
|
||
|
(route)->RR_FamilySpecificData.FSD_Type = (f)->dwForwardType; \
|
||
|
(route)->RR_RoutingProtocol = (f)->dwForwardProto; \
|
||
|
ClearRouteFlags((route)); \
|
||
|
SetRouteValid((route)); \
|
||
|
SetRouteStack((route)); }
|
||
|
|
||
|
//
|
||
|
// VOID
|
||
|
// ConvertStackToRTM(RTM_IP_ROUTE *route,
|
||
|
// IPRouteEntry *ipreRow
|
||
|
// DWORD dwNextHopMask)
|
||
|
//
|
||
|
|
||
|
#define ConvertStackToRTM(route,ipreRow,mask){ \
|
||
|
(route)->RR_Network.N_NetNumber = (ipreRow)->ire_dest; \
|
||
|
(route)->RR_InterfaceID = (ipreRow)->ire_index; \
|
||
|
(route)->RR_FamilySpecificData.FSD_Metric = \
|
||
|
(route)->RR_FamilySpecificData.FSD_Metric1 = (ipreRow)->ire_metric1; \
|
||
|
(route)->RR_FamilySpecificData.FSD_Metric2 = (ipreRow)->ire_metric2; \
|
||
|
(route)->RR_FamilySpecificData.FSD_Metric3 = (ipreRow)->ire_metric3; \
|
||
|
(route)->RR_FamilySpecificData.FSD_Metric4 = (ipreRow)->ire_metric4; \
|
||
|
(route)->RR_FamilySpecificData.FSD_Metric5 = (ipreRow)->ire_metric5; \
|
||
|
(route)->RR_FamilySpecificData.FSD_Priority = 0; \
|
||
|
(route)->RR_NextHopAddress.N_NetNumber = (ipreRow)->ire_nexthop; \
|
||
|
(route)->RR_NextHopAddress.N_NetMask = (mask); \
|
||
|
(route)->RR_Network.N_NetMask = (ipreRow)->ire_mask; \
|
||
|
(route)->RR_FamilySpecificData.FSD_Policy = 0; \
|
||
|
(route)->RR_FamilySpecificData.FSD_NextHopAS = 0; \
|
||
|
(route)->RR_FamilySpecificData.FSD_Type = (ipreRow)->ire_type; \
|
||
|
(route)->RR_RoutingProtocol = (ipreRow)->ire_proto; \
|
||
|
ClearRouteFlags((route)); \
|
||
|
SetRouteValid((route)); \
|
||
|
SetRouteStack((route)); }
|
||
|
|
||
|
//
|
||
|
// VOID
|
||
|
// ConvertStackToForward(PMIB_IPFORWARDROW forwardRow,
|
||
|
// IPRouteEntry *ipreRow)
|
||
|
//
|
||
|
|
||
|
#define ConvertStackToForward(forwardRow,ipreRow) { \
|
||
|
(forwardRow)->dwForwardDest = (ipreRow)->ire_dest; \
|
||
|
(forwardRow)->dwForwardIfIndex = (ipreRow)->ire_index; \
|
||
|
(forwardRow)->dwForwardMetric1 = (ipreRow)->ire_metric1; \
|
||
|
(forwardRow)->dwForwardMetric2 = (ipreRow)->ire_metric2; \
|
||
|
(forwardRow)->dwForwardMetric3 = (ipreRow)->ire_metric3; \
|
||
|
(forwardRow)->dwForwardMetric4 = (ipreRow)->ire_metric4; \
|
||
|
(forwardRow)->dwForwardMetric5 = (ipreRow)->ire_metric5; \
|
||
|
(forwardRow)->dwForwardNextHop = (ipreRow)->ire_nexthop; \
|
||
|
(forwardRow)->dwForwardType = (ipreRow)->ire_type; \
|
||
|
(forwardRow)->dwForwardProto = (ipreRow)->ire_proto; \
|
||
|
(forwardRow)->dwForwardAge = (ipreRow)->ire_age; \
|
||
|
(forwardRow)->dwForwardMask = (ipreRow)->ire_mask; \
|
||
|
(forwardRow)->dwForwardNextHopAS = 0; \
|
||
|
(forwardRow)->dwForwardPolicy = 0; }
|
||
|
|
||
|
*/
|
||
|
|
||
|
#define IPADDRCACHE 0
|
||
|
#define IPFORWARDCACHE IPADDRCACHE + 1
|
||
|
#define IPNETCACHE IPFORWARDCACHE + 1
|
||
|
#define TCPCACHE IPNETCACHE + 1
|
||
|
#define UDPCACHE TCPCACHE + 1
|
||
|
|
||
|
//
|
||
|
// Last Cache + 1
|
||
|
//
|
||
|
|
||
|
#define NUM_CACHE UDPCACHE + 1
|
||
|
|
||
|
//
|
||
|
// We tag the ICB_LIST and the PROTOCOL_CB_LIST locks at the end of the
|
||
|
// locks used by the MIB handler.
|
||
|
//
|
||
|
|
||
|
#define ICB_LIST NUM_CACHE
|
||
|
#define PROTOCOL_CB_LIST ICB_LIST + 1
|
||
|
#define BINDING_LIST PROTOCOL_CB_LIST + 1
|
||
|
#define BOUNDARY_TABLE BINDING_LIST + 1
|
||
|
#define MZAP_TIMER BOUNDARY_TABLE + 1
|
||
|
#define ZBR_LIST MZAP_TIMER + 1
|
||
|
#define ZLE_LIST ZBR_LIST + 1
|
||
|
#define ZAM_CACHE ZLE_LIST + 1
|
||
|
#define STACK_ROUTE_LIST ZAM_CACHE + 1
|
||
|
|
||
|
//
|
||
|
// Number of locks
|
||
|
//
|
||
|
|
||
|
#define NUM_LOCKS STACK_ROUTE_LIST + 1
|
||
|
|
||
|
#define IPADDRCACHE_TIMEOUT 1000
|
||
|
#define IPFORWARDCACHE_TIMEOUT 1000
|
||
|
#define IPNETCACHE_TIMEOUT 1000
|
||
|
#define TCPCACHE_TIMEOUT 1000
|
||
|
#define UDPCACHE_TIMEOUT 1000
|
||
|
#define ARPENTCACHE_TIMEOUT 300 * IPNETCACHE_TIMEOUT
|
||
|
|
||
|
#define SPILLOVER 5
|
||
|
#define MAX_DIFF 5
|
||
|
|
||
|
//
|
||
|
// All ACCESS_XXX > ACCESS_GET_NEXT are SETS
|
||
|
// All ACCESS_XXX which have bit0 set require an EXACT MATCH
|
||
|
//
|
||
|
|
||
|
#define ACCESS_GET 1
|
||
|
#define ACCESS_GET_FIRST 2
|
||
|
#define ACCESS_GET_NEXT 4
|
||
|
#define ACCESS_SET 5
|
||
|
#define ACCESS_CREATE_ENTRY 7
|
||
|
#define ACCESS_DELETE_ENTRY 9
|
||
|
|
||
|
#define EXACT_MATCH(X) ((X) & 0x00000001)
|
||
|
|
||
|
#ifdef DEADLOCK_DEBUG
|
||
|
|
||
|
extern PBYTE g_pszLockNames[];
|
||
|
|
||
|
#define EXIT_LOCK(id) { \
|
||
|
Trace1(LOCK,"Exit lock %s",g_pszLockNames[id]); \
|
||
|
RtlReleaseResource(&(g_LockTable[(id)])); \
|
||
|
Trace1(LOCK,"Exited lock %s",g_pszLockNames[id]); \
|
||
|
}
|
||
|
|
||
|
#define READER_TO_WRITER(id) { \
|
||
|
Trace1(LOCK,"Reader To Writer %s",g_pszLockNames[id]); \
|
||
|
RtlConvertSharedToExclusive(&(g_LockTable[(id)])); \
|
||
|
Trace1(LOCK,"Promoted for %s",g_pszLockNames[id]); \
|
||
|
}
|
||
|
|
||
|
#define ENTER_READER(id) { \
|
||
|
Trace1(LOCK,"Entering Reader %s",g_pszLockNames[id]); \
|
||
|
RtlAcquireResourceShared(&(g_LockTable[(id)]),TRUE); \
|
||
|
Trace1(LOCK,"Entered %s",g_pszLockNames[id]); \
|
||
|
}
|
||
|
|
||
|
#define ENTER_WRITER(id) { \
|
||
|
Trace1(LOCK,"Entering Writer %s",g_pszLockNames[id]); \
|
||
|
RtlAcquireResourceExclusive(&(g_LockTable[(id)]),TRUE); \
|
||
|
Trace1(LOCK,"Entered %s",g_pszLockNames[id]); \
|
||
|
}
|
||
|
|
||
|
#define WRITER_TO_READER(id) { \
|
||
|
Trace1(LOCK,"Writer To Reader %s",g_pszLockNames[id]); \
|
||
|
RtlConvertExclusiveToShared(&(g_LockTable[(id)])); \
|
||
|
Trace1(LOCK,"Demoted for %s",g_pszLockNames[id]); \
|
||
|
}
|
||
|
|
||
|
#else // DEADLOCK_DEBUG
|
||
|
|
||
|
#define EXIT_LOCK(id) RtlReleaseResource(&(g_LockTable[(id)]))
|
||
|
#define READER_TO_WRITER(id) RtlConvertSharedToExclusive(&(g_LockTable[(id)]))
|
||
|
#define ENTER_READER(id) RtlAcquireResourceShared(&(g_LockTable[(id)]),TRUE)
|
||
|
#define ENTER_WRITER(id) RtlAcquireResourceExclusive(&(g_LockTable[(id)]),TRUE)
|
||
|
#define WRITER_TO_READER(id) RtlConvertExclusiveToShared(&(g_LockTable[(id)]))
|
||
|
|
||
|
#endif // DEADLOCK_DEBUG
|
||
|
|
||
|
|
||
|
#if DBG
|
||
|
|
||
|
#define IpRtAssert(exp){ \
|
||
|
if(!(exp)) \
|
||
|
{ \
|
||
|
TracePrintf(TraceHandle, \
|
||
|
"Assertion failed in %s : %d \n",__FILE__,__LINE__);\
|
||
|
RouterAssert(#exp,__FILE__,__LINE__,NULL); \
|
||
|
} \
|
||
|
}
|
||
|
|
||
|
#else
|
||
|
|
||
|
#define IpRtAssert(exp)
|
||
|
|
||
|
#endif
|
||
|
|
||
|
//
|
||
|
// Registry defines
|
||
|
//
|
||
|
|
||
|
#define REGISTRY_ENABLE_DHCP "EnableDHCP"
|
||
|
#define REGISTRY_IPADDRESS "IPAddress"
|
||
|
#define REGISTRY_SUBNETMASK "SubnetMask"
|
||
|
#define REGISTRY_DHCPSUBNETMASK "DhcpSubnetMask"
|
||
|
#define REGISTRY_DHCPIPADDRESS "DhcpIPAddress"
|
||
|
#define REGISTRY_AUTOCONFIGSUBNETMASK "IPAutoconfigurationMask"
|
||
|
#define REGISTRY_AUTOCONFIGIPADDRESS "IPAutoconfigurationAddress"
|
||
|
#define REG_KEY_TCPIP_INTERFACES \
|
||
|
"System\\CurrentControlSet\\Services\\TCPIP\\Parameters\\Interfaces"
|
||
|
|
||
|
#define net_long(x) (((((ulong)(x))&0xffL)<<24) | \
|
||
|
((((ulong)(x))&0xff00L)<<8) | \
|
||
|
((((ulong)(x))&0xff0000L)>>8) | \
|
||
|
((((ulong)(x))&0xff000000L)>>24))
|
||
|
|
||
|
#define SIZEOF_ROUTEINFO(X) ((X) * sizeof (MIB_IPFORWARDROW))
|
||
|
#define MAX_ROUTES_IN_BUFFER(X) ((X) / sizeof (MIB_IPFORWARDROW))
|
||
|
|
||
|
#define PRINT_IPADDR(x) \
|
||
|
((x)&0x000000ff),(((x)&0x0000ff00)>>8),(((x)&0x00ff0000)>>16),(((x)&0xff000000)>>24)
|
||
|
|
||
|
//
|
||
|
// VOID
|
||
|
// PrintRoute(IPMultihopRouteEntry pRoute)
|
||
|
//
|
||
|
|
||
|
#define PrintRoute(ID,p) \
|
||
|
{ \
|
||
|
ULONG _i; \
|
||
|
Trace4(ID,"%d.%d.%d.%d/%d.%d.%d.%d Proto: %d Metric %d", \
|
||
|
PRINT_IPADDR((p)->imre_routeinfo.ire_dest), \
|
||
|
PRINT_IPADDR((p)->imre_routeinfo.ire_mask), \
|
||
|
(p)->imre_routeinfo.ire_proto, (p)->imre_routeinfo.ire_metric1); \
|
||
|
Trace4(ID,"Via %d.%d.%d.%d/0x%x Type %d Context 0x%x", \
|
||
|
PRINT_IPADDR((p)->imre_routeinfo.ire_nexthop), \
|
||
|
(p)->imre_routeinfo.ire_index, \
|
||
|
(p)->imre_routeinfo.ire_type, \
|
||
|
(p)->imre_routeinfo.ire_context); \
|
||
|
for(_i = 1; _i < (p)->imre_numnexthops; i++) { \
|
||
|
Trace4(ID,"Via %d.%d.%d.%d/0x%x Type %d Context 0x%x\n", \
|
||
|
PRINT_IPADDR((p)->imre_morenexthops[_i].ine_nexthop), \
|
||
|
(p)->imre_morenexthops[_i].ine_ifindex, \
|
||
|
(p)->imre_morenexthops[_i].ine_iretype, \
|
||
|
(p)->imre_morenexthops[_i].ine_context);} \
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// System Unit is in 100s of NanoSecs = 1 * 10^7
|
||
|
//
|
||
|
|
||
|
#define SYS_UNITS_IN_1_SEC 10000000
|
||
|
|
||
|
#define SecsToSysUnits(X) RtlEnlargedIntegerMultiply((X),SYS_UNITS_IN_1_SEC)
|
||
|
|
||
|
|
||
|
#endif // __DEFS_H__
|