Re: 2.6.18-rc3-mm2 - IPV6_MULTIPLE_TABLES borked....

Patrick McHardy
2006-08-10T20:02:40Z

[-- Attachment #1: Type: text/plain, Size: 891 bytes --]

Valdis.Kletnieks@vt.edu wrote:
> On Sun, 06 Aug 2006 03:08:09 PDT, Andrew Morton said:
>
>>ftp://ftp.kernel.org/pub/linux/kernel/people/akpm/patches/2.6/2.6.18-rc3/2.6.18-rc3-mm2/
>
>
> Building a kernel with IPV6_MULTIPLE_TABLES=y breaks my IPv6 connectivity
> quite badly. It basically totally refuses to answer an IPv6 Neighbor Solicit
> packet or IPv6 Echo Request packet. I run a 'tcpdump -n ipv6', and I see the
> requests come in, and no packets leaving. Interestingly enough, if I try to
> ping6 *out* of the box, it's totally willing to send a Neighbor Solicit outbound
> (although it appears to totally ignore the Neighbor Advert packet that comes
> back). Of course, things don't work very well at all with busticated Neighbor
> Solicit.
>
> A kernel built with IPV6_MULTIPLE_TABLES=n works just fine.

It should be fixed by this patch (already contained in net-2.6.19).

[-- Attachment #2: x --]
[-- Type: text/plain, Size: 1060 bytes --]

[IPV6]: Fix policy routing lookup

When the lookup in a table returns ip6_null_entry the policy routing lookup
returns it instead of continuing in the next table, which effectively means
it only searches the local table.

Signed-off-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: David S. Miller <davem@davemloft.net>

---
commit 2b885e76c2b2c74d2dfe86a8140f0b41149f327c
tree 767711f03ea3e990ce02b3720718b77490027793
parent 5bd721a145d02a89a9b69adf3ede9d0b3647ae8b
author Patrick McHardy <kaber@trash.net> Sun, 06 Aug 2006 22:24:08 -0700
committer David S. Miller <davem@davemloft.net> Sun, 06 Aug 2006 22:24:08 -0700

net/ipv6/fib6_rules.c | 4 +++-
1 files changed, 3 insertions(+), 1 deletions(-)

diff --git a/net/ipv6/fib6_rules.c b/net/ipv6/fib6_rules.c
index c3c8195..94a46ec 100644
--- a/net/ipv6/fib6_rules.c
+++ b/net/ipv6/fib6_rules.c
@@ -94,8 +94,10 @@ int fib6_rule_action(struct fib_rule *ru

if (rt != &ip6_null_entry)
goto out;
-
dst_release(&rt->u.dst);
+ rt = NULL;
+ goto out;
+
discard_pkt:
dst_hold(&rt->u.dst);