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