diff mbox series

[ovs-dev,Branch,2.10] compat: Fixup ipv6 fragmentation on 4.9.135+ kernels

Message ID 1548271437-4206-1-git-send-email-gvrose8192@gmail.com
State Accepted
Headers show
Series [ovs-dev,Branch,2.10] compat: Fixup ipv6 fragmentation on 4.9.135+ kernels | expand

Commit Message

Gregory Rose Jan. 23, 2019, 7:23 p.m. UTC
Upstream commit 648700f76b03 ("inet: frags: use rhashtables...") changed
how ipv6 fragmentation is implemented.  This patch was backported to
the upstream stable 4.9.x kernel starting at 4.9.135.

This patch creates the compatibility layer changes required to both
compile and also operate correctly with ipv6 fragmentation on these
kernels. Check if the inet_frags 'rnd' field is present to key on
whether the upstream patch is present.  Also update Travis to the
latest 4.9 kernel release so that this patch is compile tested.

Passes Travis:
https://travis-ci.org/gvrose8192/ovs-experimental/builds/478033409

Cc: William Tu <u9012063@gmail.com>
Cc: Yi-Hung Wei <yihung.wei@gmail.com>
Cc: Yifeng Sun <pkusunyifeng@gmail.com>
Acked-by: Yi-Hung Wei <yihung.wei@gmail.com>
Signed-off-by: Greg Rose <gvrose8192@gmail.com>
Signed-off-by: Ben Pfaff <blp@ovn.org>
---
 .travis.yml                                |  2 +-
 acinclude.m4                               |  3 ++
 datapath/linux/compat/nf_conntrack_reasm.c | 54 ++++++++++++++++++++++++++++--
 3 files changed, 56 insertions(+), 3 deletions(-)

Comments

Ben Pfaff Jan. 23, 2019, 7:51 p.m. UTC | #1
On Wed, Jan 23, 2019 at 11:23:57AM -0800, Greg Rose wrote:
> Upstream commit 648700f76b03 ("inet: frags: use rhashtables...") changed
> how ipv6 fragmentation is implemented.  This patch was backported to
> the upstream stable 4.9.x kernel starting at 4.9.135.
> 
> This patch creates the compatibility layer changes required to both
> compile and also operate correctly with ipv6 fragmentation on these
> kernels. Check if the inet_frags 'rnd' field is present to key on
> whether the upstream patch is present.  Also update Travis to the
> latest 4.9 kernel release so that this patch is compile tested.
> 
> Passes Travis:
> https://travis-ci.org/gvrose8192/ovs-experimental/builds/478033409
> 
> Cc: William Tu <u9012063@gmail.com>
> Cc: Yi-Hung Wei <yihung.wei@gmail.com>
> Cc: Yifeng Sun <pkusunyifeng@gmail.com>
> Acked-by: Yi-Hung Wei <yihung.wei@gmail.com>
> Signed-off-by: Greg Rose <gvrose8192@gmail.com>
> Signed-off-by: Ben Pfaff <blp@ovn.org>

Thanks, applied.
0-day Robot Jan. 23, 2019, 7:56 p.m. UTC | #2
Bleep bloop.  Greetings Greg Rose, I am a robot and I have tried out your patch.
Thanks for your contribution.

I encountered some error that I wasn't expecting.  See the details below.


git-am:
Failed to merge in the changes.
Patch failed at 0001 compat: Fixup ipv6 fragmentation on 4.9.135+ kernels
The copy of the patch that failed is found in:
   /var/lib/jenkins/jobs/upstream_build_from_pw/workspace/.git/rebase-apply/patch
When you have resolved this problem, run "git am --resolved".
If you prefer to skip this patch, run "git am --skip" instead.
To restore the original branch and stop patching, run "git am --abort".


Please check this out.  If you feel there has been an error, please email aconole@bytheb.org

Thanks,
0-day Robot
Aaron Conole Jan. 24, 2019, 6:21 p.m. UTC | #3
Hi Greg,

0-day Robot <robot@bytheb.org> writes:

> Bleep bloop.  Greetings Greg Rose, I am a robot and I have tried out your patch.
> Thanks for your contribution.
>
> I encountered some error that I wasn't expecting.  See the details below.
>
>
> git-am:
> Failed to merge in the changes.
> Patch failed at 0001 compat: Fixup ipv6 fragmentation on 4.9.135+ kernels
> The copy of the patch that failed is found in:
>    /var/lib/jenkins/jobs/upstream_build_from_pw/workspace/.git/rebase-apply/patch
> When you have resolved this problem, run "git am --resolved".
> If you prefer to skip this patch, run "git am --skip" instead.
> To restore the original branch and stop patching, run "git am --abort".
>

In the future, you can avoid this bleep-bloop by using the branch name.
IE: branch-2.10 rather than Branch 2.10

I'll add looking at improving the branch detection as well, but not sure
when I'll get around to that.

> Please check this out.  If you feel there has been an error, please
> email aconole@bytheb.org
>
> Thanks,
> 0-day Robot
> _______________________________________________
> dev mailing list
> dev@openvswitch.org
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
Gregory Rose Jan. 24, 2019, 10:30 p.m. UTC | #4
On 1/24/2019 10:21 AM, Aaron Conole wrote:
> Hi Greg,
>
> 0-day Robot <robot@bytheb.org> writes:
>
>> Bleep bloop.  Greetings Greg Rose, I am a robot and I have tried out your patch.
>> Thanks for your contribution.
>>
>> I encountered some error that I wasn't expecting.  See the details below.
>>
>>
>> git-am:
>> Failed to merge in the changes.
>> Patch failed at 0001 compat: Fixup ipv6 fragmentation on 4.9.135+ kernels
>> The copy of the patch that failed is found in:
>>     /var/lib/jenkins/jobs/upstream_build_from_pw/workspace/.git/rebase-apply/patch
>> When you have resolved this problem, run "git am --resolved".
>> If you prefer to skip this patch, run "git am --skip" instead.
>> To restore the original branch and stop patching, run "git am --abort".
>>
> In the future, you can avoid this bleep-bloop by using the branch name.
> IE: branch-2.10 rather than Branch 2.10
>
> I'll add looking at improving the branch detection as well, but not sure
> when I'll get around to that.

Thanks for the tip!  Seems minor and I'm sure there's lots of other 
productive things for you to work
on.

;^)

- Greg

>> Please check this out.  If you feel there has been an error, please
>> email aconole@bytheb.org
>>
>> Thanks,
>> 0-day Robot
>> _______________________________________________
>> dev mailing list
>> dev@openvswitch.org
>> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
diff mbox series

Patch

diff --git a/.travis.yml b/.travis.yml
index 998b33d..3370052 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -37,7 +37,7 @@  env:
   - KERNEL=3.16.54 DPDK=1 OPTS="--enable-shared"
   - KERNEL=4.15.18
   - KERNEL=4.14.63
-  - KERNEL=4.9.120
+  - KERNEL=4.9.149
   - KERNEL=4.4.148
   - KERNEL=3.16.57
   - TESTSUITE=1 LIBS=-ljemalloc
diff --git a/acinclude.m4 b/acinclude.m4
index be918fc..65c0105 100644
--- a/acinclude.m4
+++ b/acinclude.m4
@@ -895,6 +895,9 @@  AC_DEFUN([OVS_CHECK_LINUX_COMPAT], [
                   [OVS_DEFINE([HAVE_VOID_NDO_GET_STATS64])])
   OVS_GREP_IFELSE([$KSRC/include/linux/timer.h], [init_timer_deferrable],
                   [OVS_DEFINE([HAVE_INIT_TIMER_DEFERRABLE])])
+  OVS_FIND_FIELD_IFELSE([$KSRC/include/net/inet_frag.h], [inet_frags],
+                        [rnd],
+                        [OVS_DEFINE([HAVE_INET_FRAGS_RND])])
 
   if cmp -s datapath/linux/kcompat.h.new \
             datapath/linux/kcompat.h >/dev/null 2>&1; then
diff --git a/datapath/linux/compat/nf_conntrack_reasm.c b/datapath/linux/compat/nf_conntrack_reasm.c
index ce13112..9d77d98 100644
--- a/datapath/linux/compat/nf_conntrack_reasm.c
+++ b/datapath/linux/compat/nf_conntrack_reasm.c
@@ -99,6 +99,7 @@  static inline u8 ip6_frag_ecn(const struct ipv6hdr *ipv6h)
 	return 1 << (ipv6_get_dsfield(ipv6h) & INET_ECN_MASK);
 }
 
+#ifdef HAVE_INET_FRAGS_RND
 static unsigned int nf_hash_frag(__be32 id, const struct in6_addr *saddr,
 				 const struct in6_addr *daddr)
 {
@@ -125,6 +126,7 @@  static unsigned int nf_hashfn(struct inet_frag_queue *q)
 	return nf_hash_frag(nq->id, &nq->saddr, &nq->daddr);
 }
 
+#endif /* HAVE_INET_FRAGS_RND */
 static void nf_ct_frag6_expire(unsigned long data)
 {
 	struct frag_queue *fq;
@@ -133,9 +135,14 @@  static void nf_ct_frag6_expire(unsigned long data)
 	fq = container_of((struct inet_frag_queue *)data, struct frag_queue, q);
 	net = get_net_from_netns_frags6(fq->q.net);
 
+#ifdef HAVE_INET_FRAGS_RND
 	ip6_expire_frag_queue(net, fq, &nf_frags);
+#else
+	ip6_expire_frag_queue(net, fq);
+#endif
 }
 
