|
|
/*++
Copyright (c) 1997 Microsoft Corporation
Module Name:
ftrie.h
Abstract:
This module contains support definitions for an F-trie data stucture, that forms the fast path in a fast IP route lookup implementation.
Author:
Chaitanya Kodeboyina (chaitk) 26-Nov-1997
Revision History:
--*/ #ifndef FTRIE_H_INCLUDED
#define FTRIE_H_INCLUDED
#include "trie.h"
//
// Constants
//
// State of the trie
#define NORMAL 0
#define PARTIAL 1
//
// Structs
//
// A Node in an F-Trie
typedef struct _FTrieNode FTrieNode;
#pragma warning(push)
#pragma warning(disable:4200) // nonstandard extension used: zero sized array
struct _FTrieNode { LIST_ENTRY linkage; // Linkage into list of nodes on the F-Trie
Dest *comDest; // Dest for this subtree's common prefix
UINT numDests; // Number of dests in this node's subtree
UINT numBits; // Number of addr bits to get to children
FTrieNode *child[0]; // Child Node (Or) Info Ptr Array [Var Len]
};
#pragma warning(pop)
// An FTrie Data Structure
typedef struct _FTrie FTrie;
struct _FTrie { FTrieNode *trieRoot; // Pointer to the root of the FTrie
ULONG availMemory; // Memory available for allocation
LIST_ENTRY listofNodes; // List of nodes allocated on FTrie
UINT numLevels; // Total num of levels in the FTrie
UINT *bitsInLevel; // Num of index bits in each level
UINT *numDestsInOrigLevel; // Num of dests in each original level
UINT *numNodesInExpnLevel; // Num of nodes in each expanded level
UINT *numDestsInExpnLevel; // Num of dests in each expanded level
};
// Specific Dest Macros
#define StoreDestPtr(_p_) (FTrieNode *) ((ULONG_PTR) _p_ + 1)
#define RestoreDestPtr(_p_) (Dest *) ((ULONG_PTR) _p_ - 1)
#define IsPtrADestPtr(_p_) (BOOLEAN) ((ULONG_PTR) _p_ & 1)
#define ReplaceDestPtr(_pNewDest_, _pOldDest_, _ppDest_) \
if (*_ppDest_ == _pOldDest_) \ { \ *_ppDest_ = _pNewDest_; \ } \
// Specific FTrieNode Macros
#define NewFTrieNode(_pFTrie_, _pFTrieNode_, _numBits_, _pDest_) \
{ \ UINT __i; \ UINT __numChild = 1 << _numBits_; \ UINT __numBytes = sizeof(FTrieNode) + \ __numChild * sizeof(PVOID); \ \ if (_numBits_ > 7*sizeof(PVOID)) \ { \ Recover("Unable to Allocate Memory", \ (UINT) ERROR_TRIE_RESOURCES); \ } \ \ AllocMemory2(_pFTrieNode_, \ __numBytes, \ _pFTrie_->availMemory); \ \ InsertHeadList(&_pFTrie_->listofNodes, \ &_pFTrieNode_->linkage); \ /* \
DbgPrint("Allocating FTNode @ %08x\n", \ _pFTrieNode_); \ */ \ _pFTrieNode_->numDests = 0; \ \ _pFTrieNode_->comDest = _pDest_; \ \ _pFTrieNode_->numBits = _numBits_; \ \ for (__i = 0; __i < __numChild; __i++) \ { \ _pFTrieNode_->child[__i] = \ StoreDestPtr(NULL); \ } \ } \
#define FreeFTrieNode(_pFTrie_, _pFTrieNode_) \
{ \ UINT __numChild = 1 << _pFTrieNode_->numBits;\ UINT __numBytes = sizeof(FTrieNode) + \ __numChild * sizeof(PVOID); \ \ RemoveEntryList(&_pFTrieNode_->linkage); \ /* \
DbgPrint("Freeing FTNode @ %08x\n", \ _pFTrieNode_); \ */ \ FreeMemory1(_pFTrieNode_, \ __numBytes, \ _pFTrie_->availMemory); \ } \
// Prototypes
UINT CALLCONV InitFTrie (IN FTrie *pFTrie, IN ULONG levels, IN ULONG maxMemory);
UINT CALLCONV InsertIntoFTrie (IN FTrie *pFTrie, IN Route *pInsRoute, IN Dest *pInsDest, IN Dest *pOldDest);
UINT CALLCONV DeleteFromFTrie (IN FTrie *pFTrie, IN Route *pDelRoute, IN Dest *pDelDest, IN Dest *pNewDest, IN BOOLEAN trieState);
UINT CALLCONV SearchDestInFTrie (IN FTrie *pFTrie, IN Dest *pSerDest, OUT UINT *pNumPtrs, OUT Dest **pStartPtr);
Dest * CALLCONV SearchAddrInFTrie (IN FTrie *pFTrie, IN ULONG Addr);
UINT CALLCONV CleanupFTrie (IN FTrie *pFTrie);
#if DBG
VOID CALLCONV PrintFTrie (IN FTrie *pFTrie, IN UINT fPrintAll);
VOID CALLCONV PrintFTrieNode (IN FTrieNode *pFTrieNode, IN UINT levelNumber);
#endif // DBG
#endif // FTRIE_H_INCLUDED
|