windows-nt/Source/XPSP1/NT/net/tcpip/snmp/mibfuncs.c
2020-09-26 16:20:57 +08:00

2966 lines
89 KiB
C

/*++
Copyright (c) 1996 Microsoft Corporation
Module Name:
Abstract:
Author:
Revision History:
--*/
#include "allinc.h"
#include "oid.h"
//
// Values of InetAddressType.
//
typedef enum {
INET_ADDRESS_TYPE_UNKNOWN = 0,
INET_ADDRESS_TYPE_IPv4 = 1,
INET_ADDRESS_TYPE_IPv6 = 2
} INET_ADDRESS_TYPE;
UINT
MibGetIfNumber(
UINT actionId,
AsnAny *objectArray,
UINT *errorIndex
)
{
DWORD dwResult;
PIF_NUMBER_GET pOutput;
TraceEnter("MibGetIfNumber");
dwResult = UpdateCache(MIB_II_IF);
if(dwResult isnot NO_ERROR)
{
TRACE1("Couldnt update IF cache. Error %d", dwResult);
TraceLeave("MibGetIfNumber");
return dwResult;
}
pOutput = (PIF_NUMBER_GET)objectArray;
EnterReader(MIB_II_IF);
SetAsnInteger(&(pOutput->ifNumber),g_Cache.pRpcIfTable->dwNumEntries);
ReleaseLock(MIB_II_IF);
TraceLeave("MibGetIfNumber");
return MIB_S_SUCCESS;
}
UINT
MibGetIfEntry(
UINT actionId,
AsnAny *objectArray,
UINT *errorIndex
)
{
DWORD dwResult;
PMIB_IFROW pRpcIf;
PIF_ENTRY_GET pOutput;
TraceEnter("MibGetIfEntry");
dwResult = UpdateCache(MIB_II_IF);
if(dwResult isnot NO_ERROR)
{
TRACE1("Couldnt update IF cache. Error %d",dwResult);
TraceLeave("MibGetIfEntry");
return dwResult;
}
pOutput = (PIF_ENTRY_GET)objectArray;
EnterReader(MIB_II_IF);
pRpcIf = LocateIfRow(actionId,
&(pOutput->ifIndex));
if(pRpcIf is NULL)
{
ReleaseLock(MIB_II_IF);
TRACE2("Unable to locate IF Row. Action is %d. Index is %d",
actionId,
GetAsnInteger(&(pOutput->ifIndex),-1));
TraceLeave("MibGetIfEntry");
if(actionId is MIB_ACTION_GETNEXT)
{
return MIB_S_NO_MORE_ENTRIES;
}
return MIB_S_ENTRY_NOT_FOUND;
}
ForceSetAsnInteger(&(pOutput->ifIndex),pRpcIf->dwIndex);
// SetAsnDispString(&(pOutput->ifDescr),
SetAsnOctetString(&(pOutput->ifDescr),
pOutput->rgbyIfDescrInfo,
pRpcIf->bDescr,
min(pRpcIf->dwDescrLen,MAX_IF_DESCR_LEN));
SetAsnInteger(&(pOutput->ifType),pRpcIf->dwType);
SetAsnInteger(&(pOutput->ifMtu),pRpcIf->dwMtu);
SetAsnGauge(&(pOutput->ifSpeed),pRpcIf->dwSpeed);
SetAsnOctetString(&(pOutput->ifPhysAddress),
pOutput->rgbyIfPhysAddressInfo,
pRpcIf->bPhysAddr,
pRpcIf->dwPhysAddrLen);
/*if(!IsAsnTypeNull(&(pOutput->ifPhysAddress)))
{
pOutput->ifPhysAddress.asnValue.string.length = pRpcIf->dwPhysAddrLen;
pOutput->ifPhysAddress.asnValue.string.stream = pOutput->rgbyIfPhysAddressInfo;
CopyMemory(pOutput->rgbyIfPhysAddressInfo,
pRpcIf->rgbyPhysAddr,
pRpcIf->dwPhysAddrLen);
}*/
SetAsnInteger(&(pOutput->ifAdminStatus), pRpcIf->dwAdminStatus);
SetAsnInteger(&(pOutput->ifOperStatus), pRpcIf->dwOperStatus);
SetAsnTimeTicks(&(pOutput->ifLastChange), SnmpSvcGetUptimeFromTime(pRpcIf->dwLastChange));
SetAsnCounter(&(pOutput->ifInOctets), pRpcIf->dwInOctets);
SetAsnCounter(&(pOutput->ifInUcastPkts), pRpcIf->dwInUcastPkts);
SetAsnCounter(&(pOutput->ifInNUcastPkts), pRpcIf->dwInNUcastPkts);
SetAsnCounter(&(pOutput->ifInDiscards), pRpcIf->dwInDiscards);
SetAsnCounter(&(pOutput->ifInErrors), pRpcIf->dwInErrors);
SetAsnCounter(&(pOutput->ifInUnknownProtos), pRpcIf->dwInUnknownProtos);
SetAsnCounter(&(pOutput->ifOutOctets), pRpcIf->dwOutOctets);
SetAsnCounter(&(pOutput->ifOutUcastPkts), pRpcIf->dwOutUcastPkts);
SetAsnCounter(&(pOutput->ifOutNUcastPkts), pRpcIf->dwOutNUcastPkts);
SetAsnCounter(&(pOutput->ifOutDiscards), pRpcIf->dwOutDiscards);
SetAsnCounter(&(pOutput->ifOutErrors), pRpcIf->dwOutErrors);
SetAsnGauge(&(pOutput->ifOutQLen), pRpcIf->dwOutQLen);
SetToZeroOid(&(pOutput->ifSpecific));
ReleaseLock(MIB_II_IF);
TraceLeave("MibGetIfEntry");
return MIB_S_SUCCESS;
}
UINT
MibSetIfEntry(
UINT actionId,
AsnAny *objectArray,
UINT *errorIndex
)
{
DWORD dwResult,dwStatus;
PMIB_IFROW pRpcIf;
PIF_ENTRY_SET pInput;
PMIB_OPAQUE_INFO pInfo;
PMIB_IFROW pSetRow;
pInput = (PIF_ENTRY_SET)objectArray;
pInfo = (PMIB_OPAQUE_INFO)(pInput->rgdwSetBuffer);
pSetRow = (PMIB_IFROW)(pInfo->rgbyData);
switch(actionId)
{
case MIB_ACTION_VALIDATE:
{
TraceEnter("MibSetIfEntry - VALIDATE");
ASSERT(!(IsAsnTypeNull(&(pInput->ifIndex)) or
IsAsnTypeNull(&(pInput->ifAdminStatus))));
pInput->bLocked = FALSE;
dwStatus = GetAsnInteger(&(pInput->ifAdminStatus), 0);
if((dwStatus isnot IF_ADMIN_STATUS_UP) and
(dwStatus isnot IF_ADMIN_STATUS_DOWN))
{
TRACE0("Status must be UP or DOWN");
TraceLeave("MibSetIfEntry");
return MIB_S_INVALID_PARAMETER;
}
dwResult = UpdateCache(MIB_II_IF);
if(dwResult isnot NO_ERROR)
{
TRACE1("Couldnt update IF cache. Error %d",dwResult);
TraceLeave("MibSetIfEntry");
return dwResult;
}
pInfo->dwId = IF_ROW;
//
// We take the lock here and then release it in the cleanup
// This ensures that things dont change between the two calls
//
EnterWriter(MIB_II_IF);
pInput->bLocked = TRUE;
pRpcIf = LocateIfRow(GET_EXACT,
&(pInput->ifIndex));
if(pRpcIf is NULL)
{
ReleaseLock(MIB_II_IF);
pInput->bLocked = FALSE;
TRACE1("Unable to locate IF Row. Index is %d",
GetAsnInteger(&(pInput->ifIndex),-1));
TraceLeave("MibSetIfEntry");
return MIB_S_ENTRY_NOT_FOUND;
}
if(pRpcIf->dwAdminStatus is dwStatus)
{
//
// Since the types are same, this is a NOP.
//
pInput->raAction = NOP;
TraceLeave("MibSetIfEntry - SET");
return MIB_S_SUCCESS;
}
pInput->raAction = SET_ROW;
pSetRow->dwIndex = pRpcIf->dwIndex;
pSetRow->dwAdminStatus = dwStatus;
TraceLeave("MibSetIfEntry - SET");
return MIB_S_SUCCESS;
}
case MIB_ACTION_SET:
{
TraceEnter("MibSetIfEntry - SET");
dwResult = NO_ERROR;
if(pInput->raAction is SET_ROW)
{
dwResult = InternalSetIfEntry(pInfo);
#ifdef MIB_DEBUG
if(dwResult isnot NO_ERROR)
{
TRACE1("Set failed!!. Error %d",
dwResult);
}
#endif
InvalidateCache(MIB_II_IF);
}
TraceLeave("MibSetIfEntry");
return dwResult;
}
case MIB_ACTION_CLEANUP:
{
if(pInput->bLocked)
{
ReleaseLock(MIB_II_IF);
}
TraceEnter("MibSetIfEntry - CLEANUP");
TraceLeave("MibSetIfEntry");
return MIB_S_SUCCESS;
}
default:
{
TraceEnter("MibSetIfEntry - WRONG ACTION");
TraceLeave("MibSetIfEntry");
return MIB_S_INVALID_PARAMETER;
}
}
}
UINT
MibGetIpGroup(
UINT actionId,
AsnAny *objectArray,
UINT *errorIndex
)
{
DWORD dwResult;
PIP_STATS_GET pOutput;
MIB_IPSTATS rpcIpStats;
TraceEnter("MibGetIpGroup");
dwResult = GetIpStatistics(&rpcIpStats);
if(dwResult isnot NO_ERROR)
{
TRACE1("Couldnt get IP stats. Error %d",dwResult);
TraceLeave("MibGetIpGroup");
return dwResult;
}
pOutput = (PIP_STATS_GET)objectArray;
SetAsnInteger(&(pOutput->ipForwarding), rpcIpStats.dwForwarding);
SetAsnInteger(&(pOutput->ipDefaultTTL), rpcIpStats.dwDefaultTTL);
SetAsnCounter(&(pOutput->ipInReceives), rpcIpStats.dwInReceives);
SetAsnCounter(&(pOutput->ipInHdrErrors), rpcIpStats.dwInHdrErrors);
SetAsnCounter(&(pOutput->ipInAddrErrors), rpcIpStats.dwInAddrErrors);
SetAsnCounter(&(pOutput->ipForwDatagrams), rpcIpStats.dwForwDatagrams);
SetAsnCounter(&(pOutput->ipInUnknownProtos), rpcIpStats.dwInUnknownProtos);
SetAsnCounter(&(pOutput->ipInDiscards), rpcIpStats.dwInDiscards);
SetAsnCounter(&(pOutput->ipInDelivers), rpcIpStats.dwInDelivers);
SetAsnCounter(&(pOutput->ipOutRequests), rpcIpStats.dwOutRequests);
SetAsnCounter(&(pOutput->ipOutDiscards), rpcIpStats.dwOutDiscards);
SetAsnCounter(&(pOutput->ipOutNoRoutes), rpcIpStats.dwOutNoRoutes);
SetAsnInteger(&(pOutput->ipReasmTimeout), rpcIpStats.dwReasmTimeout);
SetAsnCounter(&(pOutput->ipReasmReqds), rpcIpStats.dwReasmReqds);
SetAsnCounter(&(pOutput->ipReasmOKs), rpcIpStats.dwReasmOks);
SetAsnCounter(&(pOutput->ipReasmFails), rpcIpStats.dwReasmFails);
SetAsnCounter(&(pOutput->ipFragOKs), rpcIpStats.dwFragOks);
SetAsnCounter(&(pOutput->ipFragFails), rpcIpStats.dwFragFails);
SetAsnCounter(&(pOutput->ipFragCreates), rpcIpStats.dwFragCreates);
SetAsnCounter(&(pOutput->ipRoutingDiscards), rpcIpStats.dwRoutingDiscards);
TraceLeave("MibGetIpGroup");
return MIB_S_SUCCESS;
}
UINT
MibSetIpGroup(
UINT actionId,
AsnAny *objectArray,
UINT *errorIndex
)
{
MIB_IPSTATS rpcIpStats;
DWORD dwResult,dwTTL,dwForw;
PIP_STATS_SET pInput;
PMIB_OPAQUE_INFO pInfo;
PMIB_IPSTATS pSetStats;
pInput = (PIP_STATS_SET)objectArray;
pInfo = (PMIB_OPAQUE_INFO)(pInput->rgdwSetBuffer);
pSetStats = (PMIB_IPSTATS)(pInfo->rgbyData);
switch(actionId)
{
case MIB_ACTION_VALIDATE:
{
TraceEnter("MibSetIpGroup- VALIDATE");
if(IsAsnTypeNull(&(pInput->ipDefaultTTL)) and
IsAsnTypeNull(&(pInput->ipForwarding)))
{
TRACE0("Can only set TTL and Forwarding");
TraceLeave("MibSetIpGroup");
return MIB_S_INVALID_PARAMETER;
}
dwResult = GetIpStatistics(&rpcIpStats);
if(dwResult isnot NO_ERROR)
{
TRACE1("Couldnt get IP stats. Error %d",dwResult);
TraceLeave("MibSetIpGroup");
return dwResult;
}
pInfo->dwId = IP_STATS;
dwTTL = GetAsnInteger(&(pInput->ipDefaultTTL), rpcIpStats.dwDefaultTTL);
dwForw = GetAsnInteger(&(pInput->ipForwarding), rpcIpStats.dwForwarding);
if(dwTTL > 255)
{
TRACE0("TTL must be less than 255");
TraceLeave("MibSetIpGroup");
return MIB_S_INVALID_PARAMETER;
}
if((dwForw isnot MIB_IP_FORWARDING) and
(dwForw isnot MIB_IP_NOT_FORWARDING))
{
TRACE0("Forwarding value wrong");
TraceLeave("MibSetIpGroup");
return MIB_S_INVALID_PARAMETER;
}
pSetStats->dwForwarding = dwForw;
pSetStats->dwDefaultTTL = dwTTL;
TraceLeave("MibSetIpGroup");
return MIB_S_SUCCESS;
}
case MIB_ACTION_SET:
{
TraceEnter("MibSetIpGroup - SET");
dwResult = InternalSetIpStats(pInfo);
#ifdef MIB_DEBUG
if(dwResult isnot NO_ERROR)
{
TRACE1("Set returned error %d!!",dwResult);
}
#endif
TraceLeave("MibSetIpGroup");
return dwResult;
}
case MIB_ACTION_CLEANUP:
{
TraceEnter("MibSetIpGroup - CLEANUP");
TraceLeave("MibSetIpGroup");
return MIB_S_SUCCESS;
}
default:
{
TraceEnter("MibSetIpGroup - WRONG ACTION");
TraceLeave("MibSetIpGroup");
return MIB_S_INVALID_PARAMETER;
}
}
}
UINT
MibGetIpAddressEntry(
UINT actionId,
AsnAny *objectArray,
UINT *errorIndex
)
{
PMIB_IPADDRROW pRpcIpAddr;
DWORD dwResult;
PIP_ADDRESS_ENTRY_GET pOutput;
TraceEnter("MibGetIpAddressEntry");
dwResult = UpdateCache(MIB_II_IPADDR);
if(dwResult isnot NO_ERROR)
{
TRACE1("Couldnt update IP Addr cache. Error %d", dwResult);
TraceLeave("MibGetIpAddressEntry");
return dwResult;
}
pOutput = (PIP_ADDRESS_ENTRY_GET)objectArray;
EnterReader(MIB_II_IPADDR);
pRpcIpAddr = LocateIpAddrRow(actionId,
&(pOutput->ipAdEntAddr));
if(pRpcIpAddr is NULL)
{
ReleaseLock(MIB_II_IPADDR);
TRACE2("Unable to locate IP Addr Row. Action is %d, Address is %x",
actionId,
GetAsnIPAddress(&(pOutput->ipAdEntAddr),0xffffffff));
TraceLeave("MibGetIpAddressEntry");
if(actionId is MIB_ACTION_GETNEXT)
{
return MIB_S_NO_MORE_ENTRIES;
}
return MIB_S_ENTRY_NOT_FOUND;
}
ForceSetAsnIPAddress(&(pOutput->ipAdEntAddr),
&(pOutput->dwIpAdEntAddrInfo),
pRpcIpAddr->dwAddr);
SetAsnInteger(&(pOutput->ipAdEntIfIndex), pRpcIpAddr->dwIndex);
SetAsnIPAddress(&(pOutput->ipAdEntNetMask),
&(pOutput->dwIpAdEntNetMaskInfo),
pRpcIpAddr->dwMask);
SetAsnInteger(&(pOutput->ipAdEntBcastAddr), pRpcIpAddr->dwBCastAddr);
SetAsnInteger(&(pOutput->ipAdEntReasmMaxSize), pRpcIpAddr->dwReasmSize);
ReleaseLock(MIB_II_IPADDR);
TraceLeave("MibGetIpAddressEntry");
return MIB_S_SUCCESS;
}
UINT
MibGetIpRouteEntry(
UINT actionId,
AsnAny *objectArray,
UINT *errorIndex
)
{
DWORD dwResult;
PMIB_IPFORWARDROW pRpcIpForw;
PIP_ROUTE_ENTRY_GET pOutput;
TraceEnter("MibGetIpRouteEntry");
dwResult = UpdateCache(FORWARD_MIB);
if(dwResult isnot NO_ERROR)
{
TRACE1("Couldnt update IP Forward cache. Error %d", dwResult);
TraceLeave("MibGetIpRouteEntry");
return dwResult;
}
pOutput = (PIP_ROUTE_ENTRY_GET)objectArray;
EnterReader(FORWARD_MIB);
pRpcIpForw = LocateIpRouteRow(actionId,
&(pOutput->ipRouteDest));
if(pRpcIpForw is NULL)
{
ReleaseLock(FORWARD_MIB);
TRACE2("Unable to locate IP ROUTE Row. Action is %d. Dest is %x",
actionId,
GetAsnIPAddress(&(pOutput->ipRouteDest),0xffffffff));
TraceLeave("MibGetIpRouteEntry");
if(actionId is MIB_ACTION_GETNEXT)
{
return MIB_S_NO_MORE_ENTRIES;
}
return MIB_S_ENTRY_NOT_FOUND;
}
ForceSetAsnIPAddress(&(pOutput->ipRouteDest),
&(pOutput->dwIpRouteDestInfo),
pRpcIpForw->dwForwardDest);
SetAsnInteger(&(pOutput->ipRouteIfIndex), pRpcIpForw->dwForwardIfIndex);
SetAsnInteger(&(pOutput->ipRouteMetric1), pRpcIpForw->dwForwardMetric1);
SetAsnInteger(&(pOutput->ipRouteMetric2), pRpcIpForw->dwForwardMetric2);
SetAsnInteger(&(pOutput->ipRouteMetric3), pRpcIpForw->dwForwardMetric3);
SetAsnInteger(&(pOutput->ipRouteMetric4), pRpcIpForw->dwForwardMetric4);
SetAsnIPAddress(&(pOutput->ipRouteNextHop),
&(pOutput->dwIpRouteNextHopInfo),
pRpcIpForw->dwForwardNextHop);
SetAsnInteger(&(pOutput->ipRouteType), pRpcIpForw->dwForwardType);
SetAsnInteger(&(pOutput->ipRouteProto), pRpcIpForw->dwForwardProto);
SetAsnInteger(&(pOutput->ipRouteAge), pRpcIpForw->dwForwardAge);
SetAsnIPAddress(&(pOutput->ipRouteMask),
&(pOutput->dwIpRouteMaskInfo),
pRpcIpForw->dwForwardMask);
SetAsnInteger(&(pOutput->ipRouteMetric5), pRpcIpForw->dwForwardMetric5);
SetToZeroOid(&(pOutput->ipRouteInfo));
ReleaseLock(FORWARD_MIB);
TraceLeave("MibGetIpRouteEntry");
return MIB_S_SUCCESS;
}
UINT
MibSetIpRouteEntry(
UINT actionId,
AsnAny *objectArray,
UINT *errorIndex
)
{
DWORD dwResult,dwType,dwIfIndex,dwNextHop;
PMIB_IPFORWARDROW pRpcIpForw;
PIP_ROUTE_ENTRY_SET pInput;
PMIB_OPAQUE_INFO pInfo;
PMIB_IPFORWARDROW pSetRow;
pInput = (PIP_ROUTE_ENTRY_SET)objectArray;
pInfo = (PMIB_OPAQUE_INFO)(pInput->rgdwSetBuffer);
pSetRow = (PMIB_IPFORWARDROW)(pInfo->rgbyData);
switch(actionId)
{
case MIB_ACTION_VALIDATE:
{
TraceEnter("MibSetIpRouteEntry - VALIDATE");
ASSERT(!(IsAsnTypeNull(&(pInput->ipRouteDest))));
pInput->bLocked = FALSE;
dwResult = UpdateCache(FORWARD_MIB);
if(dwResult isnot NO_ERROR)
{
TRACE1("Couldnt update IP Forward cache. Error %d", dwResult);
TraceLeave("MibGetIpRouteEntry");
return dwResult;
}
pInfo->dwId = IP_FORWARDROW;
EnterWriter(FORWARD_MIB);
pInput->bLocked = TRUE;
pRpcIpForw = LocateIpRouteRow(GET_EXACT,
&(pInput->ipRouteDest));
if(pRpcIpForw is NULL)
{
//
// So we are creating a row. We need the If index,
// the mask, next hop and metric 1. We will try to
// determine If index later if necessary.
//
if(IsAsnTypeNull(&(pInput->ipRouteMask)) or
IsAsnTypeNull(&(pInput->ipRouteNextHop)) or
IsAsnTypeNull(&(pInput->ipRouteMetric1)))
{
ReleaseLock(FORWARD_MIB);
pInput->bLocked = FALSE;
TRACE0("Not enough information to create a route");
TraceLeave("MibSetIpRouteEntry");
return MIB_S_INVALID_PARAMETER;
}
dwType = GetAsnInteger(&(pInput->ipRouteType),
MIB_IPROUTE_TYPE_OTHER);
if(dwType is MIB_IPROUTE_TYPE_INVALID)
{
//
// We couldnt be creating and deleting a row at the
// same time
//
ReleaseLock(FORWARD_MIB);
pInput->bLocked = FALSE;
TRACE0("Wrong type");
TraceLeave("MibSetIpRouteEntry");
return MIB_S_INVALID_PARAMETER;
}
dwIfIndex = GetAsnInteger(&(pInput->ipRouteIfIndex),0);
dwNextHop = GetAsnIPAddress(&(pInput->ipRouteNextHop),0x00000000);
if(dwIfIndex is 0)
{
//
// Attempt to determine the correct ifIndex
//
dwIfIndex = GetIfIndexFromAddr(dwNextHop);
if(dwIfIndex is INVALID_IFINDEX)
{
//
// We couldnt determine the correct ifIndex
//
ReleaseLock(FORWARD_MIB);
pInput->bLocked = FALSE;
TRACE0("Could not determine ifIndex");
TraceLeave("MibSetIpRouteEntry");
return MIB_S_INVALID_PARAMETER;
}
}
pInput->raAction = CREATE_ROW;
pSetRow->dwForwardType = dwType;
pSetRow->dwForwardIfIndex = dwIfIndex;
pSetRow->dwForwardNextHop = dwNextHop;
pSetRow->dwForwardDest =
GetAsnIPAddress(&(pInput->ipRouteDest),0xffffffff);
pSetRow->dwForwardMask =
GetAsnIPAddress(&(pInput->ipRouteMask),0x00000000);
pSetRow->dwForwardPolicy = 0;
pSetRow->dwForwardProto =
GetAsnInteger(&(pInput->ipRouteProto),MIB_IPPROTO_NETMGMT);
//
// We default to an age of INFINITE
//
pSetRow->dwForwardAge =
GetAsnInteger(&(pInput->ipRouteAge),INFINITE);
pSetRow->dwForwardNextHopAS = 0;
pSetRow->dwForwardMetric1 =
GetAsnInteger(&(pInput->ipRouteMetric1),0);
pSetRow->dwForwardMetric2 =
GetAsnInteger(&(pInput->ipRouteMetric2),-1);
pSetRow->dwForwardMetric3 =
GetAsnInteger(&(pInput->ipRouteMetric3),-1);
pSetRow->dwForwardMetric4 =
GetAsnInteger(&(pInput->ipRouteMetric4),-1);
pSetRow->dwForwardMetric5 =
GetAsnInteger(&(pInput->ipRouteMetric5),-1);
TraceLeave("MibSetIpRouteEntry");
return MIB_S_SUCCESS;
}
else
{
//
// Ok so we are only changing some stuff in the route
//
dwType = GetAsnInteger(&(pInput->ipRouteType),
pRpcIpForw->dwForwardType);
if(dwType is MIB_IPROUTE_TYPE_INVALID)
{
//
// Deleting a row
//
pInput->raAction = DELETE_ROW;
*pSetRow = *pRpcIpForw;
TraceLeave("MibSetIpRouteEntry");
return MIB_S_SUCCESS;
}
pInput->raAction = SET_ROW;
pSetRow->dwForwardDest =
GetAsnIPAddress(&(pInput->ipRouteDest),
pRpcIpForw->dwForwardDest);
pSetRow->dwForwardMask =
GetAsnIPAddress(&(pInput->ipRouteMask),
pRpcIpForw->dwForwardMask);
pSetRow->dwForwardPolicy = 0;
pSetRow->dwForwardNextHop =
GetAsnIPAddress(&(pInput->ipRouteNextHop),
pRpcIpForw->dwForwardNextHop);
pSetRow->dwForwardIfIndex =
GetAsnInteger(&(pInput->ipRouteIfIndex),
pRpcIpForw->dwForwardIfIndex);
//
// The type gets set by the router manager. But incase
// we are writing to the stack we need some kind of valid type
//
pSetRow->dwForwardType =
GetAsnInteger(&(pInput->ipRouteType),
pRpcIpForw->dwForwardType);
pSetRow->dwForwardProto =
GetAsnInteger(&(pInput->ipRouteProto),
pRpcIpForw->dwForwardProto);
//
// We default to an age of 10 seconds
//
pSetRow->dwForwardAge =
GetAsnInteger(&(pInput->ipRouteAge),
pRpcIpForw->dwForwardAge);
pSetRow->dwForwardNextHopAS = 0;
pSetRow->dwForwardMetric1 =
GetAsnInteger(&(pInput->ipRouteMetric1),
pRpcIpForw->dwForwardMetric1);
pSetRow->dwForwardMetric2 =
GetAsnInteger(&(pInput->ipRouteMetric2),
pRpcIpForw->dwForwardMetric2);
pSetRow->dwForwardMetric3 =
GetAsnInteger(&(pInput->ipRouteMetric3),
pRpcIpForw->dwForwardMetric3);
pSetRow->dwForwardMetric4 =
GetAsnInteger(&(pInput->ipRouteMetric4),
pRpcIpForw->dwForwardMetric4);
pSetRow->dwForwardMetric5 =
GetAsnInteger(&(pInput->ipRouteMetric5),
pRpcIpForw->dwForwardMetric5);
TraceLeave("MibSetIpRouteEntry");
return MIB_S_SUCCESS;
}
}
case MIB_ACTION_SET:
{
TraceEnter("MibSetIpRouteEntry - SET");
switch(pInput->raAction)
{
case CREATE_ROW:
{
dwResult = InternalCreateIpForwardEntry(pInfo);
#ifdef MIB_DEBUG
if(dwResult isnot NO_ERROR)
{
TRACE1("Create failed with error %d",dwResult);
}
#endif
InvalidateCache(FORWARD_MIB);
TraceLeave("MibSetIpRouteEntry");
return dwResult;
}
case SET_ROW:
{
dwResult = InternalSetIpForwardEntry(pInfo);
#ifdef MIB_DEBUG
if(dwResult isnot NO_ERROR)
{
TRACE1("MibSet failed with error %d",dwResult);
}
#endif
InvalidateCache(FORWARD_MIB);
TraceLeave("MibSetIpRouteEntry");
return dwResult;
}
case DELETE_ROW:
{
dwResult = InternalDeleteIpForwardEntry(pInfo);
#ifdef MIB_DEBUG
if(dwResult isnot NO_ERROR)
{
TRACE1("Delete failed with error %d",dwResult);
}
#endif
InvalidateCache(FORWARD_MIB);
TraceLeave("MibSetIpRouteEntry");
return dwResult;
}
default:
{
TRACE1("Wrong row action %d",pInput->raAction);
TraceLeave("MibSetIpRouteEntry");
return MIB_S_SUCCESS;
}
}
}
case MIB_ACTION_CLEANUP:
{
TraceEnter("MibSetIpRouteEntry - CLEANUP");
TraceLeave("MibSetIpRouteEntry");
if(pInput->bLocked)
{
ReleaseLock(FORWARD_MIB);
}
return MIB_S_SUCCESS;
}
default:
{
TraceEnter("MibSetIpRouteEntry - WRONG ACTION");
TraceLeave("MibSetIpRouteEntry");
return MIB_S_INVALID_PARAMETER;
}
}
}
UINT
MibGetIpNetToMediaEntry(
UINT actionId,
AsnAny *objectArray,
UINT *errorIndex
)
{
PMIB_IPNETROW pRpcIpNet;
DWORD dwResult;
PIP_NET_TO_MEDIA_ENTRY_GET pOutput;
TraceEnter("MibGetIpNetToMediaEntry");
dwResult = UpdateCache(MIB_II_IPNET);
if(dwResult isnot NO_ERROR)
{
TRACE1("Couldnt update IP Net cache. Error %d", dwResult);
TraceLeave("MibGetIpNetToMediaEntry");
return dwResult;
}
pOutput = (PIP_NET_TO_MEDIA_ENTRY_GET)objectArray;
EnterReader(MIB_II_IPNET);
pRpcIpNet = LocateIpNetRow(actionId,
&(pOutput->ipNetToMediaIfIndex),
&(pOutput->ipNetToMediaNetAddress));
if(pRpcIpNet is NULL)
{
ReleaseLock(MIB_II_IPNET);
TRACE3("Unable to locateIP Net Row. Action is %d. IfIndex %d. Address %x",
actionId,
GetAsnInteger(&(pOutput->ipNetToMediaIfIndex), -1),
GetAsnIPAddress(&(pOutput->ipNetToMediaNetAddress),0xffffffff));
TraceLeave("MibGetIpNetToMediaEntry");
if(actionId is MIB_ACTION_GETNEXT)
{
return MIB_S_NO_MORE_ENTRIES;
}
return MIB_S_ENTRY_NOT_FOUND;
}
ForceSetAsnInteger(&(pOutput->ipNetToMediaIfIndex), pRpcIpNet->dwIndex);
SetAsnOctetString(&(pOutput->ipNetToMediaPhysAddress),
pOutput->rgbyIpNetToMediaPhysAddressInfo,
pRpcIpNet->bPhysAddr,
pRpcIpNet->dwPhysAddrLen);
ForceSetAsnIPAddress(&(pOutput->ipNetToMediaNetAddress),
&(pOutput->dwIpNetToMediaNetAddressInfo),
pRpcIpNet->dwAddr);
SetAsnInteger(&(pOutput->ipNetToMediaType), pRpcIpNet->dwType);
ReleaseLock(MIB_II_IPNET);
TraceLeave("MibGetIpNetToMediaEntry");
return MIB_S_SUCCESS;
}
UINT
MibSetIpNetToMediaEntry(
UINT actionId,
AsnAny *objectArray,
UINT *errorIndex
)
{
PMIB_IPNETROW pRpcIpNet;
DWORD dwResult,dwType;
PIP_NET_TO_MEDIA_ENTRY_SET pInput;
PMIB_OPAQUE_INFO pInfo;
PMIB_IPNETROW pSetRow;
pInput = (PIP_NET_TO_MEDIA_ENTRY_SET)objectArray;
pInfo = (PMIB_OPAQUE_INFO)(pInput->rgdwSetBuffer);
pSetRow = (PMIB_IPNETROW)(pInfo->rgbyData);
switch(actionId)
{
case MIB_ACTION_VALIDATE:
{
TraceEnter("MibSetIpNetToMediaEntry - VALIDATE");
ASSERT(!(IsAsnTypeNull(&(pInput->ipNetToMediaIfIndex)) or
IsAsnTypeNull(&(pInput->ipNetToMediaNetAddress))));
pInput->bLocked = FALSE;
dwResult = UpdateCache(MIB_II_IPNET);
if(dwResult isnot NO_ERROR)
{
TRACE1("Couldnt update IP Net cache. Error %d", dwResult);
TraceLeave("MibSetIpNetToMediaEntry");
return dwResult;
}
pInfo->dwId = IP_NETROW;
EnterWriter(MIB_II_IPNET);
pInput->bLocked = TRUE;
pRpcIpNet = LocateIpNetRow(GET_EXACT,
&(pInput->ipNetToMediaIfIndex),
&(pInput->ipNetToMediaNetAddress));
if(pRpcIpNet is NULL)
{
//
// ok so we are creating an entry. We need to have all
// the fields
//
if(IsAsnTypeNull(&(pInput->ipNetToMediaPhysAddress)) or
IsAsnTypeNull(&(pInput->ipNetToMediaType)))
{
ReleaseLock(MIB_II_IPNET);
pInput->bLocked = FALSE;
TRACE0("Not enough info to create ARP entry");
TraceLeave("MibSetIpNetToMediaEntry");
return MIB_S_INVALID_PARAMETER;
}
dwType = GetAsnInteger(&(pInput->ipNetToMediaType), 0);
if((dwType isnot MIB_IPNET_TYPE_DYNAMIC) and
(dwType isnot MIB_IPNET_TYPE_STATIC))
{
ReleaseLock(MIB_II_IPNET);
pInput->bLocked = FALSE;
TRACE1("Type %d is wrong",dwType);
TraceLeave("MibSetIpNetToMediaEntry");
return MIB_S_INVALID_PARAMETER;
}
if(pInput->ipNetToMediaPhysAddress.asnValue.string.length > MAX_PHYS_ADDR_LEN)
{
ReleaseLock(MIB_II_IPNET);
pInput->bLocked = FALSE;
TRACE1("Length of phys addr (%d) is too large",
pInput->ipNetToMediaPhysAddress.asnValue.string.length);
TraceLeave("MibSetIpNetToMediaEntry");
return MIB_S_INVALID_PARAMETER;
}
pInput->raAction = CREATE_ROW;
pSetRow->dwIndex = GetAsnInteger(&(pInput->ipNetToMediaIfIndex),
0);
pSetRow->dwPhysAddrLen =
pInput->ipNetToMediaPhysAddress.asnValue.string.length;
CopyMemory(pSetRow->bPhysAddr,
pInput->ipNetToMediaPhysAddress.asnValue.string.stream,
pInput->ipNetToMediaPhysAddress.asnValue.string.length);
pSetRow->dwAddr =
GetAsnIPAddress(&(pInput->ipNetToMediaNetAddress),
0xffffffff);
pSetRow->dwType = dwType;
TraceLeave("MibSetIpNetToMediaEntry");
return MIB_S_SUCCESS;
}
else
{
//
// only changing stuff
//
dwType = GetAsnInteger(&(pInput->ipNetToMediaType),
pRpcIpNet->dwType);
if((dwType < 1) or
(dwType > 4))
{
ReleaseLock(MIB_II_IPNET);
pInput->bLocked = FALSE;
TRACE1("Type %d is wrong",dwType);
TraceLeave("MibSetIpNetToMediaEntry");
return MIB_S_INVALID_PARAMETER;
}
if(dwType is MIB_IPNET_TYPE_INVALID)
{
//
// We want to delete stuff
//
*pSetRow = *pRpcIpNet;
pInput->raAction = DELETE_ROW;
TraceLeave("MibSetIpNetToMediaEntry");
return MIB_S_SUCCESS;
}
if(pInput->ipNetToMediaPhysAddress.asnType isnot ASN_NULL)
{
if(pInput->ipNetToMediaPhysAddress.asnValue.string.length > MAX_PHYS_ADDR_LEN)
{
ReleaseLock(MIB_II_IPNET);
pInput->bLocked = FALSE;
TRACE1("Length of phys addr (%d) is too large",
pInput->ipNetToMediaPhysAddress.asnValue.string.length);
TraceLeave("MibSetIpNetToMediaEntry");
return MIB_S_INVALID_PARAMETER;
}
pSetRow->dwPhysAddrLen = pInput->ipNetToMediaPhysAddress.asnValue.string.length;
CopyMemory(pSetRow->bPhysAddr,
pInput->ipNetToMediaPhysAddress.asnValue.string.stream,
pInput->ipNetToMediaPhysAddress.asnValue.string.length);
}
else
{
pSetRow->dwPhysAddrLen = pRpcIpNet->dwPhysAddrLen;
CopyMemory(pSetRow->bPhysAddr,
pRpcIpNet->bPhysAddr,
pRpcIpNet->dwPhysAddrLen);
}
pInput->raAction = SET_ROW;
pSetRow->dwAddr =
GetAsnIPAddress(&(pInput->ipNetToMediaNetAddress),
pRpcIpNet->dwAddr);
pSetRow->dwType = dwType;
pSetRow->dwIndex = GetAsnInteger(&(pInput->ipNetToMediaIfIndex),0);
TraceLeave("MibSetIpNetToMediaEntry");
return MIB_S_SUCCESS;
}
}
case MIB_ACTION_SET:
{
TraceEnter("MibSetIpNetToMediaEntry- SET");
switch(pInput->raAction)
{
case CREATE_ROW:
{
dwResult = InternalCreateIpNetEntry(pInfo);
#ifdef MIB_DEBUG
if(dwResult isnot NO_ERROR)
{
TRACE1("Create failed with error %d!!",dwResult);
}
#endif
InvalidateCache(MIB_II_IPNET);
TraceLeave("MibSetIpNetToMediaEntry");
return dwResult;
}
case SET_ROW:
{
dwResult = InternalSetIpNetEntry(pInfo);
#ifdef MIB_DEBUG
if(dwResult isnot NO_ERROR)
{
TRACE1("Create failed with error %d!!",dwResult);
}
#endif
InvalidateCache(MIB_II_IPNET);
TraceLeave("MibSetIpNetToMediaEntry");
return dwResult;
}
case DELETE_ROW:
{
dwResult = InternalDeleteIpNetEntry(pInfo);
#ifdef MIB_DEBUG
if(dwResult isnot NO_ERROR)
{
TRACE1("Create failed with error %d!!",dwResult);
}
#endif
InvalidateCache(MIB_II_IPNET);
TraceLeave("MibSetIpNetToMediaEntry");
return dwResult;
}
default:
{
TRACE1("Wrong row action %d",pInput->raAction);
TraceLeave("MibSetIpNetToMediaEntry");
return MIB_S_SUCCESS;
}
}
}
case MIB_ACTION_CLEANUP:
{
TraceEnter("MibSetIpNetToMediaEntry - CLEANUP");
TraceLeave("MibSetIpNetToMediaEntry");
if(pInput->bLocked)
{
ReleaseLock(MIB_II_IPNET);
}
return MIB_S_SUCCESS;
}
default:
{
TraceEnter("MibSetIpNetToMediaEntry - WRONG ACTION");
TraceLeave("MibSetIpNetToMediaEntry");
return MIB_S_INVALID_PARAMETER;
}
}
}
UINT
MibGetIcmpGroup(
UINT actionId,
AsnAny *objectArray,
UINT *errorIndex
)
{
MIB_ICMP rpcIcmp;
DWORD dwResult;
PICMP_GROUP_GET pOutput;
TraceEnter("MibGetIcmpGroup");
dwResult = GetIcmpStatistics(&rpcIcmp);
if(dwResult isnot NO_ERROR)
{
TRACE1("Couldnt get ICMP stats. Error %d",dwResult);
TraceLeave("MibGetIcmpGroup");
return dwResult;
}
pOutput = (PICMP_GROUP_GET)objectArray;
SetAsnCounter(&(pOutput->icmpInMsgs), rpcIcmp.stats.icmpInStats.dwMsgs);
SetAsnCounter(&(pOutput->icmpInErrors), rpcIcmp.stats.icmpInStats.dwErrors);
SetAsnCounter(&(pOutput->icmpInDestUnreachs), rpcIcmp.stats.icmpInStats.dwDestUnreachs);
SetAsnCounter(&(pOutput->icmpInTimeExcds), rpcIcmp.stats.icmpInStats.dwTimeExcds);
SetAsnCounter(&(pOutput->icmpInParmProbs), rpcIcmp.stats.icmpInStats.dwParmProbs);
SetAsnCounter(&(pOutput->icmpInSrcQuenchs), rpcIcmp.stats.icmpInStats.dwSrcQuenchs);
SetAsnCounter(&(pOutput->icmpInRedirects), rpcIcmp.stats.icmpInStats.dwRedirects);
SetAsnCounter(&(pOutput->icmpInEchos), rpcIcmp.stats.icmpInStats.dwEchos);
SetAsnCounter(&(pOutput->icmpInEchoReps), rpcIcmp.stats.icmpInStats.dwEchoReps);
SetAsnCounter(&(pOutput->icmpInTimestamps), rpcIcmp.stats.icmpInStats.dwTimestamps);
SetAsnCounter(&(pOutput->icmpInTimestampReps), rpcIcmp.stats.icmpInStats.dwTimestampReps);
SetAsnCounter(&(pOutput->icmpInAddrMasks), rpcIcmp.stats.icmpInStats.dwAddrMasks);
SetAsnCounter(&(pOutput->icmpInAddrMaskReps), rpcIcmp.stats.icmpInStats.dwAddrMaskReps);
SetAsnCounter(&(pOutput->icmpOutMsgs), rpcIcmp.stats.icmpOutStats.dwMsgs);
SetAsnCounter(&(pOutput->icmpOutErrors), rpcIcmp.stats.icmpOutStats.dwErrors);
SetAsnCounter(&(pOutput->icmpOutDestUnreachs), rpcIcmp.stats.icmpOutStats.dwDestUnreachs);
SetAsnCounter(&(pOutput->icmpOutTimeExcds), rpcIcmp.stats.icmpOutStats.dwTimeExcds);
SetAsnCounter(&(pOutput->icmpOutParmProbs), rpcIcmp.stats.icmpOutStats.dwParmProbs);
SetAsnCounter(&(pOutput->icmpOutSrcQuenchs), rpcIcmp.stats.icmpOutStats.dwSrcQuenchs);
SetAsnCounter(&(pOutput->icmpOutRedirects), rpcIcmp.stats.icmpOutStats.dwRedirects);
SetAsnCounter(&(pOutput->icmpOutEchos), rpcIcmp.stats.icmpOutStats.dwEchos);
SetAsnCounter(&(pOutput->icmpOutEchoReps), rpcIcmp.stats.icmpOutStats.dwEchoReps);
SetAsnCounter(&(pOutput->icmpOutTimestamps), rpcIcmp.stats.icmpOutStats.dwTimestamps);
SetAsnCounter(&(pOutput->icmpOutTimestampReps), rpcIcmp.stats.icmpOutStats.dwTimestampReps);
SetAsnCounter(&(pOutput->icmpOutAddrMasks), rpcIcmp.stats.icmpOutStats.dwAddrMasks);
SetAsnCounter(&(pOutput->icmpOutAddrMaskReps), rpcIcmp.stats.icmpOutStats.dwAddrMaskReps);
TraceLeave("MibGetIcmpGroup");
return MIB_S_SUCCESS;
}
UINT
MibGetTcpGroup(
UINT actionId,
AsnAny *objectArray,
UINT *errorIndex
)
{
MIB_TCPSTATS rpcTcp4, rpcTcp6;
DWORD dwResult4, dwResult6;
PTCP_STATS_GET pOutput;
TraceEnter("MibGetTcpGroup");
ZeroMemory(&rpcTcp4, sizeof(rpcTcp4));
ZeroMemory(&rpcTcp6, sizeof(rpcTcp6));
dwResult4 = GetTcpStatisticsEx(&rpcTcp4, AF_INET);
dwResult6 = GetTcpStatisticsEx(&rpcTcp6, AF_INET6);
if ((dwResult4 isnot NO_ERROR) && (dwResult6 isnot NO_ERROR))
{
TRACE1("Couldnt get Tcp stats. Error %d",dwResult4);
TraceLeave("MibGetTcpGroup");
return dwResult4;
}
pOutput = (PTCP_STATS_GET)objectArray;
//
// The current MIB only has one object (per stat) for both IPv4 and IPv6.
// That is, it assumes a combination TCP stack). We can add together
// counters but for enumerated objects, we arbitrarily report the IPv4
// stack value.
//
SetAsnInteger(&(pOutput->tcpRtoAlgorithm), rpcTcp4.dwRtoAlgorithm);
SetAsnInteger(&(pOutput->tcpRtoMin), rpcTcp4.dwRtoMin);
SetAsnInteger(&(pOutput->tcpRtoMax), rpcTcp4.dwRtoMax);
SetAsnInteger(&(pOutput->tcpMaxConn), rpcTcp4.dwMaxConn);
SetAsnCounter(&(pOutput->tcpActiveOpens),
rpcTcp4.dwActiveOpens + rpcTcp6.dwActiveOpens);
SetAsnCounter(&(pOutput->tcpPassiveOpens),
rpcTcp4.dwPassiveOpens + rpcTcp6.dwPassiveOpens);
SetAsnCounter(&(pOutput->tcpAttemptFails),
rpcTcp4.dwAttemptFails + rpcTcp6.dwAttemptFails);
SetAsnCounter(&(pOutput->tcpEstabResets),
rpcTcp4.dwEstabResets + rpcTcp6.dwEstabResets);
SetAsnGauge(&(pOutput->tcpCurrEstab),
rpcTcp4.dwCurrEstab + rpcTcp6.dwCurrEstab);
SetAsnCounter(&(pOutput->tcpInSegs),
rpcTcp4.dwInSegs + rpcTcp6.dwInSegs);
SetAsnCounter(&(pOutput->tcpOutSegs),
rpcTcp4.dwOutSegs + rpcTcp6.dwOutSegs);
SetAsnCounter(&(pOutput->tcpRetransSegs),
rpcTcp4.dwRetransSegs + rpcTcp6.dwRetransSegs);
SetAsnCounter(&(pOutput->tcpInErrs),
rpcTcp4.dwInErrs + rpcTcp6.dwInErrs);
SetAsnCounter(&(pOutput->tcpOutRsts),
rpcTcp4.dwOutRsts + rpcTcp6.dwOutRsts);
TraceLeave("MibGetTcpGroup");
return MIB_S_SUCCESS;
}
UINT
MibGetTcpConnectionEntry(
UINT actionId,
AsnAny *objectArray,
UINT *errorIndex
)
{
DWORD dwResult;
PMIB_TCPROW pRpcTcp;
PTCP_CONNECTION_ENTRY_GET pOutput;
TraceEnter("MibGetTcpConnectionEntry");
dwResult = UpdateCache(MIB_II_TCP);
if(dwResult isnot NO_ERROR)
{
TRACE1("Couldnt update TCP Connection cache. Error %d", dwResult);
TraceLeave("MibGetTcpConnectionEntry");
return dwResult;
}
pOutput = (PTCP_CONNECTION_ENTRY_GET)objectArray;
EnterReader(MIB_II_TCP);
pRpcTcp = LocateTcpRow(actionId,
&(pOutput->tcpConnLocalAddress),
&(pOutput->tcpConnLocalPort),
&(pOutput->tcpConnRemAddress),
&(pOutput->tcpConnRemPort));
if(pRpcTcp is NULL)
{
ReleaseLock(MIB_II_TCP);
TRACE5("Couldnt find TCP Row. Action %d. LocalAddr %x, Localport %d, RemAddr %x, RemPort %d",
actionId,
GetAsnIPAddress(&(pOutput->tcpConnLocalAddress), 0xffffffff),
GetAsnInteger(&(pOutput->tcpConnLocalPort), -1),
GetAsnIPAddress(&(pOutput->tcpConnRemAddress), 0xffffffff),
GetAsnInteger(&(pOutput->tcpConnRemPort), -1));
TraceLeave("MibGetTcpConnectionEntry");
if(actionId is MIB_ACTION_GETNEXT)
{
return MIB_S_NO_MORE_ENTRIES;
}
return MIB_S_ENTRY_NOT_FOUND;
}
SetAsnInteger(&(pOutput->tcpConnState), pRpcTcp->dwState);
ForceSetAsnIPAddress(&(pOutput->tcpConnLocalAddress),
&(pOutput->dwTcpConnLocalAddressInfo),
pRpcTcp->dwLocalAddr);
ForceSetAsnInteger(&(pOutput->tcpConnLocalPort), pRpcTcp->dwLocalPort);
ForceSetAsnIPAddress(&(pOutput->tcpConnRemAddress),
&(pOutput->dwTcpConnRemAddressInfo),
pRpcTcp->dwRemoteAddr);
ForceSetAsnInteger(&(pOutput->tcpConnRemPort), pRpcTcp->dwRemotePort);
ReleaseLock(MIB_II_TCP);
TraceLeave("MibGetTcpConnectionEntry");
return MIB_S_SUCCESS;
}
UINT
MibGetTcpNewConnectionEntry(
UINT actionId,
AsnAny *objectArray,
UINT *errorIndex
)
{
DWORD dwResult = MIB_S_NO_MORE_ENTRIES;
PMIB_TCPROW pRpcTcp4;
PTCP6ConnTableEntry pRpcTcp6;
PTCP_NEW_CONNECTION_ENTRY_GET pOutput;
DWORD dwFamily;
TraceEnter("MibGetTcpNewConnectionEntry");
pOutput = (PTCP_NEW_CONNECTION_ENTRY_GET)objectArray;
dwFamily = GetAsnInteger(&pOutput->tcpNewConnLocalAddressType, INET_ADDRESS_TYPE_UNKNOWN);
if (dwFamily > INET_ADDRESS_TYPE_IPv6) {
return (actionId is MIB_ACTION_GETNEXT)?
MIB_S_NO_MORE_ENTRIES : MIB_S_ENTRY_NOT_FOUND;
}
//
// First try IPv4
//
if ((dwFamily == INET_ADDRESS_TYPE_UNKNOWN) ||
(dwFamily == INET_ADDRESS_TYPE_IPv4)) {
dwResult = UpdateCache(MIB_II_TCP);
if (dwResult isnot NO_ERROR) {
goto IPv4Done;
}
EnterReader(MIB_II_TCP);
pRpcTcp4 = LocateTcpRow(actionId,
&(pOutput->tcpNewConnLocalAddress),
&(pOutput->tcpNewConnLocalPort),
&(pOutput->tcpNewConnRemAddress),
&(pOutput->tcpNewConnRemPort));
if (pRpcTcp4 is NULL) {
dwResult = (actionId is MIB_ACTION_GETNEXT)?
MIB_S_NO_MORE_ENTRIES : MIB_S_ENTRY_NOT_FOUND;
goto IPv4Cleanup;
}
ForceSetAsnInteger(&(pOutput->tcpNewConnLocalAddressType), INET_ADDRESS_TYPE_IPv4);
ForceSetAsnOctetString(&(pOutput->tcpNewConnLocalAddress),
pOutput->rgbyTcpNewConnLocalAddressInfo,
&pRpcTcp4->dwLocalAddr,
sizeof(pRpcTcp4->dwLocalAddr));
ForceSetAsnInteger(&(pOutput->tcpNewConnLocalPort), pRpcTcp4->dwLocalPort);
ForceSetAsnInteger(&(pOutput->tcpNewConnRemAddressType), INET_ADDRESS_TYPE_IPv4);
ForceSetAsnOctetString(&(pOutput->tcpNewConnRemAddress),
pOutput->rgbyTcpNewConnRemAddressInfo,
&pRpcTcp4->dwRemoteAddr,
sizeof(pRpcTcp4->dwRemoteAddr));
ForceSetAsnInteger(&(pOutput->tcpNewConnRemPort), pRpcTcp4->dwRemotePort);
SetAsnInteger(&(pOutput->tcpNewConnState), pRpcTcp4->dwState);
dwResult = MIB_S_SUCCESS;
IPv4Cleanup:
ReleaseLock(MIB_II_TCP);
}
IPv4Done:
if (dwResult != MIB_S_NO_MORE_ENTRIES) {
return dwResult;
}
if ((dwFamily == INET_ADDRESS_TYPE_IPv4) && (actionId == MIB_ACTION_GETNEXT)) {
dwFamily = INET_ADDRESS_TYPE_IPv6;
actionId = MIB_ACTION_GETFIRST;
}
//
// Now try IPv6
//
if ((dwFamily == INET_ADDRESS_TYPE_UNKNOWN) ||
(dwFamily == INET_ADDRESS_TYPE_IPv6)) {
dwResult = UpdateCache(MIB_II_TCP6);
if (dwResult isnot NO_ERROR) {
goto IPv6Done;
}
EnterReader(MIB_II_TCP6);
pRpcTcp6 = LocateTcp6Row(actionId,
&(pOutput->tcpNewConnLocalAddress),
&(pOutput->tcpNewConnLocalPort),
&(pOutput->tcpNewConnRemAddress),
&(pOutput->tcpNewConnRemPort));
if (pRpcTcp6 is NULL) {
dwResult = (actionId is MIB_ACTION_GETNEXT)?
MIB_S_NO_MORE_ENTRIES : MIB_S_ENTRY_NOT_FOUND;
goto IPv6Cleanup;
}
ForceSetAsnInteger(&(pOutput->tcpNewConnLocalAddressType), INET_ADDRESS_TYPE_IPv6);
ForceSetAsnOctetString(&(pOutput->tcpNewConnLocalAddress),
pOutput->rgbyTcpNewConnLocalAddressInfo,
&pRpcTcp6->tct_localaddr,
(pRpcTcp6->tct_localscopeid)? 20 : 16);
ForceSetAsnInteger(&(pOutput->tcpNewConnLocalPort), pRpcTcp6->tct_localport);
ForceSetAsnInteger(&(pOutput->tcpNewConnRemAddressType), INET_ADDRESS_TYPE_IPv6);
ForceSetAsnOctetString(&(pOutput->tcpNewConnRemAddress),
pOutput->rgbyTcpNewConnRemAddressInfo,
&pRpcTcp6->tct_remoteaddr,
(pRpcTcp6->tct_remotescopeid)? 20 : 16);
ForceSetAsnInteger(&(pOutput->tcpNewConnRemPort), pRpcTcp6->tct_remoteport);
SetAsnInteger(&(pOutput->tcpNewConnState), pRpcTcp6->tct_state);
dwResult = MIB_S_SUCCESS;
IPv6Cleanup:
ReleaseLock(MIB_II_TCP6);
}
IPv6Done:
TraceLeave("MibGetTcpConnectionEntry");
return dwResult;
}
UINT
MibSetTcpConnectionEntry(
UINT actionId,
AsnAny *objectArray,
UINT *errorIndex
)
{
DWORD dwResult,dwState;
PMIB_TCPROW pRpcTcp;
PTCP_CONNECTION_ENTRY_SET pInput;
PMIB_OPAQUE_INFO pInfo;
PMIB_TCPROW pSetRow;
pInput = (PTCP_CONNECTION_ENTRY_SET)objectArray;
pInfo = (PMIB_OPAQUE_INFO)(pInput->rgdwSetBuffer);
pSetRow = (PMIB_TCPROW)(pInfo->rgbyData);
switch(actionId)
{
case MIB_ACTION_VALIDATE:
{
TraceEnter("MibSetTcpConnectionEntry - VALIDATE");
ASSERT(!(IsAsnTypeNull(&(pInput->tcpConnLocalAddress)) or
IsAsnTypeNull(&(pInput->tcpConnLocalPort)) or
IsAsnTypeNull(&(pInput->tcpConnRemAddress)) or
IsAsnTypeNull(&(pInput->tcpConnRemPort)) or
IsAsnTypeNull(&(pInput->tcpConnState))));
pInput->bLocked = FALSE;
dwState = GetAsnInteger(&(pInput->tcpConnState), 0);
if(dwState isnot MIB_TCP_STATE_DELETE_TCB)
{
TRACE1("State is %d. Only state allowed is DELETE",dwState);
return MIB_S_INVALID_PARAMETER;
}
dwResult = UpdateCache(MIB_II_TCP);
if(dwResult isnot NO_ERROR)
{
TRACE1("Couldnt update TCP Connection cache. Error %d", dwResult);
TraceLeave("MibGetTcpConnectionEntry");
return dwResult;
}
EnterWriter(MIB_II_TCP);
pInput->bLocked = TRUE;
pRpcTcp = LocateTcpRow(GET_EXACT,
&(pInput->tcpConnLocalAddress),
&(pInput->tcpConnLocalPort),
&(pInput->tcpConnRemAddress),
&(pInput->tcpConnRemPort));
if(pRpcTcp is NULL)
{
ReleaseLock(MIB_II_TCP);
pInput->bLocked = FALSE;
TRACE5("Couldnt find TCP Row. Action %d. LocalAddr %x, Localport %d, RemAddr %x, RemPort %d",
actionId,
GetAsnIPAddress(&(pInput->tcpConnLocalAddress),
0xffffffff),
GetAsnInteger(&(pInput->tcpConnLocalPort),
-1),
GetAsnIPAddress(&(pInput->tcpConnRemAddress),
0xffffffff),
GetAsnInteger(&(pInput->tcpConnRemPort),
-1));
TraceLeave("MibSetTcpConnectionEntry");
return MIB_S_ENTRY_NOT_FOUND;
}
pInput->raAction = SET_ROW;
*pSetRow = *pRpcTcp;
pSetRow->dwState = MIB_TCP_STATE_DELETE_TCB;
//
// change port to network byte order
//
pSetRow->dwLocalPort = (DWORD)htons((WORD)pSetRow->dwLocalPort);
//
// chnage port to network byte order
//
pSetRow->dwRemotePort = (DWORD)htons((WORD)pSetRow->dwRemotePort);
return MIB_S_SUCCESS;
}
case MIB_ACTION_SET:
{
TraceEnter("MibSetTcpConnectionEntry - SET");
dwResult = NO_ERROR;
if(pInput->raAction is SET_ROW)
{
dwResult = InternalSetTcpEntry(pInfo);
#ifdef MIB_DEBUG
if(dwResult isnot NO_ERROR)
{
TRACE1("MibSet returned error %d!!",dwResult);
}
#endif
InvalidateCache(MIB_II_TCP);
}
TraceLeave("MibSetTcpConnectionEntry");
return dwResult;
}
case MIB_ACTION_CLEANUP:
{
TraceEnter("MibSetTcpConnectionEntry - CLEANUP");
if(pInput->bLocked)
{
ReleaseLock(MIB_II_TCP);
}
TraceLeave("MibSetTcpConnectionEntry");
return MIB_S_SUCCESS;
}
default:
{
TraceEnter("MibSetTcpConnectionEntry - WRONG ACTION");
TraceLeave("MibSetTcpConnectionEntry");
return MIB_S_INVALID_PARAMETER;
}
}
}
UINT
MibSetTcpNewConnectionEntry(
UINT actionId,
AsnAny *objectArray,
UINT *errorIndex
)
{
DWORD dwResult,dwState;
PMIB_TCPROW pRpcTcp4;
PTCP_NEW_CONNECTION_ENTRY_SET pInput;
PMIB_OPAQUE_INFO pInfo;
PMIB_TCPROW pSetRow;
pInput = (PTCP_NEW_CONNECTION_ENTRY_SET)objectArray;
pInfo = (PMIB_OPAQUE_INFO)(pInput->rgdwSetBuffer);
pSetRow = (PMIB_TCPROW)(pInfo->rgbyData);
switch(actionId)
{
case MIB_ACTION_VALIDATE:
{
TraceEnter("MibSetTcpNewConnectionEntry - VALIDATE");
ASSERT(!(IsAsnTypeNull(&(pInput->tcpNewConnLocalAddressType)) or
IsAsnTypeNull(&(pInput->tcpNewConnLocalAddress)) or
IsAsnTypeNull(&(pInput->tcpNewConnLocalPort)) or
IsAsnTypeNull(&(pInput->tcpNewConnRemAddressType)) or
IsAsnTypeNull(&(pInput->tcpNewConnRemAddress)) or
IsAsnTypeNull(&(pInput->tcpNewConnRemPort)) or
IsAsnTypeNull(&(pInput->tcpNewConnState))));
pInput->bLocked = FALSE;
dwState = GetAsnInteger(&(pInput->tcpNewConnState), 0);
if(dwState isnot MIB_TCP_STATE_DELETE_TCB)
{
TRACE1("State is %d. Only state allowed is DELETE",dwState);
return MIB_S_INVALID_PARAMETER;
}
dwResult = UpdateCache(MIB_II_TCP);
if(dwResult isnot NO_ERROR)
{
TRACE1("Couldnt update TCP Connection cache. Error %d", dwResult);
TraceLeave("MibGetTcpNewConnectionEntry");
return dwResult;
}
EnterWriter(MIB_II_TCP);
pInput->bLocked = TRUE;
pRpcTcp4 = LocateTcpRow(GET_EXACT,
&(pInput->tcpNewConnLocalAddress),
&(pInput->tcpNewConnLocalPort),
&(pInput->tcpNewConnRemAddress),
&(pInput->tcpNewConnRemPort));
if(pRpcTcp4 is NULL)
{
ReleaseLock(MIB_II_TCP);
pInput->bLocked = FALSE;
TRACE5("Couldn't find TCP Row. Action %d. LocalAddr %x, Localport %d, RemAddr %x, RemPort %d",
actionId,
GetAsnIPAddress(&(pInput->tcpConnLocalAddress),
0xffffffff),
GetAsnInteger(&(pInput->tcpConnLocalPort),
-1),
GetAsnIPAddress(&(pInput->tcpConnRemAddress),
0xffffffff),
GetAsnInteger(&(pInput->tcpConnRemPort),
-1));
TraceLeave("MibSetTcpNewConnectionEntry");
return MIB_S_ENTRY_NOT_FOUND;
}
pInput->raAction = SET_ROW;
*pSetRow = *pRpcTcp4;
pSetRow->dwState = MIB_TCP_STATE_DELETE_TCB;
//
// change port to network byte order
//
pSetRow->dwLocalPort = (DWORD)htons((WORD)pSetRow->dwLocalPort);
//
// chnage port to network byte order
//
pSetRow->dwRemotePort = (DWORD)htons((WORD)pSetRow->dwRemotePort);
return MIB_S_SUCCESS;
}
case MIB_ACTION_SET:
{
TraceEnter("MibSetTcpNewConnectionEntry - SET");
dwResult = NO_ERROR;
if(pInput->raAction is SET_ROW)
{
dwResult = InternalSetTcpEntry(pInfo);
#ifdef MIB_DEBUG
if(dwResult isnot NO_ERROR)
{
TRACE1("MibSet returned error %d!!",dwResult);
}
#endif
InvalidateCache(MIB_II_TCP);
}
TraceLeave("MibSetTcpNewConnectionEntry");
return dwResult;
}
case MIB_ACTION_CLEANUP:
{
TraceEnter("MibSetTcpNewConnectionEntry - CLEANUP");
if(pInput->bLocked)
{
ReleaseLock(MIB_II_TCP);
}
TraceLeave("MibSetTcpNewConnectionEntry");
return MIB_S_SUCCESS;
}
default:
{
TraceEnter("MibSetTcpNewConnectionEntry - WRONG ACTION");
TraceLeave("MibSetTcpNewConnectionEntry");
return MIB_S_INVALID_PARAMETER;
}
}
}
UINT
MibGetUdpGroup(
UINT actionId,
AsnAny *objectArray,
UINT *errorIndex
)
{
DWORD dwResult;
MIB_UDPSTATS rpcUdpStats;
PUDP_STATS_GET pOutput;
TraceEnter("MibGetUdpGroup");
dwResult = GetUdpStatistics(&rpcUdpStats);
if(dwResult isnot NO_ERROR)
{
TRACE1("Couldnt get Udp stats. Error %d",dwResult);
TraceLeave("MibGetUdpGroup");
return dwResult;
}
pOutput = (PUDP_STATS_GET)objectArray;
SetAsnCounter(&(pOutput->udpInDatagrams), rpcUdpStats.dwInDatagrams);
SetAsnCounter(&(pOutput->udpNoPorts), rpcUdpStats.dwNoPorts);
SetAsnCounter(&(pOutput->udpInErrors), rpcUdpStats.dwInErrors);
SetAsnCounter(&(pOutput->udpOutDatagrams), rpcUdpStats.dwOutDatagrams);
TraceLeave("MibGetUdpGroup");
return MIB_S_SUCCESS;
}
UINT
MibGetUdpEntry(
UINT actionId,
AsnAny *objectArray,
UINT *errorIndex
)
{
DWORD dwResult;
PMIB_UDPROW pRpcUdp;
PUDP_ENTRY_GET pOutput;
TraceEnter("MibGetUdpEntry");
dwResult = UpdateCache(MIB_II_UDP);
if(dwResult isnot NO_ERROR)
{
TRACE1("Couldnt update UDP Connection cache. Error %d", dwResult);
TraceLeave("MibGetUdpEntry");
return dwResult;
}
pOutput = (PUDP_ENTRY_GET)objectArray;
EnterReader(MIB_II_UDP);
pRpcUdp = LocateUdpRow(actionId,
&(pOutput->udpLocalAddress),
&(pOutput->udpLocalPort));
if(pRpcUdp is NULL)
{
ReleaseLock(MIB_II_UDP);
TRACE3("Couldnt find UDP Row. Action %d. LocalAddr %x, Localport %d",
actionId,
GetAsnIPAddress(&(pOutput->udpLocalAddress), 0xffffffff),
GetAsnInteger(&(pOutput->udpLocalPort), -1));
TraceLeave("MibGetUdpEntry");
if(actionId is MIB_ACTION_GETNEXT)
{
return MIB_S_NO_MORE_ENTRIES;
}
return MIB_S_ENTRY_NOT_FOUND;
}
ForceSetAsnIPAddress(&(pOutput->udpLocalAddress),
&(pOutput->dwUdpLocalAddressInfo),
pRpcUdp->dwLocalAddr);
ForceSetAsnInteger(&(pOutput->udpLocalPort), pRpcUdp->dwLocalPort);
ReleaseLock(MIB_II_UDP);
TraceLeave("MibGetUdpEntry");
return MIB_S_SUCCESS;
}
UINT
MibGetUdpListenerEntry(
UINT actionId,
AsnAny *objectArray,
UINT *errorIndex
)
{
DWORD dwResult = MIB_S_NO_MORE_ENTRIES;
PMIB_UDPROW pRpcUdp4;
PUDP6ListenerEntry pRpcUdp6;
PUDP_LISTENER_ENTRY_GET pOutput;
DWORD dwFamily;
TraceEnter("MibGetUdpListenerEntry");
pOutput = (PUDP_LISTENER_ENTRY_GET)objectArray;
dwFamily = GetAsnInteger(&pOutput->udpListenerLocalAddressType,
INET_ADDRESS_TYPE_UNKNOWN);
if (dwFamily > INET_ADDRESS_TYPE_IPv6) {
return (actionId is MIB_ACTION_GETNEXT)?
MIB_S_NO_MORE_ENTRIES : MIB_S_ENTRY_NOT_FOUND;
}
//
// First try IPv4
//
if ((dwFamily == INET_ADDRESS_TYPE_UNKNOWN) ||
(dwFamily == INET_ADDRESS_TYPE_IPv4)) {
dwResult = UpdateCache(MIB_II_UDP);
if(dwResult isnot NO_ERROR)
{
goto IPv4Done;
}
EnterReader(MIB_II_UDP);
pRpcUdp4 = LocateUdpRow(actionId,
&(pOutput->udpListenerLocalAddress),
&(pOutput->udpListenerLocalPort));
if(pRpcUdp4 is NULL)
{
dwResult = (actionId is MIB_ACTION_GETNEXT)?
MIB_S_NO_MORE_ENTRIES : MIB_S_ENTRY_NOT_FOUND;
goto IPv4Cleanup;
}
ForceSetAsnInteger(&(pOutput->udpListenerLocalAddressType),
INET_ADDRESS_TYPE_IPv4);
ForceSetAsnOctetString(&(pOutput->udpListenerLocalAddress),
pOutput->rgbyUdpLocalAddressInfo,
&pRpcUdp4->dwLocalAddr,
sizeof(pRpcUdp4->dwLocalAddr));
ForceSetAsnInteger(&(pOutput->udpListenerLocalPort),
pRpcUdp4->dwLocalPort);
dwResult = MIB_S_SUCCESS;
IPv4Cleanup:
ReleaseLock(MIB_II_UDP);
}
IPv4Done:
if (dwResult != MIB_S_NO_MORE_ENTRIES) {
return dwResult;
}
if ((dwFamily == INET_ADDRESS_TYPE_IPv4) && (actionId == MIB_ACTION_GETNEXT)) {
dwFamily = INET_ADDRESS_TYPE_IPv6;
actionId = MIB_ACTION_GETFIRST;
}
//
// Now try IPv6
//
if ((dwFamily == INET_ADDRESS_TYPE_UNKNOWN) ||
(dwFamily == INET_ADDRESS_TYPE_IPv6)) {
dwResult = UpdateCache(MIB_II_UDP6_LISTENER);
if(dwResult isnot NO_ERROR)
{
goto IPv6Done;
}
EnterReader(MIB_II_UDP6_LISTENER);
pRpcUdp6 = LocateUdp6Row(actionId,
&(pOutput->udpListenerLocalAddress),
&(pOutput->udpListenerLocalPort));
if(pRpcUdp6 is NULL)
{
dwResult = (actionId is MIB_ACTION_GETNEXT)?
MIB_S_NO_MORE_ENTRIES : MIB_S_ENTRY_NOT_FOUND;
goto IPv6Cleanup;
}
ForceSetAsnInteger(&(pOutput->udpListenerLocalAddressType),
INET_ADDRESS_TYPE_IPv6);
ForceSetAsnOctetString(&(pOutput->udpListenerLocalAddress),
pOutput->rgbyUdpLocalAddressInfo,
&pRpcUdp6->ule_localaddr,
(pRpcUdp6->ule_localscopeid)? 20 : 16);
ForceSetAsnInteger(&(pOutput->udpListenerLocalPort),
pRpcUdp6->ule_localport);
dwResult = MIB_S_SUCCESS;
IPv6Cleanup:
ReleaseLock(MIB_II_UDP6_LISTENER);
}
IPv6Done:
TraceLeave("MibGetUdpEntry");
return dwResult;
}
UINT
MibGetIpForwardNumber(
UINT actionId,
AsnAny *objectArray,
UINT *errorIndex
)
{
DWORD dwResult;
PIP_FORWARD_NUMBER_GET pOutput;
TraceEnter("MibGetIpForwardNumber");
dwResult = UpdateCache(FORWARD_MIB);
if(dwResult isnot NO_ERROR)
{
TRACE1("Couldnt update IP Forward cache",dwResult);
TraceLeave("MibGetIpForwardNumber");
return dwResult;
}
pOutput = (PIP_FORWARD_NUMBER_GET)objectArray;
EnterReader(FORWARD_MIB);
SetAsnGauge(&(pOutput->ipForwardNumber), g_Cache.pRpcIpForwardTable->dwNumEntries);
ReleaseLock(FORWARD_MIB);
TraceLeave("MibGetIpForwardNumber");
return MIB_S_SUCCESS;
}
UINT
MibGetIpForwardEntry(
UINT actionId,
AsnAny *objectArray,
UINT *errorIndex
)
{
DWORD dwResult;
PMIB_IPFORWARDROW pRpcIpForw;
PIP_FORWARD_ENTRY_GET pOutput;
TraceEnter("MibGetIpForwardEntry");
dwResult = UpdateCache(FORWARD_MIB);
if(dwResult isnot NO_ERROR)
{
TRACE1("Couldnt update IP Forward cache. Error %d", dwResult);
TraceLeave("MibGetIpForwardEntry");
return dwResult;
}
pOutput = (PIP_FORWARD_ENTRY_GET)objectArray;
EnterReader(FORWARD_MIB);
pRpcIpForw = LocateIpForwardRow(actionId,
&(pOutput->ipForwardDest),
&(pOutput->ipForwardProto),
&(pOutput->ipForwardPolicy),
&(pOutput->ipForwardNextHop));
if(pRpcIpForw is NULL)
{
ReleaseLock(FORWARD_MIB);
TRACE5("Unable to locateIP Forward Row. Action %d. Dest %x Proto %d Policy %d NextHop %x",
actionId,
GetAsnIPAddress(&(pOutput->ipForwardDest),0),
GetAsnInteger(&(pOutput->ipForwardProto),0),
GetAsnInteger(&(pOutput->ipForwardPolicy),0),
GetAsnIPAddress(&(pOutput->ipForwardNextHop),0));
TraceLeave("MibGetIpForwardEntry");
if(actionId is MIB_ACTION_GETNEXT)
{
return MIB_S_NO_MORE_ENTRIES;
}
return MIB_S_ENTRY_NOT_FOUND;
}
ForceSetAsnIPAddress(&(pOutput->ipForwardDest),
&(pOutput->dwIpForwardDestInfo),
pRpcIpForw->dwForwardDest);
SetAsnIPAddress(&(pOutput->ipForwardMask),
&(pOutput->dwIpForwardMaskInfo),
pRpcIpForw->dwForwardMask);
ForceSetAsnInteger(&(pOutput->ipForwardPolicy), pRpcIpForw->dwForwardPolicy);
ForceSetAsnIPAddress(&(pOutput->ipForwardNextHop),
&(pOutput->dwIpForwardNextHopInfo),
pRpcIpForw->dwForwardNextHop);
SetAsnInteger(&(pOutput->ipForwardIfIndex), pRpcIpForw->dwForwardIfIndex);
SetAsnInteger(&(pOutput->ipForwardType), pRpcIpForw->dwForwardType);
ForceSetAsnInteger(&(pOutput->ipForwardProto), pRpcIpForw->dwForwardProto);
SetAsnInteger(&(pOutput->ipForwardAge), pRpcIpForw->dwForwardAge);
SetToZeroOid(&(pOutput->ipForwardInfo));
SetAsnInteger(&(pOutput->ipForwardNextHopAS), pRpcIpForw->dwForwardNextHopAS);
SetAsnInteger(&(pOutput->ipForwardMetric1), pRpcIpForw->dwForwardMetric1);
SetAsnInteger(&(pOutput->ipForwardMetric2), pRpcIpForw->dwForwardMetric2);
SetAsnInteger(&(pOutput->ipForwardMetric3), pRpcIpForw->dwForwardMetric3);
SetAsnInteger(&(pOutput->ipForwardMetric4), pRpcIpForw->dwForwardMetric4);
SetAsnInteger(&(pOutput->ipForwardMetric5), pRpcIpForw->dwForwardMetric5);
ReleaseLock(FORWARD_MIB);
TraceLeave("MibGetIpForwardEntry");
return MIB_S_SUCCESS;
}
UINT
MibSetIpForwardEntry(
UINT actionId,
AsnAny *objectArray,
UINT *errorIndex
)
{
DWORD dwResult,dwType;
PMIB_IPFORWARDROW pRpcIpForw;
PIP_FORWARD_ENTRY_SET pInput;
PMIB_OPAQUE_INFO pInfo;
PMIB_IPFORWARDROW pSetRow;
pInput = (PIP_FORWARD_ENTRY_SET)objectArray;
pInfo = (PMIB_OPAQUE_INFO)(pInput->rgdwSetBuffer);
pSetRow = (PMIB_IPFORWARDROW)(pInfo->rgbyData);
switch(actionId)
{
case MIB_ACTION_VALIDATE:
{
TraceEnter("MibSetIpForwardEntry - VALIDATE");
dwResult = UpdateCache(FORWARD_MIB);
if(dwResult isnot NO_ERROR)
{
TRACE1("Couldnt update IP Forward cache. Error %d", dwResult);
TraceLeave("GetIpForwardEntry");
return dwResult;
}
ASSERT(!(IsAsnTypeNull(&(pInput->ipForwardDest))));
pInfo->dwId = IP_FORWARDROW;
EnterWriter(FORWARD_MIB);
pInput->bLocked = TRUE;
pRpcIpForw = LocateIpForwardRow(actionId,
&(pInput->ipForwardDest),
&(pInput->ipForwardProto),
&(pInput->ipForwardPolicy),
&(pInput->ipForwardNextHop));
if(pRpcIpForw is NULL)
{
//
// So we are creating a row. We need the If index, the mask,
// next hop and metric 1
//
if(IsAsnTypeNull(&(pInput->ipForwardIfIndex)) or
IsAsnTypeNull(&(pInput->ipForwardMask)) or
IsAsnTypeNull(&(pInput->ipForwardNextHop)) or
IsAsnTypeNull(&(pInput->ipForwardMetric1)))
{
TRACE0("Not enough information to create a route");
ReleaseLock(FORWARD_MIB);
pInput->bLocked = FALSE;
TraceLeave("MibSetIpForwardEntry");
return MIB_S_INVALID_PARAMETER;
}
dwType = GetAsnInteger(&(pInput->ipForwardType),
MIB_IPROUTE_TYPE_OTHER);
if(dwType is MIB_IPROUTE_TYPE_INVALID)
{
//
// We couldnt be creating and deleting a row at the
// same time
//
ReleaseLock(FORWARD_MIB);
pInput->bLocked = FALSE;
TRACE0("Wrong type");
TraceLeave("MibSetIpForwardEntry");
return MIB_S_INVALID_PARAMETER;
}
pSetRow->dwForwardProto =
GetAsnInteger(&(pInput->ipForwardProto),
MIB_IPPROTO_NETMGMT);
if((pSetRow->dwForwardProto isnot MIB_IPPROTO_NETMGMT) and
(pSetRow->dwForwardProto isnot MIB_IPPROTO_LOCAL))
{
//
// wrong protocol
//
ReleaseLock(FORWARD_MIB);
pInput->bLocked = FALSE;
TRACE1("Wrong protocol %d",
pSetRow->dwForwardProto);
TraceLeave("MibSetIpForwardEntry");
return MIB_S_INVALID_PARAMETER;
}
pInput->raAction = CREATE_ROW;
pSetRow->dwForwardDest =
GetAsnIPAddress(&(pInput->ipForwardDest),
0xffffffff);
pSetRow->dwForwardMask =
GetAsnIPAddress(&(pInput->ipForwardMask),
0x00000000);
pSetRow->dwForwardPolicy = 0;
pSetRow->dwForwardNextHop =
GetAsnIPAddress(&(pInput->ipForwardNextHop),
0x00000000);
pSetRow->dwForwardIfIndex =
GetAsnInteger(&(pInput->ipForwardIfIndex),
0);
//
// We default to an age of 10 seconds
//
pSetRow->dwForwardAge =
GetAsnInteger(&(pInput->ipForwardAge),10);
pSetRow->dwForwardNextHopAS = 0;
pSetRow->dwForwardMetric1 =
GetAsnInteger(&(pInput->ipForwardMetric1),0);
pSetRow->dwForwardMetric2 =
GetAsnInteger(&(pInput->ipForwardMetric2),-1);
pSetRow->dwForwardMetric3 =
GetAsnInteger(&(pInput->ipForwardMetric3),-1);
pSetRow->dwForwardMetric4 =
GetAsnInteger(&(pInput->ipForwardMetric4),-1);
pSetRow->dwForwardMetric5 =
GetAsnInteger(&(pInput->ipForwardMetric5),-1);
TraceLeave("MibSetIpForwardEntry");
return MIB_S_SUCCESS;
}
else
{
//
// Ok so we are only changing some stuff in the route
//
dwType = GetAsnInteger(&(pInput->ipForwardType),
pRpcIpForw->dwForwardType);
if(dwType is MIB_IPROUTE_TYPE_INVALID)
{
//
// Deleting a row
//
pInput->raAction = DELETE_ROW;
*pSetRow = *pRpcIpForw;
ReleaseLock(FORWARD_MIB);
pInput->bLocked = FALSE;
TraceLeave("MibSetIpForwardEntry");
return MIB_S_SUCCESS;
}
pSetRow->dwForwardProto =
GetAsnInteger(&(pInput->ipForwardProto),
pRpcIpForw->dwForwardProto);
if((pSetRow->dwForwardProto isnot MIB_IPPROTO_NETMGMT) and
(pSetRow->dwForwardProto isnot MIB_IPPROTO_LOCAL))
{
//
// wrong protocol
//
ReleaseLock(FORWARD_MIB);
pInput->bLocked = FALSE;
TRACE1("Wrong protocol %d",
pSetRow->dwForwardProto);
TraceLeave("MibSetIpForwardEntry");
return MIB_S_INVALID_PARAMETER;
}
pInput->raAction = SET_ROW;
pSetRow->dwForwardDest =
GetAsnIPAddress(&(pInput->ipForwardDest),
pRpcIpForw->dwForwardDest);
pSetRow->dwForwardMask =
GetAsnIPAddress(&(pInput->ipForwardMask),
pRpcIpForw->dwForwardMask);
pSetRow->dwForwardPolicy = 0;
pSetRow->dwForwardNextHop =
GetAsnIPAddress(&(pInput->ipForwardNextHop),
pRpcIpForw->dwForwardNextHop);
pSetRow->dwForwardIfIndex =
GetAsnInteger(&(pInput->ipForwardIfIndex),
pRpcIpForw->dwForwardIfIndex);
//
// The type gets set by the router manager. But incase
// we are writing to the stack we need some kind of valid type
//
pSetRow->dwForwardType =
GetAsnInteger(&(pInput->ipForwardType),
pRpcIpForw->dwForwardType);
pSetRow->dwForwardAge =
GetAsnInteger(&(pInput->ipForwardAge),
pRpcIpForw->dwForwardAge);
pSetRow->dwForwardNextHopAS = 0;
pSetRow->dwForwardMetric1 =
GetAsnInteger(&(pInput->ipForwardMetric1),
pRpcIpForw->dwForwardMetric1);
pSetRow->dwForwardMetric2 =
GetAsnInteger(&(pInput->ipForwardMetric2),
pRpcIpForw->dwForwardMetric2);
pSetRow->dwForwardMetric3 =
GetAsnInteger(&(pInput->ipForwardMetric3),
pRpcIpForw->dwForwardMetric3);
pSetRow->dwForwardMetric4 =
GetAsnInteger(&(pInput->ipForwardMetric4),
pRpcIpForw->dwForwardMetric4);
pSetRow->dwForwardMetric5 =
GetAsnInteger(&(pInput->ipForwardMetric5),
pRpcIpForw->dwForwardMetric5);
TraceLeave("MibSetIpForwardEntry");
return MIB_S_SUCCESS;
}
}
case MIB_ACTION_SET:
{
TraceEnter("MibSetIpForwardEntry - SET");
switch(pInput->raAction)
{
case CREATE_ROW:
{
dwResult = InternalCreateIpForwardEntry(pInfo);
#ifdef MIB_DEBUG
if(dwResult isnot NO_ERROR)
{
TRACE1("Create failed with error %d",dwResult);
}
#endif
InvalidateCache(FORWARD_MIB);
TraceLeave("MibSetIpForwardEntry");
return dwResult;
}
case SET_ROW:
{
dwResult = InternalSetIpForwardEntry(pInfo);
#ifdef MIB_DEBUG
if(dwResult isnot NO_ERROR)
{
TRACE1("Set failed with error %d",dwResult);
}
#endif
InvalidateCache(FORWARD_MIB);
TraceLeave("MibSetIpForwardEntry");
return dwResult;
}
case DELETE_ROW:
{
dwResult = InternalDeleteIpForwardEntry(pInfo);
#ifdef MIB_DEBUG
if(dwResult isnot NO_ERROR)
{
TRACE1("Delete failed with error %d",dwResult);
}
#endif
InvalidateCache(FORWARD_MIB);
TraceLeave("MibSetIpForwardEntry");
return dwResult;
}
default:
{
TRACE1("Wrong row action %d",pInput->raAction);
TraceLeave("MibSetIpForwardEntry");
return MIB_S_SUCCESS;
}
}
}
case MIB_ACTION_CLEANUP:
{
TraceEnter("MibSetIpForwardEntry - CLEANUP");
if(pInput->bLocked)
{
ReleaseLock(FORWARD_MIB);
}
TraceLeave("MibSetIpForwardEntry");
return MIB_S_SUCCESS;
}
default:
{
TraceEnter("MibSetIpForwardEntry - WRONG ACTION");
TraceLeave("MibSetIpForwardEntry");
return MIB_S_INVALID_PARAMETER;
}
}
}
UINT
MibGetSysInfo(
UINT actionId,
AsnAny *objectArray,
UINT *errorIndex
)
{
DWORD dwResult;
PSYS_INFO_GET pOutput;
TraceEnter("MibGetSysInfo");
dwResult = UpdateCache(MIB_II_SYS);
if(dwResult isnot NO_ERROR)
{
TRACE1("Couldnt update SYS cache. Error %d", dwResult);
TraceLeave("MibGetSysInfo");
return dwResult;
}
pOutput = (PSYS_INFO_GET)objectArray;
EnterReader(MIB_II_SYS);
SetAsnOctetString(&(pOutput->sysDescr),
pOutput->rgbySysDescrInfo,
g_Cache.pRpcSysInfo->rgbySysDescr,
(strlen(g_Cache.pRpcSysInfo->rgbySysDescr)));
SetAsnInteger(&(pOutput->sysServices),g_Cache.pRpcSysInfo->dwSysServices);
SetAsnOctetString(&(pOutput->sysContact),
pOutput->rgbySysContactInfo,
g_Cache.pRpcSysInfo->rgbySysContact,
(strlen(g_Cache.pRpcSysInfo->rgbySysContact)));
SetAsnOctetString(&(pOutput->sysLocation),
pOutput->rgbySysLocationInfo,
g_Cache.pRpcSysInfo->rgbySysLocation,
(strlen(g_Cache.pRpcSysInfo->rgbySysLocation)));
SetAsnOctetString(&(pOutput->sysName),
pOutput->rgbySysNameInfo,
g_Cache.pRpcSysInfo->rgbySysName,
(strlen(g_Cache.pRpcSysInfo->rgbySysName)));
//
// must not cache system uptime so get update from dll
//
SetAsnTimeTicks(&(pOutput->sysUpTime),SnmpSvcGetUptime());
if (!IsAsnTypeNull(&pOutput->sysObjectID)) {
SnmpUtilOidCpy(&pOutput->sysObjectID.asnValue.object,
&g_Cache.pRpcSysInfo->aaSysObjectID.asnValue.object);
}
ReleaseLock(MIB_II_SYS);
TraceLeave("MibGetSysInfo");
return MIB_S_SUCCESS;
}
UINT
MibSetSysInfo(
UINT actionId,
AsnAny *objectArray,
UINT *errorIndex
)
{
DWORD dwResult,dwValueLen,dwValueType,dwStringLen;
PSYS_INFO_SET pInput;
HKEY hkeyMib2;
pInput = (PSYS_INFO_SET)objectArray;
switch(actionId)
{
case MIB_ACTION_VALIDATE:
{
pInput->bLocked = FALSE;
EnterWriter(MIB_II_SYS);
pInput->bLocked = TRUE;
TraceEnter("MibSetSysInfo - VALIDATE");
dwResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
REG_KEY_MIB2,
0,
KEY_ALL_ACCESS,
&pInput->hkeyMib2);
if(dwResult isnot NO_ERROR)
{
ReleaseLock(MIB_II_SYS);
pInput->bLocked = FALSE;
TRACE1("Couldnt open mib2 registry key. Error %d", dwResult);
TraceLeave("MibSetSysInfo");
return dwResult;
}
TraceLeave("MibSetSysInfo");
return MIB_S_SUCCESS;
}
case MIB_ACTION_SET:
{
TraceEnter("MibSetSysInfo - SET");
hkeyMib2 = pInput->hkeyMib2;
dwValueType = REG_SZ;
if (!IsAsnTypeNull(&pInput->sysName)) {
dwStringLen = pInput->sysName.asnValue.string.length;
dwValueLen = dwStringLen + 1;
memcpy(&pInput->rgbySysNameInfo,
pInput->sysName.asnValue.string.stream,
dwStringLen);
pInput->rgbySysNameInfo[dwStringLen] = '\0';
dwResult = RegSetValueEx(
hkeyMib2,
TEXT("sysName"),
0,
dwValueType,
pInput->rgbySysNameInfo,
dwValueLen);
if (dwResult isnot NO_ERROR) {
TRACE1("Couldnt write sysName value. Error %d", dwResult);
TraceLeave("MibSetSysInfo");
return dwResult;
}
InvalidateCache(MIB_II_SYS);
}
if (!IsAsnTypeNull(&pInput->sysContact)) {
dwStringLen = pInput->sysContact.asnValue.string.length;
dwValueLen = dwStringLen + 1;
memcpy(&pInput->rgbySysContactInfo,
pInput->sysContact.asnValue.string.stream,
dwStringLen);
pInput->rgbySysContactInfo[dwStringLen] = '\0';
dwResult = RegSetValueEx(
hkeyMib2,
TEXT("sysContact"),
0,
dwValueType,
pInput->rgbySysContactInfo,
dwValueLen);
if (dwResult isnot NO_ERROR) {
TRACE1("Couldnt write sysContact value. Error %d", dwResult);
TraceLeave("MibSetSysInfo");
return dwResult;
}
InvalidateCache(MIB_II_SYS);
}
if (!IsAsnTypeNull(&pInput->sysLocation)) {
dwStringLen = pInput->sysLocation.asnValue.string.length;
dwValueLen = dwStringLen + 1;
memcpy(&pInput->rgbySysLocationInfo,
pInput->sysLocation.asnValue.string.stream,
dwStringLen);
pInput->rgbySysLocationInfo[dwStringLen] = '\0';
dwResult = RegSetValueEx(
hkeyMib2,
TEXT("sysLocation"),
0,
dwValueType,
pInput->rgbySysLocationInfo,
dwValueLen);
if (dwResult isnot NO_ERROR) {
TRACE1("Couldnt write sysLocation value. Error %d", dwResult);
TraceLeave("MibSetSysInfo");
return dwResult;
}
InvalidateCache(MIB_II_SYS);
}
TraceLeave("MibSetSysInfo");
return MIB_S_SUCCESS;
}
case MIB_ACTION_CLEANUP:
{
TraceEnter("MibSetSysInfo - CLEANUP");
if (pInput->hkeyMib2) {
RegCloseKey(pInput->hkeyMib2);
}
if(pInput->bLocked)
{
ReleaseLock(MIB_II_SYS);
}
TraceLeave("MibSetSysInfo");
return MIB_S_SUCCESS;
}
default:
{
TraceEnter("MibSetSysInfo - WRONG ACTION");
TraceLeave("MibSetSysInfo");
return MIB_S_INVALID_PARAMETER;
}
}
}
DWORD
GetIfIndexFromAddr(
DWORD dwAddr
)
{
DWORD dwResult, i;
PMIB_IPADDRROW pRpcIpAddr;
DWORD dwIfIndex = INVALID_IFINDEX;
TraceEnter("GetIfIndexFromIpAddr");
dwResult = UpdateCache(MIB_II_IPADDR);
if(dwResult isnot NO_ERROR)
{
TRACE1("Couldnt update IP Addr cache. Error %d", dwResult);
TraceLeave("GetIfIndexFromIpAddr");
return dwIfIndex;
}
EnterReader(MIB_II_IPADDR);
pRpcIpAddr = &g_Cache.pRpcIpAddrTable->table[0];
for (i = 0; i < g_Cache.pRpcIpAddrTable->dwNumEntries; i++, pRpcIpAddr++)
{
if (dwAddr is pRpcIpAddr->dwAddr)
{
dwIfIndex = pRpcIpAddr->dwIndex;
TRACE1("Found exact match. ifIndex %d", dwIfIndex);
break;
}
if ((dwIfIndex is INVALID_IFINDEX) and (pRpcIpAddr->dwMask))
{
//
// See if addr is on the same subnet as this address.
//
if ((dwAddr & pRpcIpAddr->dwMask) is
(pRpcIpAddr->dwAddr & pRpcIpAddr->dwMask))
{
dwIfIndex = pRpcIpAddr->dwIndex;
TRACE1("Found possible match. ifIndex %d", dwIfIndex);
}
}
}
ReleaseLock(MIB_II_IPADDR);
TraceLeave("GetIfIndexFromIpAddr");
return dwIfIndex;
}