summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Xing <kerneljasonxing@gmail.com>2025-03-12 16:35:20 +0100
committerMartin KaFai Lau <martin.lau@kernel.org>2025-03-13 14:30:38 -0700
commit49f6713cb6913e1e62d98a36548c592b3d5d32df (patch)
treea1bb114b9a2df9e0a4b794ec54100ac10b86130a
parent6d99faf2541d519ec30a104d6b585484563e2c45 (diff)
tcp: bpf: Introduce bpf_sol_tcp_getsockopt to support TCP_BPF flags
The patch refactors a bit on supporting getsockopt for TCP BPF flags. For now, only TCP_BPF_SOCK_OPS_CB_FLAGS. Later, more flags will be added into this function. No functional changes here. Signed-off-by: Jason Xing <kerneljasonxing@gmail.com> Signed-off-by: Martin KaFai Lau <martin.lau@kernel.org> Link: https://patch.msgid.link/20250312153523.9860-2-kerneljasonxing@gmail.com
-rw-r--r--net/core/filter.c33
1 files changed, 21 insertions, 12 deletions
diff --git a/net/core/filter.c b/net/core/filter.c
index a0867c5b32b3..2932de5cc57c 100644
--- a/net/core/filter.c
+++ b/net/core/filter.c
@@ -5282,6 +5282,26 @@ static int sol_socket_sockopt(struct sock *sk, int optname,
KERNEL_SOCKPTR(optval), *optlen);
}
+static int bpf_sol_tcp_getsockopt(struct sock *sk, int optname,
+ char *optval, int optlen)
+{
+ if (optlen != sizeof(int))
+ return -EINVAL;
+
+ switch (optname) {
+ case TCP_BPF_SOCK_OPS_CB_FLAGS: {
+ int cb_flags = tcp_sk(sk)->bpf_sock_ops_cb_flags;
+
+ memcpy(optval, &cb_flags, optlen);
+ break;
+ }
+ default:
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
static int bpf_sol_tcp_setsockopt(struct sock *sk, int optname,
char *optval, int optlen)
{
@@ -5415,20 +5435,9 @@ static int sol_tcp_sockopt(struct sock *sk, int optname,
if (*optlen < 1)
return -EINVAL;
break;
- case TCP_BPF_SOCK_OPS_CB_FLAGS:
- if (*optlen != sizeof(int))
- return -EINVAL;
- if (getopt) {
- struct tcp_sock *tp = tcp_sk(sk);
- int cb_flags = tp->bpf_sock_ops_cb_flags;
-
- memcpy(optval, &cb_flags, *optlen);
- return 0;
- }
- return bpf_sol_tcp_setsockopt(sk, optname, optval, *optlen);
default:
if (getopt)
- return -EINVAL;
+ return bpf_sol_tcp_getsockopt(sk, optname, optval, *optlen);
return bpf_sol_tcp_setsockopt(sk, optname, optval, *optlen);
}