]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
selftests/bpf: Test query on empty mprog and pass revision into attach
authorDaniel Borkmann <daniel@iogearbox.net>
Fri, 6 Oct 2023 22:06:54 +0000 (00:06 +0200)
committerMartin KaFai Lau <martin.lau@kernel.org>
Sat, 7 Oct 2023 00:11:21 +0000 (17:11 -0700)
Add a new test case to query on an empty bpf_mprog and pass the revision
directly into expected_revision for attachment to assert that this does
succeed.

  ./test_progs -t tc_opts
  [    1.406778] tsc: Refined TSC clocksource calibration: 3407.990 MHz
  [    1.408863] clocksource: tsc: mask: 0xffffffffffffffff max_cycles: 0x311fcaf6eb0, max_idle_ns: 440795321766 ns
  [    1.412419] clocksource: Switched to clocksource tsc
  [    1.428671] bpf_testmod: loading out-of-tree module taints kernel.
  [    1.430260] bpf_testmod: module verification failed: signature and/or required key missing - tainting kernel
  #252     tc_opts_after:OK
  #253     tc_opts_append:OK
  #254     tc_opts_basic:OK
  #255     tc_opts_before:OK
  #256     tc_opts_chain_classic:OK
  #257     tc_opts_chain_mixed:OK
  #258     tc_opts_delete_empty:OK
  #259     tc_opts_demixed:OK
  #260     tc_opts_detach:OK
  #261     tc_opts_detach_after:OK
  #262     tc_opts_detach_before:OK
  #263     tc_opts_dev_cleanup:OK
  #264     tc_opts_invalid:OK
  #265     tc_opts_max:OK
  #266     tc_opts_mixed:OK
  #267     tc_opts_prepend:OK
  #268     tc_opts_query:OK
  #269     tc_opts_query_attach:OK     <--- (new test)
  #270     tc_opts_replace:OK
  #271     tc_opts_revision:OK
  Summary: 20/0 PASSED, 0 SKIPPED, 0 FAILED

Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Link: https://lore.kernel.org/r/20231006220655.1653-6-daniel@iogearbox.net
Signed-off-by: Martin KaFai Lau <martin.lau@kernel.org>
tools/testing/selftests/bpf/prog_tests/tc_opts.c

index 2174bea3427ebb714637fec29b45683f1635bf0b..ba91b02268396a30abc1a61f2110e1f21dd6dab6 100644 (file)
@@ -2629,3 +2629,62 @@ void serial_test_tc_opts_query(void)
        test_tc_opts_query_target(BPF_TCX_INGRESS);
        test_tc_opts_query_target(BPF_TCX_EGRESS);
 }
+
+static void test_tc_opts_query_attach_target(int target)
+{
+       LIBBPF_OPTS(bpf_prog_attach_opts, opta);
+       LIBBPF_OPTS(bpf_prog_detach_opts, optd);
+       LIBBPF_OPTS(bpf_prog_query_opts, optq);
+       struct test_tc_link *skel;
+       __u32 prog_ids[2];
+       __u32 fd1, id1;
+       int err;
+
+       skel = test_tc_link__open_and_load();
+       if (!ASSERT_OK_PTR(skel, "skel_load"))
+               goto cleanup;
+
+       fd1 = bpf_program__fd(skel->progs.tc1);
+       id1 = id_from_prog_fd(fd1);
+
+       err = bpf_prog_query_opts(loopback, target, &optq);
+       if (!ASSERT_OK(err, "prog_query"))
+               goto cleanup;
+
+       ASSERT_EQ(optq.count, 0, "count");
+       ASSERT_EQ(optq.revision, 1, "revision");
+
+       LIBBPF_OPTS_RESET(opta,
+               .expected_revision = optq.revision,
+       );
+
+       err = bpf_prog_attach_opts(fd1, loopback, target, &opta);
+       if (!ASSERT_EQ(err, 0, "prog_attach"))
+               goto cleanup;
+
+       memset(prog_ids, 0, sizeof(prog_ids));
+       optq.prog_ids = prog_ids;
+       optq.count = ARRAY_SIZE(prog_ids);
+
+       err = bpf_prog_query_opts(loopback, target, &optq);
+       if (!ASSERT_OK(err, "prog_query"))
+               goto cleanup1;
+
+       ASSERT_EQ(optq.count, 1, "count");
+       ASSERT_EQ(optq.revision, 2, "revision");
+       ASSERT_EQ(optq.prog_ids[0], id1, "prog_ids[0]");
+       ASSERT_EQ(optq.prog_ids[1], 0, "prog_ids[1]");
+
+cleanup1:
+       err = bpf_prog_detach_opts(fd1, loopback, target, &optd);
+       ASSERT_OK(err, "prog_detach");
+       assert_mprog_count(target, 0);
+cleanup:
+       test_tc_link__destroy(skel);
+}
+
+void serial_test_tc_opts_query_attach(void)
+{
+       test_tc_opts_query_attach_target(BPF_TCX_INGRESS);
+       test_tc_opts_query_attach_target(BPF_TCX_EGRESS);
+}