The branch main has been updated by glebius: URL: https://cgit.FreeBSD.org/src/commit/?id=552d17804629685a5b6b8fdc01f17e97d77e716c
commit 552d17804629685a5b6b8fdc01f17e97d77e716c Author: Gleb Smirnoff <gleb...@freebsd.org> AuthorDate: 2025-06-17 15:53:41 +0000 Commit: Gleb Smirnoff <gleb...@freebsd.org> CommitDate: 2025-06-17 15:54:18 +0000 tcp: provide sysctl for the maximum retransmission timeout Reviewed by: tuexen Differential Revision: https://reviews.freebsd.org/D50891 --- share/man/man4/tcp.4 | 14 +++++++++++--- sys/netinet/tcp_input.c | 4 ++-- sys/netinet/tcp_stacks/bbr.c | 2 +- sys/netinet/tcp_stacks/rack.c | 2 +- sys/netinet/tcp_subr.c | 4 +++- sys/netinet/tcp_syncache.c | 2 +- sys/netinet/tcp_timer.c | 8 ++++++-- sys/netinet/tcp_timer.h | 1 + 8 files changed, 26 insertions(+), 11 deletions(-) diff --git a/share/man/man4/tcp.4 b/share/man/man4/tcp.4 index d53d8086e8c0..4c00c78bb2b1 100644 --- a/share/man/man4/tcp.4 +++ b/share/man/man4/tcp.4 @@ -31,7 +31,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.Dd January 10, 2025 +.Dd June 16, 2025 .Dt TCP 4 .Os .Sh NAME @@ -871,10 +871,13 @@ segment is lost (default and maximum is 12). .It Va rexmit_drop_options Drop TCP options from third and later retransmitted SYN segments of a connection. -.It Va rexmit_initial , rexmit_min , rexmit_slop +.It Va rexmit_initial , rexmit_min , rexmit_slop , rexmit_max Adjust the retransmit timer calculation for .Tn TCP . -The slop is +A new connection starts with timer set to +.Va rexmit_initial . +The +.Va rexmit_slop typically added to the raw calculation to take into account occasional variances that the .Tn SRTT @@ -894,6 +897,11 @@ For this reason, we use 200ms of slop and a near-0 minimum, which gives us an effective minimum of 200ms (similar to .Tn Linux ) . The initial value is used before an RTT measurement has been performed. +The +.Va rexmit_min +and +.Va rexmit_max +set minimum and maximum timer values that a connection may have. .It Va rfc1323 Implement the window scaling and timestamp options of RFC 1323/RFC 7323 (default is 1). diff --git a/sys/netinet/tcp_input.c b/sys/netinet/tcp_input.c index 1c617b85ef89..7c032e13f37a 100644 --- a/sys/netinet/tcp_input.c +++ b/sys/netinet/tcp_input.c @@ -383,7 +383,7 @@ cc_conn_init(struct tcpcb *tp) } TCPT_RANGESET(tp->t_rxtcur, ((tp->t_srtt >> 2) + tp->t_rttvar) >> 1, - tp->t_rttmin, TCPTV_REXMTMAX); + tp->t_rttmin, tcp_rexmit_max); } if (metrics.hc_ssthresh) { /* @@ -3732,7 +3732,7 @@ tcp_xmit_timer(struct tcpcb *tp, int rtt) * the minimum feasible timer (which is 2 ticks). */ TCPT_RANGESET(tp->t_rxtcur, TCP_REXMTVAL(tp), - max(tp->t_rttmin, rtt + 2), TCPTV_REXMTMAX); + max(tp->t_rttmin, rtt + 2), tcp_rexmit_max); /* * We received an ack for a packet that wasn't retransmitted; diff --git a/sys/netinet/tcp_stacks/bbr.c b/sys/netinet/tcp_stacks/bbr.c index 17a0744961ce..e2cfec5c9275 100644 --- a/sys/netinet/tcp_stacks/bbr.c +++ b/sys/netinet/tcp_stacks/bbr.c @@ -10150,7 +10150,7 @@ bbr_init(struct tcpcb *tp, void **ptr) tcp_change_time_units(tp, TCP_TMR_GRANULARITY_TICKS); TCPT_RANGESET(tp->t_rxtcur, ((tp->t_srtt >> 2) + tp->t_rttvar) >> 1, - tp->t_rttmin, TCPTV_REXMTMAX); + tp->t_rttmin, tcp_rexmit_max); bbr_start_hpts_timer(bbr, tp, cts, 5, 0, 0); return (0); } diff --git a/sys/netinet/tcp_stacks/rack.c b/sys/netinet/tcp_stacks/rack.c index 1d4bc3124058..0388d73098a0 100644 --- a/sys/netinet/tcp_stacks/rack.c +++ b/sys/netinet/tcp_stacks/rack.c @@ -6347,7 +6347,7 @@ activate_tlp: if (to < rack_tlp_min) { to = rack_tlp_min; } - if (to > TICKS_2_USEC(TCPTV_REXMTMAX)) { + if (to > TICKS_2_USEC(tcp_rexmit_max)) { /* * If the TLP time works out to larger than the max * RTO lets not do TLP.. just RTO. diff --git a/sys/netinet/tcp_subr.c b/sys/netinet/tcp_subr.c index f766bf25ad66..7cd2168d262b 100644 --- a/sys/netinet/tcp_subr.c +++ b/sys/netinet/tcp_subr.c @@ -1052,7 +1052,8 @@ tcp_default_fb_init(struct tcpcb *tp, void **ptr) if (tp->t_rxtshift == 0) tp->t_rxtcur = rexmt; else - TCPT_RANGESET(tp->t_rxtcur, rexmt, tp->t_rttmin, TCPTV_REXMTMAX); + TCPT_RANGESET(tp->t_rxtcur, rexmt, tp->t_rttmin, + tcp_rexmit_max); /* * Nothing to do for ESTABLISHED or LISTEN states. And, we don't @@ -1478,6 +1479,7 @@ tcp_init(void *arg __unused) tcp_rexmit_min = TCPTV_MIN; if (tcp_rexmit_min < 1) tcp_rexmit_min = 1; + tcp_rexmit_max = TCPTV_REXMTMAX; tcp_persmin = TCPTV_PERSMIN; tcp_persmax = TCPTV_PERSMAX; tcp_rexmit_slop = TCPTV_CPU_VAR; diff --git a/sys/netinet/tcp_syncache.c b/sys/netinet/tcp_syncache.c index 69217ca39ee4..80e6b53d10df 100644 --- a/sys/netinet/tcp_syncache.c +++ b/sys/netinet/tcp_syncache.c @@ -443,7 +443,7 @@ syncache_timeout(struct syncache *sc, struct syncache_head *sch, int docallout) else TCPT_RANGESET(rexmt, tcp_rexmit_initial * tcp_backoff[sc->sc_rxmits], - tcp_rexmit_min, TCPTV_REXMTMAX); + tcp_rexmit_min, tcp_rexmit_max); sc->sc_rxttime = ticks + rexmt; sc->sc_rxmits++; if (TSTMP_LT(sc->sc_rxttime, sch->sch_nextc)) { diff --git a/sys/netinet/tcp_timer.c b/sys/netinet/tcp_timer.c index f1d864d33bd6..a9046e5725d5 100644 --- a/sys/netinet/tcp_timer.c +++ b/sys/netinet/tcp_timer.c @@ -119,6 +119,11 @@ SYSCTL_PROC(_net_inet_tcp, OID_AUTO, rexmit_min, CTLTYPE_INT | CTLFLAG_RW, &tcp_rexmit_min, 0, sysctl_msec_to_ticks, "I", "Minimum Retransmission Timeout"); +int tcp_rexmit_max; +SYSCTL_PROC(_net_inet_tcp, OID_AUTO, rexmit_max, CTLTYPE_INT | CTLFLAG_RW, + &tcp_rexmit_max, 0, sysctl_msec_to_ticks, "I", + "Maximum Retransmission Timeout"); + int tcp_rexmit_slop; SYSCTL_PROC(_net_inet_tcp, OID_AUTO, rexmit_slop, CTLTYPE_INT | CTLFLAG_RW, &tcp_rexmit_slop, 0, sysctl_msec_to_ticks, "I", @@ -618,8 +623,7 @@ tcp_timer_rexmt(struct tcpcb *tp) rexmt = tcp_rexmit_initial * tcp_backoff[tp->t_rxtshift]; else rexmt = TCP_REXMTVAL(tp) * tcp_backoff[tp->t_rxtshift]; - TCPT_RANGESET(tp->t_rxtcur, rexmt, - tp->t_rttmin, TCPTV_REXMTMAX); + TCPT_RANGESET(tp->t_rxtcur, rexmt, tp->t_rttmin, tcp_rexmit_max); /* * We enter the path for PLMTUD if connection is established or, if diff --git a/sys/netinet/tcp_timer.h b/sys/netinet/tcp_timer.h index 52994c43e8e7..875f1584988c 100644 --- a/sys/netinet/tcp_timer.h +++ b/sys/netinet/tcp_timer.h @@ -163,6 +163,7 @@ extern int tcp_maxunacktime; /* max time without making progress */ extern int tcp_maxpersistidle; extern int tcp_rexmit_initial; extern int tcp_rexmit_min; +extern int tcp_rexmit_max; extern int tcp_rexmit_slop; extern int tcp_ttl; /* time to live for TCP segs */ extern int tcp_backoff[];