From fcfc42e51a36e94f83ed56cb31679d971d63ae83 Mon Sep 17 00:00:00 2001 From: Jason Wang Date: Mon, 25 Mar 2013 20:19:55 +0000 Subject: [PATCH] --- yaml --- r: 368693 b: refs/heads/master c: 9b4d669bc06c215d64f56f1eb0d4eb96e14d689d h: refs/heads/master i: 368691: 1103e0b46cd274e5b23c5c0dbd93384c5af24ff4 v: v3 --- [refs] | 2 +- trunk/drivers/net/macvtap.c | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 9d5ab9590fcb..65c86a14abb3 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: a88b9ce5ad4fc633b159b37d3ed8af60a4008fbc +refs/heads/master: 9b4d669bc06c215d64f56f1eb0d4eb96e14d689d diff --git a/trunk/drivers/net/macvtap.c b/trunk/drivers/net/macvtap.c index a449439bd653..acf6450ceff5 100644 --- a/trunk/drivers/net/macvtap.c +++ b/trunk/drivers/net/macvtap.c @@ -21,6 +21,7 @@ #include #include #include +#include /* * A macvtap queue is the central object of this driver, it connects @@ -645,6 +646,7 @@ static ssize_t macvtap_get_user(struct macvtap_queue *q, struct msghdr *m, int vnet_hdr_len = 0; int copylen = 0; bool zerocopy = false; + struct flow_keys keys; if (q->flags & IFF_VNET_HDR) { vnet_hdr_len = q->vnet_hdr_sz; @@ -725,6 +727,13 @@ static ssize_t macvtap_get_user(struct macvtap_queue *q, struct msghdr *m, goto err_kfree; } + if (skb->ip_summed == CHECKSUM_PARTIAL) + skb_set_transport_header(skb, skb_checksum_start_offset(skb)); + else if (skb_flow_dissect(skb, &keys)) + skb_set_transport_header(skb, keys.thoff); + else + skb_set_transport_header(skb, ETH_HLEN); + rcu_read_lock_bh(); vlan = rcu_dereference_bh(q->vlan); /* copy skb_ubuf_info for callback when skb has no error */