diff mbox

[ovs-dev,3/4] compat: Fix build error in kernels 4.10+

Message ID 1493323737-9621-4-git-send-email-gvrose8192@gmail.com
State Superseded
Headers show

Commit Message

Gregory Rose April 27, 2017, 8:08 p.m. UTC
This is an alternative solution patch for the issue reported by
Raymond Burkholder and the patch submitted by Guoshuai Li.  It uses
the acinclude.m4 configuration file to check for the net parameter
that was added  to the ipv4 and ipv6 frags init functions in the 4.10
Linux kernel to check whether DEFRAG_ENABLE_TAKES_NET should be
set and then checks for that at compile time.

Reported-by: Raymond Burkholder <ray@oneunified.net>
CC: Guoshuai Li <ligs@dtdream.com>
Signed-off-by: Greg Rose <gvrose8192@gmail.com>
---
 datapath/linux/compat/ip_fragment.c        | 14 ++++++++++++++
 datapath/linux/compat/nf_conntrack_reasm.c | 14 ++++++++++++++
 2 files changed, 28 insertions(+)

Comments

Jarno Rajahalme April 27, 2017, 8:53 p.m. UTC | #1
> On Apr 27, 2017, at 1:08 PM, Greg Rose <gvrose8192@gmail.com> wrote:
> 
> This is an alternative solution patch for the issue reported by
> Raymond Burkholder and the patch submitted by Guoshuai Li.  It uses
> the acinclude.m4 configuration file to check for the net parameter
> that was added  to the ipv4 and ipv6 frags init functions in the 4.10
> Linux kernel to check whether DEFRAG_ENABLE_TAKES_NET should be
> set and then checks for that at compile time.
> 
> Reported-by: Raymond Burkholder <ray@oneunified.net>
> CC: Guoshuai Li <ligs@dtdream.com>
> Signed-off-by: Greg Rose <gvrose8192@gmail.com>
> ---
> datapath/linux/compat/ip_fragment.c        | 14 ++++++++++++++
> datapath/linux/compat/nf_conntrack_reasm.c | 14 ++++++++++++++
> 2 files changed, 28 insertions(+)
> 
> diff --git a/datapath/linux/compat/ip_fragment.c b/datapath/linux/compat/ip_fragment.c
> index b0f5d0e..fccd992 100644
> --- a/datapath/linux/compat/ip_fragment.c
> +++ b/datapath/linux/compat/ip_fragment.c
> @@ -729,18 +729,32 @@ int rpl_ip_defrag(struct net *net, struct sk_buff *skb, u32 user)
> 	return -ENOMEM;
> }
> 
> +#ifdef HAVE_DEFRAG_ENABLE_TAKES_NET
> +static int __net_init ipv4_frags_init_net(struct net *net)
> +{
> +	nf_defrag_ipv4_enable(net);
> +
> +	return 0;
> +}
> +#endif
> +

Did you consider Joe’s proposal to pass the error return to the caller? If it makes sense, then maybe we could use nf_ functions directly and not define the _init_net() functions at all (as the stubs prototype is the same as the _enable function prototype, except for the “__net_init” attribute)?

> static void __net_exit ipv4_frags_exit_net(struct net *net)
> {
> 	inet_frags_exit_net(&net->ipv4.frags, &ip4_frags);
> }
> 
> static struct pernet_operations ip4_frags_ops = {
> +#ifdef HAVE_DEFRAG_ENABLE_TAKES_NET
> +	.init = ipv4_frags_init_net,
> +#endif
> 	.exit = ipv4_frags_exit_net,
> };
> 
> int __init rpl_ipfrag_init(void)
> {
> +#ifndef HAVE_DEFRAG_ENABLE_TAKES_NET
> 	nf_defrag_ipv4_enable();
> +#endif
> 	register_pernet_subsys(&ip4_frags_ops);
> 	ip4_frags.hashfn = ip4_hashfn;
> 	ip4_frags.constructor = ip4_frag_init;
> diff --git a/datapath/linux/compat/nf_conntrack_reasm.c b/datapath/linux/compat/nf_conntrack_reasm.c
> index 0bc4d9e..701faf5 100644
> --- a/datapath/linux/compat/nf_conntrack_reasm.c
> +++ b/datapath/linux/compat/nf_conntrack_reasm.c
> @@ -558,12 +558,24 @@ out_unlock:
> 	return ret;
> }
> 
> +#ifdef HAVE_DEFRAG_ENABLE_TAKES_NET
> +static int nf_ct_net_init(struct net *net)
> +{
> +	nf_defrag_ipv6_enable(net);
> +
> +	return 0;
> +}
> +#endif
> +
> static void nf_ct_net_exit(struct net *net)
> {
> 	inet_frags_exit_net(&net->nf_frag.frags, &nf_frags);
> }
> 
> static struct pernet_operations nf_ct_net_ops = {
> +#ifdef HAVE_DEFRAG_ENABLE_TAKES_NET
> +	.init = nf_ct_net_init,
> +#endif
> 	.exit = nf_ct_net_exit,
> };
> 
> @@ -571,7 +583,9 @@ int rpl_nf_ct_frag6_init(void)
> {
> 	int ret = 0;
> 
> +#ifndef HAVE_DEFRAG_ENABLE_TAKES_NET
> 	nf_defrag_ipv6_enable();
> +#endif
> 	nf_frags.hashfn = nf_hashfn;
> 	nf_frags.constructor = ip6_frag_init;
> 	nf_frags.destructor = NULL;
> -- 
> 1.8.3.1
> 
> _______________________________________________
> dev mailing list
> dev@openvswitch.org
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
Gregory Rose April 27, 2017, 9:04 p.m. UTC | #2
On Thu, 2017-04-27 at 13:53 -0700, Jarno Rajahalme wrote:
> > On Apr 27, 2017, at 1:08 PM, Greg Rose <gvrose8192@gmail.com> wrote:
> > 
> > This is an alternative solution patch for the issue reported by
> > Raymond Burkholder and the patch submitted by Guoshuai Li.  It uses
> > the acinclude.m4 configuration file to check for the net parameter
> > that was added  to the ipv4 and ipv6 frags init functions in the 4.10
> > Linux kernel to check whether DEFRAG_ENABLE_TAKES_NET should be
> > set and then checks for that at compile time.
> > 
> > Reported-by: Raymond Burkholder <ray@oneunified.net>
> > CC: Guoshuai Li <ligs@dtdream.com>
> > Signed-off-by: Greg Rose <gvrose8192@gmail.com>
> > ---
> > datapath/linux/compat/ip_fragment.c        | 14 ++++++++++++++
> > datapath/linux/compat/nf_conntrack_reasm.c | 14 ++++++++++++++
> > 2 files changed, 28 insertions(+)
> > 
> > diff --git a/datapath/linux/compat/ip_fragment.c b/datapath/linux/compat/ip_fragment.c
> > index b0f5d0e..fccd992 100644
> > --- a/datapath/linux/compat/ip_fragment.c
> > +++ b/datapath/linux/compat/ip_fragment.c
> > @@ -729,18 +729,32 @@ int rpl_ip_defrag(struct net *net, struct sk_buff *skb, u32 user)
> > 	return -ENOMEM;
> > }
> > 
> > +#ifdef HAVE_DEFRAG_ENABLE_TAKES_NET
> > +static int __net_init ipv4_frags_init_net(struct net *net)
> > +{
> > +	nf_defrag_ipv4_enable(net);
> > +
> > +	return 0;
> > +}
> > +#endif
> > +
> 
> Did you consider Joe’s proposal to pass the error return to the caller? If it makes sense, then maybe we could use nf_ functions directly and not define the _init_net() functions at all (as the stubs prototype is the same as the _enable function prototype, except for the “__net_init” attribute)?

I must have missed that.  Let me go back to the list and see if I can
find it.

Thanks for the review!

- Greg

