Fix BPF selftests
v2 cover Fix BPF selftests
This patchset fixes the BPF selftests on 6.1. Its patches fall into two categories:
- Reverts of backported selftests, usually because they test a change that didn't land in 6.1 (3 patches).
- Backports of selftest fixes and their dependencies (8 patches).
With this, the BPF selftests are passing on 6.1 (tested with both LLVM 16 and 18).
Changes in v2:
- Fixed the conflict resolution on the first patch to apply cleanly
on 6.1.y.
Andrii Nakryiko (3):
selftests/bpf: add generic BPF program tester-loader selftests/bpf: Convert test_global_funcs test to test_loader framework selftests/bpf: enhance align selftest's expected log matching
Daniel Borkmann (1):
selftests/bpf: Fix ARG_PTR_TO_LONG {half-,}uninitialized test
Jiri Olsa (1):
selftests/bpf: Add read_build_id function
Martin KaFai Lau (1):
selftests/bpf: S/iptables/iptables-legacy/ in the bpf_nf and
xdp_synproxy test
Paul Chaignon (3):
Revert "selftests/bpf: Workaround strict bpf_lsm return value check." Revert "selftests/bpf: Add tests for _opts variants of
bpf_*_get_fd_by_id()"
Revert "selftests/bpf: Add a cgroup prog bpf_get_ns_current_pid_tgid()
test"
Stanislav Fomichev (1):
selftests/bpf: Update bpf_clone_redirect expected return code
Yonghong Song (1):
bpf: Fix a few selftest failures due to llvm18 change
tools/testing/selftests/bpf/DENYLIST.s390x | 1 - tools/testing/selftests/bpf/Makefile | 2 +- .../testing/selftests/bpf/prog_tests/align.c | 18 +- .../testing/selftests/bpf/prog_tests/bpf_nf.c | 6 +- .../selftests/bpf/prog_tests/empty_skb.c | 12 +- .../bpf/prog_tests/libbpf_get_fd_by_id_opts.c | 87 ------- .../bpf/prog_tests/ns_current_pid_tgid.c | 73 ------ .../bpf/prog_tests/test_global_funcs.c | 131 +++------- .../selftests/bpf/prog_tests/xdp_synproxy.c | 6 +- tools/testing/selftests/bpf/progs/bpf_misc.h | 5 + .../selftests/bpf/progs/test_global_func1.c | 6 +- .../selftests/bpf/progs/test_global_func10.c | 1 + .../selftests/bpf/progs/test_global_func11.c | 4 +- .../selftests/bpf/progs/test_global_func12.c | 4 +- .../selftests/bpf/progs/test_global_func13.c | 4 +- .../selftests/bpf/progs/test_global_func14.c | 4 +- .../selftests/bpf/progs/test_global_func15.c | 4 +- .../selftests/bpf/progs/test_global_func16.c | 4 +- .../selftests/bpf/progs/test_global_func17.c | 5 +- .../selftests/bpf/progs/test_global_func2.c | 43 +++- .../selftests/bpf/progs/test_global_func3.c | 10 +- .../selftests/bpf/progs/test_global_func4.c | 55 ++++- .../selftests/bpf/progs/test_global_func5.c | 4 +- .../selftests/bpf/progs/test_global_func6.c | 4 +- .../selftests/bpf/progs/test_global_func7.c | 4 +- .../selftests/bpf/progs/test_global_func8.c | 4 +- .../selftests/bpf/progs/test_global_func9.c | 4 +- .../bpf/progs/test_libbpf_get_fd_by_id_opts.c | 37 --- .../bpf/progs/test_ns_current_pid_tgid.c | 7 - tools/testing/selftests/bpf/test_loader.c | 233 ++++++++++++++++++ tools/testing/selftests/bpf/test_progs.h | 33 +++ tools/testing/selftests/bpf/trace_helpers.c | 82 ++++++ tools/testing/selftests/bpf/trace_helpers.h | 5 + .../testing/selftests/bpf/verifier/int_ptr.c | 6 +- 34 files changed, 561 insertions(+), 347 deletions(-) delete mode 100644 tools/testing/selftests/bpf/prog_tests/libbpf_get_fd_by_id_opts.c delete mode 100644 tools/testing/selftests/bpf/progs/test_libbpf_get_fd_by_id_opts.c create mode 100644 tools/testing/selftests/bpf/test_loader.c
Signature · 1 line
2.43.0
PATCH v2 1/11 selftests/bpf: add generic BPF program tester-loader
From: Andrii Nakryiko <[email protected]>
[ Upstream commit 537c3f66eac137a02ec50a40219d2da6597e5dc9 ]
It's become a common pattern to have a collection of small BPF programs in one BPF object file, each representing one test case. On user-space side of such tests we maintain a table of program names and expected failure or success, along with optional expected verifier log message.
This works, but each set of tests reimplement this mundane code over and over again, which is a waste of time for anyone trying to add a new set of tests. Furthermore, it's quite error prone as it's way too easy to miss some entries in these manually maintained test tables (as evidences by dynptr_fail tests, in which ringbuf_release_uninit_dynptr subtest was accidentally missed; this is fixed in next patch).
So this patch implements generic test_loader, which accepts skeleton name and handles the rest of details: opens and loads BPF object file, making sure each program is tested in isolation. Optionally each test case can specify expected BPF verifier log message. In case of failure, tester makes sure to report verifier log, but it also reports verifier log in verbose mode unconditionally.
Now, the interesting deviation from existing custom implementations is the use of btf_decl_tag attribute to specify expected-to-fail vs expected-to-succeed markers and, optionally, expected log message directly next to BPF program source code, eliminating the need to manually create and update table of tests.
We define few macros wrapping btf_decl_tag with a convention that all values of btf_decl_tag start with "comment:" prefix, and then utilizing a very simple "just_some_text_tag" or "some_key_name=<value>" pattern to define things like expected success/failure, expected verifier message, extra verifier log level (if necessary). This approach is demonstrated by next patch in which two existing sets of failure tests are converted.
Tester supports both expected-to-fail and expected-to-succeed programs, though this patch set didn't convert any existing expected-to-succeed programs yet, as existing tests couple BPF program loading with their further execution through attach or test_prog_run. One way to allow testing scenarios like this would be ability to specify custom callback, executed for each successfully loaded BPF program. This is left for follow up patches, after some more analysis of existing test cases.
This test_loader is, hopefully, a start of a test_verifier-like runner, but integrated into test_progs infrastructure. It will allow much better "user experience" of defining low-level verification tests that can take advantage of all the libbpf-provided nicety features on BPF side: global variables, declarative maps, etc. All while having a choice of defining it in C or as BPF assembly (through __attribute__((naked)) functions and using embedded asm), depending on what makes most sense in each particular case. This will be explored in follow up patches as well.
Stable-dep-of: 95ebb376176c ("selftests/bpf: Convert test_global_funcs test to test_loader framework")
--- tools/testing/selftests/bpf/Makefile | 2 +- tools/testing/selftests/bpf/progs/bpf_misc.h | 5 + tools/testing/selftests/bpf/test_loader.c | 233 +++++++++++++++++++ tools/testing/selftests/bpf/test_progs.h | 33 +++ 4 files changed, 272 insertions(+), 1 deletion(-) create mode 100644 tools/testing/selftests/bpf/test_loader.c
tools/testing/selftests/bpf/Makefile +1 -1
@@ -519,7 +519,7 @@ TRUNNER_BPF_PROGS_DIR := progs TRUNNER_EXTRA_SOURCES := test_progs.c cgroup_helpers.c trace_helpers.c \ network_helpers.c testing_helpers.c \ btf_helpers.c flow_dissector_load.h \ - cap_helpers.c + cap_helpers.c test_loader.c TRUNNER_EXTRA_FILES := $(OUTPUT)/urandom_read $(OUTPUT)/bpf_testmod.ko \ $(OUTPUT)/liburandom_read.so \ $(OUTPUT)/xdp_synproxy \
tools/testing/selftests/bpf/progs/bpf_misc.h +5 -0
@@ -2,6 +2,11 @@#ifndef __BPF_MISC_H__#define __BPF_MISC_H__ +#define __msg (msg) __attribute__((btf_decl_tag("comment:test_expect_msg=" msg))) +#define __failure __attribute__((btf_decl_tag("comment:test_expect_failure"))) +#define __success __attribute__((btf_decl_tag("comment:test_expect_success"))) +#define __log_level (lvl) __attribute__((btf_decl_tag("comment:test_log_level="#lvl))) +#if defined(__TARGET_ARCH_x86)#define SYSCALL_WRAPPER 1#define SYS_PREFIX "__x64_"
tools/testing/selftests/bpf/test_loader.c new file +233 -0
233 lines not on this page · raw message
tools/testing/selftests/bpf/test_progs.h +33 -0
@@ -1,4 +1,7 @@/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef __TEST_PROGS_H +#define __TEST_PROGS_H +#include <stdio.h> #include <unistd.h> #include <errno.h>
@@ -210,6 +213,12 @@ int test__join_cgroup(const char *path); #define CHECK_ATTR(condition, tag, format...) \ _CHECK(condition, tag, tattr.duration, format) +#define ASSERT_FAIL(fmt, args...) ({ \ + static int duration = 0; \ + CHECK(false, "", fmt"\n", ##args); \ + false; \ +}) +#define ASSERT_TRUE (actual, name) ({ \ static int duration = 0; \ bool ___ok = (actual); \
@@ -395,3 +404,27 @@ int write_sysctl(const char *sysctl, const char *value);#endif #define BPF_TESTMOD_TEST_FILE "/sys/kernel/bpf_testmod" + +struct test_loader { +char *log_buf; +size_t log_buf_sz; + +struct bpf_object *obj; +}; + +typedef const void *(*skel_elf_bytes_fn )(size_t *sz); + +extern void test_loader__run_subtests (struct test_loader *tester, +const char *skel_name, +skel_elf_bytes_fn elf_bytes_factory); + +extern void test_loader_fini (struct test_loader *tester); + +#define RUN_TESTS (skel) ({ \ + struct test_loader tester = {}; \ + \ + test_loader__run_subtests(&tester, #skel, skel##__elf_bytes); \ + test_loader_fini(&tester); \ +}) + +#endif /* __TEST_PROGS_H */
Signature · 1 line
2.43.0
PATCH v2 2/11 selftests/bpf: Convert test_global_funcs test to test_loader framework
In reply to Paul ChaignonFrom: Andrii Nakryiko <[email protected]>
[ Upstream commit 95ebb376176c52382293e05e63f142114a5e40ef ]
Convert 17 test_global_funcs subtests into test_loader framework for easier maintenance and more declarative way to define expected failures/successes.
[ Notes: This backport fixes backport commit bbac91d57ac2 ("bpf: Allow
reads from uninit stack"), which broke the BPF selftest build. A minor conflict needed resolution in test_global_func10.c on the error message. ]
--- .../bpf/prog_tests/test_global_funcs.c | 131 +++++------------- .../selftests/bpf/progs/test_global_func1.c | 6 +- .../selftests/bpf/progs/test_global_func10.c | 1 + .../selftests/bpf/progs/test_global_func11.c | 4 +- .../selftests/bpf/progs/test_global_func12.c | 4 +- .../selftests/bpf/progs/test_global_func13.c | 4 +- .../selftests/bpf/progs/test_global_func14.c | 4 +- .../selftests/bpf/progs/test_global_func15.c | 4 +- .../selftests/bpf/progs/test_global_func16.c | 4 +- .../selftests/bpf/progs/test_global_func17.c | 4 +- .../selftests/bpf/progs/test_global_func2.c | 43 +++++- .../selftests/bpf/progs/test_global_func3.c | 10 +- .../selftests/bpf/progs/test_global_func4.c | 55 +++++++- .../selftests/bpf/progs/test_global_func5.c | 4 +- .../selftests/bpf/progs/test_global_func6.c | 4 +- .../selftests/bpf/progs/test_global_func7.c | 4 +- .../selftests/bpf/progs/test_global_func8.c | 4 +- .../selftests/bpf/progs/test_global_func9.c | 4 +- 18 files changed, 172 insertions(+), 122 deletions(-)
tools/testing/selftests/bpf/prog_tests/test_global_funcs.c +34 -97
@@ -1,104 +1,41 @@// SPDX-License-Identifier: GPL-2.0 /* Copyright (c) 2020 Facebook */ #include <test_progs.h> - -const char *err_str; -bool found; - -static int libbpf_debug_print (enum libbpf_print_level level, -const char *format,va_list args) -{ -char *log_buf; - -if (level !=LIBBPF_WARN || -strcmp (format,"libbpf: \n%s\n" )) { -vprintf (format, args); -return 0 ; - } - - log_buf = va_arg(args, char *); -if (!log_buf) - goto out; -if (err_str &&strstr (log_buf, err_str) ==0 ) - found = true; -out: -printf (format, log_buf); -return 0 ; -} - -extern int extra_prog_load_log_flags; - -static int check_load (const char *file) -{ -struct bpf_object *obj =NULL ; -struct bpf_program *prog; -int err; - - found = false; - - obj =bpf_object__open_file (file,NULL ); - err =libbpf_get_error (obj); -if (err) -return err; - - prog =bpf_object__next_program (obj,NULL ); -if (!prog) { - err = -ENOENT ; - goto err_out; - } - -bpf_program__set_flags (prog,BPF_F_TEST_RND_HI32 ); -bpf_program__set_log_level (prog, extra_prog_load_log_flags); - - err =bpf_object__load (obj); - -err_out: -bpf_object__close (obj); -return err; -} - -struct test_def { -const char *file; -const char *err_str; -}; +#include "test_global_func1.skel.h" +#include "test_global_func2.skel.h" +#include "test_global_func3.skel.h" +#include "test_global_func4.skel.h" +#include "test_global_func5.skel.h" +#include "test_global_func6.skel.h" +#include "test_global_func7.skel.h" +#include "test_global_func8.skel.h" +#include "test_global_func9.skel.h" +#include "test_global_func10.skel.h" +#include "test_global_func11.skel.h" +#include "test_global_func12.skel.h" +#include "test_global_func13.skel.h" +#include "test_global_func14.skel.h" +#include "test_global_func15.skel.h" +#include "test_global_func16.skel.h" +#include "test_global_func17.skel.h" void test_test_global_funcs (void ) { -struct test_def tests[] = { - {"test_global_func1.bpf.o" ,"combined stack size of 4 calls is 544" }, - {"test_global_func2.bpf.o" }, - {"test_global_func3.bpf.o" ,"the call stack of 8 frames" }, - {"test_global_func4.bpf.o" }, - {"test_global_func5.bpf.o" ,"expected pointer to ctx, but got PTR" }, - {"test_global_func6.bpf.o" ,"modified ctx ptr R2" }, - {"test_global_func7.bpf.o" ,"foo() doesn't return scalar" }, - {"test_global_func8.bpf.o" }, - {"test_global_func9.bpf.o" }, - {"test_global_func10.bpf.o" ,"invalid indirect read from stack" }, - {"test_global_func11.bpf.o" ,"Caller passes invalid args into func#1" }, - {"test_global_func12.bpf.o" ,"invalid mem access 'mem_or_null'" }, - {"test_global_func13.bpf.o" ,"Caller passes invalid args into func#1" }, - {"test_global_func14.bpf.o" ,"reference type('FWD S') size cannot be determined" }, - {"test_global_func15.bpf.o" ,"At program exit the register R0 has value" }, - {"test_global_func16.bpf.o" ,"invalid indirect read from stack" }, - {"test_global_func17.bpf.o" ,"Caller passes invalid args into func#1" }, - }; -libbpf_print_fn_t old_print_fn =NULL ; -int err, i, duration =0 ; - - old_print_fn =libbpf_set_print (libbpf_debug_print); - -for (i =0 ; i <ARRAY_SIZE (tests); i++) { -const struct test_def *test = &tests[i]; - -if (!test__start_subtest (test->file)) -continue ; - - err_str = test->err_str; - err =check_load (test->file); -CHECK_FAIL (!!err ^ !!err_str); -if (err_str) -CHECK (found,"" ,"expected string '%s'" , err_str); - } -libbpf_set_print (old_print_fn); +RUN_TESTS (test_global_func1); +RUN_TESTS (test_global_func2); +RUN_TESTS (test_global_func3); +RUN_TESTS (test_global_func4); +RUN_TESTS (test_global_func5); +RUN_TESTS (test_global_func6); +RUN_TESTS (test_global_func7); +RUN_TESTS (test_global_func8); +RUN_TESTS (test_global_func9); +RUN_TESTS (test_global_func10); +RUN_TESTS (test_global_func11); +RUN_TESTS (test_global_func12); +RUN_TESTS (test_global_func13); +RUN_TESTS (test_global_func14); +RUN_TESTS (test_global_func15); +RUN_TESTS (test_global_func16); +RUN_TESTS (test_global_func17); }
tools/testing/selftests/bpf/progs/test_global_func1.c +3 -3
@@ -3,10 +3,9 @@#include <stddef.h> #include <linux/bpf.h> #include <bpf/bpf_helpers.h> +#include "bpf_misc.h" -#ifndef MAX_STACK #define MAX_STACK (512 - 3 * 32 + 8) -#endif static __attribute__ ((noinline))int f0 (int var,struct __sk_buff *skb)
@@ -39,7 +38,8 @@ int f3(int val, struct __sk_buff *skb, int var) } SEC("tc") -int test_cls (struct __sk_buff *skb) +__failure __msg("combined stack size of 4 calls is 544") +int global_func1(struct __sk_buff *skb) {return f0 (1 , skb) +f1 (skb) +f2 (2 , skb) +f3 (3 , skb,4 ); }
tools/testing/selftests/bpf/progs/test_global_func10.c +1 -0
@@ -2,6 +2,7 @@#include <stddef.h> #include <linux/bpf.h> #include <bpf/bpf_helpers.h> +#include "bpf_misc.h" struct Small {long x;
tools/testing/selftests/bpf/progs/test_global_func11.c +3 -1
@@ -2,6 +2,7 @@#include <stddef.h> #include <linux/bpf.h> #include <bpf/bpf_helpers.h> +#include "bpf_misc.h" struct S {int x;
@@ -13,7 +14,8 @@ __noinline int foo(const struct S *s) } SEC("cgroup_skb/ingress") -int test_cls (struct __sk_buff *skb) +__failure __msg("Caller passes invalid args into func#1") +int global_func11(struct __sk_buff *skb) {return foo ((const void *)skb); }
tools/testing/selftests/bpf/progs/test_global_func12.c +3 -1
@@ -2,6 +2,7 @@#include <stddef.h> #include <linux/bpf.h> #include <bpf/bpf_helpers.h> +#include "bpf_misc.h" struct S {int x;
@@ -13,7 +14,8 @@ __noinline int foo(const struct S *s) } SEC("cgroup_skb/ingress") -int test_cls (struct __sk_buff *skb) +__failure __msg("invalid mem access 'mem_or_null'") +int global_func12(struct __sk_buff *skb) {const struct S s = {.x = skb->len };
tools/testing/selftests/bpf/progs/test_global_func13.c +3 -1
@@ -2,6 +2,7 @@#include <stddef.h> #include <linux/bpf.h> #include <bpf/bpf_helpers.h> +#include "bpf_misc.h" struct S {int x;
@@ -16,7 +17,8 @@ __noinline int foo(const struct S *s) } SEC("cgroup_skb/ingress") -int test_cls (struct __sk_buff *skb) +__failure __msg("Caller passes invalid args into func#1") +int global_func13(struct __sk_buff *skb) {const struct S *s = (const struct S *)(0xbedabeda );
tools/testing/selftests/bpf/progs/test_global_func14.c +3 -1
@@ -2,6 +2,7 @@#include <stddef.h> #include <linux/bpf.h> #include <bpf/bpf_helpers.h> +#include "bpf_misc.h" struct S ;
@@ -14,7 +15,8 @@ __noinline int foo(const struct S *s) } SEC("cgroup_skb/ingress") -int test_cls (struct __sk_buff *skb) +__failure __msg("reference type('FWD S') size cannot be determined") +int global_func14(struct __sk_buff *skb) {return foo (NULL );
tools/testing/selftests/bpf/progs/test_global_func15.c +3 -1
@@ -2,6 +2,7 @@#include <stddef.h> #include <linux/bpf.h> #include <bpf/bpf_helpers.h> +#include "bpf_misc.h" __noinline int foo(unsigned int *v) {
@@ -12,7 +13,8 @@ __noinline int foo(unsigned int *v) } SEC("cgroup_skb/ingress") -int test_cls (struct __sk_buff *skb) +__failure __msg("At program exit the register R0 has value") +int global_func15(struct __sk_buff *skb) {unsigned int v =1 ;
tools/testing/selftests/bpf/progs/test_global_func16.c +3 -1
@@ -2,6 +2,7 @@#include <stddef.h> #include <linux/bpf.h> #include <bpf/bpf_helpers.h> +#include "bpf_misc.h" __noinline int foo(int (*arr)[10]) {
@@ -12,7 +13,8 @@ __noinline int foo(int (*arr)[10]) } SEC("cgroup_skb/ingress") -int test_cls (struct __sk_buff *skb) +__failure __msg("invalid indirect read from stack") +int global_func16(struct __sk_buff *skb) {int array[10 ];
tools/testing/selftests/bpf/progs/test_global_func17.c +3 -1
@@ -1,6 +1,7 @@// SPDX-License-Identifier: GPL-2.0-only #include <vmlinux.h> #include <bpf/bpf_helpers.h> +#include "bpf_misc.h" __noinline int foo(int *p) {
@@ -10,7 +11,8 @@ __noinline int foo(int *p)const volatile int i; SEC("tc") -int test_cls (struct __sk_buff *skb) +__failure __msg("Caller passes invalid args into func#1") +int global_func17(struct __sk_buff *skb) {return foo ((int *)&i); }
tools/testing/selftests/bpf/progs/test_global_func2.c +42 -1
46 lines not on this page · raw message
tools/testing/selftests/bpf/progs/test_global_func3.c +3 -7
@@ -3,6 +3,7 @@#include <stddef.h> #include <linux/bpf.h> #include <bpf/bpf_helpers.h> +#include "bpf_misc.h" __attribute__ ((noinline))int f1 (struct __sk_buff *skb)
@@ -46,20 +47,15 @@ int f7(struct __sk_buff *skb)return f6 (skb); } -#ifndef NO_FN8 __attribute__ ((noinline))int f8 (struct __sk_buff *skb) {return f7 (skb); } -#endif SEC("tc") -int test_cls (struct __sk_buff *skb) +__failure __msg("the call stack of 8 frames") +int global_func3(struct __sk_buff *skb) { -#ifndef NO_FN8 return f8 (skb); -#else -return f7 (skb); -#endif }
tools/testing/selftests/bpf/progs/test_global_func4.c +53 -2
57 lines not on this page · raw message
tools/testing/selftests/bpf/progs/test_global_func5.c +3 -1
@@ -3,6 +3,7 @@#include <stddef.h> #include <linux/bpf.h> #include <bpf/bpf_helpers.h> +#include "bpf_misc.h" __attribute__ ((noinline))int f1 (struct __sk_buff *skb)
@@ -25,7 +26,8 @@ int f3(int val, struct __sk_buff *skb) } SEC("tc") -int test_cls (struct __sk_buff *skb) +__failure __msg("expected pointer to ctx, but got PTR") +int global_func5(struct __sk_buff *skb) {return f1 (skb) +f2 (2 , skb) +f3 (3 , skb); }
tools/testing/selftests/bpf/progs/test_global_func6.c +3 -1
@@ -3,6 +3,7 @@#include <stddef.h> #include <linux/bpf.h> #include <bpf/bpf_helpers.h> +#include "bpf_misc.h" __attribute__ ((noinline))int f1 (struct __sk_buff *skb)
@@ -25,7 +26,8 @@ int f3(int val, struct __sk_buff *skb) } SEC("tc") -int test_cls (struct __sk_buff *skb) +__failure __msg("modified ctx ptr R2") +int global_func6(struct __sk_buff *skb) {return f1 (skb) +f2 (2 , skb) +f3 (3 , skb); }
tools/testing/selftests/bpf/progs/test_global_func7.c +3 -1
@@ -3,6 +3,7 @@#include <stddef.h> #include <linux/bpf.h> #include <bpf/bpf_helpers.h> +#include "bpf_misc.h" __attribute__ ((noinline))void foo (struct __sk_buff *skb)
@@ -11,7 +12,8 @@ void foo(struct __sk_buff *skb) } SEC("tc") -int test_cls (struct __sk_buff *skb) +__failure __msg("foo() doesn't return scalar") +int global_func7(struct __sk_buff *skb) {foo (skb);return 0 ;
tools/testing/selftests/bpf/progs/test_global_func8.c +3 -1
@@ -3,6 +3,7 @@#include <stddef.h> #include <linux/bpf.h> #include <bpf/bpf_helpers.h> +#include "bpf_misc.h" __noinline int foo(struct __sk_buff *skb) {
@@ -10,7 +11,8 @@ __noinline int foo(struct __sk_buff *skb) } SEC("cgroup_skb/ingress") -int test_cls (struct __sk_buff *skb) +__success +int global_func8 (struct __sk_buff *skb) {if (!foo (skb))return 0 ;
tools/testing/selftests/bpf/progs/test_global_func9.c +3 -1
@@ -2,6 +2,7 @@#include <stddef.h> #include <linux/bpf.h> #include <bpf/bpf_helpers.h> +#include "bpf_misc.h" struct S {int x;
@@ -74,7 +75,8 @@ __noinline int quuz(int **p) } SEC("cgroup_skb/ingress") -int test_cls (struct __sk_buff *skb) +__success +int global_func9 (struct __sk_buff *skb) {int result =0 ;
Signature · 1 line
2.43.0
PATCH v2 3/11 Revert "selftests/bpf: Workaround strict bpf_lsm return value check."
In reply to Paul ChaignonThis reverts commit a1914d146622 ("selftests/bpf: Workaround strict bpf_lsm return value check"). It seems it was picked up by mistake.
It applies to a selftest that didn't exist in 6.1. The whole selftest was then backported as a stable-dep in commit 45108a7b4866 ("selftests/bpf: Add tests for _opts variants of bpf_*_get_fd_by_id()") (reverted as well in the next patch).
The new selftest covers the bpf_*_get_fd_by_id structures. Those don't exist in 6.1 so the selftest shouldn't either.
--- .../testing/selftests/bpf/progs/test_libbpf_get_fd_by_id_opts.c | 1 - 1 file changed, 1 deletion(-)
tools/testing/selftests/bpf/progs/test_libbpf_get_fd_by_id_opts.c +0 -1
@@ -31,7 +31,6 @@ int BPF_PROG(check_access, struct bpf_map *map, fmode_t fmode)if (fmode &FMODE_WRITE )return -EACCES ; -barrier ();return 0 ; }
Signature · 1 line
2.43.0
PATCH v2 4/11 Revert "selftests/bpf: Add tests for _opts variants of bpf_*_get_fd_by_id()"
In reply to Paul ChaignonThis reverts commit 45108a7b4866 ("selftests/bpf: Add tests for _opts variants of bpf_*_get_fd_by_id()"). As explained in the previous patch, it introduces a new selftest for a feature that doesn't exist in 6.1. It was backported as a stable-dep of a1914d146622 ("selftests/bpf:
Workaround strict bpf_lsm return value check"), also reverted in the previous patch.
--- tools/testing/selftests/bpf/DENYLIST.s390x | 1 - .../bpf/prog_tests/libbpf_get_fd_by_id_opts.c | 87 ------------------- .../bpf/progs/test_libbpf_get_fd_by_id_opts.c | 36 -------- 3 files changed, 124 deletions(-) delete mode 100644 tools/testing/selftests/bpf/prog_tests/libbpf_get_fd_by_id_opts.c delete mode 100644 tools/testing/selftests/bpf/progs/test_libbpf_get_fd_by_id_opts.c
tools/testing/selftests/bpf/DENYLIST.s390x +0 -1
@@ -76,4 +76,3 @@ lookup_key # JIT does not support calling kernel f verify_pkcs7_sig # JIT does not support calling kernel function (kfunc) kfunc_dynptr_param # JIT does not support calling kernel function (kfunc) deny_namespace # failed to attach: ERROR: strerror_r(-524)=22 (trampoline) -libbpf_get_fd_by_id_opts # failed to attach: ERROR: strerror_r(-524)=22 (trampoline)
tools/testing/selftests/bpf/prog_tests/libbpf_get_fd_by_id_opts.c deleted +0 -87
87 lines not on this page · raw message
tools/testing/selftests/bpf/progs/test_libbpf_get_fd_by_id_opts.c deleted +0 -36
@@ -1,36 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 - -/* -* Copyright (C) 2022 Huawei Technologies Duesseldorf GmbH -* -* Author: Roberto Sassu <[email protected]> -*/ - -#include "vmlinux.h" -#include <errno.h> -#include <bpf/bpf_helpers.h> -#include <bpf/bpf_tracing.h> - -/* From include/linux/mm.h. */ -#define FMODE_WRITE 0x2 - -struct { - __uint(type, BPF_MAP_TYPE_ARRAY); - __uint(max_entries, 1); - __type(key, __u32); - __type(value, __u32); -} data_input SEC(".maps"); - -char _license[] SEC("license") = "GPL"; - -SEC("lsm/bpf_map") -int BPF_PROG (check_access ,struct bpf_map *map,fmode_t fmode) -{ -if (map != (struct bpf_map *)&data_input) -return 0 ; - -if (fmode &FMODE_WRITE ) -return -EACCES ; - -return 0 ; -}
Signature · 1 line
2.43.0
PATCH v2 5/11 selftests/bpf: Add read_build_id function
In reply to Paul ChaignonFrom: Jiri Olsa <[email protected]>
[ Upstream commit 88dc8b3605b38a440fba45edcc53a6c7a98eee3b ]
Adding read_build_id function that parses out build id from specified binary.
It will replace extract_build_id and also be used in following changes.
--- tools/testing/selftests/bpf/trace_helpers.c | 82 +++++++++++++++++++++ tools/testing/selftests/bpf/trace_helpers.h | 5 ++ 2 files changed, 87 insertions(+)
tools/testing/selftests/bpf/trace_helpers.c +82 -0
@@ -11,6 +11,9 @@#include <linux/perf_event.h> #include <sys/mman.h> #include "trace_helpers.h" +#include <linux/limits.h> +#include <libelf.h> +#include <gelf.h> #define DEBUGFS "/sys/kernel/debug/tracing/"
@@ -224,3 +227,82 @@ ssize_t get_rel_offset(uintptr_t addr)fclose (f);return -EINVAL ; } + +static int +parse_build_id_buf (const void *note_start,Elf32_Word note_size,char *build_id) +{ +Elf32_Word note_offs =0 ; + +while (note_offs +sizeof (Elf32_Nhdr) < note_size) { +Elf32_Nhdr *nhdr = (Elf32_Nhdr *)(note_start + note_offs); + +if (nhdr->n_type ==3 && nhdr->n_namesz ==sizeof ("GNU" ) && + !strcmp ((char *)(nhdr +1 ),"GNU" ) && nhdr->n_descsz >0 && + nhdr->n_descsz <=BPF_BUILD_ID_SIZE ) { +memcpy (build_id, note_start + note_offs + +ALIGN (sizeof ("GNU" ),4 ) +sizeof (Elf32_Nhdr), nhdr->n_descsz); +memset (build_id + nhdr->n_descsz,0 ,BPF_BUILD_ID_SIZE - nhdr->n_descsz); +return (int ) nhdr->n_descsz; + } + + note_offs = note_offs +sizeof (Elf32_Nhdr) + +ALIGN (nhdr->n_namesz,4 ) +ALIGN (nhdr->n_descsz,4 ); + } + +return -ENOENT ; +} + +/* Reads binary from *path* file and returns it in the *build_id* buffer +* with *size* which is expected to be at least BPF_BUILD_ID_SIZE bytes. +* Returns size of build id on success. On error the error value is +* returned. +*/ +int read_build_id (const char *path,char *build_id,size_t size) +{ +int fd, err = -EINVAL ; +Elf *elf =NULL ; +GElf_Ehdr ehdr; +size_t max, i; + +if (size <BPF_BUILD_ID_SIZE ) +return -EINVAL ; + + fd =open (path,O_RDONLY |O_CLOEXEC ); +if (fd <0 ) +return -errno; + + (void )elf_version (EV_CURRENT ); + + elf =elf_begin (fd,ELF_C_READ_MMAP ,NULL ); +if (!elf) + goto out; +if (elf_kind (elf) !=ELF_K_ELF ) + goto out; +if (!gelf_getehdr (elf, &ehdr)) + goto out; + +for (i =0 ; i < ehdr.e_phnum; i++) { +GElf_Phdr mem, *phdr; +char *data; + + phdr =gelf_getphdr (elf, i, &mem); +if (!phdr) + goto out; +if (phdr->p_type !=PT_NOTE ) +continue ; + data =elf_rawfile (elf, &max); +if (!data) + goto out; +if (phdr->p_offset + phdr->p_memsz > max) + goto out; + err =parse_build_id_buf (data + phdr->p_offset, phdr->p_memsz, build_id); +if (err >0 ) +break ; + } + +out: +if (elf) +elf_end (elf); +close (fd); +return err; +}
tools/testing/selftests/bpf/trace_helpers.h +5 -0
@@ -4,6 +4,9 @@#include <bpf/libbpf.h> +#define __ALIGN_MASK (x, mask) (((x)+(mask))&~(mask)) +#define ALIGN (x, a) __ALIGN_MASK(x, (typeof(x))(a)-1) +struct ksym {long addr;char *name;
@@ -21,4 +24,6 @@ void read_trace_pipe(void);ssize_t get_uprobe_offset (const void *addr);ssize_t get_rel_offset (uintptr_t addr); +int read_build_id (const char *path,char *build_id,size_t size); +#endif
Signature · 1 line
2.43.0
PATCH v2 6/11 bpf: Fix a few selftest failures due to llvm18 change
In reply to Paul ChaignonFrom: Yonghong Song <[email protected]>
[ Upstream commit b16904fd9f01b580db357ef2b1cc9e86d89576c2 ]
With latest upstream llvm18, the following test cases failed:
$ ./test_progs -j #13/2 bpf_cookie/multi_kprobe_link_api:FAIL #13/3 bpf_cookie/multi_kprobe_attach_api:FAIL #13 bpf_cookie:FAIL #77 fentry_fexit:FAIL #78/1 fentry_test/fentry:FAIL #78 fentry_test:FAIL #82/1 fexit_test/fexit:FAIL #82 fexit_test:FAIL #112/1 kprobe_multi_test/skel_api:FAIL #112/2 kprobe_multi_test/link_api_addrs:FAIL [...] #112 kprobe_multi_test:FAIL #356/17 test_global_funcs/global_func17:FAIL #356 test_global_funcs:FAIL
Further analysis shows llvm upstream patch [1] is responsible for the above failures. For example, for function bpf_fentry_test7() in net/bpf/test_run.c, without [1], the asm code is:
0000000000000400 <bpf_fentry_test7>:
400: f3 0f 1e fa endbr64
404: e8 00 00 00 00 callq 0x409 <bpf_fentry_test7+0x9>
409: 48 89 f8 movq %rdi, %rax
40c: c3 retq
40d: 0f 1f 00 nopl (%rax)... and with [1], the asm code is:
0000000000005d20 <bpf_fentry_test7.specialized.1>:
5d20: e8 00 00 00 00 callq 0x5d25 <bpf_fentry_test7.specialized.1+0x5>
5d25: c3 retq
... and <bpf_fentry_test7.specialized.1> is called instead of <bpf_fentry_test7> and this caused test failures for #13/#77 etc. except #356.
For test case #356/17, with [1] (progs/test_global_func17.c)), the main prog looks like:
0000000000000000 <global_func17>:
0: b4 00 00 00 2a 00 00 00 w0 = 0x2a
1: 95 00 00 00 00 00 00 00 exit... which passed verification while the test itself expects a verification failure.
Let us add 'barrier_var' style asm code in both places to prevent function specialization which caused selftests failure.
[1] https://github.com/llvm/llvm-project/pull/72903
[ Note: The change to test_run.c conflicted and was dropped. The related
tests are not failing anyway. ]
--- tools/testing/selftests/bpf/progs/test_global_func17.c | 1 + 1 file changed, 1 insertion(+)
tools/testing/selftests/bpf/progs/test_global_func17.c +1 -0
@@ -5,6 +5,7 @@ __noinline int foo(int *p) { +barrier_var (p);return p ? (*p =42 ) :0 ; }
Signature · 1 line
2.43.0
PATCH v2 7/11 selftests/bpf: Update bpf_clone_redirect expected return code
In reply to Paul ChaignonFrom: Stanislav Fomichev <[email protected]>
[ Upstream commit b772b70b69046c5b76e3f2eda680f692dee5e6d5 ]
Commit 151e887d8ff9 ("veth: Fixing transmit return status for dropped packets") started propagating proper NET_XMIT_DROP error to the caller which means it's now possible to get positive error code when calling bpf_clone_redirect() in this particular test. Update the test to reflect that.
[ Note: Commit 151e887d8ff9 was backported to 6.1 so this fix should be
as well. ]
--- tools/testing/selftests/bpf/prog_tests/empty_skb.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-)
tools/testing/selftests/bpf/prog_tests/empty_skb.c +10 -2
@@ -29,6 +29,7 @@ void serial_test_empty_skb(void)int *ifindex;int err;int ret; +int lwt_egress_ret;/* expected retval at lwt/egress */ bool success_on_tc; } tests[] = {/* Empty packets are always rejected. */
@@ -62,6 +63,7 @@ void serial_test_empty_skb(void) .data_size_in = sizeof(eth_hlen), .ifindex = &veth_ifindex, .ret = -ERANGE, + .lwt_egress_ret = -ERANGE, .success_on_tc = true, }, {
@@ -75,6 +77,7 @@ void serial_test_empty_skb(void) .data_size_in = sizeof(eth_hlen), .ifindex = &ipip_ifindex, .ret = -ERANGE, + .lwt_egress_ret = -ERANGE, },/* ETH_HLEN+1-sized packet should be redirected. */
@@ -84,6 +87,7 @@ void serial_test_empty_skb(void) .data_in = eth_hlen_pp, .data_size_in = sizeof(eth_hlen_pp), .ifindex = &veth_ifindex, + .lwt_egress_ret = 1, /* veth_xmit NET_XMIT_DROP */ }, { .msg = "ipip ETH_HLEN+1 packet ingress",
@@ -113,8 +117,12 @@ void serial_test_empty_skb(void)for (i =0 ; i <ARRAY_SIZE (tests); i++) {bpf_object__for_each_program (prog, bpf_obj->obj) { -char buf[128 ]; +bool at_egress =strstr (bpf_program__name (prog),"egress" ) !=NULL ;bool at_tc = !strncmp (bpf_program__section_name (prog),"tc" ,2 ); +int expected_ret; +char buf[128 ]; + + expected_ret = at_egress && !at_tc ? tests[i].lwt_egress_ret : tests[i].ret; tattr.data_in = tests[i].data_in; tattr.data_size_in = tests[i].data_size_in;
@@ -133,7 +141,7 @@ void serial_test_empty_skb(void)if (at_tc && tests[i].success_on_tc)ASSERT_GE (bpf_obj->bss->ret,0 , buf);else -ASSERT_EQ (bpf_obj->bss->ret, tests[i].ret, buf); +ASSERT_EQ (bpf_obj->bss->ret, expected_ret, buf); } }
Signature · 1 line
2.43.0
PATCH v2 8/11 selftests/bpf: enhance align selftest's expected log matching
In reply to Paul ChaignonFrom: Andrii Nakryiko <[email protected]>
[ Upstream commit 6f876e75d316a75957f3d43c3a8c2a6fe9bc18b2 ]
Allow to search for expected register state in all the verifier log output that's related to specified instruction number.
See added comment for an example of possible situation that is happening due to a simple enhancement done in the next patch, which fixes handling of env->test_state_freq flag in state checkpointing logic.
[ Note: Backport needed to fix the align selftest where some of the
expected log messages can't be found. This is happening because commit 1a8a315f008a ("bpf: Ensure proper register state printing for cond jumps") was also backported to 6.1. ]
--- tools/testing/selftests/bpf/prog_tests/align.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-)
tools/testing/selftests/bpf/prog_tests/align.c +12 -6
@@ -660,16 +660,22 @@ static int do_test_single(struct bpf_align_test *test)* func#0 @0 * 0: R1=ctx(off=0,imm=0) R10=fp0 * 0: (b7) r3 = 2 ; R3_w=2 +* +* Sometimes it's actually two lines below, e.g. when +* searching for "6: R3_w=scalar(umax=255,var_off=(0x0; 0xff))": +* from 4 to 6: R0_w=pkt(off=8,r=8,imm=0) R1=ctx(off=0,imm=0) R2_w=pkt(off=0,r=8,imm=0) R3_w=pkt_end(off=0,imm=0) R10=fp0 +* 6: R0_w=pkt(off=8,r=8,imm=0) R1=ctx(off=0,imm=0) R2_w=pkt(off=0,r=8,imm=0) R3_w=pkt_end(off=0,imm=0) R10=fp0 +* 6: (71) r3 = *(u8 *)(r2 +0) ; R2_w=pkt(off=0,r=8,imm=0) R3_w=scalar(umax=255,var_off=(0x0; 0xff)) */ -if (!strstr (line_ptr, m.match)) { +while (!strstr (line_ptr, m.match)) { cur_line =-1 ; line_ptr =strtok (NULL ,"\n" ); -sscanf (line_ptr,"%u: " , &cur_line); +sscanf (line_ptr ?:"" ,"%u: " , &cur_line); +if (!line_ptr || cur_line != m.line) +break ; } -if (cur_line != m.line || !line_ptr || - !strstr (line_ptr, m.match)) { -printf ("Failed to find match %u: %s\n" , - m.line, m.match); +if (cur_line != m.line || !line_ptr || !strstr (line_ptr, m.match)) { +printf ("Failed to find match %u: %s\n" , m.line, m.match); ret =1 ;printf ("%s" , bpf_vlog);break ;
Signature · 1 line
2.43.0
PATCH v2 9/11 Revert "selftests/bpf: Add a cgroup prog bpf_get_ns_current_pid_tgid() test"
In reply to Paul ChaignonThis reverts commit 4d8fb7ed7a55 ("selftests/bpf: Add a cgroup prog bpf_get_ns_current_pid_tgid() test").
That commit should have never been backported to 6.1 because it introduces a test for a feature that isn't supported:bpf_get_ns_current_pid_tgid() cannot be called from cgroup BPF programs in 6.1.
--- .../bpf/prog_tests/ns_current_pid_tgid.c | 73 ------------------- .../bpf/progs/test_ns_current_pid_tgid.c | 7 -- 2 files changed, 80 deletions(-)
tools/testing/selftests/bpf/prog_tests/ns_current_pid_tgid.c +0 -73
@@ -12,7 +12,6 @@#include <sys/wait.h> #include <sys/mount.h> #include <fcntl.h> -#include "network_helpers.h" #define STACK_SIZE (1024 * 1024)static char child_stack[STACK_SIZE ];
@@ -75,50 +74,6 @@ static int test_current_pid_tgid_tp(void *args)return ret; } -static int test_current_pid_tgid_cgrp (void *args) -{ -struct test_ns_current_pid_tgid__bss *bss; -struct test_ns_current_pid_tgid *skel; -int server_fd =-1 , ret =-1 , err; -int cgroup_fd = *(int *)args; -pid_t tgid, pid; - - skel =test_ns_current_pid_tgid__open (); -if (!ASSERT_OK_PTR (skel,"test_ns_current_pid_tgid__open" )) -return ret; - -bpf_program__set_autoload (skel->progs.cgroup_bind4, true); - - err =test_ns_current_pid_tgid__load (skel); -if (!ASSERT_OK (err,"test_ns_current_pid_tgid__load" )) - goto cleanup; - - bss = skel->bss; -if (get_pid_tgid (&pid, &tgid, bss)) - goto cleanup; - - skel->links.cgroup_bind4 =bpf_program__attach_cgroup ( - skel->progs.cgroup_bind4, cgroup_fd); -if (!ASSERT_OK_PTR (skel->links.cgroup_bind4,"bpf_program__attach_cgroup" )) - goto cleanup; - - server_fd =start_server (AF_INET ,SOCK_STREAM ,NULL ,0 ,0 ); -if (!ASSERT_GE (server_fd,0 ,"start_server" )) - goto cleanup; - -if (!ASSERT_EQ (bss->user_pid, pid,"pid" )) - goto cleanup; -if (!ASSERT_EQ (bss->user_tgid, tgid,"tgid" )) - goto cleanup; - ret =0 ; - -cleanup: -if (server_fd >=0 ) -close (server_fd); -test_ns_current_pid_tgid__destroy (skel); -return ret; -} -static void test_ns_current_pid_tgid_new_ns (int (*fn)(void *),void *arg) {int wstatus;
@@ -140,25 +95,6 @@ static void test_ns_current_pid_tgid_new_ns(int (*fn)(void *), void *arg)return ; } -static void test_in_netns (int (*fn)(void *),void *arg) -{ -struct nstoken *nstoken =NULL ; - -SYS (cleanup,"ip netns add ns_current_pid_tgid" ); -SYS (cleanup,"ip -net ns_current_pid_tgid link set dev lo up" ); - - nstoken =open_netns ("ns_current_pid_tgid" ); -if (!ASSERT_OK_PTR (nstoken,"open_netns" )) - goto cleanup; - -test_ns_current_pid_tgid_new_ns (fn, arg); - -cleanup: -if (nstoken) -close_netns (nstoken); -SYS_NOFAIL ("ip netns del ns_current_pid_tgid" ); -} -/* TODO: use a different tracepoint */ void serial_test_ns_current_pid_tgid (void ) {
@@ -166,13 +102,4 @@ void serial_test_ns_current_pid_tgid(void)test_current_pid_tgid_tp (NULL );if (test__start_subtest ("new_ns_tp" ))test_ns_current_pid_tgid_new_ns (test_current_pid_tgid_tp,NULL ); -if (test__start_subtest ("new_ns_cgrp" )) { -int cgroup_fd =-1 ; - - cgroup_fd =test__join_cgroup ("/sock_addr" ); -if (ASSERT_GE (cgroup_fd,0 ,"join_cgroup" )) { -test_in_netns (test_current_pid_tgid_cgrp, &cgroup_fd); -close (cgroup_fd); - } - } }
tools/testing/selftests/bpf/progs/test_ns_current_pid_tgid.c +0 -7
@@ -28,11 +28,4 @@ int tp_handler(const void *ctx)return 0 ; } -SEC("?cgroup/bind4") -int cgroup_bind4 (struct bpf_sock_addr *ctx) -{ -get_pid_tgid (); -return 1 ; -} - char _license[] SEC("license") = "GPL";
Signature · 1 line
2.43.0
PATCH v2 10/11 selftests/bpf: Fix ARG_PTR_TO_LONG {half-,}uninitialized test
In reply to Paul ChaignonFrom: Daniel Borkmann <[email protected]>
[ Upstream commit b8e188f023e07a733b47d5865311ade51878fe40 ]
The assumption of 'in privileged mode reads from uninitialized stack locations are permitted' is not quite correct since the verifier was probing for read access rather than write access. Both tests need to be annotated as __success for privileged and unprivileged.
[ Note: The format of logs completely changed since 6.1 so this change
had to be reapplied to the old test file. This commit needs to be backported because it fixes a test broken by commit 32556ce93bc4 ("bpf: Fix helper writes to read-only maps") from the same patchset. ]
--- tools/testing/selftests/bpf/verifier/int_ptr.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-)
tools/testing/selftests/bpf/verifier/int_ptr.c +1 -5
@@ -25,9 +25,8 @@BPF_MOV64_IMM (BPF_REG_0 ,1 ), BPF_EXIT_INSN(), }, - .result =REJECT , + .result =ACCEPT , .prog_type = BPF_PROG_TYPE_CGROUP_SYSCTL, - .errstr = "invalid indirect read from stack R4 off -16+0 size 8", }, { "ARG_PTR_TO_LONG half-uninitialized",
@@ -57,9 +56,6 @@BPF_MOV64_IMM (BPF_REG_0 ,0 ), BPF_EXIT_INSN(), }, - .result_unpriv =REJECT , - .errstr_unpriv = "invalid indirect read from stack R4 off -16+4 size 8", -/* in privileged mode reads from uninitialized stack locations are permitted */ .result = ACCEPT, }, {
Signature · 1 line
2.43.0
PATCH v2 11/11 selftests/bpf: S/iptables/iptables-legacy/ in the bpf_nf and xdp_synproxy test
In reply to Paul ChaignonFrom: Martin KaFai Lau <[email protected]>
[ Upstream commit de9c8d848d90cf2e53aced50b350827442ca5a4f ]
The recent vm image in CI has reported error in selftests that use the iptables command. Manu Bretelle has pointed out the difference in the recent vm image that the iptables is sym-linked to the iptables-nft. With this knowledge, I can also reproduce the CI error by manually running with the 'iptables-nft'.
This patch is to replace the iptables command with iptables-legacy to unblock the CI tests.
--- tools/testing/selftests/bpf/prog_tests/bpf_nf.c | 6 +++--- tools/testing/selftests/bpf/prog_tests/xdp_synproxy.c | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-)
tools/testing/selftests/bpf/prog_tests/bpf_nf.c +3 -3
@@ -49,14 +49,14 @@ static int connect_to_server(int srv_fd)static void test_bpf_nf_ct (int mode) { -const char *iptables ="iptables -t raw %s PREROUTING -j CONNMARK --set-mark 42/0" ; +const char *iptables ="iptables-legacy -t raw %s PREROUTING -j CONNMARK --set-mark 42/0" ;int srv_fd =-1 , client_fd =-1 , srv_client_fd =-1 ;struct sockaddr_in peer_addr = {};struct test_bpf_nf *skel;int prog_fd, err;socklen_t len;u16 srv_port; -char cmd[64 ]; +char cmd[128 ]; LIBBPF_OPTS(bpf_test_run_opts, topts, .data_in = &pkt_v4, .data_size_in = sizeof(pkt_v4),
@@ -69,7 +69,7 @@ static void test_bpf_nf_ct(int mode)/* Enable connection tracking */ snprintf (cmd,sizeof (cmd), iptables,"-A" ); -if (!ASSERT_OK (system (cmd),"iptables" )) +if (!ASSERT_OK (system (cmd), cmd)) goto end; srv_port = (mode ==TEST_XDP ) ?5005 :5006 ;
tools/testing/selftests/bpf/prog_tests/xdp_synproxy.c +3 -3
@@ -94,12 +94,12 @@ static void test_synproxy(bool xdp)SYS ("sysctl -w net.ipv4.tcp_syncookies=2" );SYS ("sysctl -w net.ipv4.tcp_timestamps=1" );SYS ("sysctl -w net.netfilter.nf_conntrack_tcp_loose=0" ); -SYS ("iptables -t raw -I PREROUTING \ +SYS ("iptables-legacy -t raw -I PREROUTING \ -i tmp1 -p tcp -m tcp --syn --dport 8080 -j CT --notrack" ); -SYS ("iptables -t filter -A INPUT \ +SYS ("iptables-legacy -t filter -A INPUT \ -i tmp1 -p tcp -m tcp --dport 8080 -m state --state INVALID,UNTRACKED \ -j SYNPROXY --sack-perm --timestamp --wscale 7 --mss 1460" ); -SYS ("iptables -t filter -A INPUT \ +SYS ("iptables-legacy -t filter -A INPUT \ -i tmp1 -m state --state INVALID -j DROP" ); ctrl_file = SYS_OUT("./xdp_synproxy --iface tmp1 --ports 8080 \
Signature · 1 line
2.43.0
Queued for 6.1.y, thanks.
Signature · 2 lines
Thanks, Sasha