Author: glebius
Date: Mon Apr  8 19:57:21 2013
New Revision: 249276
URL: http://svnweb.freebsd.org/changeset/base/249276

Log:
  Merge from projects/counters: TCP/IP stats.
  
    Convert 'struct ipstat' and 'struct tcpstat' to counter(9).
  
    This speeds up IP forwarding at extreme packet rates, and
  makes accounting more precise.
  
  Sponsored by: Nginx, Inc.

Modified:
  head/sys/netinet/ip_input.c
  head/sys/netinet/ip_var.h
  head/sys/netinet/tcp_input.c
  head/sys/netinet/tcp_var.h
  head/usr.bin/netstat/inet.c

Modified: head/sys/netinet/ip_input.c
==============================================================================
--- head/sys/netinet/ip_input.c Mon Apr  8 19:56:14 2013        (r249275)
+++ head/sys/netinet/ip_input.c Mon Apr  8 19:57:21 2013        (r249276)
@@ -153,11 +153,6 @@ VNET_DEFINE(struct in_ifaddrhead, in_ifa
 VNET_DEFINE(struct in_ifaddrhashhead *, in_ifaddrhashtbl); /* inet addr hash 
table  */
 VNET_DEFINE(u_long, in_ifaddrhmask);           /* mask for hash table */
 
-VNET_DEFINE(struct ipstat, ipstat);
-SYSCTL_VNET_STRUCT(_net_inet_ip, IPCTL_STATS, stats, CTLFLAG_RW,
-    &VNET_NAME(ipstat), ipstat,
-    "IP statistics (struct ipstat, netinet/ip_var.h)");
-
 static VNET_DEFINE(uma_zone_t, ipq_zone);
 static VNET_DEFINE(TAILQ_HEAD(ipqhead, ipq), ipq[IPREASS_NHASH]);
 static struct mtx ipqlock;
@@ -213,24 +208,89 @@ SYSCTL_VNET_INT(_net_inet_ip, OID_AUTO, 
 static void    ip_freef(struct ipqhead *, struct ipq *);
 
 /*
+ * IP statistics are stored in struct ipstat_p, which is
+ * an "array" of counter(9)s.  Although it isn't a real
+ * array, we treat it as array to reduce code bloat.
+ */
+VNET_DEFINE(struct ipstat_p, ipstatp);
+
+static void
+vnet_ipstatp_init(const void *unused)
+{
+       counter_u64_t *c;
+       int i;
+
+       for (i = 0, c = (counter_u64_t *)&V_ipstatp;
+           i < sizeof(V_ipstatp) / sizeof(counter_u64_t);
+           i++, c++) {
+               *c = counter_u64_alloc(M_WAITOK);
+               counter_u64_zero(*c);
+       }
+}
+VNET_SYSINIT(vnet_ipstatp_init, SI_SUB_PROTO_IFATTACHDOMAIN, SI_ORDER_ANY,
+            vnet_ipstatp_init, NULL);
+
+#ifdef VIMAGE
+static void
+vnet_ipstatp_uninit(const void *unused)
+{
+       counter_u64_t *c;
+       int i;
+
+       for (i = 0, c = (counter_u64_t *)&V_ipstatp;
+           i < sizeof(V_ipstatp) / sizeof(counter_u64_t);
+           i++, c++)
+               counter_u64_free(*c);
+}
+VNET_SYSUNINIT(vnet_ipstatp_uninit, SI_SUB_PROTO_IFATTACHDOMAIN, SI_ORDER_ANY,
+            vnet_ipstatp_uninit, NULL);
+#endif /* VIMAGE */
+
+static int
+ipstat_sysctl(SYSCTL_HANDLER_ARGS)
+{
+       struct ipstat ipstat;
+       counter_u64_t *c;
+       uint64_t *v;
+       int i;
+
+       for (i = 0, c = (counter_u64_t *)&V_ipstatp, v = (uint64_t *)&ipstat;
+           i < sizeof(V_ipstatp) / sizeof(counter_u64_t);
+           i++, c++, v++) {
+               *v = counter_u64_fetch(*c);
+               /*
+                * Old interface allowed to rewrite 'struct ipstat', and
+                * netstat(1) used it to zero the structure. To keep
+                * compatibility with old netstat(1) we will zero out
+                * statistics on every write attempt, however we no longer
+                * support writing arbitrary fake values to the statistics.
+                */
+               if (req->newptr)
+                       counter_u64_zero(*c);
+       }
+
+       return (SYSCTL_OUT(req, &ipstat, sizeof(ipstat)));
+}
+SYSCTL_VNET_PROC(_net_inet_ip, IPCTL_STATS, stats, CTLTYPE_OPAQUE | CTLFLAG_RW,
+    NULL, 0, ipstat_sysctl, "I",
+    "IP statistics (struct ipstat, netinet/ip_var.h)");
+
+/*
  * Kernel module interface for updating ipstat.  The argument is an index
- * into ipstat treated as an array of u_long.  While this encodes the general
- * layout of ipstat into the caller, it doesn't encode its location, so that
- * future changes to add, for example, per-CPU stats support won't cause
- * binary compatibility problems for kernel modules.
+ * into ipstat treated as an array.
  */
 void
 kmod_ipstat_inc(int statnum)
 {
 
-       (*((u_long *)&V_ipstat + statnum))++;
+       counter_u64_add((counter_u64_t )&V_ipstatp + statnum, 1);
 }
 
 void
 kmod_ipstat_dec(int statnum)
 {
 
-       (*((u_long *)&V_ipstat + statnum))--;
+       counter_u64_add((counter_u64_t )&V_ipstatp + statnum, -1);
 }
 
 static int

Modified: head/sys/netinet/ip_var.h
==============================================================================
--- head/sys/netinet/ip_var.h   Mon Apr  8 19:56:14 2013        (r249275)
+++ head/sys/netinet/ip_var.h   Mon Apr  8 19:57:21 2013        (r249276)
@@ -97,59 +97,95 @@ struct ip_moptions {
 };
 
 struct ipstat {
-       u_long  ips_total;              /* total packets received */
-       u_long  ips_badsum;             /* checksum bad */
-       u_long  ips_tooshort;           /* packet too short */
-       u_long  ips_toosmall;           /* not enough data */
-       u_long  ips_badhlen;            /* ip header length < data size */
-       u_long  ips_badlen;             /* ip length < ip header length */
-       u_long  ips_fragments;          /* fragments received */
-       u_long  ips_fragdropped;        /* frags dropped (dups, out of space) */
-       u_long  ips_fragtimeout;        /* fragments timed out */
-       u_long  ips_forward;            /* packets forwarded */
-       u_long  ips_fastforward;        /* packets fast forwarded */
-       u_long  ips_cantforward;        /* packets rcvd for unreachable dest */
-       u_long  ips_redirectsent;       /* packets forwarded on same net */
-       u_long  ips_noproto;            /* unknown or unsupported protocol */
-       u_long  ips_delivered;          /* datagrams delivered to upper level*/
-       u_long  ips_localout;           /* total ip packets generated here */
-       u_long  ips_odropped;           /* lost packets due to nobufs, etc. */
-       u_long  ips_reassembled;        /* total packets reassembled ok */
-       u_long  ips_fragmented;         /* datagrams successfully fragmented */
-       u_long  ips_ofragments;         /* output fragments created */
-       u_long  ips_cantfrag;           /* don't fragment flag was set, etc. */
-       u_long  ips_badoptions;         /* error in option processing */
-       u_long  ips_noroute;            /* packets discarded due to no route */
-       u_long  ips_badvers;            /* ip version != 4 */
-       u_long  ips_rawout;             /* total raw ip packets generated */
-       u_long  ips_toolong;            /* ip length > max ip packet size */
-       u_long  ips_notmember;          /* multicasts for unregistered grps */
-       u_long  ips_nogif;              /* no match gif found */
-       u_long  ips_badaddr;            /* invalid address on header */
+       uint64_t ips_total;             /* total packets received */
+       uint64_t ips_badsum;            /* checksum bad */
+       uint64_t ips_tooshort;          /* packet too short */
+       uint64_t ips_toosmall;          /* not enough data */
+       uint64_t ips_badhlen;           /* ip header length < data size */
+       uint64_t ips_badlen;            /* ip length < ip header length */
+       uint64_t ips_fragments;         /* fragments received */
+       uint64_t ips_fragdropped;       /* frags dropped (dups, out of space) */
+       uint64_t ips_fragtimeout;       /* fragments timed out */
+       uint64_t ips_forward;           /* packets forwarded */
+       uint64_t ips_fastforward;       /* packets fast forwarded */
+       uint64_t ips_cantforward;       /* packets rcvd for unreachable dest */
+       uint64_t ips_redirectsent;      /* packets forwarded on same net */
+       uint64_t ips_noproto;           /* unknown or unsupported protocol */
+       uint64_t ips_delivered;         /* datagrams delivered to upper level*/
+       uint64_t ips_localout;          /* total ip packets generated here */
+       uint64_t ips_odropped;          /* lost packets due to nobufs, etc. */
+       uint64_t ips_reassembled;       /* total packets reassembled ok */
+       uint64_t ips_fragmented;        /* datagrams successfully fragmented */
+       uint64_t ips_ofragments;        /* output fragments created */
+       uint64_t ips_cantfrag;          /* don't fragment flag was set, etc. */
+       uint64_t ips_badoptions;                /* error in option processing */
+       uint64_t ips_noroute;           /* packets discarded due to no route */
+       uint64_t ips_badvers;           /* ip version != 4 */
+       uint64_t ips_rawout;            /* total raw ip packets generated */
+       uint64_t ips_toolong;           /* ip length > max ip packet size */
+       uint64_t ips_notmember;         /* multicasts for unregistered grps */
+       uint64_t ips_nogif;             /* no match gif found */
+       uint64_t ips_badaddr;           /* invalid address on header */
 };
 
 #ifdef _KERNEL
 
+#include <sys/counter.h>
 #include <net/vnet.h>
 
+/* Should match 'struct ipstat' above. */
+struct ipstat_p {
+       counter_u64_t ips_total;
+       counter_u64_t ips_badsum;
+       counter_u64_t ips_tooshort;
+       counter_u64_t ips_toosmall;
+       counter_u64_t ips_badhlen;
+       counter_u64_t ips_badlen;
+       counter_u64_t ips_fragments;
+       counter_u64_t ips_fragdropped;
+       counter_u64_t ips_fragtimeout;
+       counter_u64_t ips_forward;
+       counter_u64_t ips_fastforward;
+       counter_u64_t ips_cantforward;
+       counter_u64_t ips_redirectsent;
+       counter_u64_t ips_noproto;
+       counter_u64_t ips_delivered;
+       counter_u64_t ips_localout;
+       counter_u64_t ips_odropped;
+       counter_u64_t ips_reassembled;
+       counter_u64_t ips_fragmented;
+       counter_u64_t ips_ofragments;
+       counter_u64_t ips_cantfrag;
+       counter_u64_t ips_badoptions;
+       counter_u64_t ips_noroute;
+       counter_u64_t ips_badvers;
+       counter_u64_t ips_rawout;
+       counter_u64_t ips_toolong;
+       counter_u64_t ips_notmember;
+       counter_u64_t ips_nogif;
+       counter_u64_t ips_badaddr;
+};
+VNET_DECLARE(struct ipstat_p, ipstatp);
+#define        V_ipstatp VNET(ipstatp)
+
 /*
  * In-kernel consumers can use these accessor macros directly to update
  * stats.
  */
-#define        IPSTAT_ADD(name, val)   V_ipstat.name += (val)
-#define        IPSTAT_SUB(name, val)   V_ipstat.name -= (val)
+#define        IPSTAT_ADD(name, val)   counter_u64_add(V_ipstatp.name, (val))
+#define        IPSTAT_SUB(name, val)   counter_u64_subtract(V_ipstatp.name, 
(val))
 #define        IPSTAT_INC(name)        IPSTAT_ADD(name, 1)
-#define        IPSTAT_DEC(name)        IPSTAT_SUB(name, 1)
+#define        IPSTAT_DEC(name)        IPSTAT_ADD(name, -1)
 
 /*
  * Kernel module consumers must use this accessor macro.
  */
 void   kmod_ipstat_inc(int statnum);
 #define        KMOD_IPSTAT_INC(name)                                           
\
-       kmod_ipstat_inc(offsetof(struct ipstat, name) / sizeof(u_long))
+       kmod_ipstat_inc(offsetof(struct ipstat_p, name) / sizeof(counter_u64_t))
 void   kmod_ipstat_dec(int statnum);
 #define        KMOD_IPSTAT_DEC(name)                                           
\
-       kmod_ipstat_dec(offsetof(struct ipstat, name) / sizeof(u_long))
+       kmod_ipstat_dec(offsetof(struct ipstat_p, name) / sizeof(counter_u64_t))
 
 /* flags passed to ip_output as last parameter */
 #define        IP_FORWARDING           0x1             /* most of ip header 
exists */
@@ -176,7 +212,6 @@ struct inpcb;
 struct route;
 struct sockopt;
 
-VNET_DECLARE(struct ipstat, ipstat);
 VNET_DECLARE(u_short, ip_id);                  /* ip packet ctr, for ids */
 VNET_DECLARE(int, ip_defttl);                  /* default IP ttl */
 VNET_DECLARE(int, ipforwarding);               /* ip forwarding */
@@ -192,7 +227,6 @@ VNET_DECLARE(int, rsvp_on);
 VNET_DECLARE(int, drop_redirect);
 extern struct  pr_usrreqs rip_usrreqs;
 
-#define        V_ipstat                VNET(ipstat)
 #define        V_ip_id                 VNET(ip_id)
 #define        V_ip_defttl             VNET(ip_defttl)
 #define        V_ipforwarding          VNET(ipforwarding)

Modified: head/sys/netinet/tcp_input.c
==============================================================================
--- head/sys/netinet/tcp_input.c        Mon Apr  8 19:56:14 2013        
(r249275)
+++ head/sys/netinet/tcp_input.c        Mon Apr  8 19:57:21 2013        
(r249276)
@@ -120,11 +120,6 @@ __FBSDID("$FreeBSD$");
 
 const int tcprexmtthresh = 3;
 
-VNET_DEFINE(struct tcpstat, tcpstat);
-SYSCTL_VNET_STRUCT(_net_inet_tcp, TCPCTL_STATS, stats, CTLFLAG_RW,
-    &VNET_NAME(tcpstat), tcpstat,
-    "TCP statistics (struct tcpstat, netinet/tcp_var.h)");
-
 int tcp_log_in_vain = 0;
 SYSCTL_INT(_net_inet_tcp, OID_AUTO, log_in_vain, CTLFLAG_RW,
     &tcp_log_in_vain, 0,
@@ -245,17 +240,76 @@ static void inline        hhook_run_tcp_est_in(
                            struct tcphdr *th, struct tcpopt *to);
 
 /*
+ * TCP statistics are stored in struct tcpstat_p, which is
+ * an "array" of counter(9)s.  Although it isn't a real
+ * array, we treat it as array to reduce code bloat.
+ */
+VNET_DEFINE(struct tcpstat_p, tcpstatp);
+
+static void
+vnet_tcpstatp_init(const void *unused)
+{
+       counter_u64_t *c;
+       int i;
+
+       for (i = 0, c = (counter_u64_t *)&V_tcpstatp;
+           i < sizeof(V_tcpstatp) / sizeof(counter_u64_t);
+           i++, c++) {
+               *c = counter_u64_alloc(M_WAITOK);
+               counter_u64_zero(*c);
+       }
+}
+VNET_SYSINIT(vnet_tcpstatp_init, SI_SUB_PROTO_IFATTACHDOMAIN, SI_ORDER_ANY,
+           vnet_tcpstatp_init, NULL);
+
+#ifdef VIMAGE
+static void
+vnet_tcpstatp_uninit(const void *unused)
+{
+       counter_u64_t *c;
+       int i;
+
+       for (i = 0, c = (counter_u64_t *)&V_tcpstatp;
+           i < sizeof(V_tcpstatp) / sizeof(counter_u64_t);
+           i++, c++)
+               counter_u64_free(*c);
+}
+VNET_SYSUNINIT(vnet_tcpstatp_init, SI_SUB_PROTO_IFATTACHDOMAIN, SI_ORDER_ANY,
+           vnet_ipstatp_uninit, NULL);
+#endif /* VIMAGE */
+
+static int
+tcpstat_sysctl(SYSCTL_HANDLER_ARGS)
+{
+       struct tcpstat tcpstat;
+       counter_u64_t *c;
+       uint64_t *v;
+       int i;
+
+       for (i = 0, c = (counter_u64_t *)&V_tcpstatp, v = (uint64_t *)&tcpstat;
+           i < sizeof(V_tcpstatp) / sizeof(counter_u64_t);
+           i++, c++, v++) {
+               *v = counter_u64_fetch(*c);
+               if (req->newptr)
+                       counter_u64_zero(*c);
+       }
+
+       return (SYSCTL_OUT(req, &tcpstat, sizeof(tcpstat)));
+}
+
+SYSCTL_VNET_PROC(_net_inet_tcp, TCPCTL_STATS, stats, CTLTYPE_OPAQUE |
+    CTLFLAG_RW, NULL, 0, tcpstat_sysctl, "I", 
+    "TCP statistics (struct tcpstat, netinet/tcp_var.h)");
+
+/*
  * Kernel module interface for updating tcpstat.  The argument is an index
- * into tcpstat treated as an array of u_long.  While this encodes the
- * general layout of tcpstat into the caller, it doesn't encode its location,
- * so that future changes to add, for example, per-CPU stats support won't
- * cause binary compatibility problems for kernel modules.
+ * into tcpstat treated as an array.
  */
 void
 kmod_tcpstat_inc(int statnum)
 {
 
-       (*((u_long *)&V_tcpstat + statnum))++;
+       counter_u64_add((counter_u64_t )&V_tcpstatp + statnum, 1);
 }
 
 /*

Modified: head/sys/netinet/tcp_var.h
==============================================================================
--- head/sys/netinet/tcp_var.h  Mon Apr  8 19:56:14 2013        (r249275)
+++ head/sys/netinet/tcp_var.h  Mon Apr  8 19:57:21 2013        (r249276)
@@ -389,125 +389,233 @@ struct tcptw {
  * but that's inconvenient at the moment.
  */
 struct tcpstat {
-       u_long  tcps_connattempt;       /* connections initiated */
-       u_long  tcps_accepts;           /* connections accepted */
-       u_long  tcps_connects;          /* connections established */
-       u_long  tcps_drops;             /* connections dropped */
-       u_long  tcps_conndrops;         /* embryonic connections dropped */
-       u_long  tcps_minmssdrops;       /* average minmss too low drops */
-       u_long  tcps_closed;            /* conn. closed (includes drops) */
-       u_long  tcps_segstimed;         /* segs where we tried to get rtt */
-       u_long  tcps_rttupdated;        /* times we succeeded */
-       u_long  tcps_delack;            /* delayed acks sent */
-       u_long  tcps_timeoutdrop;       /* conn. dropped in rxmt timeout */
-       u_long  tcps_rexmttimeo;        /* retransmit timeouts */
-       u_long  tcps_persisttimeo;      /* persist timeouts */
-       u_long  tcps_keeptimeo;         /* keepalive timeouts */
-       u_long  tcps_keepprobe;         /* keepalive probes sent */
-       u_long  tcps_keepdrops;         /* connections dropped in keepalive */
-
-       u_long  tcps_sndtotal;          /* total packets sent */
-       u_long  tcps_sndpack;           /* data packets sent */
-       u_long  tcps_sndbyte;           /* data bytes sent */
-       u_long  tcps_sndrexmitpack;     /* data packets retransmitted */
-       u_long  tcps_sndrexmitbyte;     /* data bytes retransmitted */
-       u_long  tcps_sndrexmitbad;      /* unnecessary packet retransmissions */
-       u_long  tcps_sndacks;           /* ack-only packets sent */
-       u_long  tcps_sndprobe;          /* window probes sent */
-       u_long  tcps_sndurg;            /* packets sent with URG only */
-       u_long  tcps_sndwinup;          /* window update-only packets sent */
-       u_long  tcps_sndctrl;           /* control (SYN|FIN|RST) packets sent */
-
-       u_long  tcps_rcvtotal;          /* total packets received */
-       u_long  tcps_rcvpack;           /* packets received in sequence */
-       u_long  tcps_rcvbyte;           /* bytes received in sequence */
-       u_long  tcps_rcvbadsum;         /* packets received with ccksum errs */
-       u_long  tcps_rcvbadoff;         /* packets received with bad offset */
-       u_long  tcps_rcvmemdrop;        /* packets dropped for lack of memory */
-       u_long  tcps_rcvshort;          /* packets received too short */
-       u_long  tcps_rcvduppack;        /* duplicate-only packets received */
-       u_long  tcps_rcvdupbyte;        /* duplicate-only bytes received */
-       u_long  tcps_rcvpartduppack;    /* packets with some duplicate data */
-       u_long  tcps_rcvpartdupbyte;    /* dup. bytes in part-dup. packets */
-       u_long  tcps_rcvoopack;         /* out-of-order packets received */
-       u_long  tcps_rcvoobyte;         /* out-of-order bytes received */
-       u_long  tcps_rcvpackafterwin;   /* packets with data after window */
-       u_long  tcps_rcvbyteafterwin;   /* bytes rcvd after window */
-       u_long  tcps_rcvafterclose;     /* packets rcvd after "close" */
-       u_long  tcps_rcvwinprobe;       /* rcvd window probe packets */
-       u_long  tcps_rcvdupack;         /* rcvd duplicate acks */
-       u_long  tcps_rcvacktoomuch;     /* rcvd acks for unsent data */
-       u_long  tcps_rcvackpack;        /* rcvd ack packets */
-       u_long  tcps_rcvackbyte;        /* bytes acked by rcvd acks */
-       u_long  tcps_rcvwinupd;         /* rcvd window update packets */
-       u_long  tcps_pawsdrop;          /* segments dropped due to PAWS */
-       u_long  tcps_predack;           /* times hdr predict ok for acks */
-       u_long  tcps_preddat;           /* times hdr predict ok for data pkts */
-       u_long  tcps_pcbcachemiss;
-       u_long  tcps_cachedrtt;         /* times cached RTT in route updated */
-       u_long  tcps_cachedrttvar;      /* times cached rttvar updated */
-       u_long  tcps_cachedssthresh;    /* times cached ssthresh updated */
-       u_long  tcps_usedrtt;           /* times RTT initialized from route */
-       u_long  tcps_usedrttvar;        /* times RTTVAR initialized from rt */
-       u_long  tcps_usedssthresh;      /* times ssthresh initialized from rt*/
-       u_long  tcps_persistdrop;       /* timeout in persist state */
-       u_long  tcps_badsyn;            /* bogus SYN, e.g. premature ACK */
-       u_long  tcps_mturesent;         /* resends due to MTU discovery */
-       u_long  tcps_listendrop;        /* listen queue overflows */
-       u_long  tcps_badrst;            /* ignored RSTs in the window */
-
-       u_long  tcps_sc_added;          /* entry added to syncache */
-       u_long  tcps_sc_retransmitted;  /* syncache entry was retransmitted */
-       u_long  tcps_sc_dupsyn;         /* duplicate SYN packet */
-       u_long  tcps_sc_dropped;        /* could not reply to packet */
-       u_long  tcps_sc_completed;      /* successful extraction of entry */
-       u_long  tcps_sc_bucketoverflow; /* syncache per-bucket limit hit */
-       u_long  tcps_sc_cacheoverflow;  /* syncache cache limit hit */
-       u_long  tcps_sc_reset;          /* RST removed entry from syncache */
-       u_long  tcps_sc_stale;          /* timed out or listen socket gone */
-       u_long  tcps_sc_aborted;        /* syncache entry aborted */
-       u_long  tcps_sc_badack;         /* removed due to bad ACK */
-       u_long  tcps_sc_unreach;        /* ICMP unreachable received */
-       u_long  tcps_sc_zonefail;       /* zalloc() failed */
-       u_long  tcps_sc_sendcookie;     /* SYN cookie sent */
-       u_long  tcps_sc_recvcookie;     /* SYN cookie received */
+       uint64_t tcps_connattempt;      /* connections initiated */
+       uint64_t tcps_accepts;          /* connections accepted */
+       uint64_t tcps_connects;         /* connections established */
+       uint64_t tcps_drops;            /* connections dropped */
+       uint64_t tcps_conndrops;        /* embryonic connections dropped */
+       uint64_t tcps_minmssdrops;      /* average minmss too low drops */
+       uint64_t tcps_closed;           /* conn. closed (includes drops) */
+       uint64_t tcps_segstimed;        /* segs where we tried to get rtt */
+       uint64_t tcps_rttupdated;       /* times we succeeded */
+       uint64_t tcps_delack;           /* delayed acks sent */
+       uint64_t tcps_timeoutdrop;      /* conn. dropped in rxmt timeout */
+       uint64_t tcps_rexmttimeo;       /* retransmit timeouts */
+       uint64_t tcps_persisttimeo;     /* persist timeouts */
+       uint64_t tcps_keeptimeo;        /* keepalive timeouts */
+       uint64_t tcps_keepprobe;        /* keepalive probes sent */
+       uint64_t tcps_keepdrops;        /* connections dropped in keepalive */
+
+       uint64_t tcps_sndtotal;         /* total packets sent */
+       uint64_t tcps_sndpack;          /* data packets sent */
+       uint64_t tcps_sndbyte;          /* data bytes sent */
+       uint64_t tcps_sndrexmitpack;    /* data packets retransmitted */
+       uint64_t tcps_sndrexmitbyte;    /* data bytes retransmitted */
+       uint64_t tcps_sndrexmitbad;     /* unnecessary packet retransmissions */
+       uint64_t tcps_sndacks;          /* ack-only packets sent */
+       uint64_t tcps_sndprobe;         /* window probes sent */
+       uint64_t tcps_sndurg;           /* packets sent with URG only */
+       uint64_t tcps_sndwinup;         /* window update-only packets sent */
+       uint64_t tcps_sndctrl;          /* control (SYN|FIN|RST) packets sent */
+
+       uint64_t tcps_rcvtotal;         /* total packets received */
+       uint64_t tcps_rcvpack;          /* packets received in sequence */
+       uint64_t tcps_rcvbyte;          /* bytes received in sequence */
+       uint64_t tcps_rcvbadsum;        /* packets received with ccksum errs */
+       uint64_t tcps_rcvbadoff;        /* packets received with bad offset */
+       uint64_t tcps_rcvmemdrop;       /* packets dropped for lack of memory */
+       uint64_t tcps_rcvshort;         /* packets received too short */
+       uint64_t tcps_rcvduppack;       /* duplicate-only packets received */
+       uint64_t tcps_rcvdupbyte;       /* duplicate-only bytes received */
+       uint64_t tcps_rcvpartduppack;   /* packets with some duplicate data */
+       uint64_t tcps_rcvpartdupbyte;   /* dup. bytes in part-dup. packets */
+       uint64_t tcps_rcvoopack;        /* out-of-order packets received */
+       uint64_t tcps_rcvoobyte;        /* out-of-order bytes received */
+       uint64_t tcps_rcvpackafterwin;  /* packets with data after window */
+       uint64_t tcps_rcvbyteafterwin;  /* bytes rcvd after window */
+       uint64_t tcps_rcvafterclose;    /* packets rcvd after "close" */
+       uint64_t tcps_rcvwinprobe;      /* rcvd window probe packets */
+       uint64_t tcps_rcvdupack;        /* rcvd duplicate acks */
+       uint64_t tcps_rcvacktoomuch;    /* rcvd acks for unsent data */
+       uint64_t tcps_rcvackpack;       /* rcvd ack packets */
+       uint64_t tcps_rcvackbyte;       /* bytes acked by rcvd acks */
+       uint64_t tcps_rcvwinupd;        /* rcvd window update packets */
+       uint64_t tcps_pawsdrop;         /* segments dropped due to PAWS */
+       uint64_t tcps_predack;          /* times hdr predict ok for acks */
+       uint64_t tcps_preddat;          /* times hdr predict ok for data pkts */
+       uint64_t tcps_pcbcachemiss;
+       uint64_t tcps_cachedrtt;        /* times cached RTT in route updated */
+       uint64_t tcps_cachedrttvar;     /* times cached rttvar updated */
+       uint64_t tcps_cachedssthresh;   /* times cached ssthresh updated */
+       uint64_t tcps_usedrtt;          /* times RTT initialized from route */
+       uint64_t tcps_usedrttvar;       /* times RTTVAR initialized from rt */
+       uint64_t tcps_usedssthresh;     /* times ssthresh initialized from rt*/
+       uint64_t tcps_persistdrop;      /* timeout in persist state */
+       uint64_t tcps_badsyn;           /* bogus SYN, e.g. premature ACK */
+       uint64_t tcps_mturesent;        /* resends due to MTU discovery */
+       uint64_t tcps_listendrop;       /* listen queue overflows */
+       uint64_t tcps_badrst;           /* ignored RSTs in the window */
+
+       uint64_t tcps_sc_added;         /* entry added to syncache */
+       uint64_t tcps_sc_retransmitted; /* syncache entry was retransmitted */
+       uint64_t tcps_sc_dupsyn;        /* duplicate SYN packet */
+       uint64_t tcps_sc_dropped;       /* could not reply to packet */
+       uint64_t tcps_sc_completed;     /* successful extraction of entry */
+       uint64_t tcps_sc_bucketoverflow;/* syncache per-bucket limit hit */
+       uint64_t tcps_sc_cacheoverflow; /* syncache cache limit hit */
+       uint64_t tcps_sc_reset;         /* RST removed entry from syncache */
+       uint64_t tcps_sc_stale;         /* timed out or listen socket gone */
+       uint64_t tcps_sc_aborted;       /* syncache entry aborted */
+       uint64_t tcps_sc_badack;        /* removed due to bad ACK */
+       uint64_t tcps_sc_unreach;       /* ICMP unreachable received */
+       uint64_t tcps_sc_zonefail;      /* zalloc() failed */
+       uint64_t tcps_sc_sendcookie;    /* SYN cookie sent */
+       uint64_t tcps_sc_recvcookie;    /* SYN cookie received */
 
-       u_long  tcps_hc_added;          /* entry added to hostcache */
-       u_long  tcps_hc_bucketoverflow; /* hostcache per bucket limit hit */
+       uint64_t tcps_hc_added;         /* entry added to hostcache */
+       uint64_t tcps_hc_bucketoverflow;/* hostcache per bucket limit hit */
 
-       u_long  tcps_finwait2_drops;    /* Drop FIN_WAIT_2 connection after 
time limit */
+       uint64_t tcps_finwait2_drops;    /* Drop FIN_WAIT_2 connection after 
time limit */
 
        /* SACK related stats */
-       u_long  tcps_sack_recovery_episode; /* SACK recovery episodes */
-       u_long  tcps_sack_rexmits;          /* SACK rexmit segments   */
-       u_long  tcps_sack_rexmit_bytes;     /* SACK rexmit bytes      */
-       u_long  tcps_sack_rcv_blocks;       /* SACK blocks (options) received */
-       u_long  tcps_sack_send_blocks;      /* SACK blocks (options) sent     */
-       u_long  tcps_sack_sboverflow;       /* times scoreboard overflowed */
+       uint64_t tcps_sack_recovery_episode; /* SACK recovery episodes */
+       uint64_t tcps_sack_rexmits;         /* SACK rexmit segments   */
+       uint64_t tcps_sack_rexmit_bytes;    /* SACK rexmit bytes      */
+       uint64_t tcps_sack_rcv_blocks;      /* SACK blocks (options) received */
+       uint64_t tcps_sack_send_blocks;     /* SACK blocks (options) sent     */
+       uint64_t tcps_sack_sboverflow;      /* times scoreboard overflowed */
        
        /* ECN related stats */
-       u_long  tcps_ecn_ce;            /* ECN Congestion Experienced */
-       u_long  tcps_ecn_ect0;          /* ECN Capable Transport */
-       u_long  tcps_ecn_ect1;          /* ECN Capable Transport */
-       u_long  tcps_ecn_shs;           /* ECN successful handshakes */
-       u_long  tcps_ecn_rcwnd;         /* # times ECN reduced the cwnd */
+       uint64_t tcps_ecn_ce;           /* ECN Congestion Experienced */
+       uint64_t tcps_ecn_ect0;         /* ECN Capable Transport */
+       uint64_t tcps_ecn_ect1;         /* ECN Capable Transport */
+       uint64_t tcps_ecn_shs;          /* ECN successful handshakes */
+       uint64_t tcps_ecn_rcwnd;        /* # times ECN reduced the cwnd */
 
        /* TCP_SIGNATURE related stats */
-       u_long  tcps_sig_rcvgoodsig;    /* Total matching signature received */
-       u_long  tcps_sig_rcvbadsig;     /* Total bad signature received */
-       u_long  tcps_sig_err_buildsig;  /* Mismatching signature received */
-       u_long  tcps_sig_err_sigopt;    /* No signature expected by socket */
-       u_long  tcps_sig_err_nosigopt;  /* No signature provided by segment */
+       uint64_t tcps_sig_rcvgoodsig;   /* Total matching signature received */
+       uint64_t tcps_sig_rcvbadsig;    /* Total bad signature received */
+       uint64_t tcps_sig_err_buildsig; /* Mismatching signature received */
+       uint64_t tcps_sig_err_sigopt;   /* No signature expected by socket */
+       uint64_t tcps_sig_err_nosigopt; /* No signature provided by segment */
 
-       u_long  _pad[12];               /* 6 UTO, 6 TBD */
+       uint64_t _pad[12];              /* 6 UTO, 6 TBD */
 };
 
 #ifdef _KERNEL
+
+#include <sys/counter.h>
+
+/* Should match 'struct tcpstat' above. */
+struct tcpstat_p {
+       counter_u64_t tcps_connattempt;
+       counter_u64_t tcps_accepts;
+       counter_u64_t tcps_connects;
+       counter_u64_t tcps_drops;
+       counter_u64_t tcps_conndrops;
+       counter_u64_t tcps_minmssdrops;
+       counter_u64_t tcps_closed;
+       counter_u64_t tcps_segstimed;
+       counter_u64_t tcps_rttupdated;
+       counter_u64_t tcps_delack;
+       counter_u64_t tcps_timeoutdrop;
+       counter_u64_t tcps_rexmttimeo;
+       counter_u64_t tcps_persisttimeo;
+       counter_u64_t tcps_keeptimeo;
+       counter_u64_t tcps_keepprobe;
+       counter_u64_t tcps_keepdrops;
+       counter_u64_t tcps_sndtotal;
+       counter_u64_t tcps_sndpack;
+       counter_u64_t tcps_sndbyte;
+       counter_u64_t tcps_sndrexmitpack;
+       counter_u64_t tcps_sndrexmitbyte;
+       counter_u64_t tcps_sndrexmitbad;
+       counter_u64_t tcps_sndacks;
+       counter_u64_t tcps_sndprobe;
+       counter_u64_t tcps_sndurg;
+       counter_u64_t tcps_sndwinup;
+       counter_u64_t tcps_sndctrl;
+       counter_u64_t tcps_rcvtotal;
+       counter_u64_t tcps_rcvpack;
+       counter_u64_t tcps_rcvbyte;
+       counter_u64_t tcps_rcvbadsum;
+       counter_u64_t tcps_rcvbadoff;
+       counter_u64_t tcps_rcvmemdrop;
+       counter_u64_t tcps_rcvshort;
+       counter_u64_t tcps_rcvduppack;
+       counter_u64_t tcps_rcvdupbyte;
+       counter_u64_t tcps_rcvpartduppack;
+       counter_u64_t tcps_rcvpartdupbyte;
+       counter_u64_t tcps_rcvoopack;
+       counter_u64_t tcps_rcvoobyte;
+       counter_u64_t tcps_rcvpackafterwin;
+       counter_u64_t tcps_rcvbyteafterwin;
+       counter_u64_t tcps_rcvafterclose;
+       counter_u64_t tcps_rcvwinprobe;
+       counter_u64_t tcps_rcvdupack;
+       counter_u64_t tcps_rcvacktoomuch;
+       counter_u64_t tcps_rcvackpack;
+       counter_u64_t tcps_rcvackbyte;
+       counter_u64_t tcps_rcvwinupd;
+       counter_u64_t tcps_pawsdrop;
+       counter_u64_t tcps_predack;
+       counter_u64_t tcps_preddat;
+       counter_u64_t tcps_pcbcachemiss;
+       counter_u64_t tcps_cachedrtt;
+       counter_u64_t tcps_cachedrttvar;
+       counter_u64_t tcps_cachedssthresh;
+       counter_u64_t tcps_usedrtt;
+       counter_u64_t tcps_usedrttvar;
+       counter_u64_t tcps_usedssthresh;
+       counter_u64_t tcps_persistdrop;
+       counter_u64_t tcps_badsyn;
+       counter_u64_t tcps_mturesent;
+       counter_u64_t tcps_listendrop;
+       counter_u64_t tcps_badrst;
+       counter_u64_t tcps_sc_added;
+       counter_u64_t tcps_sc_retransmitted;
+       counter_u64_t tcps_sc_dupsyn;
+       counter_u64_t tcps_sc_dropped;
+       counter_u64_t tcps_sc_completed;
+       counter_u64_t tcps_sc_bucketoverflow;
+       counter_u64_t tcps_sc_cacheoverflow;
+       counter_u64_t tcps_sc_reset;
+       counter_u64_t tcps_sc_stale;
+       counter_u64_t tcps_sc_aborted;
+       counter_u64_t tcps_sc_badack;
+       counter_u64_t tcps_sc_unreach;
+       counter_u64_t tcps_sc_zonefail;
+       counter_u64_t tcps_sc_sendcookie;
+       counter_u64_t tcps_sc_recvcookie;
+       counter_u64_t tcps_hc_added;
+       counter_u64_t tcps_hc_bucketoverflow;
+       counter_u64_t tcps_finwait2_drops;
+       counter_u64_t tcps_sack_recovery_episode;
+       counter_u64_t tcps_sack_rexmits;
+       counter_u64_t tcps_sack_rexmit_bytes;
+       counter_u64_t tcps_sack_rcv_blocks;
+       counter_u64_t tcps_sack_send_blocks;
+       counter_u64_t tcps_sack_sboverflow;
+       counter_u64_t tcps_ecn_ce;
+       counter_u64_t tcps_ecn_ect0;
+       counter_u64_t tcps_ecn_ect1;
+       counter_u64_t tcps_ecn_shs;
+       counter_u64_t tcps_ecn_rcwnd;
+       counter_u64_t tcps_sig_rcvgoodsig;
+       counter_u64_t tcps_sig_rcvbadsig;
+       counter_u64_t tcps_sig_err_buildsig;
+       counter_u64_t tcps_sig_err_sigopt;
+       counter_u64_t tcps_sig_err_nosigopt;
+};
+
+VNET_DECLARE(struct tcpstat_p, tcpstatp);      /* tcp statistics */
+#define        V_tcpstatp VNET(tcpstatp)
+
 /*
  * In-kernel consumers can use these accessor macros directly to update
  * stats.
  */
-#define        TCPSTAT_ADD(name, val)  V_tcpstat.name += (val)
+#define        TCPSTAT_ADD(name, val)  counter_u64_add(V_tcpstatp.name, (val))
 #define        TCPSTAT_INC(name)       TCPSTAT_ADD(name, 1)
 
 /*
@@ -515,7 +623,8 @@ struct      tcpstat {
  */
 void   kmod_tcpstat_inc(int statnum);
 #define        KMOD_TCPSTAT_INC(name)                                          
\
-       kmod_tcpstat_inc(offsetof(struct tcpstat, name) / sizeof(u_long))
+       kmod_tcpstat_inc(offsetof(struct tcpstat_p, name) /             \
+       sizeof(counter_u64_t))
 
 /*
  * TCP specific helper hook point identifiers.
@@ -605,7 +714,6 @@ MALLOC_DECLARE(M_TCPLOG);
 
 VNET_DECLARE(struct inpcbhead, tcb);           /* queue of active tcpcb's */
 VNET_DECLARE(struct inpcbinfo, tcbinfo);
-VNET_DECLARE(struct tcpstat, tcpstat);         /* tcp statistics */
 extern int tcp_log_in_vain;
 VNET_DECLARE(int, tcp_mssdflt);        /* XXX */
 VNET_DECLARE(int, tcp_minmss);
@@ -619,7 +727,6 @@ VNET_DECLARE(int, tcp_do_rfc3465);
 VNET_DECLARE(int, tcp_abc_l_var);
 #define        V_tcb                   VNET(tcb)
 #define        V_tcbinfo               VNET(tcbinfo)
-#define        V_tcpstat               VNET(tcpstat)
 #define        V_tcp_mssdflt           VNET(tcp_mssdflt)
 #define        V_tcp_minmss            VNET(tcp_minmss)
 #define        V_tcp_delack_enabled    VNET(tcp_delack_enabled)

Modified: head/usr.bin/netstat/inet.c
==============================================================================
--- head/usr.bin/netstat/inet.c Mon Apr  8 19:56:14 2013        (r249275)
+++ head/usr.bin/netstat/inet.c Mon Apr  8 19:57:21 2013        (r249276)
@@ -608,115 +608,121 @@ tcp_stats(u_long off, const char *name, 
 
        printf ("%s:\n", name);
 
-#define        p(f, m) if (tcpstat.f || sflag <= 1) \
-    printf(m, tcpstat.f, plural(tcpstat.f))
-#define        p1a(f, m) if (tcpstat.f || sflag <= 1) \
-    printf(m, 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))
-#define        p2a(f1, f2, m) if (tcpstat.f1 || tcpstat.f2 || sflag <= 1) \
-    printf(m, tcpstat.f1, plural(tcpstat.f1), tcpstat.f2)
-#define        p3(f, m) if (tcpstat.f || sflag <= 1) \
-    printf(m, tcpstat.f, pluralies(tcpstat.f))
+#define        p(f, m) if (tcpstat.f || sflag <= 1)                            
\
+       printf(m, (uintmax_t )tcpstat.f, plural(tcpstat.f))
 
-       p(tcps_sndtotal, "\t%lu packet%s sent\n");
-       p2(tcps_sndpack,tcps_sndbyte, "\t\t%lu data packet%s (%lu byte%s)\n");
+#define        p1a(f, m) if (tcpstat.f || sflag <= 1)                          
\
+       printf(m, (uintmax_t )tcpstat.f)
+
+#define        p2(f1, f2, m) if (tcpstat.f1 || tcpstat.f2 || sflag <= 1)       
\
+       printf(m, (uintmax_t )tcpstat.f1, plural(tcpstat.f1),           \
+           (uintmax_t )tcpstat.f2, plural(tcpstat.f2))
+
+#define        p2a(f1, f2, m) if (tcpstat.f1 || tcpstat.f2 || sflag <= 1)      
\
+       printf(m, (uintmax_t )tcpstat.f1, plural(tcpstat.f1),           \
+           (uintmax_t )tcpstat.f2)
+
+#define        p3(f, m) if (tcpstat.f || sflag <= 1)                           
\
+       printf(m, (uintmax_t )tcpstat.f, pluralies(tcpstat.f))
+
+       p(tcps_sndtotal, "\t%ju packet%s sent\n");
+       p2(tcps_sndpack,tcps_sndbyte, "\t\t%ju data packet%s (%ju byte%s)\n");
        p2(tcps_sndrexmitpack, tcps_sndrexmitbyte,
-           "\t\t%lu data packet%s (%lu byte%s) retransmitted\n");
+           "\t\t%ju data packet%s (%ju byte%s) retransmitted\n");
        p(tcps_sndrexmitbad,
-           "\t\t%lu data packet%s unnecessarily retransmitted\n");
-       p(tcps_mturesent, "\t\t%lu resend%s initiated by MTU discovery\n");
+           "\t\t%ju data packet%s unnecessarily retransmitted\n");
+       p(tcps_mturesent, "\t\t%ju resend%s initiated by MTU discovery\n");
        p2a(tcps_sndacks, tcps_delack,
-           "\t\t%lu ack-only packet%s (%lu delayed)\n");
-       p(tcps_sndurg, "\t\t%lu URG only packet%s\n");
-       p(tcps_sndprobe, "\t\t%lu window probe packet%s\n");
-       p(tcps_sndwinup, "\t\t%lu window update packet%s\n");
-       p(tcps_sndctrl, "\t\t%lu control packet%s\n");
-       p(tcps_rcvtotal, "\t%lu packet%s received\n");
+           "\t\t%ju ack-only packet%s (%ju delayed)\n");
+       p(tcps_sndurg, "\t\t%ju URG only packet%s\n");
+       p(tcps_sndprobe, "\t\t%ju window probe packet%s\n");
+       p(tcps_sndwinup, "\t\t%ju window update packet%s\n");
+       p(tcps_sndctrl, "\t\t%ju control packet%s\n");
+       p(tcps_rcvtotal, "\t%ju packet%s received\n");
        p2(tcps_rcvackpack, tcps_rcvackbyte,
-           "\t\t%lu ack%s (for %lu byte%s)\n");
-       p(tcps_rcvdupack, "\t\t%lu duplicate ack%s\n");
-       p(tcps_rcvacktoomuch, "\t\t%lu ack%s for unsent data\n");
+           "\t\t%ju ack%s (for %ju byte%s)\n");
+       p(tcps_rcvdupack, "\t\t%ju duplicate ack%s\n");
+       p(tcps_rcvacktoomuch, "\t\t%ju ack%s for unsent data\n");
        p2(tcps_rcvpack, tcps_rcvbyte,
-           "\t\t%lu packet%s (%lu byte%s) received in-sequence\n");
+           "\t\t%ju packet%s (%ju byte%s) received in-sequence\n");
        p2(tcps_rcvduppack, tcps_rcvdupbyte,
-           "\t\t%lu completely duplicate packet%s (%lu byte%s)\n");
-       p(tcps_pawsdrop, "\t\t%lu old duplicate packet%s\n");
+           "\t\t%ju completely duplicate packet%s (%ju byte%s)\n");
+       p(tcps_pawsdrop, "\t\t%ju old duplicate packet%s\n");
        p2(tcps_rcvpartduppack, tcps_rcvpartdupbyte,
-           "\t\t%lu packet%s with some dup. data (%lu byte%s duped)\n");
+           "\t\t%ju packet%s with some dup. data (%ju byte%s duped)\n");
        p2(tcps_rcvoopack, tcps_rcvoobyte,
-           "\t\t%lu out-of-order packet%s (%lu byte%s)\n");
+           "\t\t%ju out-of-order packet%s (%ju byte%s)\n");
        p2(tcps_rcvpackafterwin, tcps_rcvbyteafterwin,
-           "\t\t%lu packet%s (%lu byte%s) of data after window\n");
-       p(tcps_rcvwinprobe, "\t\t%lu window probe%s\n");
-       p(tcps_rcvwinupd, "\t\t%lu window update packet%s\n");
-       p(tcps_rcvafterclose, "\t\t%lu packet%s received after close\n");
-       p(tcps_rcvbadsum, "\t\t%lu discarded for bad checksum%s\n");
-       p(tcps_rcvbadoff, "\t\t%lu discarded for bad header offset field%s\n");
-       p1a(tcps_rcvshort, "\t\t%lu discarded because packet too short\n");
-       p1a(tcps_rcvmemdrop, "\t\t%lu discarded due to memory problems\n");
-       p(tcps_connattempt, "\t%lu connection request%s\n");
-       p(tcps_accepts, "\t%lu connection accept%s\n");
-       p(tcps_badsyn, "\t%lu bad connection attempt%s\n");
-       p(tcps_listendrop, "\t%lu listen queue overflow%s\n");
-       p(tcps_badrst, "\t%lu ignored RSTs in the window%s\n");
-       p(tcps_connects, "\t%lu connection%s established (including 
accepts)\n");
+           "\t\t%ju packet%s (%ju byte%s) of data after window\n");
+       p(tcps_rcvwinprobe, "\t\t%ju window probe%s\n");
+       p(tcps_rcvwinupd, "\t\t%ju window update packet%s\n");
+       p(tcps_rcvafterclose, "\t\t%ju packet%s received after close\n");
+       p(tcps_rcvbadsum, "\t\t%ju discarded for bad checksum%s\n");
+       p(tcps_rcvbadoff, "\t\t%ju discarded for bad header offset field%s\n");
+       p1a(tcps_rcvshort, "\t\t%ju discarded because packet too short\n");
+       p1a(tcps_rcvmemdrop, "\t\t%ju discarded due to memory problems\n");
+       p(tcps_connattempt, "\t%ju connection request%s\n");
+       p(tcps_accepts, "\t%ju connection accept%s\n");
+       p(tcps_badsyn, "\t%ju bad connection attempt%s\n");
+       p(tcps_listendrop, "\t%ju listen queue overflow%s\n");
+       p(tcps_badrst, "\t%ju ignored RSTs in the window%s\n");
+       p(tcps_connects, "\t%ju connection%s established (including 
accepts)\n");
        p2(tcps_closed, tcps_drops,
-           "\t%lu connection%s closed (including %lu drop%s)\n");
-       p(tcps_cachedrtt, "\t\t%lu connection%s updated cached RTT on close\n");
+           "\t%ju connection%s closed (including %ju drop%s)\n");
+       p(tcps_cachedrtt, "\t\t%ju connection%s updated cached RTT on close\n");
        p(tcps_cachedrttvar,
-           "\t\t%lu connection%s updated cached RTT variance on close\n");
+           "\t\t%ju connection%s updated cached RTT variance on close\n");
        p(tcps_cachedssthresh,
-           "\t\t%lu connection%s updated cached ssthresh on close\n");
-       p(tcps_conndrops, "\t%lu embryonic connection%s dropped\n");
+           "\t\t%ju connection%s updated cached ssthresh on close\n");
+       p(tcps_conndrops, "\t%ju embryonic connection%s dropped\n");
        p2(tcps_rttupdated, tcps_segstimed,
-           "\t%lu segment%s updated rtt (of %lu attempt%s)\n");
-       p(tcps_rexmttimeo, "\t%lu retransmit timeout%s\n");
-       p(tcps_timeoutdrop, "\t\t%lu connection%s dropped by rexmit timeout\n");
-       p(tcps_persisttimeo, "\t%lu persist timeout%s\n");
-       p(tcps_persistdrop, "\t\t%lu connection%s dropped by persist 
timeout\n");
+           "\t%ju segment%s updated rtt (of %ju attempt%s)\n");
+       p(tcps_rexmttimeo, "\t%ju retransmit timeout%s\n");
+       p(tcps_timeoutdrop, "\t\t%ju connection%s dropped by rexmit timeout\n");
+       p(tcps_persisttimeo, "\t%ju persist timeout%s\n");
+       p(tcps_persistdrop, "\t\t%ju connection%s dropped by persist 
timeout\n");
        p(tcps_finwait2_drops,
-           "\t%lu Connection%s (fin_wait_2) dropped because of timeout\n");
-       p(tcps_keeptimeo, "\t%lu keepalive timeout%s\n");
-       p(tcps_keepprobe, "\t\t%lu keepalive probe%s sent\n");
-       p(tcps_keepdrops, "\t\t%lu connection%s dropped by keepalive\n");
-       p(tcps_predack, "\t%lu correct ACK header prediction%s\n");
-       p(tcps_preddat, "\t%lu correct data packet header prediction%s\n");
-
-       p3(tcps_sc_added, "\t%lu syncache entr%s added\n");
-       p1a(tcps_sc_retransmitted, "\t\t%lu retransmitted\n");
-       p1a(tcps_sc_dupsyn, "\t\t%lu dupsyn\n");
-       p1a(tcps_sc_dropped, "\t\t%lu dropped\n");
-       p1a(tcps_sc_completed, "\t\t%lu completed\n");
-       p1a(tcps_sc_bucketoverflow, "\t\t%lu bucket overflow\n");
-       p1a(tcps_sc_cacheoverflow, "\t\t%lu cache overflow\n");
-       p1a(tcps_sc_reset, "\t\t%lu reset\n");
-       p1a(tcps_sc_stale, "\t\t%lu stale\n");
-       p1a(tcps_sc_aborted, "\t\t%lu aborted\n");
-       p1a(tcps_sc_badack, "\t\t%lu badack\n");
-       p1a(tcps_sc_unreach, "\t\t%lu unreach\n");
-       p(tcps_sc_zonefail, "\t\t%lu zone failure%s\n");
-       p(tcps_sc_sendcookie, "\t%lu cookie%s sent\n");
-       p(tcps_sc_recvcookie, "\t%lu cookie%s received\n");
+           "\t%ju Connection%s (fin_wait_2) dropped because of timeout\n");
+       p(tcps_keeptimeo, "\t%ju keepalive timeout%s\n");
+       p(tcps_keepprobe, "\t\t%ju keepalive probe%s sent\n");
+       p(tcps_keepdrops, "\t\t%ju connection%s dropped by keepalive\n");
+       p(tcps_predack, "\t%ju correct ACK header prediction%s\n");
+       p(tcps_preddat, "\t%ju correct data packet header prediction%s\n");
+
+       p3(tcps_sc_added, "\t%ju syncache entr%s added\n");
+       p1a(tcps_sc_retransmitted, "\t\t%ju retransmitted\n");
+       p1a(tcps_sc_dupsyn, "\t\t%ju dupsyn\n");
+       p1a(tcps_sc_dropped, "\t\t%ju dropped\n");
+       p1a(tcps_sc_completed, "\t\t%ju completed\n");
+       p1a(tcps_sc_bucketoverflow, "\t\t%ju bucket overflow\n");
+       p1a(tcps_sc_cacheoverflow, "\t\t%ju cache overflow\n");
+       p1a(tcps_sc_reset, "\t\t%ju reset\n");
+       p1a(tcps_sc_stale, "\t\t%ju stale\n");
+       p1a(tcps_sc_aborted, "\t\t%ju aborted\n");
+       p1a(tcps_sc_badack, "\t\t%ju badack\n");
+       p1a(tcps_sc_unreach, "\t\t%ju unreach\n");
+       p(tcps_sc_zonefail, "\t\t%ju zone failure%s\n");
+       p(tcps_sc_sendcookie, "\t%ju cookie%s sent\n");
+       p(tcps_sc_recvcookie, "\t%ju cookie%s received\n");
 
