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[];

Reply via email to