Author: tuexen
Date: Tue Mar 31 15:54:54 2020
New Revision: 359487
URL: https://svnweb.freebsd.org/changeset/base/359487

Log:
  Allow the TCP backhole detection to be disabled at all, enabled only
  for IPv4, enabled only for IPv6, and enabled for IPv4 and IPv6.
  The current blackhole detection might classify a temporary outage as
  an MTU issue and reduces permanently the MSS. Since the consequences of
  such a reduction due to a misclassification are much more drastically
  for IPv4 than for IPv6, allow the administrator to enable it for IPv6 only.
  
  Reviewed by:          bcr@ (man page), Richard Scheffenegger
  Sponsored by:         Netflix, Inc.
  Differential Revision:        https://reviews.freebsd.org/D24219

Modified:
  head/share/man/man4/tcp.4
  head/sys/netinet/tcp_stacks/bbr.c
  head/sys/netinet/tcp_stacks/rack.c
  head/sys/netinet/tcp_timer.c

Modified: head/share/man/man4/tcp.4
==============================================================================
--- head/share/man/man4/tcp.4   Tue Mar 31 15:47:55 2020        (r359486)
+++ head/share/man/man4/tcp.4   Tue Mar 31 15:54:54 2020        (r359487)
@@ -34,7 +34,7 @@
 .\"     From: @(#)tcp.4        8.1 (Berkeley) 6/5/93
 .\" $FreeBSD$
 .\"
-.Dd March 29, 2020
+.Dd March 31, 2020
 .Dt TCP 4
 .Os
 .Sh NAME
@@ -628,21 +628,31 @@ specific connection.
 This is needed to help with connection establishment
 when a broken firewall is in the network path.
 .It Va pmtud_blackhole_detection
-Turn on automatic path MTU blackhole detection.
-In case of retransmits OS will
-lower the MSS to check if it's MTU problem.
-If current MSS is greater than
-configured value to try
+Enable automatic path MTU blackhole detection.
+In case of retransmits of MSS sized segments,
+the OS will lower the MSS to check if it's an MTU problem.
+If the current MSS is greater than the configured value to try
 .Po Va net.inet.tcp.pmtud_blackhole_mss
 and
 .Va net.inet.tcp.v6pmtud_blackhole_mss
 .Pc ,
 it will be set to this value, otherwise,
-MSS will be set to default values
+the MSS will be set to the default values
 .Po Va net.inet.tcp.mssdflt
 and
 .Va net.inet.tcp.v6mssdflt
 .Pc .
+Settings:
+.Bl -tag -compact
+.It 0
+Disable path MTU blackhole detection.
+.It 1
+Enable path MTU blackhole detection for IPv4 and IPv6.
+.It 2
+Enable path MTU blackhole detection only for IPv4.
+.It 3
+Enable path MTU blackhole detection only for IPv6.
+.El
 .It Va pmtud_blackhole_mss
 MSS to try for IPv4 if PMTU blackhole detection is turned on.
 .It Va v6pmtud_blackhole_mss

