Message ID | 1292116811-22216-1-git-send-email-avagin@openvz.org |
---|---|
State | Accepted, archived |
Delegated to: | David Miller |
Headers | show |
From: Andrey Vagin <avagin@openvz.org> Date: Sun, 12 Dec 2010 04:20:11 +0300 > The first big packets sent to a "low-MTU" client correctly > triggers the creation of a temporary route containing the reduced MTU. > > But after the temporary route has expired, new ICMP6 "packet too big" > will be sent, rt6_pmtu_discovery will find the previous EXPIRED route > check that its mtu isn't bigger then in icmp packet and do nothing > before the temporary route will not deleted by gc. > > I make the simple experiment: > while :; do > time ( dd if=/dev/zero bs=10K count=1 | ssh hostname dd of=/dev/null ) || break; > done > > The "time" reports real 0m0.197s if a temporary route isn't expired, but > it reports real 0m52.837s (!!!!) immediately after a temporare route has > expired. > > Signed-off-by: Andrey Vagin <avagin@openvz.org> Applied and queued up for -stable, thanks. -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index 96455ffb..7659d6f 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c @@ -1565,11 +1565,16 @@ static void rt6_do_pmtu_disc(struct in6_addr *daddr, struct in6_addr *saddr, { struct rt6_info *rt, *nrt; int allfrag = 0; - +again: rt = rt6_lookup(net, daddr, saddr, ifindex, 0); if (rt == NULL) return; + if (rt6_check_expired(rt)) { + ip6_del_rt(rt); + goto again; + } + if (pmtu >= dst_mtu(&rt->dst)) goto out;
The first big packets sent to a "low-MTU" client correctly triggers the creation of a temporary route containing the reduced MTU. But after the temporary route has expired, new ICMP6 "packet too big" will be sent, rt6_pmtu_discovery will find the previous EXPIRED route check that its mtu isn't bigger then in icmp packet and do nothing before the temporary route will not deleted by gc. I make the simple experiment: while :; do time ( dd if=/dev/zero bs=10K count=1 | ssh hostname dd of=/dev/null ) || break; done The "time" reports real 0m0.197s if a temporary route isn't expired, but it reports real 0m52.837s (!!!!) immediately after a temporare route has expired. Cc: stable@kernel.org Signed-off-by: Andrey Vagin <avagin@openvz.org> --- net/ipv6/route.c | 7 ++++++- 1 files changed, 6 insertions(+), 1 deletions(-)