windows-nt/Source/XPSP1/NT/net/rras/ipx/rip/mib.c
2020-09-26 16:20:57 +08:00

349 lines
5.6 KiB
C

/*++
Copyright (c) 1995 Microsoft Corporation
Module Name:
mib.c
Abstract:
Contains the MIB APIs
Author:
Stefan Solomon 07/06/1995
Revision History:
--*/
#include "precomp.h"
#pragma hdrstop
DWORD
WINAPI
MibCreate(
IN ULONG InputDataSize,
IN PVOID InputData
)
{
return ERROR_CAN_NOT_COMPLETE;
}
DWORD
WINAPI
MibDelete(
IN ULONG InputDataSize,
IN PVOID InputData
)
{
return ERROR_CAN_NOT_COMPLETE;
}
DWORD
WINAPI
MibGet(
IN ULONG InputDataSize,
IN PVOID InputData,
OUT PULONG OutputDataSize,
OUT PVOID OutputData
)
{
PRIP_MIB_GET_INPUT_DATA midp;
PRIPMIB_BASE mbp;
PRIP_INTERFACE mip;
DWORD rc = NO_ERROR;
PICB icbp;
ULONG GlobalInfoSize;
ACQUIRE_DATABASE_LOCK;
if(RipOperState != OPER_STATE_UP) {
RELEASE_DATABASE_LOCK;
return ERROR_CAN_NOT_COMPLETE;
}
midp = (PRIP_MIB_GET_INPUT_DATA)InputData;
switch(midp->TableId) {
case RIP_BASE_ENTRY:
if(*OutputDataSize < sizeof(RIPMIB_BASE)) {
*OutputDataSize = sizeof(RIPMIB_BASE);
rc = ERROR_INSUFFICIENT_BUFFER;
break;
}
mbp = (PRIPMIB_BASE)OutputData;
mbp->RIPOperState = RipOperState;
*OutputDataSize = sizeof(RIPMIB_BASE);
break;
case RIP_INTERFACE_TABLE:
if(*OutputDataSize < sizeof(RIPMIB_BASE)) {
*OutputDataSize = sizeof(RIP_INTERFACE);
rc = ERROR_INSUFFICIENT_BUFFER;
break;
}
if((icbp = GetInterfaceByIndex(midp->InterfaceIndex)) == NULL) {
*OutputDataSize = 0;
rc = ERROR_NO_MORE_ITEMS;
}
else
{
ACQUIRE_IF_LOCK(icbp);
mip = (PRIP_INTERFACE)OutputData;
mip->InterfaceIndex = icbp->InterfaceIndex;
mip->RipIfInfo = icbp->IfConfigInfo;
mip->RipIfStats = icbp->IfStats;
RELEASE_IF_LOCK(icbp);
*OutputDataSize = sizeof(RIP_INTERFACE);
rc = NO_ERROR;
}
break;
default:
rc = ERROR_CAN_NOT_COMPLETE;
break;
}
RELEASE_DATABASE_LOCK;
return rc;
}
DWORD
WINAPI
MibSet(
IN ULONG InputDataSize,
IN PVOID InputData
)
{
PRIP_MIB_SET_INPUT_DATA midp;
PICB icbp;
DWORD rc;
ACQUIRE_DATABASE_LOCK;
if(RipOperState != OPER_STATE_UP) {
RELEASE_DATABASE_LOCK;
return ERROR_CAN_NOT_COMPLETE;
}
if(InputDataSize < sizeof(RIP_MIB_SET_INPUT_DATA)) {
RELEASE_DATABASE_LOCK;
return ERROR_INVALID_PARAMETER;
}
midp = (PRIP_MIB_SET_INPUT_DATA)InputData;
switch(midp->TableId) {
case RIP_INTERFACE_TABLE:
if((icbp = GetInterfaceByIndex(midp->RipInterface.InterfaceIndex)) == NULL) {
rc = ERROR_NO_MORE_ITEMS;
}
else
{
rc = SetRipInterface(midp->RipInterface.InterfaceIndex,
&midp->RipInterface.RipIfInfo,
icbp->RipIfFiltersIp,
0); // no ipx admin state change
}
break;
default:
rc = ERROR_INVALID_PARAMETER;
break;
}
RELEASE_DATABASE_LOCK;
return rc;
}
DWORD
WINAPI
MibGetFirst(
IN ULONG InputDataSize,
IN PVOID InputData,
OUT PULONG OutputDataSize,
OUT PVOID OutputData
)
{
PRIP_MIB_GET_INPUT_DATA midp;
PRIP_INTERFACE mip;
DWORD rc = NO_ERROR;
PICB icbp;
ACQUIRE_DATABASE_LOCK;
if(RipOperState != OPER_STATE_UP) {
RELEASE_DATABASE_LOCK;
return ERROR_CAN_NOT_COMPLETE;
}
if(InputDataSize < sizeof(RIP_MIB_GET_INPUT_DATA)) {
RELEASE_DATABASE_LOCK;
return ERROR_INVALID_PARAMETER;
}
midp = (PRIP_MIB_GET_INPUT_DATA)InputData;
switch(midp->TableId) {
case RIP_INTERFACE_TABLE:
if(IsListEmpty(&IndexIfList)) {
*OutputDataSize = 0;
rc = ERROR_NO_MORE_ITEMS;
}
else
{
if(*OutputDataSize < sizeof(RIP_INTERFACE)) {
*OutputDataSize = sizeof(RIP_INTERFACE);
rc = ERROR_INSUFFICIENT_BUFFER;
break;
}
icbp = CONTAINING_RECORD(IndexIfList.Flink, ICB, IfListLinkage);
ACQUIRE_IF_LOCK(icbp);
mip = (PRIP_INTERFACE)OutputData;
mip->InterfaceIndex = icbp->InterfaceIndex;
mip->RipIfInfo = icbp->IfConfigInfo;
mip->RipIfStats = icbp->IfStats;
RELEASE_IF_LOCK(icbp);
*OutputDataSize = sizeof(RIP_INTERFACE);
rc = NO_ERROR;
}
break;
default:
rc = ERROR_INVALID_PARAMETER;
break;
}
RELEASE_DATABASE_LOCK;
return rc;
}
DWORD
WINAPI
MibGetNext(
IN ULONG InputDataSize,
IN PVOID InputData,
OUT PULONG OutputDataSize,
OUT PVOID OutputData
)
{
PRIP_MIB_GET_INPUT_DATA midp;
PRIP_INTERFACE mip;
DWORD rc = NO_ERROR;
PICB icbp;
PLIST_ENTRY lep;
ACQUIRE_DATABASE_LOCK;
if(RipOperState != OPER_STATE_UP) {
RELEASE_DATABASE_LOCK;
return ERROR_CAN_NOT_COMPLETE;
}
if(InputDataSize < sizeof(RIP_MIB_GET_INPUT_DATA)) {
RELEASE_DATABASE_LOCK;
return ERROR_INVALID_PARAMETER;
}
midp = (PRIP_MIB_GET_INPUT_DATA)InputData;
switch(midp->TableId) {
case RIP_INTERFACE_TABLE:
lep = IndexIfList.Flink;
rc = ERROR_NO_MORE_ITEMS;
while(lep != &IndexIfList)
{
icbp = CONTAINING_RECORD(lep, ICB, IfListLinkage);
if (icbp->InterfaceIndex > midp->InterfaceIndex) {
// found the next
if(*OutputDataSize < sizeof(RIP_INTERFACE)) {
*OutputDataSize = sizeof(RIP_INTERFACE);
rc = ERROR_INSUFFICIENT_BUFFER;
break;
}
ACQUIRE_IF_LOCK(icbp);
mip = (PRIP_INTERFACE)OutputData;
mip->InterfaceIndex = icbp->InterfaceIndex;
mip->RipIfInfo = icbp->IfConfigInfo;
mip->RipIfStats = icbp->IfStats;
RELEASE_IF_LOCK(icbp);
*OutputDataSize = sizeof(RIP_INTERFACE);
rc = NO_ERROR;
break;
}
lep = lep->Flink;
}
break;
default:
rc = ERROR_INVALID_PARAMETER;
break;
}
RELEASE_DATABASE_LOCK;
return rc;
}