> 
> > static void __net_exit ipv4_frags_exit_net(struct net *net)
> > {
> > 	inet_frags_exit_net(&net->ipv4.frags, &ip4_frags);
> > }
> > 
> > static struct pernet_operations ip4_frags_ops = {
> > +#ifdef HAVE_DEFRAG_ENABLE_TAKES_NET
> > +	.init = ipv4_frags_init_net,
> > +#endif
> > 	.exit = ipv4_frags_exit_net,
> > };
> > 
> > int __init rpl_ipfrag_init(void)
> > {
> > +#ifndef HAVE_DEFRAG_ENABLE_TAKES_NET
> > 	nf_defrag_ipv4_enable();
> > +#endif
> > 	register_pernet_subsys(&ip4_frags_ops);
> > 	ip4_frags.hashfn = ip4_hashfn;
> > 	ip4_frags.constructor = ip4_frag_init;
> > diff --git a/datapath/linux/compat/nf_conntrack_reasm.c b/datapath/linux/compat/nf_conntrack_reasm.c
> > index 0bc4d9e..701faf5 100644
> > --- a/datapath/linux/compat/nf_conntrack_reasm.c
> > +++ b/datapath/linux/compat/nf_conntrack_reasm.c
> > @@ -558,12 +558,24 @@ out_unlock:
> > 	return ret;
> > }
> > 
> > +#ifdef HAVE_DEFRAG_ENABLE_TAKES_NET
> > +static int nf_ct_net_init(struct net *net)
> > +{
> > +	nf_defrag_ipv6_enable(net);
> > +
> > +	return 0;
> > +}
> > +#endif
> > +
> > static void nf_ct_net_exit(struct net *net)
> > {
> > 	inet_frags_exit_net(&net->nf_frag.frags, &nf_frags);
> > }
> > 
> > static struct pernet_operations nf_ct_net_ops = {
> > +#ifdef HAVE_DEFRAG_ENABLE_TAKES_NET
> > +	.init = nf_ct_net_init,
> > +#endif
> > 	.exit = nf_ct_net_exit,
> > };
> > 
> > @@ -571,7 +583,9 @@ int rpl_nf_ct_frag6_init(void)
> > {
> > 	int ret = 0;
> > 
> > +#ifndef HAVE_DEFRAG_ENABLE_TAKES_NET
> > 	nf_defrag_ipv6_enable();
> > +#endif
> > 	nf_frags.hashfn = nf_hashfn;
> > 	nf_frags.constructor = ip6_frag_init;
> > 	nf_frags.destructor = NULL;
> > -- 
> > 1.8.3.1
> > 
> > _______________________________________________
> > dev mailing list
> > dev@openvswitch.org
> > https://mail.openvswitch.org/mailman/listinfo/ovs-dev
>
diff mbox

Patch

diff --git a/datapath/linux/compat/ip_fragment.c b/datapath/linux/compat/ip_fragment.c
index b0f5d0e..fccd992 100644
--- a/datapath/linux/compat/ip_fragment.c
+++ b/datapath/linux/compat/ip_fragment.c
@@ -729,18 +729,32 @@  int rpl_ip_defrag(struct net *net, struct sk_buff *skb, u32 user)
 	return -ENOMEM;
 }
 
+#ifdef HAVE_DEFRAG_ENABLE_TAKES_NET
+static int __net_init ipv4_frags_init_net(struct net *net)
+{
+	nf_defrag_ipv4_enable(net);
+
+	return 0;
+}
+#endif
+
 static void __net_exit ipv4_frags_exit_net(struct net *net)
 {
 	inet_frags_exit_net(&net->ipv4.frags, &ip4_frags);
 }
 
 static struct pernet_operations ip4_frags_ops = {
+#ifdef HAVE_DEFRAG_ENABLE_TAKES_NET
+	.init = ipv4_frags_init_net,
+#endif
 	.exit = ipv4_frags_exit_net,
 };
 
 int __init rpl_ipfrag_init(void)
 {
+#ifndef HAVE_DEFRAG_ENABLE_TAKES_NET
 	nf_defrag_ipv4_enable();
+#endif
 	register_pernet_subsys(&ip4_frags_ops);
 	ip4_frags.hashfn = ip4_hashfn;
 	ip4_frags.constructor = ip4_frag_init;
diff --git a/datapath/linux/compat/nf_conntrack_reasm.c b/datapath/linux/compat/nf_conntrack_reasm.c
index 0bc4d9e..701faf5 100644
--- a/datapath/linux/compat/nf_conntrack_reasm.c
+++ b/datapath/linux/compat/nf_conntrack_reasm.c
@@ -558,12 +558,24 @@  out_unlock:
 	return ret;
 }
 
+#ifdef HAVE_DEFRAG_ENABLE_TAKES_NET
+static int nf_ct_net_init(struct net *net)
+{
+	nf_defrag_ipv6_enable(net);
+
+	return 0;
+}
+#endif
+
 static void nf_ct_net_exit(struct net *net)
 {
 	inet_frags_exit_net(&net->nf_frag.frags, &nf_frags);
 }
 
 static struct pernet_operations nf_ct_net_ops = {
+#ifdef HAVE_DEFRAG_ENABLE_TAKES_NET
+	.init = nf_ct_net_init,
+#endif
 	.exit = nf_ct_net_exit,
 };
 
@@ -571,7 +583,9 @@  int rpl_nf_ct_frag6_init(void)
 {
 	int ret = 0;
 
+#ifndef HAVE_DEFRAG_ENABLE_TAKES_NET
 	nf_defrag_ipv6_enable();
+#endif
 	nf_frags.hashfn = nf_hashfn;
 	nf_frags.constructor = ip6_frag_init;
 	nf_frags.destructor = NULL;