2017-07-20 23:06 GMT+08:00 Hangbin Liu <liuhang...@gmail.com>: >> +++ b/net/ipv6/route.c >> @@ -3637,12 +3637,6 @@ static int inet6_rtm_getroute(struct sk_buff *in_skb, >> struct nlmsghdr *nlh, >> dst = ip6_route_lookup(net, &fl6, 0); >> >> rt = container_of(dst, struct rt6_info, dst); >> - if (rt->dst.error) { >> - err = rt->dst.error; >> - ip6_rt_put(rt); >> - goto errout; >> - } > > hmm... or instead of remove this check, should we check all the entry? Like > if ((rt->dst.error && rt != net->ipv6.ip6_null_entry && rt != ^^ mistake here > net->ipv6.ip6_blk_hole_entry) || > rt == net->ipv6.ip6_null_entry )
Sorry, there should be no need to check ip6_null_entry since the error is already -ENETUNREACH. So how about diff --git a/net/ipv6/route.c b/net/ipv6/route.c index 4d30c96..c290aa4 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c @@ -3637,13 +3637,8 @@ static int inet6_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh, dst = ip6_route_lookup(net, &fl6, 0); rt = container_of(dst, struct rt6_info, dst); - if (rt->dst.error) { - err = rt->dst.error; - ip6_rt_put(rt); - goto errout; - } - - if (rt == net->ipv6.ip6_null_entry) { + if (rt->dst.error && rt != net->ipv6.ip6_prohibit_entry && + rt != net->ipv6.ip6_blk_hole_entry) { err = rt->dst.error; ip6_rt_put(rt); goto errout; Thanks Hangbin