svn commit: r211333 - head/sys/netinet

Andre Oppermann andre at FreeBSD.org
Sun Aug 15 13:25:19 UTC 2010


Author: andre
Date: Sun Aug 15 13:25:18 2010
New Revision: 211333
URL: http://svn.freebsd.org/changeset/base/211333

Log:
  Fix the interaction between 'ICMP fragmentation needed' MTU updates,
  path MTU discovery and the tcp_minmss limiter for very small MTU's.
  
  When the MTU suggested by the gateway via ICMP, or if there isn't
  any the next smaller step from ip_next_mtu(), is lower than the
  floor enforced by net.inet.tcp.minmss (default 216) the value is
  ignored and the default MSS (512) is used instead.  However the
  DF flag in the IP header is still set in tcp_output() preventing
  fragmentation by the gateway.
  
  Fix this by using tcp_minmss as the MSS and clear the DF flag if
  the suggested MTU is too low.  This turns off path MTU dissovery
  for the remainder of the session and allows fragmentation to be
  done by the gateway.
  
  Only MTU's smaller than 256 are affected.  The smallest official
  MTU specified is for AX.25 packet radio at 256 octets.
  
  PR:		kern/146628
  Tested by:	Matthew Luckie <mjl-at-luckie org nz>
  MFC after:	1 week

Modified:
  head/sys/netinet/tcp_output.c
  head/sys/netinet/tcp_subr.c

Modified: head/sys/netinet/tcp_output.c
==============================================================================
--- head/sys/netinet/tcp_output.c	Sun Aug 15 13:07:08 2010	(r211332)
+++ head/sys/netinet/tcp_output.c	Sun Aug 15 13:25:18 2010	(r211333)
@@ -1186,8 +1186,10 @@ timer:
 	 * This might not be the best thing to do according to RFC3390
 	 * Section 2. However the tcp hostcache migitates the problem
 	 * so it affects only the first tcp connection with a host.
+	 *
+	 * NB: Don't set DF on small MTU/MSS to have a safe fallback.
 	 */
-	if (V_path_mtu_discovery)
+	if (V_path_mtu_discovery && tp->t_maxopd > V_tcp_minmss)
 		ip->ip_off |= IP_DF;
 
 	error = ip_output(m, tp->t_inpcb->inp_options, NULL,

Modified: head/sys/netinet/tcp_subr.c
==============================================================================
--- head/sys/netinet/tcp_subr.c	Sun Aug 15 13:07:08 2010	(r211332)
+++ head/sys/netinet/tcp_subr.c	Sun Aug 15 13:25:18 2010	(r211333)
@@ -1339,11 +1339,9 @@ tcp_ctlinput(int cmd, struct sockaddr *s
 					    if (!mtu)
 						mtu = ip_next_mtu(ip->ip_len,
 						 1);
-					    if (mtu < max(296, V_tcp_minmss
-						 + sizeof(struct tcpiphdr)))
-						mtu = 0;
-					    if (!mtu)
-						mtu = V_tcp_mssdflt
+					    if (mtu < V_tcp_minmss
+						 + sizeof(struct tcpiphdr))
+						mtu = V_tcp_minmss
 						 + sizeof(struct tcpiphdr);
 					    /*
 					     * Only cache the the MTU if it


More information about the svn-src-all mailing list