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: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -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)
|
|||||||
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 @@ skip_routeinfo:
|
|||||||
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user