[ovs-dev] [PATCH 1/2] datapath: Make GRE support conditional on CONFIG_NET_IPGRE_DEMUX.

Jesse Gross jesse at nicira.com
Thu Jun 27 17:02:27 UTC 2013


Pravin, can you take a look at this patch while we figure out the
Debian issues on the other one?

On Tue, Jun 25, 2013 at 12:31 PM, Jesse Gross <jesse at nicira.com> wrote:
> 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 at nicira.com>
> Signed-off-by: Jesse Gross <jesse at nicira.com>
> ---
>  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 28bc1a0..45d75ef 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 a62d444..dcacc79 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 fbb9fb9..582bd94 100644
> --- a/datapath/linux/compat/gre.c
> +++ b/datapath/linux/compat/gre.c
> @@ -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
> index 0000000..5717a26
> --- /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 <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 */
> diff --git a/datapath/vport-gre.c b/datapath/vport-gre.c
> index 4f7be00..c74f5fc 100644
> --- a/datapath/vport-gre.c
> +++ b/datapath/vport-gre.c
> @@ -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
> diff --git a/datapath/vport.c b/datapath/vport.c
> index dcb7616..03b775d 100644
> --- a/datapath/vport.c
> +++ b/datapath/vport.c
> @@ -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>
> @@ -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,
> --
> 1.8.1.2
>
X-CudaMail-Whitelist-To: dev at openvswitch.org



More information about the dev mailing list