关于AF-XDP套接字框架(+ libbpf)中的数据包大小是否存在已知(或未知)错误?
我的应用程序遇到奇怪的数据包丢失:
我在XDP-Kernelprogram中添加了
bpf_printk
语句:const int len = bpf_ntohs(iph->tot_len);
if(len < 400) {
bpf_printk("FOUND PACKET LEN < 400: %d.\n", len);
}
永远不会通过
sudo cat /sys/kernel/debug/tracing/trace_pipe
观察到此输出。因此,这些小的RTP标记数据包甚至没有被我的内核过滤器接收到-难怪我为什么不在用户空间中接收到它们。ethtool -S <if>
向我显示此数字:rx_256_to_511_bytes_phy
。这个数字以与标记数据包应该传入的速率相似的速率增加(大约30/s)。因此,这意味着我的NIC确实收到了数据包,但我的XDP程序却未收到-为什么?任何想法可能是造成此问题的原因吗?
最佳答案
首先,bpf_printk()
并不总是对我有用。您可能要看一下以下代码片段(内核空间代码):
// Nicer way to call bpf_trace_printk()
#define bpf_custom_printk(fmt, ...) \
({ \
char ____fmt[] = fmt; \
bpf_trace_printk(____fmt, sizeof(____fmt), \
##__VA_ARGS__); \
})
// print:
bpf_custom_printk("This year is %d\n", 2020);
// output: sudo cat /sys/kernel/debug/tracing/trace_pipe
第二:可能是数据包进入了另一个NIC队列。您可能要使用xdp-tutorial中的原始代码,并从上述代码段添加内核跟踪以打印数据包的大小,然后编译并运行带有
-q 1
的示例程序(例如,队列号为1)。一种获取数据包大小的方法:
void *data_end = (void *)(long)ctx->data_end;
void *data = (void *)(long)ctx->data;
size_t size_pkt = data - data_end;
bpf_custom_printk("Packet size %d\n", size_pkt);
关于linux - AF-XDP : Is there a bug regarding small packets?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60776530/