|
|
/*++
Copyright (c) 1997 - 98, Microsoft Corporation
Module Name:
pattrie.h
Abstract:
Contains interface for a best matching prefix lookup using an PATRICIA trie.
Author:
Chaitanya Kodeboyina (chaitk) 26-Sep-1998
Revision History:
--*/
#ifndef __ROUTING_PATLOOKUP_H__
#define __ROUTING_PATLOOKUP_H__
#include "lookup.h"
#define Print printf
#define BITS_IN_BYTE 8
#define NODE_KEY_SIZE sizeof(ULONG)
//
// Direction in Iterator
//
#define LCHILD 0
#define RCHILD 1
#define PARENT 2
typedef INT PAT_CHILD, *PPAT_CHILD;
//
// A node in the PAT trie
//
typedef struct _PAT_NODE *PPAT_NODE;
typedef struct _PAT_NODE { PPAT_NODE Child[2]; // Pointers to left & right child nodes
PVOID Data; // Opaque Pointer to data in the node
USHORT NumBits; // Actual number of bits in this node
ULONG KeyBits; // Value of bits to match in this node
} PAT_NODE;
//
// PAT trie for prefix matching
//
typedef struct _PAT_TRIE { PPAT_NODE TrieRoot; // Pointer to the PAT trie
USHORT MaxKeyBytes; // Max num of bytes in key
USHORT NumNodes; // Number of nodes in trie
#if PROF
ULONG MemoryInUse; // Total memory in use now
UINT NumAllocs; // Num of total allocations
UINT NumFrees; // Num of total free allocs
UINT NumInsertions; // Num of total insertions
UINT NumDeletions; // Num of total deletions
#endif
} PAT_TRIE, *PPAT_TRIE;
//
// Lookup context for a PAT trie
//
typedef struct _PAT_CONTEXT { PVOID BestNode; // Node with best the matching prefix
PVOID InsPoint; // Node to which new node is attached
PAT_CHILD InsChild; // Node should attached as this child
} PAT_CONTEXT, *PPAT_CONTEXT;
//
// Linkage Info Kept in Data
//
typedef struct _PAT_LINKAGE { PPAT_NODE NodePtr; // Back pointer to the owning node
} PAT_LINKAGE, *PPAT_LINKAGE;
#define SET_NODEPTR_INTO_DATA(Data, Node) ((PPAT_LINKAGE)Data)->NodePtr = Node
#define GET_NODEPTR_FROM_DATA(Data) ((PPAT_LINKAGE)Data)->NodePtr
//
// Macros for doing bit operations on keys
//
//
// MaskBitsArr[i] = First 'i' bits set to 1
//
const ULONG MaskBitsArr[] = { 0x00000000, 0x80000000, 0xC0000000, 0xE0000000, 0xF0000000, 0xF8000000, 0xFC000000, 0xFE000000, 0xFF000000, 0xFF800000, 0xFFC00000, 0xFFE00000, 0xFFF00000, 0xFFF80000, 0xFFFC0000, 0xFFFE0000, 0xFFFF0000, 0xFFFF8000, 0xFFFFC000, 0xFFFFE000, 0xFFFFF000, 0xFFFFF800, 0xFFFFFC00, 0xFFFFFE00, 0xFFFFFF00, 0xFFFFFF80, 0xFFFFFFC0, 0xFFFFFFE0, 0xFFFFFFF0, 0xFFFFFFF8, 0xFFFFFFFC, 0xFFFFFFFE, 0xFFFFFFFF };
#define PickMostSigNBits(ul, nb) ((ul) >> (NODE_KEY_SIZE - nb))
#define MaskBits(nb) MaskBitsArr[nb]
//
// Key Compare/Copy inlines
//
// Disable warnings for no return value
#pragma warning(disable:4035)
__inline ULONG RtmUlongByteSwap( IN ULONG Value ) { __asm { mov eax, Value bswap eax } }
#pragma warning(default:4035)
#define RtlUlongByteSwap RtmUlongByteSwap
#endif //__ROUTING_PATLOOKUP_H__
|