git: 552d17804629 - main - tcp: provide sysctl for the maximum retransmission timeout
Date: Tue, 17 Jun 2025 15:54:35 UTC
The branch main has been updated by glebius:
URL: https://cgit.FreeBSD.org/src/commit/?id=552d17804629685a5b6b8fdc01f17e97d77e716c
commit 552d17804629685a5b6b8fdc01f17e97d77e716c
Author: Gleb Smirnoff <glebius@FreeBSD.org>
AuthorDate: 2025-06-17 15:53:41 +0000
Commit: Gleb Smirnoff <glebius@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[];