diff options
author | lucien <lucien.xin@gmail.com> | 2015-10-23 15:36:53 +0800 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-10-23 02:38:18 -0700 |
commit | ab997ad408394bcaf7f3015d4c4e38047eaf2ad6 (patch) | |
tree | 7a42dc942c501f16c4526ff88583e53f64be23e9 /net/ipv6/ip6_fib.c | |
parent | f23d538bc24a83c16127c2eb82c9cf1adc2b5149 (diff) | |
download | linux-stable-ab997ad408394bcaf7f3015d4c4e38047eaf2ad6.tar.gz linux-stable-ab997ad408394bcaf7f3015d4c4e38047eaf2ad6.tar.bz2 linux-stable-ab997ad408394bcaf7f3015d4c4e38047eaf2ad6.zip |
ipv6: fix the incorrect return value of throw route
The error condition -EAGAIN, which is signaled by throw routes, tells
the rules framework to walk on searching for next matches. If the walk
ends and we stop walking the rules with the result of a throw route we
have to translate the error conditions to -ENETUNREACH.
Signed-off-by: Xin Long <lucien.xin@gmail.com>
Signed-off-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv6/ip6_fib.c')
-rw-r--r-- | net/ipv6/ip6_fib.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/net/ipv6/ip6_fib.c b/net/ipv6/ip6_fib.c index 7d2e0023c72d..6cedc62b2abb 100644 --- a/net/ipv6/ip6_fib.c +++ b/net/ipv6/ip6_fib.c @@ -285,7 +285,17 @@ struct fib6_table *fib6_get_table(struct net *net, u32 id) struct dst_entry *fib6_rule_lookup(struct net *net, struct flowi6 *fl6, int flags, pol_lookup_t lookup) { - return (struct dst_entry *) lookup(net, net->ipv6.fib6_main_tbl, fl6, flags); + struct rt6_info *rt; + + rt = lookup(net, net->ipv6.fib6_main_tbl, fl6, flags); + if (rt->rt6i_flags & RTF_REJECT && + rt->dst.error == -EAGAIN) { + ip6_rt_put(rt); + rt = net->ipv6.ip6_null_entry; + dst_hold(&rt->dst); + } + + return &rt->dst; } static void __net_init fib6_tables_init(struct net *net) |