OSDN Git Service

bpf, sockmap: Handle fin correctly
authorJohn Fastabend <john.fastabend@gmail.com>
Tue, 23 May 2023 02:56:09 +0000 (19:56 -0700)
committerDaniel Borkmann <daniel@iogearbox.net>
Tue, 23 May 2023 14:10:18 +0000 (16:10 +0200)
commit901546fd8f9ca4b5c481ce00928ab425ce9aacc0
treea85fd96272cf2e5f3a8c768fc52fd2ea2e4f3b80
parent405df89dd52cbcd69a3cd7d9a10d64de38f854b2
bpf, sockmap: Handle fin correctly

The sockmap code is returning EAGAIN after a FIN packet is received and no
more data is on the receive queue. Correct behavior is to return 0 to the
user and the user can then close the socket. The EAGAIN causes many apps
to retry which masks the problem. Eventually the socket is evicted from
the sockmap because its released from sockmap sock free handling. The
issue creates a delay and can cause some errors on application side.

To fix this check on sk_msg_recvmsg side if length is zero and FIN flag
is set then set return to zero. A selftest will be added to check this
condition.

Fixes: 04919bed948dc ("tcp: Introduce tcp_read_skb()")
Signed-off-by: John Fastabend <john.fastabend@gmail.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Tested-by: William Findlay <will@isovalent.com>
Reviewed-by: Jakub Sitnicki <jakub@cloudflare.com>
Link: https://lore.kernel.org/bpf/20230523025618.113937-6-john.fastabend@gmail.com
net/ipv4/tcp_bpf.c