Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v6.19-rc2 77 lines 2.3 kB view raw
1// SPDX-License-Identifier: GPL-2.0 2/* Copyright (c) 2025 Meta Platforms, Inc. and affiliates. */ 3#include <test_progs.h> 4#include "cgroup_helpers.h" 5#include "cgroup_preorder.skel.h" 6 7static int run_getsockopt_test(int cg_parent, int sock_fd, bool has_relative_fd) 8{ 9 LIBBPF_OPTS(bpf_prog_attach_opts, opts); 10 enum bpf_attach_type prog_p_atype, prog_p2_atype; 11 int prog_p_fd, prog_p2_fd; 12 struct cgroup_preorder *skel = NULL; 13 struct bpf_program *prog; 14 __u8 *result, buf; 15 socklen_t optlen = 1; 16 int err = 0; 17 18 skel = cgroup_preorder__open_and_load(); 19 if (!ASSERT_OK_PTR(skel, "cgroup_preorder__open_and_load")) 20 return 0; 21 22 LIBBPF_OPTS_RESET(opts); 23 opts.flags = BPF_F_ALLOW_MULTI; 24 prog = skel->progs.parent; 25 prog_p_fd = bpf_program__fd(prog); 26 prog_p_atype = bpf_program__expected_attach_type(prog); 27 err = bpf_prog_attach_opts(prog_p_fd, cg_parent, prog_p_atype, &opts); 28 if (!ASSERT_OK(err, "bpf_prog_attach_opts-parent")) 29 goto close_skel; 30 31 opts.flags = BPF_F_ALLOW_MULTI | BPF_F_BEFORE; 32 if (has_relative_fd) 33 opts.relative_fd = prog_p_fd; 34 prog = skel->progs.parent_2; 35 prog_p2_fd = bpf_program__fd(prog); 36 prog_p2_atype = bpf_program__expected_attach_type(prog); 37 err = bpf_prog_attach_opts(prog_p2_fd, cg_parent, prog_p2_atype, &opts); 38 if (!ASSERT_OK(err, "bpf_prog_attach_opts-parent_2")) 39 goto detach_parent; 40 41 err = getsockopt(sock_fd, SOL_IP, IP_TOS, &buf, &optlen); 42 if (!ASSERT_OK(err, "getsockopt")) 43 goto detach_parent_2; 44 45 result = skel->bss->result; 46 ASSERT_TRUE(result[0] == 4 && result[1] == 3, "result values"); 47 48detach_parent_2: 49 ASSERT_OK(bpf_prog_detach2(prog_p2_fd, cg_parent, prog_p2_atype), 50 "bpf_prog_detach2-parent_2"); 51detach_parent: 52 ASSERT_OK(bpf_prog_detach2(prog_p_fd, cg_parent, prog_p_atype), 53 "bpf_prog_detach2-parent"); 54close_skel: 55 cgroup_preorder__destroy(skel); 56 return err; 57} 58 59void test_cgroup_mprog_ordering(void) 60{ 61 int cg_parent = -1, sock_fd = -1; 62 63 cg_parent = test__join_cgroup("/parent"); 64 if (!ASSERT_GE(cg_parent, 0, "join_cgroup /parent")) 65 goto out; 66 67 sock_fd = socket(AF_INET, SOCK_STREAM, 0); 68 if (!ASSERT_GE(sock_fd, 0, "socket")) 69 goto out; 70 71 ASSERT_OK(run_getsockopt_test(cg_parent, sock_fd, false), "getsockopt_test_1"); 72 ASSERT_OK(run_getsockopt_test(cg_parent, sock_fd, true), "getsockopt_test_2"); 73 74out: 75 close(sock_fd); 76 close(cg_parent); 77}