diff options
Diffstat (limited to 'agent/mibgroup/sctp-mib/sctpTables_solaris2.c')
-rw-r--r-- | agent/mibgroup/sctp-mib/sctpTables_solaris2.c | 182 |
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; +} |