Re: [PATCH net] ipv6: don't stop backtracking in fib6_lookup_1 if subtree does not match
From: Teco Boot <hidden>
Date: 2013-08-07 19:58:37
Seems to work!! babe has one entry less than cafe, this is correct. Tomorrow I'll test with real traffic. Teco root@ubuntu:~# ./ipv6-sadr.sh this is my system: Linux ubuntu 3.8.0-28-generic #41 SMP Wed Aug 7 11:36:10 PDT 2013 i686 i686 i686 GNU/Linux CONFIG_IPV6_SUBTREES=y ... clean up for our experiment ... add a link-local ... add default ... add some source address specific defaults ====> now I have this routing table default from 2001:db8:10::/48 via fe80::10 dev eth0 metric 1024 default from 2001:db8:11::/48 via fe80::11 dev eth0 metric 1024 default from 2001:db8:12::/48 via fe80::12 dev eth0 metric 1024 fe80::1 dev eth0 proto kernel metric 256 default via fe80::ff dev eth0 metric 1024 ====> show route to same destination 2001:db8:babe::1 from 2001:db8:10::1 via fe80::10 dev eth0 src ::1 metric 0 \ cache 2001:db8:babe::1 from 2001:db8:11::1 via fe80::11 dev eth0 src ::1 metric 0 \ cache 2001:db8:babe::1 from 2001:db8:12::1 via fe80::12 dev eth0 src ::1 metric 0 \ cache 2001:db8:babe::1 from 2001:db8:1::1 via fe80::ff dev eth0 src ::1 metric 0 \ cache 2001:db8:babe::1 from :: via fe80::ff dev eth0 src ::1 metric 0 \ cache ====> show route to different destinations 2001:db8:cafe::10 from 2001:db8:10::1 via fe80::10 dev eth0 src ::1 metric 0 \ cache 2001:db8:cafe::11 from 2001:db8:11::1 via fe80::11 dev eth0 src ::1 metric 0 \ cache 2001:db8:cafe::12 from 2001:db8:12::1 via fe80::12 dev eth0 src ::1 metric 0 \ cache 2001:db8:cafe::21 from 2001:db8:1::1 via fe80::ff dev eth0 src ::1 metric 0 \ cache 2001:db8:cafe::22 from :: via fe80::ff dev eth0 src ::1 metric 0 \ cache ====> now the route cache is 2001:db8:babe::1 from 2001:db8:10::/48 via fe80::10 dev eth0 metric 0 \ cache 2001:db8:babe::1 from 2001:db8:11::/48 via fe80::11 dev eth0 metric 0 \ cache 2001:db8:babe::1 from 2001:db8:12::/48 via fe80::12 dev eth0 metric 0 \ cache 2001:db8:babe::1 via fe80::ff dev eth0 metric 0 \ cache 2001:db8:cafe::10 from 2001:db8:10::/48 via fe80::10 dev eth0 metric 0 \ cache 2001:db8:cafe::11 from 2001:db8:11::/48 via fe80::11 dev eth0 metric 0 \ cache 2001:db8:cafe::12 from 2001:db8:12::/48 via fe80::12 dev eth0 metric 0 \ cache 2001:db8:cafe::21 via fe80::ff dev eth0 metric 0 \ cache 2001:db8:cafe::22 via fe80::ff dev eth0 metric 0 \ cache root@ubuntu:~# Op 7 aug. 2013, om 02:34 heeft Hannes Frederic Sowa [off-list ref] het volgende geschreven:
quoted hunk ↗ jump to hunk
In case a subtree did not match we currently stop backtracking and return NULL (root table from fib_lookup). This could yield in invalid routing table lookups when using subtrees. Instead continue to backtrack until a valid subtree or node is found and return this match. Also remove unneeded NULL check. Reported-by: Teco Boot <redacted> Cc: YOSHIFUJI Hideaki <redacted> Cc: David Lamparter <redacted> Cc: <redacted> Signed-off-by: Hannes Frederic Sowa <redacted> --- net/ipv6/ip6_fib.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-)diff --git a/net/ipv6/ip6_fib.c b/net/ipv6/ip6_fib.c index ed828d6..73db48e 100644 --- a/net/ipv6/ip6_fib.c +++ b/net/ipv6/ip6_fib.c@@ -993,14 +993,22 @@ static struct fib6_node * fib6_lookup_1(struct fib6_node *root,if (ipv6_prefix_equal(&key->addr, args->addr, key->plen)) { #ifdef CONFIG_IPV6_SUBTREES - if (fn->subtree) - fn = fib6_lookup_1(fn->subtree, args + 1); + if (fn->subtree) { + struct fib6_node *sfn; + sfn = fib6_lookup_1(fn->subtree, + args + 1); + if (!sfn) + goto backtrack; + fn = sfn; + } #endif - if (!fn || fn->fn_flags & RTN_RTINFO) + if (fn->fn_flags & RTN_RTINFO) return fn; } } - +#ifdef CONFIG_IPV6_SUBTREES +backtrack: +#endif if (fn->fn_flags & RTN_ROOT) break; -- 1.8.3.1