From 2be0b371712ddf1fc2aaac81672b2196b6df891f Mon Sep 17 00:00:00 2001 From: Jesse Gross Date: Mon, 24 Jun 2013 15:02:18 -0700 Subject: [PATCH] datapath: Make GRE support conditional on CONFIG_NET_IPGRE_DEMUX. 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 Signed-off-by: Jesse Gross Acked-by: Pravin B Shelar --- INSTALL | 6 +- datapath/linux/Modules.mk | 1 + datapath/linux/compat/gre.c | 5 ++ datapath/linux/compat/include/linux/kconfig.h | 57 +++++++++++++++++++ datapath/vport-gre.c | 3 + datapath/vport.c | 3 + 6 files changed, 72 insertions(+), 3 deletions(-) create mode 100644 datapath/linux/compat/include/linux/kconfig.h diff --git a/INSTALL b/INSTALL index 9ec47635a..4749e30d4 100644 --- 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. diff --git a/datapath/linux/Modules.mk b/datapath/linux/Modules.mk index a62d44454..dcacc791f 100644 --- a/datapath/linux/Modules.mk +++ b/datapath/linux/Modules.mk @@ -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 \ diff --git a/datapath/linux/compat/gre.c b/datapath/linux/compat/gre.c index fbb9fb983..582bd94c2 100644 --- a/datapath/linux/compat/gre.c +++ b/datapath/linux/compat/gre.c @@ -16,6 +16,9 @@ * 02110-1301, USA */ +#include +#if IS_ENABLED(CONFIG_NET_IPGRE_DEMUX) + #include #include #include @@ -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 index 000000000..5717a2687 --- /dev/null +++ b/datapath/linux/compat/include/linux/kconfig.h @@ -0,0 +1,57 @@ +#ifndef __LINUX_KCONFIG_WRAPPER_H +#define __LINUX_KCONFIG_WRAPPER_H + +#include + +#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 +#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 */ diff --git a/datapath/vport-gre.c b/datapath/vport-gre.c index 4f7be0068..c74f5fccd 100644 --- a/datapath/vport-gre.c +++ b/datapath/vport-gre.c @@ -16,6 +16,8 @@ * 02110-1301, USA */ +#include +#if IS_ENABLED(CONFIG_NET_IPGRE_DEMUX) #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt #include @@ -353,3 +355,4 @@ const struct vport_ops ovs_gre64_vport_ops = { .get_name = gre_get_name, .send = gre64_send, }; +#endif diff --git a/datapath/vport.c b/datapath/vport.c index dcb761653..03b775d8c 100644 --- a/datapath/vport.c +++ b/datapath/vport.c @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -39,8 +40,10 @@ 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, -- 2.43.0