-       p3(tcps_hc_added, "\t%lu hostcache entr%s added\n");
-       p1a(tcps_hc_bucketoverflow, "\t\t%lu bucket overflow\n");
+       p3(tcps_hc_added, "\t%ju hostcache entr%s added\n");
+       p1a(tcps_hc_bucketoverflow, "\t\t%ju bucket overflow\n");
 
-       p(tcps_sack_recovery_episode, "\t%lu SACK recovery episode%s\n");
+       p(tcps_sack_recovery_episode, "\t%ju SACK recovery episode%s\n");
        p(tcps_sack_rexmits,
-           "\t%lu segment rexmit%s in SACK recovery episodes\n");
+           "\t%ju segment rexmit%s in SACK recovery episodes\n");
        p(tcps_sack_rexmit_bytes,
-           "\t%lu byte rexmit%s in SACK recovery episodes\n");
+           "\t%ju byte rexmit%s in SACK recovery episodes\n");
        p(tcps_sack_rcv_blocks,
-           "\t%lu SACK option%s (SACK blocks) received\n");
-       p(tcps_sack_send_blocks, "\t%lu SACK option%s (SACK blocks) sent\n");
-       p1a(tcps_sack_sboverflow, "\t%lu SACK scoreboard overflow\n");
-
-       p(tcps_ecn_ce, "\t%lu packet%s with ECN CE bit set\n");
-       p(tcps_ecn_ect0, "\t%lu packet%s with ECN ECT(0) bit set\n");
-       p(tcps_ecn_ect1, "\t%lu packet%s with ECN ECT(1) bit set\n");
-       p(tcps_ecn_shs, "\t%lu successful ECN handshake%s\n");
-       p(tcps_ecn_rcwnd, "\t%lu time%s ECN reduced the congestion window\n");
+           "\t%ju SACK option%s (SACK blocks) received\n");
+       p(tcps_sack_send_blocks, "\t%ju SACK option%s (SACK blocks) sent\n");
+       p1a(tcps_sack_sboverflow, "\t%ju SACK scoreboard overflow\n");
+
+       p(tcps_ecn_ce, "\t%ju packet%s with ECN CE bit set\n");
+       p(tcps_ecn_ect0, "\t%ju packet%s with ECN ECT(0) bit set\n");
+       p(tcps_ecn_ect1, "\t%ju packet%s with ECN ECT(1) bit set\n");
+       p(tcps_ecn_shs, "\t%ju successful ECN handshake%s\n");
+       p(tcps_ecn_rcwnd, "\t%ju time%s ECN reduced the congestion window\n");
 #undef p
 #undef p1a
 #undef p2
