windows-nt/Source/XPSP1/NT/net/tcpip/driver/ipv4/lookup.h
2020-09-26 16:20:57 +08:00

210 lines
4.2 KiB
C

/*++
Copyright (c) 1997 Microsoft Corporation
Module Name:
lookup.h
Abstract:
This module contains defines for a wrapper
that integrates the trie lookup into TCPIP.
Author:
Chaitanya Kodeboyina (chaitk) 11-Dec-1997
Revision History:
--*/
#pragma once
#include "strie.h"
#include "ftrie.h"
// Global Externs
extern Trie *RouteTable;
// Wrapper Routines
/*++
Routine Description:
Initializes the IP Route Table
Arguments:
None
Return Value:
STATUS_SUCCESS or Error Code
--*/
#define InitRouteTable(initflags, levelsBmp, fastTrieMem, slowTrieMem) \
CreateTrie(levelsBmp, initflags, slowTrieMem, fastTrieMem, &RouteTable)
/*++
Routine Description:
Searches for a route given a prefix
The route returned is a Semi-Read-
Only-Version. The following fields
should be changed only by calling
the InsRoute function -
1) Next,
2) Dest,
3) Mask,
4) Priority, &
5) Route Metric.
Remaining fields can be changed by
directly modifying returned route.
Arguments:
IN -
Dest - Destination IP Addr
Mask - Destination IP Mask
FirstHop - IP Addr of Next Hop
OutIF - Outgoing Interface
bFindFirst - Do not Match IF / not (for FindSpecificRTE)
fMatchFlags - Route fields to match (for FindMatchingRTE)
OUT -
PrevRTE - Value should be ignored
Return Value:
Matching RTE or NULL if not match
--*/
#define FindSpecificRTE(_Dest_, _Mask_, _FirstHop_, _OutIF_, _PrevRTE_, _bFindFirst_) \
((SearchRouteInTrie(RouteTable, _Dest_, _Mask_, _FirstHop_, _OutIF_, \
(!_bFindFirst_ * MATCH_INTF) | MATCH_NHOP, _PrevRTE_) \
== TRIE_SUCCESS) ? *_PrevRTE_ : NULL)
#define FindMatchingRTE(_Dest_, _Mask_, _FirstHop_, _OutIF_, _PrevRTE_, _fMatchFlags_) \
((SearchRouteInTrie(RouteTable, _Dest_, _Mask_, _FirstHop_, _OutIF_, \
_fMatchFlags_, _PrevRTE_) \
== TRIE_SUCCESS) ? *_PrevRTE_ : NULL)
/*
Routine Description:
Gets list of default routes in table.
The routes returned are a Semi-Read-
Only-Version. The following fields
should be changed only by calling
the InsRoute function -
1) Next,
2) Dest,
3) Mask,
4) Priority, &
5) Route Metric.
Remaining fields can be changed by
directly modifying returned route.
Replaces::
RouteTable[IPHash(0)] (or) RouteTable[0];
Arguments:
OUT -
ppDefRoute - Ptr to Ptr to list of
default routes.
Return Value:
Pointer to default routes, or NULL
*/
#define GetDefaultGWs(_ppDefRoute_) \
((SearchRouteInTrie(RouteTable, 0, 0, 0, NULL, MATCH_NONE, \
_ppDefRoute_) == TRIE_SUCCESS) ? *(_ppDefRoute_) : NULL)
/*++
Routine Description:
Frees memory for a route and adjusts
some global statistics
Arguments:
IN -
RTE - The RTE to be freed
Return Value:
None
--*/
#define CleanupRTE(_RTE_) DeleteRTE(NULL, _RTE_);
/*++
Routine Description:
Frees memory for a route
Arguments:
IN -
RTE - The RTE to be freed
Return Value:
None
--*/
#define FreeRoute(_RTE_) FreeRouteInTrie(RouteTable, _RTE_);
//
// Wrapper Prototypes
//
UINT
InsRoute(IPAddr Dest, IPMask Mask, IPAddr FirstHop, VOID *OutIF,
UINT Metric, ULONG MatchFlags, RouteTableEntry **ppInsRTE,
RouteTableEntry **ppOldBestRTE, RouteTableEntry **ppNewBestRTE);
UINT
DelRoute(IPAddr Dest, IPMask Mask, IPAddr FirstHop, VOID *OutIF,
ULONG MatchFlags, RouteTableEntry **ppDelRTE,
RouteTableEntry **ppOldBestRTE, RouteTableEntry **ppNewBestRTE);
RouteTableEntry *
FindRTE(IPAddr Dest, IPAddr Source, UINT Index, UINT MaxPri, UINT MinPri,
UINT UnicastIf);
RouteTableEntry *
LookupRTE(IPAddr Dest, IPAddr Source, UINT MaxPri, UINT UnicastIf);
RouteTableEntry *
LookupForwardRTE(IPAddr Dest, IPAddr Source, BOOLEAN Multipath);
UINT
GetNextRoute(VOID *Context, Route **ppRoute);
UINT
GetNextDest(VOID *Context, Dest **ppDest);
VOID
SortRoutesInDest(Dest *pDest);
VOID
SortRoutesInDestByRTE(Route *pRTE);
UINT
RTValidateContext(VOID *Context, UINT *Valid);