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

Pravin Shelar pshelar at nicira.com
Thu Jun 27 22:49:03 UTC 2013


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
>>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0002-datapath-Use-gre-compat-code-if-CONFIG_NET_IPGRE_DEM.patch
Type: application/octet-stream
Size: 3765 bytes
Desc: not available
URL: <http://mail.openvswitch.org/pipermail/ovs-dev/attachments/20130627/be14860e/attachment-0005.obj>


More information about the dev mailing list