diff options
author | David S. Miller <davem@davemloft.net> | 2012-01-27 23:01:08 (GMT) |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-01-28 02:00:07 (GMT) |
commit | 0ec88662041e172acf33d7a15a2020841ee82afb (patch) | |
tree | 2d8d0103e050a9ad08932b369ad52eb3e7f1ab25 /net/ipv4/ip_gre.c | |
parent | f5e261e626eb3fe07adf484aaad2ecfc757feba3 (diff) | |
download | linux-0ec88662041e172acf33d7a15a2020841ee82afb.tar.xz |
ipv4: ip_gre: Convert to dst_neigh_lookup()
The conversion is very similar to that made to ipv6's SIT code.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4/ip_gre.c')
-rw-r--r-- | net/ipv4/ip_gre.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c index 05f7419..bf95416 100644 --- a/net/ipv4/ip_gre.c +++ b/net/ipv4/ip_gre.c @@ -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 |