diff options
| author | akpm <akpm@linux-foundation.org> | 2022-06-27 10:31:34 -0700 |
|---|---|---|
| committer | akpm <akpm@linux-foundation.org> | 2022-06-27 10:31:34 -0700 |
| commit | 46a3b1125308f8f90a065eeecfafd2a96b01a36c (patch) | |
| tree | 6e080118fbad5aa217d160cedf02f10108ce3bf2 /net/ipv4/ip_gre.c | |
| parent | 6edda04ccc7cfb281d139e352dbd5dd933bd2751 (diff) | |
| parent | 03c765b0e3b4cb5063276b086c76f7a612856a9a (diff) | |
Merge branch 'master' into mm-stable
Diffstat (limited to 'net/ipv4/ip_gre.c')
| -rw-r--r-- | net/ipv4/ip_gre.c | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c index 3b9cd487075a..5c58e21f724e 100644 --- a/net/ipv4/ip_gre.c +++ b/net/ipv4/ip_gre.c @@ -524,7 +524,6 @@ static void erspan_fb_xmit(struct sk_buff *skb, struct net_device *dev) int tunnel_hlen; int version; int nhoff; - int thoff; tun_info = skb_tunnel_info(skb); if (unlikely(!tun_info || !(tun_info->mode & IP_TUNNEL_INFO_TX) || @@ -558,10 +557,16 @@ static void erspan_fb_xmit(struct sk_buff *skb, struct net_device *dev) (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 (version == 1) { erspan_build_header(skb, ntohl(tunnel_id_to_key32(key->tun_id)), |