/*++ Copyright (c) 1995 Microsoft Corporation Module Name: ifdbase.c Abstract: Functions to manipulate the interfaces database Author: Stefan Solomon 04/10/1995 Revision History: --*/ #include "precomp.h" #pragma hdrstop #define ifhashindex(IfIndex) (IfIndex) % IF_HASH_TABLE_SIZE // THESE FUNCTIONS ASSUME THE ROUTER MANAGER IS IN CRITICAL SECTION WHEN CALLED //*** // // Function: InitIfDB // // Descr: // //*** VOID InitIfDB(VOID) { int i; PLIST_ENTRY IfHtBucketp; IfHtBucketp = IndexIfHt; for(i=0; iInterfaceIndex); InsertTailList(&IndexIfHt[hv], &icbp->IndexHtLinkage); // insert in the list ordered by index lep = IndexIfList.Flink; while(lep != &IndexIfList) { list_icbp = CONTAINING_RECORD(lep, ICB, IndexListLinkage); if (list_icbp->InterfaceIndex > icbp->InterfaceIndex) { InsertTailList(lep, &icbp->IndexListLinkage); return; } lep = list_icbp->IndexListLinkage.Flink; } InsertTailList(lep, &icbp->IndexListLinkage); } //*** // // Function: RemoveIfFromDB // // Descr: Removes an interface from the interface data base // //*** VOID RemoveIfFromDB(PICB icbp) { RemoveEntryList(&icbp->IndexHtLinkage); RemoveEntryList(&icbp->IndexListLinkage); } PICB GetInterfaceByIndex(ULONG IfIndex) { PICB icbp; PLIST_ENTRY lep; int hv; hv = ifhashindex(IfIndex); lep = IndexIfHt[hv].Flink; while(lep != &IndexIfHt[hv]) { icbp = CONTAINING_RECORD(lep, ICB, IndexHtLinkage); if (icbp->InterfaceIndex == IfIndex) { return icbp; } lep = icbp->IndexHtLinkage.Flink; } return NULL; } PICB GetInterfaceByName(LPWSTR IfName) { PICB icbp; PLIST_ENTRY lep; lep = IndexIfList.Flink; while(lep != &IndexIfList) { icbp = CONTAINING_RECORD(lep, ICB, IndexListLinkage); if(!_wcsicmp(IfName, icbp->InterfaceNamep)) { // found ! return icbp; } lep = icbp->IndexListLinkage.Flink; } return NULL; } /*++ Function: GetInterfaceByAdapterName Descr: scans the list of interfaces looking for the adapter name on dedicated interfaces --*/ PICB GetInterfaceByAdapterName(LPWSTR AdapterName) { PICB icbp; PLIST_ENTRY lep; lep = IndexIfList.Flink; while(lep != &IndexIfList) { icbp = CONTAINING_RECORD(lep, ICB, IndexListLinkage); if(icbp->MIBInterfaceType == IF_TYPE_LAN) { if(!_wcsicmp(AdapterName, icbp->AdapterNamep)) { // found ! return icbp; } } lep = icbp->IndexListLinkage.Flink; } return NULL; } /*++ Function: GetInterfaceByAdptNameAndPktType Descr: Iterates through all interfaces looking for one that matches the given packet type and name. [pmay] I added this because some interface bindings weren't taking place during pnp because there would be multiple interfaces with the same adapter name whose binding depended on the packet type. --*/ PICB GetInterfaceByAdptNameAndPktType(LPWSTR AdapterName, DWORD dwType) { PICB icbp; PLIST_ENTRY lep; lep = IndexIfList.Flink; while(lep != &IndexIfList) { icbp = CONTAINING_RECORD(lep, ICB, IndexListLinkage); if(icbp->MIBInterfaceType == IF_TYPE_LAN) { if((_wcsicmp(AdapterName, icbp->AdapterNamep) == 0) && ((icbp->PacketType == AUTO_DETECT_PACKET_TYPE) || (icbp->PacketType == dwType))) { return icbp; } } lep = icbp->IndexListLinkage.Flink; } return NULL; } /*++ Function: EnumerateFirstInterfaceIndex Descr: returns the first interface index, if any Note: called with database lock held --*/ DWORD EnumerateFirstInterfaceIndex(PULONG InterfaceIndexp) { PICB icbp; if(!IsListEmpty(&IndexIfList)) { icbp = CONTAINING_RECORD(IndexIfList.Flink, ICB, IndexListLinkage); *InterfaceIndexp = icbp->InterfaceIndex; return NO_ERROR; } else { return ERROR_NO_MORE_ITEMS; } } /*++ Function: EnumerateNextInterfaceIndex Descr: returns next if index in the database Descr: called with database lock held --*/ DWORD EnumerateNextInterfaceIndex(PULONG InterfaceIndexp) { PLIST_ENTRY lep; PICB icbp; // scan the index if list until we find the next if index lep = IndexIfList.Flink; while(lep != &IndexIfList) { icbp = CONTAINING_RECORD(lep, ICB, IndexListLinkage); if (icbp->InterfaceIndex > *InterfaceIndexp) { *InterfaceIndexp = icbp->InterfaceIndex; return NO_ERROR; } lep = lep->Flink; } return ERROR_NO_MORE_ITEMS; }