//============================================================================= // Copyright (c) 1997 Microsoft Corporation // File Name: if.c // Abstract: // // Author: K.S.Lokesh (lokeshs@) 1-1-98 //============================================================================= #include "pchdvmrp.h" #pragma hdrstop //----------------------------------------------------------------------------- // _InitializeIfTable //----------------------------------------------------------------------------- DWORD InitializeIfTable( ) { DWORD Error = NO_ERROR; DWORD i; BEGIN_BREAKOUT_BLOCK1 { // // allocate memory for the interface table // G_pIfTable = DVMRP_ALLOC_AND_ZERO(sizeof(DVMRP_IF_TABLE)); PROCESS_ALLOC_FAILURE2(G_pIfTable, "interface table", Error, sizeof(DVMRP_IF_TABLE), GOTO_END_BLOCK1); // Initialize IfTable list InitializeListHead(&G_pIfTable->IfList); // // Initialize the IfList_CS and PeerLists_CS // try { InitializeCriticalSection(&G_pIfTable->IfList_CS); InitializeCriticalSection(&G_pIfTable->PeerLists_CS); } HANDLE_CRITICAL_SECTION_EXCEPTION(Error, GOTO_END_BLOCK1); // // allocate memory for the different buckets // G_pIfTable->IfHashTable = DVMRP_ALLOC(sizeof(LIST_ENTRY)*IF_HASHTABLE_SIZE); PROCESS_ALLOC_FAILURE2(G_pIfTable->IfHashTable, "interface table", Error, sizeof(LIST_ENTRY)*IF_HASHTABLE_SIZE, GOTO_END_BLOCK1); // // allocate memory for the array of pointers to If dynamic RWLs // G_pIfTable->aIfDRWL = DVMRP_ALLOC(sizeof(PDYNAMIC_RW_LOCK)*IF_HASHTABLE_SIZE); PROCESS_ALLOC_FAILURE2(G_pIfTable->aIfDRWL, "interface table", Error, sizeof(PDYNAMIC_RW_LOCK)*IF_HASHTABLE_SIZE, GOTO_END_BLOCK1); // // init locks to NULL, implying that the dynamic locks have not been // acquired. and initialize the list heads. // for (i=0; iIfHashTable[i]); G_pIfTable->aIfDRWL[i] = NULL; } } END_BREAKOUT_BLOCK1; if (Error != NO_ERROR) { DeinitializeIfTable(); } return Error; }//end _InitializeIfTable //----------------------------------------------------------------------------- // _DeInitializeIfTable //----------------------------------------------------------------------------- VOID DeinitializeIfTable( ) { PLIST_ENTRY pHead, ple; PIF_TABLE_ENTRY pite; if (G_pIfTable==NULL) return; // // go through the interface list and delete all interfaces // pHead = &G_pIfTable->IfList; for (ple=pHead->Flink; ple!=pHead; ple=ple->Flink) { ple = ple->Flink; pite = CONTAINING_RECORD(ple, IF_TABLE_ENTRY, Link); DeleteInterface(pite->IfIndex); } // delete the IfList_CS and PeerLists_CS DeleteCriticalSection(&G_pIfTable->IfList_CS); DeleteCriticalSection(&G_pIfTable->PeerLists_CS); // free array of If buckets and If DRWLocks, and the IfTable DVMRP_FREE(G_pIfTable->IfHashTable); DVMRP_FREE(G_pIfTable->aIfDRWL); DVMRP_FREE_AND_NULL(G_pIfTable); return; } //----------------------------------------------------------------------------- // _GetIfEntry // // returns the interface with the given index. // assumes the interface bucket is either read or write locked //----------------------------------------------------------------------------- PIF_TABLE_ENTRY GetIfEntry( DWORD IfIndex ) { PIF_TABLE_ENTRY pite = NULL; PLIST_ENTRY pHead, ple; pHead = GET_IF_HASH_BUCKET(Index); for (ple=pHead->Flink; ple!=pHead; ple=ple->Flink) { pite = CONTAINING_RECORD(ple, IF_TABLE_ENTRY, HTLink); if (pite->IfIndex == IfIndex) { break; } } return (ple == pHead) ? NULL: pite; } //----------------------------------------------------------------------------- // _GetIfByIndex // // returns the interface with the given index. // assumes the interface bucket is either read or write locked //----------------------------------------------------------------------------- PIF_TABLE_ENTRY GetIfByIndex( DWORD IfIndex ) { PIF_TABLE_ENTRY pite = NULL; PLIST_ENTRY pHead, ple; pHead = &G_pIfTable->IfHashTable[IF_HASH_VALUE(IfIndex)]; for (ple=pHead->Flink; ple!=pHead; ple=ple->Flink) { pite = CONTAINING_RECORD(ple, IF_TABLE_ENTRY, HTLink); if (pite->IfIndex == IfIndex) { break; } } return (ple == pHead) ? NULL: pite; }