149 lines · c
1// SPDX-License-Identifier: GPL-2.02 3#include <test_progs.h>4 5#include "cgroup_helpers.h"6 7#define FOO "/foo"8#define BAR "/foo/bar/"9#define PING_CMD "ping -q -c1 -w1 127.0.0.1 > /dev/null"10 11static char bpf_log_buf[BPF_LOG_BUF_SIZE];12 13static int prog_load(int verdict)14{15 struct bpf_insn prog[] = {16 BPF_MOV64_IMM(BPF_REG_0, verdict), /* r0 = verdict */17 BPF_EXIT_INSN(),18 };19 size_t insns_cnt = ARRAY_SIZE(prog);20 21 return bpf_test_load_program(BPF_PROG_TYPE_CGROUP_SKB,22 prog, insns_cnt, "GPL", 0,23 bpf_log_buf, BPF_LOG_BUF_SIZE);24}25 26void serial_test_cgroup_attach_override(void)27{28 int drop_prog = -1, allow_prog = -1, foo = -1, bar = -1;29 __u32 duration = 0;30 31 allow_prog = prog_load(1);32 if (CHECK(allow_prog < 0, "prog_load_allow",33 "verifier output:\n%s\n-------\n", bpf_log_buf))34 goto err;35 36 drop_prog = prog_load(0);37 if (CHECK(drop_prog < 0, "prog_load_drop",38 "verifier output:\n%s\n-------\n", bpf_log_buf))39 goto err;40 41 foo = test__join_cgroup(FOO);42 if (CHECK(foo < 0, "cgroup_join_foo", "cgroup setup failed\n"))43 goto err;44 45 if (CHECK(bpf_prog_attach(drop_prog, foo, BPF_CGROUP_INET_EGRESS,46 BPF_F_ALLOW_OVERRIDE),47 "prog_attach_drop_foo_override",48 "attach prog to %s failed, errno=%d\n", FOO, errno))49 goto err;50 51 if (CHECK(!system(PING_CMD), "ping_fail",52 "ping unexpectedly succeeded\n"))53 goto err;54 55 bar = test__join_cgroup(BAR);56 if (CHECK(bar < 0, "cgroup_join_bar", "cgroup setup failed\n"))57 goto err;58 59 if (CHECK(!system(PING_CMD), "ping_fail",60 "ping unexpectedly succeeded\n"))61 goto err;62 63 if (CHECK(bpf_prog_attach(allow_prog, bar, BPF_CGROUP_INET_EGRESS,64 BPF_F_ALLOW_OVERRIDE),65 "prog_attach_allow_bar_override",66 "attach prog to %s failed, errno=%d\n", BAR, errno))67 goto err;68 69 if (CHECK(system(PING_CMD), "ping_ok", "ping failed\n"))70 goto err;71 72 if (CHECK(bpf_prog_detach(bar, BPF_CGROUP_INET_EGRESS),73 "prog_detach_bar",74 "detach prog from %s failed, errno=%d\n", BAR, errno))75 goto err;76 77 if (CHECK(!system(PING_CMD), "ping_fail",78 "ping unexpectedly succeeded\n"))79 goto err;80 81 if (CHECK(bpf_prog_attach(allow_prog, bar, BPF_CGROUP_INET_EGRESS,82 BPF_F_ALLOW_OVERRIDE),83 "prog_attach_allow_bar_override",84 "attach prog to %s failed, errno=%d\n", BAR, errno))85 goto err;86 87 if (CHECK(bpf_prog_detach(foo, BPF_CGROUP_INET_EGRESS),88 "prog_detach_foo",89 "detach prog from %s failed, errno=%d\n", FOO, errno))90 goto err;91 92 if (CHECK(system(PING_CMD), "ping_ok", "ping failed\n"))93 goto err;94 95 if (CHECK(bpf_prog_attach(allow_prog, bar, BPF_CGROUP_INET_EGRESS,96 BPF_F_ALLOW_OVERRIDE),97 "prog_attach_allow_bar_override",98 "attach prog to %s failed, errno=%d\n", BAR, errno))99 goto err;100 101 if (CHECK(!bpf_prog_attach(allow_prog, bar, BPF_CGROUP_INET_EGRESS, 0),102 "fail_prog_attach_allow_bar_none",103 "attach prog to %s unexpectedly succeeded\n", BAR))104 goto err;105 106 if (CHECK(bpf_prog_detach(bar, BPF_CGROUP_INET_EGRESS),107 "prog_detach_bar",108 "detach prog from %s failed, errno=%d\n", BAR, errno))109 goto err;110 111 if (CHECK(!bpf_prog_detach(foo, BPF_CGROUP_INET_EGRESS),112 "fail_prog_detach_foo",113 "double detach from %s unexpectedly succeeded\n", FOO))114 goto err;115 116 if (CHECK(bpf_prog_attach(allow_prog, foo, BPF_CGROUP_INET_EGRESS, 0),117 "prog_attach_allow_foo_none",118 "attach prog to %s failed, errno=%d\n", FOO, errno))119 goto err;120 121 if (CHECK(!bpf_prog_attach(allow_prog, bar, BPF_CGROUP_INET_EGRESS, 0),122 "fail_prog_attach_allow_bar_none",123 "attach prog to %s unexpectedly succeeded\n", BAR))124 goto err;125 126 if (CHECK(!bpf_prog_attach(allow_prog, bar, BPF_CGROUP_INET_EGRESS,127 BPF_F_ALLOW_OVERRIDE),128 "fail_prog_attach_allow_bar_override",129 "attach prog to %s unexpectedly succeeded\n", BAR))130 goto err;131 132 if (CHECK(!bpf_prog_attach(allow_prog, foo, BPF_CGROUP_INET_EGRESS,133 BPF_F_ALLOW_OVERRIDE),134 "fail_prog_attach_allow_foo_override",135 "attach prog to %s unexpectedly succeeded\n", FOO))136 goto err;137 138 if (CHECK(bpf_prog_attach(drop_prog, foo, BPF_CGROUP_INET_EGRESS, 0),139 "prog_attach_drop_foo_none",140 "attach prog to %s failed, errno=%d\n", FOO, errno))141 goto err;142 143err:144 close(foo);145 close(bar);146 close(allow_prog);147 close(drop_prog);148}149