210 lines
4.2 KiB
C
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);
|
||
|
|