[3.13.y.z extended stable] Patch "mactap: Fix checksum errors for non-gso packets in bridge mode" has been added to staging queue

Kamal Mostafa kamal at canonical.com
Thu Jun 12 19:14:38 UTC 2014


This is a note to let you know that I have just added a patch titled

    mactap: Fix checksum errors for non-gso packets in bridge mode

to the linux-3.13.y-queue branch of the 3.13.y.z extended stable tree 
which can be found at:

 http://kernel.ubuntu.com/git?p=ubuntu/linux.git;a=shortlog;h=refs/heads/linux-3.13.y-queue

This patch is scheduled to be released in version 3.13.11.4.

If you, or anyone else, feels it should not be added to this tree, please 
reply to this email.

For more information about the 3.13.y.z tree, see
https://wiki.ubuntu.com/Kernel/Dev/ExtendedStable

Thanks.
-Kamal

------

>From 89cbf6691b22fcb98045b0ab072764b2085a900f Mon Sep 17 00:00:00 2001
From: Vlad Yasevich <vyasevic at redhat.com>
Date: Tue, 29 Apr 2014 10:09:50 -0400
Subject: mactap: Fix checksum errors for non-gso packets in bridge mode

[ Upstream commit cbdb04279ccaefcc702c8757757eea8ed76e50cf ]

The following is a problematic configuration:

 VM1: virtio-net device connected to macvtap0 at eth0
 VM2: e1000 device connect to macvtap1 at eth0

The problem is is that virtio-net supports checksum offloading
and thus sends the packets to the host with CHECKSUM_PARTIAL set.
On the other hand, e1000 does not support any acceleration.

For small TCP packets (and this includes the 3-way handshake),
e1000 ends up receiving packets that only have a partial checksum
set.  This causes TCP to fail checksum validation and to drop
packets.  As a result tcp connections can not be established.

Commit 3e4f8b787370978733ca6cae452720a4f0c296b8
	macvtap: Perform GSO on forwarding path.
fixes this issue for large packets wthat will end up undergoing GSO.
This commit adds a check for the non-GSO case and attempts to
compute the checksum for partially checksummed packets in the
non-GSO case.

CC: Daniel Lezcano <daniel.lezcano at free.fr>
CC: Patrick McHardy <kaber at trash.net>
CC: Andrian Nord <nightnord at gmail.com>
CC: Eric Dumazet <eric.dumazet at gmail.com>
CC: Michael S. Tsirkin <mst at redhat.com>
CC: Jason Wang <jasowang at redhat.com>
Signed-off-by: Vlad Yasevich <vyasevic at redhat.com>
Acked-by: Jason Wang <jasowang at redhat.com>
Signed-off-by: David S. Miller <davem at davemloft.net>
Signed-off-by: Kamal Mostafa <kamal at canonical.com>
---
 drivers/net/macvtap.c | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/drivers/net/macvtap.c b/drivers/net/macvtap.c
index 2a89da0..73ffad8 100644
--- a/drivers/net/macvtap.c
+++ b/drivers/net/macvtap.c
@@ -315,6 +315,15 @@ static int macvtap_forward(struct net_device *dev, struct sk_buff *skb)
 			segs = nskb;
 		}
 	} else {
+		/* If we receive a partial checksum and the tap side
+		 * doesn't support checksum offload, compute the checksum.
+		 * Note: it doesn't matter which checksum feature to
+		 *        check, we either support them all or none.
+		 */
+		if (skb->ip_summed == CHECKSUM_PARTIAL &&
+		    !(features & NETIF_F_ALL_CSUM) &&
+		    skb_checksum_help(skb))
+			goto drop;
 		skb_queue_tail(&q->sk.sk_receive_queue, skb);
 	}

--
1.9.1





More information about the kernel-team mailing list