Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

207 lines
8.6 KiB

/********************************************************************/
/** Microsoft LAN Manager **/
/** Copyright(c) Microsoft Corp., 1990-2000 **/
/********************************************************************/
/* :ts=4 */
#ifndef __IPRTDEF_H
#define __IPRTDEF_H
#include "ipdef.h"
//** IPRTDEF.H - IP private routing definitions.
//
// This file contains all of the definitions private to the routing
// module.
//* Route table entry.
//
typedef struct RouteTableEntry {
struct RouteTableEntry *rte_next; // Next in hash chain.
IPAddr rte_dest; // Destination of route.
IPMask rte_mask; // Mask to use when examining route.
IPAddr rte_addr; // First hop for this route.
uint rte_priority; // Priority of this route:
// essentially the number of bits
// set in mask.
uint rte_metric; // Metric of route. Lower is better.
uint rte_mtu; // MTU for this route.
struct Interface *rte_if; // Outbound interface.
RouteCacheEntry *rte_rcelist;
ushort rte_type; // Type of route.
ushort rte_flags; // Flags for route.
uint rte_admintype; // Admin type of route.
uint rte_proto; // How we learned about the route.
uint rte_valid; // Up time (in seconds) route was
// last known to be valid.
uint rte_mtuchange; // System up time (in seconds) MTU
// was changed.
ROUTE_CONTEXT rte_context; // Dial-on-demand context for this
// route.
uchar rte_arpcontext[RCE_CONTEXT_SIZE]; // Used in
// forwarding
struct RouteTableEntry *rte_todg; // Points to RTE which is a new
// default gateway
struct RouteTableEntry *rte_fromdg; // Points to RTE which from which
// default gateway is transitioning
uint rte_rces; // number of connected/referenced
// RCEs on this.
struct LinkEntry *rte_link; // Link entry for this route
struct RouteTableEntry *rte_nextlinkrte; // chain of rtes for this link
uint rte_refcnt; // refcount associated with the
// route
} RouteTableEntry;
#define ADDR_FROM_RTE(R, A) \
(IP_ADDR_EQUAL((R)->rte_addr, IPADDR_LOCAL) ? (A) : (R)->rte_addr)
#define IF_FROM_RTE(R) ((R)->rte_if)
#define MTU_FROM_RTE(R) ((R)->rte_mtu)
#define SRC_FROM_RTE(R) ((R)->rte_src)
#define RTE_VALID 1
#define RTE_INCREASE 2 // Set if last MTU change was an
// increase.
#define RTE_IF_VALID 4 // Set to TRUE if rte_if is valid.
#define RTE_DEADGW 8 // This RTE is valid but in DG
// detection process
#define RTE_NEW 16 // This RTE has just been added
#define HOST_MASK 0xffffffff
#define DEFAULT_MASK 0
#define IP_ROUTE_TIMEOUT 5L*1000L // Route timer fires once in 5 sec
#define IP_RTABL_TIMEOUT 60L*1000L // & Route table timer once a min.
#define FLUSH_IFLIST_TIMEOUT 60L*1000L // Flush 1 element from freeiflist
// once a min.
#define MTU_INCREASE_TIME 120 // Number of seconds after increase
// to re-increase.
#define MTU_DECREASE_TIME 600 // Number of seconds after decrease
// to re-increase.
#define MAX_ICMP_ROUTE_VALID 600 // Time to timeout an unused ICMP
// derived route, in seconds.
#define MIN_RT_VALID 60 // Minimum time a route is assumed
// to be valid, in seconds.
#define MIN_VALID_MTU 68 // Minimum valid MTU we can have.
#define HOST_ROUTE_PRI 32
#define DEFAULT_ROUTE_PRI 0
//* Forward Q linkage structure.
//
typedef struct FWQ {
struct FWQ *fq_next;
struct FWQ *fq_prev;
} FWQ;
//* Forward context structure, used when TD'ing a packet to be forwarded.
//
typedef struct FWContext {
PacketContext fc_pc; // Dummy packet context for send
// routines.
FWQ fc_q; // Queue structure.
PNDIS_BUFFER fc_hndisbuff; // Pointer to NDIS buffer for
// header.
IPHeader *fc_hbuff; // Header buffer.
PNDIS_BUFFER fc_buffhead; // Head of list of NDIS buffers.
PNDIS_BUFFER fc_bufftail; // Tail of list of NDIS buffers.
uchar *fc_options; // Options,
Interface *fc_if; // Destination interface.
IPAddr fc_outaddr; // IP address of interface.
uint fc_mtu; // Max MTU outgoing.
NetTableEntry *fc_srcnte; // Source NTE.
IPAddr fc_nexthop; // Next hop.
uint fc_datalength; // Length in bytes of data.
OptIndex fc_index; // Index of relevant options.
uchar fc_optlength; // Length of options.
uchar fc_sos; // Send on source indicator.
uchar fc_dtype; // Dest type.
uchar fc_pad;
PNDIS_PACKET fc_bufown; // Incoming ndis packet
uint fc_MacHdrSize; // Media hdr size.
struct LinkEntry *fc_iflink; // link on which the packet is sent
Interface *fc_if2;
} FWContext;
#define PACKET_FROM_FWQ(_fwq_) \
(PNDIS_PACKET) \
((uchar *)(_fwq_) - (offsetof(struct FWContext, fc_q) + \
offsetof(NDIS_PACKET, ProtocolReserved)))
//* Route send queue structure. This consists of a dummy FWContext for use as
// a queue head, a count of sends pending on the interface, and a count of
// packets in the queue.
//
typedef struct RouteSendQ {
FWQ rsq_qh;
uint rsq_pending;
uint rsq_maxpending;
uint rsq_qlength;
uint rsq_running;
DEFINE_LOCK_STRUCTURE(rsq_lock)
} RouteSendQ;
//* Routing interface, a superset of the ordinary interface when we're
// configured as a router.
//
typedef struct RouteInterface {
Interface ri_if;
RouteSendQ ri_q;
} RouteInterface;
typedef struct RtChangeList {
struct RtChangeList *rt_next;
IPRouteNotifyOutput rt_info;
} RtChangeList;
extern IPMask IPMaskTable[];
#define IPNetMask(a) IPMaskTable[(*(uchar *)&(a)) >> 4]
#if DBG
#define Print DbgPrint
#else
#define Print
#endif
// Route Structures
//
typedef RouteTableEntry Route;
// Dest Definitions
extern USHORT MaxEqualCostRoutes;
#define DEFAULT_MAX_EQUAL_COST_ROUTES 1
#define MAXIMUM_MAX_EQUAL_COST_ROUTES 10
// Destination information structure
//
typedef struct DestinationEntry {
Route *firstRoute; // First route in list of routes on dest
USHORT maxBestRoutes; // Number of best route slots in array
USHORT numBestRoutes; // Actual number of best routes to dest
RouteTableEntry *bestRoutes[1]; // Equal cost best routes to same dest
} DestinationEntry;
typedef DestinationEntry Dest;
#define NULL_DEST(_pDest_) (_pDest_ == NULL)
// Route Macros
//
#define NEXT(_pRoute_) ((_pRoute_)->rte_next)
#define DEST(_pRoute_) ((_pRoute_)->rte_dest)
#define MASK(_pRoute_) ((_pRoute_)->rte_mask)
#define NHOP(_pRoute_) ((_pRoute_)->rte_addr)
#define LEN(_pRoute_) ((_pRoute_)->rte_priority)
#define METRIC(_pRoute_) ((_pRoute_)->rte_metric)
#define IF(_pRoute_) ((_pRoute_)->rte_if)
#define FLAGS(_pRoute_) ((_pRoute_)->rte_flags)
#define PROTO(_pRoute_) ((_pRoute_)->rte_proto)
#define NULL_ROUTE(_pRoute_) (_pRoute_ == NULL)
UINT AddrOnIF(Interface *IF, IPAddr Addr);
#endif // __IPRTDEF_H