Skip to content

Commit f724105

Browse files
eddyz87jfvogel
authored andcommitted
selftests/bpf: extend changes_pkt_data with cases w/o subprograms
commit 04789af upstream. Extend changes_pkt_data tests with test cases freplacing the main program that does not have subprograms. Try four combinations when both main program and replacement do and do not change packet data. Signed-off-by: Eduard Zingerman <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Alexei Starovoitov <[email protected]> Signed-off-by: Shung-Hsi Yu <[email protected]> Signed-off-by: Greg Kroah-Hartman <[email protected]> (cherry picked from commit 473c5347355f20a916e498281210be4f69d0c629) Signed-off-by: Jack Vogel <[email protected]>
1 parent 7765914 commit f724105

File tree

3 files changed

+66
-22
lines changed

3 files changed

+66
-22
lines changed

tools/testing/selftests/bpf/prog_tests/changes_pkt_data.c

Lines changed: 43 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,14 @@ static void print_verifier_log(const char *log)
1010
fprintf(stdout, "VERIFIER LOG:\n=============\n%s=============\n", log);
1111
}
1212

13-
static void test_aux(const char *main_prog_name, const char *freplace_prog_name, bool expect_load)
13+
static void test_aux(const char *main_prog_name,
14+
const char *to_be_replaced,
15+
const char *replacement,
16+
bool expect_load)
1417
{
1518
struct changes_pkt_data_freplace *freplace = NULL;
1619
struct bpf_program *freplace_prog = NULL;
20+
struct bpf_program *main_prog = NULL;
1721
LIBBPF_OPTS(bpf_object_open_opts, opts);
1822
struct changes_pkt_data *main = NULL;
1923
char log[16*1024];
@@ -26,21 +30,25 @@ static void test_aux(const char *main_prog_name, const char *freplace_prog_name,
2630
main = changes_pkt_data__open_opts(&opts);
2731
if (!ASSERT_OK_PTR(main, "changes_pkt_data__open"))
2832
goto out;
33+
main_prog = bpf_object__find_program_by_name(main->obj, main_prog_name);
34+
if (!ASSERT_OK_PTR(main_prog, "main_prog"))
35+
goto out;
36+
bpf_program__set_autoload(main_prog, true);
2937
err = changes_pkt_data__load(main);
3038
print_verifier_log(log);
3139
if (!ASSERT_OK(err, "changes_pkt_data__load"))
3240
goto out;
3341
freplace = changes_pkt_data_freplace__open_opts(&opts);
3442
if (!ASSERT_OK_PTR(freplace, "changes_pkt_data_freplace__open"))
3543
goto out;
36-
freplace_prog = bpf_object__find_program_by_name(freplace->obj, freplace_prog_name);
44+
freplace_prog = bpf_object__find_program_by_name(freplace->obj, replacement);
3745
if (!ASSERT_OK_PTR(freplace_prog, "freplace_prog"))
3846
goto out;
3947
bpf_program__set_autoload(freplace_prog, true);
4048
bpf_program__set_autoattach(freplace_prog, true);
4149
bpf_program__set_attach_target(freplace_prog,
42-
bpf_program__fd(main->progs.dummy),
43-
main_prog_name);
50+
bpf_program__fd(main_prog),
51+
to_be_replaced);
4452
err = changes_pkt_data_freplace__load(freplace);
4553
print_verifier_log(log);
4654
if (expect_load) {
@@ -62,15 +70,38 @@ static void test_aux(const char *main_prog_name, const char *freplace_prog_name,
6270
* that either do or do not. It is only ok to freplace subprograms
6371
* that do not change packet data with those that do not as well.
6472
* The below tests check outcomes for each combination of such freplace.
73+
* Also test a case when main subprogram itself is replaced and is a single
74+
* subprogram in a program.
6575
*/
6676
void test_changes_pkt_data_freplace(void)
6777
{
68-
if (test__start_subtest("changes_with_changes"))
69-
test_aux("changes_pkt_data", "changes_pkt_data", true);
70-
if (test__start_subtest("changes_with_doesnt_change"))
71-
test_aux("changes_pkt_data", "does_not_change_pkt_data", true);
72-
if (test__start_subtest("doesnt_change_with_changes"))
73-
test_aux("does_not_change_pkt_data", "changes_pkt_data", false);
74-
if (test__start_subtest("doesnt_change_with_doesnt_change"))
75-
test_aux("does_not_change_pkt_data", "does_not_change_pkt_data", true);
78+
struct {
79+
const char *main;
80+
const char *to_be_replaced;
81+
bool changes;
82+
} mains[] = {
83+
{ "main_with_subprogs", "changes_pkt_data", true },
84+
{ "main_with_subprogs", "does_not_change_pkt_data", false },
85+
{ "main_changes", "main_changes", true },
86+
{ "main_does_not_change", "main_does_not_change", false },
87+
};
88+
struct {
89+
const char *func;
90+
bool changes;
91+
} replacements[] = {
92+
{ "changes_pkt_data", true },
93+
{ "does_not_change_pkt_data", false }
94+
};
95+
char buf[64];
96+
97+
for (int i = 0; i < ARRAY_SIZE(mains); ++i) {
98+
for (int j = 0; j < ARRAY_SIZE(replacements); ++j) {
99+
snprintf(buf, sizeof(buf), "%s_with_%s",
100+
mains[i].to_be_replaced, replacements[j].func);
101+
if (!test__start_subtest(buf))
102+
continue;
103+
test_aux(mains[i].main, mains[i].to_be_replaced, replacements[j].func,
104+
mains[i].changes || !replacements[j].changes);
105+
}
106+
}
76107
}

tools/testing/selftests/bpf/progs/changes_pkt_data.c

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,35 @@
44
#include <bpf/bpf_helpers.h>
55

66
__noinline
7-
long changes_pkt_data(struct __sk_buff *sk, __u32 len)
7+
long changes_pkt_data(struct __sk_buff *sk)
88
{
9-
return bpf_skb_pull_data(sk, len);
9+
return bpf_skb_pull_data(sk, 0);
1010
}
1111

1212
__noinline __weak
13-
long does_not_change_pkt_data(struct __sk_buff *sk, __u32 len)
13+
long does_not_change_pkt_data(struct __sk_buff *sk)
1414
{
1515
return 0;
1616
}
1717

18-
SEC("tc")
19-
int dummy(struct __sk_buff *sk)
18+
SEC("?tc")
19+
int main_with_subprogs(struct __sk_buff *sk)
20+
{
21+
changes_pkt_data(sk);
22+
does_not_change_pkt_data(sk);
23+
return 0;
24+
}
25+
26+
SEC("?tc")
27+
int main_changes(struct __sk_buff *sk)
28+
{
29+
bpf_skb_pull_data(sk, 0);
30+
return 0;
31+
}
32+
33+
SEC("?tc")
34+
int main_does_not_change(struct __sk_buff *sk)
2035
{
21-
changes_pkt_data(sk, 0);
22-
does_not_change_pkt_data(sk, 0);
2336
return 0;
2437
}
2538

tools/testing/selftests/bpf/progs/changes_pkt_data_freplace.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,13 @@
44
#include <bpf/bpf_helpers.h>
55

66
SEC("?freplace")
7-
long changes_pkt_data(struct __sk_buff *sk, __u32 len)
7+
long changes_pkt_data(struct __sk_buff *sk)
88
{
9-
return bpf_skb_pull_data(sk, len);
9+
return bpf_skb_pull_data(sk, 0);
1010
}
1111

1212
SEC("?freplace")
13-
long does_not_change_pkt_data(struct __sk_buff *sk, __u32 len)
13+
long does_not_change_pkt_data(struct __sk_buff *sk)
1414
{
1515
return 0;
1616
}

0 commit comments

Comments
 (0)