@@ -858,43 +864,43 @@ ip_stats(u_long off, const char *name, i
        printf("%s:\n", name);
 
 #define        p(f, m) if (ipstat.f || sflag <= 1) \
-    printf(m, ipstat.f, plural(ipstat.f))
+    printf(m, (uintmax_t )ipstat.f, plural(ipstat.f))
 #define        p1a(f, m) if (ipstat.f || sflag <= 1) \
-    printf(m, ipstat.f)
+    printf(m, (uintmax_t )ipstat.f)
 
-       p(ips_total, "\t%lu total packet%s received\n");
-       p(ips_badsum, "\t%lu bad header checksum%s\n");
-       p1a(ips_toosmall, "\t%lu with size smaller than minimum\n");
-       p1a(ips_tooshort, "\t%lu with data size < data length\n");
-       p1a(ips_toolong, "\t%lu with ip length > max ip packet size\n");
-       p1a(ips_badhlen, "\t%lu with header length < data size\n");
-       p1a(ips_badlen, "\t%lu with data length < header length\n");
-       p1a(ips_badoptions, "\t%lu with bad options\n");
-       p1a(ips_badvers, "\t%lu with incorrect version number\n");
-       p(ips_fragments, "\t%lu fragment%s received\n");
-       p(ips_fragdropped, "\t%lu fragment%s dropped (dup or out of space)\n");
-       p(ips_fragtimeout, "\t%lu fragment%s dropped after timeout\n");
-       p(ips_reassembled, "\t%lu packet%s reassembled ok\n");
-       p(ips_delivered, "\t%lu packet%s for this host\n");
-       p(ips_noproto, "\t%lu packet%s for unknown/unsupported protocol\n");
-       p(ips_forward, "\t%lu packet%s forwarded");
-       p(ips_fastforward, " (%lu packet%s fast forwarded)");
+       p(ips_total, "\t%ju total packet%s received\n");
+       p(ips_badsum, "\t%ju bad header checksum%s\n");
+       p1a(ips_toosmall, "\t%ju with size smaller than minimum\n");
+       p1a(ips_tooshort, "\t%ju with data size < data length\n");
+       p1a(ips_toolong, "\t%ju with ip length > max ip packet size\n");
+       p1a(ips_badhlen, "\t%ju with header length < data size\n");
+       p1a(ips_badlen, "\t%ju with data length < header length\n");
+       p1a(ips_badoptions, "\t%ju with bad options\n");
+       p1a(ips_badvers, "\t%ju with incorrect version number\n");
+       p(ips_fragments, "\t%ju fragment%s received\n");
+       p(ips_fragdropped, "\t%ju fragment%s dropped (dup or out of space)\n");
+       p(ips_fragtimeout, "\t%ju fragment%s dropped after timeout\n");
+       p(ips_reassembled, "\t%ju packet%s reassembled ok\n");
+       p(ips_delivered, "\t%ju packet%s for this host\n");
+       p(ips_noproto, "\t%ju packet%s for unknown/unsupported protocol\n");
+       p(ips_forward, "\t%ju packet%s forwarded");
+       p(ips_fastforward, " (%ju packet%s fast forwarded)");
        if (ipstat.ips_forward || sflag <= 1)
                putchar('\n');
-       p(ips_cantforward, "\t%lu packet%s not forwardable\n");
+       p(ips_cantforward, "\t%ju packet%s not forwardable\n");
        p(ips_notmember,
-           "\t%lu packet%s received for unknown multicast group\n");
-       p(ips_redirectsent, "\t%lu redirect%s sent\n");
-       p(ips_localout, "\t%lu packet%s sent from this host\n");
-       p(ips_rawout, "\t%lu packet%s sent with fabricated ip header\n");
+           "\t%ju packet%s received for unknown multicast group\n");
+       p(ips_redirectsent, "\t%ju redirect%s sent\n");
+       p(ips_localout, "\t%ju packet%s sent from this host\n");
+       p(ips_rawout, "\t%ju packet%s sent with fabricated ip header\n");
        p(ips_odropped,
-           "\t%lu output packet%s dropped due to no bufs, etc.\n");
-       p(ips_noroute, "\t%lu output packet%s discarded due to no route\n");
-       p(ips_fragmented, "\t%lu output datagram%s fragmented\n");
-       p(ips_ofragments, "\t%lu fragment%s created\n");
-       p(ips_cantfrag, "\t%lu datagram%s that can't be fragmented\n");
-       p(ips_nogif, "\t%lu tunneling packet%s that can't find gif\n");
-       p(ips_badaddr, "\t%lu datagram%s with bad address in header\n");
+           "\t%ju output packet%s dropped due to no bufs, etc.\n");
+       p(ips_noroute, "\t%ju output packet%s discarded due to no route\n");
+       p(ips_fragmented, "\t%ju output datagram%s fragmented\n");

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to