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