루프백 인터페이스에 대한 XDP 일반 전송 패킷이 삭제되었습니다.

루프백 인터페이스에 대한 XDP 일반 전송 패킷이 삭제되었습니다.

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.
패킷이 전송되는 것을 보고 tcpdumpip_rcv bpftrace가 패킷에 대해 호출되는 것을 봅니다.
그러나 bpftrace에 kfunc를 추가하여 결정된 대로 ip_rcv_finish는 호출되지 않습니다.
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);
>!     }

무엇이 문제일까요?

여기에서만 tx에 대해 AF_XDP-example을 실행해 보았습니다.https://github.com/xdp-project/bpf-examples/blob/master/AF_XDP-example/xdpsock.c. 그러나 나는 같은 행동을 관찰했습니다. nc를 통해 패킷 전송을 시도하고 xdp를 통해 전송할 때 정확한 패킷 내용을 복사했습니다. napi 스레드를 시작하기 위해 sendto를 호출했는지 확인했고 스택이 패킷을 선택하고 있음을 나타내는 다음 커널 스택 추적을 확인했습니다.

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 패킷의 증가는 표시되지 않습니다. 루프백 인터페이스에서 전송할 때 알려진 문제가 있습니까?

관련 정보