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
This commit is contained in:
Jason Xing 2025-03-12 16:35:20 +01:00 committed by Martin KaFai Lau
parent 6d99faf254
commit 49f6713cb6

View File

@ -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);
}