svn commit: r290125 - stable/10/sys/netinet

Hiren Panchasara hiren at FreeBSD.org
Thu Oct 29 00:36:12 UTC 2015


Author: hiren
Date: Thu Oct 29 00:36:10 2015
New Revision: 290125
URL: https://svnweb.freebsd.org/changeset/base/290125

Log:
  MFC r289293
  
  Fix an unnecessarily aggressive behavior where mtu clamping begins on first
  retransmission timeout (rto) when blackhole detection is enabled.  Make
  sure it only happens when the second attempt to send the same segment also fails
  with rto.
  
  Also make sure that each mtu probing stage (usually 1448 -> 1188 -> 524) follows
  the same pattern and gets 2 chances (rto) before further clamping down.
  
  Note: RFC4821 doesn't specify implementation details on how this situation
  should be handled.

Modified:
  stable/10/sys/netinet/tcp_timer.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/netinet/tcp_timer.c
==============================================================================
--- stable/10/sys/netinet/tcp_timer.c	Thu Oct 29 00:18:03 2015	(r290124)
+++ stable/10/sys/netinet/tcp_timer.c	Thu Oct 29 00:36:10 2015	(r290125)
@@ -617,9 +617,15 @@ tcp_timer_rexmt(void * xtp)
 		int isipv6;
 #endif
 
+		/*
+		 * Idea here is that at each stage of mtu probe (usually, 1448
+		 * -> 1188 -> 524) should be given 2 chances to recover before
+		 *  further clamping down. 'tp->t_rxtshift % 2 == 0' should
+		 *  take care of that.
+		 */
 		if (((tp->t_flags2 & (TF2_PLPMTU_PMTUD|TF2_PLPMTU_MAXSEGSNT)) ==
 		    (TF2_PLPMTU_PMTUD|TF2_PLPMTU_MAXSEGSNT)) &&
-		    (tp->t_rxtshift <= 2)) {
+		    (tp->t_rxtshift >= 2 && tp->t_rxtshift % 2 == 0)) {
 			/*
 			 * Enter Path MTU Black-hole Detection mechanism:
 			 * - Disable Path MTU Discovery (IP "DF" bit).
@@ -687,9 +693,11 @@ tcp_timer_rexmt(void * xtp)
 			 * with a lowered MTU, maybe this isn't a blackhole and
 			 * we restore the previous MSS and blackhole detection
 			 * flags.
+			 * The limit '6' is determined by giving each probe
+			 * stage (1448, 1188, 524) 2 chances to recover.
 			 */
 			if ((tp->t_flags2 & TF2_PLPMTU_BLACKHOLE) &&
-			    (tp->t_rxtshift > 4)) {
+			    (tp->t_rxtshift > 6)) {
 				tp->t_flags2 |= TF2_PLPMTU_PMTUD;
 				tp->t_flags2 &= ~TF2_PLPMTU_BLACKHOLE;
 				optlen = tp->t_maxopd - tp->t_maxseg;


More information about the svn-src-stable-10 mailing list