- }
- klseek(kmem, off, 0);
- read(kmem, (char *)&tcpstat, sizeof (tcpstat));
- printf("%s:\n\t%d bad header checksum%s\n", name,
- tcpstat.tcps_badsum, plural(tcpstat.tcps_badsum));
- printf("\t%d bad header offset field%s\n",
- tcpstat.tcps_badoff, plural(tcpstat.tcps_badoff));
- printf("\t%d incomplete header%s\n",
- tcpstat.tcps_hdrops, plural(tcpstat.tcps_hdrops));
-#ifdef notdef
- printf("\t%d bad segment%s\n",
- tcpstat.tcps_badsegs, plural(tcpstat.badsegs));
- printf("\t%d unacknowledged packet%s\n",
- tcpstat.tcps_unack, plural(tcpstat.tcps_unack));
-#endif
+ printf ("%s:\n", name);
+ kread(off, (char *)&tcpstat, sizeof (tcpstat));
+
+#define p(f, m) if (tcpstat.f || sflag <= 1) \
+ printf(m, tcpstat.f, plural(tcpstat.f))
+#define p2(f1, f2, m) if (tcpstat.f1 || tcpstat.f2 || sflag <= 1) \
+ printf(m, tcpstat.f1, plural(tcpstat.f1), tcpstat.f2, plural(tcpstat.f2))
+
+ p(tcps_sndtotal, "\t%d packet%s sent\n");
+ p2(tcps_sndpack,tcps_sndbyte,
+ "\t\t%d data packet%s (%d byte%s)\n");
+ p2(tcps_sndrexmitpack, tcps_sndrexmitbyte,
+ "\t\t%d data packet%s (%d byte%s) retransmitted\n");
+ p2(tcps_sndacks, tcps_delack,
+ "\t\t%d ack-only packet%s (%d delayed)\n");
+ p(tcps_sndurg, "\t\t%d URG only packet%s\n");
+ p(tcps_sndprobe, "\t\t%d window probe packet%s\n");
+ p(tcps_sndwinup, "\t\t%d window update packet%s\n");
+ p(tcps_sndctrl, "\t\t%d control packet%s\n");
+ p(tcps_rcvtotal, "\t%d packet%s received\n");
+ p2(tcps_rcvackpack, tcps_rcvackbyte, "\t\t%d ack%s (for %d byte%s)\n");
+ p(tcps_rcvdupack, "\t\t%d duplicate ack%s\n");
+ p(tcps_rcvacktoomuch, "\t\t%d ack%s for unsent data\n");
+ p2(tcps_rcvpack, tcps_rcvbyte,
+ "\t\t%d packet%s (%d byte%s) received in-sequence\n");
+ p2(tcps_rcvduppack, tcps_rcvdupbyte,
+ "\t\t%d completely duplicate packet%s (%d byte%s)\n");
+ p2(tcps_rcvpartduppack, tcps_rcvpartdupbyte,
+ "\t\t%d packet%s with some dup. data (%d byte%s duped)\n");
+ p2(tcps_rcvoopack, tcps_rcvoobyte,
+ "\t\t%d out-of-order packet%s (%d byte%s)\n");
+ p2(tcps_rcvpackafterwin, tcps_rcvbyteafterwin,
+ "\t\t%d packet%s (%d byte%s) of data after window\n");
+ p(tcps_rcvwinprobe, "\t\t%d window probe%s\n");
+ p(tcps_rcvwinupd, "\t\t%d window update packet%s\n");
+ p(tcps_rcvafterclose, "\t\t%d packet%s received after close\n");
+ p(tcps_rcvbadsum, "\t\t%d discarded for bad checksum%s\n");
+ p(tcps_rcvbadoff, "\t\t%d discarded for bad header offset field%s\n");
+ p(tcps_rcvshort, "\t\t%d discarded because packet too short\n");
+ p(tcps_connattempt, "\t%d connection request%s\n");
+ p(tcps_accepts, "\t%d connection accept%s\n");
+ p(tcps_connects, "\t%d connection%s established (including accepts)\n");
+ p2(tcps_closed, tcps_drops,
+ "\t%d connection%s closed (including %d drop%s)\n");
+ p(tcps_conndrops, "\t%d embryonic connection%s dropped\n");
+ p2(tcps_rttupdated, tcps_segstimed,
+ "\t%d segment%s updated rtt (of %d attempt%s)\n");
+ p(tcps_rexmttimeo, "\t%d retransmit timeout%s\n");
+ p(tcps_timeoutdrop, "\t\t%d connection%s dropped by rexmit timeout\n");
+ p(tcps_persisttimeo, "\t%d persist timeout%s\n");
+ p(tcps_keeptimeo, "\t%d keepalive timeout%s\n");
+ p(tcps_keepprobe, "\t\t%d keepalive probe%s sent\n");
+ p(tcps_keepdrops, "\t\t%d connection%s dropped by keepalive\n");
+#undef p
+#undef p2