diff options
author | Paolo Abeni <pabeni@redhat.com> | 2021-07-03 00:38:43 +0200 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2021-07-02 16:19:14 -0700 |
commit | b43c8909be52f2baca8884f967b418a88424494a (patch) | |
tree | b09c16bdf085480edfe70d7f790d2b3fbedffe3e /net/ipv4 | |
parent | b22580233d473dbf7bbfa4f6549c09e2c80e9e64 (diff) | |
download | lwn-b43c8909be52f2baca8884f967b418a88424494a.tar.gz lwn-b43c8909be52f2baca8884f967b418a88424494a.zip |
udp: properly flush normal packet at GRO time
If an UDP packet enters the GRO engine but is not eligible
for aggregation and is not targeting an UDP tunnel,
udp_gro_receive() will not set the flush bit, and packet
could delayed till the next napi flush.
Fix the issue ensuring non GROed packets traverse
skb_gro_flush_final().
Reported-and-tested-by: Matthias Treydte <mt@waldheinz.de>
Fixes: 18f25dc39990 ("udp: skip L4 aggregation for UDP tunnel packets")
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4')
-rw-r--r-- | net/ipv4/udp_offload.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/net/ipv4/udp_offload.c b/net/ipv4/udp_offload.c index 54e06b88af69..9dde1e5fb449 100644 --- a/net/ipv4/udp_offload.c +++ b/net/ipv4/udp_offload.c @@ -525,8 +525,10 @@ struct sk_buff *udp_gro_receive(struct list_head *head, struct sk_buff *skb, if ((!sk && (skb->dev->features & NETIF_F_GRO_UDP_FWD)) || (sk && udp_sk(sk)->gro_enabled) || NAPI_GRO_CB(skb)->is_flist) - pp = call_gro_receive(udp_gro_receive_segment, head, skb); - return pp; + return call_gro_receive(udp_gro_receive_segment, head, skb); + + /* no GRO, be sure flush the current packet */ + goto out; } if (NAPI_GRO_CB(skb)->encap_mark || |