diff mbox

[ovs-dev,06/13] compat: Detect and use nf_ipv6_ops->fragment.

Message ID 1452563641-33507-7-git-send-email-joe@ovn.org
State Accepted
Headers show

Commit Message

Joe Stringer Jan. 12, 2016, 1:53 a.m. UTC
Signed-off-by: Joe Stringer <joe@ovn.org>
---
 acinclude.m4                                         |  2 ++
 datapath/compat.h                                    |  5 +++++
 datapath/linux/compat/include/linux/netfilter_ipv6.h |  6 +++---
 datapath/linux/compat/include/net/ip6_route.h        | 13 +++++++------
 datapath/linux/compat/ip6_output.c                   |  2 +-
 5 files changed, 18 insertions(+), 10 deletions(-)

Comments

Pravin Shelar Jan. 29, 2016, 11:09 p.m. UTC | #1
On Mon, Jan 11, 2016 at 5:53 PM, Joe Stringer <joe@ovn.org> wrote:
> Signed-off-by: Joe Stringer <joe@ovn.org>
> ---
>  acinclude.m4                                         |  2 ++
>  datapath/compat.h                                    |  5 +++++
>  datapath/linux/compat/include/linux/netfilter_ipv6.h |  6 +++---
>  datapath/linux/compat/include/net/ip6_route.h        | 13 +++++++------
>  datapath/linux/compat/ip6_output.c                   |  2 +-
>  5 files changed, 18 insertions(+), 10 deletions(-)
>
> diff --git a/acinclude.m4 b/acinclude.m4
> index 3e3426dcf2b4..bb1d94e2187d 100644
> --- a/acinclude.m4
> +++ b/acinclude.m4
> @@ -389,6 +389,8 @@ AC_DEFUN([OVS_CHECK_LINUX_COMPAT], [
>    OVS_GREP_IFELSE([$KSRC/include/linux/netfilter.h], [nf_register_net_hook])
>    OVS_GREP_IFELSE([$KSRC/include/linux/netfilter.h], [nf_hookfn.*nf_hook_ops],
>                    [OVS_DEFINE([HAVE_NF_HOOKFN_ARG_OPS])])
> +  OVS_GREP_IFELSE([$KSRC/include/linux/netfilter_ipv6.h], [fragment],
> +                  [OVS_DEFINE([HAVE_NF_IPV6_OPS_FRAGMENT])])
>

Why not use OVS_FIND_FIELD_IFELSE macro  here?

>    OVS_GREP_IFELSE([$KSRC/include/net/netfilter/nf_conntrack.h],
>                    [tmpl_alloc.*conntrack_zone],
> diff --git a/datapath/compat.h b/datapath/compat.h
> index 3cbd121f29cd..0e19051fb094 100644
> --- a/datapath/compat.h
> +++ b/datapath/compat.h
> @@ -55,8 +55,13 @@ static inline bool skb_encapsulation(struct sk_buff *skb)
>  #endif
>
>  #ifdef OVS_FRAGMENT_BACKPORT
> +#ifdef HAVE_NF_IPV6_OPS_FRAGMENT
> +static inline int __init ip6_output_init(void) { return 0; }
> +static inline void ip6_output_exit(void) { }
> +#else
>  int __init ip6_output_init(void);
>  void ip6_output_exit(void);
> +#endif
>
>  static inline int __init compat_init(void)
>  {
> diff --git a/datapath/linux/compat/include/linux/netfilter_ipv6.h b/datapath/linux/compat/include/linux/netfilter_ipv6.h
> index 3026e1fe6b7f..3939e1423fcf 100644
> --- a/datapath/linux/compat/include/linux/netfilter_ipv6.h
> +++ b/datapath/linux/compat/include/linux/netfilter_ipv6.h
> @@ -7,7 +7,7 @@
>  #include <net/ip.h>            /* For OVS_VPORT_OUTPUT_PARAMS */
>  #include <net/ip6_route.h>
>
> -#if LINUX_VERSION_CODE < KERNEL_VERSION(4,3,0)
> +#ifndef HAVE_NF_IPV6_OPS_FRAGMENT
>  /* Try to minimise changes required to the actions.c code for calling IPv6
>   * fragmentation. We can keep the fragment() API mostly the same, except that
>   * the callback parameter needs to be in the form that older kernels accept.
> @@ -27,7 +27,7 @@ static inline struct ovs_nf_ipv6_ops *ovs_nf_get_ipv6_ops(void)
>  {
>         return &ovs_ipv6_ops;
>  }
> -#else /* !OVS_FRAGMENT_BACKPORT || !CONFIG_NETFILTER || || !CONFIG_IPV6 */
> +#else /* !OVS_FRAGMENT_BACKPORT */
>  static inline const struct ovs_nf_ipv6_ops *ovs_nf_get_ipv6_ops(void)
>  {
>         return NULL;
> @@ -35,5 +35,5 @@ static inline const struct ovs_nf_ipv6_ops *ovs_nf_get_ipv6_ops(void)
>  #endif
>  #define nf_get_ipv6_ops ovs_nf_get_ipv6_ops
>
> -#endif /* < 4.3 */
> +#endif /* HAVE_NF_IPV6_OPS_FRAGMENT */
>  #endif /* __NETFILTER_IPV6_WRAPPER_H */
> diff --git a/datapath/linux/compat/include/net/ip6_route.h b/datapath/linux/compat/include/net/ip6_route.h
> index 93d70e3a7592..d28b195575cb 100644
> --- a/datapath/linux/compat/include/net/ip6_route.h
> +++ b/datapath/linux/compat/include/net/ip6_route.h
> @@ -29,18 +29,19 @@ struct dst_entry *rpl_ip6_route_output(struct net *net, const struct sock *sk,
>
>  #endif /* 2.6.39 */
>
> -#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
> +#ifndef HAVE_NF_IPV6_OPS_FRAGMENT
> +#ifdef OVS_FRAGMENT_BACKPORT
> +int rpl_ip6_fragment(struct sock *sk, struct sk_buff *skb,
> +                    int (*output)(OVS_VPORT_OUTPUT_PARAMS));
> +#else
>  static inline int rpl_ip6_fragment(struct sock *sk, struct sk_buff *skb,
>                                    int (*output)(struct sk_buff *))
>  {
>         kfree_skb(skb);
>         return -ENOTSUPP;
>  }
> -#define ip6_fragment rpl_ip6_fragment
> -#elif defined(OVS_FRAGMENT_BACKPORT)
> -int rpl_ip6_fragment(struct sock *sk, struct sk_buff *skb,
> -                    int (*output)(OVS_VPORT_OUTPUT_PARAMS));
> -#define ip6_fragment rpl_ip6_fragment
>  #endif /* OVS_FRAGMENT_BACKPORT */
> +#define ip6_fragment rpl_ip6_fragment
> +#endif /* HAVE_NF_IPV6_OPS_FRAGMENT */
>
>  #endif /* _NET_IP6_ROUTE_WRAPPER */
> diff --git a/datapath/linux/compat/ip6_output.c b/datapath/linux/compat/ip6_output.c
> index 5c0cdec4b382..c3ef46c4a935 100644
> --- a/datapath/linux/compat/ip6_output.c
> +++ b/datapath/linux/compat/ip6_output.c
> @@ -31,7 +31,7 @@
>
>  #include <linux/version.h>
>
> -#ifdef OVS_FRAGMENT_BACKPORT
> +#if !defined(HAVE_NF_IPV6_OPS_FRAGMENT) && defined(OVS_FRAGMENT_BACKPORT)
>
>  #include <linux/errno.h>
>  #include <linux/kernel.h>
> --
> 2.1.4
>
> _______________________________________________
> dev mailing list
> dev@openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev
Joe Stringer Feb. 2, 2016, 10:27 p.m. UTC | #2
On 29 January 2016 at 15:09, pravin shelar <pshelar@ovn.org> wrote:
> On Mon, Jan 11, 2016 at 5:53 PM, Joe Stringer <joe@ovn.org> wrote:
>> Signed-off-by: Joe Stringer <joe@ovn.org>
>> ---
>>  acinclude.m4                                         |  2 ++
>>  datapath/compat.h                                    |  5 +++++
>>  datapath/linux/compat/include/linux/netfilter_ipv6.h |  6 +++---
>>  datapath/linux/compat/include/net/ip6_route.h        | 13 +++++++------
>>  datapath/linux/compat/ip6_output.c                   |  2 +-
>>  5 files changed, 18 insertions(+), 10 deletions(-)
>>
>> diff --git a/acinclude.m4 b/acinclude.m4
>> index 3e3426dcf2b4..bb1d94e2187d 100644
>> --- a/acinclude.m4
>> +++ b/acinclude.m4
>> @@ -389,6 +389,8 @@ AC_DEFUN([OVS_CHECK_LINUX_COMPAT], [
>>    OVS_GREP_IFELSE([$KSRC/include/linux/netfilter.h], [nf_register_net_hook])
>>    OVS_GREP_IFELSE([$KSRC/include/linux/netfilter.h], [nf_hookfn.*nf_hook_ops],
>>                    [OVS_DEFINE([HAVE_NF_HOOKFN_ARG_OPS])])
>> +  OVS_GREP_IFELSE([$KSRC/include/linux/netfilter_ipv6.h], [fragment],
>> +                  [OVS_DEFINE([HAVE_NF_IPV6_OPS_FRAGMENT])])
>>
>
> Why not use OVS_FIND_FIELD_IFELSE macro  here?

Thanks for the suggestion, I rolled this fix in.
diff mbox

Patch

diff --git a/acinclude.m4 b/acinclude.m4
index 3e3426dcf2b4..bb1d94e2187d 100644
--- a/acinclude.m4
+++ b/acinclude.m4
@@ -389,6 +389,8 @@  AC_DEFUN([OVS_CHECK_LINUX_COMPAT], [
   OVS_GREP_IFELSE([$KSRC/include/linux/netfilter.h], [nf_register_net_hook])
   OVS_GREP_IFELSE([$KSRC/include/linux/netfilter.h], [nf_hookfn.*nf_hook_ops],
                   [OVS_DEFINE([HAVE_NF_HOOKFN_ARG_OPS])])
+  OVS_GREP_IFELSE([$KSRC/include/linux/netfilter_ipv6.h], [fragment],
+                  [OVS_DEFINE([HAVE_NF_IPV6_OPS_FRAGMENT])])
 
   OVS_GREP_IFELSE([$KSRC/include/net/netfilter/nf_conntrack.h],
                   [tmpl_alloc.*conntrack_zone],
diff --git a/datapath/compat.h b/datapath/compat.h
index 3cbd121f29cd..0e19051fb094 100644
--- a/datapath/compat.h
+++ b/datapath/compat.h
@@ -55,8 +55,13 @@  static inline bool skb_encapsulation(struct sk_buff *skb)
 #endif
 
 #ifdef OVS_FRAGMENT_BACKPORT
+#ifdef HAVE_NF_IPV6_OPS_FRAGMENT
+static inline int __init ip6_output_init(void) { return 0; }
+static inline void ip6_output_exit(void) { }
+#else
 int __init ip6_output_init(void);
 void ip6_output_exit(void);
+#endif
 
 static inline int __init compat_init(void)
 {
diff --git a/datapath/linux/compat/include/linux/netfilter_ipv6.h b/datapath/linux/compat/include/linux/netfilter_ipv6.h
index 3026e1fe6b7f..3939e1423fcf 100644
--- a/datapath/linux/compat/include/linux/netfilter_ipv6.h
+++ b/datapath/linux/compat/include/linux/netfilter_ipv6.h
@@ -7,7 +7,7 @@ 
 #include <net/ip.h>		/* For OVS_VPORT_OUTPUT_PARAMS */
 #include <net/ip6_route.h>
 
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4,3,0)
+#ifndef HAVE_NF_IPV6_OPS_FRAGMENT
 /* Try to minimise changes required to the actions.c code for calling IPv6
  * fragmentation. We can keep the fragment() API mostly the same, except that
  * the callback parameter needs to be in the form that older kernels accept.
@@ -27,7 +27,7 @@  static inline struct ovs_nf_ipv6_ops *ovs_nf_get_ipv6_ops(void)
 {
 	return &ovs_ipv6_ops;
 }
-#else /* !OVS_FRAGMENT_BACKPORT || !CONFIG_NETFILTER || || !CONFIG_IPV6 */
+#else /* !OVS_FRAGMENT_BACKPORT */
 static inline const struct ovs_nf_ipv6_ops *ovs_nf_get_ipv6_ops(void)
 {
 	return NULL;
@@ -35,5 +35,5 @@  static inline const struct ovs_nf_ipv6_ops *ovs_nf_get_ipv6_ops(void)
 #endif
 #define nf_get_ipv6_ops ovs_nf_get_ipv6_ops
 
-#endif /* < 4.3 */
+#endif /* HAVE_NF_IPV6_OPS_FRAGMENT */
 #endif /* __NETFILTER_IPV6_WRAPPER_H */
diff --git a/datapath/linux/compat/include/net/ip6_route.h b/datapath/linux/compat/include/net/ip6_route.h
index 93d70e3a7592..d28b195575cb 100644
--- a/datapath/linux/compat/include/net/ip6_route.h
+++ b/datapath/linux/compat/include/net/ip6_route.h
@@ -29,18 +29,19 @@  struct dst_entry *rpl_ip6_route_output(struct net *net, const struct sock *sk,
 
 #endif /* 2.6.39 */
 
-#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
+#ifndef HAVE_NF_IPV6_OPS_FRAGMENT
+#ifdef OVS_FRAGMENT_BACKPORT
+int rpl_ip6_fragment(struct sock *sk, struct sk_buff *skb,
+		     int (*output)(OVS_VPORT_OUTPUT_PARAMS));
+#else
 static inline int rpl_ip6_fragment(struct sock *sk, struct sk_buff *skb,
 				   int (*output)(struct sk_buff *))
 {
 	kfree_skb(skb);
 	return -ENOTSUPP;
 }
-#define ip6_fragment rpl_ip6_fragment
-#elif defined(OVS_FRAGMENT_BACKPORT)
-int rpl_ip6_fragment(struct sock *sk, struct sk_buff *skb,
-		     int (*output)(OVS_VPORT_OUTPUT_PARAMS));
-#define ip6_fragment rpl_ip6_fragment
 #endif /* OVS_FRAGMENT_BACKPORT */
+#define ip6_fragment rpl_ip6_fragment
+#endif /* HAVE_NF_IPV6_OPS_FRAGMENT */
 
 #endif /* _NET_IP6_ROUTE_WRAPPER */
diff --git a/datapath/linux/compat/ip6_output.c b/datapath/linux/compat/ip6_output.c
index 5c0cdec4b382..c3ef46c4a935 100644
--- a/datapath/linux/compat/ip6_output.c
+++ b/datapath/linux/compat/ip6_output.c
@@ -31,7 +31,7 @@ 
 
 #include <linux/version.h>
 
-#ifdef OVS_FRAGMENT_BACKPORT
+#if !defined(HAVE_NF_IPV6_OPS_FRAGMENT) && defined(OVS_FRAGMENT_BACKPORT)
 
 #include <linux/errno.h>
 #include <linux/kernel.h>