ループバックインターフェイスの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_rcvbpftraceがパケットに対して呼び出されるのを見ます。
ただし、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パケットの増加は表示されません。ループバックインターフェイスから送信するときに既知の問題はありますか?

ベストアンサー1

おすすめ記事