0

首先,我没有直接使用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_programlibbpf.c,我必须在我的标题中重新定义才能编译找到它。这种解决方法奏效了。

问:有没有更好的解决方案?

4

1 回答 1

1

我发现出了什么问题。查看libbpf源代码后,我找到了变量

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

所以,我注意到我没有在我的 BPF 程序中定义我的 XDP 部分SEC("xdp")

感谢@Qeole的帮助。

于 2020-08-31T11:48:24.363 回答