Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'for-netdev' of https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next

Martin KaFai Lau says:

====================
pull-request: bpf-next 2025-03-13

The following pull-request contains BPF updates for your *net-next* tree.

We've added 4 non-merge commits during the last 3 day(s) which contain
a total of 2 files changed, 35 insertions(+), 12 deletions(-).

The main changes are:

1) bpf_getsockopt support for TCP_BPF_RTO_MIN and TCP_BPF_DELACK_MAX,
from Jason Xing

bpf-next-for-netdev

* tag 'for-netdev' of https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next:
selftests/bpf: Add bpf_getsockopt() for TCP_BPF_DELACK_MAX and TCP_BPF_RTO_MIN
tcp: bpf: Support bpf_getsockopt for TCP_BPF_DELACK_MAX
tcp: bpf: Support bpf_getsockopt for TCP_BPF_RTO_MIN
tcp: bpf: Introduce bpf_sol_tcp_getsockopt to support TCP_BPF flags
====================

Link: https://patch.msgid.link/20250313221620.2512684-1-martin.lau@linux.dev
Signed-off-by: Paolo Abeni <pabeni@redhat.com>

+35 -12
+33 -12
net/core/filter.c
··· 5282 5282 KERNEL_SOCKPTR(optval), *optlen); 5283 5283 } 5284 5284 5285 + static int bpf_sol_tcp_getsockopt(struct sock *sk, int optname, 5286 + char *optval, int optlen) 5287 + { 5288 + if (optlen != sizeof(int)) 5289 + return -EINVAL; 5290 + 5291 + switch (optname) { 5292 + case TCP_BPF_SOCK_OPS_CB_FLAGS: { 5293 + int cb_flags = tcp_sk(sk)->bpf_sock_ops_cb_flags; 5294 + 5295 + memcpy(optval, &cb_flags, optlen); 5296 + break; 5297 + } 5298 + case TCP_BPF_RTO_MIN: { 5299 + int rto_min_us = jiffies_to_usecs(inet_csk(sk)->icsk_rto_min); 5300 + 5301 + memcpy(optval, &rto_min_us, optlen); 5302 + break; 5303 + } 5304 + case TCP_BPF_DELACK_MAX: { 5305 + int delack_max_us = jiffies_to_usecs(inet_csk(sk)->icsk_delack_max); 5306 + 5307 + memcpy(optval, &delack_max_us, optlen); 5308 + break; 5309 + } 5310 + default: 5311 + return -EINVAL; 5312 + } 5313 + 5314 + return 0; 5315 + } 5316 + 5285 5317 static int bpf_sol_tcp_setsockopt(struct sock *sk, int optname, 5286 5318 char *optval, int optlen) 5287 5319 { ··· 5447 5415 if (*optlen < 1) 5448 5416 return -EINVAL; 5449 5417 break; 5450 - case TCP_BPF_SOCK_OPS_CB_FLAGS: 5451 - if (*optlen != sizeof(int)) 5452 - return -EINVAL; 5453 - if (getopt) { 5454 - struct tcp_sock *tp = tcp_sk(sk); 5455 - int cb_flags = tp->bpf_sock_ops_cb_flags; 5456 - 5457 - memcpy(optval, &cb_flags, *optlen); 5458 - return 0; 5459 - } 5460 - return bpf_sol_tcp_setsockopt(sk, optname, optval, *optlen); 5461 5418 default: 5462 5419 if (getopt) 5463 - return -EINVAL; 5420 + return bpf_sol_tcp_getsockopt(sk, optname, optval, *optlen); 5464 5421 return bpf_sol_tcp_setsockopt(sk, optname, optval, *optlen); 5465 5422 } 5466 5423
+2
tools/testing/selftests/bpf/progs/setget_sockopt.c
··· 61 61 { .opt = TCP_NOTSENT_LOWAT, .new = 1314, .expected = 1314, }, 62 62 { .opt = TCP_BPF_SOCK_OPS_CB_FLAGS, .new = BPF_SOCK_OPS_ALL_CB_FLAGS, 63 63 .expected = BPF_SOCK_OPS_ALL_CB_FLAGS, }, 64 + { .opt = TCP_BPF_DELACK_MAX, .new = 30000, .expected = 30000, }, 65 + { .opt = TCP_BPF_RTO_MIN, .new = 30000, .expected = 30000, }, 64 66 { .opt = TCP_RTO_MAX_MS, .new = 2000, .expected = 2000, }, 65 67 { .opt = 0, }, 66 68 };