Blob Blame History Raw
diff -up net-tools-1.60/netstat.c.sctp net-tools-1.60/netstat.c
--- net-tools-1.60/netstat.c.sctp	2011-12-06 16:28:09.726243816 +0100
+++ net-tools-1.60/netstat.c	2011-12-06 16:28:09.769243277 +0100
@@ -112,7 +112,7 @@
 #endif
 
 /* prototypes for statistics.c */
-int parsesnmp(int, int, int);
+int parsesnmp(int, int, int, int);
 void inittab(void);
 int parsesnmp6(int, int, int);
 void inittab6(void);
@@ -2093,7 +2093,7 @@ int main
         if (!strcmp(afname, "inet")) {
 #if HAVE_AFINET
             inittab();
-            i = parsesnmp(flag_raw, flag_tcp, flag_udp);
+            i = parsesnmp(flag_raw, flag_tcp, flag_udp, flag_sctp);
 #else
             ENOSUPP("netstat", "AF INET");
 #endif
diff -up net-tools-1.60/statistics.c.sctp net-tools-1.60/statistics.c
--- net-tools-1.60/statistics.c.sctp	2011-12-06 16:28:09.705244079 +0100
+++ net-tools-1.60/statistics.c	2011-12-06 16:28:49.128751215 +0100
@@ -21,7 +21,7 @@
 #define UFWARN(x)
 #endif
 
-int print_static,f_raw,f_tcp,f_udp,f_unknown = 1;
+int print_static,f_raw,f_tcp,f_udp,f_sctp,f_unknown = 1;
 
 enum State {
     number = 0, opt_number, i_forward, i_inp_icmp, i_outp_icmp, i_rto_alg,
@@ -299,6 +299,27 @@ struct entry Tcpexttab[] =
     { "TCPRenoRecoveryFail", N_("%llu classic Reno fast retransmits failed"), opt_number },
 };
 
+struct entry Sctptab[] =
+{
+    {"SctpCurrEstab", N_("%llu Current Associations"), number},
+    {"SctpActiveEstabs", N_("%llu Active Associations"), number},
+    {"SctpPassiveEstabs", N_("%llu Passive Associations"), number},
+    {"SctpAborteds", N_("%llu Number of Aborteds "), number},
+    {"SctpShutdowns", N_("%llu Number of Graceful Terminations"), number},
+    {"SctpOutOfBlues", N_("%llu Number of Out of Blue packets"), number},
+    {"SctpChecksumErrors", N_("%llu Number of Packets with invalid Checksum"), number},
+    {"SctpOutCtrlChunks", N_("%llu Number of control chunks sent"), number},
+    {"SctpOutOrderChunks", N_("%llu Number of ordered chunks sent"), number},
+    {"SctpOutUnorderChunks", N_("%llu Number of Unordered chunks sent"), number},
+    {"SctpInCtrlChunks", N_("%llu Number of control chunks received"), number},
+    {"SctpInOrderChunks", N_("%llu Number of ordered chunks received"), number},
+    {"SctpInUnorderChunks", N_("%llu Number of Unordered chunks received"), number},
+    {"SctpFragUsrMsgs", N_("%llu Number of messages fragmented"), number},
+    {"SctpReasmUsrMsgs", N_("%llu Number of messages reassembled "), number},
+    {"SctpOutSCTPPacks", N_("%llu Number of SCTP packets sent"), number},
+    {"SctpInSCTPPacks", N_("%llu Number of SCTP packets received"), number},
+};
+
 struct tabtab {
     char *title;
     struct entry *tab;
@@ -312,6 +333,7 @@ struct tabtab snmptabs[] =
     {"Icmp", Icmptab, sizeof(Icmptab), &f_raw},
     {"Tcp", Tcptab, sizeof(Tcptab), &f_tcp},
     {"Udp", Udptab, sizeof(Udptab), &f_udp},
+    {"Sctp", Sctptab, sizeof(Sctptab), &f_sctp},
     {"TcpExt", Tcpexttab, sizeof(Tcpexttab), &f_tcp},
     {NULL}
 };
@@ -502,11 +524,37 @@ void process6_fd(FILE *f)
 
 }
 
-int parsesnmp(int flag_raw, int flag_tcp, int flag_udp)
+/* Process a file with name-value lines (like /proc/net/sctp/snmp) */
+void process_fd2(FILE *f, const char *filename)
+{
+    char buf1[1024];
+    char *sp;
+    struct tabtab *tab;
+    
+    tab = newtable(snmptabs, "Sctp");
+    
+    while (fgets(buf1, sizeof buf1, f)) {
+	sp = buf1 + strcspn(buf1, " \t\n");
+	if (!sp) {
+	    fprintf(stderr,_("error parsing %s\n"), filename);
+	    return;
+	}
+	*sp = '\0';
+	sp++;
+
+	sp += strspn(sp, " \t\n"); 
+
+	if (*sp != '\0' && *(tab->flag)) 	
+	    printval(tab, buf1, strtoul(sp, 0, 10));
+    }
+    return;
+}
+
+int parsesnmp(int flag_raw, int flag_tcp, int flag_udp, int flag_sctp)
 {
     FILE *f;
 
-    f_raw = flag_raw; f_tcp = flag_tcp; f_udp = flag_udp;
+    f_raw = flag_raw; f_tcp = flag_tcp; f_udp = flag_udp; f_sctp = flag_sctp;
     
     f = proc_fopen("/proc/net/snmp");
     if (!f) {
@@ -539,6 +587,17 @@ int parsesnmp(int flag_raw, int flag_tcp
     
         fclose(f);
     }
+
+    f = proc_fopen("/proc/net/sctp/snmp");
+    if (f) {
+	process_fd2(f,"/proc/net/sctp/snmp");
+	if (ferror(f)) {
+	    perror("/proc/net/sctp/snmp");
+	    fclose(f);
+	    return(1);
+	}
+    }
+
     return(0);
 }