我在尝试使用 eBPF 访问 iphdr 时出错
I have an error trying to access iphdr using eBPF
所以我一直在尝试使用 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' 错误。有时 bpf_probe_read 由密件抄送重写器自动生成,其他时候您需要明确说明。
激活失败
在此先感谢您!
除非我误解了你的程序,否则如下:
struct iphdr *iph2 = sizeof(*eth) + nh_off;
看起来有误。相反,iph2
应该类似于 data + nh_off
,就像在您的函数中一样,不是吗?如果你将它设置为两个大小的总和,没有任何基地址,那么你会尝试访问任意内存位置的数据(我猜是 0x28
),这当然是不允许的。
所以我一直在尝试使用 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' 错误。有时 bpf_probe_read 由密件抄送重写器自动生成,其他时候您需要明确说明。
激活失败
在此先感谢您!
除非我误解了你的程序,否则如下:
struct iphdr *iph2 = sizeof(*eth) + nh_off;
看起来有误。相反,iph2
应该类似于 data + nh_off
,就像在您的函数中一样,不是吗?如果你将它设置为两个大小的总和,没有任何基地址,那么你会尝试访问任意内存位置的数据(我猜是 0x28
),这当然是不允许的。