AF_XDP:即使每个数据包都被重定向,队列 ID 为 0 的套接字也没有数据包
AF_XDP: No packets for socket with queue-id 0 even though every packet is redirect
我是基于这个教程:https://github.com/xdp-project/xdp-tutorial/tree/master/advanced03-AF_XDP
我在用户空间中用 Queue-ID 0
创建了一个套接字。
在我的内核 af-xdp 程序中,我过滤 UDP 数据包并通过 xskmap
.
将它们重定向到用户空间套接字
因为我显然希望用户空间程序接收数据包,所以我将内核程序中的数据包重定向到索引 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);
}
我没有通过sudo cat /sys/kernel/debug/tracing/trace_pipe
收到错误消息Didn't find connected socket for index 0!
,但我在用户空间也没有收到任何数据包!
如果我继续 运行 程序并同时添加这样的 ethtool-rule:
sudo ethtool -N <eth> flow-type udp4 dst-ip <ip> action 0
我的用户空间程序突然开始接收数据包并且错误消息消失了。
我以为内核程序会收到发送到该接口的每个数据包,但不知何故并非如此。我做错了什么?
所以这在 IRC(#xdp,Freenode)和 xdp-newbies 邮件列表上进行了讨论。在此举报备案。
答案是你没有做错:使用AF_XDP,套接字从一个硬件队列接收数据包。您可以让多个套接字从一个队列接收数据包,但在撰写本文时,您不能让一个套接字在多个队列上接收数据包。这是设计使然。
在您的情况下,您关联到套接字的 Queue-ID: 0
表示它将从队列 0 接收数据包。这就是为什么在将所有流路由到之前看不到 NIC 接收到的所有数据包的原因队列 0.
ML 讨论参考:link。感谢 Björn 和 Toke。
我是基于这个教程:https://github.com/xdp-project/xdp-tutorial/tree/master/advanced03-AF_XDP
我在用户空间中用 Queue-ID 0
创建了一个套接字。
在我的内核 af-xdp 程序中,我过滤 UDP 数据包并通过 xskmap
.
因为我显然希望用户空间程序接收数据包,所以我将内核程序中的数据包重定向到索引 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);
}
我没有通过sudo cat /sys/kernel/debug/tracing/trace_pipe
收到错误消息Didn't find connected socket for index 0!
,但我在用户空间也没有收到任何数据包!
如果我继续 运行 程序并同时添加这样的 ethtool-rule:
sudo ethtool -N <eth> flow-type udp4 dst-ip <ip> action 0
我的用户空间程序突然开始接收数据包并且错误消息消失了。
我以为内核程序会收到发送到该接口的每个数据包,但不知何故并非如此。我做错了什么?
所以这在 IRC(#xdp,Freenode)和 xdp-newbies 邮件列表上进行了讨论。在此举报备案。
答案是你没有做错:使用AF_XDP,套接字从一个硬件队列接收数据包。您可以让多个套接字从一个队列接收数据包,但在撰写本文时,您不能让一个套接字在多个队列上接收数据包。这是设计使然。
在您的情况下,您关联到套接字的 Queue-ID: 0
表示它将从队列 0 接收数据包。这就是为什么在将所有流路由到之前看不到 NIC 接收到的所有数据包的原因队列 0.
ML 讨论参考:link。感谢 Björn 和 Toke。