datapath: Check for proto_data_valid member instead of kernel version.
authorBen Pfaff <blp@nicira.com>
Wed, 18 Nov 2009 23:19:50 +0000 (15:19 -0800)
committerBen Pfaff <blp@nicira.com>
Wed, 18 Nov 2009 23:19:50 +0000 (15:19 -0800)
Commit 5ef800a69 "datapath: Copy Xen's checksumming fields when doing
skb_copy" should copy proto_data_valid between sk_buffs when that field
is present.  However the check for CONFIG_XEN plus kernel version 2.6.18
isn't sufficient, because SLES 11 kernels are version 2.6.27 but do have
this field.

This commit adds a configure-time check for the presence of the member
instead of attempting to guess based on the kernel version.

Thanks to Ian Campbell for reporting this problem.

CC: <Ian.Campbell@citrix.com>
acinclude.m4
datapath/actions.c

index 611566900f178d8ffc7f153f479438977c894b6f..e938e6f303da2bd88a366a7794b61af042c4a192 100644 (file)
@@ -144,6 +144,13 @@ AC_DEFUN([OVS_CHECK_LINUX26_COMPAT], [
                   [OVS_DEFINE([HAVE_CSUM_UNFOLD])])
   OVS_GREP_IFELSE([$KSRC26/include/linux/skbuff.h], [skb_cow],
                   [OVS_DEFINE([HAVE_SKB_COW])])
+  # Check for the proto_data_valid member in struct sk_buff.  The [^@]
+  # is necessary because some versions of this header remove the
+  # member but retain the kerneldoc comment that describes it (which
+  # starts with @).  The brackets must be doubled because of m4
+  # quoting rules.
+  OVS_GREP_IFELSE([$KSRC26/include/linux/skbuff.h], [[[^@]]proto_data_valid],
+                  [OVS_DEFINE([HAVE_PROTO_DATA_VALID])])
   OVS_CHECK_LOG2_H
   OVS_CHECK_VETH
   if cmp -s datapath/linux-2.6/kcompat.h.new \
index 4f23c83d5841cc38ee2d844052b0490c2d81f3af..cadab05f177234b9fa61ec31b5e5262207203561 100644 (file)
@@ -37,7 +37,7 @@ make_writable(struct sk_buff *skb, unsigned min_headroom, gfp_t gfp)
                        nskb->ip_summed = skb->ip_summed;
                        nskb->csum = skb->csum;
 #endif
-#if defined(CONFIG_XEN) && LINUX_VERSION_CODE == KERNEL_VERSION(2,6,18)
+#if defined(CONFIG_XEN) && defined(HAVE_PROTO_DATA_VALID)
                        /* These fields are copied in skb_clone but not in
                         * skb_copy or related functions.  We need to manually
                         * copy them over here. */