ipv6: sit: Convert to dst_neigh_lookup()
authorDavid S. Miller <davem@davemloft.net>
Thu, 26 Jan 2012 20:23:21 +0000 (15:23 -0500)
committerDavid S. Miller <davem@davemloft.net>
Thu, 26 Jan 2012 20:23:21 +0000 (15:23 -0500)
The only semantic difference is that we now hold a reference to the
neighbour and thus have to release it.

Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv6/sit.c

index 133768e52912bd561930736f36c0085c594000b4..c4ffd174352895630c878729cb7ce001ae9c9bf3 100644 (file)
@@ -680,9 +680,10 @@ static netdev_tx_t ipip6_tunnel_xmit(struct sk_buff *skb,
        /* ISATAP (RFC4214) - must come before 6to4 */
        if (dev->priv_flags & IFF_ISATAP) {
                struct neighbour *neigh = NULL;
+               bool do_tx_error = false;
 
                if (skb_dst(skb))
-                       neigh = dst_get_neighbour_noref(skb_dst(skb));
+                       neigh = dst_neigh_lookup(skb_dst(skb), &iph6->daddr);
 
                if (neigh == NULL) {
                        if (net_ratelimit())
@@ -697,6 +698,10 @@ static netdev_tx_t ipip6_tunnel_xmit(struct sk_buff *skb,
                     ipv6_addr_is_isatap(addr6))
                        dst = addr6->s6_addr32[3];
                else
+                       do_tx_error = true;
+
+               neigh_release(neigh);
+               if (do_tx_error)
                        goto tx_error;
        }
 
@@ -705,9 +710,10 @@ static netdev_tx_t ipip6_tunnel_xmit(struct sk_buff *skb,
 
        if (!dst) {
                struct neighbour *neigh = NULL;
+               bool do_tx_error = false;
 
                if (skb_dst(skb))
-                       neigh = dst_get_neighbour_noref(skb_dst(skb));
+                       neigh = dst_neigh_lookup(skb_dst(skb), &iph6->daddr);
 
                if (neigh == NULL) {
                        if (net_ratelimit())
@@ -723,10 +729,14 @@ static netdev_tx_t ipip6_tunnel_xmit(struct sk_buff *skb,
                        addr_type = ipv6_addr_type(addr6);
                }
 
-               if ((addr_type & IPV6_ADDR_COMPATv4) == 0)
-                       goto tx_error_icmp;
+               if ((addr_type & IPV6_ADDR_COMPATv4) != 0)
+                       dst = addr6->s6_addr32[3];
+               else
+                       do_tx_error = true;
 
-               dst = addr6->s6_addr32[3];
+               neigh_release(neigh);
+               if (do_tx_error)
+                       goto tx_error;
        }
 
        rt = ip_route_output_ports(dev_net(dev), &fl4, NULL,