windows-nt/Source/XPSP1/NT/net/rras/ip/dvmrp/if1.c

207 lines
4.8 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
//=============================================================================
// 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;
}