summaryrefslogtreecommitdiff
path: root/agent/mibgroup/sctp-mib/sctpTables_solaris2.c
diff options
context:
space:
mode:
Diffstat (limited to 'agent/mibgroup/sctp-mib/sctpTables_solaris2.c')
-rw-r--r--agent/mibgroup/sctp-mib/sctpTables_solaris2.c182
1 files changed, 182 insertions, 0 deletions
diff --git a/agent/mibgroup/sctp-mib/sctpTables_solaris2.c b/agent/mibgroup/sctp-mib/sctpTables_solaris2.c
new file mode 100644
index 0000000..0993ab3
--- /dev/null
+++ b/agent/mibgroup/sctp-mib/sctpTables_solaris2.c
@@ -0,0 +1,182 @@
+#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;
+}