1

我基于本教程:https ://github.com/xdp-project/xdp-tutorial/tree/master/advanced03-AF_XDP

我在用户空间中创建了一个套接字Queue-ID 0。在我的内核 af-xdp 程序中,我过滤 UDP 数据包并通过xskmap.

因为我显然希望用户空间程序接收数据包,所以我将内核程序中的数据包重定向到 index 0

int index = 0;
if (bpf_map_lookup_elem(&xsks_map, &index)) {
    return bpf_redirect_map(&xsks_map, index, 0);
} else {
    bpf_printk("Didn't find connected socket for index %d!\n", index);
}

没有收到错误消息Didn't find connected socket for index 0!sudo cat /sys/kernel/debug/tracing/trace_pipe但我在用户空间也没有收到任何数据包!

如果我只是继续运行程序并同时添加这样的 ethtool-rule:

sudo ethtool -N <eth> flow-type udp4 dst-ip <ip> action 0

我的用户空间程序突然开始接收数据包并且错误消息消失了。

我认为内核程序会接收发送到该接口的每个数据包,但不知何故,情况并非如此。我做错什么了?

4

1 回答 1

1

因此,这在 IRC(#xdp,Freenode)和 xdp-newbies 邮件列表上进行了讨论。在此报告以作记录。

答案是您没有做错任何事情:使用 AF_XDP,套接字从一个硬件队列接收数据包。您可以有多个套接字从一个队列接收数据包,但在撰写本文时,您不能有一个套接字在多个队列上接收。这是设计使然。

在您的情况下,与Queue-ID: 0您的套接字关联的 表明它将接收来自队列 0 的数据包。这就是为什么在将所有流路由到队列 0 之前看不到 NIC 接收到的所有数据包的原因。

ML 讨论的参考:链接。归功于 Björn 和 Toke。

于 2020-03-12T16:18:49.083 回答