1 // SPDX-License-Identifier: GPL-2.0 2 3 #include <test_progs.h> 4 #include "netns_cookie_prog.skel.h" 5 #include "network_helpers.h" 6 7 #ifndef SO_NETNS_COOKIE 8 #define SO_NETNS_COOKIE 71 9 #endif 10 11 static int duration; 12 13 void test_netns_cookie(void) 14 { 15 int server_fd = -1, client_fd = -1, cgroup_fd = -1; 16 int err, val, ret, map, verdict; 17 struct netns_cookie_prog *skel; 18 uint64_t cookie_expected_value; 19 socklen_t vallen = sizeof(cookie_expected_value); 20 static const char send_msg[] = "message"; 21 22 skel = netns_cookie_prog__open_and_load(); 23 if (!ASSERT_OK_PTR(skel, "skel_open")) 24 return; 25 26 cgroup_fd = test__join_cgroup("/netns_cookie"); 27 if (CHECK(cgroup_fd < 0, "join_cgroup", "cgroup creation failed\n")) 28 goto done; 29 30 skel->links.get_netns_cookie_sockops = bpf_program__attach_cgroup( 31 skel->progs.get_netns_cookie_sockops, cgroup_fd); 32 if (!ASSERT_OK_PTR(skel->links.get_netns_cookie_sockops, "prog_attach")) 33 goto done; 34 35 verdict = bpf_program__fd(skel->progs.get_netns_cookie_sk_msg); 36 map = bpf_map__fd(skel->maps.sock_map); 37 err = bpf_prog_attach(verdict, map, BPF_SK_MSG_VERDICT, 0); 38 if (!ASSERT_OK(err, "prog_attach")) 39 goto done; 40 41 server_fd = start_server(AF_INET6, SOCK_STREAM, "::1", 0, 0); 42 if (CHECK(server_fd < 0, "start_server", "errno %d\n", errno)) 43 goto done; 44 45 client_fd = connect_to_fd(server_fd, 0); 46 if (CHECK(client_fd < 0, "connect_to_fd", "errno %d\n", errno)) 47 goto done; 48 49 ret = send(client_fd, send_msg, sizeof(send_msg), 0); 50 if (CHECK(ret != sizeof(send_msg), "send(msg)", "ret:%d\n", ret)) 51 goto done; 52 53 err = bpf_map_lookup_elem(bpf_map__fd(skel->maps.sockops_netns_cookies), 54 &client_fd, &val); 55 if (!ASSERT_OK(err, "map_lookup(sockops_netns_cookies)")) 56 goto done; 57 58 err = getsockopt(client_fd, SOL_SOCKET, SO_NETNS_COOKIE, 59 &cookie_expected_value, &vallen); 60 if (!ASSERT_OK(err, "getsockopt")) 61 goto done; 62 63 ASSERT_EQ(val, cookie_expected_value, "cookie_value"); 64 65 err = bpf_map_lookup_elem(bpf_map__fd(skel->maps.sk_msg_netns_cookies), 66 &client_fd, &val); 67 if (!ASSERT_OK(err, "map_lookup(sk_msg_netns_cookies)")) 68 goto done; 69 70 ASSERT_EQ(val, cookie_expected_value, "cookie_value"); 71 72 done: 73 if (server_fd != -1) 74 close(server_fd); 75 if (client_fd != -1) 76 close(client_fd); 77 if (cgroup_fd != -1) 78 close(cgroup_fd); 79 netns_cookie_prog__destroy(skel); 80 } 81