]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
selftests/bpf: Add a few helpers for bpftool testing
authorAlexis Lothoré (eBPF Foundation) <alexis.lothore@bootlin.com>
Fri, 23 Jan 2026 08:30:08 +0000 (09:30 +0100)
committerAlexei Starovoitov <ast@kernel.org>
Tue, 27 Jan 2026 02:47:21 +0000 (18:47 -0800)
In order to integrate some bpftool tests into test_progs, define a few
specific helpers that allow to execute bpftool commands, while possibly
retrieving the command output. Those helpers most notably set the
path to the bpftool binary under test. This version checks different
possible paths relative to the directories where the different
test_progs runners are executed, as we want to make sure not to
accidentally use a bootstrap version of the binary.

Signed-off-by: Alexis Lothoré (eBPF Foundation) <alexis.lothore@bootlin.com>
Link: https://lore.kernel.org/r/20260123-bpftool-tests-v4-1-a6653a7f28e7@bootlin.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
tools/testing/selftests/bpf/Makefile
tools/testing/selftests/bpf/bpftool_helpers.c [new file with mode: 0644]
tools/testing/selftests/bpf/bpftool_helpers.h [new file with mode: 0644]

index 9488d076c74070f7f57707f44b9d7472ced928e5..2cc559ecc7230b84192488586fdfc033f2995213 100644 (file)
@@ -747,7 +747,8 @@ TRUNNER_EXTRA_SOURCES := test_progs.c               \
                         json_writer.c          \
                         $(VERIFY_SIG_HDR)              \
                         flow_dissector_load.h  \
-                        ip_check_defrag_frags.h
+                        ip_check_defrag_frags.h        \
+                        bpftool_helpers.c
 TRUNNER_LIB_SOURCES := find_bit.c
 TRUNNER_EXTRA_FILES := $(OUTPUT)/urandom_read                          \
                       $(OUTPUT)/liburandom_read.so                     \
diff --git a/tools/testing/selftests/bpf/bpftool_helpers.c b/tools/testing/selftests/bpf/bpftool_helpers.c
new file mode 100644 (file)
index 0000000..a582494
--- /dev/null
@@ -0,0 +1,74 @@
+// SPDX-License-Identifier: GPL-2.0-only
+#include "bpftool_helpers.h"
+#include <unistd.h>
+#include <string.h>
+#include <stdbool.h>
+
+#define BPFTOOL_PATH_MAX_LEN           64
+#define BPFTOOL_FULL_CMD_MAX_LEN       512
+
+#define BPFTOOL_DEFAULT_PATH           "tools/sbin/bpftool"
+
+static int detect_bpftool_path(char *buffer)
+{
+       char tmp[BPFTOOL_PATH_MAX_LEN];
+
+       /* Check default bpftool location (will work if we are running the
+        * default flavor of test_progs)
+        */
+       snprintf(tmp, BPFTOOL_PATH_MAX_LEN, "./%s", BPFTOOL_DEFAULT_PATH);
+       if (access(tmp, X_OK) == 0) {
+               strncpy(buffer, tmp, BPFTOOL_PATH_MAX_LEN);
+               return 0;
+       }
+
+       /* Check alternate bpftool location (will work if we are running a
+        * specific flavor of test_progs, e.g. cpuv4 or no_alu32)
+        */
+       snprintf(tmp, BPFTOOL_PATH_MAX_LEN, "../%s", BPFTOOL_DEFAULT_PATH);
+       if (access(tmp, X_OK) == 0) {
+               strncpy(buffer, tmp, BPFTOOL_PATH_MAX_LEN);
+               return 0;
+       }
+
+       /* Failed to find bpftool binary */
+       return 1;
+}
+
+static int run_command(char *args, char *output_buf, size_t output_max_len)
+{
+       static char bpftool_path[BPFTOOL_PATH_MAX_LEN] = {0};
+       bool suppress_output = !(output_buf && output_max_len);
+       char command[BPFTOOL_FULL_CMD_MAX_LEN];
+       FILE *f;
+       int ret;
+
+       /* Detect and cache bpftool binary location */
+       if (bpftool_path[0] == 0 && detect_bpftool_path(bpftool_path))
+               return 1;
+
+       ret = snprintf(command, BPFTOOL_FULL_CMD_MAX_LEN, "%s %s%s",
+                      bpftool_path, args,
+                      suppress_output ? " > /dev/null 2>&1" : "");
+
+       f = popen(command, "r");
+       if (!f)
+               return 1;
+
+       if (!suppress_output)
+               fread(output_buf, 1, output_max_len, f);
+       ret = pclose(f);
+
+       return ret;
+}
+
+int run_bpftool_command(char *args)
+{
+       return run_command(args, NULL, 0);
+}
+
+int get_bpftool_command_output(char *args, char *output_buf, size_t output_max_len)
+{
+       return run_command(args, output_buf, output_max_len);
+}
+
diff --git a/tools/testing/selftests/bpf/bpftool_helpers.h b/tools/testing/selftests/bpf/bpftool_helpers.h
new file mode 100644 (file)
index 0000000..dec1ba2
--- /dev/null
@@ -0,0 +1,11 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+#pragma once
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdbool.h>
+
+#define MAX_BPFTOOL_CMD_LEN    (256)
+
+int run_bpftool_command(char *args);
+int get_bpftool_command_output(char *args, char *output_buf, size_t output_max_len);