Daniel Borkmann says:
====================
The following pull-request contains BPF updates for your *net-next* tree.
There is a small merge conflict in libbpf (Cc Andrii so he's in the loop
as well):
for (i = 1; i <= btf__get_nr_types(btf); i++) {
t = (struct btf_type *)btf__type_by_id(btf, i);
if (!has_datasec && btf_is_var(t)) {
/* replace VAR with INT */
t->info = BTF_INFO_ENC(BTF_KIND_INT, 0, 0);
<<<<<<< HEAD
/*
* using size = 1 is the safest choice, 4 will be too
* big and cause kernel BTF validation failure if
* original variable took less than 4 bytes
*/
t->size = 1;
*(int *)(t+1) = BTF_INT_ENC(0, 0, 8);
} else if (!has_datasec && kind == BTF_KIND_DATASEC) {
=======
t->size = sizeof(int);
*(int *)(t + 1) = BTF_INT_ENC(0, 0, 32);
} else if (!has_datasec && btf_is_datasec(t)) {
>>>>>>> 72ef80b5ee
/* replace DATASEC with STRUCT */
Conflict is between the two commits 1d4126c4e1 ("libbpf: sanitize VAR to
conservative 1-byte INT") and b03bc6853c ("libbpf: convert libbpf code to
use new btf helpers"), so we need to pick the sanitation fixup as well as
use the new btf_is_datasec() helper and the whitespace cleanup. Looks like
the following:
[...]
if (!has_datasec && btf_is_var(t)) {
/* replace VAR with INT */
t->info = BTF_INFO_ENC(BTF_KIND_INT, 0, 0);
/*
* using size = 1 is the safest choice, 4 will be too
* big and cause kernel BTF validation failure if
* original variable took less than 4 bytes
*/
t->size = 1;
*(int *)(t + 1) = BTF_INT_ENC(0, 0, 8);
} else if (!has_datasec && btf_is_datasec(t)) {
/* replace DATASEC with STRUCT */
[...]
The main changes are:
1) Addition of core parts of compile once - run everywhere (co-re) effort,
that is, relocation of fields offsets in libbpf as well as exposure of
kernel's own BTF via sysfs and loading through libbpf, from Andrii.
More info on co-re: http://vger.kernel.org/bpfconf2019.html#session-2
and http://vger.kernel.org/lpc-bpf2018.html#session-2
2) Enable passing input flags to the BPF flow dissector to customize parsing
and allowing it to stop early similar to the C based one, from Stanislav.
3) Add a BPF helper function that allows generating SYN cookies from XDP and
tc BPF, from Petar.
4) Add devmap hash-based map type for more flexibility in device lookup for
redirects, from Toke.
5) Improvements to XDP forwarding sample code now utilizing recently enabled
devmap lookups, from Jesper.
6) Add support for reporting the effective cgroup progs in bpftool, from Jakub
and Takshak.
7) Fix reading kernel config from bpftool via /proc/config.gz, from Peter.
8) Fix AF_XDP umem pages mapping for 32 bit architectures, from Ivan.
9) Follow-up to add two more BPF loop tests for the selftest suite, from Alexei.
10) Add perf event output helper also for other skb-based program types, from Allan.
11) Fix a co-re related compilation error in selftests, from Yonghong.
====================
Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
288 lines
9.3 KiB
Makefile
288 lines
9.3 KiB
Makefile
# SPDX-License-Identifier: GPL-2.0
|
|
include ../../../../scripts/Kbuild.include
|
|
include ../../../scripts/Makefile.arch
|
|
|
|
LIBDIR := ../../../lib
|
|
BPFDIR := $(LIBDIR)/bpf
|
|
APIDIR := ../../../include/uapi
|
|
GENDIR := ../../../../include/generated
|
|
GENHDR := $(GENDIR)/autoconf.h
|
|
|
|
ifneq ($(wildcard $(GENHDR)),)
|
|
GENFLAGS := -DHAVE_GENHDR
|
|
endif
|
|
|
|
CLANG ?= clang
|
|
LLC ?= llc
|
|
LLVM_OBJCOPY ?= llvm-objcopy
|
|
LLVM_READELF ?= llvm-readelf
|
|
BTF_PAHOLE ?= pahole
|
|
CFLAGS += -g -Wall -O2 -I$(APIDIR) -I$(LIBDIR) -I$(BPFDIR) -I$(GENDIR) $(GENFLAGS) -I../../../include \
|
|
-Dbpf_prog_load=bpf_prog_test_load \
|
|
-Dbpf_load_program=bpf_test_load_program
|
|
LDLIBS += -lcap -lelf -lrt -lpthread
|
|
|
|
# Order correspond to 'make run_tests' order
|
|
TEST_GEN_PROGS = test_verifier test_tag test_maps test_lru_map test_lpm_map test_progs \
|
|
test_align test_verifier_log test_dev_cgroup test_tcpbpf_user \
|
|
test_sock test_btf test_sockmap get_cgroup_id_user test_socket_cookie \
|
|
test_cgroup_storage test_select_reuseport test_section_names \
|
|
test_netcnt test_tcpnotify_user test_sock_fields test_sysctl test_hashmap \
|
|
test_btf_dump test_cgroup_attach xdping test_sockopt test_sockopt_sk \
|
|
test_sockopt_multi test_tcp_rtt
|
|
|
|
BPF_OBJ_FILES = $(patsubst %.c,%.o, $(notdir $(wildcard progs/*.c)))
|
|
TEST_GEN_FILES = $(BPF_OBJ_FILES)
|
|
|
|
# Also test sub-register code-gen if LLVM has eBPF v3 processor support which
|
|
# contains both ALU32 and JMP32 instructions.
|
|
SUBREG_CODEGEN := $(shell echo "int cal(int a) { return a > 0; }" | \
|
|
$(CLANG) -target bpf -O2 -emit-llvm -S -x c - -o - | \
|
|
$(LLC) -mattr=+alu32 -mcpu=v3 2>&1 | \
|
|
grep 'if w')
|
|
ifneq ($(SUBREG_CODEGEN),)
|
|
TEST_GEN_FILES += $(patsubst %.o,alu32/%.o, $(BPF_OBJ_FILES))
|
|
endif
|
|
|
|
# Order correspond to 'make run_tests' order
|
|
TEST_PROGS := test_kmod.sh \
|
|
test_libbpf.sh \
|
|
test_xdp_redirect.sh \
|
|
test_xdp_meta.sh \
|
|
test_xdp_veth.sh \
|
|
test_offload.py \
|
|
test_sock_addr.sh \
|
|
test_tunnel.sh \
|
|
test_lwt_seg6local.sh \
|
|
test_lirc_mode2.sh \
|
|
test_skb_cgroup_id.sh \
|
|
test_flow_dissector.sh \
|
|
test_xdp_vlan_mode_generic.sh \
|
|
test_xdp_vlan_mode_native.sh \
|
|
test_lwt_ip_encap.sh \
|
|
test_tcp_check_syncookie.sh \
|
|
test_tc_tunnel.sh \
|
|
test_tc_edt.sh \
|
|
test_xdping.sh
|
|
|
|
TEST_PROGS_EXTENDED := with_addr.sh \
|
|
with_tunnels.sh \
|
|
tcp_client.py \
|
|
tcp_server.py
|
|
|
|
# Compile but not part of 'make run_tests'
|
|
TEST_GEN_PROGS_EXTENDED = test_libbpf_open test_sock_addr test_skb_cgroup_id_user \
|
|
flow_dissector_load test_flow_dissector test_tcp_check_syncookie_user \
|
|
test_lirc_mode2_user
|
|
|
|
include ../lib.mk
|
|
|
|
# NOTE: $(OUTPUT) won't get default value if used before lib.mk
|
|
TEST_CUSTOM_PROGS = $(OUTPUT)/urandom_read
|
|
all: $(TEST_CUSTOM_PROGS)
|
|
|
|
$(OUTPUT)/urandom_read: $(OUTPUT)/%: %.c
|
|
$(CC) -o $@ $< -Wl,--build-id
|
|
|
|
$(OUTPUT)/test_stub.o: test_stub.c
|
|
$(CC) $(TEST_PROGS_CFLAGS) $(CFLAGS) -c -o $@ $<
|
|
|
|
BPFOBJ := $(OUTPUT)/libbpf.a
|
|
|
|
$(TEST_GEN_PROGS): $(OUTPUT)/test_stub.o $(BPFOBJ)
|
|
|
|
$(TEST_GEN_PROGS_EXTENDED): $(OUTPUT)/test_stub.o $(OUTPUT)/libbpf.a
|
|
|
|
$(OUTPUT)/test_dev_cgroup: cgroup_helpers.c
|
|
$(OUTPUT)/test_skb_cgroup_id_user: cgroup_helpers.c
|
|
$(OUTPUT)/test_sock: cgroup_helpers.c
|
|
$(OUTPUT)/test_sock_addr: cgroup_helpers.c
|
|
$(OUTPUT)/test_socket_cookie: cgroup_helpers.c
|
|
$(OUTPUT)/test_sockmap: cgroup_helpers.c
|
|
$(OUTPUT)/test_tcpbpf_user: cgroup_helpers.c
|
|
$(OUTPUT)/test_tcpnotify_user: cgroup_helpers.c trace_helpers.c
|
|
$(OUTPUT)/test_progs: trace_helpers.c
|
|
$(OUTPUT)/get_cgroup_id_user: cgroup_helpers.c
|
|
$(OUTPUT)/test_cgroup_storage: cgroup_helpers.c
|
|
$(OUTPUT)/test_netcnt: cgroup_helpers.c
|
|
$(OUTPUT)/test_sock_fields: cgroup_helpers.c
|
|
$(OUTPUT)/test_sysctl: cgroup_helpers.c
|
|
$(OUTPUT)/test_cgroup_attach: cgroup_helpers.c
|
|
$(OUTPUT)/test_sockopt: cgroup_helpers.c
|
|
$(OUTPUT)/test_sockopt_sk: cgroup_helpers.c
|
|
$(OUTPUT)/test_sockopt_multi: cgroup_helpers.c
|
|
$(OUTPUT)/test_tcp_rtt: cgroup_helpers.c
|
|
|
|
.PHONY: force
|
|
|
|
# force a rebuild of BPFOBJ when its dependencies are updated
|
|
force:
|
|
|
|
$(BPFOBJ): force
|
|
$(MAKE) -C $(BPFDIR) OUTPUT=$(OUTPUT)/
|
|
|
|
PROBE := $(shell $(LLC) -march=bpf -mcpu=probe -filetype=null /dev/null 2>&1)
|
|
|
|
# Let newer LLVM versions transparently probe the kernel for availability
|
|
# of full BPF instruction set.
|
|
ifeq ($(PROBE),)
|
|
CPU ?= probe
|
|
else
|
|
CPU ?= generic
|
|
endif
|
|
|
|
# Get Clang's default includes on this system, as opposed to those seen by
|
|
# '-target bpf'. This fixes "missing" files on some architectures/distros,
|
|
# such as asm/byteorder.h, asm/socket.h, asm/sockios.h, sys/cdefs.h etc.
|
|
#
|
|
# Use '-idirafter': Don't interfere with include mechanics except where the
|
|
# build would have failed anyways.
|
|
CLANG_SYS_INCLUDES := $(shell $(CLANG) -v -E - </dev/null 2>&1 \
|
|
| sed -n '/<...> search starts here:/,/End of search list./{ s| \(/.*\)|-idirafter \1|p }')
|
|
|
|
CLANG_FLAGS = -I. -I./include/uapi -I../../../include/uapi \
|
|
$(CLANG_SYS_INCLUDES) \
|
|
-Wno-compare-distinct-pointer-types \
|
|
-D__TARGET_ARCH_$(SRCARCH)
|
|
|
|
$(OUTPUT)/test_l4lb_noinline.o: CLANG_FLAGS += -fno-inline
|
|
$(OUTPUT)/test_xdp_noinline.o: CLANG_FLAGS += -fno-inline
|
|
|
|
$(OUTPUT)/test_queue_map.o: test_queue_stack_map.h
|
|
$(OUTPUT)/test_stack_map.o: test_queue_stack_map.h
|
|
|
|
$(OUTPUT)/flow_dissector_load.o: flow_dissector_load.h
|
|
$(OUTPUT)/test_progs.o: flow_dissector_load.h
|
|
|
|
BTF_LLC_PROBE := $(shell $(LLC) -march=bpf -mattr=help 2>&1 | grep dwarfris)
|
|
BTF_PAHOLE_PROBE := $(shell $(BTF_PAHOLE) --help 2>&1 | grep BTF)
|
|
BTF_OBJCOPY_PROBE := $(shell $(LLVM_OBJCOPY) --help 2>&1 | grep -i 'usage.*llvm')
|
|
BTF_LLVM_PROBE := $(shell echo "int main() { return 0; }" | \
|
|
$(CLANG) -target bpf -O2 -g -c -x c - -o ./llvm_btf_verify.o; \
|
|
$(LLVM_READELF) -S ./llvm_btf_verify.o | grep BTF; \
|
|
/bin/rm -f ./llvm_btf_verify.o)
|
|
|
|
ifneq ($(BTF_LLVM_PROBE),)
|
|
CLANG_FLAGS += -g
|
|
else
|
|
ifneq ($(BTF_LLC_PROBE),)
|
|
ifneq ($(BTF_PAHOLE_PROBE),)
|
|
ifneq ($(BTF_OBJCOPY_PROBE),)
|
|
CLANG_FLAGS += -g
|
|
LLC_FLAGS += -mattr=dwarfris
|
|
DWARF2BTF = y
|
|
endif
|
|
endif
|
|
endif
|
|
endif
|
|
|
|
TEST_PROGS_CFLAGS := -I. -I$(OUTPUT)
|
|
TEST_MAPS_CFLAGS := -I. -I$(OUTPUT)
|
|
TEST_VERIFIER_CFLAGS := -I. -I$(OUTPUT) -Iverifier
|
|
|
|
ifneq ($(SUBREG_CODEGEN),)
|
|
ALU32_BUILD_DIR = $(OUTPUT)/alu32
|
|
TEST_CUSTOM_PROGS += $(ALU32_BUILD_DIR)/test_progs_32
|
|
$(ALU32_BUILD_DIR):
|
|
mkdir -p $@
|
|
|
|
$(ALU32_BUILD_DIR)/urandom_read: $(OUTPUT)/urandom_read | $(ALU32_BUILD_DIR)
|
|
cp $< $@
|
|
|
|
$(ALU32_BUILD_DIR)/test_progs_32: test_progs.c $(OUTPUT)/libbpf.a\
|
|
$(ALU32_BUILD_DIR)/urandom_read \
|
|
| $(ALU32_BUILD_DIR)
|
|
$(CC) $(TEST_PROGS_CFLAGS) $(CFLAGS) \
|
|
-o $(ALU32_BUILD_DIR)/test_progs_32 \
|
|
test_progs.c test_stub.c trace_helpers.c prog_tests/*.c \
|
|
$(OUTPUT)/libbpf.a $(LDLIBS)
|
|
|
|
$(ALU32_BUILD_DIR)/test_progs_32: $(PROG_TESTS_H)
|
|
$(ALU32_BUILD_DIR)/test_progs_32: prog_tests/*.c
|
|
|
|
$(ALU32_BUILD_DIR)/%.o: progs/%.c $(ALU32_BUILD_DIR)/test_progs_32 \
|
|
| $(ALU32_BUILD_DIR)
|
|
($(CLANG) $(CLANG_FLAGS) -O2 -target bpf -emit-llvm -c $< -o - || \
|
|
echo "clang failed") | \
|
|
$(LLC) -march=bpf -mattr=+alu32 -mcpu=$(CPU) $(LLC_FLAGS) \
|
|
-filetype=obj -o $@
|
|
ifeq ($(DWARF2BTF),y)
|
|
$(BTF_PAHOLE) -J $@
|
|
endif
|
|
endif
|
|
|
|
# Have one program compiled without "-target bpf" to test whether libbpf loads
|
|
# it successfully
|
|
$(OUTPUT)/test_xdp.o: progs/test_xdp.c
|
|
($(CLANG) $(CLANG_FLAGS) -O2 -emit-llvm -c $< -o - || \
|
|
echo "clang failed") | \
|
|
$(LLC) -march=bpf -mcpu=$(CPU) $(LLC_FLAGS) -filetype=obj -o $@
|
|
ifeq ($(DWARF2BTF),y)
|
|
$(BTF_PAHOLE) -J $@
|
|
endif
|
|
|
|
$(OUTPUT)/%.o: progs/%.c
|
|
($(CLANG) $(CLANG_FLAGS) -O2 -target bpf -emit-llvm -c $< -o - || \
|
|
echo "clang failed") | \
|
|
$(LLC) -march=bpf -mcpu=$(CPU) $(LLC_FLAGS) -filetype=obj -o $@
|
|
ifeq ($(DWARF2BTF),y)
|
|
$(BTF_PAHOLE) -J $@
|
|
endif
|
|
|
|
PROG_TESTS_DIR = $(OUTPUT)/prog_tests
|
|
$(PROG_TESTS_DIR):
|
|
mkdir -p $@
|
|
PROG_TESTS_H := $(PROG_TESTS_DIR)/tests.h
|
|
PROG_TESTS_FILES := $(wildcard prog_tests/*.c)
|
|
test_progs.c: $(PROG_TESTS_H)
|
|
$(OUTPUT)/test_progs: CFLAGS += $(TEST_PROGS_CFLAGS)
|
|
$(OUTPUT)/test_progs: test_progs.c $(PROG_TESTS_FILES) | $(PROG_TESTS_H)
|
|
$(PROG_TESTS_H): $(PROG_TESTS_FILES) | $(PROG_TESTS_DIR)
|
|
$(shell ( cd prog_tests/; \
|
|
echo '/* Generated header, do not edit */'; \
|
|
ls *.c 2> /dev/null | \
|
|
sed -e 's@\([^\.]*\)\.c@DEFINE_TEST(\1)@'; \
|
|
) > $(PROG_TESTS_H))
|
|
|
|
MAP_TESTS_DIR = $(OUTPUT)/map_tests
|
|
$(MAP_TESTS_DIR):
|
|
mkdir -p $@
|
|
MAP_TESTS_H := $(MAP_TESTS_DIR)/tests.h
|
|
MAP_TESTS_FILES := $(wildcard map_tests/*.c)
|
|
test_maps.c: $(MAP_TESTS_H)
|
|
$(OUTPUT)/test_maps: CFLAGS += $(TEST_MAPS_CFLAGS)
|
|
$(OUTPUT)/test_maps: test_maps.c $(MAP_TESTS_FILES) | $(MAP_TESTS_H)
|
|
$(MAP_TESTS_H): $(MAP_TESTS_FILES) | $(MAP_TESTS_DIR)
|
|
$(shell ( cd map_tests/; \
|
|
echo '/* Generated header, do not edit */'; \
|
|
echo '#ifdef DECLARE'; \
|
|
ls *.c 2> /dev/null | \
|
|
sed -e 's@\([^\.]*\)\.c@extern void test_\1(void);@'; \
|
|
echo '#endif'; \
|
|
echo '#ifdef CALL'; \
|
|
ls *.c 2> /dev/null | \
|
|
sed -e 's@\([^\.]*\)\.c@test_\1();@'; \
|
|
echo '#endif' \
|
|
) > $(MAP_TESTS_H))
|
|
|
|
VERIFIER_TESTS_DIR = $(OUTPUT)/verifier
|
|
$(VERIFIER_TESTS_DIR):
|
|
mkdir -p $@
|
|
VERIFIER_TESTS_H := $(VERIFIER_TESTS_DIR)/tests.h
|
|
VERIFIER_TEST_FILES := $(wildcard verifier/*.c)
|
|
test_verifier.c: $(VERIFIER_TESTS_H)
|
|
$(OUTPUT)/test_verifier: CFLAGS += $(TEST_VERIFIER_CFLAGS)
|
|
$(OUTPUT)/test_verifier: test_verifier.c | $(VERIFIER_TEST_FILES) $(VERIFIER_TESTS_H)
|
|
$(VERIFIER_TESTS_H): $(VERIFIER_TEST_FILES) | $(VERIFIER_TESTS_DIR)
|
|
$(shell ( cd verifier/; \
|
|
echo '/* Generated header, do not edit */'; \
|
|
echo '#ifdef FILL_ARRAY'; \
|
|
ls *.c 2> /dev/null | \
|
|
sed -e 's@\(.*\)@#include \"\1\"@'; \
|
|
echo '#endif' \
|
|
) > $(VERIFIER_TESTS_H))
|
|
|
|
EXTRA_CLEAN := $(TEST_CUSTOM_PROGS) $(ALU32_BUILD_DIR) \
|
|
$(VERIFIER_TESTS_H) $(PROG_TESTS_H) $(MAP_TESTS_H) \
|
|
feature
|