| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 |
- From: Richard Gobert <[email protected]>
- Date: Tue, 30 Apr 2024 16:35:55 +0200
- Subject: [PATCH] net: gro: add flush check in udp_gro_receive_segment
- GRO-GSO path is supposed to be transparent and as such L3 flush checks are
- relevant to all UDP flows merging in GRO. This patch uses the same logic
- and code from tcp_gro_receive, terminating merge if flush is non zero.
- Fixes: e20cf8d3f1f7 ("udp: implement GRO for plain UDP sockets.")
- Signed-off-by: Richard Gobert <[email protected]>
- Reviewed-by: Willem de Bruijn <[email protected]>
- Signed-off-by: Paolo Abeni <[email protected]>
- ---
- --- a/net/ipv4/udp_offload.c
- +++ b/net/ipv4/udp_offload.c
- @@ -471,6 +471,7 @@ static struct sk_buff *udp_gro_receive_s
- struct sk_buff *p;
- unsigned int ulen;
- int ret = 0;
- + int flush;
-
- /* requires non zero csum, for symmetry with GSO */
- if (!uh->check) {
- @@ -504,13 +505,22 @@ static struct sk_buff *udp_gro_receive_s
- return p;
- }
-
- + flush = NAPI_GRO_CB(p)->flush;
- +
- + if (NAPI_GRO_CB(p)->flush_id != 1 ||
- + NAPI_GRO_CB(p)->count != 1 ||
- + !NAPI_GRO_CB(p)->is_atomic)
- + flush |= NAPI_GRO_CB(p)->flush_id;
- + else
- + NAPI_GRO_CB(p)->is_atomic = false;
- +
- /* 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 excessive truesize values.
- * On len mismatch merge the first packet shorter than gso_size,
- * otherwise complete the GRO packet.
- */
- - if (ulen > ntohs(uh2->len)) {
- + if (ulen > ntohs(uh2->len) || flush) {
- pp = p;
- } else {
- if (NAPI_GRO_CB(skb)->is_flist) {
|