gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 12:07:51 26 4
gpt4 key购买 nike

关于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/

    26 4 0