【发布时间】:2021-05-13 23:23:26
【问题描述】:
我有一个小的 socket filter 类型 eBPF 程序,我试图打印从 __sk_buff 上下文读取的协议值:
struct bpf_insn prog[] = {
BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_6, offsetof(struct __sk_buff, protocol)),
BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_0, -4),
BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -4),
BPF_MOV64_IMM(BPF_REG_2, 4),
BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_trace_printk),
BPF_MOV64_IMM(BPF_REG_0, 0),
BPF_EXIT_INSN(),
};
...
我创建了一个原始的socket 并将其绑定到lo 接口,然后绑定到setsockopt(fd, SOL_SOCKET, SO_ATTACH_BPF, ...)。它可以毫无问题地编译和加载,但是每当我ping 127.0.0.1 时,我从来没有在trace_pipe 中看到任何痕迹。
所以,为了确保它BPF_FUNC_trace_printk 确实可以工作,我对其进行了更改,以便它在堆栈上打印一个静态字符串,并在每个到达环回的数据包上打印。
我做错了什么?
【问题讨论】: