1dca85aacSStanislav Fomichev // SPDX-License-Identifier: GPL-2.0
2dca85aacSStanislav Fomichev
3dca85aacSStanislav Fomichev #include <sys/types.h>
4dca85aacSStanislav Fomichev #include <sys/socket.h>
5dca85aacSStanislav Fomichev #include <test_progs.h>
6dca85aacSStanislav Fomichev #include <bpf/btf.h>
7dca85aacSStanislav Fomichev
8dca85aacSStanislav Fomichev #include "lsm_cgroup.skel.h"
9d1a6edecSStanislav Fomichev #include "lsm_cgroup_nonvoid.skel.h"
10dca85aacSStanislav Fomichev #include "cgroup_helpers.h"
11dca85aacSStanislav Fomichev #include "network_helpers.h"
12dca85aacSStanislav Fomichev
13b0d93b44SStanislav Fomichev #ifndef ENOTSUPP
14b0d93b44SStanislav Fomichev #define ENOTSUPP 524
15b0d93b44SStanislav Fomichev #endif
16b0d93b44SStanislav Fomichev
17dca85aacSStanislav Fomichev static struct btf *btf;
18dca85aacSStanislav Fomichev
query_prog_cnt(int cgroup_fd,const char * attach_func)19dca85aacSStanislav Fomichev static __u32 query_prog_cnt(int cgroup_fd, const char *attach_func)
20dca85aacSStanislav Fomichev {
21dca85aacSStanislav Fomichev LIBBPF_OPTS(bpf_prog_query_opts, p);
22dca85aacSStanislav Fomichev int cnt = 0;
23dca85aacSStanislav Fomichev int i;
24dca85aacSStanislav Fomichev
25dca85aacSStanislav Fomichev ASSERT_OK(bpf_prog_query_opts(cgroup_fd, BPF_LSM_CGROUP, &p), "prog_query");
26dca85aacSStanislav Fomichev
27dca85aacSStanislav Fomichev if (!attach_func)
28dca85aacSStanislav Fomichev return p.prog_cnt;
29dca85aacSStanislav Fomichev
30dca85aacSStanislav Fomichev /* When attach_func is provided, count the number of progs that
31dca85aacSStanislav Fomichev * attach to the given symbol.
32dca85aacSStanislav Fomichev */
33dca85aacSStanislav Fomichev
34dca85aacSStanislav Fomichev if (!btf)
35dca85aacSStanislav Fomichev btf = btf__load_vmlinux_btf();
36dca85aacSStanislav Fomichev if (!ASSERT_OK(libbpf_get_error(btf), "btf_vmlinux"))
37dca85aacSStanislav Fomichev return -1;
38dca85aacSStanislav Fomichev
39dca85aacSStanislav Fomichev p.prog_ids = malloc(sizeof(u32) * p.prog_cnt);
40dca85aacSStanislav Fomichev p.prog_attach_flags = malloc(sizeof(u32) * p.prog_cnt);
41dca85aacSStanislav Fomichev ASSERT_OK(bpf_prog_query_opts(cgroup_fd, BPF_LSM_CGROUP, &p), "prog_query");
42dca85aacSStanislav Fomichev
43dca85aacSStanislav Fomichev for (i = 0; i < p.prog_cnt; i++) {
44dca85aacSStanislav Fomichev struct bpf_prog_info info = {};
45dca85aacSStanislav Fomichev __u32 info_len = sizeof(info);
46dca85aacSStanislav Fomichev int fd;
47dca85aacSStanislav Fomichev
48dca85aacSStanislav Fomichev fd = bpf_prog_get_fd_by_id(p.prog_ids[i]);
49dca85aacSStanislav Fomichev ASSERT_GE(fd, 0, "prog_get_fd_by_id");
50*c5a237a4SIlya Leoshkevich ASSERT_OK(bpf_prog_get_info_by_fd(fd, &info, &info_len),
51*c5a237a4SIlya Leoshkevich "prog_info_by_fd");
52dca85aacSStanislav Fomichev close(fd);
53dca85aacSStanislav Fomichev
54dca85aacSStanislav Fomichev if (info.attach_btf_id ==
55dca85aacSStanislav Fomichev btf__find_by_name_kind(btf, attach_func, BTF_KIND_FUNC))
56dca85aacSStanislav Fomichev cnt++;
57dca85aacSStanislav Fomichev }
58dca85aacSStanislav Fomichev
59dca85aacSStanislav Fomichev free(p.prog_ids);
60dca85aacSStanislav Fomichev free(p.prog_attach_flags);
61dca85aacSStanislav Fomichev
62dca85aacSStanislav Fomichev return cnt;
63dca85aacSStanislav Fomichev }
64dca85aacSStanislav Fomichev
test_lsm_cgroup_functional(void)65dca85aacSStanislav Fomichev static void test_lsm_cgroup_functional(void)
66dca85aacSStanislav Fomichev {
67dca85aacSStanislav Fomichev DECLARE_LIBBPF_OPTS(bpf_prog_attach_opts, attach_opts);
68dca85aacSStanislav Fomichev DECLARE_LIBBPF_OPTS(bpf_link_update_opts, update_opts);
69dca85aacSStanislav Fomichev int cgroup_fd = -1, cgroup_fd2 = -1, cgroup_fd3 = -1;
70dca85aacSStanislav Fomichev int listen_fd, client_fd, accepted_fd;
71dca85aacSStanislav Fomichev struct lsm_cgroup *skel = NULL;
72dca85aacSStanislav Fomichev int post_create_prog_fd2 = -1;
73dca85aacSStanislav Fomichev int post_create_prog_fd = -1;
74dca85aacSStanislav Fomichev int bind_link_fd2 = -1;
75dca85aacSStanislav Fomichev int bind_prog_fd2 = -1;
76dca85aacSStanislav Fomichev int alloc_prog_fd = -1;
77dca85aacSStanislav Fomichev int bind_prog_fd = -1;
78dca85aacSStanislav Fomichev int bind_link_fd = -1;
79dca85aacSStanislav Fomichev int clone_prog_fd = -1;
80dca85aacSStanislav Fomichev int err, fd, prio;
81dca85aacSStanislav Fomichev socklen_t socklen;
82dca85aacSStanislav Fomichev
83dca85aacSStanislav Fomichev cgroup_fd3 = test__join_cgroup("/sock_policy_empty");
84dca85aacSStanislav Fomichev if (!ASSERT_GE(cgroup_fd3, 0, "create empty cgroup"))
85dca85aacSStanislav Fomichev goto close_cgroup;
86dca85aacSStanislav Fomichev
87dca85aacSStanislav Fomichev cgroup_fd2 = test__join_cgroup("/sock_policy_reuse");
88dca85aacSStanislav Fomichev if (!ASSERT_GE(cgroup_fd2, 0, "create cgroup for reuse"))
89dca85aacSStanislav Fomichev goto close_cgroup;
90dca85aacSStanislav Fomichev
91dca85aacSStanislav Fomichev cgroup_fd = test__join_cgroup("/sock_policy");
92dca85aacSStanislav Fomichev if (!ASSERT_GE(cgroup_fd, 0, "join_cgroup"))
93dca85aacSStanislav Fomichev goto close_cgroup;
94dca85aacSStanislav Fomichev
95dca85aacSStanislav Fomichev skel = lsm_cgroup__open_and_load();
96dca85aacSStanislav Fomichev if (!ASSERT_OK_PTR(skel, "open_and_load"))
97dca85aacSStanislav Fomichev goto close_cgroup;
98dca85aacSStanislav Fomichev
99dca85aacSStanislav Fomichev post_create_prog_fd = bpf_program__fd(skel->progs.socket_post_create);
100dca85aacSStanislav Fomichev post_create_prog_fd2 = bpf_program__fd(skel->progs.socket_post_create2);
101dca85aacSStanislav Fomichev bind_prog_fd = bpf_program__fd(skel->progs.socket_bind);
102dca85aacSStanislav Fomichev bind_prog_fd2 = bpf_program__fd(skel->progs.socket_bind2);
103dca85aacSStanislav Fomichev alloc_prog_fd = bpf_program__fd(skel->progs.socket_alloc);
104dca85aacSStanislav Fomichev clone_prog_fd = bpf_program__fd(skel->progs.socket_clone);
105dca85aacSStanislav Fomichev
106dca85aacSStanislav Fomichev ASSERT_EQ(query_prog_cnt(cgroup_fd, "bpf_lsm_sk_alloc_security"), 0, "prog count");
107dca85aacSStanislav Fomichev ASSERT_EQ(query_prog_cnt(cgroup_fd, NULL), 0, "total prog count");
108dca85aacSStanislav Fomichev err = bpf_prog_attach(alloc_prog_fd, cgroup_fd, BPF_LSM_CGROUP, 0);
109b0d93b44SStanislav Fomichev if (err == -ENOTSUPP) {
110b0d93b44SStanislav Fomichev test__skip();
111b0d93b44SStanislav Fomichev goto close_cgroup;
112b0d93b44SStanislav Fomichev }
113dca85aacSStanislav Fomichev if (!ASSERT_OK(err, "attach alloc_prog_fd"))
114dca85aacSStanislav Fomichev goto detach_cgroup;
115dca85aacSStanislav Fomichev ASSERT_EQ(query_prog_cnt(cgroup_fd, "bpf_lsm_sk_alloc_security"), 1, "prog count");
116dca85aacSStanislav Fomichev ASSERT_EQ(query_prog_cnt(cgroup_fd, NULL), 1, "total prog count");
117dca85aacSStanislav Fomichev
118dca85aacSStanislav Fomichev ASSERT_EQ(query_prog_cnt(cgroup_fd, "bpf_lsm_inet_csk_clone"), 0, "prog count");
119dca85aacSStanislav Fomichev err = bpf_prog_attach(clone_prog_fd, cgroup_fd, BPF_LSM_CGROUP, 0);
120dca85aacSStanislav Fomichev if (!ASSERT_OK(err, "attach clone_prog_fd"))
121dca85aacSStanislav Fomichev goto detach_cgroup;
122dca85aacSStanislav Fomichev ASSERT_EQ(query_prog_cnt(cgroup_fd, "bpf_lsm_inet_csk_clone"), 1, "prog count");
123dca85aacSStanislav Fomichev ASSERT_EQ(query_prog_cnt(cgroup_fd, NULL), 2, "total prog count");
124dca85aacSStanislav Fomichev
125dca85aacSStanislav Fomichev /* Make sure replacing works. */
126dca85aacSStanislav Fomichev
127dca85aacSStanislav Fomichev ASSERT_EQ(query_prog_cnt(cgroup_fd, "bpf_lsm_socket_post_create"), 0, "prog count");
128dca85aacSStanislav Fomichev err = bpf_prog_attach(post_create_prog_fd, cgroup_fd,
129dca85aacSStanislav Fomichev BPF_LSM_CGROUP, 0);
130dca85aacSStanislav Fomichev if (!ASSERT_OK(err, "attach post_create_prog_fd"))
131dca85aacSStanislav Fomichev goto detach_cgroup;
132dca85aacSStanislav Fomichev ASSERT_EQ(query_prog_cnt(cgroup_fd, "bpf_lsm_socket_post_create"), 1, "prog count");
133dca85aacSStanislav Fomichev ASSERT_EQ(query_prog_cnt(cgroup_fd, NULL), 3, "total prog count");
134dca85aacSStanislav Fomichev
135dca85aacSStanislav Fomichev attach_opts.replace_prog_fd = post_create_prog_fd;
136dca85aacSStanislav Fomichev err = bpf_prog_attach_opts(post_create_prog_fd2, cgroup_fd,
137dca85aacSStanislav Fomichev BPF_LSM_CGROUP, &attach_opts);
138dca85aacSStanislav Fomichev if (!ASSERT_OK(err, "prog replace post_create_prog_fd"))
139dca85aacSStanislav Fomichev goto detach_cgroup;
140dca85aacSStanislav Fomichev ASSERT_EQ(query_prog_cnt(cgroup_fd, "bpf_lsm_socket_post_create"), 1, "prog count");
141dca85aacSStanislav Fomichev ASSERT_EQ(query_prog_cnt(cgroup_fd, NULL), 3, "total prog count");
142dca85aacSStanislav Fomichev
143dca85aacSStanislav Fomichev /* Try the same attach/replace via link API. */
144dca85aacSStanislav Fomichev
145dca85aacSStanislav Fomichev ASSERT_EQ(query_prog_cnt(cgroup_fd, "bpf_lsm_socket_bind"), 0, "prog count");
146dca85aacSStanislav Fomichev bind_link_fd = bpf_link_create(bind_prog_fd, cgroup_fd,
147dca85aacSStanislav Fomichev BPF_LSM_CGROUP, NULL);
148dca85aacSStanislav Fomichev if (!ASSERT_GE(bind_link_fd, 0, "link create bind_prog_fd"))
149dca85aacSStanislav Fomichev goto detach_cgroup;
150dca85aacSStanislav Fomichev ASSERT_EQ(query_prog_cnt(cgroup_fd, "bpf_lsm_socket_bind"), 1, "prog count");
151dca85aacSStanislav Fomichev ASSERT_EQ(query_prog_cnt(cgroup_fd, NULL), 4, "total prog count");
152dca85aacSStanislav Fomichev
153dca85aacSStanislav Fomichev update_opts.old_prog_fd = bind_prog_fd;
154dca85aacSStanislav Fomichev update_opts.flags = BPF_F_REPLACE;
155dca85aacSStanislav Fomichev
156dca85aacSStanislav Fomichev err = bpf_link_update(bind_link_fd, bind_prog_fd2, &update_opts);
157dca85aacSStanislav Fomichev if (!ASSERT_OK(err, "link update bind_prog_fd"))
158dca85aacSStanislav Fomichev goto detach_cgroup;
159dca85aacSStanislav Fomichev ASSERT_EQ(query_prog_cnt(cgroup_fd, "bpf_lsm_socket_bind"), 1, "prog count");
160dca85aacSStanislav Fomichev ASSERT_EQ(query_prog_cnt(cgroup_fd, NULL), 4, "total prog count");
161dca85aacSStanislav Fomichev
162dca85aacSStanislav Fomichev /* Attach another instance of bind program to another cgroup.
163dca85aacSStanislav Fomichev * This should trigger the reuse of the trampoline shim (two
164dca85aacSStanislav Fomichev * programs attaching to the same btf_id).
165dca85aacSStanislav Fomichev */
166dca85aacSStanislav Fomichev
167dca85aacSStanislav Fomichev ASSERT_EQ(query_prog_cnt(cgroup_fd, "bpf_lsm_socket_bind"), 1, "prog count");
168dca85aacSStanislav Fomichev ASSERT_EQ(query_prog_cnt(cgroup_fd2, "bpf_lsm_socket_bind"), 0, "prog count");
169dca85aacSStanislav Fomichev bind_link_fd2 = bpf_link_create(bind_prog_fd2, cgroup_fd2,
170dca85aacSStanislav Fomichev BPF_LSM_CGROUP, NULL);
171dca85aacSStanislav Fomichev if (!ASSERT_GE(bind_link_fd2, 0, "link create bind_prog_fd2"))
172dca85aacSStanislav Fomichev goto detach_cgroup;
173dca85aacSStanislav Fomichev ASSERT_EQ(query_prog_cnt(cgroup_fd2, "bpf_lsm_socket_bind"), 1, "prog count");
174dca85aacSStanislav Fomichev ASSERT_EQ(query_prog_cnt(cgroup_fd, NULL), 4, "total prog count");
175dca85aacSStanislav Fomichev ASSERT_EQ(query_prog_cnt(cgroup_fd2, NULL), 1, "total prog count");
176dca85aacSStanislav Fomichev
177dca85aacSStanislav Fomichev fd = socket(AF_UNIX, SOCK_STREAM, 0);
178c453e64cSWang Yufen if (!(skel->kconfig->CONFIG_SECURITY_APPARMOR
179c453e64cSWang Yufen || skel->kconfig->CONFIG_SECURITY_SELINUX
180c453e64cSWang Yufen || skel->kconfig->CONFIG_SECURITY_SMACK))
181c453e64cSWang Yufen /* AF_UNIX is prohibited. */
182dca85aacSStanislav Fomichev ASSERT_LT(fd, 0, "socket(AF_UNIX)");
183dca85aacSStanislav Fomichev close(fd);
184dca85aacSStanislav Fomichev
185dca85aacSStanislav Fomichev /* AF_INET6 gets default policy (sk_priority). */
186dca85aacSStanislav Fomichev
187dca85aacSStanislav Fomichev fd = socket(AF_INET6, SOCK_STREAM, 0);
188dca85aacSStanislav Fomichev if (!ASSERT_GE(fd, 0, "socket(SOCK_STREAM)"))
189dca85aacSStanislav Fomichev goto detach_cgroup;
190dca85aacSStanislav Fomichev
191dca85aacSStanislav Fomichev prio = 0;
192dca85aacSStanislav Fomichev socklen = sizeof(prio);
193dca85aacSStanislav Fomichev ASSERT_GE(getsockopt(fd, SOL_SOCKET, SO_PRIORITY, &prio, &socklen), 0,
194dca85aacSStanislav Fomichev "getsockopt");
195dca85aacSStanislav Fomichev ASSERT_EQ(prio, 123, "sk_priority");
196dca85aacSStanislav Fomichev
197dca85aacSStanislav Fomichev close(fd);
198dca85aacSStanislav Fomichev
199dca85aacSStanislav Fomichev /* TX-only AF_PACKET is allowed. */
200dca85aacSStanislav Fomichev
201dca85aacSStanislav Fomichev ASSERT_LT(socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL)), 0,
202dca85aacSStanislav Fomichev "socket(AF_PACKET, ..., ETH_P_ALL)");
203dca85aacSStanislav Fomichev
204dca85aacSStanislav Fomichev fd = socket(AF_PACKET, SOCK_RAW, 0);
205dca85aacSStanislav Fomichev ASSERT_GE(fd, 0, "socket(AF_PACKET, ..., 0)");
206dca85aacSStanislav Fomichev
207dca85aacSStanislav Fomichev /* TX-only AF_PACKET can not be rebound. */
208dca85aacSStanislav Fomichev
209dca85aacSStanislav Fomichev struct sockaddr_ll sa = {
210dca85aacSStanislav Fomichev .sll_family = AF_PACKET,
211dca85aacSStanislav Fomichev .sll_protocol = htons(ETH_P_ALL),
212dca85aacSStanislav Fomichev };
213dca85aacSStanislav Fomichev ASSERT_LT(bind(fd, (struct sockaddr *)&sa, sizeof(sa)), 0,
214dca85aacSStanislav Fomichev "bind(ETH_P_ALL)");
215dca85aacSStanislav Fomichev
216dca85aacSStanislav Fomichev close(fd);
217dca85aacSStanislav Fomichev
218dca85aacSStanislav Fomichev /* Trigger passive open. */
219dca85aacSStanislav Fomichev
220dca85aacSStanislav Fomichev listen_fd = start_server(AF_INET6, SOCK_STREAM, "::1", 0, 0);
221dca85aacSStanislav Fomichev ASSERT_GE(listen_fd, 0, "start_server");
222dca85aacSStanislav Fomichev client_fd = connect_to_fd(listen_fd, 0);
223dca85aacSStanislav Fomichev ASSERT_GE(client_fd, 0, "connect_to_fd");
224dca85aacSStanislav Fomichev accepted_fd = accept(listen_fd, NULL, NULL);
225dca85aacSStanislav Fomichev ASSERT_GE(accepted_fd, 0, "accept");
226dca85aacSStanislav Fomichev
227dca85aacSStanislav Fomichev prio = 0;
228dca85aacSStanislav Fomichev socklen = sizeof(prio);
229dca85aacSStanislav Fomichev ASSERT_GE(getsockopt(accepted_fd, SOL_SOCKET, SO_PRIORITY, &prio, &socklen), 0,
230dca85aacSStanislav Fomichev "getsockopt");
231dca85aacSStanislav Fomichev ASSERT_EQ(prio, 234, "sk_priority");
232dca85aacSStanislav Fomichev
233dca85aacSStanislav Fomichev /* These are replaced and never called. */
234dca85aacSStanislav Fomichev ASSERT_EQ(skel->bss->called_socket_post_create, 0, "called_create");
235dca85aacSStanislav Fomichev ASSERT_EQ(skel->bss->called_socket_bind, 0, "called_bind");
236dca85aacSStanislav Fomichev
237dca85aacSStanislav Fomichev /* AF_INET6+SOCK_STREAM
238dca85aacSStanislav Fomichev * AF_PACKET+SOCK_RAW
239c453e64cSWang Yufen * AF_UNIX+SOCK_RAW if already have non-bpf lsms installed
240dca85aacSStanislav Fomichev * listen_fd
241dca85aacSStanislav Fomichev * client_fd
242dca85aacSStanislav Fomichev * accepted_fd
243dca85aacSStanislav Fomichev */
244c453e64cSWang Yufen if (skel->kconfig->CONFIG_SECURITY_APPARMOR
245c453e64cSWang Yufen || skel->kconfig->CONFIG_SECURITY_SELINUX
246c453e64cSWang Yufen || skel->kconfig->CONFIG_SECURITY_SMACK)
247c453e64cSWang Yufen /* AF_UNIX+SOCK_RAW if already have non-bpf lsms installed */
248c453e64cSWang Yufen ASSERT_EQ(skel->bss->called_socket_post_create2, 6, "called_create2");
249c453e64cSWang Yufen else
250dca85aacSStanislav Fomichev ASSERT_EQ(skel->bss->called_socket_post_create2, 5, "called_create2");
251dca85aacSStanislav Fomichev
252dca85aacSStanislav Fomichev /* start_server
253dca85aacSStanislav Fomichev * bind(ETH_P_ALL)
254dca85aacSStanislav Fomichev */
255dca85aacSStanislav Fomichev ASSERT_EQ(skel->bss->called_socket_bind2, 2, "called_bind2");
256dca85aacSStanislav Fomichev /* Single accept(). */
257dca85aacSStanislav Fomichev ASSERT_EQ(skel->bss->called_socket_clone, 1, "called_clone");
258dca85aacSStanislav Fomichev
259dca85aacSStanislav Fomichev /* AF_UNIX+SOCK_STREAM (failed)
260dca85aacSStanislav Fomichev * AF_INET6+SOCK_STREAM
261dca85aacSStanislav Fomichev * AF_PACKET+SOCK_RAW (failed)
262dca85aacSStanislav Fomichev * AF_PACKET+SOCK_RAW
263dca85aacSStanislav Fomichev * listen_fd
264dca85aacSStanislav Fomichev * client_fd
265dca85aacSStanislav Fomichev * accepted_fd
266dca85aacSStanislav Fomichev */
267dca85aacSStanislav Fomichev ASSERT_EQ(skel->bss->called_socket_alloc, 7, "called_alloc");
268dca85aacSStanislav Fomichev
269dca85aacSStanislav Fomichev close(listen_fd);
270dca85aacSStanislav Fomichev close(client_fd);
271dca85aacSStanislav Fomichev close(accepted_fd);
272dca85aacSStanislav Fomichev
273dca85aacSStanislav Fomichev /* Make sure other cgroup doesn't trigger the programs. */
274dca85aacSStanislav Fomichev
275dca85aacSStanislav Fomichev if (!ASSERT_OK(join_cgroup("/sock_policy_empty"), "join root cgroup"))
276dca85aacSStanislav Fomichev goto detach_cgroup;
277dca85aacSStanislav Fomichev
278dca85aacSStanislav Fomichev fd = socket(AF_INET6, SOCK_STREAM, 0);
279dca85aacSStanislav Fomichev if (!ASSERT_GE(fd, 0, "socket(SOCK_STREAM)"))
280dca85aacSStanislav Fomichev goto detach_cgroup;
281dca85aacSStanislav Fomichev
282dca85aacSStanislav Fomichev prio = 0;
283dca85aacSStanislav Fomichev socklen = sizeof(prio);
284dca85aacSStanislav Fomichev ASSERT_GE(getsockopt(fd, SOL_SOCKET, SO_PRIORITY, &prio, &socklen), 0,
285dca85aacSStanislav Fomichev "getsockopt");
286dca85aacSStanislav Fomichev ASSERT_EQ(prio, 0, "sk_priority");
287dca85aacSStanislav Fomichev
288dca85aacSStanislav Fomichev close(fd);
289dca85aacSStanislav Fomichev
290dca85aacSStanislav Fomichev detach_cgroup:
291dca85aacSStanislav Fomichev ASSERT_GE(bpf_prog_detach2(post_create_prog_fd2, cgroup_fd,
292dca85aacSStanislav Fomichev BPF_LSM_CGROUP), 0, "detach_create");
293dca85aacSStanislav Fomichev close(bind_link_fd);
294dca85aacSStanislav Fomichev /* Don't close bind_link_fd2, exercise cgroup release cleanup. */
295dca85aacSStanislav Fomichev ASSERT_GE(bpf_prog_detach2(alloc_prog_fd, cgroup_fd,
296dca85aacSStanislav Fomichev BPF_LSM_CGROUP), 0, "detach_alloc");
297dca85aacSStanislav Fomichev ASSERT_GE(bpf_prog_detach2(clone_prog_fd, cgroup_fd,
298dca85aacSStanislav Fomichev BPF_LSM_CGROUP), 0, "detach_clone");
299dca85aacSStanislav Fomichev
300dca85aacSStanislav Fomichev close_cgroup:
301dca85aacSStanislav Fomichev close(cgroup_fd);
302dca85aacSStanislav Fomichev close(cgroup_fd2);
303dca85aacSStanislav Fomichev close(cgroup_fd3);
304dca85aacSStanislav Fomichev lsm_cgroup__destroy(skel);
305dca85aacSStanislav Fomichev }
306dca85aacSStanislav Fomichev
test_lsm_cgroup_nonvoid(void)307d1a6edecSStanislav Fomichev static void test_lsm_cgroup_nonvoid(void)
308d1a6edecSStanislav Fomichev {
309d1a6edecSStanislav Fomichev struct lsm_cgroup_nonvoid *skel = NULL;
310d1a6edecSStanislav Fomichev
311d1a6edecSStanislav Fomichev skel = lsm_cgroup_nonvoid__open_and_load();
312d1a6edecSStanislav Fomichev ASSERT_NULL(skel, "open succeeds");
313d1a6edecSStanislav Fomichev lsm_cgroup_nonvoid__destroy(skel);
314d1a6edecSStanislav Fomichev }
315d1a6edecSStanislav Fomichev
test_lsm_cgroup(void)316dca85aacSStanislav Fomichev void test_lsm_cgroup(void)
317dca85aacSStanislav Fomichev {
318dca85aacSStanislav Fomichev if (test__start_subtest("functional"))
319dca85aacSStanislav Fomichev test_lsm_cgroup_functional();
320d1a6edecSStanislav Fomichev if (test__start_subtest("nonvoid"))
321d1a6edecSStanislav Fomichev test_lsm_cgroup_nonvoid();
322dca85aacSStanislav Fomichev btf__free(btf);
323dca85aacSStanislav Fomichev }
324