Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+12 −6
Original line number Diff line number Diff line
@@ -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 @@ static void ndisc_router_discovery(struct sk_buff *skb)
out:
	if (rt)
		dst_release(&rt->dst);
	else if (neigh)
	if (neigh)
		neigh_release(neigh);
}