diff --git a/sys/netinet/tcp_input.c b/sys/netinet/tcp_input.c index 0fb62e0e8dcd..64cbed92f9b5 100644 --- a/sys/netinet/tcp_input.c +++ b/sys/netinet/tcp_input.c @@ -1785,6 +1785,7 @@ process_ACK: * we left off. */ if (tp->t_rxtshift == 1 && ticks < tp->t_badrxtwin) { + ++tcpstat.tcps_sndrexmitbad; tp->snd_cwnd = tp->snd_cwnd_prev; tp->snd_ssthresh = tp->snd_ssthresh_prev; tp->snd_nxt = tp->snd_max; diff --git a/sys/netinet/tcp_reass.c b/sys/netinet/tcp_reass.c index 0fb62e0e8dcd..64cbed92f9b5 100644 --- a/sys/netinet/tcp_reass.c +++ b/sys/netinet/tcp_reass.c @@ -1785,6 +1785,7 @@ process_ACK: * we left off. */ if (tp->t_rxtshift == 1 && ticks < tp->t_badrxtwin) { + ++tcpstat.tcps_sndrexmitbad; tp->snd_cwnd = tp->snd_cwnd_prev; tp->snd_ssthresh = tp->snd_ssthresh_prev; tp->snd_nxt = tp->snd_max; diff --git a/sys/netinet/tcp_var.h b/sys/netinet/tcp_var.h index a58bdf5e65fc..51f9ae084060 100644 --- a/sys/netinet/tcp_var.h +++ b/sys/netinet/tcp_var.h @@ -310,6 +310,7 @@ struct tcpstat { 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 */ diff --git a/usr.bin/netstat/inet.c b/usr.bin/netstat/inet.c index b95bad7156ac..f72fa9893ee2 100644 --- a/usr.bin/netstat/inet.c +++ b/usr.bin/netstat/inet.c @@ -381,6 +381,8 @@ tcp_stats(u_long off __unused, char *name, int af __unused) "\t\t%lu data packet%s (%lu byte%s)\n"); p2(tcps_sndrexmitpack, tcps_sndrexmitbyte, "\t\t%lu data packet%s (%lu 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"); p2a(tcps_sndacks, tcps_delack, "\t\t%lu ack-only packet%s (%lu delayed)\n");