在 AF-XDP 套接字框架 (+ libbpf) 中是否存在关于数据包大小的已知(或可能未知)错误?
我的应用程序遇到奇怪的数据包丢失:
- IPv4/UDP/RTP 数据包流,所有数据包大小相同(1442 字节):无数据包丢失
- IPv4/UDP/RTP 数据包流,其中几乎所有数据包的大小都相同(1492 字节),除了一个特殊的“标记”数据包(只有 357 字节,但它们也是 IPv4/UDP 数据包):所有标记数据包都会丢失
bpf_printk
我在我的 XDP-Kernelprogram 中添加了一条语句:
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 程序没有 - 为什么?
知道什么可能是这个问题的原因吗?