我试图通过 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 PRETTY_NAME="Fedora Linux 39(工作站版)"
我的 xdp 程序和套接字使用xdpgeneric
.
我看到传输的数据包 intcpdump
和 viabpftrace
我看到为数据包调用了 ip_rcv。
然而,ip_rcv_finish 不会被调用,这是通过 bpftrace 附加 kfunc 确定的。
在 kfree_skb 上,我看到删除的原因是未指定原因。
检查 tcpdump 中的数据包,我发现校验和或数据包长度和端口没有错误。相应 udp 端口的侦听器永远不会收到数据包。这就是我创建套接字的方式
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-example for txhttps://github.com/xdp-project/bpf-examples/blob/master/AF_XDP-example/xdpsock.c。然而我观察到同样的行为。我尝试通过 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
Data captured by tcpdump of the outgoing packet
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.........
我在 /proc/net/snmp 中没有看到任何 ip 标头错误,但确实看到接收到的数据包有增量,但 udp 数据包没有看到增量。在环回接口上传输是否存在已知问题?