Commit 5deedfbe authored by Shmulik Ladkani's avatar Shmulik Ladkani Committed by Daniel Borkmann

bpf, test_run: Propagate bpf_flow_dissect's retval to user's bpf_attr.test.retval

Formerly, a boolean denoting whether bpf_flow_dissect returned BPF_OK
was set into 'bpf_attr.test.retval'.

Augment this, so users can check the actual return code of the dissector
program under test.

Existing prog_tests/flow_dissector*.c tests were correspondingly changed
to check against each test's expected retval.

Also, tests' resulting 'flow_keys' are verified only in case the expected
retval is BPF_OK. This allows adding new tests that expect non BPF_OK.
Signed-off-by: default avatarShmulik Ladkani <shmulik.ladkani@gmail.com>
Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
Reviewed-by: default avatarStanislav Fomichev <sdf@google.com>
Acked-by: default avatarJohn Fastabend <john.fastabend@gmail.com>
Link: https://lore.kernel.org/bpf/20220821113519.116765-4-shmulik.ladkani@gmail.com
parent 91350fe1
...@@ -1445,7 +1445,7 @@ int bpf_prog_test_run_flow_dissector(struct bpf_prog *prog, ...@@ -1445,7 +1445,7 @@ int bpf_prog_test_run_flow_dissector(struct bpf_prog *prog,
bpf_test_timer_enter(&t); bpf_test_timer_enter(&t);
do { do {
retval = bpf_flow_dissect(prog, &ctx, eth->h_proto, ETH_HLEN, retval = bpf_flow_dissect(prog, &ctx, eth->h_proto, ETH_HLEN,
size, flags) == BPF_OK; size, flags);
} while (bpf_test_timer_continue(&t, 1, repeat, &ret, &duration)); } while (bpf_test_timer_continue(&t, 1, repeat, &ret, &duration));
bpf_test_timer_leave(&t); bpf_test_timer_leave(&t);
......
...@@ -100,6 +100,7 @@ struct test { ...@@ -100,6 +100,7 @@ struct test {
} pkt; } pkt;
struct bpf_flow_keys keys; struct bpf_flow_keys keys;
__u32 flags; __u32 flags;
__u32 retval;
}; };
#define VLAN_HLEN 4 #define VLAN_HLEN 4
...@@ -126,6 +127,7 @@ struct test tests[] = { ...@@ -126,6 +127,7 @@ struct test tests[] = {
.sport = 80, .sport = 80,
.dport = 8080, .dport = 8080,
}, },
.retval = BPF_OK,
}, },
{ {
.name = "ipv6", .name = "ipv6",
...@@ -146,6 +148,7 @@ struct test tests[] = { ...@@ -146,6 +148,7 @@ struct test tests[] = {
.sport = 80, .sport = 80,
.dport = 8080, .dport = 8080,
}, },
.retval = BPF_OK,
}, },
{ {
.name = "802.1q-ipv4", .name = "802.1q-ipv4",
...@@ -168,6 +171,7 @@ struct test tests[] = { ...@@ -168,6 +171,7 @@ struct test tests[] = {
.sport = 80, .sport = 80,
.dport = 8080, .dport = 8080,
}, },
.retval = BPF_OK,
}, },
{ {
.name = "802.1ad-ipv6", .name = "802.1ad-ipv6",
...@@ -191,6 +195,7 @@ struct test tests[] = { ...@@ -191,6 +195,7 @@ struct test tests[] = {
.sport = 80, .sport = 80,
.dport = 8080, .dport = 8080,
}, },
.retval = BPF_OK,
}, },
{ {
.name = "ipv4-frag", .name = "ipv4-frag",
...@@ -217,6 +222,7 @@ struct test tests[] = { ...@@ -217,6 +222,7 @@ struct test tests[] = {
.dport = 8080, .dport = 8080,
}, },
.flags = BPF_FLOW_DISSECTOR_F_PARSE_1ST_FRAG, .flags = BPF_FLOW_DISSECTOR_F_PARSE_1ST_FRAG,
.retval = BPF_OK,
}, },
{ {
.name = "ipv4-no-frag", .name = "ipv4-no-frag",
...@@ -239,6 +245,7 @@ struct test tests[] = { ...@@ -239,6 +245,7 @@ struct test tests[] = {
.is_frag = true, .is_frag = true,
.is_first_frag = true, .is_first_frag = true,
}, },
.retval = BPF_OK,
}, },
{ {
.name = "ipv6-frag", .name = "ipv6-frag",
...@@ -265,6 +272,7 @@ struct test tests[] = { ...@@ -265,6 +272,7 @@ struct test tests[] = {
.dport = 8080, .dport = 8080,
}, },
.flags = BPF_FLOW_DISSECTOR_F_PARSE_1ST_FRAG, .flags = BPF_FLOW_DISSECTOR_F_PARSE_1ST_FRAG,
.retval = BPF_OK,
}, },
{ {
.name = "ipv6-no-frag", .name = "ipv6-no-frag",
...@@ -287,6 +295,7 @@ struct test tests[] = { ...@@ -287,6 +295,7 @@ struct test tests[] = {
.is_frag = true, .is_frag = true,
.is_first_frag = true, .is_first_frag = true,
}, },
.retval = BPF_OK,
}, },
{ {
.name = "ipv6-flow-label", .name = "ipv6-flow-label",
...@@ -309,6 +318,7 @@ struct test tests[] = { ...@@ -309,6 +318,7 @@ struct test tests[] = {
.dport = 8080, .dport = 8080,
.flow_label = __bpf_constant_htonl(0xbeeef), .flow_label = __bpf_constant_htonl(0xbeeef),
}, },
.retval = BPF_OK,
}, },
{ {
.name = "ipv6-no-flow-label", .name = "ipv6-no-flow-label",
...@@ -331,6 +341,7 @@ struct test tests[] = { ...@@ -331,6 +341,7 @@ struct test tests[] = {
.flow_label = __bpf_constant_htonl(0xbeeef), .flow_label = __bpf_constant_htonl(0xbeeef),
}, },
.flags = BPF_FLOW_DISSECTOR_F_STOP_AT_FLOW_LABEL, .flags = BPF_FLOW_DISSECTOR_F_STOP_AT_FLOW_LABEL,
.retval = BPF_OK,
}, },
{ {
.name = "ipip-encap", .name = "ipip-encap",
...@@ -359,6 +370,7 @@ struct test tests[] = { ...@@ -359,6 +370,7 @@ struct test tests[] = {
.sport = 80, .sport = 80,
.dport = 8080, .dport = 8080,
}, },
.retval = BPF_OK,
}, },
{ {
.name = "ipip-no-encap", .name = "ipip-no-encap",
...@@ -386,6 +398,7 @@ struct test tests[] = { ...@@ -386,6 +398,7 @@ struct test tests[] = {
.is_encap = true, .is_encap = true,
}, },
.flags = BPF_FLOW_DISSECTOR_F_STOP_AT_ENCAP, .flags = BPF_FLOW_DISSECTOR_F_STOP_AT_ENCAP,
.retval = BPF_OK,
}, },
}; };
...@@ -503,6 +516,10 @@ static void run_tests_skb_less(int tap_fd, struct bpf_map *keys) ...@@ -503,6 +516,10 @@ static void run_tests_skb_less(int tap_fd, struct bpf_map *keys)
err = tx_tap(tap_fd, &tests[i].pkt, sizeof(tests[i].pkt)); err = tx_tap(tap_fd, &tests[i].pkt, sizeof(tests[i].pkt));
CHECK(err < 0, "tx_tap", "err %d errno %d\n", err, errno); CHECK(err < 0, "tx_tap", "err %d errno %d\n", err, errno);
/* check the stored flow_keys only if BPF_OK expected */
if (tests[i].retval != BPF_OK)
continue;
err = bpf_map_lookup_elem(keys_fd, &key, &flow_keys); err = bpf_map_lookup_elem(keys_fd, &key, &flow_keys);
ASSERT_OK(err, "bpf_map_lookup_elem"); ASSERT_OK(err, "bpf_map_lookup_elem");
...@@ -588,7 +605,11 @@ void test_flow_dissector(void) ...@@ -588,7 +605,11 @@ void test_flow_dissector(void)
err = bpf_prog_test_run_opts(prog_fd, &topts); err = bpf_prog_test_run_opts(prog_fd, &topts);
ASSERT_OK(err, "test_run"); ASSERT_OK(err, "test_run");
ASSERT_EQ(topts.retval, 1, "test_run retval"); ASSERT_EQ(topts.retval, tests[i].retval, "test_run retval");
/* check the resulting flow_keys only if BPF_OK returned */
if (topts.retval != BPF_OK)
continue;
ASSERT_EQ(topts.data_size_out, sizeof(flow_keys), ASSERT_EQ(topts.data_size_out, sizeof(flow_keys),
"test_run data_size_out"); "test_run data_size_out");
CHECK_FLOW_KEYS(tests[i].name, flow_keys, tests[i].keys); CHECK_FLOW_KEYS(tests[i].name, flow_keys, tests[i].keys);
......
...@@ -44,7 +44,7 @@ void serial_test_flow_dissector_load_bytes(void) ...@@ -44,7 +44,7 @@ void serial_test_flow_dissector_load_bytes(void)
ASSERT_OK(err, "test_run"); ASSERT_OK(err, "test_run");
ASSERT_EQ(topts.data_size_out, sizeof(flow_keys), ASSERT_EQ(topts.data_size_out, sizeof(flow_keys),
"test_run data_size_out"); "test_run data_size_out");
ASSERT_EQ(topts.retval, 1, "test_run retval"); ASSERT_EQ(topts.retval, BPF_OK, "test_run retval");
if (fd >= -1) if (fd >= -1)
close(fd); close(fd);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment