Commit eb857186 authored by David S. Miller's avatar David S. Miller

ipv6: ndisc: Convert to dst_neigh_lookup()

Now all code paths grab a local reference to the neigh, so if neigh
is not NULL we unconditionally release it at the end.  The old logic
would only release if we didn't have a non-NULL 'rt'.
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 0ec88662
...@@ -1223,11 +1223,17 @@ static void ndisc_router_discovery(struct sk_buff *skb) ...@@ -1223,11 +1223,17 @@ static void ndisc_router_discovery(struct sk_buff *skb)
rt = rt6_get_dflt_router(&ipv6_hdr(skb)->saddr, skb->dev); rt = rt6_get_dflt_router(&ipv6_hdr(skb)->saddr, skb->dev);
if (rt) if (rt) {
neigh = dst_get_neighbour_noref(&rt->dst); neigh = dst_neigh_lookup(&rt->dst, &ipv6_hdr(skb)->saddr);
if (!neigh) {
ND_PRINTK0(KERN_ERR
"ICMPv6 RA: %s() got default router without neighbour.\n",
__func__);
dst_release(&rt->dst);
return;
}
}
if (rt && lifetime == 0) { if (rt && lifetime == 0) {
neigh_clone(neigh);
ip6_del_rt(rt); ip6_del_rt(rt);
rt = NULL; rt = NULL;
} }
...@@ -1244,7 +1250,7 @@ static void ndisc_router_discovery(struct sk_buff *skb) ...@@ -1244,7 +1250,7 @@ static void ndisc_router_discovery(struct sk_buff *skb)
return; return;
} }
neigh = dst_get_neighbour_noref(&rt->dst); neigh = dst_neigh_lookup(&rt->dst, &ipv6_hdr(skb)->saddr);
if (neigh == NULL) { if (neigh == NULL) {
ND_PRINTK0(KERN_ERR ND_PRINTK0(KERN_ERR
"ICMPv6 RA: %s() got default router without neighbour.\n", "ICMPv6 RA: %s() got default router without neighbour.\n",
...@@ -1411,7 +1417,7 @@ static void ndisc_router_discovery(struct sk_buff *skb) ...@@ -1411,7 +1417,7 @@ static void ndisc_router_discovery(struct sk_buff *skb)
out: out:
if (rt) if (rt)
dst_release(&rt->dst); dst_release(&rt->dst);
else if (neigh) if (neigh)
neigh_release(neigh); neigh_release(neigh);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment