/*++ Copyright (c) 1997 - 98, Microsoft Corporation Module Name: rtm1to2.h Abstract: Contains definitions/macros that wrap RTMv2 in the RTMv1 API. Author: Chaitanya Kodeboyina (chaitk) 13-Oct-1998 Revision History: --*/ #ifndef __ROUTING_RTM1TO2_H__ #define __ROUTING_RTM1TO2_H__ #include #include #include // Protocol Id for the default wrapper registration #define V1_WRAPPER_REGN_ID 0xA1B2C3D4 // Protocol instance for a v1 entity registration #define V1_PROTOCOL_INSTANCE 0xABCD1234 // // Misc defines for wrapper picked from rtmv2p.h // #define MAXTICKS MAXULONG // Basic route info, present in routes of all types // Disable warnings for unnamed structs #pragma warning(disable : 4201) typedef struct { ROUTE_HEADER; } RTM_XX_ROUTE, *PRTM_XX_ROUTE; #pragma warning(default : 4201) // // Extending certain V1 flags in the wrapper // #define RTM_ONLY_OWND_ROUTES 0x00000010 // // Mapping of v1 address families to standard ids // const USHORT ADDRESS_FAMILY[2] = { AF_IPX, // RTM_PROTOCOL_FAMILY_IPX = 0 AF_INET // RTM_PROTOCOL_FAMILY_IP = 1 }; // // Address sizes of supported address families // #define IPX_ADDR_SIZE 6 #define IP_ADDR_SIZE 4 const USHORT ADDRESS_SIZE[2] = { IPX_ADDR_SIZE, // RTM_PROTOCOL_FAMILY_IPX = 0 IP_ADDR_SIZE // RTM_PROTOCOL_FAMILY_IP = 1 }; // // Forward declarations for structs // typedef struct _V1_REGN_INFO *PV1_REGN_INFO; // // Global info for RTMv1 - v2 wrapper // typedef struct _V1_GLOBAL_INFO { CRITICAL_SECTION PfRegnsLock[RTM_NUM_OF_PROTOCOL_FAMILIES]; // Lock guards the registrations list LIST_ENTRY PfRegistrations[RTM_NUM_OF_PROTOCOL_FAMILIES]; // List of regns on Protocol family PV1_REGN_INFO PfRegInfo[RTM_NUM_OF_PROTOCOL_FAMILIES]; // Default regn for this Protocol family PROUTE_VALIDATE_FUNC PfValidateRouteFunc[RTM_NUM_OF_PROTOCOL_FAMILIES]; // Func to validate route, fill priority } V1_GLOBAL_INFO, *PV1_GLOBAL_INFO; // // RTMv2 to v1 Registration Wrapper // typedef struct _V1_REGN_INFO { OBJECT_HEADER ObjectHeader; // Signature, Type and Reference Count LIST_ENTRY RegistrationsLE; // Linkage on list of registrations DWORD ProtocolFamily; // This maps to RTMv2's address family DWORD RoutingProtocol; // Routing protocol (RIP, OSPF...) DWORD Flags; // RTMv1 Registration flags RTM_ENTITY_HANDLE Rtmv2RegHandle; // Handle to actual RTMv2 registration RTM_REGN_PROFILE Rtmv2Profile; // RTMv2 registration profile UINT Rtmv2NumViews; // Number of views in the V2 instance CRITICAL_SECTION NotificationLock; // RTMv1 Notification Lock PROUTE_CHANGE_CALLBACK NotificationFunc; // RTMv1 Notification Callback HANDLE NotificationEvent;// RTMv1 Notification Event RTM_NOTIFY_HANDLE Rtmv2NotifyHandle;// RTMv2 Notification Handle } V1_REGN_INFO, *PV1_REGN_INFO; // // RTMv1 Route Info structure // typedef union { RTM_IPX_ROUTE IpxRoute; // IPX route info structure RTM_IP_ROUTE IpRoute; // IP route info structure RTM_XX_ROUTE XxRoute; // The Common route header UCHAR Route[1]; // Generic route info structure } V1_ROUTE_INFO, *PV1_ROUTE_INFO; // // RTMv2 to v1 Enumeration Wrapper // typedef struct _V1_ENUM_INFO { OBJECT_HEADER ObjectHeader; // Signature, Type and Reference Count DWORD ProtocolFamily; // This maps to RTMv2's address family DWORD EnumFlags; // RTMv1 Enumeration flags V1_ROUTE_INFO CriteriaRoute; // V1 Criteria route for this enum CRITICAL_SECTION EnumLock; // To serialize enumeration calls RTM_ENUM_HANDLE Rtmv2RouteEnum; // Handle to the RTMv2 route enum } V1_ENUM_INFO, *PV1_ENUM_INFO; // // Miscellaneos Func Pointer Defs // typedef BOOL (*PFUNC) (PVOID p, PVOID q, PVOID r); // // Macros to validate RTMv1 to v2 wrapper handles // #define V1_REGN_FROM_HANDLE(V1RegnHandle) \ (PV1_REGN_INFO) GetObjectFromHandle(V1RegnHandle, V1_REGN_TYPE) #define VALIDATE_V1_REGN_HANDLE(V1RegnHandle, pV1Regn) \ *pV1Regn = V1_REGN_FROM_HANDLE(V1RegnHandle); \ if ((!*pV1Regn)) \ { \ return ERROR_INVALID_HANDLE; \ } \ #define V1_ENUM_FROM_HANDLE(V1EnumHandle) \ (PV1_ENUM_INFO) GetObjectFromHandle(V1EnumHandle, V1_ENUM_TYPE) #define VALIDATE_V1_ENUM_HANDLE(V1EnumHandle, pV1Enum) \ *pV1Enum = V1_ENUM_FROM_HANDLE(V1EnumHandle); \ if ((!*pV1Enum)) \ { \ return ERROR_INVALID_HANDLE; \ } \ // // Macros to acquire locks in the structures above // #define ACQUIRE_V1_REGNS_LOCK(ProtocolFamily) \ ACQUIRE_LOCK(&V1Globals.PfRegnsLock[ProtocolFamily]) #define RELEASE_V1_REGNS_LOCK(ProtocolFamily) \ RELEASE_LOCK(&V1Globals.PfRegnsLock[ProtocolFamily]) #define ACQUIRE_V1_ENUM_LOCK(V1Enum) \ ACQUIRE_LOCK(&V1Enum->EnumLock) #define RELEASE_V1_ENUM_LOCK(V1Enum) \ RELEASE_LOCK(&V1Enum->EnumLock) #define ACQUIRE_V1_NOTIFY_LOCK(V1Regn) \ ACQUIRE_LOCK(&V1Regn->NotificationLock) #define RELEASE_V1_NOTIFY_LOCK(V1Regn) \ RELEASE_LOCK(&V1Regn->NotificationLock) // // Macros to convert RTMv1 to RTMv2 structs and vice versa // #define MakeNetAddress(Network, ProtocolFamily, TempUlong, NetAddr) \ MakeNetAddressForIP(Network, TempUlong, NetAddr) #define MakeNetAddressForIP(Network, TempUlong, NetAddr) \ (NetAddr)->AddressFamily = AF_INET; \ (NetAddr)->NumBits = 0; \ \ TempUlong = \ RtlUlongByteSwap(((PIP_NETWORK)(Network))->N_NetMask); \ \ while (TempUlong) \ { \ ASSERT(TempUlong & 0x80000000); \ TempUlong <<= 1; \ (NetAddr)->NumBits++; \ } \ \ (* (ULONG *) ((NetAddr)->AddrBits)) = \ ((PIP_NETWORK) (Network))->N_NetNumber; \ #define MakeHostAddress(HostAddr, ProtocolFamily, NetAddr) \ MakeHostAddressForIP(HostAddr, NetAddr) #define MakeHostAddressForIP(HostAddr, NetAddr) \ (NetAddr)->AddressFamily = AF_INET; \ (NetAddr)->NumBits = IP_ADDR_SIZE * BITS_IN_BYTE; \ (* (ULONG *) ((NetAddr)->AddrBits)) = (* (ULONG *) HostAddr); \ // // Misc V1 Macros // // Macro that gets the network address in the route #define V1GetRouteNetwork(Route, ProtocolFamily, Network) \ if (ProtocolFamily == RTM_PROTOCOL_FAMILY_IP) \ { \ (*Network) = (PVOID) &((PRTM_IP_ROUTE) Route)->RR_Network; \ } \ else \ { \ (*Network) = (PVOID) &((PRTM_IPX_ROUTE) Route)->RR_Network; \ } \ // Macro that gets the addr of flags in the route #define V1GetRouteFlags(Route, ProtocolFamily, Flags) \ if (ProtocolFamily == RTM_PROTOCOL_FAMILY_IP) \ { \ Flags = \ &((PRTM_IP_ROUTE)Route)->RR_FamilySpecificData.FSD_Flags; \ } \ else \ { \ Flags = \ &((PRTM_IPX_ROUTE)Route)->RR_FamilySpecificData.FSD_Flags; \ } \ // Macro that copies one v1 route to another #define V1CopyRoute(RouteDst, RouteSrc, ProtocolFamily) \ if (ProtocolFamily == RTM_PROTOCOL_FAMILY_IP) \ { \ CopyMemory(RouteDst, RouteSrc, sizeof(RTM_IP_ROUTE)); \ } \ else \ { \ CopyMemory(RouteDst, RouteSrc, sizeof(RTM_IPX_ROUTE)); \ } \ // // Misc V2 Macros // // Macro to allocate a set of handles on the stack #define ALLOC_HANDLES(NumHandles) \ (HANDLE *) _alloca(sizeof(HANDLE) * NumHandles) \ // Macro to allocate a RTM_DEST_INFO on the stack #define ALLOC_DEST_INFO(NumViews, NumInfos) \ (PRTM_DEST_INFO) _alloca(RTM_SIZE_OF_DEST_INFO(NumViews) * NumInfos) // Macro to allocate a RTM_ROUTE_INFO on the stack #define ALLOC_ROUTE_INFO(NumNextHops, NumInfos) \ (PRTM_ROUTE_INFO) _alloca((sizeof(RTM_ROUTE_INFO) + \ (NumNextHops - 1) * \ sizeof(RTM_NEXTHOP_HANDLE)) * NumInfos) \ // Misc Macros #define SWAP_POINTERS(p1, p2) { PVOID p = p1; p1 = p2; p2 = p; } // // Callback that converts RTMv2 events to RTMv1 // DWORD WINAPI V2EventCallback ( IN RTM_ENTITY_HANDLE Rtmv2RegHandle, IN RTM_EVENT_TYPE EventType, IN PVOID Context1, IN PVOID Context2 ); // // Other helper functions // HANDLE RtmpRegisterClient ( IN DWORD ProtocolFamily, IN DWORD RoutingProtocol, IN PROUTE_CHANGE_CALLBACK ChangeFunc OPTIONAL, IN HANDLE ChangeEvent OPTIONAL, IN DWORD Flags ); DWORD BlockOperationOnRoutes ( IN PV1_REGN_INFO V1Regn, IN DWORD EnumerationFlags, IN PVOID CriteriaRoute, IN PFUNC RouteOperation ); BOOL MatchCriteriaAndCopyRoute ( IN PV1_REGN_INFO V1Regn, IN PRTM_ROUTE_HANDLE V2RouteHandle, IN PV1_ENUM_INFO V1Enum OPTIONAL, OUT PVOID V1Route OPTIONAL ); #define MatchCriteria(R, H, E) MatchCriteriaAndCopyRoute(R, H, E, NULL) BOOL MatchCriteriaAndDeleteRoute ( IN PV1_REGN_INFO V1Regn, IN PRTM_ROUTE_HANDLE V2RouteHandle, IN PV1_ENUM_INFO V1Enum ); BOOL MatchCriteriaAndChangeOwner ( IN PV1_REGN_INFO V1Regn, IN PRTM_ROUTE_HANDLE V2RouteHandle, IN PV1_ENUM_INFO V1Enum ); BOOL MatchCriteriaAndEnableRoute ( IN PV1_REGN_INFO V1Regn, IN PRTM_ROUTE_HANDLE V2RouteHandle, IN PV1_ENUM_INFO V1Enum ); BOOL CopyNonLoopbackIPRoute ( IN PV1_REGN_INFO V1Regn, IN PRTM_DEST_INFO V2DestInfo, OUT PVOID V1Route ); VOID MakeV2RouteFromV1Route ( IN PV1_REGN_INFO V1Regn, IN PVOID V1Route, IN PRTM_NEXTHOP_HANDLE V2NextHop, OUT PRTM_NET_ADDRESS V2DestAddr OPTIONAL, OUT PRTM_ROUTE_INFO V2RouteInfo OPTIONAL ); VOID MakeV2NextHopFromV1Route ( IN PV1_REGN_INFO V1Regn, IN PVOID V1Route, OUT PRTM_NEXTHOP_INFO V2NextHop ); VOID MakeV1RouteFromV2Dest ( IN PV1_REGN_INFO V1Regn, IN PRTM_DEST_INFO DestInfo, OUT PVOID V1Route ); DWORD MakeV1RouteFromV2Route ( IN PV1_REGN_INFO V1Regn, IN PRTM_ROUTE_INFO V2Route, OUT PVOID V1Route ); #endif // __ROUTING_RTM1TO2_H__