changeset 10751:ac32bd227956

6886158 Stats exported in CR 6808307 can be erroneously reset by kstat and netstat
author George Shepherd <George.Shepherd@Sun.COM>
date Fri, 09 Oct 2009 11:41:32 -0700
parents 9168799eeedc
children 75a8eec7b28a
files usr/src/uts/common/inet/sctp/sctp.c usr/src/uts/common/inet/sctp/sctp_impl.h usr/src/uts/common/inet/sctp/sctp_opt_data.c usr/src/uts/common/inet/sctp/sctp_snmp.c
diffstat 4 files changed, 69 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/usr/src/uts/common/inet/sctp/sctp.c	Fri Oct 09 10:30:00 2009 -0700
+++ b/usr/src/uts/common/inet/sctp/sctp.c	Fri Oct 09 11:41:32 2009 -0700
@@ -787,6 +787,18 @@
 	sctp->sctp_iudchunks = 0;
 	sctp->sctp_fragdmsgs = 0;
 	sctp->sctp_reassmsgs = 0;
+	sctp->sctp_outseqtsns = 0;
+	sctp->sctp_osacks = 0;
+	sctp->sctp_isacks = 0;
+	sctp->sctp_idupchunks = 0;
+	sctp->sctp_gapcnt = 0;
+	sctp->sctp_cum_obchunks = 0;
+	sctp->sctp_cum_odchunks = 0;
+	sctp->sctp_cum_oudchunks = 0;
+	sctp->sctp_cum_rxtchunks = 0;
+	sctp->sctp_cum_ibchunks = 0;
+	sctp->sctp_cum_idchunks = 0;
+	sctp->sctp_cum_iudchunks = 0;
 
 	sctp->sctp_autoclose = 0;
 	sctp->sctp_tx_adaptation_code = 0;
--- a/usr/src/uts/common/inet/sctp/sctp_impl.h	Fri Oct 09 10:30:00 2009 -0700
+++ b/usr/src/uts/common/inet/sctp/sctp_impl.h	Fri Oct 09 11:41:32 2009 -0700
@@ -693,7 +693,7 @@
 	uint32_t	sctp_rtt_tsn;
 	int64_t		sctp_out_time;
 
-	/* Stats */
+	/* Stats can be reset by snmp users kstat, netstat and snmp agents */
 	uint64_t	sctp_opkts;		/* sent pkts */
 	uint64_t	sctp_obchunks;		/* sent control chunks */
 	uint64_t	sctp_odchunks;		/* sent ordered data chunks */
@@ -959,6 +959,17 @@
 	uint64_t	sctp_isacks;		/* total sacks received */
 	uint64_t	sctp_idupchunks;	/* rx dups, ord or unord */
 	uint64_t	sctp_gapcnt;		/* total gap acks rx */
+	/*
+	 * Add the current data from the counters which are reset by snmp
+	 * to these cumulative counters to use in per endpoint statistics.
+	 */
+	uint64_t	sctp_cum_obchunks;	/* sent control chunks */
+	uint64_t	sctp_cum_odchunks;	/* sent ordered data chunks */
+	uint64_t	sctp_cum_oudchunks;	/* sent unord data chunks */
+	uint64_t	sctp_cum_rxtchunks;	/* retransmitted chunks */
+	uint64_t	sctp_cum_ibchunks;	/* recv control chunks */
+	uint64_t	sctp_cum_idchunks;	/* recv ordered data chunks */
+	uint64_t	sctp_cum_iudchunks;	/* recv unord data chunks */
 
 	/*
 	 * When non-zero, this is the maximum observed RTO since assoc stats
--- a/usr/src/uts/common/inet/sctp/sctp_opt_data.c	Fri Oct 09 10:30:00 2009 -0700
+++ b/usr/src/uts/common/inet/sctp/sctp_opt_data.c	Fri Oct 09 11:41:32 2009 -0700
@@ -897,19 +897,29 @@
 
 			/*
 			 * Copy the current stats to the stats struct.
+			 * For stats which can be reset by snmp users
+			 * add the cumulative and current stats for
+			 * the raw totals to output to the user.
 			 */
-			sas->sas_rtxchunks =  sctp->sctp_rxtchunks;
 			sas->sas_gapcnt = sctp->sctp_gapcnt;
 			sas->sas_outseqtsns = sctp->sctp_outseqtsns;
 			sas->sas_osacks = sctp->sctp_osacks;
 			sas->sas_isacks = sctp->sctp_isacks;
-			sas->sas_octrlchunks = sctp->sctp_obchunks;
-			sas->sas_ictrlchunks = sctp->sctp_ibchunks;
-			sas->sas_oodchunks = sctp->sctp_odchunks;
-			sas->sas_iodchunks = sctp->sctp_idchunks;
-			sas->sas_ouodchunks = sctp->sctp_oudchunks;
-			sas->sas_iuodchunks = sctp->sctp_iudchunks;
 			sas->sas_idupchunks = sctp->sctp_idupchunks;
