334 lines
6.6 KiB
C
334 lines
6.6 KiB
C
//============================================================================
|
|
// 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
|
|
);
|
|
|
|
|