/*++ 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; }