Commit 6f13bec5 authored by Paolo Abeni's avatar Paolo Abeni
Browse files
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: default avatarPaolo Abeni <pabeni@redhat.com>
parents f4915933 c468c8d2
Loading
Loading
Loading
Loading
+33 −12
Original line number Diff line number Diff line
@@ -5282,6 +5282,38 @@ 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;
	}
	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;
	}
	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;
	}

	return 0;
}

static int bpf_sol_tcp_setsockopt(struct sock *sk, int optname,
				  char *optval, int optlen)
{
@@ -5415,20 +5447,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);
	}

+2 −0
Original line number Diff line number Diff line
@@ -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, },
};