//============================================================================ // Copyright (c) 1995, Microsoft Corporation // // File: table.h // // History: // Abolade Gbadegesin August 31, 1995 Created // // Interface table and stats tables declarations //============================================================================ #ifndef _TABLE_H_ #define _TABLE_H_ #define GETMODE_EXACT 0 #define GETMODE_FIRST 1 #define GETMODE_NEXT 2 // // TYPE DEFINITIONS FOR INTERFACE MANAGEMENT // // // struct: IF_TABLE_ENTRY // // declares the components of an interface table entry // typedef struct _IF_TABLE_ENTRY { LIST_ENTRY ITE_LinkByAddress; LIST_ENTRY ITE_LinkByIndex; LIST_ENTRY ITE_HTLinkByIndex; DWORD ITE_Index; DWORD ITE_Flags; IPBOOTP_IF_STATS ITE_Stats; PIPBOOTP_IF_CONFIG ITE_Config; PIPBOOTP_IF_BINDING ITE_Binding; SOCKET *ITE_Sockets; } IF_TABLE_ENTRY, *PIF_TABLE_ENTRY; #define ITEFLAG_BOUND ((DWORD)0x00000001) #define ITEFLAG_ENABLED ((DWORD)0x00000002) // // macros and definitions used by interface tables // #define IF_HASHTABLE_SIZE 29 #define IF_HASHVALUE(i) \ (((i) + ((i) >> 8) + ((i) >> 16) + ((i) >> 24)) % IF_HASHTABLE_SIZE) #define IF_IS_BOUND(i) \ ((i)->ITE_Flags & ITEFLAG_BOUND) #define IF_IS_ENABLED(i) \ ((i)->ITE_Flags & ITEFLAG_ENABLED) #define IF_IS_ACTIVE(i) \ (IF_IS_BOUND(i) && IF_IS_ENABLED(i)) #define IF_IS_UNBOUND(i) !IF_IS_BOUND(i) #define IF_IS_DISABLED(i) !IF_IS_ENABLED(i) #define IF_IS_INACTIVE(i) !IF_IS_ACTIVE(i) // // struct: IF_TABLE // // declares the structure of an interface table. consists of a hash-table // of IF_TABLE_ENTRY structures hashed on interface index, and a list // of all activated interfaces ordered by IP address // typedef struct _IF_TABLE { DWORD IT_Created; LIST_ENTRY IT_ListByAddress; LIST_ENTRY IT_ListByIndex; LIST_ENTRY IT_HashTableByIndex[IF_HASHTABLE_SIZE]; READ_WRITE_LOCK IT_RWL; } IF_TABLE, *PIF_TABLE; #define IF_TABLE_CREATED(pTable) ((pTable)->IT_Created == 0x12345678) DWORD CreateIfTable( PIF_TABLE pTable ); DWORD DeleteIfTable( PIF_TABLE pTable ); DWORD CreateIfEntry( PIF_TABLE pTable, DWORD dwIndex, PVOID pConfig ); DWORD DeleteIfEntry( PIF_TABLE pTable, DWORD dwIndex ); DWORD ValidateIfConfig( PIPBOOTP_IF_CONFIG pic ); DWORD CreateIfSocket( PIF_TABLE_ENTRY pITE ); DWORD DeleteIfSocket( PIF_TABLE_ENTRY pITE ); DWORD BindIfEntry( PIF_TABLE pTable, DWORD dwIndex, PIP_ADAPTER_BINDING_INFO pBinding ); DWORD UnBindIfEntry( PIF_TABLE pTable, DWORD dwIndex ); DWORD EnableIfEntry( PIF_TABLE pTable, DWORD dwIndex ); DWORD DisableIfEntry( PIF_TABLE pTable, DWORD dwIndex ); DWORD ConfigureIfEntry( PIF_TABLE pTable, DWORD dwIndex, PVOID pConfig ); PIF_TABLE_ENTRY GetIfByIndex( PIF_TABLE pTable, DWORD dwIndex ); PIF_TABLE_ENTRY GetIfByAddress( PIF_TABLE pTable, DWORD dwAddress, PDWORD pdwAddrIndex ); PIF_TABLE_ENTRY GetIfByListIndex( PIF_TABLE pTable, DWORD dwIndex, DWORD dwGetMode, PDWORD pdwErr ); DWORD InsertIfByAddress( PIF_TABLE pTable, PIF_TABLE_ENTRY pITE ); #endif