diff --git a/eBPF_Supermarket/Network_Subsystem/net_watcher/Makefile b/eBPF_Supermarket/Network_Subsystem/net_watcher/Makefile index c110196c1..c8c6e30fe 100644 --- a/eBPF_Supermarket/Network_Subsystem/net_watcher/Makefile +++ b/eBPF_Supermarket/Network_Subsystem/net_watcher/Makefile @@ -6,7 +6,14 @@ BPFTOOL_SRC := $(abspath ../../lib/bpftool/src) LIBBPF_OBJ := $(abspath $(OUTPUT)/libbpf.a) BPFTOOL_OUTPUT ?= $(abspath $(OUTPUT)/bpftool) BPFTOOL ?= $(BPFTOOL_OUTPUT)/bootstrap/bpftool - +VERSION_INFO := $(shell uname -r | cut -d'-' -f1) +VERSION_MAJOR := $(shell echo $(VERSION_INFO) | cut -d'.' -f1) +VERSION_MINOR := $(shell echo $(VERSION_INFO) | cut -d'.' -f2) +VERSION_PATCH := $(shell echo $(VERSION_INFO) | cut -d'.' -f3) +export VERSION_INFO +export VERSION_MAJOR +export VERSION_MINOR +export VERSION_PATCH ARCH ?= $(shell uname -m | sed 's/x86_64/x86/' \ | sed 's/arm.*/arm/' \ | sed 's/aarch64/arm64/' \ @@ -63,10 +70,42 @@ $(call allow-override,LD,$(CROSS_COMPILE)ld) all: deps $(APPS) #更新vmlinux.h文件 .PHONY: deps -deps: +deps:check_bpftool check_clang check_multilib + @echo "Kernel version is $(VERSION_MAJOR).$(VERSION_MINOR).$(VERSION_PATCH)" mkdir -p $(VMLINUXSRC) bpftool btf dump file /sys/kernel/btf/vmlinux format c > $(VMLINUX) +.PHONY: check_bpftool +check_bpftool: + @if ! command -v bpftool &> /dev/null; then \ + echo "bpftool 未安装,正在安装..."; \ + sudo apt-get update; \ + sudo apt-get install -y linux-tools-$(shell uname -r); \ + else \ + echo "bpftool 已经安装"; \ + fi +.PHONY: check_clang + +check_clang: + @if ! command -v clang &> /dev/null; then \ + echo "clang 未安装,正在安装..."; \ + sudo apt-get update; \ + sudo apt-get install -y clang; \ + else \ + echo "clang 已经安装"; \ + fi + +# 检查 multilib 是否安装,如果没有则安装 +.PHONY: check_multilib +check_multilib: + @if [ ! -f /usr/include/x86_64-linux-gnu/gnu/stubs-32.h ]; then \ + echo "multilib 未安装,正在安装..."; \ + sudo apt-get update; \ + sudo apt-get install -y gcc-multilib g++-multilib; \ + else \ + echo "multilib 已经安装"; \ + fi + .PHONY: clean clean: $(call msg,CLEAN) @@ -105,6 +144,10 @@ $(BPFTOOL): | $(BPFTOOL_OUTPUT) $(OUTPUT)/%.bpf.o: %.bpf.c $(LIBBPF_OBJ) $(wildcard *.h) $(VMLINUX) | $(OUTPUT) $(BPFTOOL) $(call msg,BPF,$@) $(Q)$(CLANG) -g -O2 -target bpf -D__TARGET_ARCH_$(ARCH) \ + -D__TARGET_ARCH_$(ARCH) \ + -DVERSION_MAJOR=$(VERSION_MAJOR) \ + -DVERSION_MINOR=$(VERSION_MINOR) \ + -DVERSION_PATCH=$(VERSION_PATCH) \ $(INCLUDES) $(CLANG_BPF_SYS_INCLUDES) \ -c $(filter %.c,$^) -o $(patsubst %.bpf.o,%.tmp.bpf.o,$@) $(Q)$(BPFTOOL) gen object $@ $(patsubst %.bpf.o,%.tmp.bpf.o,$@) diff --git a/eBPF_Supermarket/Network_Subsystem/net_watcher/common.bpf.h b/eBPF_Supermarket/Network_Subsystem/net_watcher/common.bpf.h index 0c71f53ba..e10ec20a4 100644 --- a/eBPF_Supermarket/Network_Subsystem/net_watcher/common.bpf.h +++ b/eBPF_Supermarket/Network_Subsystem/net_watcher/common.bpf.h @@ -500,7 +500,11 @@ int getstack(void *ctx) { return 0; } - +#if KERNEL_VERSION(VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH) >= KERNEL_VERSION(6, 3, 1) +#define GET_USER_DATA(msg) BPF_CORE_READ(msg, msg_iter.__iov, iov_base) +#else +#define GET_USER_DATA(msg) BPF_CORE_READ(msg, msg_iter.iov, iov_base) +#endif /* help functions end */ #endif diff --git a/eBPF_Supermarket/Network_Subsystem/net_watcher/packet.bpf.h b/eBPF_Supermarket/Network_Subsystem/net_watcher/packet.bpf.h index a712d1755..d515ef54b 100644 --- a/eBPF_Supermarket/Network_Subsystem/net_watcher/packet.bpf.h +++ b/eBPF_Supermarket/Network_Subsystem/net_watcher/packet.bpf.h @@ -393,12 +393,7 @@ int __tcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t size) // TX HTTP info if (http_info) { - // #if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 3, 1) - // u8 *user_data = BPF_CORE_READ(msg, msg_iter.__iov, iov_base); - // #else - // u8 *user_data = BPF_CORE_READ(msg, msg_iter.iov,iov_base); - // #endif - u8 *user_data = BPF_CORE_READ(msg, msg_iter.__iov, iov_base); + u8 *user_data = GET_USER_DATA(msg); tinfo = (struct ktime_info *)bpf_map_lookup_or_try_init( ×tamps, &pkt_tuple, &zero); if (tinfo == NULL) {