我开始用ebpf和XDP编码。 我正在使用python bcc将XDP程序加载到NIC。 我正在尝试使用__sk_buff结构,但是当我尝试访问任何skb文件时,验证器无法加载程序。
int xdp_test(struct sk_buff *skb)
{
void *data = (void*)(long)skb->data;
void *data_end = (void*)(long)skb->data_end;
if (data + sizeof(struct ethhdr) + sizeof(struct iphdr) < data_end)
{
struct iphdr * ip = ip_hdr(skb);
// according to my checks, it failed because of this line. I cant access to ip->protocol (or any other fileds)
if (ip->protocol == IPPROTO_TCP)
{
return XDP_PASS;
}
}
...
return XDP_PASS
}
我只想使用bpf_l4_csum_replace
计算程序上的第 4 层校验和 它以 skb 作为第一个参数。
为什么会这样? 我甚至可以在 XDP 中使用__sk_buff结构吗?或者我必须使用 xdp_md 结构?
更新: 感谢 Qeole,我明白我不能使用 XDP 使用sk_buff。 有没有办法使用 xdp_md 计算 TCP 校验和?
事实上,您不能在 XDP 程序中使用该struct __sk_buff
。您必须改用struct xdp_md
。XDP 性能在很大程度上归功于内核在分配和初始化套接字缓冲区(内核中的struct sk_buff
)之前调用 eBPF 程序,这节省了时间和资源,但也意味着您无法访问 XDP 程序中的该结构。