ฉันกำลังพยายามส่งข้อมูล(หมายเลขไอพีของ)จากเคอร์เนลที่พื้นที่ที่ผู้ใช้อวกาศโดยวิ่งต่อไปนี้ BPF prorgam:
struct bpf_map_def EVENTS = {
.type = BPF_MAP_TYPE_HASH,
.key_size = sizeof(__u32),
.value_size = sizeof(__u32),
.max_entries = 1,
};
SEC("xdp")
int _xdp_ip_filter(struct xdp_md *ctx) {
bpf_printk("got a packet\n");
void *data_end = (void *)(long)ctx->data_end;
void *data = (void *)(long)ctx->data;
struct ethhdr *eth = data;
// check packet size
if (eth + 1 > data_end) {
return XDP_PASS;
}
// get the source address of the packet
struct iphdr *iph = data + sizeof(struct ethhdr);
if (iph + 1 > data_end) {
return XDP_PASS;
}
__u32 ip_src = iph->saddr;
bpf_printk("source ip address is %u\n", ip_src);
// key of the maps
__u32 key = 0;
bpf_printk("starting xdp ip filter\n");
// send the ip to the userspace program.
bpf_map_update_elem(&EVENTS, &key, &ip_src, BPF_ANY);
return XDP_PASS;
}
สคริปต์ makefilelanguage:
CLANG ?= clang
LLC ?= llc
OPT ?= opt
DIS ?= llvm-dis
ARCH ?= $(shell uname -m | sed -e 's/aarch64/arm64/' -e 's/x86_64/x86/')
KERNEL ?= /usr/src/linux
CFLAGS += \
-O2 -g -emit-llvm \
-D__KERNEL__ \
-D__BPF_TRACING__ \
-Wno-unused-value \
-Wno-pointer-sign \
-Wno-compare-distinct-pointer-types \
-Wno-address-of-packed-member \
-Wno-tautological-compare \
-Wno-unknown-warning-option \
-Wno-gnu-variable-sized-type-not-at-end \
-fno-asynchronous-unwind-tables
bytecode.$(ARCH).o: bytecode.c
$(CLANG) $(CFLAGS) -c $< -o - | \
$(OPT) -O2 -mtriple=bpf-pc-linux | \
$(DIS) | \
$(LLC) -march=bpf $(LLC_FLAGS) -filetype=obj -o $@
แต่ฉันได้ติดตาม err:
58: (85) call bpf_map_update_elem#2
R1 type=map_value expected=map_ptr
verification time 272 usec
ใครก็ได้ช่วยฉันเข้าใจเรื่องนี้เกิดข้อผิดพลาด? ที่เพิ่มมานอกเหนือจากที่ไหนได้ฉันเห็น bpf_printk
จดหมาย?
ฉันต้องสงสัยงแฟ้มที่ถูกสร้างโดยทำให้ยังไม่รวม EVENTS
แผนที่..แต่ฉันไม่แน่ใจว่าวิธีที่จะซ่อมมันได้ถ้าฉันเพิ่ม SEC("maps")
อยู่เหนือแผนที่ที่เคอร์เนล verifier มันล้มเหลวที่จะค้นหาส่วนตลอด..
printk
เรีย?