]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
tcp: bpf: Introduce bpf_sol_tcp_getsockopt to support TCP_BPF flags
authorJason Xing <kerneljasonxing@gmail.com>
Wed, 12 Mar 2025 15:35:20 +0000 (16:35 +0100)
committerMartin KaFai Lau <martin.lau@kernel.org>
Thu, 13 Mar 2025 21:30:38 +0000 (14:30 -0700)
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
net/core/filter.c

index a0867c5b32b37064824860451d6ce44d7943e86d..2932de5cc57cedc9490705a382c1211d77e1be78 100644 (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);
        }