/*++ Copyright (c) 1997 Microsoft Corporation Module Name: strie.h Abstract: This module contains support definitions for an S-trie data stucture, that forms the slow path in a fast IP route lookup implementation. Author: Chaitanya Kodeboyina (chaitk) 26-Nov-1997 Revision History: --*/ #ifndef STRIE_H_INCLUDED #define STRIE_H_INCLUDED #include "trie.h" // // Constants // // Direction in Iterator #define LCHILD 0 #define RCHILD 1 #define PARENT 2 // // Structs // // A Node in an S-trie typedef struct _STrieNode STrieNode; struct _STrieNode { ULONG keyBits; // Value of addr bits to match in this node UINT numBits; // Actual num. of addr bits we are matching Dest *dest; // Destination starting the list of routes STrieNode *child[2]; // Pointer to the left and right child nodes }; // An STrie Data Structure typedef struct _STrie STrie; struct _STrie { STrieNode *trieRoot; // Pointer to the root of the trie ULONG availMemory; // Memory available for allocation UINT numDests; // Total Num of dests in the trie UINT numRoutes; // Total Num of routes in the trie UINT numNodes; // Total Num of nodes in the trie }; // An STrie Context Structure typedef struct _STrieCtxt STrieCtxt; struct _STrieCtxt { Route *pCRoute; // Pointer to current route in the trie ULONG currAddr; // Destination Addr of the current route ULONG currALen; // Length of the above destination addr }; // Specific Route Macros #define NewRouteInSTrie(_pSTrie_, _pNewRoute_, _pOldRoute_) \ { \ AllocMemory1(_pNewRoute_, \ sizeof(Route), \ (_pSTrie_)->availMemory); \ \ NdisZeroMemory(_pNewRoute_, sizeof(Route)); \ \ DEST(_pNewRoute_) = DEST(_pOldRoute_); \ MASK(_pNewRoute_) = MASK(_pOldRoute_); \ LEN(_pNewRoute_) = LEN(_pOldRoute_); \ METRIC(_pNewRoute_) = METRIC(_pOldRoute_); \ \ NEXT(_pNewRoute_) = NULL; \ FLAGS(_pNewRoute_) = RTE_NEW; \ \ (_pSTrie_)->numRoutes++; \ } \ #define FreeRouteInSTrie(_pSTrie_, _pOldRoute_) \ { \ FreeMemory1(_pOldRoute_, \ sizeof(Route), \ (_pSTrie_)->availMemory); \ \ (_pSTrie_)->numRoutes--; \ } // Specific Destination Macros #define NewDestInSTrie(_pSTrie_, _pRoute_, _pDest_) \ { \ AllocMemory1(_pDest_, \ (sizeof(Dest) - sizeof(Route *)\ + MaxEqualCostRoutes * \ sizeof(Route *)), \ (_pSTrie_)->availMemory); \ \ _pDest_->maxBestRoutes = MaxEqualCostRoutes;\ _pDest_->numBestRoutes = 0; \ \ _pDest_->firstRoute = _pRoute_; \ \ (_pSTrie_)->numDests++; \ } #define FreeDestInSTrie(_pSTrie_, _pOldDest_) \ { \ FreeMemory1(_pOldDest_, \ (sizeof(Dest) - sizeof(Route *) \ + MaxEqualCostRoutes * \ sizeof(Route *)), \ (_pSTrie_)->availMemory); \ \ (_pSTrie_)->numDests--; \ } // Specific STrieNode Macros #define NewSTrieNode(_pSTrie_, _pSTrieNode_, _numBits_, _keyBits_, _pDest_) \ { \ AllocMemory1(_pSTrieNode_, \ sizeof(STrieNode), \ (_pSTrie_)->availMemory); \ \ _pSTrieNode_->numBits = _numBits_; \ _pSTrieNode_->keyBits = _keyBits_; \ \ _pSTrieNode_->dest = _pDest_; \ \ _pSTrieNode_->child[0] = NULL; \ _pSTrieNode_->child[1] = NULL; \ \ (_pSTrie_)->numNodes++; \ } #define FreeSTrieNode(_pSTrie_, _pSTrieNode_) \ { \ FreeMemory1(_pSTrieNode_, \ sizeof(STrieNode), \ (_pSTrie_)->availMemory); \ \ (_pSTrie_)->numNodes--; \ } // Other Route, Dest Macros #define CopyRoutePtr(_ppRoute_, _pRoute_) \ if (_ppRoute_) \ { \ (*_ppRoute_) = _pRoute_; \ } \ #define CopyDestPtr(_ppDest_, _pDest_) \ if (_ppDest_) \ { \ (*_ppDest_) = _pDest_; \ } \ // Prototypes UINT CALLCONV InitSTrie (IN STrie *pSTrie, IN ULONG maxMemory); UINT CALLCONV InsertIntoSTrie (IN STrie *pSTrie, IN Route *pIncRoute, IN ULONG matchFlags, OUT Route **ppInsRoute, OUT Dest **ppOldBestDest, OUT Dest **ppNewBestDest, OUT Route **ppOldBestRoute); UINT CALLCONV DeleteFromSTrie (IN STrie *pSTrie, IN Route *pIncRoute, IN ULONG matchFlags, OUT Route **ppDelRoute, OUT Dest **ppOldBestDest, OUT Dest **ppNewBestDest, OUT Route **ppOldBestRoute); UINT CALLCONV SearchRouteInSTrie (IN STrie *pSTrie, IN ULONG routeDest, IN ULONG routeMask, IN ULONG routeNHop, IN PVOID routeOutIF, IN ULONG matchFlags, OUT Route **ppBestRoute); Dest * CALLCONV SearchAddrInSTrie (IN STrie *pSTrie, IN ULONG Addr); UINT CALLCONV IterateOverSTrie (IN STrie *pSTrie, IN STrieCtxt *pCtxt, OUT Route **ppNextRoute, OUT Dest **ppNextDest OPTIONAL); UINT CALLCONV IsSTrieIteratorValid (IN STrie *pSTrie, IN STrieCtxt *pCtxt); UINT CALLCONV CleanupSTrie (IN STrie *pSTrie); VOID CALLCONV CacheBestRoutesInDest (IN Dest *pDest); #if DBG VOID CALLCONV PrintSTrie (IN STrie *pSTrie, IN UINT fPrintAll); VOID CALLCONV PrintSTrieNode (IN STrieNode *pSTrieNode); #endif #endif // STRIE_H_INCLUDED