2966 lines
89 KiB
C
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;
|
|
}
|