/*++ Copyright (c) Microsoft Corporation. All rights reserved. Module Name: rtmv2.h Abstract: Interface for Routing Table Manager v2 DLL Author: Chaitanya Kodeboyina (chaitk) 01-Jun-1998 Revision History: --*/ #ifndef __ROUTING_RTMv2_H__ #define __ROUTING_RTMv2_H__ #ifdef __cplusplus extern "C" { #endif // // General Constants defined by the API // // Max addr size for an address family #define RTM_MAX_ADDRESS_SIZE 16 // // Supported Route Table Views // #define RTM_MAX_VIEWS 32 #define RTM_VIEW_ID_UCAST 0 #define RTM_VIEW_ID_MCAST 1 #define RTM_VIEW_MASK_SIZE 0x20 #define RTM_VIEW_MASK_NONE 0x00000000 #define RTM_VIEW_MASK_ANY 0x00000000 #define RTM_VIEW_MASK_UCAST 0x00000001 #define RTM_VIEW_MASK_MCAST 0x00000002 #define RTM_VIEW_MASK_ALL 0xFFFFFFFF // Identifies a particular view typedef INT RTM_VIEW_ID, *PRTM_VIEW_ID; // Set of views expressed as a mask typedef DWORD RTM_VIEW_SET, *PRTM_VIEW_SET; // // Profile returned during registration // typedef struct _RTM_REGN_PROFILE { UINT MaxNextHopsInRoute; // Max. number of equal cost nexthops // in a route, & Max. number of local // nexthops in any one remote nexthop UINT MaxHandlesInEnum; // Max. handles returned in one call to // RtmGetEnumDests, RtmGetChangedDests, // RtmGetEnumRoutes,RtmGetRoutesInElist RTM_VIEW_SET ViewsSupported; // Views supported by this addr family UINT NumberOfViews; // Number of views (# 1s in above mask) } RTM_REGN_PROFILE, *PRTM_REGN_PROFILE; // // Handles pointing to RTMv2 blocks // typedef HANDLE RTM_ENTITY_HANDLE, *PRTM_ENTITY_HANDLE, RTM_DEST_HANDLE, *PRTM_DEST_HANDLE, RTM_ROUTE_HANDLE, *PRTM_ROUTE_HANDLE, RTM_NEXTHOP_HANDLE, *PRTM_NEXTHOP_HANDLE, RTM_ENUM_HANDLE, *PRTM_ENUM_HANDLE, RTM_ROUTE_LIST_HANDLE, *PRTM_ROUTE_LIST_HANDLE, RTM_NOTIFY_HANDLE, *PRTM_NOTIFY_HANDLE; // // Network Address struct for any // address family that works with // only contiguous address masks // typedef struct _RTM_NET_ADDRESS { USHORT AddressFamily; // Type of this net address (IPv4..) USHORT NumBits; // Number of leading bits in prefix UCHAR AddrBits[RTM_MAX_ADDRESS_SIZE]; // Array of bits that form prefix } RTM_NET_ADDRESS, *PRTM_NET_ADDRESS; // // IPv4 macros to work on addresses // #define RTM_IPV4_MAKE_NET_ADDRESS(NetAddress, Addr, Len) \ RTM_IPV4_SET_ADDR_AND_LEN(NetAddress, Addr, Len) #define RTM_CHECK_NTH_BIT(Value, N, Len) \ if ((Value) & (1 << (N))) \ { \ (Len) += (N); (Value) <<= (N); \ } \ #define RTM_IPV4_LEN_FROM_MASK(Len, Mask) \ { \ ULONG _Temp_ = ntohl(Mask); \ \ (Len) = 0; \ \ RTM_CHECK_NTH_BIT(_Temp_, 16, (Len)); \ RTM_CHECK_NTH_BIT(_Temp_, 8, (Len)); \ RTM_CHECK_NTH_BIT(_Temp_, 4, (Len)); \ \ while (_Temp_) \ { \ (Len) += 1; _Temp_ <<= 1; \ } \ } \ #define RTM_IPV4_MASK_FROM_LEN(Len) \ ((Len) ? htonl(~0 << (32 - (Len))): 0); \ #define RTM_IPV4_SET_ADDR_AND_LEN(NetAddress, Addr, Len) \ (NetAddress)->AddressFamily = AF_INET; \ (NetAddress)->NumBits = (USHORT) (Len); \ (* (ULONG *) ((NetAddress)->AddrBits)) = (Addr); \ #define RTM_IPV4_GET_ADDR_AND_LEN(Addr, Len, NetAddress) \ (Len) = (NetAddress)->NumBits; \ (Addr) = (* (ULONG *) ((NetAddress)->AddrBits)); \ #define RTM_IPV4_SET_ADDR_AND_MASK(NetAddress, Addr, Mask) \ (NetAddress)->AddressFamily = AF_INET; \ (* (ULONG *) ((NetAddress)->AddrBits)) = (Addr); \ RTM_IPV4_LEN_FROM_MASK((NetAddress)->NumBits, Mask) #define RTM_IPV4_GET_ADDR_AND_MASK(Addr, Mask, NetAddress) \ (Addr) = (* (ULONG *) ((NetAddress)->AddrBits)); \ (Mask) = RTM_IPV4_MASK_FROM_LEN((NetAddress)->NumBits); \ // // This structure encapsulates info // used in comparing any two routes // [Preference is impt than metric] // typedef struct _RTM_PREF_INFO { ULONG Metric; // Routing protocol specific metric ULONG Preference; // Determined by the router policy } RTM_PREF_INFO, *PRTM_PREF_INFO; // // List of nexthops used for equal // cost path in a route or nexthop // typedef struct _RTM_NEXTHOP_LIST { USHORT NumNextHops; // Num of equal cost next hops in list RTM_NEXTHOP_HANDLE NextHops[1]; // NumNextHops num of next hop handles } RTM_NEXTHOP_LIST, *PRTM_NEXTHOP_LIST; // // Structure used to exchange dest // information with RTM entities // typedef struct _RTM_DEST_INFO { RTM_DEST_HANDLE DestHandle; // Handle to the destination RTM_NET_ADDRESS DestAddress; // Destination network Address FILETIME LastChanged; // Last time dest was modified RTM_VIEW_SET BelongsToViews; // View that dest belongs too UINT NumberOfViews; // Number of view info slots struct { RTM_VIEW_ID ViewId; // View ID for this view info block UINT NumRoutes; // Number of routes, RTM_ROUTE_HANDLE Route; // Best route with matching criteria RTM_ENTITY_HANDLE Owner; // Best Route's Owner, DWORD DestFlags; // Best Route's Flags, and RTM_ROUTE_HANDLE HoldRoute; // Holddown route, } ViewInfo[1]; // in each one of the supported views } RTM_DEST_INFO, *PRTM_DEST_INFO; // // Macros useful in working on dests // #define RTM_BASIC_DEST_INFO_SIZE \ FIELD_OFFSET(RTM_DEST_INFO, ViewInfo) #define RTM_DEST_VIEW_INFO_SIZE \ (sizeof(RTM_DEST_INFO) - RTM_BASIC_DEST_INFO_SIZE) #define RTM_SIZE_OF_DEST_INFO(NumViews) \ (RTM_BASIC_DEST_INFO_SIZE + (NumViews) * RTM_DEST_VIEW_INFO_SIZE) // // Destination Flags // #define RTM_DEST_FLAG_NATURAL_NET 0x01 #define RTM_DEST_FLAG_FWD_ENGIN_ADD 0x02 #define RTM_DEST_FLAG_DONT_FORWARD 0x04 // // Structure used to exchange route // information with RTM entities // typedef struct _RTM_ROUTE_INFO { // // Information that the owner can // directly access for read only // RTM_DEST_HANDLE DestHandle; // Handle to owning destination RTM_ENTITY_HANDLE RouteOwner; // Entity the owns this route RTM_NEXTHOP_HANDLE Neighbour; // Neighbour we learnt route from UCHAR State; // See RTM_ROUTE_STATE_* below // // Information that the owner can // directly access for read/write // UCHAR Flags1; // RTM v1 compatibility flags (temp) USHORT Flags; // See RTM_ROUTE_FLAGS_* below RTM_PREF_INFO PrefInfo; // Preference and metric for route RTM_VIEW_SET BelongsToViews; // Views that route belongs to PVOID EntitySpecificInfo; // Owning Entity's private info RTM_NEXTHOP_LIST NextHopsList; // List of equal cost next-hops } RTM_ROUTE_INFO, *PRTM_ROUTE_INFO; // // Macros useful in working on routes // #define RTM_BASIC_ROUTE_INFO_SIZE \ FIELD_OFFSET(RTM_ROUTE_INFO, NextHopsList.NumNextHops) #define RTM_SIZE_OF_ROUTE_INFO(NumHops) \ (RTM_BASIC_ROUTE_INFO_SIZE + (NumHops) * sizeof(RTM_NEXTHOP_HANDLE)) // // State of the Route // #define RTM_ROUTE_STATE_CREATED 0 #define RTM_ROUTE_STATE_DELETING 1 #define RTM_ROUTE_STATE_DELETED 2 // // Route Information Flags // // Forwarding Flags #define RTM_ROUTE_FLAGS_MARTIAN 0x0001 #define RTM_ROUTE_FLAGS_BLACKHOLE 0x0002 #define RTM_ROUTE_FLAGS_DISCARD 0x0004 #define RTM_ROUTE_FLAGS_INACTIVE 0x0008 // Unicast Flags #define RTM_ROUTE_FLAGS_LOCAL 0x0010 #define RTM_ROUTE_FLAGS_REMOTE 0x0020 #define RTM_ROUTE_FLAGS_MYSELF 0x0040 #define RTM_ROUTE_FLAGS_LOOPBACK 0x0080 // Bcast, Mcast Flags #define RTM_ROUTE_FLAGS_MCAST 0x0100 #define RTM_ROUTE_FLAGS_LOCAL_MCAST 0x0200 #define RTM_ROUTE_FLAGS_LIMITED_BC 0x0400 #define RTM_ROUTE_FLAGS_ZEROS_NETBC 0x1000 #define RTM_ROUTE_FLAGS_ZEROS_SUBNETBC 0x2000 #define RTM_ROUTE_FLAGS_ONES_NETBC 0x4000 #define RTM_ROUTE_FLAGS_ONES_SUBNETBC 0x8000 // Grouping of Flags #define RTM_ROUTE_FLAGS_FORWARDING \ (RTM_ROUTE_FLAGS_MARTIAN | \ RTM_ROUTE_FLAGS_BLACKHOLE | \ RTM_ROUTE_FLAGS_DISCARD | \ RTM_ROUTE_FLAGS_INACTIVE) #define RTM_ROUTE_FLAGS_ANY_UNICAST \ (RTM_ROUTE_FLAGS_LOCAL | \ RTM_ROUTE_FLAGS_REMOTE | \ RTM_ROUTE_FLAGS_MYSELF) #define RTM_ROUTE_FLAGS_ANY_MCAST \ (RTM_ROUTE_FLAGS_MCAST | \ RTM_ROUTE_FLAGS_LOCAL_MCAST) #define RTM_ROUTE_FLAGS_SUBNET_BCAST \ (RTM_ROUTE_FLAGS_ONES_SUBNET_BC | \ RTM_ROUTE_FLAGS_ZEROS_SUBNETBC) #define RTM_ROUTE_FLAGS_NET_BCAST \ (RTM_ROUTE_FLAGS_ONES_NETBC | \ RTM_ROUTE_FLAGS_ZEROS_NETBC) #define RTM_ROUTE_FLAGS_ANY_BCAST \ (RTM_ROUTE_FLAGS_LIMITED_BC | \ RTM_ROUTE_FLAGS_ONES_NETBC | \ RTM_ROUTE_FLAGS_ONES_SUBNET_BC | \ RTM_ROUTE_FLAGS_ZEROS_NETBC | \ RTM_ROUTE_FLAGS_ZEROS_SUBNETBC) // // Structure used to exchange next-hop // information with RTM entities // typedef struct _RTM_NEXTHOP_INFO { // // Information that the owner can // directly access for read only // RTM_NET_ADDRESS NextHopAddress; // Net Address for this next hop RTM_ENTITY_HANDLE NextHopOwner; // Entity that owns this next hop ULONG InterfaceIndex; // Outgoing interface index // '0' for a remote nexthop USHORT State; // See RTM_NEXTHOP_STATE_* below // // Information that the owner can // directly access for read/write // USHORT Flags; // See RTM_NEXTHOP_FLAGS_* below PVOID EntitySpecificInfo; // Owning Entity's private info RTM_DEST_HANDLE RemoteNextHop; // Handle to dest with nexthop addr // [ Not used for a local nexthop ] } RTM_NEXTHOP_INFO, *PRTM_NEXTHOP_INFO; // // Next Hop State // #define RTM_NEXTHOP_STATE_CREATED 0 #define RTM_NEXTHOP_STATE_DELETED 1 // // Next Hop Flags // #define RTM_NEXTHOP_FLAGS_REMOTE 0x0001 #define RTM_NEXTHOP_FLAGS_DOWN 0x0002 // // Entity Registration Related Defns // // // Info that uniquely identifies an entity // // Disable warnings for unnamed structs #if _MSC_VER >= 1200 #pragma warning(push) #endif #pragma warning(disable : 4201) typedef struct _RTM_ENTITY_ID { union { struct { ULONG EntityProtocolId; // Entity's Protocol ID (RIP,OSPF...) ULONG EntityInstanceId; // Entity's Protocol Instance }; ULONGLONG EntityId; // Protocol ID and Instance }; } RTM_ENTITY_ID, *PRTM_ENTITY_ID; #if _MSC_VER >= 1200 #pragma warning(pop) #else #pragma warning(default : 4201) #endif // // Structure used to exchange entity // information with RTM entities // typedef struct _RTM_ENTITY_INFO { USHORT RtmInstanceId; // RTM Instance that it registered with USHORT AddressFamily; // Entity's Address Family RTM_ENTITY_ID EntityId; // Uniquely identifies an entity } RTM_ENTITY_INFO, *PRTM_ENTITY_INFO; // // Event in the RTM involving an entity // typedef enum _RTM_EVENT_TYPE { RTM_ENTITY_REGISTERED, RTM_ENTITY_DEREGISTERED, RTM_ROUTE_EXPIRED, RTM_CHANGE_NOTIFICATION } RTM_EVENT_TYPE, *PRTM_EVENT_TYPE; // // Entity event inform callback // // Used to inform entities of // new entities registering, // or entities deregistering // typedef DWORD (WINAPI * _EVENT_CALLBACK) ( IN RTM_ENTITY_HANDLE RtmRegHandle, // Callee's Registration Handle IN RTM_EVENT_TYPE EventType, IN PVOID Context1, IN PVOID Context2 ); typedef _EVENT_CALLBACK RTM_EVENT_CALLBACK, *PRTM_EVENT_CALLBACK; // // Methods exported by a registered entity // #define METHOD_TYPE_ALL_METHODS 0xFFFFFFFF #define METHOD_RIP2_NEIGHBOUR_ADDR 0x00000001 #define METHOD_RIP2_OUTBOUND_INTF 0x00000002 #define METHOD_RIP2_ROUTE_TAG 0x00000004 #define METHOD_RIP2_ROUTE_TIMESTAMP 0x00000008 #define METHOD_OSPF_ROUTE_TYPE 0x00000001 #define METHOD_OSPF_ROUTE_METRIC 0x00000002 #define METHOD_OSPF_LSDB_TYPE 0x00000004 #define METHOD_OSPF_ROUTE_TAG 0x00000008 #define METHOD_OSPF_ROUTE_AREA 0x00000010 #define METHOD_OSPF_FWD_ADDRESS 0x00000020 #define METHOD_BGP4_AS_PATH 0x00000001 #define METHOD_BGP4_PEER_ID 0x00000002 #define METHOD_BGP4_PA_ORIGIN 0x00000004 #define METHOD_BGP4_NEXTHOP_ATTR 0x00000008 typedef DWORD RTM_ENTITY_METHOD_TYPE, *PRTM_ENTITY_METHOD_TYPE; // // Generic Input Structure for entity methods // typedef struct _RTM_ENTITY_METHOD_INPUT { RTM_ENTITY_METHOD_TYPE MethodType; // Type identifying the method UINT InputSize; // Input Data Size UCHAR InputData[1]; // Input Data Buffer } RTM_ENTITY_METHOD_INPUT, *PRTM_ENTITY_METHOD_INPUT; // // Generic Output Structure for entity methods // typedef struct _RTM_ENTITY_METHOD_OUTPUT { RTM_ENTITY_METHOD_TYPE MethodType; // Type identifying the method DWORD MethodStatus; // Return Status of method UINT OutputSize; // Output Data Size UCHAR OutputData[1]; // Output Data Buffer } RTM_ENTITY_METHOD_OUTPUT, *PRTM_ENTITY_METHOD_OUTPUT; // // Common prototype for entity methods // typedef VOID (WINAPI * _ENTITY_METHOD) ( IN RTM_ENTITY_HANDLE CallerHandle, IN RTM_ENTITY_HANDLE CalleeHandle, IN RTM_ENTITY_METHOD_INPUT *Input, OUT RTM_ENTITY_METHOD_OUTPUT *Output ); typedef _ENTITY_METHOD RTM_ENTITY_EXPORT_METHOD, *PRTM_ENTITY_EXPORT_METHOD; // // Set of exported entity methods // typedef struct _RTM_ENTITY_EXPORT_METHODS { UINT NumMethods; RTM_ENTITY_EXPORT_METHOD Methods[1]; } RTM_ENTITY_EXPORT_METHODS, *PRTM_ENTITY_EXPORT_METHODS; // // To toggle method blocking on dests, routes and nexthops // #define RTM_RESUME_METHODS 0 #define RTM_BLOCK_METHODS 1 // // I/O Flags when route is added/updated // typedef DWORD RTM_ROUTE_CHANGE_FLAGS, *PRTM_ROUTE_CHANGE_FLAGS; #define RTM_ROUTE_CHANGE_FIRST 0x01 #define RTM_ROUTE_CHANGE_NEW 0x02 #define RTM_ROUTE_CHANGE_BEST 0x00010000 // // Output flags when nexthop is added // typedef DWORD RTM_NEXTHOP_CHANGE_FLAGS, *PRTM_NEXTHOP_CHANGE_FLAGS; #define RTM_NEXTHOP_CHANGE_NEW 0x01 // // Definitions relating to RIB queries // // // Flags used to matching routes in RIB // typedef DWORD RTM_MATCH_FLAGS, *PRTM_MATCH_FLAGS; #define RTM_MATCH_NONE 0x00000000 #define RTM_MATCH_OWNER 0x00000001 #define RTM_MATCH_NEIGHBOUR 0x00000002 #define RTM_MATCH_PREF 0x00000004 #define RTM_MATCH_NEXTHOP 0x00000008 #define RTM_MATCH_INTERFACE 0x00000010 #define RTM_MATCH_FULL 0x0000FFFF // // Flags to specify route being queried // #define RTM_BEST_PROTOCOL (ULONG) 0 #define RTM_THIS_PROTOCOL (ULONG) ~0 // // Definitions relating to enumerations // typedef DWORD RTM_ENUM_FLAGS, *PRTM_ENUM_FLAGS; // Enumeration Flags #define RTM_ENUM_START 0x00000000 #define RTM_ENUM_NEXT 0x00000001 #define RTM_ENUM_RANGE 0x00000002 #define RTM_ENUM_ALL_DESTS 0x00000000 #define RTM_ENUM_OWN_DESTS 0x01000000 #define RTM_ENUM_ALL_ROUTES 0x00000000 #define RTM_ENUM_OWN_ROUTES 0x00010000 // // Definitions relating to notifications // // Notify Flags is composed as follows - // (Change Types | Dests) interested in. typedef DWORD RTM_NOTIFY_FLAGS, *PRTM_NOTIFY_FLAGS; // Change Types to notify about #define RTM_NUM_CHANGE_TYPES 3 #define RTM_CHANGE_TYPE_ALL 0x0001 #define RTM_CHANGE_TYPE_BEST 0x0002 #define RTM_CHANGE_TYPE_FORWARDING 0x0004 // Dests whose changes to notify #define RTM_NOTIFY_ONLY_MARKED_DESTS 0x00010000 // // Registration API Prototypes // DWORD WINAPI RtmRegisterEntity ( IN PRTM_ENTITY_INFO RtmEntityInfo, IN PRTM_ENTITY_EXPORT_METHODS ExportMethods OPTIONAL, IN RTM_EVENT_CALLBACK EventCallback, IN BOOL ReserveOpaquePointer, OUT PRTM_REGN_PROFILE RtmRegProfile, OUT PRTM_ENTITY_HANDLE RtmRegHandle ); DWORD WINAPI RtmDeregisterEntity ( IN RTM_ENTITY_HANDLE RtmRegHandle ); DWORD WINAPI RtmGetRegisteredEntities ( IN RTM_ENTITY_HANDLE RtmRegHandle, IN OUT PUINT NumEntities, OUT PRTM_ENTITY_HANDLE EntityHandles, OUT PRTM_ENTITY_INFO EntityInfos OPTIONAL ); DWORD WINAPI RtmReleaseEntities ( IN RTM_ENTITY_HANDLE RtmRegHandle, IN UINT NumEntities, IN PRTM_ENTITY_HANDLE EntityHandles ); // // Opaque Ptr APIs // DWORD WINAPI RtmLockDestination( IN RTM_ENTITY_HANDLE RtmRegHandle, IN RTM_DEST_HANDLE DestHandle, IN BOOL Exclusive, IN BOOL LockDest ); DWORD WINAPI RtmGetOpaqueInformationPointer ( IN RTM_ENTITY_HANDLE RtmRegHandle, IN RTM_DEST_HANDLE DestHandle, OUT PVOID *OpaqueInfoPointer ); // // Export Method API Prototypes // DWORD WINAPI RtmGetEntityMethods ( IN RTM_ENTITY_HANDLE RtmRegHandle, IN RTM_ENTITY_HANDLE EntityHandle, IN OUT PUINT NumMethods, OUT PRTM_ENTITY_EXPORT_METHOD ExptMethods ); DWORD WINAPI RtmInvokeMethod ( IN RTM_ENTITY_HANDLE RtmRegHandle, IN RTM_ENTITY_HANDLE EntityHandle, IN PRTM_ENTITY_METHOD_INPUT Input, IN OUT PUINT OutputSize, OUT PRTM_ENTITY_METHOD_OUTPUT Output ); DWORD WINAPI RtmBlockMethods ( IN RTM_ENTITY_HANDLE RtmRegHandle, IN HANDLE TargetHandle OPTIONAL, IN UCHAR TargetType OPTIONAL, IN DWORD BlockingFlag ); // // Handle to Info Structures // DWORD WINAPI RtmGetEntityInfo ( IN RTM_ENTITY_HANDLE RtmRegHandle, IN RTM_ENTITY_HANDLE EntityHandle, OUT PRTM_ENTITY_INFO EntityInfo ); DWORD WINAPI RtmGetDestInfo ( IN RTM_ENTITY_HANDLE RtmRegHandle, IN RTM_DEST_HANDLE DestHandle, IN ULONG ProtocolId, IN RTM_VIEW_SET TargetViews, OUT PRTM_DEST_INFO DestInfo ); DWORD WINAPI RtmGetRouteInfo ( IN RTM_ENTITY_HANDLE RtmRegHandle, IN RTM_ROUTE_HANDLE RouteHandle, OUT PRTM_ROUTE_INFO RouteInfo OPTIONAL, OUT PRTM_NET_ADDRESS DestAddress OPTIONAL ); DWORD WINAPI RtmGetNextHopInfo ( IN RTM_ENTITY_HANDLE RtmRegHandle, IN RTM_NEXTHOP_HANDLE NextHopHandle, OUT PRTM_NEXTHOP_INFO NextHopInfo ); DWORD WINAPI RtmReleaseEntityInfo ( IN RTM_ENTITY_HANDLE RtmRegHandle, IN PRTM_ENTITY_INFO EntityInfo ); DWORD WINAPI RtmReleaseDestInfo ( IN RTM_ENTITY_HANDLE RtmRegHandle, IN PRTM_DEST_INFO DestInfo ); DWORD WINAPI RtmReleaseRouteInfo ( IN RTM_ENTITY_HANDLE RtmRegHandle, IN PRTM_ROUTE_INFO RouteInfo ); DWORD WINAPI RtmReleaseNextHopInfo ( IN RTM_ENTITY_HANDLE RtmRegHandle, IN PRTM_NEXTHOP_INFO NextHopInfo ); // // RIB Insert/Delete API Prototypes // DWORD WINAPI RtmAddRouteToDest ( IN RTM_ENTITY_HANDLE RtmRegHandle, IN OUT PRTM_ROUTE_HANDLE RouteHandle OPTIONAL, IN PRTM_NET_ADDRESS DestAddress, IN PRTM_ROUTE_INFO RouteInfo, IN ULONG TimeToLive, IN RTM_ROUTE_LIST_HANDLE RouteListHandle OPTIONAL, IN RTM_NOTIFY_FLAGS NotifyType, IN RTM_NOTIFY_HANDLE NotifyHandle OPTIONAL, IN OUT PRTM_ROUTE_CHANGE_FLAGS ChangeFlags ); DWORD WINAPI RtmDeleteRouteToDest ( IN RTM_ENTITY_HANDLE RtmRegHandle, IN RTM_ROUTE_HANDLE RouteHandle, OUT PRTM_ROUTE_CHANGE_FLAGS ChangeFlags ); DWORD WINAPI RtmHoldDestination ( IN RTM_ENTITY_HANDLE RtmRegHandle, IN RTM_DEST_HANDLE DestHandle, IN RTM_VIEW_SET TargetViews, IN ULONG HoldTime ); DWORD WINAPI RtmGetRoutePointer ( IN RTM_ENTITY_HANDLE RtmRegHandle, IN RTM_ROUTE_HANDLE RouteHandle, OUT PRTM_ROUTE_INFO *RoutePointer ); DWORD WINAPI RtmLockRoute( IN RTM_ENTITY_HANDLE RtmRegHandle, IN RTM_ROUTE_HANDLE RouteHandle, IN BOOL Exclusive, IN BOOL LockRoute, OUT PRTM_ROUTE_INFO *RoutePointer OPTIONAL ); DWORD WINAPI RtmUpdateAndUnlockRoute( IN RTM_ENTITY_HANDLE RtmRegHandle, IN RTM_ROUTE_HANDLE RouteHandle, IN ULONG TimeToLive, IN RTM_ROUTE_LIST_HANDLE RouteListHandle OPTIONAL, IN RTM_NOTIFY_FLAGS NotifyType, IN RTM_NOTIFY_HANDLE NotifyHandle OPTIONAL, OUT PRTM_ROUTE_CHANGE_FLAGS ChangeFlags ); // // RIB Query API Prototypes // DWORD WINAPI RtmGetExactMatchDestination ( IN RTM_ENTITY_HANDLE RtmRegHandle, IN PRTM_NET_ADDRESS DestAddress, IN ULONG ProtocolId, IN RTM_VIEW_SET TargetViews, OUT PRTM_DEST_INFO DestInfo ); DWORD WINAPI RtmGetMostSpecificDestination ( IN RTM_ENTITY_HANDLE RtmRegHandle, IN PRTM_NET_ADDRESS DestAddress, IN ULONG ProtocolId, IN RTM_VIEW_SET TargetViews, OUT PRTM_DEST_INFO DestInfo ); DWORD WINAPI RtmGetLessSpecificDestination ( IN RTM_ENTITY_HANDLE RtmRegHandle, IN RTM_DEST_HANDLE DestHandle, IN ULONG ProtocolId, IN RTM_VIEW_SET TargetViews, OUT PRTM_DEST_INFO DestInfo ); DWORD WINAPI RtmGetExactMatchRoute ( IN RTM_ENTITY_HANDLE RtmRegHandle, IN PRTM_NET_ADDRESS DestAddress, IN RTM_MATCH_FLAGS MatchingFlags, IN OUT PRTM_ROUTE_INFO RouteInfo, IN ULONG InterfaceIndex, IN RTM_VIEW_SET TargetViews, OUT PRTM_ROUTE_HANDLE RouteHandle ); DWORD WINAPI RtmIsBestRoute ( IN RTM_ENTITY_HANDLE RtmRegHandle, IN RTM_ROUTE_HANDLE RouteHandle, OUT PRTM_VIEW_SET BestInViews ); // // NextHop Object API Prototypes // DWORD WINAPI RtmAddNextHop ( IN RTM_ENTITY_HANDLE RtmRegHandle, IN PRTM_NEXTHOP_INFO NextHopInfo, IN OUT PRTM_NEXTHOP_HANDLE NextHopHandle OPTIONAL, OUT PRTM_NEXTHOP_CHANGE_FLAGS ChangeFlags ); DWORD WINAPI RtmFindNextHop ( IN RTM_ENTITY_HANDLE RtmRegHandle, IN PRTM_NEXTHOP_INFO NextHopInfo, OUT PRTM_NEXTHOP_HANDLE NextHopHandle, OUT PRTM_NEXTHOP_INFO *NextHopPointer OPTIONAL ); DWORD WINAPI RtmDeleteNextHop ( IN RTM_ENTITY_HANDLE RtmRegHandle, IN RTM_NEXTHOP_HANDLE NextHopHandle OPTIONAL, IN PRTM_NEXTHOP_INFO NextHopInfo ); DWORD WINAPI RtmGetNextHopPointer ( IN RTM_ENTITY_HANDLE RtmRegHandle, IN RTM_NEXTHOP_HANDLE NextHopHandle, OUT PRTM_NEXTHOP_INFO *NextHopPointer ); DWORD WINAPI RtmLockNextHop( IN RTM_ENTITY_HANDLE RtmRegHandle, IN RTM_NEXTHOP_HANDLE NextHopHandle, IN BOOL Exclusive, IN BOOL LockNextHop, OUT PRTM_NEXTHOP_INFO *NextHopPointer OPTIONAL ); // // Enumeration API Prototypes // DWORD WINAPI RtmCreateDestEnum ( IN RTM_ENTITY_HANDLE RtmRegHandle, IN RTM_VIEW_SET TargetViews, IN RTM_ENUM_FLAGS EnumFlags, IN PRTM_NET_ADDRESS NetAddress, IN ULONG ProtocolId, OUT PRTM_ENUM_HANDLE RtmEnumHandle ); DWORD WINAPI RtmGetEnumDests ( IN RTM_ENTITY_HANDLE RtmRegHandle, IN RTM_ENUM_HANDLE EnumHandle, IN OUT PUINT NumDests, OUT PRTM_DEST_INFO DestInfos ); DWORD WINAPI RtmReleaseDests ( IN RTM_ENTITY_HANDLE RtmRegHandle, IN UINT NumDests, IN PRTM_DEST_INFO DestInfos ); DWORD WINAPI RtmCreateRouteEnum ( IN RTM_ENTITY_HANDLE RtmRegHandle, IN RTM_DEST_HANDLE DestHandle OPTIONAL, IN RTM_VIEW_SET TargetViews, IN RTM_ENUM_FLAGS EnumFlags, IN PRTM_NET_ADDRESS StartDest OPTIONAL, IN RTM_MATCH_FLAGS MatchingFlags, IN PRTM_ROUTE_INFO CriteriaRoute OPTIONAL, IN ULONG CriteriaInterface OPTIONAL, OUT PRTM_ENUM_HANDLE RtmEnumHandle ); DWORD WINAPI RtmGetEnumRoutes ( IN RTM_ENTITY_HANDLE RtmRegHandle, IN RTM_ENUM_HANDLE EnumHandle, IN OUT PUINT NumRoutes, OUT PRTM_ROUTE_HANDLE RouteHandles ); DWORD WINAPI RtmReleaseRoutes ( IN RTM_ENTITY_HANDLE RtmRegHandle, IN UINT NumRoutes, IN PRTM_ROUTE_HANDLE RouteHandles ); DWORD WINAPI RtmCreateNextHopEnum ( IN RTM_ENTITY_HANDLE RtmRegHandle, IN RTM_ENUM_FLAGS EnumFlags, IN PRTM_NET_ADDRESS NetAddress, OUT PRTM_ENUM_HANDLE RtmEnumHandle ); DWORD WINAPI RtmGetEnumNextHops ( IN RTM_ENTITY_HANDLE RtmRegHandle, IN RTM_ENUM_HANDLE EnumHandle, IN OUT PUINT NumNextHops, OUT PRTM_NEXTHOP_HANDLE NextHopHandles ); DWORD WINAPI RtmReleaseNextHops ( IN RTM_ENTITY_HANDLE RtmRegHandle, IN UINT NumNextHops, IN PRTM_NEXTHOP_HANDLE NextHopHandles ); DWORD WINAPI RtmDeleteEnumHandle ( IN RTM_ENTITY_HANDLE RtmRegHandle, IN RTM_ENUM_HANDLE EnumHandle ); // // Change Notification APIs // DWORD WINAPI RtmRegisterForChangeNotification ( IN RTM_ENTITY_HANDLE RtmRegHandle, IN RTM_VIEW_SET TargetViews, IN RTM_NOTIFY_FLAGS NotifyFlags, IN PVOID NotifyContext, OUT PRTM_NOTIFY_HANDLE NotifyHandle ); DWORD WINAPI RtmGetChangedDests ( IN RTM_ENTITY_HANDLE RtmRegHandle, IN RTM_NOTIFY_HANDLE NotifyHandle, IN OUT PUINT NumDests, OUT PRTM_DEST_INFO ChangedDests ); DWORD WINAPI RtmReleaseChangedDests ( IN RTM_ENTITY_HANDLE RtmRegHandle, IN RTM_NOTIFY_HANDLE NotifyHandle, IN UINT NumDests, IN PRTM_DEST_INFO ChangedDests ); DWORD WINAPI RtmIgnoreChangedDests ( IN RTM_ENTITY_HANDLE RtmRegHandle, IN RTM_NOTIFY_HANDLE NotifyHandle, IN UINT NumDests, IN PRTM_DEST_HANDLE ChangedDests ); DWORD WINAPI RtmGetChangeStatus ( IN RTM_ENTITY_HANDLE RtmRegHandle, IN RTM_NOTIFY_HANDLE NotifyHandle, IN RTM_DEST_HANDLE DestHandle, OUT PBOOL ChangeStatus ); DWORD WINAPI RtmMarkDestForChangeNotification ( IN RTM_ENTITY_HANDLE RtmRegHandle, IN RTM_NOTIFY_HANDLE NotifyHandle, IN RTM_DEST_HANDLE DestHandle, IN BOOL MarkDest ); DWORD WINAPI RtmIsMarkedForChangeNotification ( IN RTM_ENTITY_HANDLE RtmRegHandle, IN RTM_NOTIFY_HANDLE NotifyHandle, IN RTM_DEST_HANDLE DestHandle, OUT PBOOL DestMarked ); DWORD WINAPI RtmDeregisterFromChangeNotification ( IN RTM_ENTITY_HANDLE RtmRegHandle, IN RTM_NOTIFY_HANDLE NotifyHandle ); // // Entity Specific List APIs // DWORD WINAPI RtmCreateRouteList ( IN RTM_ENTITY_HANDLE RtmRegHandle, OUT PRTM_ROUTE_LIST_HANDLE RouteListHandle ); DWORD WINAPI RtmInsertInRouteList ( IN RTM_ENTITY_HANDLE RtmRegHandle, IN RTM_ROUTE_LIST_HANDLE RouteListHandle OPTIONAL, IN UINT NumRoutes, IN PRTM_ROUTE_HANDLE RouteHandles ); DWORD WINAPI RtmCreateRouteListEnum ( IN RTM_ENTITY_HANDLE RtmRegHandle, IN RTM_ROUTE_LIST_HANDLE RouteListHandle, OUT PRTM_ENUM_HANDLE RtmEnumHandle ); DWORD WINAPI RtmGetListEnumRoutes ( IN RTM_ENTITY_HANDLE RtmRegHandle, IN RTM_ENUM_HANDLE EnumHandle, IN OUT PUINT NumRoutes, OUT PRTM_ROUTE_HANDLE RouteHandles ); DWORD WINAPI RtmDeleteRouteList ( IN RTM_ENTITY_HANDLE RtmRegHandle, IN RTM_ROUTE_LIST_HANDLE RouteListHandle ); // // Handle Management APIs // DWORD WINAPI RtmReferenceHandles ( IN RTM_ENTITY_HANDLE RtmRegHandle, IN UINT NumHandles, IN HANDLE *RtmHandles ); #ifdef __cplusplus } #endif #endif //__ROUTING_RTMv2_H__