#ifndef __DEFS_H__ #define __DEFS_H__ #define IP_ADDRESS_LEN 4 // // Since the query types map to MIB_ACTION_XXX we can just pass the action Id onto // the Locator functions // #define GET_FIRST MIB_ACTION_GETFIRST #define GET_EXACT MIB_ACTION_GET #define GET_NEXT MIB_ACTION_GETNEXT #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 SetAsnUnsigned32(dstBuf,val){ \ if ((dstBuf)->asnType) \ { \ ASSERT((dstBuf)->asnType==ASN_RFC2578_UNSIGNED32); \ (dstBuf)->asnValue.number = (AsnInteger)(val); \ } \ } #define ForceSetAsnUnsigned32(dstBuf,val){ \ (dstBuf)->asnType = ASN_RFC2578_UNSIGNED32; \ (dstBuf)->asnValue.number = (AsnInteger)(val); \ } #define SetAsnCounter(dstBuf,val){ \ if ((dstBuf)->asnType) \ { \ ASSERT((dstBuf)->asnType==ASN_RFC1155_COUNTER); \ (dstBuf)->asnValue.counter = (AsnCounter)(val); \ } \ } #define SetAsnGauge(dstBuf,val){ \ if ((dstBuf)->asnType) \ { \ ASSERT((dstBuf)->asnType==ASN_RFC1155_GAUGE); \ (dstBuf)->asnValue.gauge = (AsnGauge)(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); \ if ((dstBuf)->asnValue.string.dynamic) \ { \ SnmpUtilMemFree((dstBuf)->asnValue.string.stream); \ } \ (dstBuf)->asnValue.string.length = len; \ (dstBuf)->asnValue.string.stream = (BYTE*)memcpy(buffer,src,len);\ (dstBuf)->asnValue.string.dynamic = FALSE; \ } \ } #define ForceSetAsnOctetString(dstBuf,buffer,src,len){ \ (dstBuf)->asnType = ASN_OCTETSTRING; \ if ((dstBuf)->asnValue.string.dynamic) \ { \ SnmpUtilMemFree((dstBuf)->asnValue.string.stream); \ } \ (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 SetAsnUshort(dstBuf,buffer,val){ \ if ((dstBuf)->asnType) \ { \ ASSERT((dstBuf)->asnType==ASN_OCTETSTRING); \ (dstBuf)->asnValue.string.length = 2; \ (buffer)[0] = (BYTE)(val&0xFF); \ (buffer)[1] = (BYTE)((val>>8)&0xFF); \ (dstBuf)->asnValue.string.stream = (BYTE *)buffer; \ (dstBuf)->asnValue.string.dynamic = FALSE; \ } \ } #define SetAsnDispString(dstBuf,buffer,src,len){ \ if ((dstBuf)->asnType) \ { \ ASSERT((dstBuf)->asnType==ASN_RFC1213_DISPSTRING); \ (dstBuf)->asnValue.string.length = strlen(src); \ if ((dstBuf)->asnValue.string.length>len) \ { \ (dstBuf)->asnValue.string.length = len; \ (dstBuf)->asnValue.string.stream = (BYTE *)strncpy (buffer,src,\ (dstBuf)->asnValue.string.length);\ (dstBuf)->asnValue.string.dynamic = FALSE; \ } \ } \ } #define SetToZeroOid(dstBuf){ \ if ((dstBuf)->asnType) \ { \ ASSERT((dstBuf)->asnType==ASN_OBJECTIDENTIFIER); \ (dstBuf)->asnValue.object.idLength = NULL_OID_LEN; \ (dstBuf)->asnValue.object.ids = \ SnmpUtilMemAlloc(NULL_OID_LEN * sizeof(UINT)); \ } \ } #define GetAsnInteger(srcBuf,defVal) \ (((srcBuf)->asnType)? ((srcBuf)->asnValue.number):(defVal)) #define GetAsnCounter(srcBuf,defVal) \ (((srcBuf)->asnType)? ((srcBuf)->asnValue.counter):(defVal)) #define GetAsnOctetString(dst,srcBuf) \ (((srcBuf)->asnType)? \ (memcpy(dst,(srcBuf)->asnValue.string.stream,(srcBuf)->asnValue.string.length)) \ :NULL) #define GetAsnIPAddress(srcBuf,defVal) \ (DWORD)(((srcBuf)->asnType && (srcBuf)->asnValue.string.length)? \ (*(DWORD*)((srcBuf)->asnValue.address.stream)) : (defVal)) #define IsAsnTypeNull(asnObj) (!((asnObj)->asnType)) #define IsAsnIPAddressTypeNull(asnObj) (!((asnObj)->asnType && (asnObj)->asnValue.address.length)) #define IsAsnOctetStringTypeNull(asnObj) (!((asnObj)->asnType && (asnObj)->asnValue.string.length)) // // When adding to this list, update the arrays in init.c. // typedef enum { MIB_II_SYS = 0, MIB_II_IF, MIB_II_IPADDR, FORWARD_MIB, MIB_II_IPNET, MIB_II_TCP, MIB_II_UDP, MIB_II_TCP6, MIB_II_UDP6_LISTENER, MIB_II_IPV6_IF, MIB_II_IPV6_NET_TO_MEDIA, MIB_II_IPV6_ROUTE, MIB_II_ICMP, NUM_CACHE } MIB_II_IDS; #define MIB_II_TRAP NUM_CACHE #define NUM_LOCKS MIB_II_TRAP + 1 // // Timeouts for the caches in millisecs // #define SYSTEM_CACHE_TIMEOUT (60 * 1000) #define IF_CACHE_TIMEOUT (10 * 1000) #define IP_ADDR_CACHE_TIMEOUT (20 * 1000) #define IP_FORWARD_CACHE_TIMEOUT (20 * 1000) #define IP_NET_CACHE_TIMEOUT (30 * 1000) #define TCP_CACHE_TIMEOUT (30 * 1000) #define UDP_CACHE_TIMEOUT (30 * 1000) #define IPV6_IF_CACHE_TIMEOUT (10 * 1000) #define IPV6_NEIGHBOR_CACHE_TIMEOUT (30 * 1000) #define IPV6_ROUTE_TABLE_TIMEOUT (20 * 1000) #define ICMP_CACHE_TIMEOUT (10 * 1000) // // Cant poll faster than twice IF cache timeout // #define MIN_POLL_TIME (IF_CACHE_TIMEOUT * 2) // // Default poll interval is 15 seconds // #define DEFAULT_POLL_TIME 15000 #define MAX_DIFF 20 #define SPILLOVER 10 #define is == #define isnot != #define and && #define or || #define INVALID_IFINDEX 0xffffffff #ifdef MIB_DEBUG #define TRACE0(Z) TracePrintf(g_hTrace,Z) #define TRACE1(Y,Z) TracePrintf(g_hTrace,Y,Z) #define TRACE2(X,Y,Z) TracePrintf(g_hTrace,X,Y,Z) #define TRACE3(W,X,Y,Z) TracePrintf(g_hTrace,W,X,Y,Z) #define TRACE4(V,W,X,Y,Z) TracePrintf(g_hTrace,V,W,X,Y,Z) #define TRACE5(U,V,W,X,Y,Z) TracePrintf(g_hTrace,U,W,X,Y,Z) #define TraceEnter(X) TracePrintf(g_hTrace,"Entering " X) #define TraceLeave(X) TracePrintf(g_hTrace,"Leaving " X "\n") #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 TraceEnter(X) #define TraceLeave(X) #endif extern RTL_RESOURCE g_LockTable[NUM_LOCKS]; #ifdef DEADLOCK_DEBUG extern PBYTE g_pszLockNames[]; #define ReleaseLock(id) { \ TRACE1("Exit lock %s",g_pszLockNames[id]); \ RtlReleaseResource(&(g_LockTable[(id)])); \ TRACE1("Exited lock %s",g_pszLockNames[id]); \ } #define EnterReader(id) { \ TRACE1("Entering Reader %s",g_pszLockNames[id]); \ RtlAcquireResourceShared(&(g_LockTable[(id)]),TRUE); \ TRACE1("Entered %s",g_pszLockNames[id]); \ } #define EnterWriter(id) { \ TRACE1("Entering Writer %s",g_pszLockNames[id]); \ RtlAcquireResourceExclusive(&(g_LockTable[(id)]),TRUE); \ TRACE1("Entered %s",g_pszLockNames[id]); \ } #else // DEADLOCK_DEBUG #define ReleaseLock(id) RtlReleaseResource(&(g_LockTable[(id)])) #define EnterReader(id) RtlAcquireResourceShared(&(g_LockTable[(id)]),TRUE) #define EnterWriter(id) RtlAcquireResourceExclusive(&(g_LockTable[(id)]),TRUE) #endif // DEADLOCK_DEBUG #define InvalidateCache(X) g_dwLastUpdateTable[(X)] = 0 // // SYS UNITS is 100s of NS. 1 millisec would be 1 * 10^4 sys units // #define SYS_UNITS_IN_1_MILLISEC 10000 #define MilliSecsToSysUnits(X) \ RtlEnlargedIntegerMultiply((X),SYS_UNITS_IN_1_MILLISEC) #define REG_KEY_CPU \ TEXT("HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0") #define REG_KEY_SYSTEM \ TEXT("HARDWARE\\DESCRIPTION\\System") #define REG_KEY_VERSION \ TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion") #define REG_KEY_MIB2 \ TEXT("System\\CurrentControlSet\\Services\\SNMP\\Parameters\\RFC1156Agent") #define REG_KEY_MIB2SUBAGENT_PARAMETERS \ TEXT("Software\\Microsoft\\RFC1156Agent\\CurrentVersion\\Parameters") #define REG_VALUE_POLL L"TrapPollTimeMilliSecs" // // some constant strings // #define TEXT_SOFTWARE_WINDOWS_VERSION \ TEXT("- Software: Windows Version ") #endif