You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
206 lines
5.0 KiB
206 lines
5.0 KiB
//=============================================================================
|
|
// 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; i<IF_HASHTABLE_SIZE; i++) {
|
|
|
|
InitializeListHead(&G_pIfTable->IfHashTable[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;
|
|
}
|