/*++ Copyright (c) 1995 Microsoft Corporation Module Name: mibif.c Abstract: The IPX MIB Base and Interface Functions Author: Stefan Solomon 03/22/1995 Revision History: --*/ #include "precomp.h" #pragma hdrstop /*++ Function: MibGetIpxBase Descr: --*/ DWORD MibGetIpxBase(PIPX_MIB_INDEX mip, PIPXMIB_BASE BaseEntryp, PULONG BaseEntrySize) { PICB icbp; PACB acbp; if((BaseEntryp == NULL) || (*BaseEntrySize < sizeof(IPXMIB_BASE))) { *BaseEntrySize = sizeof(IPXMIB_BASE); return ERROR_INSUFFICIENT_BUFFER; } ACQUIRE_DATABASE_LOCK; BaseEntryp->OperState = OPER_STATE_UP; // Router is Up -> check that we have the internal interface bound to the // internal adapter. if((InternalInterfacep == NULL) || (InternalAdapterp == NULL)) { RELEASE_DATABASE_LOCK; return ERROR_CAN_NOT_COMPLETE; } icbp = InternalInterfacep; acbp = icbp->acbp; memcpy(BaseEntryp->PrimaryNetNumber, acbp->AdapterInfo.Network, 4); memcpy(BaseEntryp->Node, acbp->AdapterInfo.LocalNode, 6); GetInterfaceAnsiName(BaseEntryp->SysName, icbp->InterfaceNamep); BaseEntryp->MaxPathSplits = 1; BaseEntryp->IfCount = InterfaceCount; // fill in the dest count BaseEntryp->DestCount = RtmGetNetworkCount(RTM_PROTOCOL_FAMILY_IPX); // fill in the services count BaseEntryp->ServCount = GetServiceCount(); RELEASE_DATABASE_LOCK; return NO_ERROR; } VOID GetMibInterface(PICB icbp, PIPX_INTERFACE Ifp); /*++ Function: MibGetIpxInterface Descr: --*/ DWORD MibGetIpxInterface(PIPX_MIB_INDEX mip, PIPX_INTERFACE Ifp, PULONG IfSize) { PICB icbp; if((Ifp == NULL) || (*IfSize < sizeof(IPX_INTERFACE))) { *IfSize = sizeof(IPX_INTERFACE); return ERROR_INSUFFICIENT_BUFFER; } Ifp->InterfaceIndex = mip->InterfaceTableIndex.InterfaceIndex; ACQUIRE_DATABASE_LOCK; if((icbp = GetInterfaceByIndex(Ifp->InterfaceIndex)) == NULL) { RELEASE_DATABASE_LOCK; return ERROR_INVALID_PARAMETER; } GetMibInterface(icbp, Ifp); RELEASE_DATABASE_LOCK; return NO_ERROR; } /*++ Function: MibGetFirstIpxInterface Descr: --*/ DWORD MibGetFirstIpxInterface(PIPX_MIB_INDEX mip, PIPX_INTERFACE Ifp, PULONG IfSize) { PICB icbp; if((Ifp == NULL) || (*IfSize < sizeof(IPX_INTERFACE))) { *IfSize = sizeof(IPX_INTERFACE); return ERROR_INSUFFICIENT_BUFFER; } ACQUIRE_DATABASE_LOCK; if(IsListEmpty(&IndexIfList)) { RELEASE_DATABASE_LOCK; return ERROR_CAN_NOT_COMPLETE; } icbp = CONTAINING_RECORD(IndexIfList.Flink, ICB, IndexListLinkage); GetMibInterface(icbp, Ifp); RELEASE_DATABASE_LOCK; return NO_ERROR; } /*++ Function: MibGetNextIpxInterface Descr: --*/ DWORD MibGetNextIpxInterface(PIPX_MIB_INDEX mip, PIPX_INTERFACE Ifp, PULONG IfSize) { PICB icbp; PLIST_ENTRY lep; if((Ifp == NULL) || (*IfSize < sizeof(IPX_INTERFACE))) { *IfSize = sizeof(IPX_INTERFACE); return ERROR_INSUFFICIENT_BUFFER; } Ifp->InterfaceIndex = mip->InterfaceTableIndex.InterfaceIndex; // scan the ordered interface list until we get to this interface or to // an interface with a higher index (meaning this interface has been removed) ACQUIRE_DATABASE_LOCK; lep = IndexIfList.Flink; while(lep != &IndexIfList) { icbp = CONTAINING_RECORD(lep, ICB, IndexListLinkage); if(Ifp->InterfaceIndex == icbp->InterfaceIndex) { // found, get the next interface and return if(icbp->IndexListLinkage.Flink == &IndexIfList) { // this was the last entry in the list, stop here RELEASE_DATABASE_LOCK; return ERROR_NO_MORE_ITEMS; } icbp = CONTAINING_RECORD(icbp->IndexListLinkage.Flink, ICB, IndexListLinkage); GetMibInterface(icbp, Ifp); RELEASE_DATABASE_LOCK; return NO_ERROR; } if(Ifp->InterfaceIndex < icbp->InterfaceIndex) { // the interface has been removed. We return the next interface // in the index order GetMibInterface(icbp, Ifp); RELEASE_DATABASE_LOCK; return NO_ERROR; } else { lep = icbp->IndexListLinkage.Flink; } } // didn't find anything RELEASE_DATABASE_LOCK; return ERROR_NO_MORE_ITEMS; } /*++ Function: MibSetIpxInterface Descr: The SNMP manager can set the following parameters on an interface: - AdminState - NetbiosAccept - NetbiosDeliver --*/ DWORD MibSetIpxInterface(PIPX_MIB_ROW MibRowp) { PIPX_INTERFACE Ifp; FW_IF_INFO FwIfInfo; PICB icbp; Ifp = &MibRowp->Interface; ACQUIRE_DATABASE_LOCK; if((icbp = GetInterfaceByIndex(Ifp->InterfaceIndex)) == NULL) { RELEASE_DATABASE_LOCK; return ERROR_INVALID_PARAMETER; } // set the new states in the forwarder FwIfInfo.NetbiosAccept = Ifp->NetbiosAccept; FwIfInfo.NetbiosDeliver = Ifp->NetbiosDeliver; FwSetInterface(icbp->InterfaceIndex, &FwIfInfo); // if the current admin state doesn't match the new admin state, set the // new admin state. if(icbp->AdminState != Ifp->AdminState) { if(Ifp->AdminState == ADMIN_STATE_ENABLED) { AdminEnable(icbp); } else { AdminDisable(icbp); } } RELEASE_DATABASE_LOCK; return NO_ERROR; } /*++ Function: GetMibInterface Descr: Gets the ipx mib interface data from the router manager data structures. Remark: Called only in critical section --*/ VOID GetMibInterface(PICB icbp, PIPX_INTERFACE Ifp) { PACB acbp; FW_IF_INFO FwIfInfo; Ifp->InterfaceIndex = icbp->InterfaceIndex; // get the forwarder interface data FwGetInterface(icbp->InterfaceIndex, &FwIfInfo, &Ifp->IfStats); Ifp->AdminState = icbp->AdminState; Ifp->IfStats.IfOperState = icbp->OperState; Ifp->NetbiosAccept = FwIfInfo.NetbiosAccept; Ifp->NetbiosDeliver = FwIfInfo.NetbiosDeliver; // fill in the rest from the icb if(icbp->acbp) { acbp = icbp->acbp; Ifp->AdapterIndex = acbp->AdapterIndex; Ifp->MediaType = acbp->AdapterInfo.NdisMedium; if (Ifp->IfStats.IfOperState==OPER_STATE_UP) { memcpy(Ifp->NetNumber, acbp->AdapterInfo.Network, 4); memcpy(Ifp->MacAddress, acbp->AdapterInfo.LocalNode, 6); if (acbp->AdapterInfo.LinkSpeed>0) { ULONGLONG speed = 100i64*acbp->AdapterInfo.LinkSpeed; if (speedThroughput = (ULONG)speed; else Ifp->Throughput = MAXLONG; Ifp->Delay = (ULONG)(8000000i64/speed); } else { Ifp->Delay = 0; Ifp->Throughput = 0; } } else { memset(Ifp->NetNumber, 0 ,4); memset(Ifp->MacAddress, 0, 4); Ifp->Delay = 0; Ifp->Throughput = 0; } // !!! fill in delay and throughput from link speed } else { Ifp->AdapterIndex = 0; Ifp->MediaType = 0; memset(Ifp->NetNumber, 0 ,4); memset(Ifp->MacAddress, 0, 4); Ifp->Delay = 0; Ifp->Throughput = 0; } GetInterfaceAnsiName(Ifp->InterfaceName, icbp->InterfaceNamep); Ifp->InterfaceType = icbp->MIBInterfaceType; Ifp->EnableIpxWanNegotiation = icbp->EnableIpxWanNegotiation; }