📄 rtmv2.h
字号:
/*++
Copyright (c) 1995-1999 Microsoft Corporation
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__
#pragma option push -b -a8 -pc -A- /*P_O_Push*/
#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
//
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -