summaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorPaolo Abeni <pabeni@redhat.com>2019-04-26 12:50:44 +0200
committerDavid S. Miller <davem@davemloft.net>2019-04-27 22:07:24 -0400
commit21f1b8a6636c4dbde4aa1ec0343f42eaf653ffcc (patch)
tree33d35206b298bec0f5f6cc43d52f392c966b6d07 /net
parentfbef9478ff2266593a4ff45ff770a68d908bae8b (diff)
downloadlinux-21f1b8a6636c4dbde4aa1ec0343f42eaf653ffcc.tar.gz
linux-21f1b8a6636c4dbde4aa1ec0343f42eaf653ffcc.tar.bz2
linux-21f1b8a6636c4dbde4aa1ec0343f42eaf653ffcc.zip
udp: fix GRO reception in case of length mismatch
Currently, the UDP GRO code path does bad things on some edge conditions - Aggregation can happen even on packet with different lengths. Fix the above by rewriting the 'complete' condition for GRO packets. While at it, note explicitly that we allow merging the first packet per burst below gso_size. Reported-by: Sean Tong <seantong114@gmail.com> Fixes: e20cf8d3f1f7 ("udp: implement GRO for plain UDP sockets.") Signed-off-by: Paolo Abeni <pabeni@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
-rw-r--r--net/ipv4/udp_offload.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/net/ipv4/udp_offload.c b/net/ipv4/udp_offload.c
index 64f9715173ac..d8776b2110c1 100644
--- a/net/ipv4/udp_offload.c
+++ b/net/ipv4/udp_offload.c
@@ -377,13 +377,14 @@ static struct sk_buff *udp_gro_receive_segment(struct list_head *head,
/* Terminate the flow on len mismatch or if it grow "too much".
* Under small packet flood GRO count could elsewhere grow a lot
- * leading to execessive truesize values
+ * leading to execessive truesize values.
+ * On len mismatch merge the first packet shorter than gso_size,
+ * otherwise complete the GRO packet.
*/
- if (!skb_gro_receive(p, skb) &&
+ if (uh->len > uh2->len || skb_gro_receive(p, skb) ||
+ uh->len != uh2->len ||
NAPI_GRO_CB(p)->count >= UDP_GRO_CNT_MAX)
pp = p;
- else if (uh->len != uh2->len)
- pp = p;
return pp;
}