1

我开始使用 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以 skb 作为第一个参数的程序计算第 4 层校验和。

为什么会这样?我什至可以在 XDP 中使用 __sk_buff 结构吗?或者我必须使用 xdp_md 结构?

更新:感谢 Qeole,我了解到我不能使用 XDP 使用 sk_buff。有没有一种方法可以使用 xdp_md 计算 TCP 校验和?

4

1 回答 1

2

事实上,您不能struct __sk_buffXDP 程序中使用。您必须struct xdp_md改用。XDP 性能很大程度上归功于内核在分配和初始化套接字缓冲区(在内核中)之前struct sk_buff调用 eBPF 程序,这节省了时间和资源,但也意味着您无法访问该结构XDP 程序。

于 2021-02-08T09:31:38.003 回答