17c478bd9Sstevel@tonic-gate /*
27c478bd9Sstevel@tonic-gate * CDDL HEADER START
37c478bd9Sstevel@tonic-gate *
47c478bd9Sstevel@tonic-gate * The contents of this file are subject to the terms of the
545916cd2Sjpk * Common Development and Distribution License (the "License").
645916cd2Sjpk * You may not use this file except in compliance with the License.
77c478bd9Sstevel@tonic-gate *
87c478bd9Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
97c478bd9Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing.
107c478bd9Sstevel@tonic-gate * See the License for the specific language governing permissions
117c478bd9Sstevel@tonic-gate * and limitations under the License.
127c478bd9Sstevel@tonic-gate *
137c478bd9Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each
147c478bd9Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
157c478bd9Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the
167c478bd9Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying
177c478bd9Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner]
187c478bd9Sstevel@tonic-gate *
197c478bd9Sstevel@tonic-gate * CDDL HEADER END
207c478bd9Sstevel@tonic-gate */
2177c67f2fSkcpoon
227c478bd9Sstevel@tonic-gate /*
235dd46ab5SKacheong Poon * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
247c478bd9Sstevel@tonic-gate */
257c478bd9Sstevel@tonic-gate
267c478bd9Sstevel@tonic-gate #include <sys/types.h>
277c478bd9Sstevel@tonic-gate #include <sys/stream.h>
287c478bd9Sstevel@tonic-gate #include <sys/cmn_err.h>
297c478bd9Sstevel@tonic-gate #define _SUN_TPI_VERSION 2
307c478bd9Sstevel@tonic-gate #include <sys/tihdr.h>
317c478bd9Sstevel@tonic-gate #include <sys/ddi.h>
327c478bd9Sstevel@tonic-gate #include <sys/sunddi.h>
3345916cd2Sjpk #include <sys/tsol/tndb.h>
347c478bd9Sstevel@tonic-gate
357c478bd9Sstevel@tonic-gate #include <netinet/in.h>
367c478bd9Sstevel@tonic-gate
377c478bd9Sstevel@tonic-gate #include <inet/common.h>
387c478bd9Sstevel@tonic-gate #include <inet/ip.h>
397c478bd9Sstevel@tonic-gate #include <inet/mib2.h>
407c478bd9Sstevel@tonic-gate #include <inet/snmpcom.h>
417c478bd9Sstevel@tonic-gate #include <inet/kstatcom.h>
427c478bd9Sstevel@tonic-gate #include <inet/ipclassifier.h>
437c478bd9Sstevel@tonic-gate #include "sctp_impl.h"
447c478bd9Sstevel@tonic-gate #include "sctp_addr.h"
457c478bd9Sstevel@tonic-gate
465dd46ab5SKacheong Poon static void sctp_clr_kstats2(sctp_kstat_t *);
475dd46ab5SKacheong Poon static void sctp_add_kstats2(sctp_kstat_counter_t *, sctp_kstat_t *);
485dd46ab5SKacheong Poon static int sctp_snmp_state(sctp_t *);
495dd46ab5SKacheong Poon static void sctp_sum_mib(sctp_stack_t *, mib2_sctp_t *);
505dd46ab5SKacheong Poon static void sctp_add_mib(mib2_sctp_t *, mib2_sctp_t *);
5177c67f2fSkcpoon
527c478bd9Sstevel@tonic-gate static int
sctp_kstat_update(kstat_t * kp,int rw)537c478bd9Sstevel@tonic-gate sctp_kstat_update(kstat_t *kp, int rw)
547c478bd9Sstevel@tonic-gate {
557c478bd9Sstevel@tonic-gate sctp_named_kstat_t *sctpkp;
567c478bd9Sstevel@tonic-gate sctp_t *sctp, *sctp_prev;
57f4b3ec61Sdh155122 zoneid_t myzoneid;
58f4b3ec61Sdh155122 netstackid_t stackid = (netstackid_t)(uintptr_t)kp->ks_private;
59f4b3ec61Sdh155122 netstack_t *ns;
60f4b3ec61Sdh155122 sctp_stack_t *sctps;
615dd46ab5SKacheong Poon mib2_sctp_t sctp_mib;
627c478bd9Sstevel@tonic-gate
637c478bd9Sstevel@tonic-gate if (kp == NULL|| kp->ks_data == NULL)
647c478bd9Sstevel@tonic-gate return (EIO);
657c478bd9Sstevel@tonic-gate
667c478bd9Sstevel@tonic-gate if (rw == KSTAT_WRITE)
677c478bd9Sstevel@tonic-gate return (EACCES);
687c478bd9Sstevel@tonic-gate
69f4b3ec61Sdh155122 ns = netstack_find_by_stackid(stackid);
70f4b3ec61Sdh155122 if (ns == NULL)
71f4b3ec61Sdh155122 return (-1);
72f4b3ec61Sdh155122 sctps = ns->netstack_sctp;
73f4b3ec61Sdh155122 if (sctps == NULL) {
74f4b3ec61Sdh155122 netstack_rele(ns);
75f4b3ec61Sdh155122 return (-1);
76f4b3ec61Sdh155122 }
775dd46ab5SKacheong Poon
785dd46ab5SKacheong Poon /*
795dd46ab5SKacheong Poon * For all exclusive netstacks, the zone ID is always GLOBAL_ZONEID.
805dd46ab5SKacheong Poon */
815dd46ab5SKacheong Poon if (stackid != GLOBAL_NETSTACKID)
825dd46ab5SKacheong Poon myzoneid = GLOBAL_ZONEID;
835dd46ab5SKacheong Poon else
845dd46ab5SKacheong Poon myzoneid = curproc->p_zone->zone_id;
855dd46ab5SKacheong Poon
865dd46ab5SKacheong Poon bzero(&sctp_mib, sizeof (sctp_mib));
877c478bd9Sstevel@tonic-gate
887c478bd9Sstevel@tonic-gate /*
897c478bd9Sstevel@tonic-gate * Get the number of current associations and gather their
907c478bd9Sstevel@tonic-gate * individual set of statistics.
917c478bd9Sstevel@tonic-gate */
927c478bd9Sstevel@tonic-gate sctp_prev = NULL;
93f4b3ec61Sdh155122 mutex_enter(&sctps->sctps_g_lock);
94bd670b35SErik Nordmark sctp = list_head(&sctps->sctps_g_list);
957c478bd9Sstevel@tonic-gate while (sctp != NULL) {
967c478bd9Sstevel@tonic-gate mutex_enter(&sctp->sctp_reflock);
977c478bd9Sstevel@tonic-gate if (sctp->sctp_condemned) {
987c478bd9Sstevel@tonic-gate mutex_exit(&sctp->sctp_reflock);
99f4b3ec61Sdh155122 sctp = list_next(&sctps->sctps_g_list, sctp);
1007c478bd9Sstevel@tonic-gate continue;
1017c478bd9Sstevel@tonic-gate }
1027c478bd9Sstevel@tonic-gate sctp->sctp_refcnt++;
1037c478bd9Sstevel@tonic-gate mutex_exit(&sctp->sctp_reflock);
104f4b3ec61Sdh155122 mutex_exit(&sctps->sctps_g_lock);
1057c478bd9Sstevel@tonic-gate if (sctp_prev != NULL)
1067c478bd9Sstevel@tonic-gate SCTP_REFRELE(sctp_prev);
107f4b3ec61Sdh155122 if (sctp->sctp_connp->conn_zoneid != myzoneid)
1087c478bd9Sstevel@tonic-gate goto next_sctp;
1097c478bd9Sstevel@tonic-gate if (sctp->sctp_state == SCTPS_ESTABLISHED ||
1107c478bd9Sstevel@tonic-gate sctp->sctp_state == SCTPS_SHUTDOWN_PENDING ||
1117c478bd9Sstevel@tonic-gate sctp->sctp_state == SCTPS_SHUTDOWN_RECEIVED) {
1125dd46ab5SKacheong Poon /*
1135dd46ab5SKacheong Poon * Just bump the local sctp_mib. The number of
1145dd46ab5SKacheong Poon * existing associations is not kept in kernel.
1155dd46ab5SKacheong Poon */
1165dd46ab5SKacheong Poon BUMP_MIB(&sctp_mib, sctpCurrEstab);
1177c478bd9Sstevel@tonic-gate }
1187c478bd9Sstevel@tonic-gate
1197c478bd9Sstevel@tonic-gate if (sctp->sctp_opkts) {
1205dd46ab5SKacheong Poon SCTPS_UPDATE_MIB(sctps, sctpOutSCTPPkts,
1217c478bd9Sstevel@tonic-gate sctp->sctp_opkts);
1227c478bd9Sstevel@tonic-gate sctp->sctp_opkts = 0;
1237c478bd9Sstevel@tonic-gate }
1247c478bd9Sstevel@tonic-gate
1257c478bd9Sstevel@tonic-gate if (sctp->sctp_obchunks) {
1265dd46ab5SKacheong Poon SCTPS_UPDATE_MIB(sctps, sctpOutCtrlChunks,
1277c478bd9Sstevel@tonic-gate sctp->sctp_obchunks);
12835e12f9cSGeorge Shepherd UPDATE_LOCAL(sctp->sctp_cum_obchunks,
12935e12f9cSGeorge Shepherd sctp->sctp_obchunks);
1307c478bd9Sstevel@tonic-gate sctp->sctp_obchunks = 0;
1317c478bd9Sstevel@tonic-gate }
1327c478bd9Sstevel@tonic-gate
1337c478bd9Sstevel@tonic-gate if (sctp->sctp_odchunks) {
1345dd46ab5SKacheong Poon SCTPS_UPDATE_MIB(sctps, sctpOutOrderChunks,
1357c478bd9Sstevel@tonic-gate sctp->sctp_odchunks);
13635e12f9cSGeorge Shepherd UPDATE_LOCAL(sctp->sctp_cum_odchunks,
13735e12f9cSGeorge Shepherd sctp->sctp_odchunks);
1387c478bd9Sstevel@tonic-gate sctp->sctp_odchunks = 0;
1397c478bd9Sstevel@tonic-gate }
1407c478bd9Sstevel@tonic-gate
1417c478bd9Sstevel@tonic-gate if (sctp->sctp_oudchunks) {
1425dd46ab5SKacheong Poon SCTPS_UPDATE_MIB(sctps, sctpOutUnorderChunks,
1437c478bd9Sstevel@tonic-gate sctp->sctp_oudchunks);
14435e12f9cSGeorge Shepherd UPDATE_LOCAL(sctp->sctp_cum_oudchunks,
14535e12f9cSGeorge Shepherd sctp->sctp_oudchunks);
1467c478bd9Sstevel@tonic-gate sctp->sctp_oudchunks = 0;
1477c478bd9Sstevel@tonic-gate }
1487c478bd9Sstevel@tonic-gate
1497c478bd9Sstevel@tonic-gate if (sctp->sctp_rxtchunks) {
1505dd46ab5SKacheong Poon SCTPS_UPDATE_MIB(sctps, sctpRetransChunks,
1517c478bd9Sstevel@tonic-gate sctp->sctp_rxtchunks);
15235e12f9cSGeorge Shepherd UPDATE_LOCAL(sctp->sctp_cum_rxtchunks,
15335e12f9cSGeorge Shepherd sctp->sctp_rxtchunks);
1547c478bd9Sstevel@tonic-gate sctp->sctp_rxtchunks = 0;
1557c478bd9Sstevel@tonic-gate }
1567c478bd9Sstevel@tonic-gate
1577c478bd9Sstevel@tonic-gate if (sctp->sctp_ipkts) {
1585dd46ab5SKacheong Poon SCTPS_UPDATE_MIB(sctps, sctpInSCTPPkts,
159f4b3ec61Sdh155122 sctp->sctp_ipkts);
1607c478bd9Sstevel@tonic-gate sctp->sctp_ipkts = 0;
1617c478bd9Sstevel@tonic-gate }
1627c478bd9Sstevel@tonic-gate
1637c478bd9Sstevel@tonic-gate if (sctp->sctp_ibchunks) {
1645dd46ab5SKacheong Poon SCTPS_UPDATE_MIB(sctps, sctpInCtrlChunks,
1657c478bd9Sstevel@tonic-gate sctp->sctp_ibchunks);
16635e12f9cSGeorge Shepherd UPDATE_LOCAL(sctp->sctp_cum_ibchunks,
16735e12f9cSGeorge Shepherd sctp->sctp_ibchunks);
1687c478bd9Sstevel@tonic-gate sctp->sctp_ibchunks = 0;
1697c478bd9Sstevel@tonic-gate }
1707c478bd9Sstevel@tonic-gate
1717c478bd9Sstevel@tonic-gate if (sctp->sctp_idchunks) {
1725dd46ab5SKacheong Poon SCTPS_UPDATE_MIB(sctps, sctpInOrderChunks,
1737c478bd9Sstevel@tonic-gate sctp->sctp_idchunks);
17435e12f9cSGeorge Shepherd UPDATE_LOCAL(sctp->sctp_cum_idchunks,
17535e12f9cSGeorge Shepherd sctp->sctp_idchunks);
1767c478bd9Sstevel@tonic-gate sctp->sctp_idchunks = 0;
1777c478bd9Sstevel@tonic-gate }
1787c478bd9Sstevel@tonic-gate
1797c478bd9Sstevel@tonic-gate if (sctp->sctp_iudchunks) {
1805dd46ab5SKacheong Poon SCTPS_UPDATE_MIB(sctps, sctpInUnorderChunks,
1817c478bd9Sstevel@tonic-gate sctp->sctp_iudchunks);
18235e12f9cSGeorge Shepherd UPDATE_LOCAL(sctp->sctp_cum_iudchunks,
18335e12f9cSGeorge Shepherd sctp->sctp_iudchunks);
1847c478bd9Sstevel@tonic-gate sctp->sctp_iudchunks = 0;
1857c478bd9Sstevel@tonic-gate }
1867c478bd9Sstevel@tonic-gate
1877c478bd9Sstevel@tonic-gate if (sctp->sctp_fragdmsgs) {
1885dd46ab5SKacheong Poon SCTPS_UPDATE_MIB(sctps, sctpFragUsrMsgs,
1897c478bd9Sstevel@tonic-gate sctp->sctp_fragdmsgs);
1907c478bd9Sstevel@tonic-gate sctp->sctp_fragdmsgs = 0;
1917c478bd9Sstevel@tonic-gate }
1927c478bd9Sstevel@tonic-gate
1937c478bd9Sstevel@tonic-gate if (sctp->sctp_reassmsgs) {
1945dd46ab5SKacheong Poon SCTPS_UPDATE_MIB(sctps, sctpReasmUsrMsgs,
1957c478bd9Sstevel@tonic-gate sctp->sctp_reassmsgs);
1967c478bd9Sstevel@tonic-gate sctp->sctp_reassmsgs = 0;
1977c478bd9Sstevel@tonic-gate }
1987c478bd9Sstevel@tonic-gate
1997c478bd9Sstevel@tonic-gate next_sctp:
2007c478bd9Sstevel@tonic-gate sctp_prev = sctp;
201f4b3ec61Sdh155122 mutex_enter(&sctps->sctps_g_lock);
202f4b3ec61Sdh155122 sctp = list_next(&sctps->sctps_g_list, sctp);
2037c478bd9Sstevel@tonic-gate }
204f4b3ec61Sdh155122 mutex_exit(&sctps->sctps_g_lock);
2057c478bd9Sstevel@tonic-gate if (sctp_prev != NULL)
2067c478bd9Sstevel@tonic-gate SCTP_REFRELE(sctp_prev);
2077c478bd9Sstevel@tonic-gate
2085dd46ab5SKacheong Poon sctp_sum_mib(sctps, &sctp_mib);
2095dd46ab5SKacheong Poon
2107c478bd9Sstevel@tonic-gate /* Copy data from the SCTP MIB */
2117c478bd9Sstevel@tonic-gate sctpkp = (sctp_named_kstat_t *)kp->ks_data;
2127c478bd9Sstevel@tonic-gate
2137c478bd9Sstevel@tonic-gate /* These are from global ndd params. */
214f4b3ec61Sdh155122 sctpkp->sctpRtoMin.value.ui32 = sctps->sctps_rto_ming;
215f4b3ec61Sdh155122 sctpkp->sctpRtoMax.value.ui32 = sctps->sctps_rto_maxg;
216f4b3ec61Sdh155122 sctpkp->sctpRtoInitial.value.ui32 = sctps->sctps_rto_initialg;
217f4b3ec61Sdh155122 sctpkp->sctpValCookieLife.value.ui32 = sctps->sctps_cookie_life;
218f4b3ec61Sdh155122 sctpkp->sctpMaxInitRetr.value.ui32 = sctps->sctps_max_init_retr;
2197c478bd9Sstevel@tonic-gate
2205dd46ab5SKacheong Poon /* Copy data from the local sctp_mib to the provided kstat. */
2215dd46ab5SKacheong Poon sctpkp->sctpCurrEstab.value.i32 = sctp_mib.sctpCurrEstab;
2225dd46ab5SKacheong Poon sctpkp->sctpActiveEstab.value.i32 = sctp_mib.sctpActiveEstab;
2235dd46ab5SKacheong Poon sctpkp->sctpPassiveEstab.value.i32 = sctp_mib.sctpPassiveEstab;
2245dd46ab5SKacheong Poon sctpkp->sctpAborted.value.i32 = sctp_mib.sctpAborted;
2255dd46ab5SKacheong Poon sctpkp->sctpShutdowns.value.i32 = sctp_mib.sctpShutdowns;
2265dd46ab5SKacheong Poon sctpkp->sctpOutOfBlue.value.i32 = sctp_mib.sctpOutOfBlue;
2275dd46ab5SKacheong Poon sctpkp->sctpChecksumError.value.i32 = sctp_mib.sctpChecksumError;
2285dd46ab5SKacheong Poon sctpkp->sctpOutCtrlChunks.value.i64 = sctp_mib.sctpOutCtrlChunks;
2295dd46ab5SKacheong Poon sctpkp->sctpOutOrderChunks.value.i64 = sctp_mib.sctpOutOrderChunks;
2305dd46ab5SKacheong Poon sctpkp->sctpOutUnorderChunks.value.i64 = sctp_mib.sctpOutUnorderChunks;
2315dd46ab5SKacheong Poon sctpkp->sctpRetransChunks.value.i64 = sctp_mib.sctpRetransChunks;
2325dd46ab5SKacheong Poon sctpkp->sctpOutAck.value.i32 = sctp_mib.sctpOutAck;
2335dd46ab5SKacheong Poon sctpkp->sctpOutAckDelayed.value.i32 = sctp_mib.sctpOutAckDelayed;
2345dd46ab5SKacheong Poon sctpkp->sctpOutWinUpdate.value.i32 = sctp_mib.sctpOutWinUpdate;
2355dd46ab5SKacheong Poon sctpkp->sctpOutFastRetrans.value.i32 = sctp_mib.sctpOutFastRetrans;
2365dd46ab5SKacheong Poon sctpkp->sctpOutWinProbe.value.i32 = sctp_mib.sctpOutWinProbe;
2375dd46ab5SKacheong Poon sctpkp->sctpInCtrlChunks.value.i64 = sctp_mib.sctpInCtrlChunks;
2385dd46ab5SKacheong Poon sctpkp->sctpInOrderChunks.value.i64 = sctp_mib.sctpInOrderChunks;
2395dd46ab5SKacheong Poon sctpkp->sctpInUnorderChunks.value.i64 = sctp_mib.sctpInUnorderChunks;
2405dd46ab5SKacheong Poon sctpkp->sctpInAck.value.i32 = sctp_mib.sctpInAck;
2415dd46ab5SKacheong Poon sctpkp->sctpInDupAck.value.i32 = sctp_mib.sctpInDupAck;
2425dd46ab5SKacheong Poon sctpkp->sctpInAckUnsent.value.i32 = sctp_mib.sctpInAckUnsent;
2435dd46ab5SKacheong Poon sctpkp->sctpFragUsrMsgs.value.i64 = sctp_mib.sctpFragUsrMsgs;
2445dd46ab5SKacheong Poon sctpkp->sctpReasmUsrMsgs.value.i64 = sctp_mib.sctpReasmUsrMsgs;
2455dd46ab5SKacheong Poon sctpkp->sctpOutSCTPPkts.value.i64 = sctp_mib.sctpOutSCTPPkts;
2465dd46ab5SKacheong Poon sctpkp->sctpInSCTPPkts.value.i64 = sctp_mib.sctpInSCTPPkts;
2475dd46ab5SKacheong Poon sctpkp->sctpInInvalidCookie.value.i32 = sctp_mib.sctpInInvalidCookie;
2485dd46ab5SKacheong Poon sctpkp->sctpTimRetrans.value.i32 = sctp_mib.sctpTimRetrans;
2495dd46ab5SKacheong Poon sctpkp->sctpTimRetransDrop.value.i32 = sctp_mib.sctpTimRetransDrop;
2507c478bd9Sstevel@tonic-gate sctpkp->sctpTimHeartBeatProbe.value.i32 =
2515dd46ab5SKacheong Poon sctp_mib.sctpTimHeartBeatProbe;
2525dd46ab5SKacheong Poon sctpkp->sctpTimHeartBeatDrop.value.i32 = sctp_mib.sctpTimHeartBeatDrop;
2535dd46ab5SKacheong Poon sctpkp->sctpListenDrop.value.i32 = sctp_mib.sctpListenDrop;
2545dd46ab5SKacheong Poon sctpkp->sctpInClosed.value.i32 = sctp_mib.sctpInClosed;
2557c478bd9Sstevel@tonic-gate
256f4b3ec61Sdh155122 netstack_rele(ns);
2577c478bd9Sstevel@tonic-gate return (0);
2587c478bd9Sstevel@tonic-gate }
2597c478bd9Sstevel@tonic-gate
260f4b3ec61Sdh155122 void *
sctp_kstat_init(netstackid_t stackid)261f4b3ec61Sdh155122 sctp_kstat_init(netstackid_t stackid)
2627c478bd9Sstevel@tonic-gate {
263f4b3ec61Sdh155122 kstat_t *ksp;
264f4b3ec61Sdh155122
2657c478bd9Sstevel@tonic-gate sctp_named_kstat_t template = {
2667c478bd9Sstevel@tonic-gate { "sctpRtoAlgorithm", KSTAT_DATA_INT32, 0 },
2677c478bd9Sstevel@tonic-gate { "sctpRtoMin", KSTAT_DATA_UINT32, 0 },
2687c478bd9Sstevel@tonic-gate { "sctpRtoMax", KSTAT_DATA_UINT32, 0 },
2697c478bd9Sstevel@tonic-gate { "sctpRtoInitial", KSTAT_DATA_UINT32, 0 },
2707c478bd9Sstevel@tonic-gate { "sctpMaxAssocs", KSTAT_DATA_INT32, 0 },
2717c478bd9Sstevel@tonic-gate { "sctpValCookieLife", KSTAT_DATA_UINT32, 0 },
2727c478bd9Sstevel@tonic-gate { "sctpMaxInitRetr", KSTAT_DATA_UINT32, 0 },
2737c478bd9Sstevel@tonic-gate { "sctpCurrEstab", KSTAT_DATA_INT32, 0 },
2747c478bd9Sstevel@tonic-gate { "sctpActiveEstab", KSTAT_DATA_INT32, 0 },
2757c478bd9Sstevel@tonic-gate { "sctpPassiveEstab", KSTAT_DATA_INT32, 0 },
2767c478bd9Sstevel@tonic-gate { "sctpAborted", KSTAT_DATA_INT32, 0 },
2777c478bd9Sstevel@tonic-gate { "sctpShutdowns", KSTAT_DATA_INT32, 0 },
2787c478bd9Sstevel@tonic-gate { "sctpOutOfBlue", KSTAT_DATA_INT32, 0 },
2797c478bd9Sstevel@tonic-gate { "sctpChecksumError", KSTAT_DATA_INT32, 0 },
2807c478bd9Sstevel@tonic-gate { "sctpOutCtrlChunks", KSTAT_DATA_INT64, 0 },
2817c478bd9Sstevel@tonic-gate { "sctpOutOrderChunks", KSTAT_DATA_INT64, 0 },
2827c478bd9Sstevel@tonic-gate { "sctpOutUnorderChunks", KSTAT_DATA_INT64, 0 },
2837c478bd9Sstevel@tonic-gate { "sctpRetransChunks", KSTAT_DATA_INT64, 0 },
2847c478bd9Sstevel@tonic-gate { "sctpOutAck", KSTAT_DATA_INT32, 0 },
2857c478bd9Sstevel@tonic-gate { "sctpOutAckDelayed", KSTAT_DATA_INT32, 0 },
2867c478bd9Sstevel@tonic-gate { "sctpOutWinUpdate", KSTAT_DATA_INT32, 0 },
2877c478bd9Sstevel@tonic-gate { "sctpOutFastRetrans", KSTAT_DATA_INT32, 0 },
2887c478bd9Sstevel@tonic-gate { "sctpOutWinProbe", KSTAT_DATA_INT32, 0 },
2897c478bd9Sstevel@tonic-gate { "sctpInCtrlChunks", KSTAT_DATA_INT64, 0 },
2907c478bd9Sstevel@tonic-gate { "sctpInOrderChunks", KSTAT_DATA_INT64, 0 },
2917c478bd9Sstevel@tonic-gate { "sctpInUnorderChunks", KSTAT_DATA_INT64, 0 },
2927c478bd9Sstevel@tonic-gate { "sctpInAck", KSTAT_DATA_INT32, 0 },
2937c478bd9Sstevel@tonic-gate { "sctpInDupAck", KSTAT_DATA_INT32, 0 },
2947c478bd9Sstevel@tonic-gate { "sctpInAckUnsent", KSTAT_DATA_INT32, 0 },
2957c478bd9Sstevel@tonic-gate { "sctpFragUsrMsgs", KSTAT_DATA_INT64, 0 },
2967c478bd9Sstevel@tonic-gate { "sctpReasmUsrMsgs", KSTAT_DATA_INT64, 0 },
2977c478bd9Sstevel@tonic-gate { "sctpOutSCTPPkts", KSTAT_DATA_INT64, 0 },
2987c478bd9Sstevel@tonic-gate { "sctpInSCTPPkts", KSTAT_DATA_INT64, 0 },
2997c478bd9Sstevel@tonic-gate { "sctpInInvalidCookie", KSTAT_DATA_INT32, 0 },
3007c478bd9Sstevel@tonic-gate { "sctpTimRetrans", KSTAT_DATA_INT32, 0 },
3017c478bd9Sstevel@tonic-gate { "sctpTimRetransDrop", KSTAT_DATA_INT32, 0 },
3027c478bd9Sstevel@tonic-gate { "sctpTimHearBeatProbe", KSTAT_DATA_INT32, 0 },
3037c478bd9Sstevel@tonic-gate { "sctpTimHearBeatDrop", KSTAT_DATA_INT32, 0 },
3047c478bd9Sstevel@tonic-gate { "sctpListenDrop", KSTAT_DATA_INT32, 0 },
3057c478bd9Sstevel@tonic-gate { "sctpInClosed", KSTAT_DATA_INT32, 0 }
3067c478bd9Sstevel@tonic-gate };
3077c478bd9Sstevel@tonic-gate
308f4b3ec61Sdh155122 ksp = kstat_create_netstack(SCTP_MOD_NAME, 0, "sctp", "mib2",
309f4b3ec61Sdh155122 KSTAT_TYPE_NAMED, NUM_OF_FIELDS(sctp_named_kstat_t), 0, stackid);
3107c478bd9Sstevel@tonic-gate
3115dd46ab5SKacheong Poon if (ksp == NULL)
312f4b3ec61Sdh155122 return (NULL);
3137c478bd9Sstevel@tonic-gate
3147c478bd9Sstevel@tonic-gate /* These won't change. */
3157c478bd9Sstevel@tonic-gate template.sctpRtoAlgorithm.value.i32 = MIB2_SCTP_RTOALGO_VANJ;
3167c478bd9Sstevel@tonic-gate template.sctpMaxAssocs.value.i32 = -1;
3177c478bd9Sstevel@tonic-gate
318f4b3ec61Sdh155122 bcopy(&template, ksp->ks_data, sizeof (template));
319f4b3ec61Sdh155122 ksp->ks_update = sctp_kstat_update;
320f4b3ec61Sdh155122 ksp->ks_private = (void *)(uintptr_t)stackid;
3217c478bd9Sstevel@tonic-gate
322f4b3ec61Sdh155122 kstat_install(ksp);
323f4b3ec61Sdh155122 return (ksp);
324f4b3ec61Sdh155122 }
3257c478bd9Sstevel@tonic-gate
326f4b3ec61Sdh155122 /*
3275dd46ab5SKacheong Poon * To set all sctp_stat_t counters to 0.
3285dd46ab5SKacheong Poon */
3295dd46ab5SKacheong Poon static void
sctp_clr_kstats2(sctp_kstat_t * stats)3305dd46ab5SKacheong Poon sctp_clr_kstats2(sctp_kstat_t *stats)
3315dd46ab5SKacheong Poon {
3325dd46ab5SKacheong Poon stats->sctp_add_faddr.value.ui64 = 0;
3335dd46ab5SKacheong Poon stats->sctp_add_timer.value.ui64 = 0;
3345dd46ab5SKacheong Poon stats->sctp_conn_create.value.ui64 = 0;
3355dd46ab5SKacheong Poon stats->sctp_find_next_tq.value.ui64 = 0;
3365dd46ab5SKacheong Poon stats->sctp_fr_add_hdr.value.ui64 = 0;
3375dd46ab5SKacheong Poon stats->sctp_fr_not_found.value.ui64 = 0;
3385dd46ab5SKacheong Poon stats->sctp_output_failed.value.ui64 = 0;
3395dd46ab5SKacheong Poon stats->sctp_rexmit_failed.value.ui64 = 0;
3405dd46ab5SKacheong Poon stats->sctp_send_init_failed.value.ui64 = 0;
3415dd46ab5SKacheong Poon stats->sctp_send_cookie_failed.value.ui64 = 0;
3425dd46ab5SKacheong Poon stats->sctp_send_cookie_ack_failed.value.ui64 = 0;
3435dd46ab5SKacheong Poon stats->sctp_send_err_failed.value.ui64 = 0;
3445dd46ab5SKacheong Poon stats->sctp_send_sack_failed.value.ui64 = 0;
3455dd46ab5SKacheong Poon stats->sctp_send_shutdown_failed.value.ui64 = 0;
3465dd46ab5SKacheong Poon stats->sctp_send_shutdown_ack_failed.value.ui64 = 0;
3475dd46ab5SKacheong Poon stats->sctp_send_shutdown_comp_failed.value.ui64 = 0;
3485dd46ab5SKacheong Poon stats->sctp_send_user_abort_failed.value.ui64 = 0;
3495dd46ab5SKacheong Poon stats->sctp_send_asconf_failed.value.ui64 = 0;
3505dd46ab5SKacheong Poon stats->sctp_send_asconf_ack_failed.value.ui64 = 0;
3515dd46ab5SKacheong Poon stats->sctp_send_ftsn_failed.value.ui64 = 0;
3525dd46ab5SKacheong Poon stats->sctp_send_hb_failed.value.ui64 = 0;
3535dd46ab5SKacheong Poon stats->sctp_return_hb_failed.value.ui64 = 0;
3545dd46ab5SKacheong Poon stats->sctp_ss_rexmit_failed.value.ui64 = 0;
3555dd46ab5SKacheong Poon stats->sctp_cl_connect.value.ui64 = 0;
3565dd46ab5SKacheong Poon stats->sctp_cl_assoc_change.value.ui64 = 0;
3575dd46ab5SKacheong Poon stats->sctp_cl_check_addrs.value.ui64 = 0;
3585dd46ab5SKacheong Poon stats->sctp_reclaim_cnt.value.ui64 = 0;
3595dd46ab5SKacheong Poon stats->sctp_listen_cnt_drop.value.ui64 = 0;
3605dd46ab5SKacheong Poon }
3615dd46ab5SKacheong Poon
3625dd46ab5SKacheong Poon /*
3635dd46ab5SKacheong Poon * To add counters from the per CPU sctp_kstat_counter_t to the stack
3645dd46ab5SKacheong Poon * sctp_kstat_t.
3655dd46ab5SKacheong Poon */
3665dd46ab5SKacheong Poon static void
sctp_add_kstats2(sctp_kstat_counter_t * from,sctp_kstat_t * to)3675dd46ab5SKacheong Poon sctp_add_kstats2(sctp_kstat_counter_t *from, sctp_kstat_t *to)
3685dd46ab5SKacheong Poon {
3695dd46ab5SKacheong Poon to->sctp_add_faddr.value.ui64 += from->sctp_add_faddr;
3705dd46ab5SKacheong Poon to->sctp_add_timer.value.ui64 += from->sctp_add_timer;
3715dd46ab5SKacheong Poon to->sctp_conn_create.value.ui64 += from->sctp_conn_create;
3725dd46ab5SKacheong Poon to->sctp_find_next_tq.value.ui64 += from->sctp_find_next_tq;
3735dd46ab5SKacheong Poon to->sctp_fr_add_hdr.value.ui64 += from->sctp_fr_add_hdr;
3745dd46ab5SKacheong Poon to->sctp_fr_not_found.value.ui64 += from->sctp_fr_not_found;
3755dd46ab5SKacheong Poon to->sctp_output_failed.value.ui64 += from->sctp_output_failed;
3765dd46ab5SKacheong Poon to->sctp_rexmit_failed.value.ui64 += from->sctp_rexmit_failed;
3775dd46ab5SKacheong Poon to->sctp_send_init_failed.value.ui64 += from->sctp_send_init_failed;
3785dd46ab5SKacheong Poon to->sctp_send_cookie_failed.value.ui64 += from->sctp_send_cookie_failed;
3795dd46ab5SKacheong Poon to->sctp_send_cookie_ack_failed.value.ui64 +=
3805dd46ab5SKacheong Poon from->sctp_send_cookie_ack_failed;
3815dd46ab5SKacheong Poon to->sctp_send_err_failed.value.ui64 += from->sctp_send_err_failed;
3825dd46ab5SKacheong Poon to->sctp_send_sack_failed.value.ui64 += from->sctp_send_sack_failed;
3835dd46ab5SKacheong Poon to->sctp_send_shutdown_failed.value.ui64 +=
3845dd46ab5SKacheong Poon from->sctp_send_shutdown_failed;
3855dd46ab5SKacheong Poon to->sctp_send_shutdown_ack_failed.value.ui64 +=
3865dd46ab5SKacheong Poon from->sctp_send_shutdown_ack_failed;
3875dd46ab5SKacheong Poon to->sctp_send_shutdown_comp_failed.value.ui64 +=
3885dd46ab5SKacheong Poon from->sctp_send_shutdown_comp_failed;
3895dd46ab5SKacheong Poon to->sctp_send_user_abort_failed.value.ui64 +=
3905dd46ab5SKacheong Poon from->sctp_send_user_abort_failed;
3915dd46ab5SKacheong Poon to->sctp_send_asconf_failed.value.ui64 += from->sctp_send_asconf_failed;
3925dd46ab5SKacheong Poon to->sctp_send_asconf_ack_failed.value.ui64 +=
3935dd46ab5SKacheong Poon from->sctp_send_asconf_ack_failed;
3945dd46ab5SKacheong Poon to->sctp_send_ftsn_failed.value.ui64 += from->sctp_send_ftsn_failed;
3955dd46ab5SKacheong Poon to->sctp_send_hb_failed.value.ui64 += from->sctp_send_hb_failed;
3965dd46ab5SKacheong Poon to->sctp_return_hb_failed.value.ui64 += from->sctp_return_hb_failed;
3975dd46ab5SKacheong Poon to->sctp_ss_rexmit_failed.value.ui64 += from->sctp_ss_rexmit_failed;
3985dd46ab5SKacheong Poon to->sctp_cl_connect.value.ui64 += from->sctp_cl_connect;
3995dd46ab5SKacheong Poon to->sctp_cl_assoc_change.value.ui64 += from->sctp_cl_assoc_change;
4005dd46ab5SKacheong Poon to->sctp_cl_check_addrs.value.ui64 += from->sctp_cl_check_addrs;
4015dd46ab5SKacheong Poon }
4025dd46ab5SKacheong Poon
4035dd46ab5SKacheong Poon /*
4045dd46ab5SKacheong Poon * Sum up all per CPU tcp_stat_t kstat counters.
4055dd46ab5SKacheong Poon */
4065dd46ab5SKacheong Poon static int
sctp_kstat2_update(kstat_t * kp,int rw)4075dd46ab5SKacheong Poon sctp_kstat2_update(kstat_t *kp, int rw)
4085dd46ab5SKacheong Poon {
4095dd46ab5SKacheong Poon netstackid_t stackid = (netstackid_t)(uintptr_t)kp->ks_private;
4105dd46ab5SKacheong Poon netstack_t *ns;
4115dd46ab5SKacheong Poon sctp_stack_t *sctps;
4125dd46ab5SKacheong Poon sctp_kstat_t *stats;
4135dd46ab5SKacheong Poon int i;
4145dd46ab5SKacheong Poon int cnt;
4155dd46ab5SKacheong Poon
4165dd46ab5SKacheong Poon if (rw == KSTAT_WRITE)
4175dd46ab5SKacheong Poon return (EACCES);
4185dd46ab5SKacheong Poon
4195dd46ab5SKacheong Poon ns = netstack_find_by_stackid(stackid);
4205dd46ab5SKacheong Poon if (ns == NULL)
4215dd46ab5SKacheong Poon return (-1);
4225dd46ab5SKacheong Poon sctps = ns->netstack_sctp;
4235dd46ab5SKacheong Poon if (sctps == NULL) {
4245dd46ab5SKacheong Poon netstack_rele(ns);
4255dd46ab5SKacheong Poon return (-1);
4265dd46ab5SKacheong Poon }
4275dd46ab5SKacheong Poon
4285dd46ab5SKacheong Poon stats = (sctp_kstat_t *)kp->ks_data;
4295dd46ab5SKacheong Poon sctp_clr_kstats2(stats);
4305dd46ab5SKacheong Poon
4315dd46ab5SKacheong Poon /*
4325dd46ab5SKacheong Poon * sctps_sc_cnt may change in the middle of the loop. It is better
4335dd46ab5SKacheong Poon * to get its value first.
4345dd46ab5SKacheong Poon */
4355dd46ab5SKacheong Poon cnt = sctps->sctps_sc_cnt;
4365dd46ab5SKacheong Poon for (i = 0; i < cnt; i++)
4375dd46ab5SKacheong Poon sctp_add_kstats2(&sctps->sctps_sc[i]->sctp_sc_stats, stats);
4385dd46ab5SKacheong Poon
4395dd46ab5SKacheong Poon netstack_rele(ns);
4405dd46ab5SKacheong Poon return (0);
4415dd46ab5SKacheong Poon }
4425dd46ab5SKacheong Poon
4435dd46ab5SKacheong Poon /*
444f4b3ec61Sdh155122 * The following kstats are for debugging purposes. They keep
445f4b3ec61Sdh155122 * track of problems which should not happen normally. But in
446f4b3ec61Sdh155122 * those cases which they do happen, these kstats would be handy
447f4b3ec61Sdh155122 * for engineers to diagnose the problems. They are not intended
448f4b3ec61Sdh155122 * to be consumed by customers.
449f4b3ec61Sdh155122 */
450f4b3ec61Sdh155122 void *
sctp_kstat2_init(netstackid_t stackid)4515dd46ab5SKacheong Poon sctp_kstat2_init(netstackid_t stackid)
452f4b3ec61Sdh155122 {
453f4b3ec61Sdh155122 kstat_t *ksp;
45477c67f2fSkcpoon
455f4b3ec61Sdh155122 sctp_kstat_t template = {
456f4b3ec61Sdh155122 { "sctp_add_faddr", KSTAT_DATA_UINT64 },
457f4b3ec61Sdh155122 { "sctp_add_timer", KSTAT_DATA_UINT64 },
458f4b3ec61Sdh155122 { "sctp_conn_create", KSTAT_DATA_UINT64 },
459f4b3ec61Sdh155122 { "sctp_find_next_tq", KSTAT_DATA_UINT64 },
460f4b3ec61Sdh155122 { "sctp_fr_add_hdr", KSTAT_DATA_UINT64 },
461f4b3ec61Sdh155122 { "sctp_fr_not_found", KSTAT_DATA_UINT64 },
462f4b3ec61Sdh155122 { "sctp_output_failed", KSTAT_DATA_UINT64 },
463f4b3ec61Sdh155122 { "sctp_rexmit_failed", KSTAT_DATA_UINT64 },
464f4b3ec61Sdh155122 { "sctp_send_init_failed", KSTAT_DATA_UINT64 },
465f4b3ec61Sdh155122 { "sctp_send_cookie_failed", KSTAT_DATA_UINT64 },
466f4b3ec61Sdh155122 { "sctp_send_cookie_ack_failed", KSTAT_DATA_UINT64 },
467f4b3ec61Sdh155122 { "sctp_send_err_failed", KSTAT_DATA_UINT64 },
468f4b3ec61Sdh155122 { "sctp_send_sack_failed", KSTAT_DATA_UINT64 },
469f4b3ec61Sdh155122 { "sctp_send_shutdown_failed", KSTAT_DATA_UINT64 },
470f4b3ec61Sdh155122 { "sctp_send_shutdown_ack_failed", KSTAT_DATA_UINT64 },
471f4b3ec61Sdh155122 { "sctp_send_shutdown_comp_failed", KSTAT_DATA_UINT64 },
472f4b3ec61Sdh155122 { "sctp_send_user_abort_failed", KSTAT_DATA_UINT64 },
473f4b3ec61Sdh155122 { "sctp_send_asconf_failed", KSTAT_DATA_UINT64 },
474f4b3ec61Sdh155122 { "sctp_send_asconf_ack_failed", KSTAT_DATA_UINT64 },
475f4b3ec61Sdh155122 { "sctp_send_ftsn_failed", KSTAT_DATA_UINT64 },
476f4b3ec61Sdh155122 { "sctp_send_hb_failed", KSTAT_DATA_UINT64 },
477f4b3ec61Sdh155122 { "sctp_return_hb_failed", KSTAT_DATA_UINT64 },
478f4b3ec61Sdh155122 { "sctp_ss_rexmit_failed", KSTAT_DATA_UINT64 },
479f4b3ec61Sdh155122 { "sctp_cl_connect", KSTAT_DATA_UINT64 },
480f4b3ec61Sdh155122 { "sctp_cl_assoc_change", KSTAT_DATA_UINT64 },
481f4b3ec61Sdh155122 { "sctp_cl_check_addrs", KSTAT_DATA_UINT64 },
4825dd46ab5SKacheong Poon { "sctp_reclaim_drop", KSTAT_DATA_UINT64 },
4835dd46ab5SKacheong Poon { "sctp_listen_cnt_drop", KSTAT_DATA_UINT64 },
484f4b3ec61Sdh155122 };
485f4b3ec61Sdh155122
486f4b3ec61Sdh155122 ksp = kstat_create_netstack(SCTP_MOD_NAME, 0, "sctpstat", "net",
4875dd46ab5SKacheong Poon KSTAT_TYPE_NAMED, NUM_OF_FIELDS(template), 0, stackid);
488f4b3ec61Sdh155122
489f4b3ec61Sdh155122 if (ksp == NULL)
490f4b3ec61Sdh155122 return (NULL);
491f4b3ec61Sdh155122
4925dd46ab5SKacheong Poon bcopy(&template, ksp->ks_data, sizeof (template));
493f4b3ec61Sdh155122 ksp->ks_private = (void *)(uintptr_t)stackid;
4945dd46ab5SKacheong Poon ksp->ks_update = sctp_kstat2_update;
495f4b3ec61Sdh155122
496f4b3ec61Sdh155122 kstat_install(ksp);
497f4b3ec61Sdh155122 return (ksp);
498f4b3ec61Sdh155122 }
499f4b3ec61Sdh155122
500f4b3ec61Sdh155122 void
sctp_kstat_fini(netstackid_t stackid,kstat_t * ksp)501f4b3ec61Sdh155122 sctp_kstat_fini(netstackid_t stackid, kstat_t *ksp)
502f4b3ec61Sdh155122 {
503f4b3ec61Sdh155122 if (ksp != NULL) {
504f4b3ec61Sdh155122 ASSERT(stackid == (netstackid_t)(uintptr_t)ksp->ks_private);
505f4b3ec61Sdh155122 kstat_delete_netstack(ksp, stackid);
50677c67f2fSkcpoon }
5077c478bd9Sstevel@tonic-gate }
5087c478bd9Sstevel@tonic-gate
5097c478bd9Sstevel@tonic-gate void
sctp_kstat2_fini(netstackid_t stackid,kstat_t * ksp)510f4b3ec61Sdh155122 sctp_kstat2_fini(netstackid_t stackid, kstat_t *ksp)
5117c478bd9Sstevel@tonic-gate {
512f4b3ec61Sdh155122 if (ksp != NULL) {
513f4b3ec61Sdh155122 ASSERT(stackid == (netstackid_t)(uintptr_t)ksp->ks_private);
514f4b3ec61Sdh155122 kstat_delete_netstack(ksp, stackid);
51577c67f2fSkcpoon }
5167c478bd9Sstevel@tonic-gate }
5177c478bd9Sstevel@tonic-gate
5187c478bd9Sstevel@tonic-gate /*
5197c478bd9Sstevel@tonic-gate * Return SNMP global stats in buffer in mpdata.
5207c478bd9Sstevel@tonic-gate * Return associatiation table in mp_conn_data,
5217c478bd9Sstevel@tonic-gate * local address table in mp_local_data, and
5227c478bd9Sstevel@tonic-gate * remote address table in mp_rem_data.
5237c478bd9Sstevel@tonic-gate */
5247c478bd9Sstevel@tonic-gate mblk_t *
sctp_snmp_get_mib2(queue_t * q,mblk_t * mpctl,sctp_stack_t * sctps)525f4b3ec61Sdh155122 sctp_snmp_get_mib2(queue_t *q, mblk_t *mpctl, sctp_stack_t *sctps)
5267c478bd9Sstevel@tonic-gate {
5277c478bd9Sstevel@tonic-gate mblk_t *mpdata, *mp_ret;
5287c478bd9Sstevel@tonic-gate mblk_t *mp_conn_ctl = NULL;
5297c478bd9Sstevel@tonic-gate mblk_t *mp_conn_data;
5307c478bd9Sstevel@tonic-gate mblk_t *mp_conn_tail = NULL;
5317c478bd9Sstevel@tonic-gate mblk_t *mp_local_ctl = NULL;
5327c478bd9Sstevel@tonic-gate mblk_t *mp_local_data;
5337c478bd9Sstevel@tonic-gate mblk_t *mp_local_tail = NULL;
5347c478bd9Sstevel@tonic-gate mblk_t *mp_rem_ctl = NULL;
5357c478bd9Sstevel@tonic-gate mblk_t *mp_rem_data;
5367c478bd9Sstevel@tonic-gate mblk_t *mp_rem_tail = NULL;
53745916cd2Sjpk mblk_t *mp_attr_ctl = NULL;
53845916cd2Sjpk mblk_t *mp_attr_data;
53945916cd2Sjpk mblk_t *mp_attr_tail = NULL;
5407c478bd9Sstevel@tonic-gate struct opthdr *optp;
5417c478bd9Sstevel@tonic-gate sctp_t *sctp, *sctp_prev = NULL;
5427c478bd9Sstevel@tonic-gate sctp_faddr_t *fp;
5437c478bd9Sstevel@tonic-gate mib2_sctpConnEntry_t sce;
5447c478bd9Sstevel@tonic-gate mib2_sctpConnLocalEntry_t scle;
5457c478bd9Sstevel@tonic-gate mib2_sctpConnRemoteEntry_t scre;
54645916cd2Sjpk mib2_transportMLPEntry_t mlp;
5477c478bd9Sstevel@tonic-gate int i;
5487c478bd9Sstevel@tonic-gate int l;
5497c478bd9Sstevel@tonic-gate int scanned = 0;
5507c478bd9Sstevel@tonic-gate zoneid_t zoneid = Q_TO_CONN(q)->conn_zoneid;
55145916cd2Sjpk conn_t *connp;
55245916cd2Sjpk boolean_t needattr;
55345916cd2Sjpk int idx;
5545dd46ab5SKacheong Poon mib2_sctp_t sctp_mib;
5557c478bd9Sstevel@tonic-gate
5567c478bd9Sstevel@tonic-gate /*
5577c478bd9Sstevel@tonic-gate * Make copies of the original message.
5587c478bd9Sstevel@tonic-gate * mpctl will hold SCTP counters,
5597c478bd9Sstevel@tonic-gate * mp_conn_ctl will hold list of connections.
5607c478bd9Sstevel@tonic-gate */
5617c478bd9Sstevel@tonic-gate mp_ret = copymsg(mpctl);
5627c478bd9Sstevel@tonic-gate mp_conn_ctl = copymsg(mpctl);
5637c478bd9Sstevel@tonic-gate mp_local_ctl = copymsg(mpctl);
5647c478bd9Sstevel@tonic-gate mp_rem_ctl = copymsg(mpctl);
56545916cd2Sjpk mp_attr_ctl = copymsg(mpctl);
5667c478bd9Sstevel@tonic-gate
5677c478bd9Sstevel@tonic-gate mpdata = mpctl->b_cont;
5687c478bd9Sstevel@tonic-gate
56945916cd2Sjpk if (mp_conn_ctl == NULL || mp_local_ctl == NULL ||
57045916cd2Sjpk mp_rem_ctl == NULL || mp_attr_ctl == NULL || mpdata == NULL) {
57145916cd2Sjpk freemsg(mp_attr_ctl);
5727c478bd9Sstevel@tonic-gate freemsg(mp_rem_ctl);
5737c478bd9Sstevel@tonic-gate freemsg(mp_local_ctl);
5747c478bd9Sstevel@tonic-gate freemsg(mp_conn_ctl);
5757c478bd9Sstevel@tonic-gate freemsg(mp_ret);
5767c478bd9Sstevel@tonic-gate freemsg(mpctl);
5777c478bd9Sstevel@tonic-gate return (NULL);
5787c478bd9Sstevel@tonic-gate }
5797c478bd9Sstevel@tonic-gate mp_conn_data = mp_conn_ctl->b_cont;
5807c478bd9Sstevel@tonic-gate mp_local_data = mp_local_ctl->b_cont;
5817c478bd9Sstevel@tonic-gate mp_rem_data = mp_rem_ctl->b_cont;
58245916cd2Sjpk mp_attr_data = mp_attr_ctl->b_cont;
5837c478bd9Sstevel@tonic-gate
5845dd46ab5SKacheong Poon bzero(&sctp_mib, sizeof (sctp_mib));
5855dd46ab5SKacheong Poon
5867c478bd9Sstevel@tonic-gate /* hostname address parameters are not supported in Solaris */
5877c478bd9Sstevel@tonic-gate sce.sctpAssocRemHostName.o_length = 0;
5887c478bd9Sstevel@tonic-gate sce.sctpAssocRemHostName.o_bytes[0] = 0;
5897c478bd9Sstevel@tonic-gate
5907c478bd9Sstevel@tonic-gate /* build table of connections -- need count in fixed part */
5917c478bd9Sstevel@tonic-gate
59245916cd2Sjpk idx = 0;
593f4b3ec61Sdh155122 mutex_enter(&sctps->sctps_g_lock);
594bd670b35SErik Nordmark sctp = list_head(&sctps->sctps_g_list);
5957c478bd9Sstevel@tonic-gate while (sctp != NULL) {
5967c478bd9Sstevel@tonic-gate mutex_enter(&sctp->sctp_reflock);
5977c478bd9Sstevel@tonic-gate if (sctp->sctp_condemned) {
5987c478bd9Sstevel@tonic-gate mutex_exit(&sctp->sctp_reflock);
599f4b3ec61Sdh155122 sctp = list_next(&sctps->sctps_g_list, sctp);
6007c478bd9Sstevel@tonic-gate continue;
6017c478bd9Sstevel@tonic-gate }
6027c478bd9Sstevel@tonic-gate sctp->sctp_refcnt++;
6037c478bd9Sstevel@tonic-gate mutex_exit(&sctp->sctp_reflock);
604f4b3ec61Sdh155122 mutex_exit(&sctps->sctps_g_lock);
6057c478bd9Sstevel@tonic-gate if (sctp_prev != NULL)
6067c478bd9Sstevel@tonic-gate SCTP_REFRELE(sctp_prev);
6077c478bd9Sstevel@tonic-gate if (sctp->sctp_connp->conn_zoneid != zoneid)
6087c478bd9Sstevel@tonic-gate goto next_sctp;
6097c478bd9Sstevel@tonic-gate if (sctp->sctp_state == SCTPS_ESTABLISHED ||
6107c478bd9Sstevel@tonic-gate sctp->sctp_state == SCTPS_SHUTDOWN_PENDING ||
6117c478bd9Sstevel@tonic-gate sctp->sctp_state == SCTPS_SHUTDOWN_RECEIVED) {
6125dd46ab5SKacheong Poon /*
6135dd46ab5SKacheong Poon * Just bump the local sctp_mib. The number of
6145dd46ab5SKacheong Poon * existing associations is not kept in kernel.
6155dd46ab5SKacheong Poon */
6165dd46ab5SKacheong Poon BUMP_MIB(&sctp_mib, sctpCurrEstab);
6177c478bd9Sstevel@tonic-gate }
6185dd46ab5SKacheong Poon SCTPS_UPDATE_MIB(sctps, sctpOutSCTPPkts, sctp->sctp_opkts);
6197c478bd9Sstevel@tonic-gate sctp->sctp_opkts = 0;
6205dd46ab5SKacheong Poon SCTPS_UPDATE_MIB(sctps, sctpOutCtrlChunks, sctp->sctp_obchunks);
62135e12f9cSGeorge Shepherd UPDATE_LOCAL(sctp->sctp_cum_obchunks,
62235e12f9cSGeorge Shepherd sctp->sctp_obchunks);
6237c478bd9Sstevel@tonic-gate sctp->sctp_obchunks = 0;
6245dd46ab5SKacheong Poon SCTPS_UPDATE_MIB(sctps, sctpOutOrderChunks,
6255dd46ab5SKacheong Poon sctp->sctp_odchunks);
62635e12f9cSGeorge Shepherd UPDATE_LOCAL(sctp->sctp_cum_odchunks,
62735e12f9cSGeorge Shepherd sctp->sctp_odchunks);
6287c478bd9Sstevel@tonic-gate sctp->sctp_odchunks = 0;
6295dd46ab5SKacheong Poon SCTPS_UPDATE_MIB(sctps, sctpOutUnorderChunks,
6307c478bd9Sstevel@tonic-gate sctp->sctp_oudchunks);
63135e12f9cSGeorge Shepherd UPDATE_LOCAL(sctp->sctp_cum_oudchunks,
63235e12f9cSGeorge Shepherd sctp->sctp_oudchunks);
6337c478bd9Sstevel@tonic-gate sctp->sctp_oudchunks = 0;
6345dd46ab5SKacheong Poon SCTPS_UPDATE_MIB(sctps, sctpRetransChunks,
6355dd46ab5SKacheong Poon sctp->sctp_rxtchunks);
63635e12f9cSGeorge Shepherd UPDATE_LOCAL(sctp->sctp_cum_rxtchunks,
63735e12f9cSGeorge Shepherd sctp->sctp_rxtchunks);
6387c478bd9Sstevel@tonic-gate sctp->sctp_rxtchunks = 0;
6395dd46ab5SKacheong Poon SCTPS_UPDATE_MIB(sctps, sctpInSCTPPkts, sctp->sctp_ipkts);
6407c478bd9Sstevel@tonic-gate sctp->sctp_ipkts = 0;
6415dd46ab5SKacheong Poon SCTPS_UPDATE_MIB(sctps, sctpInCtrlChunks, sctp->sctp_ibchunks);
64235e12f9cSGeorge Shepherd UPDATE_LOCAL(sctp->sctp_cum_ibchunks,
64335e12f9cSGeorge Shepherd sctp->sctp_ibchunks);
6447c478bd9Sstevel@tonic-gate sctp->sctp_ibchunks = 0;
6455dd46ab5SKacheong Poon SCTPS_UPDATE_MIB(sctps, sctpInOrderChunks, sctp->sctp_idchunks);
64635e12f9cSGeorge Shepherd UPDATE_LOCAL(sctp->sctp_cum_idchunks,
64735e12f9cSGeorge Shepherd sctp->sctp_idchunks);
6487c478bd9Sstevel@tonic-gate sctp->sctp_idchunks = 0;
6495dd46ab5SKacheong Poon SCTPS_UPDATE_MIB(sctps, sctpInUnorderChunks,
6507c478bd9Sstevel@tonic-gate sctp->sctp_iudchunks);
65135e12f9cSGeorge Shepherd UPDATE_LOCAL(sctp->sctp_cum_iudchunks,
65235e12f9cSGeorge Shepherd sctp->sctp_iudchunks);
6537c478bd9Sstevel@tonic-gate sctp->sctp_iudchunks = 0;
6545dd46ab5SKacheong Poon SCTPS_UPDATE_MIB(sctps, sctpFragUsrMsgs, sctp->sctp_fragdmsgs);
6557c478bd9Sstevel@tonic-gate sctp->sctp_fragdmsgs = 0;
6565dd46ab5SKacheong Poon SCTPS_UPDATE_MIB(sctps, sctpReasmUsrMsgs, sctp->sctp_reassmsgs);
6577c478bd9Sstevel@tonic-gate sctp->sctp_reassmsgs = 0;
6587c478bd9Sstevel@tonic-gate
6597c478bd9Sstevel@tonic-gate sce.sctpAssocId = ntohl(sctp->sctp_lvtag);
660bd670b35SErik Nordmark sce.sctpAssocLocalPort = ntohs(sctp->sctp_connp->conn_lport);
661bd670b35SErik Nordmark sce.sctpAssocRemPort = ntohs(sctp->sctp_connp->conn_fport);
6627c478bd9Sstevel@tonic-gate
6637c478bd9Sstevel@tonic-gate RUN_SCTP(sctp);
6647c478bd9Sstevel@tonic-gate if (sctp->sctp_primary != NULL) {
6657c478bd9Sstevel@tonic-gate fp = sctp->sctp_primary;
6667c478bd9Sstevel@tonic-gate
667*6be61d4eSchandrasekar marimuthu - Sun Microsystems - Bangalore India if (IN6_IS_ADDR_V4MAPPED(&fp->sf_faddr)) {
6687c478bd9Sstevel@tonic-gate sce.sctpAssocRemPrimAddrType =
6697c478bd9Sstevel@tonic-gate MIB2_SCTP_ADDR_V4;
6707c478bd9Sstevel@tonic-gate } else {
6717c478bd9Sstevel@tonic-gate sce.sctpAssocRemPrimAddrType =
6727c478bd9Sstevel@tonic-gate MIB2_SCTP_ADDR_V6;
6737c478bd9Sstevel@tonic-gate }
674*6be61d4eSchandrasekar marimuthu - Sun Microsystems - Bangalore India sce.sctpAssocRemPrimAddr = fp->sf_faddr;
675*6be61d4eSchandrasekar marimuthu - Sun Microsystems - Bangalore India sce.sctpAssocLocPrimAddr = fp->sf_saddr;
6767c478bd9Sstevel@tonic-gate sce.sctpAssocHeartBeatInterval = TICK_TO_MSEC(
677*6be61d4eSchandrasekar marimuthu - Sun Microsystems - Bangalore India fp->sf_hb_interval);
6787c478bd9Sstevel@tonic-gate } else {
6797c478bd9Sstevel@tonic-gate sce.sctpAssocRemPrimAddrType = MIB2_SCTP_ADDR_V4;
6807c478bd9Sstevel@tonic-gate bzero(&sce.sctpAssocRemPrimAddr,
6817c478bd9Sstevel@tonic-gate sizeof (sce.sctpAssocRemPrimAddr));
6827c478bd9Sstevel@tonic-gate bzero(&sce.sctpAssocLocPrimAddr,
6837c478bd9Sstevel@tonic-gate sizeof (sce.sctpAssocLocPrimAddr));
6847c478bd9Sstevel@tonic-gate sce.sctpAssocHeartBeatInterval =
685f4b3ec61Sdh155122 sctps->sctps_heartbeat_interval;
6867c478bd9Sstevel@tonic-gate }
6877c478bd9Sstevel@tonic-gate
6887c478bd9Sstevel@tonic-gate /*
6897c478bd9Sstevel@tonic-gate * Table for local addresses
6907c478bd9Sstevel@tonic-gate */
6917c478bd9Sstevel@tonic-gate scanned = 0;
6927c478bd9Sstevel@tonic-gate for (i = 0; i < SCTP_IPIF_HASH; i++) {
6937c478bd9Sstevel@tonic-gate sctp_saddr_ipif_t *obj;
6947c478bd9Sstevel@tonic-gate
6957c478bd9Sstevel@tonic-gate if (sctp->sctp_saddrs[i].ipif_count == 0)
6967c478bd9Sstevel@tonic-gate continue;
6977c478bd9Sstevel@tonic-gate obj = list_head(&sctp->sctp_saddrs[i].sctp_ipif_list);
6987c478bd9Sstevel@tonic-gate for (l = 0; l < sctp->sctp_saddrs[i].ipif_count; l++) {
6997c478bd9Sstevel@tonic-gate sctp_ipif_t *sctp_ipif;
7007c478bd9Sstevel@tonic-gate in6_addr_t addr;
7017c478bd9Sstevel@tonic-gate
7027c478bd9Sstevel@tonic-gate sctp_ipif = obj->saddr_ipifp;
7037c478bd9Sstevel@tonic-gate addr = sctp_ipif->sctp_ipif_saddr;
7047c478bd9Sstevel@tonic-gate scanned++;
7057c478bd9Sstevel@tonic-gate scle.sctpAssocId = ntohl(sctp->sctp_lvtag);
7067c478bd9Sstevel@tonic-gate if (IN6_IS_ADDR_V4MAPPED(&addr)) {
7077c478bd9Sstevel@tonic-gate scle.sctpAssocLocalAddrType =
7087c478bd9Sstevel@tonic-gate MIB2_SCTP_ADDR_V4;
7097c478bd9Sstevel@tonic-gate } else {
7107c478bd9Sstevel@tonic-gate scle.sctpAssocLocalAddrType =
7117c478bd9Sstevel@tonic-gate MIB2_SCTP_ADDR_V6;
7127c478bd9Sstevel@tonic-gate }
7137c478bd9Sstevel@tonic-gate scle.sctpAssocLocalAddr = addr;
7147c478bd9Sstevel@tonic-gate (void) snmp_append_data2(mp_local_data,
7157c478bd9Sstevel@tonic-gate &mp_local_tail, (char *)&scle,
7167c478bd9Sstevel@tonic-gate sizeof (scle));
7177c478bd9Sstevel@tonic-gate if (scanned >= sctp->sctp_nsaddrs)
7187c478bd9Sstevel@tonic-gate goto done;
7197c478bd9Sstevel@tonic-gate obj = list_next(&sctp->
7207c478bd9Sstevel@tonic-gate sctp_saddrs[i].sctp_ipif_list, obj);
7217c478bd9Sstevel@tonic-gate }
7227c478bd9Sstevel@tonic-gate }
7237c478bd9Sstevel@tonic-gate done:
7247c478bd9Sstevel@tonic-gate /*
7257c478bd9Sstevel@tonic-gate * Table for remote addresses
7267c478bd9Sstevel@tonic-gate */
727*6be61d4eSchandrasekar marimuthu - Sun Microsystems - Bangalore India for (fp = sctp->sctp_faddrs; fp; fp = fp->sf_next) {
7287c478bd9Sstevel@tonic-gate scre.sctpAssocId = ntohl(sctp->sctp_lvtag);
729*6be61d4eSchandrasekar marimuthu - Sun Microsystems - Bangalore India if (IN6_IS_ADDR_V4MAPPED(&fp->sf_faddr)) {
7307c478bd9Sstevel@tonic-gate scre.sctpAssocRemAddrType = MIB2_SCTP_ADDR_V4;
7317c478bd9Sstevel@tonic-gate } else {
7327c478bd9Sstevel@tonic-gate scre.sctpAssocRemAddrType = MIB2_SCTP_ADDR_V6;
7337c478bd9Sstevel@tonic-gate }
734*6be61d4eSchandrasekar marimuthu - Sun Microsystems - Bangalore India scre.sctpAssocRemAddr = fp->sf_faddr;
735*6be61d4eSchandrasekar marimuthu - Sun Microsystems - Bangalore India if (fp->sf_state == SCTP_FADDRS_ALIVE) {
7367c478bd9Sstevel@tonic-gate scre.sctpAssocRemAddrActive =
7377c478bd9Sstevel@tonic-gate scre.sctpAssocRemAddrHBActive =
7387c478bd9Sstevel@tonic-gate MIB2_SCTP_ACTIVE;
7397c478bd9Sstevel@tonic-gate } else {
7407c478bd9Sstevel@tonic-gate scre.sctpAssocRemAddrActive =
7417c478bd9Sstevel@tonic-gate scre.sctpAssocRemAddrHBActive =
7427c478bd9Sstevel@tonic-gate MIB2_SCTP_INACTIVE;
7437c478bd9Sstevel@tonic-gate }
744*6be61d4eSchandrasekar marimuthu - Sun Microsystems - Bangalore India scre.sctpAssocRemAddrRTO = TICK_TO_MSEC(fp->sf_rto);
745*6be61d4eSchandrasekar marimuthu - Sun Microsystems - Bangalore India scre.sctpAssocRemAddrMaxPathRtx = fp->sf_max_retr;
746*6be61d4eSchandrasekar marimuthu - Sun Microsystems - Bangalore India scre.sctpAssocRemAddrRtx = fp->sf_T3expire;
7477c478bd9Sstevel@tonic-gate (void) snmp_append_data2(mp_rem_data, &mp_rem_tail,
7487c478bd9Sstevel@tonic-gate (char *)&scre, sizeof (scre));
7497c478bd9Sstevel@tonic-gate }
75045916cd2Sjpk connp = sctp->sctp_connp;
75145916cd2Sjpk needattr = B_FALSE;
75245916cd2Sjpk bzero(&mlp, sizeof (mlp));
75345916cd2Sjpk if (connp->conn_mlp_type != mlptSingle) {
75445916cd2Sjpk if (connp->conn_mlp_type == mlptShared ||
75545916cd2Sjpk connp->conn_mlp_type == mlptBoth)
75645916cd2Sjpk mlp.tme_flags |= MIB2_TMEF_SHARED;
75745916cd2Sjpk if (connp->conn_mlp_type == mlptPrivate ||
75845916cd2Sjpk connp->conn_mlp_type == mlptBoth)
75945916cd2Sjpk mlp.tme_flags |= MIB2_TMEF_PRIVATE;
76045916cd2Sjpk needattr = B_TRUE;
76145916cd2Sjpk }
7625f9878b0Sken Powell - Sun Microsystem if (connp->conn_anon_mlp) {
7635f9878b0Sken Powell - Sun Microsystem mlp.tme_flags |= MIB2_TMEF_ANONMLP;
7645f9878b0Sken Powell - Sun Microsystem needattr = B_TRUE;
7655f9878b0Sken Powell - Sun Microsystem }
7665d3b8cb7SBill Sommerfeld switch (connp->conn_mac_mode) {
7675d3b8cb7SBill Sommerfeld case CONN_MAC_DEFAULT:
7685d3b8cb7SBill Sommerfeld break;
7695d3b8cb7SBill Sommerfeld case CONN_MAC_AWARE:
7705f9878b0Sken Powell - Sun Microsystem mlp.tme_flags |= MIB2_TMEF_MACEXEMPT;
7715f9878b0Sken Powell - Sun Microsystem needattr = B_TRUE;
7725d3b8cb7SBill Sommerfeld break;
7735d3b8cb7SBill Sommerfeld case CONN_MAC_IMPLICIT:
7745d3b8cb7SBill Sommerfeld mlp.tme_flags |= MIB2_TMEF_MACIMPLICIT;
7755d3b8cb7SBill Sommerfeld needattr = B_TRUE;
7765d3b8cb7SBill Sommerfeld break;
7775f9878b0Sken Powell - Sun Microsystem }
778bd670b35SErik Nordmark if (sctp->sctp_connp->conn_ixa->ixa_tsl != NULL) {
77945916cd2Sjpk ts_label_t *tsl;
78045916cd2Sjpk
781bd670b35SErik Nordmark tsl = sctp->sctp_connp->conn_ixa->ixa_tsl;
7825f9878b0Sken Powell - Sun Microsystem mlp.tme_flags |= MIB2_TMEF_IS_LABELED;
78345916cd2Sjpk mlp.tme_doi = label2doi(tsl);
78445916cd2Sjpk mlp.tme_label = *label2bslabel(tsl);
78545916cd2Sjpk needattr = B_TRUE;
78645916cd2Sjpk }
7877c478bd9Sstevel@tonic-gate WAKE_SCTP(sctp);
7887c478bd9Sstevel@tonic-gate sce.sctpAssocState = sctp_snmp_state(sctp);
7897c478bd9Sstevel@tonic-gate sce.sctpAssocInStreams = sctp->sctp_num_istr;
7907c478bd9Sstevel@tonic-gate sce.sctpAssocOutStreams = sctp->sctp_num_ostr;
7917c478bd9Sstevel@tonic-gate sce.sctpAssocMaxRetr = sctp->sctp_pa_max_rxt;
7927c478bd9Sstevel@tonic-gate /* A 0 here indicates that no primary process is known */
7937c478bd9Sstevel@tonic-gate sce.sctpAssocPrimProcess = 0;
7947c478bd9Sstevel@tonic-gate sce.sctpAssocT1expired = sctp->sctp_T1expire;
7957c478bd9Sstevel@tonic-gate sce.sctpAssocT2expired = sctp->sctp_T2expire;
7967c478bd9Sstevel@tonic-gate sce.sctpAssocRtxChunks = sctp->sctp_T3expire;
7977c478bd9Sstevel@tonic-gate sce.sctpAssocStartTime = sctp->sctp_assoc_start_time;
7987c478bd9Sstevel@tonic-gate sce.sctpConnEntryInfo.ce_sendq = sctp->sctp_unacked +
7997c478bd9Sstevel@tonic-gate sctp->sctp_unsent;
8007c478bd9Sstevel@tonic-gate sce.sctpConnEntryInfo.ce_recvq = sctp->sctp_rxqueued;
8017c478bd9Sstevel@tonic-gate sce.sctpConnEntryInfo.ce_swnd = sctp->sctp_frwnd;
8027c478bd9Sstevel@tonic-gate sce.sctpConnEntryInfo.ce_rwnd = sctp->sctp_rwnd;
8037c478bd9Sstevel@tonic-gate sce.sctpConnEntryInfo.ce_mss = sctp->sctp_mss;
8047c478bd9Sstevel@tonic-gate (void) snmp_append_data2(mp_conn_data, &mp_conn_tail,
8057c478bd9Sstevel@tonic-gate (char *)&sce, sizeof (sce));
80645916cd2Sjpk mlp.tme_connidx = idx++;
80745916cd2Sjpk if (needattr)
80845916cd2Sjpk (void) snmp_append_data2(mp_attr_ctl->b_cont,
80945916cd2Sjpk &mp_attr_tail, (char *)&mlp, sizeof (mlp));
8107c478bd9Sstevel@tonic-gate next_sctp:
8117c478bd9Sstevel@tonic-gate sctp_prev = sctp;
812f4b3ec61Sdh155122 mutex_enter(&sctps->sctps_g_lock);
813f4b3ec61Sdh155122 sctp = list_next(&sctps->sctps_g_list, sctp);
8147c478bd9Sstevel@tonic-gate }
815f4b3ec61Sdh155122 mutex_exit(&sctps->sctps_g_lock);
8167c478bd9Sstevel@tonic-gate if (sctp_prev != NULL)
8177c478bd9Sstevel@tonic-gate SCTP_REFRELE(sctp_prev);
8187c478bd9Sstevel@tonic-gate
8195dd46ab5SKacheong Poon sctp_sum_mib(sctps, &sctp_mib);
8205dd46ab5SKacheong Poon
8217c478bd9Sstevel@tonic-gate optp = (struct opthdr *)&mpctl->b_rptr[sizeof (struct T_optmgmt_ack)];
8227c478bd9Sstevel@tonic-gate optp->level = MIB2_SCTP;
8237c478bd9Sstevel@tonic-gate optp->name = 0;
8245dd46ab5SKacheong Poon (void) snmp_append_data(mpdata, (char *)&sctp_mib, sizeof (sctp_mib));
8257c478bd9Sstevel@tonic-gate optp->len = msgdsize(mpdata);
8267c478bd9Sstevel@tonic-gate qreply(q, mpctl);
8277c478bd9Sstevel@tonic-gate
8287c478bd9Sstevel@tonic-gate /* table of connections... */
8297c478bd9Sstevel@tonic-gate optp = (struct opthdr *)&mp_conn_ctl->b_rptr[
8307c478bd9Sstevel@tonic-gate sizeof (struct T_optmgmt_ack)];
8317c478bd9Sstevel@tonic-gate optp->level = MIB2_SCTP;
8327c478bd9Sstevel@tonic-gate optp->name = MIB2_SCTP_CONN;
8337c478bd9Sstevel@tonic-gate optp->len = msgdsize(mp_conn_data);
8347c478bd9Sstevel@tonic-gate qreply(q, mp_conn_ctl);
8357c478bd9Sstevel@tonic-gate
8367c478bd9Sstevel@tonic-gate /* assoc local address table */
8377c478bd9Sstevel@tonic-gate optp = (struct opthdr *)&mp_local_ctl->b_rptr[
8387c478bd9Sstevel@tonic-gate sizeof (struct T_optmgmt_ack)];
8397c478bd9Sstevel@tonic-gate optp->level = MIB2_SCTP;
8407c478bd9Sstevel@tonic-gate optp->name = MIB2_SCTP_CONN_LOCAL;
8417c478bd9Sstevel@tonic-gate optp->len = msgdsize(mp_local_data);
8427c478bd9Sstevel@tonic-gate qreply(q, mp_local_ctl);
8437c478bd9Sstevel@tonic-gate
8447c478bd9Sstevel@tonic-gate /* assoc remote address table */
8457c478bd9Sstevel@tonic-gate optp = (struct opthdr *)&mp_rem_ctl->b_rptr[
8467c478bd9Sstevel@tonic-gate sizeof (struct T_optmgmt_ack)];
8477c478bd9Sstevel@tonic-gate optp->level = MIB2_SCTP;
8487c478bd9Sstevel@tonic-gate optp->name = MIB2_SCTP_CONN_REMOTE;
8497c478bd9Sstevel@tonic-gate optp->len = msgdsize(mp_rem_data);
8507c478bd9Sstevel@tonic-gate qreply(q, mp_rem_ctl);
8517c478bd9Sstevel@tonic-gate
85245916cd2Sjpk /* table of MLP attributes */
85345916cd2Sjpk optp = (struct opthdr *)&mp_attr_ctl->b_rptr[
85445916cd2Sjpk sizeof (struct T_optmgmt_ack)];
85545916cd2Sjpk optp->level = MIB2_SCTP;
85645916cd2Sjpk optp->name = EXPER_XPORT_MLP;
85745916cd2Sjpk optp->len = msgdsize(mp_attr_data);
85845916cd2Sjpk if (optp->len == 0)
85945916cd2Sjpk freemsg(mp_attr_ctl);
86045916cd2Sjpk else
86145916cd2Sjpk qreply(q, mp_attr_ctl);
86245916cd2Sjpk
8637c478bd9Sstevel@tonic-gate return (mp_ret);
8647c478bd9Sstevel@tonic-gate }
8657c478bd9Sstevel@tonic-gate
8667c478bd9Sstevel@tonic-gate /* Translate SCTP state to MIB2 SCTP state. */
8677c478bd9Sstevel@tonic-gate static int
sctp_snmp_state(sctp_t * sctp)8687c478bd9Sstevel@tonic-gate sctp_snmp_state(sctp_t *sctp)
8697c478bd9Sstevel@tonic-gate {
8707c478bd9Sstevel@tonic-gate if (sctp == NULL)
8717c478bd9Sstevel@tonic-gate return (0);
8727c478bd9Sstevel@tonic-gate
8737c478bd9Sstevel@tonic-gate switch (sctp->sctp_state) {
8747c478bd9Sstevel@tonic-gate case SCTPS_IDLE:
8757c478bd9Sstevel@tonic-gate case SCTPS_BOUND:
8767c478bd9Sstevel@tonic-gate return (MIB2_SCTP_closed);
8777c478bd9Sstevel@tonic-gate case SCTPS_LISTEN:
8787c478bd9Sstevel@tonic-gate return (MIB2_SCTP_listen);
8797c478bd9Sstevel@tonic-gate case SCTPS_COOKIE_WAIT:
8807c478bd9Sstevel@tonic-gate return (MIB2_SCTP_cookieWait);
8817c478bd9Sstevel@tonic-gate case SCTPS_COOKIE_ECHOED:
8827c478bd9Sstevel@tonic-gate return (MIB2_SCTP_cookieEchoed);
8837c478bd9Sstevel@tonic-gate case SCTPS_ESTABLISHED:
8847c478bd9Sstevel@tonic-gate return (MIB2_SCTP_established);
8857c478bd9Sstevel@tonic-gate case SCTPS_SHUTDOWN_PENDING:
8867c478bd9Sstevel@tonic-gate return (MIB2_SCTP_shutdownPending);
8877c478bd9Sstevel@tonic-gate case SCTPS_SHUTDOWN_SENT:
8887c478bd9Sstevel@tonic-gate return (MIB2_SCTP_shutdownSent);
8897c478bd9Sstevel@tonic-gate case SCTPS_SHUTDOWN_RECEIVED:
8907c478bd9Sstevel@tonic-gate return (MIB2_SCTP_shutdownReceived);
8917c478bd9Sstevel@tonic-gate case SCTPS_SHUTDOWN_ACK_SENT:
8927c478bd9Sstevel@tonic-gate return (MIB2_SCTP_shutdownAckSent);
8937c478bd9Sstevel@tonic-gate default:
8947c478bd9Sstevel@tonic-gate return (0);
8957c478bd9Sstevel@tonic-gate }
8967c478bd9Sstevel@tonic-gate }
8975dd46ab5SKacheong Poon
8985dd46ab5SKacheong Poon /*
8995dd46ab5SKacheong Poon * To sum up all MIB2 stats for a sctp_stack_t from all per CPU stats. The
9005dd46ab5SKacheong Poon * caller should initialize the target mib2_sctp_t properly as this function
9015dd46ab5SKacheong Poon * just adds up all the per CPU stats.
9025dd46ab5SKacheong Poon */
9035dd46ab5SKacheong Poon static void
sctp_sum_mib(sctp_stack_t * sctps,mib2_sctp_t * sctp_mib)9045dd46ab5SKacheong Poon sctp_sum_mib(sctp_stack_t *sctps, mib2_sctp_t *sctp_mib)
9055dd46ab5SKacheong Poon {
9065dd46ab5SKacheong Poon int i;
9075dd46ab5SKacheong Poon int cnt;
9085dd46ab5SKacheong Poon
9095dd46ab5SKacheong Poon /* Static componets of mib2_sctp_t. */
9105dd46ab5SKacheong Poon SET_MIB(sctp_mib->sctpRtoAlgorithm, MIB2_SCTP_RTOALGO_VANJ);
9115dd46ab5SKacheong Poon SET_MIB(sctp_mib->sctpRtoMin, sctps->sctps_rto_ming);
9125dd46ab5SKacheong Poon SET_MIB(sctp_mib->sctpRtoMax, sctps->sctps_rto_maxg);
9135dd46ab5SKacheong Poon SET_MIB(sctp_mib->sctpRtoInitial, sctps->sctps_rto_initialg);
9145dd46ab5SKacheong Poon SET_MIB(sctp_mib->sctpMaxAssocs, -1);
9155dd46ab5SKacheong Poon SET_MIB(sctp_mib->sctpValCookieLife, sctps->sctps_cookie_life);
9165dd46ab5SKacheong Poon SET_MIB(sctp_mib->sctpMaxInitRetr, sctps->sctps_max_init_retr);
9175dd46ab5SKacheong Poon
9185dd46ab5SKacheong Poon /* fixed length structure for IPv4 and IPv6 counters */
9195dd46ab5SKacheong Poon SET_MIB(sctp_mib->sctpEntrySize, sizeof (mib2_sctpConnEntry_t));
9205dd46ab5SKacheong Poon SET_MIB(sctp_mib->sctpLocalEntrySize,
9215dd46ab5SKacheong Poon sizeof (mib2_sctpConnLocalEntry_t));
9225dd46ab5SKacheong Poon SET_MIB(sctp_mib->sctpRemoteEntrySize,
9235dd46ab5SKacheong Poon sizeof (mib2_sctpConnRemoteEntry_t));
9245dd46ab5SKacheong Poon
9255dd46ab5SKacheong Poon /*
9265dd46ab5SKacheong Poon * sctps_sc_cnt may change in the middle of the loop. It is better
9275dd46ab5SKacheong Poon * to get its value first.
9285dd46ab5SKacheong Poon */
9295dd46ab5SKacheong Poon cnt = sctps->sctps_sc_cnt;
9305dd46ab5SKacheong Poon for (i = 0; i < cnt; i++)
9315dd46ab5SKacheong Poon sctp_add_mib(&sctps->sctps_sc[i]->sctp_sc_mib, sctp_mib);
9325dd46ab5SKacheong Poon }
9335dd46ab5SKacheong Poon
9345dd46ab5SKacheong Poon static void
sctp_add_mib(mib2_sctp_t * from,mib2_sctp_t * to)9355dd46ab5SKacheong Poon sctp_add_mib(mib2_sctp_t *from, mib2_sctp_t *to)
9365dd46ab5SKacheong Poon {
9375dd46ab5SKacheong Poon to->sctpActiveEstab += from->sctpActiveEstab;
9385dd46ab5SKacheong Poon to->sctpPassiveEstab += from->sctpPassiveEstab;
9395dd46ab5SKacheong Poon to->sctpAborted += from->sctpAborted;
9405dd46ab5SKacheong Poon to->sctpShutdowns += from->sctpShutdowns;
9415dd46ab5SKacheong Poon to->sctpOutOfBlue += from->sctpOutOfBlue;
9425dd46ab5SKacheong Poon to->sctpChecksumError += from->sctpChecksumError;
9435dd46ab5SKacheong Poon to->sctpOutCtrlChunks += from->sctpOutCtrlChunks;
9445dd46ab5SKacheong Poon to->sctpOutOrderChunks += from->sctpOutOrderChunks;
9455dd46ab5SKacheong Poon to->sctpOutUnorderChunks += from->sctpOutUnorderChunks;
9465dd46ab5SKacheong Poon to->sctpRetransChunks += from->sctpRetransChunks;
9475dd46ab5SKacheong Poon to->sctpOutAck += from->sctpOutAck;
9485dd46ab5SKacheong Poon to->sctpOutAckDelayed += from->sctpOutAckDelayed;
9495dd46ab5SKacheong Poon to->sctpOutWinUpdate += from->sctpOutWinUpdate;
9505dd46ab5SKacheong Poon to->sctpOutFastRetrans += from->sctpOutFastRetrans;
9515dd46ab5SKacheong Poon to->sctpOutWinProbe += from->sctpOutWinProbe;
9525dd46ab5SKacheong Poon to->sctpInCtrlChunks += from->sctpInCtrlChunks;
9535dd46ab5SKacheong Poon to->sctpInOrderChunks += from->sctpInOrderChunks;
9545dd46ab5SKacheong Poon to->sctpInUnorderChunks += from->sctpInUnorderChunks;
9555dd46ab5SKacheong Poon to->sctpInAck += from->sctpInAck;
9565dd46ab5SKacheong Poon to->sctpInDupAck += from->sctpInDupAck;
9575dd46ab5SKacheong Poon to->sctpInAckUnsent += from->sctpInAckUnsent;
9585dd46ab5SKacheong Poon to->sctpFragUsrMsgs += from->sctpFragUsrMsgs;
9595dd46ab5SKacheong Poon to->sctpReasmUsrMsgs += from->sctpReasmUsrMsgs;
9605dd46ab5SKacheong Poon to->sctpOutSCTPPkts += from->sctpOutSCTPPkts;
9615dd46ab5SKacheong Poon to->sctpInSCTPPkts += from->sctpInSCTPPkts;
9625dd46ab5SKacheong Poon to->sctpInInvalidCookie += from->sctpInInvalidCookie;
9635dd46ab5SKacheong Poon to->sctpTimRetrans += from->sctpTimRetrans;
9645dd46ab5SKacheong Poon to->sctpTimRetransDrop += from->sctpTimRetransDrop;
9655dd46ab5SKacheong Poon to->sctpTimHeartBeatProbe += from->sctpTimHeartBeatProbe;
9665dd46ab5SKacheong Poon to->sctpTimHeartBeatDrop += from->sctpTimHeartBeatDrop;
9675dd46ab5SKacheong Poon to->sctpListenDrop += from->sctpListenDrop;
9685dd46ab5SKacheong Poon to->sctpInClosed += from->sctpInClosed;
9695dd46ab5SKacheong Poon }
970