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:
Родитель
0ec8866204
Коммит
eb857186eb
|
@ -1223,11 +1223,17 @@ static void ndisc_router_discovery(struct sk_buff *skb)
|
|||
|
||||
rt = rt6_get_dflt_router(&ipv6_hdr(skb)->saddr, skb->dev);
|
||||
|
||||
if (rt)
|
||||
neigh = dst_get_neighbour_noref(&rt->dst);
|
||||
|
||||
if (rt) {
|
||||
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) {
|
||||
neigh_clone(neigh);
|
||||
ip6_del_rt(rt);
|
||||
rt = NULL;
|
||||
}
|
||||
|
@ -1244,7 +1250,7 @@ static void ndisc_router_discovery(struct sk_buff *skb)
|
|||
return;
|
||||
}
|
||||
|
||||
neigh = dst_get_neighbour_noref(&rt->dst);
|
||||
neigh = dst_neigh_lookup(&rt->dst, &ipv6_hdr(skb)->saddr);
|
||||
if (neigh == NULL) {
|
||||
ND_PRINTK0(KERN_ERR
|
||||
"ICMPv6 RA: %s() got default router without neighbour.\n",
|
||||
|
@ -1411,7 +1417,7 @@ skip_routeinfo:
|
|||
out:
|
||||
if (rt)
|
||||
dst_release(&rt->dst);
|
||||
else if (neigh)
|
||||
if (neigh)
|
||||
neigh_release(neigh);
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче