The branch main has been updated by glebius:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=71d2d5adfe18e80e5f8afeb4f86ef69be1aaad81

commit 71d2d5adfe18e80e5f8afeb4f86ef69be1aaad81
Author:     Gleb Smirnoff <[email protected]>
AuthorDate: 2021-12-19 16:22:12 +0000
Commit:     Gleb Smirnoff <[email protected]>
CommitDate: 2021-12-19 16:22:12 +0000

    tcptw: count how many times a tcptw was actually useful
    
    This will allow a sysadmin to lower net.inet.tcp.msl and
    see how long tcptw are actually useful.
---
 sys/netinet/tcp_timewait.c |  3 +++
 sys/netinet/tcp_var.h      |  5 +++++
 usr.bin/netstat/inet.c     | 14 ++++++++++++--
 3 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/sys/netinet/tcp_timewait.c b/sys/netinet/tcp_timewait.c
index f0ab77100336..999328df8392 100644
--- a/sys/netinet/tcp_timewait.c
+++ b/sys/netinet/tcp_timewait.c
@@ -462,6 +462,7 @@ tcp_twcheck(struct inpcb *inp, struct tcpopt *to, struct 
tcphdr *th,
                    INP_TRY_UPGRADE(inp) == 0)
                        goto drop;
                tcp_twclose(tw, 0);
+               TCPSTAT_INC(tcps_tw_recycles);
                return (1);
        }
 
@@ -481,6 +482,7 @@ tcp_twcheck(struct inpcb *inp, struct tcpopt *to, struct 
tcphdr *th,
                            th->th_seq+tlen, (tcp_seq)0, TH_RST|TH_ACK);
                }
                INP_UNLOCK(inp);
+               TCPSTAT_INC(tcps_tw_resets);
                return (0);
        }
 
@@ -519,6 +521,7 @@ tcp_twcheck(struct inpcb *inp, struct tcpopt *to, struct 
tcphdr *th,
            th->th_seq != tw->rcv_nxt || th->th_ack != tw->snd_nxt) {
                TCP_PROBE5(receive, NULL, NULL, m, NULL, th);
                tcp_twrespond(tw, TH_ACK);
+               TCPSTAT_INC(tcps_tw_responds);
                goto dropnoprobe;
        }
 drop:
diff --git a/sys/netinet/tcp_var.h b/sys/netinet/tcp_var.h
index 6b121a7fd311..c8e262ddf357 100644
--- a/sys/netinet/tcp_var.h
+++ b/sys/netinet/tcp_var.h
@@ -706,6 +706,11 @@ struct     tcpstat {
        uint64_t tcps_dsack_bytes;      /* Number of bytes DSACK'ed no TLP */
        uint64_t tcps_dsack_tlp_bytes;  /* Number of bytes DSACK'ed due to TLPs 
*/
 
+       /* TCPS_TIME_WAIT usage stats */
+       uint64_t tcps_tw_recycles;      /* Times time-wait was recycled. */
+       uint64_t tcps_tw_resets;        /* Times time-wait sent a reset. */
+       uint64_t tcps_tw_responds;      /* Times time-wait sent a valid ack. */
+
        uint64_t _pad[6];               /* 3 UTO, 3 TBD */
 };
 
diff --git a/usr.bin/netstat/inet.c b/usr.bin/netstat/inet.c
index dc777b0be990..b77447575911 100644
--- a/usr.bin/netstat/inet.c
+++ b/usr.bin/netstat/inet.c
@@ -857,13 +857,23 @@ tcp_stats(u_long off, const char *name, int af1 __unused, 
int proto __unused)
            "{N:/Path MTU discovery black hole detection min MSS 
activation%s}\n");
        p(tcps_pmtud_blackhole_failed, "\t{:pmtud-failed/%ju} "
            "{N:/Path MTU discovery black hole detection failure%s}\n");
+
+       xo_close_container("pmtud");
+       xo_open_container("tw");
+
+       p(tcps_tw_responds, "\t{:tw_responds/%ju} "
+           "{N:/time%s connection in TIME-WAIT responded with ACK}\n");
+       p(tcps_tw_recycles, "\t{:tw_recycles/%ju} "
+           "{N:/time%s connection in TIME-WAIT was actively recycled}\n");
+       p(tcps_tw_resets, "\t{:tw_resets/%ju} "
+           "{N:/time%s connection in TIME-WAIT responded with RST}\n");
+
+       xo_close_container("tw");
  #undef p
  #undef p1a
  #undef p2
  #undef p2a
  #undef p3
-       xo_close_container("pmtud");
-
 
        xo_open_container("TCP connection count by state");
        xo_emit("{T:/TCP connection count by state}:\n");

Reply via email to