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