820 lines
27 KiB
C
820 lines
27 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 1995-1999 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
rtm.h
|
||
|
|
||
|
Abstract:
|
||
|
Interface for Routing Table Manager DLL
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#ifndef __ROUTING_RTM_H__
|
||
|
#pragma option push -b -a8 -pc -A- /*P_O_Push*/
|
||
|
#define __ROUTING_RTM_H__
|
||
|
|
||
|
#if _MSC_VER > 1000
|
||
|
#pragma once
|
||
|
#endif
|
||
|
|
||
|
#pragma warning(disable:4201)
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
extern "C" {
|
||
|
#endif
|
||
|
|
||
|
// Currently supported protocol families
|
||
|
#define RTM_PROTOCOL_FAMILY_IPX 0
|
||
|
#define RTM_PROTOCOL_FAMILY_IP 1
|
||
|
|
||
|
// Error messages specific to Routing Table Manager
|
||
|
#define ERROR_MORE_MESSAGES ERROR_MORE_DATA
|
||
|
#define ERROR_CLIENT_ALREADY_EXISTS ERROR_ALREADY_EXISTS
|
||
|
#define ERROR_NO_MESSAGES ERROR_NO_MORE_ITEMS
|
||
|
|
||
|
#define ERROR_NO_MORE_ROUTES ERROR_NO_MORE_ITEMS
|
||
|
#define ERROR_NO_ROUTES ERROR_NO_MORE_ITEMS
|
||
|
#define ERROR_NO_SUCH_ROUTE ERROR_NO_MORE_ITEMS
|
||
|
|
||
|
// Protocol family dependent network number structures
|
||
|
typedef struct _IPX_NETWORK {
|
||
|
DWORD N_NetNumber;
|
||
|
} IPX_NETWORK, *PIPX_NETWORK;
|
||
|
|
||
|
|
||
|
typedef struct _IP_NETWORK {
|
||
|
DWORD N_NetNumber;
|
||
|
DWORD N_NetMask;
|
||
|
} IP_NETWORK, *PIP_NETWORK;
|
||
|
|
||
|
|
||
|
|
||
|
// Protocol family dependent next hop router address structures
|
||
|
typedef struct _IPX_NEXT_HOP_ADDRESS {
|
||
|
BYTE NHA_Mac[6];
|
||
|
} IPX_NEXT_HOP_ADDRESS, *PIPX_NEXT_HOP_ADDRESS;
|
||
|
|
||
|
typedef IP_NETWORK IP_NEXT_HOP_ADDRESS, *PIP_NEXT_HOP_ADDRESS;
|
||
|
|
||
|
|
||
|
// Protocol family dependent specific data structures
|
||
|
typedef struct _IPX_SPECIFIC_DATA {
|
||
|
DWORD FSD_Flags; // should be set to 0 if no flags are defined
|
||
|
USHORT FSD_TickCount; // ticks to destination network
|
||
|
USHORT FSD_HopCount; // hops to destination network
|
||
|
} IPX_SPECIFIC_DATA, *PIPX_SPECIFIC_DATA;
|
||
|
|
||
|
// The following flags are defined for the IPX family dependent Flags field
|
||
|
|
||
|
#define IPX_GLOBAL_CLIENT_WAN_ROUTE 0x00000001
|
||
|
|
||
|
|
||
|
typedef struct _IP_SPECIFIC_DATA
|
||
|
{
|
||
|
DWORD FSD_Type; // One of : other,invalid,local,remote (1-4)
|
||
|
DWORD FSD_Policy; // See RFC 1354
|
||
|
DWORD FSD_NextHopAS; // Autonomous System Number of Next Hop
|
||
|
DWORD FSD_Priority; // For comparing Inter Protocol Metrics
|
||
|
DWORD FSD_Metric; // For comparing Intra Protocol Metrics
|
||
|
DWORD FSD_Metric1; // Protocol specific metrics for MIB II
|
||
|
DWORD FSD_Metric2; // conformance. MIB II agents will not
|
||
|
DWORD FSD_Metric3; // display FSD_Metric, they will only
|
||
|
DWORD FSD_Metric4; // display Metrics1-5, so if you want your
|
||
|
DWORD FSD_Metric5; // metric displayed, put it in one of these
|
||
|
// fields ALSO (It has to be in the
|
||
|
// FSD_Metric field always). It is up to the
|
||
|
// implementor to keep the fields consistent
|
||
|
DWORD FSD_Flags; // Flags defined below
|
||
|
} IP_SPECIFIC_DATA, *PIP_SPECIFIC_DATA;
|
||
|
|
||
|
//
|
||
|
// All routing protocols MUST clear out the FSD_Flags field.
|
||
|
// If RTM notifies a protocol of a route and that route is marked
|
||
|
// invalid, the protocols MUST disregard this route. A protocol
|
||
|
// may mark a route as invalid, if it does not want the route to
|
||
|
// be indicated to other protocols or set to the stack. e.g. RIPv2
|
||
|
// marks summarized routes as INVALID and uses the RTM purely as
|
||
|
// a store for such routes. These routes are not considered when
|
||
|
// comparing metrics etc to decide the "best" route
|
||
|
//
|
||
|
|
||
|
#define IP_VALID_ROUTE 0x00000001
|
||
|
|
||
|
#define ClearRouteFlags(pRoute) \
|
||
|
((pRoute)->RR_FamilySpecificData.FSD_Flags = 0x00000000)
|
||
|
|
||
|
|
||
|
#define IsRouteValid(pRoute) \
|
||
|
((pRoute)->RR_FamilySpecificData.FSD_Flags & IP_VALID_ROUTE)
|
||
|
|
||
|
|
||
|
|
||
|
#define SetRouteValid(pRoute) \
|
||
|
((pRoute)->RR_FamilySpecificData.FSD_Flags |= IP_VALID_ROUTE)
|
||
|
|
||
|
#define ClearRouteValid(pRoute) \
|
||
|
((pRoute)->RR_FamilySpecificData.FSD_Flags &= ~IP_VALID_ROUTE)
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
#define IsRouteNonUnicast(pRoute) \
|
||
|
(((DWORD)((pRoute)->RR_Network.N_NetNumber & 0x000000FF)) >= ((DWORD)0x000000E0))
|
||
|
|
||
|
#define IsRouteLoopback(pRoute) \
|
||
|
((((pRoute)->RR_Network.N_NetNumber & 0x000000FF) == 0x0000007F) || \
|
||
|
((pRoute)->RR_NextHopAddress.N_NetNumber == 0x0100007F))
|
||
|
|
||
|
|
||
|
// Protocol dependent specific data structure
|
||
|
typedef struct _PROTOCOL_SPECIFIC_DATA {
|
||
|
DWORD PSD_Data[4];
|
||
|
} PROTOCOL_SPECIFIC_DATA, *PPROTOCOL_SPECIFIC_DATA;
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
#define DWORD_ALIGN(type,field) \
|
||
|
union { \
|
||
|
type field; \
|
||
|
DWORD field##Align; \
|
||
|
}
|
||
|
|
||
|
// Standard header associated with all types of routes
|
||
|
#define ROUTE_HEADER \
|
||
|
DWORD_ALIGN ( \
|
||
|
FILETIME, RR_TimeStamp); \
|
||
|
DWORD RR_RoutingProtocol; \
|
||
|
DWORD RR_InterfaceID; \
|
||
|
DWORD_ALIGN ( \
|
||
|
PROTOCOL_SPECIFIC_DATA, RR_ProtocolSpecificData)
|
||
|
|
||
|
// Ensure dword aligment of all fields
|
||
|
|
||
|
// Protocol family dependent route entries
|
||
|
// (intended for use by protocol handlers to pass paramerters
|
||
|
// to and from RTM routines)
|
||
|
typedef struct _RTM_IPX_ROUTE {
|
||
|
ROUTE_HEADER;
|
||
|
DWORD_ALIGN (
|
||
|
IPX_NETWORK, RR_Network);
|
||
|
DWORD_ALIGN (
|
||
|
IPX_NEXT_HOP_ADDRESS, RR_NextHopAddress);
|
||
|
DWORD_ALIGN (
|
||
|
IPX_SPECIFIC_DATA, RR_FamilySpecificData);
|
||
|
} RTM_IPX_ROUTE, *PRTM_IPX_ROUTE;
|
||
|
|
||
|
typedef struct _RTM_IP_ROUTE {
|
||
|
ROUTE_HEADER;
|
||
|
DWORD_ALIGN (
|
||
|
IP_NETWORK, RR_Network);
|
||
|
DWORD_ALIGN (
|
||
|
IP_NEXT_HOP_ADDRESS, RR_NextHopAddress);
|
||
|
DWORD_ALIGN (
|
||
|
IP_SPECIFIC_DATA, RR_FamilySpecificData);
|
||
|
} RTM_IP_ROUTE, *PRTM_IP_ROUTE;
|
||
|
|
||
|
|
||
|
|
||
|
// RTM route change message flags
|
||
|
// Flags to test the presence of route change information
|
||
|
// in the buffers filled by RTM routines
|
||
|
#define RTM_CURRENT_BEST_ROUTE 0x00000001
|
||
|
#define RTM_PREVIOUS_BEST_ROUTE 0x00000002
|
||
|
|
||
|
// Flags that convey what acutally happened
|
||
|
#define RTM_NO_CHANGE 0
|
||
|
#define RTM_ROUTE_ADDED RTM_CURRENT_BEST_ROUTE
|
||
|
#define RTM_ROUTE_DELETED RTM_PREVIOUS_BEST_ROUTE
|
||
|
#define RTM_ROUTE_CHANGED (RTM_CURRENT_BEST_ROUTE|RTM_PREVIOUS_BEST_ROUTE)
|
||
|
|
||
|
// Enumeration flags limit that enumerations of routes in the table
|
||
|
// to only entries with the specified field(s)
|
||
|
#define RTM_ONLY_THIS_NETWORK 0x00000001
|
||
|
#define RTM_ONLY_THIS_INTERFACE 0x00000002
|
||
|
#define RTM_ONLY_THIS_PROTOCOL 0x00000004
|
||
|
#define RTM_ONLY_BEST_ROUTES 0x00000008
|
||
|
|
||
|
#define RTM_PROTOCOL_SINGLE_ROUTE 0x00000001
|
||
|
|
||
|
/*++
|
||
|
*******************************************************************
|
||
|
|
||
|
R t m R e g i s t e r C l i e n t
|
||
|
|
||
|
Routine Description:
|
||
|
Registers client as a handler of specified protocol.
|
||
|
Establishes route change notification mechanism for the client
|
||
|
|
||
|
Arguments:
|
||
|
ProtocolFamily - protocol family of the routing protocol to register
|
||
|
RoutingProtocol - which routing protocol is handled by the client
|
||
|
ChangeEvent - this event will be signalled when best route to any
|
||
|
network in the table changes
|
||
|
Flags - flags that enable special features applied to routes maintained
|
||
|
by the protocol:
|
||
|
RTM_PROTOCOL_SINGLE_ROUTE - RTM will only keep
|
||
|
one route per destination network for the protocol
|
||
|
Return Value:
|
||
|
Handle to be used to identify the client in calls made to Rtm
|
||
|
NULL - operation failed, call GetLastError() to get reason of
|
||
|
failure:
|
||
|
ERROR_INVALID_PARAMETER - specified protocol family is not supported
|
||
|
ERROR_CLIENT_ALREADY_EXISTS - another client already registered
|
||
|
to handle specified protocol
|
||
|
ERROR_NO_SYSTEM_RESOURCES - not enough resources to perform the opertaion,
|
||
|
try again later
|
||
|
ERROR_NOT_ENOUGH_MEMORY - not enough memory to allocate client
|
||
|
control block
|
||
|
|
||
|
*******************************************************************
|
||
|
--*/
|
||
|
HANDLE WINAPI
|
||
|
RtmRegisterClient (
|
||
|
IN DWORD ProtocolFamily,
|
||
|
IN DWORD RoutingProtocol,
|
||
|
IN HANDLE ChangeEvent OPTIONAL,
|
||
|
IN DWORD Flags
|
||
|
);
|
||
|
|
||
|
|
||
|
/*++
|
||
|
*******************************************************************
|
||
|
|
||
|
R t m D e r e g i s t e r C l i e n t
|
||
|
|
||
|
Routine Description:
|
||
|
Deregister client and frees associated resources (including all
|
||
|
routes added by the client).
|
||
|
|
||
|
Arguments:
|
||
|
ClientHandle - handle that identifies the client to deregister from RTM
|
||
|
Return Value:
|
||
|
NO_ERROR - client was deregisterd and resources were disposed OK.
|
||
|
ERROR_INVALID_HANDLE - client handle is not a valid RTM handle
|
||
|
ERROR_NO_SYSTEM_RESOURCES - not enough resources to complete the operation,
|
||
|
try again later
|
||
|
|
||
|
*******************************************************************
|
||
|
--*/
|
||
|
DWORD WINAPI
|
||
|
RtmDeregisterClient (
|
||
|
IN HANDLE ClientHandle
|
||
|
);
|
||
|
|
||
|
|
||
|
/*++
|
||
|
*******************************************************************
|
||
|
|
||
|
R t m D e q u e u e R o u t e C h a n g e M e s s a g e
|
||
|
|
||
|
Routine Description:
|
||
|
Dequeues and returns first route change message from the queue
|
||
|
associated with the client
|
||
|
|
||
|
Arguments:
|
||
|
ClientHandle - handle that identifies the client for which the opertation
|
||
|
is performed
|
||
|
Flags - identifies what kind of change the message is about and what
|
||
|
information was palced into the provided buffers:
|
||
|
RTM_ROUTE_ADDED - first route was added for a destination network,
|
||
|
CurBestRoute is filled with added route info
|
||
|
RTM_ROUTE_DELETED - the only route available for a destination
|
||
|
network was deleted, PrevBestRoute is filled
|
||
|
with deleted route info
|
||
|
RTM_ROUTE_CHANGED - there was a change in any of the following
|
||
|
parameters of the BEST route to a destination
|
||
|
network:
|
||
|
RoutingProtocol,
|
||
|
InterfaceID,
|
||
|
Metric,
|
||
|
NextHopAddress,
|
||
|
FamilySpecificData.
|
||
|
PrevBestRoute contains the route info as it was
|
||
|
before the change, CurBestRoute contains current
|
||
|
best route info.
|
||
|
Note that the route change message can be generated
|
||
|
both as result of protocol adding/deleting the route
|
||
|
that becomes/was the best and changing best route parameters
|
||
|
such that route becomes/no longer is the best route.
|
||
|
CurBestRoute - buffer to receive current best route info (if any)
|
||
|
PrevBestRoute - buffer to receive previous best route info (if any)
|
||
|
Return Value:
|
||
|
NO_ERROR - this was the last (or only) message in the client's
|
||
|
queue (event is reset)
|
||
|
ERROR_MORE_MESSAGES - there are more messages awaiting client,
|
||
|
this call should be made again as soon as possible
|
||
|
to let RTM free resources associated with unprocessed
|
||
|
messages
|
||
|
ERROR_NO_MESSAGES - there are no messages in the clients queue,
|
||
|
this was an unsolicited call (event is reset)
|
||
|
ERROR_INVALID_HANDLE - client handle is not a valid RTM handle
|
||
|
ERROR_NO_SYSTEM_RESOURCES - not enough resources to perform the operation,
|
||
|
try again later
|
||
|
|
||
|
*******************************************************************
|
||
|
--*/
|
||
|
DWORD WINAPI
|
||
|
RtmDequeueRouteChangeMessage (
|
||
|
IN HANDLE ClientHandle,
|
||
|
OUT DWORD *Flags,
|
||
|
OUT PVOID CurBestRoute OPTIONAL,
|
||
|
OUT PVOID PrevBestRoute OPTIONAL
|
||
|
);
|
||
|
|
||
|
|
||
|
|
||
|
/*++
|
||
|
*******************************************************************
|
||
|
|
||
|
R t m A d d R o u t e
|
||
|
|
||
|
Routine Description:
|
||
|
Adds or updates existing route entry and generates route change
|
||
|
message if best route to a destination network has changed as the
|
||
|
result of this operation.
|
||
|
Note that route change message is not sent to the client that
|
||
|
makes this change, but rather relevant information is returned
|
||
|
by this routine directly.
|
||
|
|
||
|
Arguments:
|
||
|
ClientHandle - handle that identifies the client for which the opertation
|
||
|
is performed, it also supplies RoutingProtocol field
|
||
|
of the new/updated route
|
||
|
Route - route to be added/updated.
|
||
|
The following fields of protocol family dependent
|
||
|
RTM_??_ROUTE structure are used to construct/update
|
||
|
route entry:
|
||
|
RR_Network: destination network
|
||
|
RR_InterfaceID: id of interface through which route was received
|
||
|
RR_NextHopAddress: address of next hop router
|
||
|
RR_FamilySpecificData: data specific to protocol's family
|
||
|
RR_ProtocolSpecificData: data specific to protocol which supplies the
|
||
|
route (subject to size limitation defined by
|
||
|
PROTOCOL_SPECIFIC_DATA structure above)
|
||
|
RR_TimeStamp: current time, which is actually read from system
|
||
|
timer (need not be supplied)
|
||
|
Note that combination of
|
||
|
RoutingProtocol,
|
||
|
Network,
|
||
|
InterfaceID, and
|
||
|
NextHopAddress
|
||
|
uniquely identifies route entry in the table.
|
||
|
New entry is created if one of these fields does not match those of
|
||
|
an existing entry, otherwise existing entry is changed (see also
|
||
|
ReplaceEntry flag below).
|
||
|
|
||
|
Regardless of whether new entry is created or old one is updated,
|
||
|
this operation will generate a route change message if affected
|
||
|
route becomes/is/no longer is the best route to a destination network
|
||
|
and at least one of the following parameters in the best route is
|
||
|
changed as the result of this operation:
|
||
|
RoutingProtocol,
|
||
|
InterfaceID,
|
||
|
NextHopAddress,
|
||
|
FamilySpecificData.
|
||
|
TimeToLive - how long route should be kept in the table in seconds.
|
||
|
Pass INFINITE if route is to be kept until deleted explicitly
|
||
|
Note the current limit for TimeToLive is 2147483 sec (24+ days).
|
||
|
Flags - returns what change message (if any) will be generated by the
|
||
|
RTM as the result of this addition/update and identifies what
|
||
|
information was palced into the provided buffers:
|
||
|
RTM_NO_CHANGE - this was an update that either did not change any of
|
||
|
the significant route parameters (described above)
|
||
|
or the route entry affected is not the best
|
||
|
to the destination network
|
||
|
RTM_ROUTE_ADDED - the route added is the first known route for a
|
||
|
destination network,
|
||
|
CurBestRoute is filled with added route info
|
||
|
RTM_ROUTE_CHANGED - there was a change in any of the significant
|
||
|
parameters of the BEST route to a destination
|
||
|
network as the result if this operation.
|
||
|
PrevBestRoute contains the route info as it was
|
||
|
before the change, CurBestRoute contains current
|
||
|
best route info.
|
||
|
Note the the CurBestRoute does not neccessarily the same
|
||
|
as added route, because if update causes route metric
|
||
|
to change, another route entry may become the best for
|
||
|
a given destination and its info will be returned in
|
||
|
CurBestRoute buffer. PrevBestRoute buffer in the latter
|
||
|
case will contain route entry as it was before this operation
|
||
|
was performed.
|
||
|
CurBestRoute - buffer to receive current best route info (if any)
|
||
|
PrevBestRoute - buffer to receive previous best route info (if any)
|
||
|
Return Value:
|
||
|
NO_ERROR - route was added/updated OK
|
||
|
ERROR_INVALID_PARAMETER - route contains invalid parameter
|
||
|
ERROR_INVALID_HANDLE - client handle is not a valid RTM handle
|
||
|
ERROR_NOT_ENOUGH_MEMORY - route could not be adeed because of memory
|
||
|
allocation problem
|
||
|
ERROR_NO_SYSTEM_RESOURCES - not enough resources to perform the operation,
|
||
|
try again later
|
||
|
|
||
|
*******************************************************************
|
||
|
--*/
|
||
|
DWORD WINAPI
|
||
|
RtmAddRoute (
|
||
|
IN HANDLE ClientHandle,
|
||
|
IN PVOID Route,
|
||
|
IN DWORD TimeToLive,
|
||
|
OUT DWORD *Flags,
|
||
|
OUT PVOID CurBestRoute OPTIONAL,
|
||
|
OUT PVOID PrevBestRoute OPTIONAL
|
||
|
);
|
||
|
|
||
|
|
||
|
/*++
|
||
|
*******************************************************************
|
||
|
|
||
|
R t m D e l e t e R o u t e
|
||
|
|
||
|
Routine Description:
|
||
|
Deletes existing route entry and generates route change
|
||
|
message if best route to a destination network has changed as the
|
||
|
result of this operation.
|
||
|
Note that route change message is not sent to the client that
|
||
|
makes this change, but rather relevant information is returned
|
||
|
by this routine directly.
|
||
|
|
||
|
Arguments:
|
||
|
ClientHandle - handle that identifies the client for which the opertation
|
||
|
is performed, it also supplies RoutingProtocol field
|
||
|
of the route to be deleted
|
||
|
Route - route to be deleted.
|
||
|
The following fields of protocol family dependent
|
||
|
RTM_??_ROUTE structure are used to identify
|
||
|
route entry to be deleted:
|
||
|
RR_Network: destination network
|
||
|
RR_InterfaceID: id of interface through which route was received
|
||
|
RR_NextHopAddress: address of next hop router
|
||
|
|
||
|
If the deleted entry represented the best route to a destination
|
||
|
network, this operation will generate route change message
|
||
|
Flags - returns what change message (if any) will be generated by the
|
||
|
RTM as the result of this deletion and identifies what
|
||
|
information was palced into the provided buffer:
|
||
|
RTM_NO_CHANGE - the deleted route did not affect best route to
|
||
|
any destination network (there is another entry that
|
||
|
represents route to the same destination nework and
|
||
|
it has better metric)
|
||
|
RTM_ROUTE_DELETED - the deleted route was the only route avaliable
|
||
|
for the destination network
|
||
|
RTM_ROUTE_CHANGED - after this route was deleted another route
|
||
|
became the best to the destination network,
|
||
|
CurBestRoute will be filled with that route info
|
||
|
CurBestRoute - buffer to receive current best route info (if any)
|
||
|
Return Value:
|
||
|
NO_ERROR - route was deleted OK
|
||
|
ERROR_INVALID_PARAMETER - route contains invalid parameter
|
||
|
ERROR_INVALID_HANDLE - client handle is not a valid RTM handle
|
||
|
ERROR_NO_SUCH_ROUTE - there is no entry in the table that
|
||
|
has specified parameters
|
||
|
ERROR_NO_SYSTEM_RESOURCES - not enough resources to perform the operation,
|
||
|
try again later
|
||
|
|
||
|
*******************************************************************
|
||
|
--*/
|
||
|
DWORD WINAPI
|
||
|
RtmDeleteRoute (
|
||
|
IN HANDLE ClientHandle,
|
||
|
IN PVOID Route,
|
||
|
OUT DWORD *Flags,
|
||
|
OUT PVOID CurBestRoute OPTIONAL
|
||
|
);
|
||
|
|
||
|
|
||
|
|
||
|
/*++
|
||
|
*******************************************************************
|
||
|
|
||
|
R t m I s R o u t e
|
||
|
|
||
|
Routine Description:
|
||
|
Checks if route exists to specified network and returns best
|
||
|
route info
|
||
|
|
||
|
Arguments:
|
||
|
ProtocolFamily - identifies protocol family of route of interest
|
||
|
Network - contains protocol family dependent network number data
|
||
|
(as defined by ??_NETWORK structures above)
|
||
|
BestRoute - buffer to receive current best route info (if any)
|
||
|
Return Value:
|
||
|
TRUE - route to network of interest exists
|
||
|
FALSE - not route exist or operation failed, call GetLastError()
|
||
|
to obtain reason of failure:
|
||
|
NO_ERROR - operation succeded but not route exists
|
||
|
ERROR_INVALID_PARAMETER - input parameter(s) is invalid (unsupported
|
||
|
protocol family)
|
||
|
ERROR_NO_SYSTEM_RESOURCES - not enough resources to perform the operation,
|
||
|
try again later
|
||
|
|
||
|
*******************************************************************
|
||
|
--*/
|
||
|
BOOL WINAPI
|
||
|
RtmIsRoute (
|
||
|
IN DWORD ProtocolFamily,
|
||
|
IN PVOID Network,
|
||
|
OUT PVOID BestRoute OPTIONAL
|
||
|
);
|
||
|
|
||
|
|
||
|
/*++
|
||
|
*******************************************************************
|
||
|
|
||
|
R t m G e t N e t w o r k C o u n t
|
||
|
|
||
|
Routine Description:
|
||
|
Returns number of networks that RTM has routes to.
|
||
|
|
||
|
Arguments:
|
||
|
ProtocolFamily - identifies protocol family of interest
|
||
|
Return Value:
|
||
|
Number of known networks
|
||
|
0 if no routes are availabel in the table or operation failed,
|
||
|
call GetLastError () to get reason of failure:
|
||
|
NO_ERROR - operation succeded but no routes available
|
||
|
ERROR_INVALID_PARAMETER - input parameter is invalid (unsupported
|
||
|
protocol family)
|
||
|
|
||
|
*******************************************************************
|
||
|
--*/
|
||
|
ULONG WINAPI
|
||
|
RtmGetNetworkCount (
|
||
|
IN DWORD ProtocolFamily
|
||
|
);
|
||
|
|
||
|
/*++
|
||
|
*******************************************************************
|
||
|
|
||
|
R t m G e t R o u t e A g e
|
||
|
|
||
|
Routine Description:
|
||
|
Returns route age (time since it was created or updated) in seconds
|
||
|
Route structure must have been recently filled by RTM for this to
|
||
|
return valid results (route age is actually computed from
|
||
|
RR_TimeStamp field)
|
||
|
|
||
|
Arguments:
|
||
|
Route - protocol family dependent route data (RTM_??_ROUTE data
|
||
|
structure) that was obtained from RTM (returned by
|
||
|
its routines)
|
||
|
Return Value:
|
||
|
Route age in seconds
|
||
|
INFINITE - if content of route is invalid (GetLastError () returns
|
||
|
ERROR_INVALID_PARAMETER)
|
||
|
|
||
|
*******************************************************************
|
||
|
--*/
|
||
|
ULONG WINAPI
|
||
|
RtmGetRouteAge (
|
||
|
IN PVOID Route
|
||
|
);
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
/*++
|
||
|
*******************************************************************
|
||
|
|
||
|
R t m C r e a t e E n u m e r a t i o n H a n d l e
|
||
|
|
||
|
Routine Description:
|
||
|
Creates a handle that will allow the caller to use fast and change
|
||
|
tolerant enumeration API to scan through all routes or a subset of them
|
||
|
known to the RTM. Note that scans performed by this API do not return
|
||
|
routes in any particular order.
|
||
|
|
||
|
Arguments:
|
||
|
ProtocolFamily - identifies protocol family of interest
|
||
|
EnumerationFlags - limit routes returned by enumeration API to a subset
|
||
|
members of which have same values in the fields
|
||
|
specified by the flags as in CriteriaRoute
|
||
|
(RTM_ONLY_BEST_ROUTES does not require a criterion)
|
||
|
CriteriaRoute - protocol family dependent structure (RTM_??_ROUTE) with
|
||
|
set values in fields that correspond to EnumerationFlags
|
||
|
Return Value:
|
||
|
Handle that can be used with enumeration API below
|
||
|
NULL no routes exists with specified criteria or operation failed,
|
||
|
call GetLastError () to get reason of failure:
|
||
|
ERROR_NO_ROUTES - no routes exist with specified criteria
|
||
|
ERROR_INVALID_PARAMETER - input parameter(s) is invalid (unsupported
|
||
|
protocol family, invalid enumeration flag, etc)
|
||
|
ERROR_NOT_ENOUGH_MEMORY - handle could not be created because of memory
|
||
|
allocation problem
|
||
|
ERROR_NO_SYSTEM_RESOURCES - not enough resources to perform the operation,
|
||
|
try again later
|
||
|
|
||
|
*******************************************************************
|
||
|
--*/
|
||
|
HANDLE WINAPI
|
||
|
RtmCreateEnumerationHandle (
|
||
|
IN DWORD ProtocolFamily,
|
||
|
IN DWORD EnumerationFlags,
|
||
|
IN PVOID CriteriaRoute
|
||
|
);
|
||
|
|
||
|
|
||
|
/*++
|
||
|
*******************************************************************
|
||
|
|
||
|
R t m E n u m e r a t e G e t N e x t R o u t e
|
||
|
|
||
|
Routine Description:
|
||
|
Returns next route entry in enumeration started by
|
||
|
RtmCreateEnumerationHandle.
|
||
|
|
||
|
Arguments:
|
||
|
EnumerationHandle - handle that identifies enumeration
|
||
|
Route - buffer (RTM_??_ROUTE structure) that receives next
|
||
|
route in enumeration
|
||
|
Return Value:
|
||
|
NO_ERROR - next availbale route was placed in the buffer
|
||
|
ERROR_NO_MORE_ROUTES - no more routes exist with soecified criteria
|
||
|
ERROR_INVALID_HANDLE - enumeration handle is not a valid RTM handle
|
||
|
ERROR_NO_SYSTEM_RESOURCES - not enough resources to perform the operation,
|
||
|
try again later
|
||
|
|
||
|
*******************************************************************
|
||
|
--*/
|
||
|
DWORD WINAPI
|
||
|
RtmEnumerateGetNextRoute (
|
||
|
IN HANDLE EnumerationHandle,
|
||
|
OUT PVOID Route
|
||
|
);
|
||
|
|
||
|
/*++
|
||
|
*******************************************************************
|
||
|
|
||
|
R t m C l o s e E n u m e r a t i o n H a n d l e
|
||
|
|
||
|
Routine Description:
|
||
|
Terminates enumerationand frees associated resources
|
||
|
|
||
|
Arguments:
|
||
|
EnumerationHandle - handle that identifies enumeration
|
||
|
Return Value:
|
||
|
NO_ERROR - enumeration was termineted ok
|
||
|
ERROR_INVALID_HANDLE - enumeration handle is not a valid RTM handle
|
||
|
ERROR_NO_SYSTEM_RESOURCES - not enough resources to perform the operation,
|
||
|
try again later
|
||
|
|
||
|
*******************************************************************
|
||
|
--*/
|
||
|
DWORD WINAPI
|
||
|
RtmCloseEnumerationHandle (
|
||
|
IN HANDLE EnumerationHandle
|
||
|
);
|
||
|
|
||
|
|
||
|
/*++
|
||
|
*******************************************************************
|
||
|
|
||
|
R t m B l o c k D e l e t e R o u t e s
|
||
|
|
||
|
Routine Description:
|
||
|
Deletes all routes in subset specified by enumeration flags and
|
||
|
corresponding criteria. This operation can only be performed by
|
||
|
the registered client and applies only to routes added by this
|
||
|
client.
|
||
|
Route change messages will be generated for deleted routes that
|
||
|
were the best
|
||
|
Arguments:
|
||
|
ClientHandle - handle that identifies the client and routing protocol
|
||
|
of routes to be deleted
|
||
|
EnumerationFlags - further limit subset of routes being deleted to only
|
||
|
those that have same values in the fields
|
||
|
specified by the flags as in CriteriaRoute
|
||
|
Note that only RTM_ONLY_THIS_NETWORK and RTM_ONLY_THIS_INTERFACE
|
||
|
can be used (RTM_ONLY_BEST_ROUTES does not apply because best
|
||
|
route designation is adjusted as routes are deleted and
|
||
|
all routes will be deleted anyway)
|
||
|
CriteriaRoute - protocol family dependent structure (RTM_??_ROUTE) with
|
||
|
set values in fields that correspond to EnumerationFlags
|
||
|
Return Value:
|
||
|
NO_ERROR - routes were deleted ok
|
||
|
ERROR_NO_ROUTES - no routes exist that match specified criteria
|
||
|
ERROR_INVALID_HANDLE - client handle is not a valid RTM handle
|
||
|
ERROR_NOT_ENOUGH_MEMORY - could not allocate memory to perform
|
||
|
the operation
|
||
|
ERROR_NO_SYSTEM_RESOURCES - not enough resources to perform the operation,
|
||
|
try again later
|
||
|
|
||
|
*******************************************************************
|
||
|
--*/
|
||
|
DWORD WINAPI
|
||
|
RtmBlockDeleteRoutes (
|
||
|
IN HANDLE ClientHandle,
|
||
|
IN DWORD EnumerationFlags,
|
||
|
IN PVOID CriteriaRoute
|
||
|
);
|
||
|
|
||
|
/*++
|
||
|
*******************************************************************
|
||
|
|
||
|
R t m G e t F i r s t R o u t e
|
||
|
|
||
|
Routine Description:
|
||
|
Returns first route in the NetworkNumber.RoutingProtocol.InterfaceID.
|
||
|
NextHopAddress order from the subset specifed by the enumeration flags.
|
||
|
Note that this operation may consume significant processing time because
|
||
|
first all recently changed routes will have to be merged into the
|
||
|
ordered list, and this list will then have to be traversed to locate
|
||
|
the route of interest.
|
||
|
|
||
|
Arguments:
|
||
|
ProtocolFamily - identifies protocol family of interest
|
||
|
EnumerationFlags - limit routes returned by enumeration API to a subset
|
||
|
members of which have same values in the fields
|
||
|
specified by the flags as in CriteriaRoute
|
||
|
(RTM_ONLY_BEST_ROUTES does not require a criterion)
|
||
|
Route - protocol family dependent structure (RTM_??_ROUTE) with
|
||
|
set values in fields that correspond to EnumerationFlags
|
||
|
on INPUT and first route that matches specified
|
||
|
criteria on OUTPUT
|
||
|
Return Value:
|
||
|
NO_ERROR - matching route was found
|
||
|
ERROR_NO_ROUTES - no routes exist with specified criteria
|
||
|
ERROR_INVALID_PARAMETER - input parameter(s) is invalid (unsupported
|
||
|
protocol family, invalid enumeration flag, etc)
|
||
|
ERROR_NO_SYSTEM_RESOURCES - not enough resources to perform the operation,
|
||
|
try again later
|
||
|
|
||
|
*******************************************************************
|
||
|
--*/
|
||
|
DWORD WINAPI
|
||
|
RtmGetFirstRoute (
|
||
|
IN DWORD ProtocolFamily,
|
||
|
IN DWORD EnumerationFlags,
|
||
|
IN OUT PVOID Route
|
||
|
);
|
||
|
|
||
|
#define RtmGetSpecificRoute(ProtocolFamily,Route) \
|
||
|
RtmGetFirstRoute(ProtocolFamily, \
|
||
|
RTM_ONLY_THIS_NETWORK \
|
||
|
| RTM_ONLY_THIS_PROTOCOL \
|
||
|
| RTM_ONLY_THIS_INTERFACE, \
|
||
|
Route)
|
||
|
|
||
|
/*++
|
||
|
*******************************************************************
|
||
|
|
||
|
R t m G e t N e x t R o u t e
|
||
|
|
||
|
Routine Description:
|
||
|
Returns route that follows specified route in the NetworkNumber.
|
||
|
RoutingProtocol.InterfaceID.NextHopAddress order from the subset defined
|
||
|
by the enumeration flags.
|
||
|
Note that this operation may consume significant processing time because
|
||
|
first all recently changed routes will have to be merged into the
|
||
|
ordered list, and this list may then have to be traversed to locate
|
||
|
the route of interest.
|
||
|
|
||
|
Arguments:
|
||
|
ProtocolFamily - identifies protocol family of interest
|
||
|
EnumerationFlags - limit routes returned by enumeration API to a subset
|
||
|
members of which have same values in the fields
|
||
|
specified by the flags as in Route
|
||
|
(RTM_ONLY_BEST_ROUTES does not require a criterion)
|
||
|
Route - protocol family dependent structure (RTM_??_ROUTE) which both
|
||
|
provides the route from which to start the search and
|
||
|
set values in fields that correspond to EnumerationFlags
|
||
|
on INPUT and route that both follows input route in
|
||
|
NetworkNumber.RoutingProtocol.InterfaceID.NextHopAddress
|
||
|
order and matches specified criteria on OUTPUT
|
||
|
Return Value:
|
||
|
NO_ERROR - matching route was found
|
||
|
ERROR_NO_ROUTES - no routes exist with specified criteria
|
||
|
ERROR_INVALID_PARAMETER - input parameter(s) is invalid (unsupported
|
||
|
protocol family, invalid enumeration flag, etc)
|
||
|
ERROR_NO_SYSTEM_RESOURCES - not enough resources to perform the operation,
|
||
|
try again later
|
||
|
|
||
|
*******************************************************************
|
||
|
--*/
|
||
|
DWORD WINAPI
|
||
|
RtmGetNextRoute (
|
||
|
IN DWORD ProtocolFamily,
|
||
|
IN DWORD EnumerationFlags,
|
||
|
IN OUT PVOID Route
|
||
|
);
|
||
|
|
||
|
|
||
|
BOOL WINAPI
|
||
|
RtmLookupIPDestination(
|
||
|
DWORD dwDestAddr,
|
||
|
PRTM_IP_ROUTE prir
|
||
|
);
|
||
|
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#pragma warning(default:4201)
|
||
|
|
||
|
#pragma option pop /*P_O_Pop*/
|
||
|
#endif //__ROUTING_RTM_H__
|