diff options
Diffstat (limited to 'net/ipv6')
| -rw-r--r-- | net/ipv6/ip6_gre.c | 15 | 
1 files changed, 10 insertions, 5 deletions
| diff --git a/net/ipv6/ip6_gre.c b/net/ipv6/ip6_gre.c index 4e37f7c29900..a9051df0625d 100644 --- a/net/ipv6/ip6_gre.c +++ b/net/ipv6/ip6_gre.c @@ -939,7 +939,6 @@ static netdev_tx_t ip6erspan_tunnel_xmit(struct sk_buff *skb,  	__be16 proto;  	__u32 mtu;  	int nhoff; -	int thoff;  	if (!pskb_inet_may_pull(skb))  		goto tx_err; @@ -960,10 +959,16 @@ static netdev_tx_t ip6erspan_tunnel_xmit(struct sk_buff *skb,  	    (ntohs(ip_hdr(skb)->tot_len) > skb->len - nhoff))  		truncate = true; -	thoff = skb_transport_header(skb) - skb_mac_header(skb); -	if (skb->protocol == htons(ETH_P_IPV6) && -	    (ntohs(ipv6_hdr(skb)->payload_len) > skb->len - thoff)) -		truncate = true; +	if (skb->protocol == htons(ETH_P_IPV6)) { +		int thoff; + +		if (skb_transport_header_was_set(skb)) +			thoff = skb_transport_header(skb) - skb_mac_header(skb); +		else +			thoff = nhoff + sizeof(struct ipv6hdr); +		if (ntohs(ipv6_hdr(skb)->payload_len) > skb->len - thoff) +			truncate = true; +	}  	if (skb_cow_head(skb, dev->needed_headroom ?: t->hlen))  		goto tx_err; |