windows-nt/Source/XPSP1/NT/net/rras/ip/rip/riptest.h

334 lines
6.6 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
//============================================================================
// Copyright (c) 1995, Microsoft Corporation
//
// File: riptest.h
//
// History:
// Abolade Gbadegesin Oct-16-1995 Created
//
// Declarations for the RIP test program.
//============================================================================
//
// These strings are used to access the registry
//
#define STR_SERVICES "System\\CurrentControlSet\\Services\\"
#define STR_RIPTEST "RipTest"
#define STR_PARAMSTCP "\\Parameters\\Tcpip"
#define STR_ENABLEDHCP "EnableDhcp"
#define STR_ADDRESS "IPAddress"
#define STR_NETMASK "SubnetMask"
#define STR_DHCPADDR "DhcpIPAddress"
#define STR_DHCPMASK "DhcpSubnetMask"
#define STR_ROUTECOUNT "RouteCount"
#define STR_ROUTESTART "RouteStart"
#define STR_ROUTEMASK "RouteMask"
#define STR_ROUTENEXTHOP "RouteNexthop"
#define STR_ROUTETAG "RouteTag"
#define STR_ROUTETARGET "RouteTarget"
#define STR_ROUTETIMEOUT "RouteTimeout"
#define STR_PACKETVERSION "PacketVersion"
#define STR_PACKETENTRYCOUNT "PacketEntryCount"
#define STR_PACKETGAP "PacketGap"
#define STR_AUTHKEY "AuthKey"
#define STR_AUTHTYPE "AuthType"
#define STR_SOCKBUFSIZE "SockBufSize"
//
// these definitions are used for socket setup
//
#define RIP_PORT 520
#define RIPTEST_PORT 521
//
// the field ire_metric5 is used as a status field, with these values
//
#define ROUTE_STATUS_OK 0
#define ROUTE_STATUS_METRIC 1
#define ROUTE_STATUS_MISSING 2
//
//
//
typedef MIB_IPFORWARDROW IPForwardEntry;
//
// This type is for a generic registry-access function.
// Such a function reads the given key, and if the option
// specified is found, it reads it. Otherwise, it uses the default
// and writes the default value to the registry.
//
struct _REG_OPTION;
typedef
DWORD
(*REG_GETOPT_FUNCTION)(
HKEY hKey,
struct _REG_OPTION *pOpt
);
//
// This type is for a generic RIPTEST option.
//
// RO_Name used to retrieve the value from its registry key
// RO_Size for strings and binary values; gives maximum size
// RO_OptVal contains the option's value
// RO_DefVal contains the default value for the option
// RO_GetOpt contains the function used to retrieve this value
//
typedef struct _REG_OPTION {
PSTR RO_Name;
DWORD RO_Size;
PVOID RO_OptVal;
PVOID RO_DefVal;
REG_GETOPT_FUNCTION RO_GetOpt;
} REG_OPTION, *PREG_OPTION;
//
// This type is used to hold all RIPTEST's parameters for a given interface
//
typedef struct _RIPTEST_IF_CONFIG {
DWORD RIC_RouteCount;
DWORD RIC_RouteStart;
DWORD RIC_RouteMask;
DWORD RIC_RouteNexthop;
DWORD RIC_RouteTag;
DWORD RIC_RouteTarget;
DWORD RIC_RouteTimeout;
DWORD RIC_PacketVersion;
DWORD RIC_PacketEntryCount;
DWORD RIC_PacketGap;
BYTE RIC_AuthKey[IPRIP_MAX_AUTHKEY_SIZE];
DWORD RIC_AuthType;
DWORD RIC_SockBufSize;
} RIPTEST_IF_CONFIG, *PRIPTEST_IF_CONFIG;
//
// structure used to store binding for an interface
//
typedef struct _RIPTEST_IF_BINDING {
DWORD RIB_Address;
DWORD RIB_Netmask;
WCHAR RIB_Netcard[128];
} RIPTEST_IF_BINDING, *PRIPTEST_IF_BINDING;
//
// struct used to store information for a responding router
//
typedef struct _RIPTEST_ROUTER_INFO {
DWORD RRS_Address;
CHAR RRS_DnsName[64];
LIST_ENTRY RRS_Link;
} RIPTEST_ROUTER_INFO, *PRIPTEST_ROUTER_INFO;
//
// macros used to compute prefix length of a network mask:
// the prefix length is the nubmer of bits set in the mask, assuming
// that the mask is contiguous
//
#define PREFIX_LENGTH(a) PREFIX_LENGTH32(a)
#define PREFIX_LENGTH32(a) \
(((a) & 0x00000100) ? PREFIX_LENGTH16((a) >> 16) + 16 \
: PREFIX_LENGTH16(a))
#define PREFIX_LENGTH16(a) \
(((a) & 0x0001) ? PREFIX_LENGTH8((a) >> 8) + 8 \
: PREFIX_LENGTH8(a))
#define PREFIX_LENGTH8(a) \
(((a) & 0x01) ? 8 : \
(((a) & 0x02) ? 7 : \
(((a) & 0x04) ? 6 : \
(((a) & 0x08) ? 5 : \
(((a) & 0x10) ? 4 : \
(((a) & 0x20) ? 3 : \
(((a) & 0x40) ? 2 : \
(((a) & 0x80) ? 1 : 0))))))))
//
//
//
#define NTH_ADDRESS(addr, preflen, n) \
htonl(((ntohl(addr) >> (32 - (preflen))) + (n)) << (32 - (preflen)))
//
//
//
#if 1
#define RANDOM(seed, min, max) \
((min) + \
(DWORD)((DOUBLE)rand() / ((DOUBLE)RAND_MAX + 1) * \
((max) - (min) + 1)))
#else
#define RANDOM(seed, min, max) \
((min) + \
(DWORD)((DOUBLE)RtlRandom(seed) / ((DOUBLE)MAXLONG + 1) * \
((max) - (min) + 1)))
#endif
//
// IP address conversion macro
//
#define INET_NTOA(addr) inet_ntoa( *(PIN_ADDR)&(addr) )
//
// macros used to generate tracing output
//
#ifdef RTUTILS
#define PRINTREGISTER(a) TraceRegister(a)
#define PRINTDEREGISTER(a) TraceDeregister(a)
#define PRINT0(a) \
TracePrintf(g_TraceID,a)
#define PRINT1(a,b) \
TracePrintf(g_TraceID,a,b)
#define PRINT2(a,b,c) \
TracePrintf(g_TraceID,a,b,c)
#define PRINT3(a,b,c,d) \
TracePrintf(g_TraceID,a,b,c,d)
#define PRINT4(a,b,c,d,e) \
TracePrintf(g_TraceID,a,b,c,d,e)
#define PRINT5(a,b,c,d,e,f) \
TracePrintf(g_TraceID,a,b,c,d,e,f)
#else
#define PRINTREGISTER(a) INVALID_TRACEID
#define PRINTDEREGISTER(a) INVALID_TRACEID
#define PRINT0(a) \
printf("\n"a)
#define PRINT1(a,b) \
printf("\n"a,b)
#define PRINT2(a,b,c) \
printf("\n"a,b,c)
#define PRINT3(a,b,c,d) \
printf("\n"a,b,c,d)
#define PRINT4(a,b,c,d,e) \
printf("\n"a,b,c,d,e)
#define PRINT5(a,b,c,d,e,f) \
printf("\n"a,b,c,d,e,f)
#endif
//
// functions used to access options in the registry
//
DWORD
RegGetConfig(
VOID
);
DWORD
RegGetAddress(
HKEY hKey,
PREG_OPTION pOpt
);
DWORD
RegGetDWORD(
HKEY hKey,
PREG_OPTION pOpt
);
DWORD
RegGetBinary(
HKEY hKey,
PREG_OPTION pOpt
);
DWORD
RegGetIfBinding(
VOID
);
DWORD
InitializeSocket(
SOCKET *psock,
WORD wPort
);
DWORD
GenerateRoutes(
IPForwardEntry **pifelist
);
DWORD
DiscoverRouters(
SOCKET sock,
PLIST_ENTRY rtrlist
);
DWORD
TransmitRoutes(
SOCKET sock,
DWORD dwMetric,
IPForwardEntry *ifelist
);
DWORD
VerifyRouteTables(
DWORD dwMetric,
PLIST_ENTRY rtrlist,
IPForwardEntry *ifelist
);
DWORD
CreateRouterStatsEntry(
PLIST_ENTRY rtrlist,
DWORD dwAddress,
PRIPTEST_ROUTER_INFO *pprrs
);
DWORD
PrintUsage(
VOID
);
DWORD
RipTest(
VOID
);