使用XDP返回的BPF程序无法加载BPF骨架(-22)



首先,我没有直接使用libbpfAPI,也没有使用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 DROPn";
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_programlibbpf.c中,所以我必须在中的标头中重新定义,以便编译找到它。

Q: 有更好的解决方案吗?

我发现了问题所在。在查看libbpf源代码后,我发现变量

static const struct bpf_sec_def section_defs[] = {... BPF_PROG_SEC("xdp",BPF_PROG_TYPE_XDP), ... 

因此,我注意到我还没有用SEC("xdp")在BPF程序中定义XDP部分。

感谢@Qeole的帮助。

相关内容

  • 没有找到相关文章

最新更新