Source code of Windows XP (NT5)
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.
|
|
/*++
Copyright (c) 1995 Microsoft Corporation
Module Name:
ifdbase.c
Abstract:
RIP Interface Data Base Manager All functions called with the database locked
Author:
Stefan Solomon 07/06/1995
Revision History:
--*/
#include "precomp.h"
#pragma hdrstop
#define ifhashindex(IfIndex) (IfIndex) % IF_INDEX_HASH_TABLE_SIZE
#define adapterhashindex(AdapterIndex) (AdapterIndex) % ADAPTER_INDEX_HASH_TABLE_SIZE
USHORT tickcount(UINT linkspeed);
VOID InitIfDbase(VOID) { int i; PLIST_ENTRY HtBucketp;
InitializeListHead(&IndexIfList);
InitializeListHead(&DiscardedIfList);
for(i=0, HtBucketp = IfIndexHt; i<IF_INDEX_HASH_TABLE_SIZE; i++, HtBucketp++) {
InitializeListHead(HtBucketp); }
for(i=0, HtBucketp = AdapterIndexHt; i<ADAPTER_INDEX_HASH_TABLE_SIZE; i++, HtBucketp++) {
InitializeListHead(HtBucketp); } }
PICB GetInterfaceByIndex(ULONG InterfaceIndex) { PLIST_ENTRY lep, hashbucketp; PICB icbp;
hashbucketp = &IfIndexHt[ifhashindex(InterfaceIndex)]; lep = hashbucketp->Flink;
while(lep != hashbucketp) {
icbp = CONTAINING_RECORD(lep, ICB, IfHtLinkage); if(icbp->InterfaceIndex == InterfaceIndex) {
return icbp; }
lep = lep->Flink; }
return NULL; }
PICB GetInterfaceByAdapterIndex(ULONG AdapterIndex) { PLIST_ENTRY lep, hashbucketp; PICB icbp;
hashbucketp = &AdapterIndexHt[adapterhashindex(AdapterIndex)]; lep = hashbucketp->Flink;
while(lep != hashbucketp) {
icbp = CONTAINING_RECORD(lep, ICB, AdapterHtLinkage); if(icbp->AdapterBindingInfo.AdapterIndex == AdapterIndex) {
return icbp; }
lep = lep->Flink; }
return NULL; }
VOID AddIfToDb(PICB icbp) { int hv; PLIST_ENTRY lep; PICB list_icbp; BOOL Done = FALSE;
hv = ifhashindex(icbp->InterfaceIndex); InsertTailList(&IfIndexHt[hv], &icbp->IfHtLinkage);
// insert in the list ordered by index
lep = IndexIfList.Flink;
while(lep != &IndexIfList) { list_icbp = CONTAINING_RECORD(lep, ICB, IfListLinkage); if (list_icbp->InterfaceIndex > icbp->InterfaceIndex) {
InsertTailList(lep, &icbp->IfListLinkage); Done = TRUE; break; }
lep = lep->Flink; }
if(!Done) {
InsertTailList(lep, &icbp->IfListLinkage); } }
VOID RemoveIfFromDb(PICB icbp) { RemoveEntryList(&icbp->IfListLinkage); RemoveEntryList(&icbp->IfHtLinkage); }
VOID BindIf(PICB icbp, PIPX_ADAPTER_BINDING_INFO BindingInfop) { int hv;
icbp->AdapterBindingInfo = *BindingInfop;
// set then tick count if not internal interface
if(icbp->InterfaceIndex != 0) {
icbp->LinkTickCount = tickcount(BindingInfop->LinkSpeed); }
hv = adapterhashindex(icbp->AdapterBindingInfo.AdapterIndex); InsertTailList(&AdapterIndexHt[hv], &icbp->AdapterHtLinkage); }
/*++
Function: UnbindIf
Descr: removes the if CB from the adapters hash table sets the adapter index in the if CB to INVALID_ADAPTER_INDEX
--*/
VOID UnbindIf(PICB icbp) { RemoveEntryList(&icbp->AdapterHtLinkage); icbp->AdapterBindingInfo.AdapterIndex = INVALID_ADAPTER_INDEX; }
/*++
Function: tickcount
Descr: gets nr of ticks to send a 576 bytes packet over this link
Argument: link speed as a multiple of 100 bps
--*/
USHORT tickcount(UINT linkspeed) { USHORT tc;
if(linkspeed == 0) {
return 1; }
if(linkspeed >= 10000) {
// link speed >= 1M bps
return 1; } else { // compute the necessary time to send a 576 bytes packet over this
// line and express it as nr of ticks.
// One tick = 55ms
// time in ms to send 576 bytes (assuming 10 bits/byte for serial line)
tc = 57600 / linkspeed;
// in ticks
tc = tc / 55 + 1; return tc; } }
|