/********************************************************************/ /** Microsoft LAN Manager **/ /** Copyright(c) Microsoft Corp., 1990-1992 **/ /********************************************************************/ /* :ts=4 */ //** IPROUTE.H - IP routing definitions. // // This file contains all of the definitions for routing code that are // visible to modules outside iproute.c #pragma once extern struct Interface *LookupNextHop(IPAddr Dest, IPAddr Src, IPAddr *FirstHop, uint *MTU); extern struct Interface *LookupNextHopWithBuffer(IPAddr Dest, IPAddr Src, IPAddr *FirstHop, uint *MTU, uchar Protocol, uchar *Buffer, uint Length, RouteCacheEntry **FwdRce, LinkEntry **Link, IPAddr HdrSrc, uint UnicastIf); extern struct Interface *LookupForwardingNextHop(IPAddr Dest, IPAddr Src, IPAddr *FirstHop, uint *MTU, uchar Protocol, uchar *Buffer, uint Length, RouteCacheEntry **FwdRce, LinkEntry **Link, IPAddr HdrSrc); extern void AddrTypeCacheFlush(IPAddr Address); extern uchar GetAddrType(IPAddr Address); extern uint InvalidSourceAddress(IPAddr Address); extern uchar GetLocalNTE(IPAddr Address, NetTableEntry **NTE); extern uchar IsBCastOnNTE(IPAddr Address, NetTableEntry *NTE); extern void IPForwardPkt(NetTableEntry *SrcNTE, IPHeader UNALIGNED *Header, uint HeaderLength, void *Data, uint BufferLength, NDIS_HANDLE LContext1, uint LContext2, uchar DestType, uint MAcHdrSize, PNDIS_BUFFER pNdisBuffer, uint *pClientcnt, void *LinkCtxt); extern void SendFWPacket(PNDIS_PACKET Packet, NDIS_STATUS Status, uint DataLength); extern uint AttachRCEToRTE(RouteCacheEntry *RCE, uchar Protocol, uchar *Buffer, uint Length); extern void Redirect(NetTableEntry *NTE, IPAddr RDSrc, IPAddr Target, IPAddr Src, IPAddr FirstHop); extern IP_STATUS AddRoute(IPAddr Destination, IPMask Mask, IPAddr FirstHop, Interface *OutIF, uint MTU, uint Metric, uint Proto, uint AType, ROUTE_CONTEXT Context, uint SetWithRefcnt); extern IP_STATUS DeleteRoute(IPAddr Destination, IPMask Mask, IPAddr FirstHop, Interface *OutIF, uint SetWithRefcnt); extern IP_STATUS DeleteDest(IPAddr Dest, IPMask Mask); extern ROUTE_CONTEXT GetRouteContext(IPAddr Destination, IPAddr Source); extern NetTableEntry *BestNTEForIF(IPAddr Dest, Interface *IF); extern void RTWalk(uint (*CallFunc)(struct RouteTableEntry *, void *, void *), void *Context, void *Context1); extern uint DeleteRTEOnIF(struct RouteTableEntry *RTE, void *Context, void *Context1); extern uint DeleteAllRTEOnIF(struct RouteTableEntry *RTE, void *Context, void *Context1); extern uint InvalidateRCEOnIF(struct RouteTableEntry *RTE, void *Context, void *Context1); extern uint SetMTUOnIF(struct RouteTableEntry *RTE, void *Context, void *Context1); extern uint SetMTUToAddr(struct RouteTableEntry *RTE, void *Context, void *Context1); extern uint AddNTERoutes(struct NetTableEntry *NTE); extern uint DelNTERoutes(struct NetTableEntry *NTE); extern void IPCheckRoute(IPAddr Dest, IPAddr Src, RouteCacheEntry *RCE, IPOptInfo *OptInfo, uint CheckRouteFlag); extern void RouteFragNeeded(IPHeader UNALIGNED *IPH, ushort NewMTU); extern IP_STATUS IPGetPInfo(IPAddr Dest, IPAddr Src, uint *NewMTU, uint *MaxPathSpeed, RouteCacheEntry *RCE); extern int InitRouting(struct IPConfigInfo *ci); extern uint InitNTERouting(NetTableEntry *NTE, uint NumGWs, IPAddr *GW, uint *GWMetric); extern uint InitGateway(struct IPConfigInfo *ci); extern uint GetIfConstraint(IPAddr Dest, IPAddr Src, IPOptInfo *OptInfo, BOOLEAN fIpsec); extern IPAddr OpenRCE(IPAddr Address, IPAddr Src, RouteCacheEntry **RCE, uchar *Type, ushort *MSS, IPOptInfo *OptInfo); extern void CloseRCE(RouteCacheEntry *RCE); extern uint IsRouteICMP(IPAddr Dest, IPMask Mask, IPAddr FirstHop, Interface *OutIF); NTSTATUS GetIFAndLink(void *RCE, uint* IFIndex, IPAddr *NextHop); extern void RtChangeNotifyCancel(PDEVICE_OBJECT DeviceObject, PIRP Irp); extern void RtChangeNotifyCancelEx(PDEVICE_OBJECT DeviceObject, PIRP Irp); extern void RtChangeNotify(IPRouteNotifyOutput *RNO); extern void RtChangeNotifyEx(IPRouteNotifyOutput *RNO); extern void InvalidateRCELinks(struct RouteTableEntry *RTE); extern CACHE_LINE_KSPIN_LOCK RouteTableLock; extern LIST_ENTRY RtChangeNotifyQueue; extern LIST_ENTRY RtChangeNotifyQueueEx; extern uint DeadGWDetect; extern uint PMTUDiscovery; extern uchar ForwardPackets; extern uchar RouterConfigured; // Pointer to callout routine for dial on demand. extern IPMapRouteToInterfacePtr DODCallout; // Pointer to packet filter handler. extern IPPacketFilterPtr ForwardFilterPtr; extern BOOLEAN ForwardFilterEnabled; extern uint ForwardFilterRefCount; extern CTEBlockStruc ForwardFilterBlock; extern void DerefFilterPtr(void); extern BOOLEAN NotifyFilterOfDiscard(NetTableEntry* NTE, IPHeader UNALIGNED* IPH, uchar* Data, uint DataSize); extern FORWARD_ACTION DummyFilterPtr(struct IPHeader UNALIGNED* PacketHeader, uchar* Packet, uint PacketLength, uint RecvInterfaceIndex, uint SendInterfaceIndex, IPAddr RecvLinkNextHop, IPAddr SendLinkNextHop); extern void SetDummyFilterPtr(IPPacketFilterPtr FilterPtr); extern uint RefFirewallQ(Queue** FirewallQ); extern void DerefFirewallQ(uint Handle); extern BOOLEAN ProcessFirewallQ(void); // Pointer to IPSEC handler extern IPSecHandlerRtn IPSecHandlerPtr; extern IPSecSendCompleteRtn IPSecSendCmpltPtr; #define IPADDR_LOCAL 0xffffffff // Indicates that IP address is // directly connected. #define IP_LOCAL_BCST 0xffffffff #define IP_ZERO_BCST 0 #define LOOPBACK_MSS 1500 // back to normal from // W2K value (32768 - sizeof(IPHeader)) #define LOOPBACK_ADDR 0x0100007f #define IP_LOOPBACK(x) (((x) & CLASSA_MASK) == 0x7f) #define ATYPE_PERM 0 // A permanent route. #define ATYPE_OVERRIDE 1 // Semi-permanent - can be // overriden. #define ATYPE_TEMP 2 // A temporary route. #define MAX_IP_HDR_SIZE 60 #define ICMP_HEADER_SIZE 8