diff options
-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 05f7419ed7c5..bf9541648b96 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 | |||
730 | } | 730 | } |
731 | #if IS_ENABLED(CONFIG_IPV6) | 731 | #if IS_ENABLED(CONFIG_IPV6) |
732 | else if (skb->protocol == htons(ETH_P_IPV6)) { | 732 | else if (skb->protocol == htons(ETH_P_IPV6)) { |
733 | struct neighbour *neigh = dst_get_neighbour_noref(skb_dst(skb)); | ||
734 | const struct in6_addr *addr6; | 733 | const struct in6_addr *addr6; |
734 | struct neighbour *neigh; | ||
735 | bool do_tx_error_icmp; | ||
735 | int addr_type; | 736 | int addr_type; |
736 | 737 | ||
738 | neigh = dst_neigh_lookup(skb_dst(skb), &ipv6_hdr(skb)->daddr); | ||
737 | if (neigh == NULL) | 739 | if (neigh == NULL) |
738 | goto tx_error; | 740 | goto tx_error; |
739 | 741 | ||
@@ -746,9 +748,14 @@ static netdev_tx_t ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev | |||
746 | } | 748 | } |
747 | 749 | ||
748 | if ((addr_type & IPV6_ADDR_COMPATv4) == 0) | 750 | if ((addr_type & IPV6_ADDR_COMPATv4) == 0) |
751 | do_tx_error_icmp = true; | ||
752 | else { | ||
753 | do_tx_error_icmp = false; | ||
754 | dst = addr6->s6_addr32[3]; | ||
755 | } | ||
756 | neigh_release(neigh); | ||
757 | if (do_tx_error_icmp) | ||
749 | goto tx_error_icmp; | 758 | goto tx_error_icmp; |
750 | |||
751 | dst = addr6->s6_addr32[3]; | ||
752 | } | 759 | } |
753 | #endif | 760 | #endif |
754 | else | 761 | else |