+			sas->sas_rtxchunks =  sctp->sctp_rxtchunks +
+			    sctp->sctp_cum_rxtchunks;
+			sas->sas_octrlchunks = sctp->sctp_obchunks +
+			    sctp->sctp_cum_obchunks;
+			sas->sas_ictrlchunks = sctp->sctp_ibchunks +
+			    sctp->sctp_cum_ibchunks;
+			sas->sas_oodchunks = sctp->sctp_odchunks +
+			    sctp->sctp_cum_odchunks;
+			sas->sas_iodchunks = sctp->sctp_idchunks +
+			    sctp->sctp_cum_idchunks;
+			sas->sas_ouodchunks = sctp->sctp_oudchunks +
+			    sctp->sctp_cum_oudchunks;
+			sas->sas_iuodchunks = sctp->sctp_iudchunks +
+			    sctp->sctp_cum_iudchunks;
 
 			/*
 			 * Copy out the maximum observed RTO since the
--- a/usr/src/uts/common/inet/sctp/sctp_snmp.c	Fri Oct 09 10:30:00 2009 -0700
+++ b/usr/src/uts/common/inet/sctp/sctp_snmp.c	Fri Oct 09 11:41:32 2009 -0700
@@ -110,24 +110,32 @@
 		if (sctp->sctp_obchunks) {
 			UPDATE_MIB(&sctps->sctps_mib, sctpOutCtrlChunks,
 			    sctp->sctp_obchunks);
+			UPDATE_LOCAL(sctp->sctp_cum_obchunks,
+			    sctp->sctp_obchunks);
 			sctp->sctp_obchunks = 0;
 		}
 
 		if (sctp->sctp_odchunks) {
 			UPDATE_MIB(&sctps->sctps_mib, sctpOutOrderChunks,
 			    sctp->sctp_odchunks);
+			UPDATE_LOCAL(sctp->sctp_cum_odchunks,
+			    sctp->sctp_odchunks);
 			sctp->sctp_odchunks = 0;
 		}
 
 		if (sctp->sctp_oudchunks) {
 			UPDATE_MIB(&sctps->sctps_mib, sctpOutUnorderChunks,
 			    sctp->sctp_oudchunks);
+			UPDATE_LOCAL(sctp->sctp_cum_oudchunks,
+			    sctp->sctp_oudchunks);
 			sctp->sctp_oudchunks = 0;
 		}
 
 		if (sctp->sctp_rxtchunks) {
 			UPDATE_MIB(&sctps->sctps_mib, sctpRetransChunks,
 			    sctp->sctp_rxtchunks);
+			UPDATE_LOCAL(sctp->sctp_cum_rxtchunks,
+			    sctp->sctp_rxtchunks);
 			sctp->sctp_rxtchunks = 0;
 		}
 
@@ -140,18 +148,24 @@
 		if (sctp->sctp_ibchunks) {
 			UPDATE_MIB(&sctps->sctps_mib, sctpInCtrlChunks,
 			    sctp->sctp_ibchunks);
+			UPDATE_LOCAL(sctp->sctp_cum_ibchunks,
+			    sctp->sctp_ibchunks);
 			sctp->sctp_ibchunks = 0;
 		}
 
 		if (sctp->sctp_idchunks) {
 			UPDATE_MIB(&sctps->sctps_mib, sctpInOrderChunks,
 			    sctp->sctp_idchunks);
+			UPDATE_LOCAL(sctp->sctp_cum_idchunks,
+			    sctp->sctp_idchunks);
 			sctp->sctp_idchunks = 0;
 		}
 
 		if (sctp->sctp_iudchunks) {
 			UPDATE_MIB(&sctps->sctps_mib, sctpInUnorderChunks,
 			    sctp->sctp_iudchunks);
+			UPDATE_LOCAL(sctp->sctp_cum_iudchunks,
+			    sctp->sctp_iudchunks);
 			sctp->sctp_iudchunks = 0;
 		}
 
@@ -483,27 +497,41 @@
 		sctp->sctp_opkts = 0;
 		UPDATE_MIB(&sctps->sctps_mib,
 		    sctpOutCtrlChunks, sctp->sctp_obchunks);
+		UPDATE_LOCAL(sctp->sctp_cum_obchunks,
+		    sctp->sctp_obchunks);
 		sctp->sctp_obchunks = 0;
 		UPDATE_MIB(&sctps->sctps_mib,
 		    sctpOutOrderChunks, sctp->sctp_odchunks);
+		UPDATE_LOCAL(sctp->sctp_cum_odchunks,
+		    sctp->sctp_odchunks);
 		sctp->sctp_odchunks = 0;
 		UPDATE_MIB(&sctps->sctps_mib, sctpOutUnorderChunks,
 		    sctp->sctp_oudchunks);
+		UPDATE_LOCAL(sctp->sctp_cum_oudchunks,
+		    sctp->sctp_oudchunks);
 		sctp->sctp_oudchunks = 0;
 		UPDATE_MIB(&sctps->sctps_mib,
 		    sctpRetransChunks, sctp->sctp_rxtchunks);
+		UPDATE_LOCAL(sctp->sctp_cum_rxtchunks,
+		    sctp->sctp_rxtchunks);
 		sctp->sctp_rxtchunks = 0;
 		UPDATE_MIB(&sctps->sctps_mib,
 		    sctpInSCTPPkts, sctp->sctp_ipkts);
 		sctp->sctp_ipkts = 0;
 		UPDATE_MIB(&sctps->sctps_mib,
 		    sctpInCtrlChunks, sctp->sctp_ibchunks);
+		UPDATE_LOCAL(sctp->sctp_cum_ibchunks,
+		    sctp->sctp_ibchunks);
 		sctp->sctp_ibchunks = 0;
 		UPDATE_MIB(&sctps->sctps_mib,
 		    sctpInOrderChunks, sctp->sctp_idchunks);
+		UPDATE_LOCAL(sctp->sctp_cum_idchunks,
+		    sctp->sctp_idchunks);
 		sctp->sctp_idchunks = 0;
 		UPDATE_MIB(&sctps->sctps_mib, sctpInUnorderChunks,
 		    sctp->sctp_iudchunks);
+		UPDATE_LOCAL(sctp->sctp_cum_iudchunks,
+		    sctp->sctp_iudchunks);
 		sctp->sctp_iudchunks = 0;
 		UPDATE_MIB(&sctps->sctps_mib,
 		    sctpFragUsrMsgs, sctp->sctp_fragdmsgs);