selftests/bpf: Test bpf_skc_to_mptcp_sock
authorGeliang Tang <geliang.tang@suse.com>
Thu, 19 May 2022 23:30:13 +0000 (16:30 -0700)
committerAndrii Nakryiko <andrii@kernel.org>
Fri, 20 May 2022 22:34:39 +0000 (15:34 -0700)
This patch extends the MPTCP test base, to test the new helper
bpf_skc_to_mptcp_sock().

Define struct mptcp_sock in bpf_tcp_helpers.h, use bpf_skc_to_mptcp_sock
to get the msk socket in progs/mptcp_sock.c and store the infos in
socket_storage_map.

Get the infos from socket_storage_map in prog_tests/mptcp.c. Add a new
function verify_msk() to verify the infos of MPTCP socket, and rename
verify_sk() to verify_tsk() to verify TCP socket only.

v2: Add CONFIG_MPTCP check for clearer error messages

v4:
 - use ASSERT_* instead of CHECK_FAIL (Andrii)
 - drop bpf_mptcp_helpers.h (Andrii)

v5:
 - some 'ASSERT_*' were replaced in the next commit by mistake.
 - Drop CONFIG_MPTCP (Martin)
 - Use ASSERT_EQ (Andrii)

Signed-off-by: Geliang Tang <geliang.tang@suse.com>
Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Acked-by: Matthieu Baerts <matthieu.baerts@tessares.net>
Link: https://lore.kernel.org/bpf/20220519233016.105670-5-mathew.j.martineau@linux.intel.com
tools/testing/selftests/bpf/bpf_tcp_helpers.h
tools/testing/selftests/bpf/prog_tests/mptcp.c
tools/testing/selftests/bpf/progs/mptcp_sock.c

index 22e0c88..1a3f6ec 100644 (file)
@@ -226,4 +226,8 @@ static __always_inline bool tcp_cc_eq(const char *a, const char *b)
 extern __u32 tcp_slow_start(struct tcp_sock *tp, __u32 acked) __ksym;
 extern void tcp_cong_avoid_ai(struct tcp_sock *tp, __u32 w, __u32 acked) __ksym;
 
+struct mptcp_sock {
+       struct inet_connection_sock     sk;
+} __attribute__((preserve_access_index));
+
 #endif
index 6b346e3..227682a 100644 (file)
@@ -12,14 +12,11 @@ struct mptcp_storage {
        __u32 is_mptcp;
 };
 
-static int verify_sk(int map_fd, int client_fd, __u32 is_mptcp)
+static int verify_tsk(int map_fd, int client_fd)
 {
        int err, cfd = client_fd;
        struct mptcp_storage val;
 
-       if (is_mptcp == 1)
-               return 0;
-
        err = bpf_map_lookup_elem(map_fd, &cfd, &val);
        if (!ASSERT_OK(err, "bpf_map_lookup_elem"))
                return err;
@@ -33,6 +30,24 @@ static int verify_sk(int map_fd, int client_fd, __u32 is_mptcp)
        return err;
 }
 
+static int verify_msk(int map_fd, int client_fd)
+{
+       int err, cfd = client_fd;
+       struct mptcp_storage val;
+
+       err = bpf_map_lookup_elem(map_fd, &cfd, &val);
+       if (!ASSERT_OK(err, "bpf_map_lookup_elem"))
+               return err;
+
+       if (!ASSERT_EQ(val.invoked, 1, "unexpected invoked count"))
+               err++;
+
+       if (!ASSERT_EQ(val.is_mptcp, 1, "unexpected is_mptcp"))
+               err++;
+
+       return err;
+}
+
 static int run_test(int cgroup_fd, int server_fd, bool is_mptcp)
 {
        int client_fd, prog_fd, map_fd, err;
@@ -64,8 +79,8 @@ static int run_test(int cgroup_fd, int server_fd, bool is_mptcp)
                goto out;
        }
 
-       err += is_mptcp ? verify_sk(map_fd, client_fd, 1) :
-                         verify_sk(map_fd, client_fd, 0);
+       err += is_mptcp ? verify_msk(map_fd, client_fd) :
+                         verify_tsk(map_fd, client_fd);
 
        close(client_fd);
 
index bc09dba..dc73b3f 100644 (file)
@@ -24,6 +24,7 @@ SEC("sockops")
 int _sockops(struct bpf_sock_ops *ctx)
 {
        struct mptcp_storage *storage;
+       struct mptcp_sock *msk;
        int op = (int)ctx->op;
        struct tcp_sock *tsk;
        struct bpf_sock *sk;
@@ -41,11 +42,21 @@ int _sockops(struct bpf_sock_ops *ctx)
                return 1;
 
        is_mptcp = bpf_core_field_exists(tsk->is_mptcp) ? tsk->is_mptcp : 0;
-       storage = bpf_sk_storage_get(&socket_storage_map, sk, 0,
-                                    BPF_SK_STORAGE_GET_F_CREATE);
-       if (!storage)
-               return 1;
+       if (!is_mptcp) {
+               storage = bpf_sk_storage_get(&socket_storage_map, sk, 0,
+                                            BPF_SK_STORAGE_GET_F_CREATE);
+               if (!storage)
+                       return 1;
+       } else {
+               msk = bpf_skc_to_mptcp_sock(sk);
+               if (!msk)
+                       return 1;
 
+               storage = bpf_sk_storage_get(&socket_storage_map, msk, 0,
+                                            BPF_SK_STORAGE_GET_F_CREATE);
+               if (!storage)
+                       return 1;
+       }
        storage->invoked++;
        storage->is_mptcp = is_mptcp;