ipv6: ndisc: Convert to dst_neigh_lookup()
authorDavid S. Miller <davem@davemloft.net>
Fri, 27 Jan 2012 23:07:56 +0000 (15:07 -0800)
committerDavid S. Miller <davem@davemloft.net>
Sat, 28 Jan 2012 02:00:08 +0000 (21:00 -0500)
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>
net/ipv6/ndisc.c

index d8f02ef88e59b265322890025aa22e51815abb3a..c574ebce3fb5f3a83a06c08b088cf0c42b0c7a78 100644 (file)
@@ -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);
 }