ret = bpf_tc_hook_create(NULL); if (!ASSERT_EQ(ret, -EINVAL, "bpf_tc_hook_create invalid hook = NULL")) return -EINVAL;
/* hook ifindex = 0 */
ret = bpf_tc_hook_create(&inv_hook); if (!ASSERT_EQ(ret, -EINVAL, "bpf_tc_hook_create invalid hook ifindex == 0")) return -EINVAL;
ret = bpf_tc_hook_destroy(&inv_hook); if (!ASSERT_EQ(ret, -EINVAL, "bpf_tc_hook_destroy invalid hook ifindex == 0")) return -EINVAL;
ret = bpf_tc_attach(&inv_hook, &attach_opts); if (!ASSERT_EQ(ret, -EINVAL, "bpf_tc_attach invalid hook ifindex == 0")) return -EINVAL;
attach_opts.prog_id = 0;
ret = bpf_tc_detach(&inv_hook, &opts); if (!ASSERT_EQ(ret, -EINVAL, "bpf_tc_detach invalid hook ifindex == 0")) return -EINVAL;
ret = bpf_tc_query(&inv_hook, &opts); if (!ASSERT_EQ(ret, -EINVAL, "bpf_tc_query invalid hook ifindex == 0")) return -EINVAL;
/* hook ifindex < 0 */
inv_hook.ifindex = -1;
ret = bpf_tc_hook_create(&inv_hook); if (!ASSERT_EQ(ret, -EINVAL, "bpf_tc_hook_create invalid hook ifindex < 0")) return -EINVAL;
ret = bpf_tc_hook_destroy(&inv_hook); if (!ASSERT_EQ(ret, -EINVAL, "bpf_tc_hook_destroy invalid hook ifindex < 0")) return -EINVAL;
ret = bpf_tc_attach(&inv_hook, &attach_opts); if (!ASSERT_EQ(ret, -EINVAL, "bpf_tc_attach invalid hook ifindex < 0")) return -EINVAL;
attach_opts.prog_id = 0;
ret = bpf_tc_detach(&inv_hook, &opts); if (!ASSERT_EQ(ret, -EINVAL, "bpf_tc_detach invalid hook ifindex < 0")) return -EINVAL;
ret = bpf_tc_query(&inv_hook, &opts); if (!ASSERT_EQ(ret, -EINVAL, "bpf_tc_query invalid hook ifindex < 0")) return -EINVAL;
inv_hook.ifindex = LO_IFINDEX;
/* hook.attach_point invalid */
inv_hook.attach_point = 0xabcd;
ret = bpf_tc_hook_create(&inv_hook); if (!ASSERT_EQ(ret, -EINVAL, "bpf_tc_hook_create invalid hook.attach_point")) return -EINVAL;
ret = bpf_tc_hook_destroy(&inv_hook); if (!ASSERT_EQ(ret, -EINVAL, "bpf_tc_hook_destroy invalid hook.attach_point")) return -EINVAL;
ret = bpf_tc_attach(&inv_hook, &attach_opts); if (!ASSERT_EQ(ret, -EINVAL, "bpf_tc_attach invalid hook.attach_point")) return -EINVAL;
ret = bpf_tc_detach(&inv_hook, &opts); if (!ASSERT_EQ(ret, -EINVAL, "bpf_tc_detach invalid hook.attach_point")) return -EINVAL;
ret = bpf_tc_query(&inv_hook, &opts); if (!ASSERT_EQ(ret, -EINVAL, "bpf_tc_query invalid hook.attach_point")) return -EINVAL;
inv_hook.attach_point = BPF_TC_INGRESS;
/* hook.attach_point valid, but parent invalid */
inv_hook.parent = TC_H_MAKE(1UL << 16, 10);
ret = bpf_tc_hook_create(&inv_hook); if (!ASSERT_EQ(ret, -EINVAL, "bpf_tc_hook_create invalid hook parent")) return -EINVAL;
ret = bpf_tc_hook_destroy(&inv_hook); if (!ASSERT_EQ(ret, -EINVAL, "bpf_tc_hook_destroy invalid hook parent")) return -EINVAL;
ret = bpf_tc_attach(&inv_hook, &attach_opts); if (!ASSERT_EQ(ret, -EINVAL, "bpf_tc_attach invalid hook parent")) return -EINVAL;
ret = bpf_tc_detach(&inv_hook, &opts); if (!ASSERT_EQ(ret, -EINVAL, "bpf_tc_detach invalid hook parent")) return -EINVAL;
ret = bpf_tc_query(&inv_hook, &opts); if (!ASSERT_EQ(ret, -EINVAL, "bpf_tc_query invalid hook parent")) return -EINVAL;
inv_hook.attach_point = BPF_TC_CUSTOM;
inv_hook.parent = 0; /* These return EOPNOTSUPP instead of EINVAL as parent is checked after * attach_point of the hook.
*/
ret = bpf_tc_hook_create(&inv_hook); if (!ASSERT_EQ(ret, -EOPNOTSUPP, "bpf_tc_hook_create invalid hook parent")) return -EINVAL;
ret = bpf_tc_hook_destroy(&inv_hook); if (!ASSERT_EQ(ret, -EOPNOTSUPP, "bpf_tc_hook_destroy invalid hook parent")) return -EINVAL;
ret = bpf_tc_attach(&inv_hook, &attach_opts); if (!ASSERT_EQ(ret, -EINVAL, "bpf_tc_attach invalid hook parent")) return -EINVAL;
ret = bpf_tc_detach(&inv_hook, &opts); if (!ASSERT_EQ(ret, -EINVAL, "bpf_tc_detach invalid hook parent")) return -EINVAL;
ret = bpf_tc_query(&inv_hook, &opts); if (!ASSERT_EQ(ret, -EINVAL, "bpf_tc_query invalid hook parent")) return -EINVAL;
inv_hook.attach_point = BPF_TC_INGRESS;
/* detach */
{
TEST_DECLARE_OPTS(fd);
ret = bpf_tc_detach(NULL, &opts_hp); if (!ASSERT_EQ(ret, -EINVAL, "bpf_tc_detach invalid hook = NULL")) return -EINVAL;
ret = bpf_tc_detach(hook, NULL); if (!ASSERT_EQ(ret, -EINVAL, "bpf_tc_detach invalid opts = NULL")) return -EINVAL;
ret = bpf_tc_detach(hook, &opts_hpr); if (!ASSERT_EQ(ret, -EINVAL, "bpf_tc_detach invalid flags set")) return -EINVAL;
ret = bpf_tc_detach(hook, &opts_hpf); if (!ASSERT_EQ(ret, -EINVAL, "bpf_tc_detach invalid prog_fd set")) return -EINVAL;
ret = bpf_tc_detach(hook, &opts_hpi); if (!ASSERT_EQ(ret, -EINVAL, "bpf_tc_detach invalid prog_id set")) return -EINVAL;
ret = bpf_tc_detach(hook, &opts_p); if (!ASSERT_EQ(ret, -EINVAL, "bpf_tc_detach invalid handle unset")) return -EINVAL;
ret = bpf_tc_detach(hook, &opts_h); if (!ASSERT_EQ(ret, -EINVAL, "bpf_tc_detach invalid priority unset")) return -EINVAL;
ret = bpf_tc_detach(hook, &opts_prio_max); if (!ASSERT_EQ(ret, -EINVAL, "bpf_tc_detach invalid priority > UINT16_MAX")) return -EINVAL;
}
/* query */
{
TEST_DECLARE_OPTS(fd);
ret = bpf_tc_query(NULL, &opts); if (!ASSERT_EQ(ret, -EINVAL, "bpf_tc_query invalid hook = NULL")) return -EINVAL;
ret = bpf_tc_query(hook, NULL); if (!ASSERT_EQ(ret, -EINVAL, "bpf_tc_query invalid opts = NULL")) return -EINVAL;
ret = bpf_tc_query(hook, &opts_hpr); if (!ASSERT_EQ(ret, -EINVAL, "bpf_tc_query invalid flags set")) return -EINVAL;
ret = bpf_tc_query(hook, &opts_hpf); if (!ASSERT_EQ(ret, -EINVAL, "bpf_tc_query invalid prog_fd set")) return -EINVAL;
ret = bpf_tc_query(hook, &opts_hpi); if (!ASSERT_EQ(ret, -EINVAL, "bpf_tc_query invalid prog_id set")) return -EINVAL;
ret = bpf_tc_query(hook, &opts_p); if (!ASSERT_EQ(ret, -EINVAL, "bpf_tc_query invalid handle unset")) return -EINVAL;
ret = bpf_tc_query(hook, &opts_h); if (!ASSERT_EQ(ret, -EINVAL, "bpf_tc_query invalid priority unset")) return -EINVAL;
ret = bpf_tc_query(hook, &opts_prio_max); if (!ASSERT_EQ(ret, -EINVAL, "bpf_tc_query invalid priority > UINT16_MAX")) return -EINVAL;
/* when chain is not present, kernel returns -EINVAL */
ret = bpf_tc_query(hook, &opts_hp); if (!ASSERT_EQ(ret, -EINVAL, "bpf_tc_query valid handle, priority set")) return -EINVAL;
}
/* attach */
{
TEST_DECLARE_OPTS(fd);
ret = bpf_tc_attach(NULL, &opts_hp); if (!ASSERT_EQ(ret, -EINVAL, "bpf_tc_attach invalid hook = NULL")) return -EINVAL;
ret = bpf_tc_attach(hook, NULL); if (!ASSERT_EQ(ret, -EINVAL, "bpf_tc_attach invalid opts = NULL")) return -EINVAL;
opts_hp.flags = 42;
ret = bpf_tc_attach(hook, &opts_hp); if (!ASSERT_EQ(ret, -EINVAL, "bpf_tc_attach invalid flags")) return -EINVAL;
ret = bpf_tc_attach(hook, NULL); if (!ASSERT_EQ(ret, -EINVAL, "bpf_tc_attach invalid prog_fd unset")) return -EINVAL;
ret = bpf_tc_attach(hook, &opts_hpi); if (!ASSERT_EQ(ret, -EINVAL, "bpf_tc_attach invalid prog_id set")) return -EINVAL;
ret = bpf_tc_attach(hook, &opts_pf); if (!ASSERT_OK(ret, "bpf_tc_attach valid handle unset")) return -EINVAL;
opts_pf.prog_fd = opts_pf.prog_id = 0;
ASSERT_OK(bpf_tc_detach(hook, &opts_pf), "bpf_tc_detach");
ret = bpf_tc_attach(hook, &opts_hf); if (!ASSERT_OK(ret, "bpf_tc_attach valid priority unset")) return -EINVAL;
opts_hf.prog_fd = opts_hf.prog_id = 0;
ASSERT_OK(bpf_tc_detach(hook, &opts_hf), "bpf_tc_detach");
ret = bpf_tc_attach(hook, &opts_prio_max); if (!ASSERT_EQ(ret, -EINVAL, "bpf_tc_attach invalid priority > UINT16_MAX")) return -EINVAL;
ret = bpf_tc_attach(hook, &opts_f); if (!ASSERT_OK(ret, "bpf_tc_attach valid both handle and priority unset")) return -EINVAL;
opts_f.prog_fd = opts_f.prog_id = 0;
ASSERT_OK(bpf_tc_detach(hook, &opts_f), "bpf_tc_detach");
}
/* In case CAP_BPF and CAP_PERFMON is not set */
ret = cap_enable_effective(1ULL << CAP_BPF | 1ULL << CAP_NET_ADMIN, &caps); if (!ASSERT_OK(ret, "set_cap_bpf_cap_net_admin")) return;
ret = cap_disable_effective(1ULL << CAP_SYS_ADMIN | 1ULL << CAP_PERFMON, NULL); if (!ASSERT_OK(ret, "disable_cap_sys_admin")) goto restore_cap;
skel = test_tc_bpf__open_and_load(); if (!ASSERT_OK_PTR(skel, "test_tc_bpf__open_and_load")) goto restore_cap;
test_tc_bpf__destroy(skel);
restore_cap: if (caps)
cap_enable_effective(caps, NULL);
}
void test_tc_bpf(void)
{ if (test__start_subtest("tc_bpf_root"))
tc_bpf_root(); if (test__start_subtest("tc_bpf_non_root"))
tc_bpf_non_root();
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.