我尝试使用eBPF访问iphdr时出错

时间:2019-07-10 07:46:02

标签: ebpf xdp

所以我一直在尝试使用eBPF访问iphdr。

static inline int parse_ipv4(void *data, u64 nh_off, void *data_end) {
struct iphdr *iph = data + nh_off;

if ((void*)&iph[1] > data_end)
    return 0;
return iph->protocol;
}

当我在eBPF函数中使用上面的代码时,它的工作原理就像:

if (h_proto == htons(ETH_P_IP)){
index = parse_ipv4(data, nh_off, data_end);

像这样,调用parse_ipv4函数即可。

但是,如果我尝试不使用该功能直接访问ipheader,它将无法正常工作。

if (h_proto == htons(ETH_P_IP)){
    index = parse_ipv4(data, nh_off, data_end);

    struct iphdr *iph2 = sizeof(*eth) + nh_off;
}

这给我一个错误:提示:如果您尝试取消引用内存而没有先使用bpf_probe_read()将其复制到BPF堆栈,则会发生无效的内存访问'inv'错误。有时bcc_probe_read由bcc重写器自动执行,其他时候则需要明确。

并且无法激活。

非常感谢您!

1 个答案:

答案 0 :(得分:1)

除非我对您的程序有误解,否则:

struct iphdr *iph2 = sizeof(*eth) + nh_off;

看起来是错误的。相反,iph2应该类似于data + nh_off,就像您的函数一样,不是吗?如果将其设置为两个大小的总和,而没有任何基址,那么您将尝试在任意存储位置(我猜是像0x28之类的位置)访问数据,这当然是不允许的。