windows-nt/Source/XPSP1/NT/public/sdk/inc/rtmv2.h
2020-09-26 16:20:57 +08:00

1216 lines
34 KiB
C

/*++
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__