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



所以我一直在尝试使用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 堆栈,则可能会发生无效的 mem 访问"inv"错误。有时bpf_probe_read由密件抄送重写器自动执行,其他时候您需要明确

并且无法激活。

提前非常感谢!

除非我误解了你的程序,否则以下内容:

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

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

相关内容

  • 没有找到相关文章

最新更新