|
@@ -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;
|
|
|
|