1 // SPDX-License-Identifier: GPL-2.0 2 3 #include <test_progs.h> 4 #include "cgroup_helpers.h" 5 #include "network_helpers.h" 6 #include "sock_ops_get_sk.skel.h" 7 8 /* See progs/sock_ops_get_sk.c for the bug description. */ 9 static void run_sock_ops_test(int cgroup_fd, int prog_fd) 10 { 11 int server_fd, client_fd, err; 12 13 err = bpf_prog_attach(prog_fd, cgroup_fd, BPF_CGROUP_SOCK_OPS, 0); 14 if (!ASSERT_OK(err, "prog_attach")) 15 return; 16 17 server_fd = start_server(AF_INET, SOCK_STREAM, NULL, 0, 0); 18 if (!ASSERT_OK_FD(server_fd, "start_server")) 19 goto detach; 20 21 /* Trigger TCP handshake which causes TCP_NEW_SYN_RECV state where 22 * is_fullsock == 0 and is_locked_tcp_sock == 0. 23 */ 24 client_fd = connect_to_fd(server_fd, 0); 25 if (!ASSERT_OK_FD(client_fd, "connect_to_fd")) 26 goto close_server; 27 28 close(client_fd); 29 30 close_server: 31 close(server_fd); 32 detach: 33 bpf_prog_detach(cgroup_fd, BPF_CGROUP_SOCK_OPS); 34 } 35 36 void test_ns_sock_ops_get_sk(void) 37 { 38 struct sock_ops_get_sk *skel; 39 int cgroup_fd; 40 41 cgroup_fd = test__join_cgroup("/sock_ops_get_sk"); 42 if (!ASSERT_OK_FD(cgroup_fd, "join_cgroup")) 43 return; 44 45 skel = sock_ops_get_sk__open_and_load(); 46 if (!ASSERT_OK_PTR(skel, "skel_open_load")) 47 goto close_cgroup; 48 49 /* Test SOCK_OPS_GET_SK with same src/dst register */ 50 if (test__start_subtest("get_sk")) { 51 run_sock_ops_test(cgroup_fd, 52 bpf_program__fd(skel->progs.sock_ops_get_sk_same_reg)); 53 ASSERT_EQ(skel->bss->null_seen, 1, "null_seen"); 54 ASSERT_EQ(skel->bss->bug_detected, 0, "bug_not_detected"); 55 } 56 57 /* Test SOCK_OPS_GET_FIELD with same src/dst register */ 58 if (test__start_subtest("get_field")) { 59 run_sock_ops_test(cgroup_fd, 60 bpf_program__fd(skel->progs.sock_ops_get_field_same_reg)); 61 ASSERT_EQ(skel->bss->field_null_seen, 1, "field_null_seen"); 62 ASSERT_EQ(skel->bss->field_bug_detected, 0, "field_bug_not_detected"); 63 } 64 65 /* Test SOCK_OPS_GET_SK with different src/dst register */ 66 if (test__start_subtest("get_sk_diff_reg")) { 67 run_sock_ops_test(cgroup_fd, 68 bpf_program__fd(skel->progs.sock_ops_get_sk_diff_reg)); 69 ASSERT_EQ(skel->bss->diff_reg_null_seen, 1, "diff_reg_null_seen"); 70 ASSERT_EQ(skel->bss->diff_reg_bug_detected, 0, "diff_reg_bug_not_detected"); 71 } 72 73 sock_ops_get_sk__destroy(skel); 74 close_cgroup: 75 close(cgroup_fd); 76 } 77