blob: 202ab1a3e4b2ca7ed91f047affca6e2e541a07d3 [file] [log] [blame]
#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-includes.h>
#include <net-snmp/agent/net-snmp-agent-includes.h>
#include <net-snmp/data_access/ipstats.h>
#include <net-snmp/data_access/systemstats.h>
#include "kernel_sunos5.h"
static int _systemstats(mibgroup_e, netsnmp_container *, u_int);
static void _add_ipstats(mib2_ipIfStatsEntry_t *, mib2_ipIfStatsEntry_t *);
static int _insert_entry(netsnmp_container *, mib2_ipIfStatsEntry_t *);
void
netsnmp_access_systemstats_arch_init(void)
{
init_kernel_sunos5();
}
/*
* @retval 0 success
* @retval -1 container error
* @retval -2 could not create entry (probably malloc)
*/
int
netsnmp_access_systemstats_container_arch_load(netsnmp_container* container,
u_int load_flags)
{
int rc;
if (container == NULL)
return (-1);
if (load_flags & NETSNMP_ACCESS_SYSTEMSTATS_LOAD_IFTABLE)
return 0; /* we do not support ipIfStatsTable yet */
if ((rc = _systemstats(MIB_IP_TRAFFIC_STATS, container, load_flags)) < 0)
return (rc);
#if defined(NETSNMP_ENABLE_IPV6)
if ((rc = _systemstats(MIB_IP6, container, load_flags)) < 0) {
netsnmp_access_systemstats_container_free(container,
NETSNMP_ACCESS_SYSTEMSTATS_FREE_NOFLAGS);
return (rc);
}
#endif
return (0);
}
/*
* @retval 0 success
* @retval <0 error
*/
static int
_systemstats(mibgroup_e mib, netsnmp_container *container, u_int load_flags)
{
mib2_ipIfStatsEntry_t ipe, iptot;
req_e req = GET_FIRST;
int ipversion = (mib == MIB_IP6) ? MIB2_INETADDRESSTYPE_ipv6 :
MIB2_INETADDRESSTYPE_ipv4;
memset(&iptot, '\0', sizeof(iptot));
while (getMibstat(mib, &ipe, sizeof(ipe), req,
&Get_everything, NULL) == 0) {
req = GET_NEXT;
netsnmp_assert(ipe.ipIfStatsIPVersion == ipversion);
_add_ipstats(&iptot, &ipe);
}
iptot.ipIfStatsIPVersion = ipversion;
return _insert_entry(container, &iptot);
}
static void
_add_ipstats(mib2_ipIfStatsEntry_t *o1, mib2_ipIfStatsEntry_t *o2)
{
o1->ipIfStatsInHdrErrors += o2->ipIfStatsInHdrErrors;
o1->ipIfStatsInTooBigErrors += o2->ipIfStatsInTooBigErrors;
o1->ipIfStatsInNoRoutes += o2->ipIfStatsInNoRoutes;
o1->ipIfStatsInAddrErrors += o2->ipIfStatsInAddrErrors;
o1->ipIfStatsInUnknownProtos += o2->ipIfStatsInUnknownProtos;
o1->ipIfStatsInTruncatedPkts += o2->ipIfStatsInTruncatedPkts;
o1->ipIfStatsInDiscards += o2->ipIfStatsInDiscards;
o1->ipIfStatsOutDiscards += o2->ipIfStatsOutDiscards;
o1->ipIfStatsOutFragOKs += o2->ipIfStatsOutFragOKs;
o1->ipIfStatsOutFragFails += o2->ipIfStatsOutFragFails;
o1->ipIfStatsOutFragCreates += o2->ipIfStatsOutFragCreates;
o1->ipIfStatsReasmReqds += o2->ipIfStatsReasmReqds;
o1->ipIfStatsReasmOKs += o2->ipIfStatsReasmOKs;
o1->ipIfStatsReasmFails += o2->ipIfStatsReasmFails;
o1->ipIfStatsOutNoRoutes += o2->ipIfStatsOutNoRoutes;
o1->ipIfStatsReasmDuplicates += o2->ipIfStatsReasmDuplicates;
o1->ipIfStatsReasmPartDups += o2->ipIfStatsReasmPartDups;
o1->ipIfStatsForwProhibits += o2->ipIfStatsForwProhibits;
o1->udpInCksumErrs += o2->udpInCksumErrs;
o1->udpInOverflows += o2->udpInOverflows;
o1->rawipInOverflows += o2->rawipInOverflows;
o1->ipIfStatsInWrongIPVersion += o2->ipIfStatsInWrongIPVersion;
o1->ipIfStatsOutWrongIPVersion += o2->ipIfStatsOutWrongIPVersion;
o1->ipIfStatsOutSwitchIPVersion += o2->ipIfStatsOutSwitchIPVersion;
o1->ipIfStatsHCInReceives += o2->ipIfStatsHCInReceives;
o1->ipIfStatsHCInOctets += o2->ipIfStatsHCInOctets;
o1->ipIfStatsHCInForwDatagrams += o2->ipIfStatsHCInForwDatagrams;
o1->ipIfStatsHCInDelivers += o2->ipIfStatsHCInDelivers;
o1->ipIfStatsHCOutRequests += o2->ipIfStatsHCOutRequests;
o1->ipIfStatsHCOutForwDatagrams += o2->ipIfStatsHCOutForwDatagrams;
o1->ipIfStatsOutFragReqds += o2->ipIfStatsOutFragReqds;
o1->ipIfStatsHCOutTransmits += o2->ipIfStatsHCOutTransmits;
o1->ipIfStatsHCOutOctets += o2->ipIfStatsHCOutOctets;
o1->ipIfStatsHCInMcastPkts += o2->ipIfStatsHCInMcastPkts;
o1->ipIfStatsHCInMcastOctets += o2->ipIfStatsHCInMcastOctets;
o1->ipIfStatsHCOutMcastPkts += o2->ipIfStatsHCOutMcastPkts;
o1->ipIfStatsHCOutMcastOctets += o2->ipIfStatsHCOutMcastOctets;
o1->ipIfStatsHCInBcastPkts += o2->ipIfStatsHCInBcastPkts;
o1->ipIfStatsHCOutBcastPkts += o2->ipIfStatsHCOutBcastPkts;
o1->ipsecInSucceeded += o2->ipsecInSucceeded;
o1->ipsecInFailed += o2->ipsecInFailed;
o1->ipInCksumErrs += o2->ipInCksumErrs;
o1->tcpInErrs += o2->tcpInErrs;
o1->udpNoPorts += o2->udpNoPorts;
}
/*
* @retval 0 entry was successfully inserted in the container
* @retval -1 container error
* @retval -2 memory allocation error
*/
static int
_insert_entry(netsnmp_container *container, mib2_ipIfStatsEntry_t *ipe)
{
int i;
netsnmp_systemstats_entry *ep =
netsnmp_access_systemstats_entry_create(ipe->ipIfStatsIPVersion, 0);
DEBUGMSGTL(("access:systemstats:arch", "insert entry for v%d\n",
ipe->ipIfStatsIPVersion));
if (ep == NULL) {
DEBUGMSGT(("access:systemstats:arch", "insert failed (alloc)"));
return (-2);
}
ep->stats.HCInReceives.low =
ipe->ipIfStatsHCInReceives & 0xffffffff;
ep->stats.HCInReceives.high = ipe->ipIfStatsHCInReceives >> 32;
ep->stats.HCInOctets.low =
ipe->ipIfStatsHCInOctets & 0xffffffff;
ep->stats.HCInOctets.high = ipe->ipIfStatsHCInOctets >> 32;
ep->stats.InHdrErrors = ipe->ipIfStatsInHdrErrors;
ep->stats.InAddrErrors = ipe->ipIfStatsInAddrErrors;
ep->stats.InUnknownProtos = ipe->ipIfStatsInUnknownProtos;
ep->stats.InTruncatedPkts = ipe->ipIfStatsInTruncatedPkts;
ep->stats.HCInForwDatagrams.low =
ipe->ipIfStatsHCInForwDatagrams & 0xffffffff;
ep->stats.HCInForwDatagrams.high =
ipe->ipIfStatsHCInForwDatagrams >> 32;
ep->stats.ReasmReqds = ipe->ipIfStatsReasmReqds;
ep->stats.ReasmOKs = ipe->ipIfStatsReasmOKs;
ep->stats.ReasmFails = ipe->ipIfStatsReasmFails;
ep->stats.InDiscards = ipe->ipIfStatsInDiscards;
ep->stats.HCInDelivers.low =
ipe->ipIfStatsHCInDelivers & 0xffffffff;
ep->stats.HCInDelivers.high =
ipe->ipIfStatsHCInDelivers >> 32;
ep->stats.HCOutRequests.low =
ipe->ipIfStatsHCOutRequests & 0xffffffff;
ep->stats.HCOutRequests.high =
ipe->ipIfStatsHCOutRequests >> 32;
ep->stats.HCOutNoRoutes.low = ipe->ipIfStatsOutNoRoutes & 0xffffffff;
ep->stats.HCOutNoRoutes.high = 0;
ep->stats.HCOutForwDatagrams.low =
ipe->ipIfStatsHCOutForwDatagrams & 0xffffffff;
ep->stats.HCOutForwDatagrams.high =
ipe->ipIfStatsHCOutForwDatagrams >> 32;
ep->stats.HCOutDiscards.low = ipe->ipIfStatsOutDiscards & 0xffffffff;
ep->stats.HCOutDiscards.high = 0;
ep->stats.HCOutFragOKs.low = ipe->ipIfStatsOutFragOKs & 0xffffffff;
ep->stats.HCOutFragOKs.high = 0;
ep->stats.HCOutFragFails.low = ipe->ipIfStatsOutFragFails & 0xffffffff;
ep->stats.HCOutFragFails.high = 0;
ep->stats.HCOutFragCreates.low = ipe->ipIfStatsOutFragCreates & 0xffffffff;
ep->stats.HCOutFragCreates.high = 0;
ep->stats.HCOutTransmits.low =
ipe->ipIfStatsHCOutTransmits & 0xffffffff;
ep->stats.HCOutTransmits.high = ipe->ipIfStatsHCOutTransmits >> 32;
ep->stats.HCOutOctets.low = ipe->ipIfStatsHCOutOctets & 0xffffffff;
ep->stats.HCOutOctets.high = ipe->ipIfStatsHCOutOctets >> 32;
ep->stats.HCInMcastPkts.low = ipe->ipIfStatsHCInMcastPkts & 0xffffffff;
ep->stats.HCInMcastPkts.high = ipe->ipIfStatsHCInMcastPkts >> 32;
ep->stats.HCInMcastOctets.low =
ipe->ipIfStatsHCInMcastOctets & 0xffffffff;
ep->stats.HCInMcastOctets.high = ipe->ipIfStatsHCInMcastOctets >> 32;
ep->stats.HCOutMcastPkts.low =
ipe->ipIfStatsHCOutMcastPkts & 0xffffffff;
ep->stats.HCOutMcastPkts.high = ipe->ipIfStatsHCOutMcastPkts >> 32;
ep->stats.HCOutMcastOctets.low =
ipe->ipIfStatsHCOutMcastOctets & 0xffffffff;
ep->stats.HCOutMcastOctets.high = ipe->ipIfStatsHCOutMcastOctets >> 32;
ep->stats.HCInBcastPkts.low = ipe->ipIfStatsHCInBcastPkts & 0xffffffff;
ep->stats.HCInBcastPkts.high = ipe->ipIfStatsHCInBcastPkts >> 32;
ep->stats.HCOutBcastPkts.low =
ipe->ipIfStatsHCOutBcastPkts & 0xffffffff;
ep->stats.HCOutBcastPkts.high = ipe->ipIfStatsHCOutBcastPkts >> 32;
for (i=0; i<=IPSYSTEMSTATSTABLE_LAST; i++)
ep->stats.columnAvail[i] = 1;
if (CONTAINER_INSERT(container, ep) < 0) {
DEBUGMSGT(("access:systemstats:arch", "unable to insert entry"));
netsnmp_access_systemstats_entry_free(ep);
return (-1);
}
return (0);
}