| From 52e655997539477f3d168b08659ffdb121523230 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 22 Jan 2025 18:09:13 +0800 |
| Subject: strparser: Add read_sock callback |
| |
| From: Jiayuan Chen <mrpre@163.com> |
| |
| [ Upstream commit 0532a79efd68a4d9686b0385e4993af4b130ff82 ] |
| |
| Added a new read_sock handler, allowing users to customize read operations |
| instead of relying on the native socket's read_sock. |
| |
| Signed-off-by: Jiayuan Chen <mrpre@163.com> |
| Signed-off-by: Martin KaFai Lau <martin.lau@kernel.org> |
| Reviewed-by: Jakub Sitnicki <jakub@cloudflare.com> |
| Acked-by: John Fastabend <john.fastabend@gmail.com> |
| Link: https://patch.msgid.link/20250122100917.49845-2-mrpre@163.com |
| Stable-dep-of: 36b62df5683c ("bpf: Fix wrong copied_seq calculation") |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| Documentation/networking/strparser.rst | 9 ++++++++- |
| include/net/strparser.h | 2 ++ |
| net/strparser/strparser.c | 11 +++++++++-- |
| 3 files changed, 19 insertions(+), 3 deletions(-) |
| |
| diff --git a/Documentation/networking/strparser.rst b/Documentation/networking/strparser.rst |
| index 6cab1f74ae05a..7f623d1db72aa 100644 |
| --- a/Documentation/networking/strparser.rst |
| +++ b/Documentation/networking/strparser.rst |
| @@ -112,7 +112,7 @@ Functions |
| Callbacks |
| ========= |
| |
| -There are six callbacks: |
| +There are seven callbacks: |
| |
| :: |
| |
| @@ -182,6 +182,13 @@ There are six callbacks: |
| the length of the message. skb->len - offset may be greater |
| then full_len since strparser does not trim the skb. |
| |
| + :: |
| + |
| + int (*read_sock)(struct strparser *strp, read_descriptor_t *desc, |
| + sk_read_actor_t recv_actor); |
| + |
| + The read_sock callback is used by strparser instead of |
| + sock->ops->read_sock, if provided. |
| :: |
| |
| int (*read_sock_done)(struct strparser *strp, int err); |
| diff --git a/include/net/strparser.h b/include/net/strparser.h |
| index 41e2ce9e9e10f..0a83010b3a64a 100644 |
| --- a/include/net/strparser.h |
| +++ b/include/net/strparser.h |
| @@ -43,6 +43,8 @@ struct strparser; |
| struct strp_callbacks { |
| int (*parse_msg)(struct strparser *strp, struct sk_buff *skb); |
| void (*rcv_msg)(struct strparser *strp, struct sk_buff *skb); |
| + int (*read_sock)(struct strparser *strp, read_descriptor_t *desc, |
| + sk_read_actor_t recv_actor); |
| int (*read_sock_done)(struct strparser *strp, int err); |
| void (*abort_parser)(struct strparser *strp, int err); |
| void (*lock)(struct strparser *strp); |
| diff --git a/net/strparser/strparser.c b/net/strparser/strparser.c |
| index 8299ceb3e3739..95696f42647ec 100644 |
| --- a/net/strparser/strparser.c |
| +++ b/net/strparser/strparser.c |
| @@ -347,7 +347,10 @@ static int strp_read_sock(struct strparser *strp) |
| struct socket *sock = strp->sk->sk_socket; |
| read_descriptor_t desc; |
| |
| - if (unlikely(!sock || !sock->ops || !sock->ops->read_sock)) |
| + if (unlikely(!sock || !sock->ops)) |
| + return -EBUSY; |
| + |
| + if (unlikely(!strp->cb.read_sock && !sock->ops->read_sock)) |
| return -EBUSY; |
| |
| desc.arg.data = strp; |
| @@ -355,7 +358,10 @@ static int strp_read_sock(struct strparser *strp) |
| desc.count = 1; /* give more than one skb per call */ |
| |
| /* sk should be locked here, so okay to do read_sock */ |
| - sock->ops->read_sock(strp->sk, &desc, strp_recv); |
| + if (strp->cb.read_sock) |
| + strp->cb.read_sock(strp, &desc, strp_recv); |
| + else |
| + sock->ops->read_sock(strp->sk, &desc, strp_recv); |
| |
| desc.error = strp->cb.read_sock_done(strp, desc.error); |
| |
| @@ -468,6 +474,7 @@ int strp_init(struct strparser *strp, struct sock *sk, |
| strp->cb.unlock = cb->unlock ? : strp_sock_unlock; |
| strp->cb.rcv_msg = cb->rcv_msg; |
| strp->cb.parse_msg = cb->parse_msg; |
| + strp->cb.read_sock = cb->read_sock; |
| strp->cb.read_sock_done = cb->read_sock_done ? : default_read_sock_done; |
| strp->cb.abort_parser = cb->abort_parser ? : strp_abort_strp; |
| |
| -- |
| 2.39.5 |
| |