+#ifdef HAVE_INET_FRAGS_RND
 /* Creation primitives. */
 static inline struct frag_queue *fq_find(struct net *net, __be32 id,
 					 u32 user, struct in6_addr *src,
@@ -168,7 +175,27 @@  static inline struct frag_queue *fq_find(struct net *net, __be32 id,
 	}
 	return container_of(q, struct frag_queue, q);
 }
+#else
+static struct frag_queue *fq_find(struct net *net, __be32 id, u32 user,
+				  const struct ipv6hdr *hdr, int iif)
+{
+	struct frag_v6_compare_key key = {
+		.id = id,
+		.saddr = hdr->saddr,
+		.daddr = hdr->daddr,
+		.user = user,
+		.iif = iif,
+	};
+	struct inet_frag_queue *q;
+
+	q = inet_frag_find(&net->nf_frag.frags, &key);
+	if (!q)
+		return NULL;
+
+	return container_of(q, struct frag_queue, q);
+}
 
+#endif  /* HAVE_INET_FRAGS_RND */
 
 static int nf_ct_frag6_queue(struct frag_queue *fq, struct sk_buff *skb,
 			     const struct frag_hdr *fhdr, int nhoff)
@@ -317,7 +344,11 @@  found:
 	return 0;
 
 discard_fq:
+#ifdef HAVE_INET_FRAGS_RND
 	inet_frag_kill(&fq->q, &nf_frags);
+#else
+	inet_frag_kill(&fq->q);
+#endif
 err:
 	return -1;
 }
@@ -339,7 +370,11 @@  nf_ct_frag6_reasm(struct frag_queue *fq, struct sk_buff *prev,  struct net_devic
 	int    payload_len;
 	u8 ecn;
 
+#ifdef HAVE_INET_FRAGS_RND
 	inet_frag_kill(&fq->q, &nf_frags);
+#else
+	inet_frag_kill(&fq->q);
+#endif
 
 	WARN_ON(head == NULL);
 	WARN_ON(NFCT_FRAG6_CB(head)->offset != 0);
@@ -561,8 +596,13 @@  int rpl_nf_ct_frag6_gather(struct net *net, struct sk_buff *skb, u32 user)
 #endif
 
 	skb_orphan(skb);
+#ifdef HAVE_INET_FRAGS_RND
 	fq = fq_find(net, fhdr->identification, user, &hdr->saddr, &hdr->daddr,
 		     ip6_frag_ecn(hdr));
+#else
+	fq = fq_find(net, fhdr->identification, user, hdr,
+		     skb->dev ? skb->dev->ifindex : 0);
+#endif
 	if (fq == NULL)
 		return -ENOMEM;
 
@@ -584,7 +624,11 @@  int rpl_nf_ct_frag6_gather(struct net *net, struct sk_buff *skb, u32 user)
 
 out_unlock:
 	spin_unlock_bh(&fq->q.lock);
+#ifdef HAVE_INET_FRAGS_RND
 	inet_frag_put(&fq->q, &nf_frags);
+#else
+	inet_frag_put(&fq->q);
+#endif
 	return ret;
 }
 
@@ -614,10 +658,12 @@  void ovs_netns_frags6_init(struct net *net)
 
 void ovs_netns_frags6_exit(struct net *net)
 {
+#ifdef HAVE_INET_FRAGS_RND
 	struct netns_frags *frags;
 
 	frags = get_netns_frags6_from_net(net);
 	inet_frags_exit_net(frags, &nf_frags);
+#endif
 }
 
 static struct pernet_operations nf_ct_net_ops = {
@@ -634,13 +680,17 @@  int rpl_nf_ct_frag6_init(void)
 #ifndef HAVE_DEFRAG_ENABLE_TAKES_NET
 	nf_defrag_ipv6_enable();
 #endif
+#ifdef HAVE_INET_FRAGS_RND
 	nf_frags.hashfn = nf_hashfn;
+	nf_frags.match = ip6_frag_match;
+#else
+	nf_frags.rhash_params = ip6_rhash_params;
+#endif
 	nf_frags.constructor = ip6_frag_init;
 	nf_frags.destructor = NULL;
 	nf_frags.qsize = sizeof(struct frag_queue);
-	nf_frags.match = ip6_frag_match;
 	nf_frags.frag_expire = nf_ct_frag6_expire;
-#ifdef HAVE_INET_FRAGS_WITH_FRAGS_WORK
+#if defined(HAVE_INET_FRAGS_WITH_FRAGS_WORK) || !defined(HAVE_INET_FRAGS_RND)
 	nf_frags.frags_cache_name = nf_frags_cache_name;
 #endif
 #if RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(8,0)