[ovs-dev] [PATCHv2] gre: Fix GRE loading bug by separating ERSPAN from tunnel

Yifeng Sun pkusunyifeng at gmail.com
Thu Jun 28 13:40:21 UTC 2018

On kernel versions (for example, 3.10) where upstream provides GRE
functionality but no ERSPAN, GRE can fail to initialize. Because
there is no ERSPAN feature in kernel, openvswitch kernel module will
try to register its own IPPROTO_GRE, instead of using the upstream
GRE functionality. But GRE could already be added by kernel's gre
module. As a result, there will be GRE-related failures.

This patch separates the detection of tunnel and ERSPAN so that the
result of ERSPAN detection in kernel doesn't affect tunnel functionality.

This fix passed the travis for different kernel versions:

Signed-off-by: Yifeng Sun <pkusunyifeng at gmail.com>
v1 -> v2: remove linux version checking and add HAVE_METADATA_IP_TUNNEL
          checking according to Greg's review.

 acinclude.m4                                     | 7 +++++--
 datapath/linux/compat/include/net/dst_metadata.h | 6 ++++++
 datapath/linux/compat/include/net/erspan.h       | 2 +-
 3 files changed, 12 insertions(+), 3 deletions(-)

diff --git a/acinclude.m4 b/acinclude.m4
index 991a6275b978..e58de8f81210 100644
--- a/acinclude.m4
+++ b/acinclude.m4
@@ -531,9 +531,12 @@ AC_DEFUN([OVS_CHECK_LINUX_COMPAT], [
                         [OVS_GREP_IFELSE([$KSRC/include/net/dst_cache.h], [dst_cache],
-                        [OVS_GREP_IFELSE([$KSRC/include/net/erspan.h], [erspan_md2],
-                                         [OVS_DEFINE([USE_UPSTREAM_TUNNEL])])])])])
+                                         [OVS_DEFINE([USE_UPSTREAM_TUNNEL])])])])
+  OVS_GREP_IFELSE([$KSRC/include/net/erspan.h], [erspan_md2],
+                  [OVS_DEFINE([USE_UPSTREAM_ERSPAN])])
+  OVS_GREP_IFELSE([$KSRC/include/net/dst_metadata.h], [enum metadata_type],
+                  [OVS_DEFINE([HAVE_METADATA_IP_TUNNEL])])
   OVS_GREP_IFELSE([$KSRC/include/net/dst_cache.h], [dst_cache],
   OVS_GREP_IFELSE([$KSRC/include/net/mpls.h], [mpls_hdr],
diff --git a/datapath/linux/compat/include/net/dst_metadata.h b/datapath/linux/compat/include/net/dst_metadata.h
index e53a29ed2222..54f3ffb0aa11 100644
--- a/datapath/linux/compat/include/net/dst_metadata.h
+++ b/datapath/linux/compat/include/net/dst_metadata.h
@@ -1,10 +1,12 @@
 enum metadata_type {
 #include_next <net/dst_metadata.h>
@@ -119,7 +121,11 @@ void ovs_ip_tunnel_rcv(struct net_device *dev, struct sk_buff *skb,
 static inline struct metadata_dst *
 rpl_metadata_dst_alloc(u8 optslen, enum metadata_type type, gfp_t flags)
+	return metadata_dst_alloc(optslen, type, flags);
 	return metadata_dst_alloc(optslen, flags);
 #define metadata_dst_alloc rpl_metadata_dst_alloc
diff --git a/datapath/linux/compat/include/net/erspan.h b/datapath/linux/compat/include/net/erspan.h
index 9fdae97b5fc4..f3035b678e87 100644
--- a/datapath/linux/compat/include/net/erspan.h
+++ b/datapath/linux/compat/include/net/erspan.h
@@ -1,4 +1,4 @@
 #ifndef __LINUX_ERSPAN_H
 #define __LINUX_ERSPAN_H

More information about the dev mailing list