All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH bpf v3 0/2] bpf: fix wrong copied_seq calculation and add tests
@ 2024-12-18  5:34 Jiayuan Chen
  2024-12-18  5:34 ` [PATCH bpf v3 1/2] bpf: fix wrong copied_seq calculation Jiayuan Chen
  2024-12-18  5:34 ` [PATCH bpf v3 2/2] selftests/bpf: add strparser test for bpf Jiayuan Chen
  0 siblings, 2 replies; 10+ messages in thread
From: Jiayuan Chen @ 2024-12-18  5:34 UTC (permalink / raw)
  To: bpf
  Cc: martin.lau, ast, edumazet, jakub, davem, dsahern, kuba, pabeni,
	linux-kernel, song, john.fastabend, andrii, mhal, yonghong.song,
	daniel, xiyou.wangcong, horms, Jiayuan Chen

A previous commit described in this topic
http://lore.kernel.org/bpf/20230523025618.113937-9-john.fastabend@gmail.com
directly updated 'sk->copied_seq' in the tcp_eat_skb() function when the
action of a BPF program was SK_REDIRECT. For other actions, like SK_PASS,
the update logic for 'sk->copied_seq' was moved to
tcp_bpf_recvmsg_parser() to ensure the accuracy of the 'fionread' feature.

That commit works for a single stream_verdict scenario, as it also
modified 'sk_data_ready->sk_psock_verdict_data_ready->tcp_read_skb'
to remove updating 'sk->copied_seq'.

However, for programs where both stream_parser and stream_verdict are
active(strparser purpose), tcp_read_sock() was used instead of
tcp_read_skb() (sk_data_ready->strp_data_ready->tcp_read_sock)
tcp_read_sock() now still update 'sk->copied_seq', leading to duplicated
updates.

In summary, for strparser + SK_PASS, copied_seq is redundantly calculated
in both tcp_read_sock() and tcp_bpf_recvmsg_parser().

The issue causes incorrect copied_seq calculations, which prevent
correct data reads from the recv() interface in user-land.

Modifying tcp_read_sock() or strparser implementation directly is
unreasonable, as it is widely used in other modules.

Here, we introduce a method tcp_bpf_read_sock() to replace
'sk->sk_socket->ops->read_sock' (like 'tls_build_proto()' does in
tls_main.c). Such replacement action was also used in updating
tcp_bpf_prots in tcp_bpf.c, so it's not weird.
(Note that checkpatch.pl may complain missing 'const' qualifier when we
define the bpf-specified 'proto_ops', but we have to do because we need
update it).

Also we remove strparser check in tcp_eat_skb() since we implement custom
function tcp_bpf_read_sock() without copied_seq updating.

Since strparser currently supports only TCP, it's sufficient for 'ops' to
inherit inet_stream_ops.

We added test cases for bpf + strparser and separated them from
sockmap_basic. This is because we need to add more test cases for
strparser in the future.

Fixes: e5c6de5fa025 ("bpf, sockmap: Incorrectly handling copied_seq")

---
v2-v3: save skb data offset for ENOMEM. (John Fastabend)
https://lore.kernel.org/bpf/20241209152740.281125-1-mrpre@163.com/#r

v1-v2: fix patchwork fail by adding Fixes tag

---
Jiayuan Chen (2):
  bpf: fix wrong copied_seq calculation
  selftests/bpf: add strparser test for bpf

 include/linux/skmsg.h                         |   2 +
 include/net/tcp.h                             |   1 +
 net/core/skmsg.c                              |   3 +
 net/ipv4/tcp.c                                |   2 +-
 net/ipv4/tcp_bpf.c                            | 108 +++++-
 .../selftests/bpf/prog_tests/sockmap_basic.c  |  53 ---
 .../selftests/bpf/prog_tests/sockmap_strp.c   | 344 ++++++++++++++++++
 .../selftests/bpf/progs/test_sockmap_strp.c   |  51 +++
 8 files changed, 507 insertions(+), 57 deletions(-)
 create mode 100644 tools/testing/selftests/bpf/prog_tests/sockmap_strp.c
 create mode 100644 tools/testing/selftests/bpf/progs/test_sockmap_strp.c


base-commit: 5a6ea7022ff4d2a65ae328619c586d6a8909b48b
-- 
2.43.5


^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2024-12-27 14:10 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-12-18  5:34 [PATCH bpf v3 0/2] bpf: fix wrong copied_seq calculation and add tests Jiayuan Chen
2024-12-18  5:34 ` [PATCH bpf v3 1/2] bpf: fix wrong copied_seq calculation Jiayuan Chen
2024-12-18 15:35   ` Jakub Sitnicki
2024-12-19  9:30     ` Jiayuan Chen
2024-12-20  7:06       ` John Fastabend
2024-12-23 20:57       ` Jakub Sitnicki
2024-12-23 22:57         ` Jakub Sitnicki
2024-12-24  7:16           ` Jiayuan Chen
2024-12-27 14:09             ` Jakub Sitnicki
2024-12-18  5:34 ` [PATCH bpf v3 2/2] selftests/bpf: add strparser test for bpf Jiayuan Chen

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.