From 49f6713cb6913e1e62d98a36548c592b3d5d32df Mon Sep 17 00:00:00 2001 From: Jason Xing Date: Wed, 12 Mar 2025 16:35:20 +0100 Subject: [PATCH 1/4] 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 Signed-off-by: Martin KaFai Lau Link: https://patch.msgid.link/20250312153523.9860-2-kerneljasonxing@gmail.com --- net/core/filter.c | 33 +++++++++++++++++++++------------ 1 file 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); } From 5584cd7e0ddd0d4e6e91498864c4cd025445dafe Mon Sep 17 00:00:00 2001 From: Jason Xing Date: Wed, 12 Mar 2025 16:35:21 +0100 Subject: [PATCH 2/4] tcp: bpf: Support bpf_getsockopt for TCP_BPF_RTO_MIN Support bpf_getsockopt if application tries to know what the RTO MIN of this socket is. Signed-off-by: Jason Xing Signed-off-by: Martin KaFai Lau Link: https://patch.msgid.link/20250312153523.9860-3-kerneljasonxing@gmail.com --- net/core/filter.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/net/core/filter.c b/net/core/filter.c index 2932de5cc57c..4d34d35af5c7 100644 --- a/net/core/filter.c +++ b/net/core/filter.c @@ -5295,6 +5295,12 @@ static int bpf_sol_tcp_getsockopt(struct sock *sk, int optname, memcpy(optval, &cb_flags, optlen); break; } + case TCP_BPF_RTO_MIN: { + int rto_min_us = jiffies_to_usecs(inet_csk(sk)->icsk_rto_min); + + memcpy(optval, &rto_min_us, optlen); + break; + } default: return -EINVAL; } From d22b8b04b88e39d0ed1177fb31fd3e880ac0ee2d Mon Sep 17 00:00:00 2001 From: Jason Xing Date: Wed, 12 Mar 2025 16:35:22 +0100 Subject: [PATCH 3/4] tcp: bpf: Support bpf_getsockopt for TCP_BPF_DELACK_MAX Support bpf_getsockopt if application tries to know what the delayed ack max time is. Signed-off-by: Jason Xing Signed-off-by: Martin KaFai Lau Link: https://patch.msgid.link/20250312153523.9860-4-kerneljasonxing@gmail.com --- net/core/filter.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/net/core/filter.c b/net/core/filter.c index 4d34d35af5c7..46ae8eb7a03c 100644 --- a/net/core/filter.c +++ b/net/core/filter.c @@ -5301,6 +5301,12 @@ static int bpf_sol_tcp_getsockopt(struct sock *sk, int optname, memcpy(optval, &rto_min_us, optlen); break; } + case TCP_BPF_DELACK_MAX: { + int delack_max_us = jiffies_to_usecs(inet_csk(sk)->icsk_delack_max); + + memcpy(optval, &delack_max_us, optlen); + break; + } default: return -EINVAL; } From a1e0783e1036ac33a08bdb6b88e671e267c332aa Mon Sep 17 00:00:00 2001 From: Jason Xing Date: Wed, 12 Mar 2025 16:35:23 +0100 Subject: [PATCH 4/4] selftests/bpf: Add bpf_getsockopt() for TCP_BPF_DELACK_MAX and TCP_BPF_RTO_MIN Add selftests for TCP_BPF_DELACK_MAX and TCP_BPF_RTO_MIN BPF socket cases. Signed-off-by: Jason Xing Signed-off-by: Martin KaFai Lau Link: https://patch.msgid.link/20250312153523.9860-5-kerneljasonxing@gmail.com --- tools/testing/selftests/bpf/progs/setget_sockopt.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tools/testing/selftests/bpf/progs/setget_sockopt.c b/tools/testing/selftests/bpf/progs/setget_sockopt.c index 106fe430f41b..0107a24b7522 100644 --- a/tools/testing/selftests/bpf/progs/setget_sockopt.c +++ b/tools/testing/selftests/bpf/progs/setget_sockopt.c @@ -61,6 +61,8 @@ static const struct sockopt_test sol_tcp_tests[] = { { .opt = TCP_NOTSENT_LOWAT, .new = 1314, .expected = 1314, }, { .opt = TCP_BPF_SOCK_OPS_CB_FLAGS, .new = BPF_SOCK_OPS_ALL_CB_FLAGS, .expected = BPF_SOCK_OPS_ALL_CB_FLAGS, }, + { .opt = TCP_BPF_DELACK_MAX, .new = 30000, .expected = 30000, }, + { .opt = TCP_BPF_RTO_MIN, .new = 30000, .expected = 30000, }, { .opt = TCP_RTO_MAX_MS, .new = 2000, .expected = 2000, }, { .opt = 0, }, };