1 // SPDX-License-Identifier: GPL-2.0 2 #include <test_progs.h> 3 #include "udp_limit.skel.h" 4 5 #include <sys/types.h> 6 #include <sys/socket.h> 7 8 void test_udp_limit(void) 9 { 10 struct udp_limit *skel; 11 int fd1 = -1, fd2 = -1; 12 int cgroup_fd; 13 14 cgroup_fd = test__join_cgroup("/udp_limit"); 15 if (!ASSERT_GE(cgroup_fd, 0, "cg-join")) 16 return; 17 18 skel = udp_limit__open_and_load(); 19 if (!ASSERT_OK_PTR(skel, "skel-load")) 20 goto close_cgroup_fd; 21 22 skel->links.sock = bpf_program__attach_cgroup(skel->progs.sock, cgroup_fd); 23 if (!ASSERT_OK_PTR(skel->links.sock, "cg_attach_sock")) 24 goto close_skeleton; 25 skel->links.sock_release = bpf_program__attach_cgroup(skel->progs.sock_release, cgroup_fd); 26 if (!ASSERT_OK_PTR(skel->links.sock_release, "cg_attach_sock_release")) 27 goto close_skeleton; 28 29 /* BPF program enforces a single UDP socket per cgroup, 30 * verify that. 31 */ 32 fd1 = socket(AF_INET, SOCK_DGRAM, 0); 33 if (!ASSERT_GE(fd1, 0, "socket(fd1)")) 34 goto close_skeleton; 35 36 fd2 = socket(AF_INET, SOCK_DGRAM, 0); 37 if (!ASSERT_LT(fd2, 0, "socket(fd2)")) 38 goto close_skeleton; 39 40 /* We can reopen again after close. */ 41 close(fd1); 42 fd1 = -1; 43 44 fd1 = socket(AF_INET, SOCK_DGRAM, 0); 45 if (!ASSERT_GE(fd1, 0, "socket(fd1-again)")) 46 goto close_skeleton; 47 48 /* Make sure the program was invoked the expected 49 * number of times: 50 * - open fd1 - BPF_CGROUP_INET_SOCK_CREATE 51 * - attempt to openfd2 - BPF_CGROUP_INET_SOCK_CREATE 52 * - close fd1 - BPF_CGROUP_INET_SOCK_RELEASE 53 * - open fd1 again - BPF_CGROUP_INET_SOCK_CREATE 54 */ 55 if (!ASSERT_EQ(skel->bss->invocations, 4, "bss-invocations")) 56 goto close_skeleton; 57 58 /* We should still have a single socket in use */ 59 if (!ASSERT_EQ(skel->bss->in_use, 1, "bss-in_use")) 60 goto close_skeleton; 61 62 close_skeleton: 63 if (fd1 >= 0) 64 close(fd1); 65 if (fd2 >= 0) 66 close(fd2); 67 udp_limit__destroy(skel); 68 close_cgroup_fd: 69 close(cgroup_fd); 70 } 71