blob: 0993ab3fdd722d7105e0bce529c4c3427bced304 [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 "sctpAssocTable.h"
#include "sctpAssocLocalAddrTable.h"
#include "sctpAssocRemAddrTable.h"
#include "sctpTables_common.h"
#include <util_funcs.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdint.h>
#include <sys/socket.h>
#include <inet/mib2.h>
#include "kernel_sunos5.h"
static int
parse_assoc_local_address(sctpTables_containers * containers,
mib2_sctpConnLocalEntry_t *lce)
{
int ret;
sctpAssocLocalAddrTable_entry *entry;
entry = sctpAssocLocalAddrTable_entry_create();
if (entry == NULL)
return SNMP_ERR_GENERR;
entry->sctpAssocId = 0;
entry->sctpAssocLocalAddrType = lce->sctpAssocLocalAddrType;
if (lce->sctpAssocLocalAddrType == INETADDRESSTYPE_IPV4) {
entry->sctpAssocLocalAddr_len = 4;
memcpy(entry->sctpAssocLocalAddr,
lce->sctpAssocLocalAddr.s6_addr+12,
entry->sctpAssocLocalAddr_len);
} else if (lce->sctpAssocLocalAddrType == INETADDRESSTYPE_IPV6) {
entry->sctpAssocLocalAddr_len = 16;
memcpy(entry->sctpAssocLocalAddr,
&lce->sctpAssocLocalAddr,
entry->sctpAssocLocalAddr_len);
}
entry->sctpAssocLocalAddrStartTime = 0;
ret = sctpAssocLocalAddrTable_add_or_update(containers->sctpAssocLocalAddrTable,
entry);
return ret;
}
static int
parse_assoc(sctpTables_containers * containers, mib2_sctpConnEntry_t *sce)
{
int ret;
sctpAssocTable_entry *entry;
entry = sctpAssocTable_entry_create();
if (entry == NULL)
return SNMP_ERR_GENERR;
switch (sce->sctpAssocState) {
case MIB2_SCTP_closed:
entry->sctpAssocState = SCTPASSOCSTATE_CLOSED;
break;
case MIB2_SCTP_cookieWait:
entry->sctpAssocState = SCTPASSOCSTATE_COOKIEWAIT;
break;
case MIB2_SCTP_cookieEchoed:
entry->sctpAssocState = SCTPASSOCSTATE_COOKIEECHOED;
break;
case MIB2_SCTP_established:
entry->sctpAssocState = SCTPASSOCSTATE_ESTABLISHED;
break;
case MIB2_SCTP_shutdownPending:
entry->sctpAssocState = SCTPASSOCSTATE_SHUTDOWNPENDING;
break;
case MIB2_SCTP_shutdownSent:
entry->sctpAssocState = SCTPASSOCSTATE_SHUTDOWNSENT;
break;
case MIB2_SCTP_shutdownReceived:
entry->sctpAssocState = SCTPASSOCSTATE_SHUTDOWNRECEIVED;
break;
case MIB2_SCTP_shutdownAckSent:
entry->sctpAssocState = SCTPASSOCSTATE_SHUTDOWNACKSENT;
break;
}
entry->sctpAssocHeartBeatInterval = sce->sctpAssocHeartBeatInterval;
entry->sctpAssocId = sce->sctpAssocId;
entry->sctpAssocPrimProcess = sce->sctpAssocPrimProcess;
entry->sctpAssocLocalPort = sce->sctpAssocLocalPort;
entry->sctpAssocRemPrimAddrType = sce->sctpAssocRemPrimAddrType;
if (entry->sctpAssocRemPrimAddrType == INETADDRESSTYPE_IPV4) {
entry->sctpAssocRemPrimAddr_len = 4;
memcpy(entry->sctpAssocRemPrimAddr, sce->sctpAssocRemPrimAddr.s6_addr+12,
entry->sctpAssocRemPrimAddr_len);
}
else {
entry->sctpAssocRemPrimAddr_len = 16;
memcpy(entry->sctpAssocRemPrimAddr, sce->sctpAssocRemPrimAddr.s6_addr,
entry->sctpAssocRemPrimAddr_len);
}
entry->sctpAssocRemPort = sce->sctpAssocRemPort;
entry->sctpAssocInStreams = sce->sctpAssocInStreams;
entry->sctpAssocOutStreams = sce->sctpAssocOutStreams;
entry->sctpAssocMaxRetr = sce->sctpAssocMaxRetr;
entry->sctpAssocT1expireds = sce->sctpAssocT1expired;
entry->sctpAssocRtxChunks = sce->sctpAssocRtxChunks;
entry->sctpAssocT2expireds = sce->sctpAssocT2expired;
entry->sctpAssocRemHostName[0] = 0;
entry->sctpAssocRemHostName_len = 0;
entry->sctpAssocDiscontinuityTime = 0;
entry->sctpAssocStartTime = sce->sctpAssocStartTime;
ret = sctpAssocTable_add_or_update(containers->sctpAssocTable, entry);
return ret;
}
static int
parse_assoc_remote_address(sctpTables_containers * containers,
mib2_sctpConnRemoteEntry_t *rce)
{
int ret;
sctpAssocRemAddrTable_entry *entry;
entry = sctpAssocRemAddrTable_entry_create();
if (entry == NULL)
return SNMP_ERR_GENERR;
entry->sctpAssocId = rce->sctpAssocId;
entry->sctpAssocRemAddrActive = rce->sctpAssocRemAddrActive;
entry->sctpAssocRemAddrHBActive = rce->sctpAssocRemAddrHBActive;
entry->sctpAssocRemAddrRTO = rce->sctpAssocRemAddrRTO;
entry->sctpAssocRemAddrMaxPathRtx = rce->sctpAssocRemAddrMaxPathRtx;
entry->sctpAssocRemAddrRtx = rce->sctpAssocRemAddrRtx;
entry->sctpAssocRemAddrStartTime = 0;
entry->sctpAssocRemAddrType = rce->sctpAssocRemAddrType;
if (rce->sctpAssocRemAddrType == INETADDRESSTYPE_IPV4) {
entry->sctpAssocRemAddr_len = 4;
memcpy(entry->sctpAssocRemAddr,
rce->sctpAssocRemAddr.s6_addr+12,
entry->sctpAssocRemAddr_len);
} else if (rce->sctpAssocRemAddrType == INETADDRESSTYPE_IPV6) {
entry->sctpAssocRemAddr_len = 16;
memcpy(entry->sctpAssocRemAddr,
&rce->sctpAssocRemAddr,
entry->sctpAssocRemAddr_len);
}
ret =
sctpAssocRemAddrTable_add_or_update(containers->sctpAssocRemAddrTable,
entry);
return ret;
}
int
sctpTables_arch_load(sctpTables_containers * containers, u_long * flags)
{
int ret = SNMP_ERR_NOERROR;
mib2_sctpConnEntry_t sce;
mib2_sctpConnLocalEntry_t lce;
mib2_sctpConnRemoteEntry_t rce;
req_e req = GET_FIRST;
while (getMibstat(MIB_SCTP_CONN, &sce, sizeof(sce), req, &Get_everything, 0) == 0) {
req = GET_NEXT;
parse_assoc(containers, &sce);
}
req = GET_FIRST;
while (getMibstat(MIB_SCTP_CONN_LOCAL, &lce, sizeof(lce), req, &Get_everything, 0) == 0) {
req = GET_NEXT;
parse_assoc_local_address(containers, &lce);
}
req = GET_FIRST;
while (getMibstat(MIB_SCTP_CONN_REMOTE, &rce, sizeof(rce), req, &Get_everything, 0) == 0) {
req = GET_NEXT;
parse_assoc_remote_address(containers, &rce);
}
return ret;
}