erspan: auto detect truncated ipv6 packets.
Subsystems (3)
PATCH 1/1 erspan: auto detect truncated ipv6 packets.
Currently the truncated bit is set only when 1) the mirrored packet is larger than mtu and 2) the ipv4 packet tot_len is larger than the actual skb->len. This patch adds another case for detecting whether ipv6 packet is truncated or not, by checking the ipv6 header payload_len and the skb->len.
Reported-by Xiaoyan Jin <[email protected]>
Signed-off-by William Tu <[email protected]>
--- net/ipv4/ip_gre.c | 6 ++++++ net/ipv6/ip6_gre.c | 6 ++++++ 2 files changed, 12 insertions(+)
net/ipv4/ip_gre.c +6 -0
@@ -579,6 +579,7 @@ static void erspan_fb_xmit(struct sk_buff *skb, struct net_device *dev,int version;__be16 df;int nhoff; +int thoff; tun_info =skb_tunnel_info (skb); if (unlikely(!tun_info || !(tun_info->mode & IP_TUNNEL_INFO_TX) ||
@@ -611,6 +612,11 @@ 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 (version ==1 ) {erspan_build_header (skb,ntohl (tunnel_id_to_key32 (key->tun_id)),ntohl (md->u.index), truncate, true);
net/ipv6/ip6_gre.c +6 -0
@@ -897,6 +897,7 @@ static netdev_tx_t ip6erspan_tunnel_xmit(struct sk_buff *skb,int err = -EINVAL ;__u32 mtu;int nhoff; +int thoff;if (!ip6_tnl_xmit_ctl (t, &t->parms.laddr, &t->parms.raddr)) goto tx_err;
@@ -914,6 +915,11 @@ 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_cow_head (skb, dev->needed_headroom)) goto tx_err;
Signature · 1 line
2.7.4
From: William Tu <[email protected]>
Date: Fri, 11 May 2018 05:49:47 -0700
Quoted 8 lines
Currently the truncated bit is set only when 1) the mirrored packet is larger than mtu and 2) the ipv4 packet
tot_lenis larger than the actualskb->len. This patch adds another case for detecting whether ipv6 packet is truncated or not, by checking the ipv6 headerpayload_lenand theskb->len.Reported-by Xiaoyan Jin <[email protected]>Signed-off-by William Tu <[email protected]>
Applied, thanks William.