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 <xiaoyanj@vmware.com>
Signed-off-by: William Tu <u9012063@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
        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) ||
            (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);
 
        int err = -EINVAL;
        __u32 mtu;
        int nhoff;
+       int thoff;
 
        if (!ip6_tnl_xmit_ctl(t, &t->parms.laddr, &t->parms.raddr))
                goto tx_err;
            (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;