首先,我没有直接使用libbpf API,也没有使用BCC。相反,我试图使用bpftool生成的框架的API。
控制代码:
obj_gen = bpf_xdp_c__open();
if (!obj_gen)
goto cleanup;
ifindex = if_nametoindex("eth0");
if(!ifindex)
{
perror("if_nametoindex");
return 1;
}
err = bpf_xdp_c__load(obj_gen);BPF代码:
// Simple XDP BPF program. Everything packet will be dropped.
SEC("test")
int xdp_prog1(struct xdp_md *ctx){
char drop_message[] = "XDP PACKET DROP\n";
bpf_trace_printk(&drop_message, sizeof(drop_message));
return XDP_DROP;
}因此,在运行之后,显示了以下错误:
// libbpf: load bpf program failed: Invalid argument
// libbpf: failed to load program 'test'
// libbpf: failed to load object 'bpf_xdp_c'
// libbpf: failed to load BPF skeleton 'bpf_xdp_c': -22调试后,我注意到程序类型没有正确的值。它总是返回0。因此,在加载调用之前,我必须定义以下代码:
obj_gen->progs.xdp_prog1->type = BPF_PROG_TYPE_XDP;因为struct bpf_program在libbpf.c中,所以为了在编译中找到它,我必须在头中重新定义它。这个解决办法起作用了。
问:有没有更好的解决方案?
发布于 2020-08-31 11:48:24
我发现了问题所在。在查看了libbpf源库之后,我找到了变量。
static const struct bpf_sec_def section_defs[] = {... BPF_PROG_SEC("xdp",BPF_PROG_TYPE_XDP), ... 因此,我注意到我还没有用SEC("xdp")在BPF程序中定义我的XDP部分。
谢谢@Qeole你的帮助。
https://stackoverflow.com/questions/63670188
复制相似问题