virtio_net: Set correct gso->hdr_len
authorHerbert Xu <herbert@gondor.apana.org.au>
Thu, 4 Jun 2009 00:59:18 +0000 (00:59 +0000)
committerDavid S. Miller <davem@davemloft.net>
Mon, 8 Jun 2009 07:19:11 +0000 (00:19 -0700)
Through a bug in the tun driver, I noticed that virtio_net is
producing bogus hdr_len values.  In particular, it only includes
the IP header in the linear area, and excludes the entire TCP
header.  This causes the TCP header to be copied twice for each
packet.  (The bug omitted the second copy :)

This patch corrects this.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/virtio_net.c

index 0c9ca67f66e6db4e4ecb0480b5c9cbe5de8a332c..09bd4410fa651d665ea6163fb2ca51e83c21b41c 100644 (file)
@@ -470,7 +470,7 @@ static int xmit_skb(struct virtnet_info *vi, struct sk_buff *skb)
        }
 
        if (skb_is_gso(skb)) {
-               hdr->hdr_len = skb_transport_header(skb) - skb->data;
+               hdr->hdr_len = skb_headlen(skb);
                hdr->gso_size = skb_shinfo(skb)->gso_size;
                if (skb_shinfo(skb)->gso_type & SKB_GSO_TCPV4)
                        hdr->gso_type = VIRTIO_NET_HDR_GSO_TCPV4;