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

Jesse Gross jesse at nicira.com
Thu Jun 27 23:14:50 UTC 2013


I thought about that but I don't think that it's really the right
thing to do as we converge the out of tree and in-tree modules. I
think it's pretty clear that if you are running with the latest
upstream kernel then we shouldn't be using any backports, which in
turn means that GRE support is controlled by that config options. On
the other hand, it's also pretty clear that we want to support GRE on
kernels < 2.6.37 using backports so it's just a matter of what to do
in the middle. It could go either way, so I would lean towards having
behavior more consistent with the future.

On Thu, Jun 27, 2013 at 3:49 PM, Pravin Shelar <pshelar at nicira.com> wrote:
> I think we can use gre compat code if gre-demux not available.
> Attached is incremental, what do you think?
>
>
>
> On Thu, Jun 27, 2013 at 10:02 AM, Jesse Gross <jesse at nicira.com> wrote:
>> 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