From mboxrd@z Thu Jan 1 00:00:00 1970 From: Martin Lau Subject: Re: [PATCH RFC 1/3] ipv6: Fix after pmtu events dissapearing host routes Date: Mon, 30 Mar 2015 11:24:33 -0700 Message-ID: <20150330182433.GC2303816@devbig242.prn2.facebook.com> References: <54CF3348.40207@huawei.com> <20150203092845.GT13046@secunet.com> <54D0A8DB.4010106@huawei.com> <20150203120140.GU13046@secunet.com> <54D17D1A.3020706@huawei.com> <20150205072125.GY13046@secunet.com> <54EFD87A.5080907@huawei.com> <20150330103210.GI3311@secunet.com> <20150330103313.GJ3311@secunet.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Cc: shengyong , , , , , Kernel Team To: Steffen Klassert Return-path: Received: from mx0b-00082601.pphosted.com ([67.231.153.30]:14123 "EHLO mx0a-00082601.pphosted.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1753471AbbC3SYv (ORCPT ); Mon, 30 Mar 2015 14:24:51 -0400 Content-Disposition: inline In-Reply-To: <20150330103313.GJ3311@secunet.com> Sender: netdev-owner@vger.kernel.org List-ID: On Mon, Mar 30, 2015 at 12:33:13PM +0200, Steffen Klassert wrote: > We currently don't clone host routes before we use them. > If a pmtu event is received on such a route, it gets > an expires value. As soon as the expiration time is > elapsed, the route is deleted. As a result, the host > es not reachable any more. s/es/is > We fix this by cloning host routes if they are not local, > i.e. if pmtu events can happen. Also adjust the route > deletion because the cached and the original host route > are on the same fib node. > > Signed-off-by: Steffen Klassert > --- > net/ipv6/route.c | 7 ++++++- > 1 file changed, 6 insertions(+), 1 deletion(-) > > diff --git a/net/ipv6/route.c b/net/ipv6/route.c > index 4688bd4..4318626 100644 > --- a/net/ipv6/route.c > +++ b/net/ipv6/route.c > @@ -961,7 +961,7 @@ redo_rt6_select: > > if (!(rt->rt6i_flags & (RTF_NONEXTHOP | RTF_GATEWAY))) > nrt = rt6_alloc_cow(rt, &fl6->daddr, &fl6->saddr); > - else if (!(rt->dst.flags & DST_HOST)) > + else if (!(rt->dst.flags & DST_HOST) || !(rt->rt6i_flags & RTF_LOCAL)) > nrt = rt6_alloc_clone(rt, &fl6->daddr); I suspect the nrt and rt will share the same inetpeer. Hence, after the nrt is removed, the MTU (obtained from PMTU update) will stay. > @@ -1796,6 +1796,8 @@ static int ip6_route_del(struct fib6_config *cfg) > continue; > if (cfg->fc_metric && cfg->fc_metric != rt->rt6i_metric) > continue; > + if (!(cfg->fc_flags & RTF_CACHE) && (rt->rt6i_flags & RTF_CACHE)) > + continue; > dst_hold(&rt->dst); > read_unlock_bh(&table->tb6_lock); > > @@ -2433,6 +2435,9 @@ static int rtm_to_fib6_config(struct sk_buff *skb, struct nlmsghdr *nlh, > if (rtm->rtm_type == RTN_LOCAL) > cfg->fc_flags |= RTF_LOCAL; > > + if (rtm->rtm_flags & RTM_F_CLONED) > + cfg->fc_flags |= RTF_CACHE; > + > cfg->fc_nlinfo.portid = NETLINK_CB(skb).portid; > cfg->fc_nlinfo.nlh = nlh; > cfg->fc_nlinfo.nl_net = sock_net(skb->sk); I had pulled your last patch to my local branch that I am cooking. I also added similar changes to ip6_route_del() and rtm_to_fib_config(), and confirmed it can keep 'ip -6 r del' and 'ip -6 r flush table cache' to keep working properly. Thanks, --Martin