Skip to content

Commit

Permalink
udp: fix GRO reception in case of length mismatch
Browse files Browse the repository at this point in the history
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: e20cf8d ("udp: implement GRO for plain UDP sockets.")
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Paolo Abeni authored and David S. Miller committed Apr 28, 2019
1 parent fbef947 commit 21f1b8a
Showing 1 changed file with 5 additions and 4 deletions.
9 changes: 5 additions & 4 deletions net/ipv4/udp_offload.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down

0 comments on commit 21f1b8a

Please sign in to comment.