Modified: head/sys/netinet/tcp_stacks/bbr.c
==============================================================================
--- head/sys/netinet/tcp_stacks/bbr.c   Tue Mar 31 15:47:55 2020        
(r359486)
+++ head/sys/netinet/tcp_stacks/bbr.c   Tue Mar 31 15:54:54 2020        
(r359487)
@@ -5041,6 +5041,7 @@ bbr_timeout_rxt(struct tcpcb *tp, struct tcp_bbr *bbr,
 {
        int32_t rexmt;
        int32_t retval = 0;
+       bool isipv6;
 
        bbr->r_ctl.rc_hpts_flags &= ~PACE_TMR_RXT;
        if (bbr->rc_all_timers_stopped) {
@@ -5127,11 +5128,16 @@ bbr_timeout_rxt(struct tcpcb *tp, struct tcp_bbr *bbr,
         * of packets and process straight to FIN. In that case we won't
         * catch ESTABLISHED state.
         */
-       if (V_tcp_pmtud_blackhole_detect && (((tp->t_state == TCPS_ESTABLISHED))
-           || (tp->t_state == TCPS_FIN_WAIT_1))) {
 #ifdef INET6
-               int32_t isipv6;
+       isipv6 = (tp->t_inpcb->inp_vflag & INP_IPV6) ? true : false;
+#else
+       isipv6 = false;
 #endif
+       if (((V_tcp_pmtud_blackhole_detect == 1) ||
+           (V_tcp_pmtud_blackhole_detect == 2 && !isipv6) ||
+           (V_tcp_pmtud_blackhole_detect == 3 && isipv6)) &&
+           ((tp->t_state == TCPS_ESTABLISHED) ||
+           (tp->t_state == TCPS_FIN_WAIT_1))) {
 
                /*
                 * Idea here is that at each stage of mtu probe (usually,

Modified: head/sys/netinet/tcp_stacks/rack.c
==============================================================================
--- head/sys/netinet/tcp_stacks/rack.c  Tue Mar 31 15:47:55 2020        
(r359486)
+++ head/sys/netinet/tcp_stacks/rack.c  Tue Mar 31 15:54:54 2020        
(r359487)
@@ -3123,6 +3123,7 @@ rack_timeout_rxt(struct tcpcb *tp, struct tcp_rack *ra
        int32_t rexmt;
        struct inpcb *inp;
        int32_t retval = 0;
+       bool isipv6;
 
        inp = tp->t_inpcb;
        if (tp->t_timers->tt_flags & TT_STOPPED) {
@@ -3209,11 +3210,16 @@ rack_timeout_rxt(struct tcpcb *tp, struct tcp_rack *ra
         * of packets and process straight to FIN. In that case we won't
         * catch ESTABLISHED state.
         */
-       if (V_tcp_pmtud_blackhole_detect && (((tp->t_state == TCPS_ESTABLISHED))
-           || (tp->t_state == TCPS_FIN_WAIT_1))) {
 #ifdef INET6
-               int32_t isipv6;
+       isipv6 = (tp->t_inpcb->inp_vflag & INP_IPV6) ? true : false;
+#else
+       isipv6 = false;
 #endif
+       if (((V_tcp_pmtud_blackhole_detect == 1) ||
+           (V_tcp_pmtud_blackhole_detect == 2 && !isipv6) ||
+           (V_tcp_pmtud_blackhole_detect == 3 && isipv6)) &&
+           ((tp->t_state == TCPS_ESTABLISHED) ||
+           (tp->t_state == TCPS_FIN_WAIT_1))) {
 
                /*
                 * Idea here is that at each stage of mtu probe (usually,
@@ -3243,7 +3249,6 @@ rack_timeout_rxt(struct tcpcb *tp, struct tcp_rack *ra
                         * default in an attempt to retransmit.
                         */
 #ifdef INET6
-                       isipv6 = (tp->t_inpcb->inp_vflag & INP_IPV6) ? 1 : 0;
                        if (isipv6 &&
                            tp->t_maxseg > V_tcp_v6pmtud_blackhole_mss) {
                                /* Use the sysctl tuneable blackhole MSS. */

Modified: head/sys/netinet/tcp_timer.c
==============================================================================
--- head/sys/netinet/tcp_timer.c        Tue Mar 31 15:47:55 2020        
(r359486)
+++ head/sys/netinet/tcp_timer.c        Tue Mar 31 15:54:54 2020        
(r359487)
@@ -614,6 +614,7 @@ tcp_timer_rexmt(void * xtp)
        int rexmt;
        struct inpcb *inp;
        struct epoch_tracker et;
+       bool isipv6;
 #ifdef TCPDEBUG
        int ostate;
 
@@ -712,12 +713,16 @@ tcp_timer_rexmt(void * xtp)
         * packets and process straight to FIN. In that case we won't catch
         * ESTABLISHED state.
         */
-       if (V_tcp_pmtud_blackhole_detect && (((tp->t_state == TCPS_ESTABLISHED))
-           || (tp->t_state == TCPS_FIN_WAIT_1))) {
 #ifdef INET6
-               int isipv6;
+       isipv6 = (tp->t_inpcb->inp_vflag & INP_IPV6) ? true : false;
+#else
+       isipv6 = false;
 #endif
-
+       if (((V_tcp_pmtud_blackhole_detect == 1) ||
+           (V_tcp_pmtud_blackhole_detect == 2 && !isipv6) ||
+           (V_tcp_pmtud_blackhole_detect == 3 && isipv6)) &&
+           ((tp->t_state == TCPS_ESTABLISHED) ||
+           (tp->t_state == TCPS_FIN_WAIT_1))) {
                /*
                 * Idea here is that at each stage of mtu probe (usually, 1448
                 * -> 1188 -> 524) should be given 2 chances to recover before
@@ -746,7 +751,6 @@ tcp_timer_rexmt(void * xtp)
                         * in an attempt to retransmit.
                         */
 #ifdef INET6
-                       isipv6 = (tp->t_inpcb->inp_vflag & INP_IPV6) ? 1 : 0;
                        if (isipv6 &&
                            tp->t_maxseg > V_tcp_v6pmtud_blackhole_mss) {
                                /* Use the sysctl tuneable blackhole MSS. */
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to