XDP Generic模式下环回接口UDP发送包被丢弃问题排查
AF_XDP发送UDP数据包在环回接口被丢弃问题
我用AF_XDP发送UDP数据包时遇到问题——接收功能正常,但发送的数据包在UDP处理前就被丢弃了。
系统环境
- 内核版本:Linux fedora 6.5.12-300.fc39.x86_64 #1 SMP PREEMPT_DYNAMIC Mon Nov 20 22:44:24 UTC 2023 x86_64 GNU/Linux
- 系统版本:Fedora Linux 39 (Workstation Edition)
具体现象
- XDP程序和socket通过xdpgeneric绑定到localhost
- tcpdump能捕获到发送的数据包,且校验和、长度、端口均无错误
- 通过bpftrace观测到
ip_rcv被调用,但ip_rcv_finish未被调用 - 在
kfree_skb中看到数据包被丢弃,但未指定丢弃原因 - 目标UDP端口的监听器从未收到数据包
Socket创建代码
cfg.rx_size = XSKQueues::NUM_READ_DESC; cfg.tx_size = XSKQueues::NUM_WRITE_DESC; cfg.libxdp_flags = XSK_LIBBPF_FLAGS__INHIBIT_PROG_LOAD; cfg.xdp_flags = XDP_FLAGS_SKB_MODE; cfg.bind_flags = XDP_USE_NEED_WAKEUP | XDP_COPY; if (xsk_socket__create(&socket, iface.c_str(), QUEUE, umem.umem, &qs.rxQ, &qs.txQ, &cfg)) { perror("XSK: "); exit(EXIT_FAILURE); }
已做的排查尝试
- 运行AF_XDP仅发送的官方示例,出现完全相同的现象
- 复制nc发送的数据包内容通过XDP发送,确保调用
sendto唤醒napi线程 - 内核栈跟踪显示数据包已进入内核处理流程:
common_stacktrace: __netif_receive_skb_one_core+0x3c/0xa0 process_backlog+0x85/0x120 __napi_poll+0x28/0x1b0 net_rx_action+0x2a4/0x380 __do_softirq+0xd1/0x2c8 do_softirq.part.0+0x3d/0x60 __local_bh_enable_ip+0x68/0x70 __dev_direct_xmit+0x152/0x210 __xsk_generic_xmit+0x3e4/0x710 xsk_sendmsg+0x12f/0x1f0 __sys_sendto+0x1d6/0x1e0 __x64_sys_sendto+0x24/0x30 do_syscall_64+0x5d/0x90 entry_SYSCALL_64_after_hwframe+0x6e/0xd8
- tcpdump捕获的发送数据包内容:
21:54:47.008430 IP 127.0.0.1.search-agent > 127.0.0.1.9012: UDP, length 51 0x0000: 4500 004f 1400 0000 ff11 a99b 7f00 0001 E..O............ 0x0010: 7f00 0001 04d2 2334 003b 0000 0200 0000 ......#4.;...... 0x0020: 0000 7b5e 8fdb 0171 9d17 7600 0000 0000 ..{^...q..v..... 0x0030: 0000 9856 8fdb 0171 9d17 1400 0000 0000 ...V...q........ 0x0040: 0000 80fe 1154 0200 0000 0100 0000 00 .....T.........
疑问
环回接口上的AF_XDP发送操作是否存在已知问题?
内容的提问来源于stack exchange,提问作者user5199947
相关产品推荐
相关产品推荐

