BPF_TCX_EGRESS
case BPF_TCX_EGRESS:
attach_type != BPF_TCX_EGRESS &&
attr->attach_type == BPF_TCX_EGRESS)
attr->attach_type == BPF_TCX_EGRESS)
case BPF_TCX_EGRESS:
attr->link_create.attach_type == BPF_TCX_EGRESS)
__show_dev_tc_bpf(dev, BPF_TCX_EGRESS);
return BPF_TCX_EGRESS;
[BPF_TCX_EGRESS] = "tcx/egress",
case BPF_TCX_EGRESS:
[BPF_TCX_EGRESS] = "tcx_egress",
SEC_DEF("tc/egress", SCHED_CLS, BPF_TCX_EGRESS, SEC_NONE), /* alias for tcx */
SEC_DEF("tcx/egress", SCHED_CLS, BPF_TCX_EGRESS, SEC_NONE),
assert_mprog_count(BPF_TCX_EGRESS, 0);
test_tc_links_invalid_target(BPF_TCX_EGRESS);
test_tc_links_prepend_target(BPF_TCX_EGRESS);
test_tc_links_append_target(BPF_TCX_EGRESS);
test_tc_links_dev_cleanup_target(BPF_TCX_EGRESS);
test_tc_chain_mixed(BPF_TCX_EGRESS);
test_tc_links_dev_mixed(BPF_TCX_EGRESS);
test_tc_links_before_target(BPF_TCX_EGRESS);
assert_mprog_count(BPF_TCX_EGRESS, 0);
test_tc_links_after_target(BPF_TCX_EGRESS);
assert_mprog_count(BPF_TCX_EGRESS, 0);
test_tc_links_revision_target(BPF_TCX_EGRESS);
test_tc_chain_classic(BPF_TCX_EGRESS, false);
test_tc_chain_classic(BPF_TCX_EGRESS, true);
test_tc_links_replace_target(BPF_TCX_EGRESS);
assert_mprog_count(BPF_TCX_EGRESS, 1);
err = bpf_prog_query_opts(loopback, BPF_TCX_EGRESS, &optq);
test_tc_opts_invalid_target(BPF_TCX_EGRESS);
assert_mprog_count(BPF_TCX_EGRESS, 0);
test_tc_opts_prepend_target(BPF_TCX_EGRESS);
test_tc_opts_append_target(BPF_TCX_EGRESS);
test_tc_opts_dev_cleanup_target(BPF_TCX_EGRESS);
test_tc_opts_mixed_target(BPF_TCX_EGRESS);
test_tc_opts_demixed_target(BPF_TCX_EGRESS);
test_tc_opts_detach_target(BPF_TCX_EGRESS);
test_tc_opts_detach_before_target(BPF_TCX_EGRESS);
test_tc_opts_detach_after_target(BPF_TCX_EGRESS);
test_tc_opts_delete_empty(BPF_TCX_EGRESS, false);
test_tc_opts_delete_empty(BPF_TCX_EGRESS, true);
test_tc_chain_mixed(BPF_TCX_EGRESS);
test_tc_opts_max_target(BPF_TCX_EGRESS, 0, false);
test_tc_opts_max_target(BPF_TCX_EGRESS, BPF_F_BEFORE, true);
test_tc_opts_max_target(BPF_TCX_EGRESS, BPF_F_AFTER, false);
test_tc_opts_before_target(BPF_TCX_EGRESS);
test_tc_opts_query_target(BPF_TCX_EGRESS);
test_tc_opts_query_attach_target(BPF_TCX_EGRESS);
assert_mprog_count(BPF_TCX_EGRESS, 0);
test_tc_opts_after_target(BPF_TCX_EGRESS);
assert_mprog_count(BPF_TCX_EGRESS, 0);
test_tc_opts_revision_target(BPF_TCX_EGRESS);
test_tc_chain_classic(BPF_TCX_EGRESS, false);
test_tc_chain_classic(BPF_TCX_EGRESS, true);
err = bpf_prog_attach_opts(fd2, loopback, BPF_TCX_EGRESS, &opta);
assert_mprog_count(BPF_TCX_EGRESS, 1);
err = bpf_prog_query_opts(loopback, BPF_TCX_EGRESS, &optq);
test_tc_opts_replace_target(BPF_TCX_EGRESS);
err = bpf_prog_detach_opts(fd2, loopback, BPF_TCX_EGRESS, &optd);
assert_mprog_count(BPF_TCX_EGRESS, 0);