Thread (1 message) 1 message, 1 author, 2025-01-21

Re: [PATCH bpf v8 3/5] bpf: disable non stream socket for strparser

From: Jakub Sitnicki <jakub@cloudflare.com>
Date: 2025-01-21 14:23:04
Also in: bpf, linux-doc, linux-kselftest, lkml

On Tue, Jan 21, 2025 at 01:07 PM +08, Jiayuan Chen wrote:
Currently, only TCP supports strparser, but sockmap doesn't intercept
non-TCP to attach strparser. For example, with UDP, although the
read/write handlers are replaced, strparser is not executed due to the
lack of read_sock operation.

Furthermore, in udp_bpf_recvmsg(), it checks whether psock has data, and
if not, it falls back to the native UDP read interface, making
UDP + strparser appear to read correctly. According to it's commit
Nit: typo, "its"
quoted hunk
history, the behavior is unexpected.

Moreover, since UDP lacks the concept of streams, we intercept it
directly.

Signed-off-by: Jiayuan Chen <redacted>
---
 net/core/sock_map.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/net/core/sock_map.c b/net/core/sock_map.c
index f1b9b3958792..3b0f59d9b4db 100644
--- a/net/core/sock_map.c
+++ b/net/core/sock_map.c
@@ -303,7 +303,10 @@ static int sock_map_link(struct bpf_map *map, struct sock *sk)
 
 	write_lock_bh(&sk->sk_callback_lock);
 	if (stream_parser && stream_verdict && !psock->saved_data_ready) {
-		ret = sk_psock_init_strp(sk, psock);
+		if (sk_is_tcp(sk))
+			ret = sk_psock_init_strp(sk, psock);
+		else
+			ret = -EOPNOTSUPP;
 		if (ret) {
 			write_unlock_bh(&sk->sk_callback_lock);
 			sk_psock_put(sk, psock);
Reviewed-by: Jakub Sitnicki <jakub@cloudflare.com>
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help