diff --git a/.gitignore b/.gitignore index 2bcde78..bc3cf27 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,6 @@ # SPDX-License-Identifier: MIT .vscode -build \ No newline at end of file +build +_codeql_build_dir +_codeql_detected_source_root \ No newline at end of file diff --git a/runner/CMakeLists.txt b/runner/CMakeLists.txt index 05c7cd4..9dde04d 100644 --- a/runner/CMakeLists.txt +++ b/runner/CMakeLists.txt @@ -29,6 +29,11 @@ if (HAS_BPF_TEST_RUN_OPTS_BATCH_SIZE) add_compile_definitions(HAS_BPF_TEST_RUN_OPTS_BATCH_SIZE) endif() +Check_struct_has_member("bpf_test_run_opts" "flags" ${EBPF_INC_PATH}/bpf/bpf.h HAS_BPF_TEST_RUN_OPTS_FLAGS LANGUAGE CXX) +if (HAS_BPF_TEST_RUN_OPTS_FLAGS) + add_compile_definitions(HAS_BPF_TEST_RUN_OPTS_FLAGS) +endif() + set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin) diff --git a/runner/runner.cc b/runner/runner.cc index 81c0ec9..80252c8 100644 --- a/runner/runner.cc +++ b/runner/runner.cc @@ -14,6 +14,14 @@ #include #include +#if defined(__linux__) +#include +// Define BPF_F_TEST_XDP_LIVE_FRAMES if not already defined +#ifndef BPF_F_TEST_XDP_LIVE_FRAMES +#define BPF_F_TEST_XDP_LIVE_FRAMES (1U << 1) +#endif +#endif + // Define unique_ptr to call bpf_object__close on destruction struct bpf_object_deleter { @@ -209,6 +217,7 @@ main(int argc, char** argv) std::string elf_file = test["elf_file"].as(); int iteration_count = test["iteration_count"].as(); std::optional program_type; + bpf_prog_type actual_prog_type = DEFAULT_PROG_TYPE; int batch_size; bool pass_data = DEFAULT_PASS_DATA; bool pass_context = DEFAULT_PASS_CONTEXT; @@ -289,6 +298,7 @@ main(int argc, char** argv) prog_type = DEFAULT_PROG_TYPE; attach_type = DEFAULT_ATTACH_TYPE; } + actual_prog_type = prog_type; (void)bpf_program__set_type(program, prog_type); } @@ -344,6 +354,12 @@ main(int argc, char** argv) opts.ctx_size_in = static_cast(data_in.size()); opts.ctx_size_out = static_cast(data_out.size()); } +#if defined(HAS_BPF_TEST_RUN_OPTS_FLAGS) && defined(__linux__) + // Set BPF_F_TEST_XDP_LIVE_FRAMES flag for XDP programs on Linux + if (actual_prog_type == BPF_PROG_TYPE_XDP) { + opts.flags |= BPF_F_TEST_XDP_LIVE_FRAMES; + } +#endif if (bpf_prog_test_run_opts(bpf_program__fd(map_state_preparation_program), &opts)) { throw std::runtime_error("Failed to run map_state_preparation program " + prep_program_name); @@ -458,6 +474,12 @@ main(int argc, char** argv) #if defined(HAS_BPF_TEST_RUN_OPTS_BATCH_SIZE) opt.batch_size = batch_size; #endif +#if defined(HAS_BPF_TEST_RUN_OPTS_FLAGS) && defined(__linux__) + // Set BPF_F_TEST_XDP_LIVE_FRAMES flag for XDP programs on Linux + if (actual_prog_type == BPF_PROG_TYPE_XDP) { + opt.flags |= BPF_F_TEST_XDP_LIVE_FRAMES; + } +#endif int result = bpf_prog_test_run_opts(program, &opt); if (result < 0) {