linux - AF-XDP : Is there a bug regarding small packets?

标签 linux sockets networking xdp-bpf

关于AF-XDP套接字框架(+ libbpf)中的数据包大小是否存在已知(或未知)错误?

我的应用程序遇到奇怪的数据包丢失:

  • 所有数据包都具有相同大小(1442字节)的IPv4/UDP/RTP数据包流:无数据包丢失
  • IPv4/UDP/RTP数据包流,其中除特殊的“标记”数据包(仅357字节,但它们也是IPv4/UDP数据包)之外,几乎所有数据包都具有相同的大小(1492字节):所有标记数据包都丢失了

  • 我在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/

    相关文章:

    c - d2i_X509 崩溃,证书格式错误?

    linux - ltrace 等同于 osx?

    python - linux系统环境变量和用户环境变量

    android - Laravel:如何为 web、android 和 ios 构建实时聊天?

    sockets - C#套接字接收缓冲区的大小成本

    linux - 不能打开超过 28234 个套接字?

    c++ - QNetworkAccessManager,重置 TCP 连接

    python - 使用 Python 与 TUN\TAP for MAC OSX (Lion) 接口(interface)

    python - 如何使用 pexpect 从后台进程发送信号

    java - 如何在 Java 7 中为 RMI 配置自定义客户端套接字工厂?