248 lines
10 KiB
C
248 lines
10 KiB
C
/*++
|
|
|
|
Copyright (c) 1998 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
routing\ip\mcastmib\defs.h
|
|
|
|
Abstract:
|
|
|
|
IP Multicast MIB defines
|
|
|
|
Revision history:
|
|
|
|
Dave Thaler 4/17/98 Created
|
|
|
|
--*/
|
|
|
|
#ifndef __DEFS_H__
|
|
#define __DEFS_H__
|
|
|
|
//
|
|
// Define this when snmpsfx.dll supports 3-phase sets
|
|
//
|
|
#undef THREE_PHASE
|
|
|
|
//
|
|
// Define this if the router keeps track of the number of hops to the
|
|
// closest member (e.g. MOSPF can calculate this) to set a TTL per oif entry.
|
|
//
|
|
#undef CLOSEST_MEMBER_HOPS
|
|
|
|
|
|
#define PRINT_IPADDR(x) \
|
|
((x)&0x000000ff),(((x)&0x0000ff00)>>8),(((x)&0x00ff0000)>>16),(((x)&0xff000)>>24)
|
|
|
|
#define IP_ADDRESS_LEN 4
|
|
|
|
//------------------------------------------------------------------------------
|
|
// Memory allocation/deallocation macros
|
|
//------------------------------------------------------------------------------
|
|
|
|
#define MULTICAST_MIB_ALLOC( x ) HeapAlloc( GetProcessHeap(), 0, (x) )
|
|
#define MULTICAST_MIB_FREE( x ) HeapFree( GetProcessHeap(), 0, (x) )
|
|
|
|
//------------------------------------------------------------------------------
|
|
// Macro to simplify use of DIM MIB functions
|
|
//------------------------------------------------------------------------------
|
|
#define CONNECT_TO_ROUTER(res) \
|
|
(res) = ( g_hMIBServer ) ? NO_ERROR : ConnectToRouter()
|
|
|
|
#define MIB_GET(type, w, x, y, z, res) \
|
|
{ \
|
|
CONNECT_TO_ROUTER(res); \
|
|
\
|
|
if ( (res) == NO_ERROR ) \
|
|
{ \
|
|
(res) = MprAdminMIBEntry ## type( \
|
|
g_hMIBServer, \
|
|
PID_IP, \
|
|
IPRTRMGR_PID, \
|
|
(LPVOID) (w), \
|
|
(x), \
|
|
(LPVOID *) (y), \
|
|
(z) \
|
|
); \
|
|
} \
|
|
}
|
|
|
|
#define MIB_SET(type, x, y, res) \
|
|
{ \
|
|
CONNECT_TO_ROUTER(res); \
|
|
\
|
|
if ( (res) == NO_ERROR ) \
|
|
{ \
|
|
(res) = MprAdminMIBEntry ## type( \
|
|
g_hMIBServer, \
|
|
PID_IP, \
|
|
IPRTRMGR_PID, \
|
|
(LPVOID) (x), \
|
|
(y) \
|
|
); \
|
|
} \
|
|
}
|
|
|
|
#define MULTICAST_MIB_GET(w, x, y, z, res) \
|
|
MIB_GET(Get, w, x, y, z, res)
|
|
|
|
#define MULTICAST_MIB_GETFIRST(w, x, y, z, res) \
|
|
MIB_GET(GetFirst, w, x, y, z, res)
|
|
|
|
#define MULTICAST_MIB_GETNEXT(w, x, y, z, res) \
|
|
MIB_GET(GetNext, w, x, y, z, res)
|
|
|
|
#define MULTICAST_MIB_VALIDATE(x, y, res) \
|
|
MIB_SET(Validate, x, y, res)
|
|
|
|
#define MULTICAST_MIB_COMMIT(x, y, res) \
|
|
MIB_SET(Set, x, y, res)
|
|
|
|
#define MULTICAST_MIB_CLEANUP(x, y, res) \
|
|
MIB_SET(Cleanup, x, y, res)
|
|
|
|
//------------------------------------------------------------------------------
|
|
// Macros to convert between Asn and Win32 data types
|
|
//------------------------------------------------------------------------------
|
|
|
|
#define SetAsnInteger(dstBuf,val){ \
|
|
if ((dstBuf)->asnType) \
|
|
{ \
|
|
ASSERT((dstBuf)->asnType==ASN_INTEGER); \
|
|
(dstBuf)->asnValue.number = (AsnInteger)(val); \
|
|
} \
|
|
}
|
|
|
|
#define ForceSetAsnInteger(dstBuf,val){ \
|
|
(dstBuf)->asnType = ASN_INTEGER; \
|
|
(dstBuf)->asnValue.number = (AsnInteger)(val); \
|
|
}
|
|
|
|
#define SetAsnCounter(dstBuf,val){ \
|
|
if ((dstBuf)->asnType) \
|
|
{ \
|
|
ASSERT((dstBuf)->asnType==ASN_RFC1155_COUNTER); \
|
|
(dstBuf)->asnValue.counter = (AsnCounter)(val); \
|
|
} \
|
|
}
|
|
|
|
#define SetAsnTimeTicks(dstBuf,val){ \
|
|
if ((dstBuf)->asnType) \
|
|
{ \
|
|
ASSERT((dstBuf)->asnType==ASN_RFC1155_TIMETICKS); \
|
|
(dstBuf)->asnValue.ticks = (AsnTimeticks)(val); \
|
|
} \
|
|
}
|
|
|
|
#define SetAsnOctetString(dstBuf,buffer,src,len){ \
|
|
if ((dstBuf)->asnType) \
|
|
{ \
|
|
ASSERT((dstBuf)->asnType==ASN_OCTETSTRING); \
|
|
(dstBuf)->asnValue.string.length = len; \
|
|
(dstBuf)->asnValue.string.stream = (BYTE*)memcpy(buffer,src,len);\
|
|
(dstBuf)->asnValue.string.dynamic = FALSE; \
|
|
} \
|
|
}
|
|
|
|
#define SetAsnIPAddress(dstBuf,buffer,val){ \
|
|
if ((dstBuf)->asnType) \
|
|
{ \
|
|
ASSERT((dstBuf)->asnType==ASN_RFC1155_IPADDRESS); \
|
|
(dstBuf)->asnValue.address.length = IP_ADDRESS_LEN; \
|
|
if(!(dstBuf)->asnValue.address.stream) \
|
|
{ \
|
|
(dstBuf)->asnValue.address.stream = (PBYTE)buffer; \
|
|
(dstBuf)->asnValue.address.dynamic = FALSE; \
|
|
} \
|
|
(*(DWORD*)((dstBuf)->asnValue.address.stream)) = val; \
|
|
} \
|
|
}
|
|
|
|
#define ForceSetAsnIPAddress(dstBuf,buffer,val){ \
|
|
(dstBuf)->asnType = ASN_RFC1155_IPADDRESS; \
|
|
(dstBuf)->asnValue.address.length = IP_ADDRESS_LEN; \
|
|
if(!((dstBuf)->asnValue.address.stream)) \
|
|
{ \
|
|
(dstBuf)->asnValue.address.stream = (PBYTE)buffer; \
|
|
(dstBuf)->asnValue.address.dynamic = FALSE; \
|
|
} \
|
|
(*(DWORD*)((dstBuf)->asnValue.address.stream)) = val; \
|
|
}
|
|
|
|
#define GetAsnInteger(srcBuf,defVal) \
|
|
(((srcBuf)->asnType)? ((srcBuf)->asnValue.number):(defVal))
|
|
|
|
#define GetAsnCounter(srcBuf,defVal) \
|
|
(((srcBuf)->asnType)? ((srcBuf)->asnValue.counter):(defVal))
|
|
|
|
#define GetAsnTimeTicks(srcBuf, defval) \
|
|
( ( (srcBuf)-> asnType ) ? (srcBuf)-> asnValue.ticks : (defval) )
|
|
|
|
#define GetAsnIPAddress(srcBuf,defVal) \
|
|
(DWORD)(((srcBuf)->asnType && (srcBuf)->asnValue.string.length)? \
|
|
(*(DWORD*)((srcBuf)->asnValue.address.stream)) : (defVal))
|
|
|
|
#define GetAsnOctetString(dst,srcBuf) \
|
|
(((srcBuf)->asnType) \
|
|
? (memcpy(dst,(srcBuf)->asnValue.string.stream,\
|
|
(srcBuf)->asnValue.string.length)) \
|
|
: NULL)
|
|
|
|
|
|
#define IsAsnTypeNull(asnObj) (!((asnObj)->asnType))
|
|
#define IsAsnIPAddressTypeNull(asnObj) (!((asnObj)->asnType && (asnObj)->asnValue.address.length))
|
|
|
|
//
|
|
// Timeouts for the caches in millisecs
|
|
//
|
|
#define IPMULTI_IF_CACHE_TIMEOUT (1 * 1000)
|
|
|
|
//------------------------------------------------------------------------------
|
|
// Debug tracing macros
|
|
//------------------------------------------------------------------------------
|
|
|
|
#ifdef MIB_DEBUG
|
|
#define TRACE0(Z) TracePrintf(g_dwTraceId,Z)
|
|
#define TRACE1(Y,Z) TracePrintf(g_dwTraceId,Y,Z)
|
|
#define TRACE2(X,Y,Z) TracePrintf(g_dwTraceId,X,Y,Z)
|
|
#define TRACE3(W,X,Y,Z) TracePrintf(g_dwTraceId,W,X,Y,Z)
|
|
#define TRACE4(V,W,X,Y,Z) TracePrintf(g_dwTraceId,V,W,X,Y,Z)
|
|
#define TRACE5(U,V,W,X,Y,Z) TracePrintf(g_dwTraceId,U,W,X,Y,Z)
|
|
|
|
#define TRACEW0(Z) TracePrintfW(g_dwTraceId,Z)
|
|
|
|
#define TraceEnter(X) TracePrintf(g_dwTraceId,"Entering " X)
|
|
#define TraceLeave(X) TracePrintf(g_dwTraceId,"Leaving " X "\n")
|
|
|
|
#define TraceError(X) \
|
|
TracePrintf( g_dwTraceId, "MprAdminMIB API returned : %d", (X) );
|
|
|
|
#define TraceError1(x) \
|
|
{ \
|
|
LPWSTR __lpwszErr = NULL; \
|
|
\
|
|
TRACE1( "MprAdminMIB API returned : %d", (x) ); \
|
|
MprAdminGetErrorString( (x), &__lpwszErr ); \
|
|
\
|
|
if ( __lpwszErr ) \
|
|
{ \
|
|
TRACEW0( __lpwszErr ); \
|
|
LocalFree( __lpwszErr ); \
|
|
} \
|
|
}
|
|
|
|
#else
|
|
#define TRACE0(Z)
|
|
#define TRACE1(Y,Z)
|
|
#define TRACE2(X,Y,Z)
|
|
#define TRACE3(W,X,Y,Z)
|
|
#define TRACE4(V,W,X,Y,Z)
|
|
#define TRACE5(U,V,W,X,Y,Z)
|
|
#define TRACEW0(Z)
|
|
#define TraceEnter(X)
|
|
#define TraceLeave(X)
|
|
#define TraceError(x)
|
|
#endif
|
|
|
|
#endif
|