393 lines
6.8 KiB
C
393 lines
6.8 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 1995 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
mib.c
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
The MIB handling functions
|
||
|
|
||
|
Author:
|
||
|
|
||
|
Stefan Solomon 03/22/1995
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#include "precomp.h"
|
||
|
#pragma hdrstop
|
||
|
|
||
|
#define MIB_CALL_BEGIN {\
|
||
|
ACQUIRE_DATABASE_LOCK;\
|
||
|
if(RouterOperState != OPER_STATE_UP){\
|
||
|
RELEASE_DATABASE_LOCK;\
|
||
|
return ERROR_CAN_NOT_COMPLETE;\
|
||
|
}\
|
||
|
MibRefCounter++;\
|
||
|
RELEASE_DATABASE_LOCK;\
|
||
|
};
|
||
|
|
||
|
#define MIB_CALL_END {\
|
||
|
ACQUIRE_DATABASE_LOCK;\
|
||
|
MibRefCounter--;\
|
||
|
RELEASE_DATABASE_LOCK;\
|
||
|
return rc;\
|
||
|
};
|
||
|
|
||
|
|
||
|
DWORD
|
||
|
MibInvalidFunction(LPVOID p)
|
||
|
{
|
||
|
return ERROR_INVALID_FUNCTION;
|
||
|
}
|
||
|
|
||
|
typedef DWORD (*IPX_MIB_SET_HANDLER)(LPVOID);
|
||
|
typedef DWORD (*IPX_MIB_GET_HANDLER)(LPVOID, LPVOID, PULONG);
|
||
|
|
||
|
IPX_MIB_SET_HANDLER IpxMibCreate[MAX_IPX_MIB_TABLES] = {
|
||
|
|
||
|
MibInvalidFunction, // Create Base
|
||
|
MibInvalidFunction, // CreateInterface
|
||
|
MibInvalidFunction, // Create Route
|
||
|
MibCreateStaticRoute,
|
||
|
MibInvalidFunction, // Create Service
|
||
|
MibCreateStaticService
|
||
|
|
||
|
};
|
||
|
|
||
|
|
||
|
DWORD
|
||
|
MibCreate(ULONG ProtocolId,
|
||
|
ULONG InputDataSize,
|
||
|
PVOID InputData)
|
||
|
{
|
||
|
PIPX_MIB_SET_INPUT_DATA msip;
|
||
|
PRPCB rpcbp;
|
||
|
DWORD rc;
|
||
|
|
||
|
MIB_CALL_BEGIN;
|
||
|
|
||
|
if(ProtocolId == IPX_PROTOCOL_BASE) {
|
||
|
|
||
|
if(InputDataSize != sizeof(IPX_MIB_SET_INPUT_DATA)) {
|
||
|
|
||
|
rc = ERROR_CAN_NOT_COMPLETE;
|
||
|
goto Exit;
|
||
|
}
|
||
|
|
||
|
msip = (PIPX_MIB_SET_INPUT_DATA)InputData;
|
||
|
|
||
|
rc = (*IpxMibCreate[msip->TableId])(&msip->MibRow);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// to be routed to one of our routing protocols
|
||
|
if((rpcbp = GetRoutingProtocolCB(ProtocolId)) == NULL) {
|
||
|
|
||
|
rc = ERROR_CAN_NOT_COMPLETE;
|
||
|
goto Exit;
|
||
|
}
|
||
|
|
||
|
rc = (*rpcbp->RP_MibCreate)(InputDataSize, InputData);
|
||
|
}
|
||
|
|
||
|
Exit:
|
||
|
|
||
|
MIB_CALL_END;
|
||
|
|
||
|
return rc;
|
||
|
}
|
||
|
|
||
|
IPX_MIB_SET_HANDLER IpxMibDelete[MAX_IPX_MIB_TABLES] = {
|
||
|
|
||
|
MibInvalidFunction, // Delete Base
|
||
|
MibInvalidFunction, // DeleteInterface
|
||
|
MibInvalidFunction, // Delete Route
|
||
|
MibDeleteStaticRoute,
|
||
|
MibInvalidFunction, // Delete Service
|
||
|
MibDeleteStaticService
|
||
|
|
||
|
};
|
||
|
|
||
|
DWORD
|
||
|
MibDelete(ULONG ProtocolId,
|
||
|
ULONG InputDataSize,
|
||
|
PVOID InputData)
|
||
|
{
|
||
|
PIPX_MIB_SET_INPUT_DATA msip;
|
||
|
PRPCB rpcbp;
|
||
|
DWORD rc;
|
||
|
|
||
|
MIB_CALL_BEGIN;
|
||
|
|
||
|
if(ProtocolId == IPX_PROTOCOL_BASE) {
|
||
|
|
||
|
if(InputDataSize != sizeof(IPX_MIB_SET_INPUT_DATA)) {
|
||
|
|
||
|
rc = ERROR_CAN_NOT_COMPLETE;
|
||
|
goto Exit;
|
||
|
}
|
||
|
|
||
|
msip = (PIPX_MIB_SET_INPUT_DATA)InputData;
|
||
|
|
||
|
rc = (*IpxMibDelete[msip->TableId])(&msip->MibRow);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// to be routed to one of our routing protocols
|
||
|
if((rpcbp = GetRoutingProtocolCB(ProtocolId)) == NULL) {
|
||
|
|
||
|
rc = ERROR_CAN_NOT_COMPLETE;
|
||
|
goto Exit;
|
||
|
}
|
||
|
|
||
|
rc = (*rpcbp->RP_MibDelete)(InputDataSize, InputData);
|
||
|
}
|
||
|
|
||
|
Exit:
|
||
|
|
||
|
MIB_CALL_END;
|
||
|
|
||
|
return rc;
|
||
|
}
|
||
|
|
||
|
IPX_MIB_SET_HANDLER IpxMibSet[MAX_IPX_MIB_TABLES] = {
|
||
|
|
||
|
MibInvalidFunction, // Set Base
|
||
|
MibSetIpxInterface, // SetInterface
|
||
|
MibInvalidFunction, // Set Route
|
||
|
MibSetStaticRoute,
|
||
|
MibInvalidFunction, // Set Service
|
||
|
MibSetStaticService
|
||
|
|
||
|
};
|
||
|
|
||
|
DWORD
|
||
|
MibSet(ULONG ProtocolId,
|
||
|
ULONG InputDataSize,
|
||
|
PVOID InputData)
|
||
|
{
|
||
|
PIPX_MIB_SET_INPUT_DATA msip;
|
||
|
PRPCB rpcbp;
|
||
|
DWORD rc;
|
||
|
|
||
|
MIB_CALL_BEGIN;
|
||
|
|
||
|
if(ProtocolId == IPX_PROTOCOL_BASE) {
|
||
|
|
||
|
if(InputDataSize != sizeof(IPX_MIB_SET_INPUT_DATA)) {
|
||
|
|
||
|
rc = ERROR_CAN_NOT_COMPLETE;
|
||
|
goto Exit;
|
||
|
}
|
||
|
|
||
|
msip = (PIPX_MIB_SET_INPUT_DATA)InputData;
|
||
|
|
||
|
rc = (*IpxMibSet[msip->TableId])(&msip->MibRow);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// to be routed to one of our routing protocols
|
||
|
if((rpcbp = GetRoutingProtocolCB(ProtocolId)) == NULL) {
|
||
|
|
||
|
rc = ERROR_CAN_NOT_COMPLETE;
|
||
|
goto Exit;
|
||
|
}
|
||
|
|
||
|
rc = (*rpcbp->RP_MibSet)(InputDataSize, InputData);
|
||
|
}
|
||
|
|
||
|
Exit:
|
||
|
|
||
|
MIB_CALL_END;
|
||
|
|
||
|
return rc;
|
||
|
}
|
||
|
|
||
|
IPX_MIB_GET_HANDLER IpxMibGet[MAX_IPX_MIB_TABLES] = {
|
||
|
|
||
|
MibGetIpxBase,
|
||
|
MibGetIpxInterface,
|
||
|
MibGetRoute,
|
||
|
MibGetStaticRoute,
|
||
|
MibGetService,
|
||
|
MibGetStaticService
|
||
|
|
||
|
};
|
||
|
|
||
|
DWORD
|
||
|
MibGet(ULONG ProtocolId,
|
||
|
ULONG InputDataSize,
|
||
|
PVOID InputData,
|
||
|
PULONG OutputDataSize,
|
||
|
PVOID OutputData)
|
||
|
{
|
||
|
PIPX_MIB_GET_INPUT_DATA mgip;
|
||
|
PRPCB rpcbp;
|
||
|
DWORD rc;
|
||
|
|
||
|
MIB_CALL_BEGIN;
|
||
|
|
||
|
if(ProtocolId == IPX_PROTOCOL_BASE) {
|
||
|
|
||
|
if(InputDataSize != sizeof(IPX_MIB_GET_INPUT_DATA)) {
|
||
|
|
||
|
rc = ERROR_CAN_NOT_COMPLETE;
|
||
|
goto Exit;
|
||
|
}
|
||
|
|
||
|
mgip = (PIPX_MIB_GET_INPUT_DATA)InputData;
|
||
|
|
||
|
rc = (*IpxMibGet[mgip->TableId])(&mgip->MibIndex,
|
||
|
OutputData,
|
||
|
OutputDataSize);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// to be demux to one of our routing protocols
|
||
|
if((rpcbp = GetRoutingProtocolCB(ProtocolId)) == NULL) {
|
||
|
|
||
|
rc = ERROR_CAN_NOT_COMPLETE;
|
||
|
goto Exit;
|
||
|
}
|
||
|
|
||
|
rc = (*rpcbp->RP_MibGet)(InputDataSize,
|
||
|
InputData,
|
||
|
OutputDataSize,
|
||
|
OutputData);
|
||
|
|
||
|
}
|
||
|
|
||
|
Exit:
|
||
|
|
||
|
MIB_CALL_END;
|
||
|
|
||
|
return rc;
|
||
|
}
|
||
|
|
||
|
IPX_MIB_GET_HANDLER IpxMibGetFirst[MAX_IPX_MIB_TABLES] = {
|
||
|
|
||
|
MibGetIpxBase,
|
||
|
MibGetFirstIpxInterface,
|
||
|
MibGetFirstRoute,
|
||
|
MibGetFirstStaticRoute,
|
||
|
MibGetFirstService,
|
||
|
MibGetFirstStaticService
|
||
|
|
||
|
};
|
||
|
|
||
|
DWORD
|
||
|
MibGetFirst(ULONG ProtocolId,
|
||
|
ULONG InputDataSize,
|
||
|
PVOID InputData,
|
||
|
PULONG OutputDataSize,
|
||
|
PVOID OutputData)
|
||
|
{
|
||
|
PIPX_MIB_GET_INPUT_DATA mgip;
|
||
|
PRPCB rpcbp;
|
||
|
DWORD rc;
|
||
|
|
||
|
MIB_CALL_BEGIN;
|
||
|
|
||
|
if(ProtocolId == IPX_PROTOCOL_BASE) {
|
||
|
|
||
|
if(InputDataSize != sizeof(IPX_MIB_GET_INPUT_DATA)) {
|
||
|
|
||
|
rc = ERROR_CAN_NOT_COMPLETE;
|
||
|
goto Exit;
|
||
|
}
|
||
|
|
||
|
mgip = (PIPX_MIB_GET_INPUT_DATA)InputData;
|
||
|
|
||
|
rc = (*IpxMibGetFirst[mgip->TableId])(&mgip->MibIndex,
|
||
|
OutputData,
|
||
|
OutputDataSize);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// to be demux to one of our routing protocols
|
||
|
if((rpcbp = GetRoutingProtocolCB(ProtocolId)) == NULL) {
|
||
|
|
||
|
rc = ERROR_CAN_NOT_COMPLETE;
|
||
|
goto Exit;
|
||
|
}
|
||
|
|
||
|
rc = (*rpcbp->RP_MibGetFirst)(InputDataSize,
|
||
|
InputData,
|
||
|
OutputDataSize,
|
||
|
OutputData);
|
||
|
}
|
||
|
|
||
|
Exit:
|
||
|
|
||
|
MIB_CALL_END;
|
||
|
|
||
|
return rc;
|
||
|
}
|
||
|
|
||
|
IPX_MIB_GET_HANDLER IpxMibGetNext[MAX_IPX_MIB_TABLES] = {
|
||
|
|
||
|
MibGetIpxBase,
|
||
|
MibGetNextIpxInterface,
|
||
|
MibGetNextRoute,
|
||
|
MibGetNextStaticRoute,
|
||
|
MibGetNextService,
|
||
|
MibGetNextStaticService
|
||
|
|
||
|
};
|
||
|
|
||
|
|
||
|
DWORD
|
||
|
MibGetNext(ULONG ProtocolId,
|
||
|
ULONG InputDataSize,
|
||
|
PVOID InputData,
|
||
|
PULONG OutputDataSize,
|
||
|
PVOID OutputData)
|
||
|
{
|
||
|
PIPX_MIB_GET_INPUT_DATA mgip;
|
||
|
PRPCB rpcbp;
|
||
|
DWORD rc;
|
||
|
|
||
|
MIB_CALL_BEGIN;
|
||
|
|
||
|
if(ProtocolId == IPX_PROTOCOL_BASE) {
|
||
|
|
||
|
if(InputDataSize != sizeof(IPX_MIB_GET_INPUT_DATA)) {
|
||
|
|
||
|
rc = ERROR_CAN_NOT_COMPLETE;
|
||
|
goto Exit;
|
||
|
}
|
||
|
|
||
|
mgip = (PIPX_MIB_GET_INPUT_DATA)InputData;
|
||
|
|
||
|
rc = (*IpxMibGetNext[mgip->TableId])(&mgip->MibIndex,
|
||
|
OutputData,
|
||
|
OutputDataSize);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// to be demux to one of our routing protocols
|
||
|
if((rpcbp = GetRoutingProtocolCB(ProtocolId)) == NULL) {
|
||
|
|
||
|
rc = ERROR_CAN_NOT_COMPLETE;
|
||
|
goto Exit;
|
||
|
}
|
||
|
|
||
|
rc = (*rpcbp->RP_MibGetNext)(InputDataSize,
|
||
|
InputData,
|
||
|
OutputDataSize,
|
||
|
OutputData);
|
||
|
}
|
||
|
|
||
|
Exit:
|
||
|
|
||
|
MIB_CALL_END;
|
||
|
|
||
|
return rc;
|
||
|
}
|