Re: [PATCH 1/2] ipv6: fix mss when it is bigger than IPV6_MAXPLEN - sizeof(struct tcphdr)
From: Eric Dumazet <hidden>
Date: 2012-02-28 09:56:27
Le mardi 28 février 2012 à 16:28 +0800, roy.qing.li@gmail.com a écrit :
quoted hunk ↗ jump to hunk
From: RongQing.Li <redacted> When mss is bigger than IPV6_MAXPLEN - sizeof(struct tcphdr), set mss to IPV6_MAXPLEN - sizeof(struct tcphdr), not IPV6_MAXPLEN. Signed-off-by: RongQing.Li <redacted> --- net/ipv6/route.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)diff --git a/net/ipv6/route.c b/net/ipv6/route.c index 92be12b..42cc16c 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c@@ -1054,7 +1054,7 @@ static unsigned int ip6_default_advmss(const struct dst_entry *dst) * rely only on pmtu discovery" */ if (mtu > IPV6_MAXPLEN - sizeof(struct tcphdr)) - mtu = IPV6_MAXPLEN; + mtu = IPV6_MAXPLEN - sizeof(struct tcphdr); return mtu; }
Hmm... What about the comment above the code mentioning pmtu discovery ?
/*
* Maximal non-jumbo IPv6 payload is IPV6_MAXPLEN and
* corresponding MSS is IPV6_MAXPLEN - tcp_header_size.
* IPV6_MAXPLEN is also valid and means: "any MSS,
* rely only on pmtu discovery"
*/
Check out code from net/ipv6/ip6_output.c, ip6_append_data() :
if (mtu <= sizeof(struct ipv6hdr) + IPV6_MAXPLEN) {
if (cork->length + length > sizeof(struct ipv6hdr) + IPV6_MAXPLEN - fragheaderlen) {
ipv6_local_error(sk, EMSGSIZE, fl6, mtu-exthdrlen);
return -EMSGSIZE;
}
}
and __ip6_local_out()
if (len > IPV6_MAXPLEN)
len = 0;