windows-nt/Source/XPSP1/NT/net/rras/rtmv2/rtmrout.h
2020-09-26 16:20:57 +08:00

268 lines
7.1 KiB
C

/*++
Copyright (c) 1997 - 98, Microsoft Corporation
Module Name:
rtmrout.h
Abstract:
Contains definitions for RTM objects like
destinations, routes and next hops.
Author:
Chaitanya Kodeboyina (chaitk) 21-Aug-1998
Revision History:
--*/
#ifndef __ROUTING_RTMROUT_H__
#define __ROUTING_RTMROUT_H__
//
// Forward declarations for various Info Blocks
//
typedef struct _DEST_INFO DEST_INFO;
typedef struct _ROUTE_INFO ROUTE_INFO;
typedef struct _NEXTHOP_INFO NEXTHOP_INFO;
//
// Address Family independent dest structure
//
typedef struct _DEST_INFO
{
OBJECT_HEADER ObjectHeader; // Signature, Type and Reference Count
SINGLE_LIST_ENTRY ChangeListLE; // Linkage on the list of changed dests
LOOKUP_LINKAGE LookupLinkage; // Linkage into owning lookup structure
PVOID DestLock; // Dynamic lock that protects this dest
DWORD DestMarkedBits; // Bit N set => Nth CN has marked dest
DWORD DestChangedBits; // Bit N set => Nth CN has a change
DWORD DestOnQueueBits; // Bit N set => Dest on Nth CN's queue
UINT NumRoutes; // Number of routes to destination
LIST_ENTRY RouteList; // A list of routes to destination
PVOID *OpaqueInfoPtrs; // Array of Opaque Info Pointers
RTM_NET_ADDRESS DestAddress; // Network Address unique to this dest
FILETIME LastChanged; // Last time destination was modified
USHORT State; // State of the destination
USHORT HoldRefCount; // RefCount != 0 => Dest In Holddown
RTM_VIEW_SET BelongsToViews; // View that this dest belongs too
RTM_VIEW_SET ToHoldInViews; // Views in which holddown will apply
struct
{ //
ROUTE_INFO *BestRoute; // Best route to dest in each view
ROUTE_INFO *HoldRoute; // The holddown route in each view
ULONG HoldTime; // Time for which route is in held
} ViewInfo[1]; //
}
DEST_INFO, *PDEST_INFO;
//
// Destination State
//
#define DEST_STATE_CREATED 0
#define DEST_STATE_DELETED 1
//
// Context used in timing out a route
//
typedef struct _ROUTE_TIMER
{
HANDLE Timer; // Handle to the timer used for expiry
PVOID Route; // Route being expired by this timer
}
ROUTE_TIMER, *PROUTE_TIMER;
//
// Address Family Independent route structure
//
typedef struct _ROUTE_INFO
{
OBJECT_HEADER ObjectHeader; // Signature, Type and Reference Count
LIST_ENTRY DestLE; // Linkage on list of routes on dest
LIST_ENTRY RouteListLE; // Linkage on an entity's route list
PROUTE_TIMER TimerContext; // Timer used to age-out or holddown
RTM_ROUTE_INFO RouteInfo; // Part exposed directly to the owner
}
ROUTE_INFO, *PROUTE_INFO;
//
// Node in the next hop tree of which all the
// next-hops with a particular addr hang off
//
typedef struct _NEXTHOP_LIST
{
LOOKUP_LINKAGE LookupLinkage; // Linkage into owning lookup structure
LIST_ENTRY NextHopsList; // Head of the list of next hops
}
NEXTHOP_LIST, *PNEXTHOP_LIST;
//
// Address Family Independent next-hop structure
//
typedef struct _NEXTHOP_INFO
{
OBJECT_HEADER ObjectHeader; // Signature, Type and Reference Count
LIST_ENTRY NextHopsLE; // Linkage into holding nexthops list
RTM_NEXTHOP_INFO NextHopInfo; // Part exposed directly to the owner
}
NEXTHOP_INFO, *PNEXTHOP_INFO;
//
// Macros for acquiring various locks defined in this file
//
#define ACQUIRE_DEST_READ_LOCK(Dest) \
ACQUIRE_DYNAMIC_READ_LOCK(&Dest->DestLock)
#define RELEASE_DEST_READ_LOCK(Dest) \
RELEASE_DYNAMIC_READ_LOCK(&Dest->DestLock)
#define ACQUIRE_DEST_WRITE_LOCK(Dest) \
ACQUIRE_DYNAMIC_WRITE_LOCK(&Dest->DestLock)
#define RELEASE_DEST_WRITE_LOCK(Dest) \
RELEASE_DYNAMIC_WRITE_LOCK(&Dest->DestLock)
//
// Macros for comparing two routes using their preferences
//
BOOL
__inline
IsPrefEqual (
IN PRTM_ROUTE_INFO RouteInfo1,
IN PRTM_ROUTE_INFO RouteInfo2
)
{
return ((RouteInfo1->PrefInfo.Metric == RouteInfo2->PrefInfo.Metric) &&
(RouteInfo1->PrefInfo.Preference == RouteInfo2->PrefInfo.Preference));
}
LONG
__inline
ComparePref (
IN PRTM_ROUTE_INFO RouteInfo1,
IN PRTM_ROUTE_INFO RouteInfo2
)
{
// Lower preference means "more preferred"
if (RouteInfo1->PrefInfo.Preference < RouteInfo2->PrefInfo.Preference)
{ return +1; }
else
if (RouteInfo1->PrefInfo.Preference > RouteInfo2->PrefInfo.Preference)
{ return -1; }
else
if (RouteInfo1->PrefInfo.Metric < RouteInfo2->PrefInfo.Metric)
{ return +1; }
else
if (RouteInfo1->PrefInfo.Metric > RouteInfo2->PrefInfo.Metric)
{ return -1; }
return 0;
}
//
// Dest, Route, NextHop Helper Functions
//
DWORD
CreateDest (
IN PADDRFAM_INFO AddrFamilyInfo,
IN PRTM_NET_ADDRESS DestAddress,
OUT PDEST_INFO *Dest
);
DWORD
DestroyDest (
IN PDEST_INFO Dest
);
DWORD
CreateRoute (
IN PENTITY_INFO Entity,
IN PRTM_ROUTE_INFO RouteInfo,
OUT PROUTE_INFO *Route
);
VOID
ComputeRouteInfoChange(
IN PRTM_ROUTE_INFO OldRouteInfo,
IN PRTM_ROUTE_INFO NewRouteInfo,
IN ULONG PrefChanged,
OUT PULONG RouteInfoChanged,
OUT PULONG ForwardingInfoChanged
);
VOID
CopyToRoute (
IN PENTITY_INFO Entity,
IN PRTM_ROUTE_INFO RouteInfo,
IN PROUTE_INFO Route
);
DWORD
DestroyRoute (
IN PROUTE_INFO Route
);
DWORD
CreateNextHop (
IN PENTITY_INFO Entity,
IN PRTM_NEXTHOP_INFO NextHopInfo,
OUT PNEXTHOP_INFO *NextHop
);
VOID
CopyToNextHop (
IN PENTITY_INFO Entity,
IN PRTM_NEXTHOP_INFO NextHopInfo,
IN PNEXTHOP_INFO NextHop
);
DWORD
DestroyNextHop (
IN PNEXTHOP_INFO NextHop
);
DWORD
FindNextHop (
IN PENTITY_INFO Entity,
IN PRTM_NEXTHOP_INFO NextHopInfo,
OUT PLOOKUP_CONTEXT Context OPTIONAL,
OUT PLIST_ENTRY *NextHopLE
);
#endif //__ROUTING_RTMROUT_H__