datapath: Copy Xen's checksumming fields when doing skb_copy.
authorJesse Gross <jesse@nicira.com>
Wed, 18 Nov 2009 01:28:00 +0000 (17:28 -0800)
committerJesse Gross <jesse@nicira.com>
Wed, 18 Nov 2009 21:40:36 +0000 (13:40 -0800)
Two fields that control checksumming were added to sk_buff in
Xen: proto_data_valid and proto_csum_blank.  These fields are copied
when doing a skb_clone but not in other functions such as skb_copy,
which can lead to checksum errors in TCP and UDP when offloading is
enabled in the guest.  To fix this we manually copy these fields,
though ideally this should be fixed upstream in Xen.

Bug #2299

datapath/actions.c

index a037e4320f218adcfbd9f5df29094ed5b6d7d1d0..226a4f91a0522e285f3ecef46b34c8a4c4d6180a 100644 (file)
@@ -28,6 +28,13 @@ make_writable(struct sk_buff *skb, gfp_t gfp)
        if (skb_shared(skb) || skb_cloned(skb)) {
                struct sk_buff *nskb = skb_copy(skb, gfp);
                if (nskb) {
+#if defined(CONFIG_XEN) && LINUX_VERSION_CODE == KERNEL_VERSION(2,6,18)
+                       /* These fields are copied in skb_clone but not in
+                        * skb_copy or related functions.  We need to manually
+                        * copy them over here. */
+                       nskb->proto_data_valid = skb->proto_data_valid;
+                       nskb->proto_csum_blank = skb->proto_csum_blank;
+#endif
                        kfree_skb(skb);
                        return nskb;
                }