Index: sys/netinet/tcp_input.c =================================================================== --- sys/netinet/tcp_input.c +++ sys/netinet/tcp_input.c @@ -523,7 +523,7 @@ CC_ALGO(tp)->ecnpkt_handler(tp->ccv); if (tp->ccv->flags & CCF_ACKNOW) - tcp_timer_activate(tp, TT_DELACK, tcp_delacktime); + tcp_timer_activate(tp, TT_DELACK, tp->t_delack); } } @@ -1995,7 +1995,7 @@ */ if (DELAY_ACK(tp, tlen) && tlen != 0) tcp_timer_activate(tp, TT_DELACK, - tcp_delacktime); + tp->t_delack); else tp->t_flags |= TF_ACKNOW; @@ -3059,7 +3059,7 @@ if (tp->t_flags & TF_DELACK) { tp->t_flags &= ~TF_DELACK; - tcp_timer_activate(tp, TT_DELACK, tcp_delacktime); + tcp_timer_activate(tp, TT_DELACK, tp->t_delack); } INP_WUNLOCK(tp->t_inpcb); return; Index: sys/netinet/tcp_subr.c =================================================================== --- sys/netinet/tcp_subr.c +++ sys/netinet/tcp_subr.c @@ -401,7 +401,7 @@ tcp_rexmit_min = TCPTV_MIN; if (tcp_rexmit_min < 1) tcp_rexmit_min = 1; - tcp_rexmit_slop = TCPTV_CPU_VAR; + tcp_rexmit_slop = 0; tcp_finwait2_timeout = TCPTV_FINWAIT2_TIMEOUT; tcp_tcbhashsize = hashsize; @@ -828,6 +828,7 @@ tp->t_rttvar = ((TCPTV_RTOBASE - TCPTV_SRTTBASE) << TCP_RTTVAR_SHIFT) / 4; tp->t_rttmin = tcp_rexmit_min; tp->t_rxtcur = TCPTV_RTOBASE; + tp->t_delack = tcp_delacktime; tp->snd_cwnd = TCP_MAXWIN << TCP_MAX_WINSHIFT; tp->snd_ssthresh = TCP_MAXWIN << TCP_MAX_WINSHIFT; tp->t_rcvtime = ticks; Index: sys/netinet/tcp_timer.h =================================================================== --- sys/netinet/tcp_timer.h +++ sys/netinet/tcp_timer.h @@ -75,7 +75,7 @@ #define TCPTV_MSL ( 30*hz) /* max seg lifetime (hah!) */ #define TCPTV_SRTTBASE 0 /* base roundtrip time; if 0, no idea yet */ -#define TCPTV_RTOBASE ( 3*hz) /* assumed RTO if no info */ +#define TCPTV_RTOBASE ( hz ) /* assumed RTO if no info - RFC 6298 */ #define TCPTV_PERSMIN ( 5*hz) /* retransmit persistence */ #define TCPTV_PERSMAX ( 60*hz) /* maximum persist interval */ @@ -107,7 +107,7 @@ * The prior minimum of 1*hz (1 second) badly breaks throughput on any * networks faster then a modem that has minor (e.g. 1%) packet loss. */ -#define TCPTV_MIN ( hz/33 ) /* minimum allowable value */ +#define TCPTV_MIN ( 3 ) /* minimum allowable value - see above */ #define TCPTV_CPU_VAR ( hz/5 ) /* cpu variance allowed (200ms) */ #define TCPTV_REXMTMAX ( 64*hz) /* max allowable REXMT value */ @@ -117,7 +117,7 @@ #define TCP_MAXRXTSHIFT 12 /* maximum retransmits */ -#define TCPTV_DELACK ( hz/10 ) /* 100ms timeout */ +#define TCPTV_DELACK ( hz/25 ) /* 40ms timeout */ #ifdef TCPTIMERS static const char *tcptimers[] = Index: sys/netinet/tcp_timer.c =================================================================== --- sys/netinet/tcp_timer.c +++ sys/netinet/tcp_timer.c @@ -649,6 +649,8 @@ rexmt = TCP_REXMTVAL(tp) * tcp_backoff[tp->t_rxtshift]; TCPT_RANGESET(tp->t_rxtcur, rexmt, tp->t_rttmin, TCPTV_REXMTMAX); + /* 1 < delack < tcp_delacktime - and should scale down with RTO/2 */ + TCPT_RANGESET(tp->t_delack, (rexmt >> 1), 1, tcp_delacktime); /* * We enter the path for PLMTUD if connection is established or, if Index: sys/netinet/tcp_var.h =================================================================== --- sys/netinet/tcp_var.h +++ sys/netinet/tcp_var.h @@ -206,6 +206,7 @@ u_int t_tsomaxsegsize; /* TSO maximum segment size in bytes */ u_int t_pmtud_saved_maxopd; /* pre-blackhole MSS */ u_int t_flags2; /* More tcpcb flags storage */ + u_int t_delack; /* delayed ack timer */ uint32_t t_ispare[8]; /* 5 UTO, 3 TBD */ void *t_pspare2[4]; /* 1 TCP_SIGNATURE, 3 TBD */