ipv4: ip_gre: Convert to dst_neigh_lookup()
authorDavid S. Miller <davem@davemloft.net>
Fri, 27 Jan 2012 23:01:08 +0000 (15:01 -0800)
committerDavid S. Miller <davem@davemloft.net>
Sat, 28 Jan 2012 02:00:07 +0000 (21:00 -0500)
The conversion is very similar to that made to ipv6's SIT code.

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

index 05f7419..bf95416 100644 (file)
@@ -730,10 +730,12 @@ static netdev_tx_t ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev
                }
 #if IS_ENABLED(CONFIG_IPV6)
                else if (skb->protocol == htons(ETH_P_IPV6)) {
-                       struct neighbour *neigh = dst_get_neighbour_noref(skb_dst(skb));
                        const struct in6_addr *addr6;
+                       struct neighbour *neigh;
+                       bool do_tx_error_icmp;
                        int addr_type;
 
+                       neigh = dst_neigh_lookup(skb_dst(skb), &ipv6_hdr(skb)->daddr);
                        if (neigh == NULL)
                                goto tx_error;
 
@@ -746,9 +748,14 @@ static netdev_tx_t ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev
                        }
 
                        if ((addr_type & IPV6_ADDR_COMPATv4) == 0)
+                               do_tx_error_icmp = true;
+                       else {
+                               do_tx_error_icmp = false;
+                               dst = addr6->s6_addr32[3];
+                       }
+                       neigh_release(neigh);
+                       if (do_tx_error_icmp)
                                goto tx_error_icmp;
-
-                       dst = addr6->s6_addr32[3];
                }
 #endif
                else