datapath: Make GRE support conditional on CONFIG_NET_IPGRE_DEMUX.
authorJesse Gross <jesse@nicira.com>
Mon, 24 Jun 2013 22:02:18 +0000 (15:02 -0700)
committerJesse Gross <jesse@nicira.com>
Fri, 28 Jun 2013 00:23:36 +0000 (17:23 -0700)
Now that GRE support has been upstreamed into Linux, OVS is
using the components in the native kernel when available. However,
this means that it is now dependent on the appropriate kernel
config, which is CONFIG_NET_IPGRE_DEMUX on 2.6.37 and later.

Reported-by: Ben Pfaff <blp@nicira.com>
Signed-off-by: Jesse Gross <jesse@nicira.com>
Acked-by: Pravin B Shelar <pshelar@nicira.com>
INSTALL
datapath/linux/Modules.mk
datapath/linux/compat/gre.c
datapath/linux/compat/include/linux/kconfig.h [new file with mode: 0644]
datapath/vport-gre.c
datapath/vport.c

diff --git a/INSTALL b/INSTALL
index 9ec4763..4749e30 100644 (file)
--- a/INSTALL
+++ b/INSTALL
@@ -49,9 +49,9 @@ INSTALL.userspace for more information.
       NET_ACT_POLICE, either built-in or as modules.  (NET_CLS_POLICE is
       obsolete and not needed.)
 
-      If GRE tunneling is being used it is recommended that the kernel
-      be compiled with IPv6 support (CONFIG_IPV6).  This allows for
-      special handling (such as path MTU discovery) of IPv6 packets.
+      To use GRE tunneling on Linux 2.6.37 or newer, kernel support
+      for GRE must be compiled in or available as a module
+      (CONFIG_NET_IPGRE_DEMUX).
 
       To configure HTB or HFSC quality of service with Open vSwitch,
       you must enable the respective configuration options.
index a62d444..dcacc79 100644 (file)
@@ -37,6 +37,7 @@ openvswitch_headers += \
        linux/compat/include/linux/ip.h \
        linux/compat/include/linux/ipv6.h \
        linux/compat/include/linux/jiffies.h \
+       linux/compat/include/linux/kconfig.h \
        linux/compat/include/linux/kernel.h \
        linux/compat/include/linux/kobject.h \
        linux/compat/include/linux/list.h \
index fbb9fb9..582bd94 100644 (file)
@@ -16,6 +16,9 @@
  * 02110-1301, USA
  */
 
+#include <linux/kconfig.h>
+#if IS_ENABLED(CONFIG_NET_IPGRE_DEMUX)
+
 #include <linux/module.h>
 #include <linux/if.h>
 #include <linux/if_tunnel.h>
@@ -350,3 +353,5 @@ int gre_cisco_unregister(struct gre_cisco_protocol *proto)
        ret = gre_compat_exit();
        return ret;
 }
+
+#endif /* CONFIG_NET_IPGRE_DEMUX */
diff --git a/datapath/linux/compat/include/linux/kconfig.h b/datapath/linux/compat/include/linux/kconfig.h
new file mode 100644 (file)
index 0000000..5717a26
--- /dev/null
@@ -0,0 +1,57 @@
+#ifndef __LINUX_KCONFIG_WRAPPER_H
+#define __LINUX_KCONFIG_WRAPPER_H
+
+#include <linux/version.h>
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,37)
+#define CONFIG_NET_IPGRE_DEMUX 1
+#endif
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,1,0)
+#include_next <linux/kconfig.h>
+#endif
+
+#ifndef IS_ENABLED
+
+/*
+ * Helper macros to use CONFIG_ options in C/CPP expressions. Note that
+ * these only work with boolean and tristate options.
+ */
+
+/*
+ * Getting something that works in C and CPP for an arg that may or may
+ * not be defined is tricky.  Here, if we have "#define CONFIG_BOOGER 1"
+ * we match on the placeholder define, insert the "0," for arg1 and generate
+ * the triplet (0, 1, 0).  Then the last step cherry picks the 2nd arg (a one).
+ * When CONFIG_BOOGER is not defined, we generate a (... 1, 0) pair, and when
+ * the last step cherry picks the 2nd arg, we get a zero.
+ */
+#define __ARG_PLACEHOLDER_1 0,
+#define config_enabled(cfg) _config_enabled(cfg)
+#define _config_enabled(value) __config_enabled(__ARG_PLACEHOLDER_##value)
+#define __config_enabled(arg1_or_junk) ___config_enabled(arg1_or_junk 1, 0)
+#define ___config_enabled(__ignored, val, ...) val
+
+/*
+ * IS_ENABLED(CONFIG_FOO) evaluates to 1 if CONFIG_FOO is set to 'y' or 'm',
+ * 0 otherwise.
+ *
+ */
+#define IS_ENABLED(option) \
+       (config_enabled(option) || config_enabled(option##_MODULE))
+
+/*
+ * IS_BUILTIN(CONFIG_FOO) evaluates to 1 if CONFIG_FOO is set to 'y', 0
+ * otherwise. For boolean options, this is equivalent to
+ * IS_ENABLED(CONFIG_FOO).
+ */
+#define IS_BUILTIN(option) config_enabled(option)
+
+/*
+ * IS_MODULE(CONFIG_FOO) evaluates to 1 if CONFIG_FOO is set to 'm', 0
+ * otherwise.
+ */
+#define IS_MODULE(option) config_enabled(option##_MODULE)
+
+#endif /* IS_ENABLED */
+#endif /* __LINUX_KCONFIG_WRAPER_H */
index 4f7be00..c74f5fc 100644 (file)
@@ -16,6 +16,8 @@
  * 02110-1301, USA
  */
 
+#include <linux/kconfig.h>
+#if IS_ENABLED(CONFIG_NET_IPGRE_DEMUX)
 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 
 #include <linux/if.h>
@@ -353,3 +355,4 @@ const struct vport_ops ovs_gre64_vport_ops = {
        .get_name       = gre_get_name,
        .send           = gre64_send,
 };
+#endif
index dcb7616..03b775d 100644 (file)
@@ -20,6 +20,7 @@
 #include <linux/if.h>
 #include <linux/if_vlan.h>
 #include <linux/jhash.h>
+#include <linux/kconfig.h>
 #include <linux/kernel.h>
 #include <linux/list.h>
 #include <linux/mutex.h>
 static const struct vport_ops *vport_ops_list[] = {
        &ovs_netdev_vport_ops,
        &ovs_internal_vport_ops,
+#if IS_ENABLED(CONFIG_NET_IPGRE_DEMUX)
        &ovs_gre_vport_ops,
        &ovs_gre64_vport_ops,
+#endif
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26)
        &ovs_vxlan_vport_ops,
        &ovs_lisp_vport_ops,