2024/4/28更新
RHEL8/DPDK22のtestpmdでUDPパケットを送信する
1. はじめに
- 以下の構成でUDP送信をtestpmdで行う手順を解説します。
- 本章では、右側のRHEL8から送信する手順について解説します。
- ARP手順等を省略した、かなりシンプルなUPD通信となっていますが、物理的に離れた構成での通信ができています。
2. 手順
2.1 HugePageとVFIOの設定
- とりあえず、2MバイトのHugePageを、2048面用意します。
# echo 2048 > /proc/sys/vm/nr_hugepages
2.2 ドライバの付け替え
- lspciでNICのデバイスアドレスを確認します。
- 見つけたNICを、
nmcli c down
でKernel管理から切り離します。 - uio_pci_genericドライバを充てます。
- dpdk-devbind.pyで確認します。
# lspci | grep Ethernet
00:1f.6 Ethernet controller: Intel Corporation Ethernet Connection (2) I219-V
01:00.0 Ethernet controller: Intel Corporation Ethernet Controller X550 (rev 01)
01:00.1 Ethernet controller: Intel Corporation Ethernet Controller X550 (rev 01) ←これを使用
# nmcli c down enp1s0f1
# modprobe uio_pci_generic
# dpdk-devbind.py -b uio_pci_generic 01:00.1
# dpdk-devbind.py -s
Network devices using DPDK-compatible driver
============================================
0000:01:00.1 'Ethernet Controller X550 1563' drv=uio_pci_generic unused=ixgbe,vfio-pci ←これを使用
(後略)
2.3 送信先情報の調査
- UDPパケットを送信するには、相手のMACアドレス、IPアドレスが必要です。
- 注:送信先とL2ネットワークで繋がっている前提です。
- 今回のテスト環境では、相手先は、IPアドレス:192.168.2.111、MACアドレス:a0:36:9f:b3:1a:f5となっています。
enp1s0f1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.2.111 netmask 255.255.255.0 broadcast 192.168.2.255
inet6 fe80::b4c2:e158:3a22:7f19 prefixlen 64 scopeid 0x20<link>
ether a0:36:9f:b3:1a:f5 txqueuelen 1000 (Ethernet)
(後略)
2.4 testpmd起動
testpmdを起動してみます。パラメータの概要は以下となります。
- -a: 使用するNICデバイスのBDFアドレスを指定します。
- --forward-mode=txonly: 送信モードで起動します。
- --tx-ip: 送信元と送信先のIPアドレスを指定します。
- --tx-udp: 送信元と送信先のUDPポート番号を指定します。
- --eth-peer: 送信先のMACアドレスを指定します。
- --stats-period: 送信状況を表示する間隔を指定します。
# dpdk-testpmd -a 0000:01:00.1 -- --forward-mode=txonly --tx-ip=192.168.2.111,192.168.2.123 --tx-udp=5000,5000 --eth-peer=0,a0:36:9f:b3:1c:5d --stats-period=1
- 起動すると、送信が開始され、以下が1秒周期で表示されます
- 「10G NIC」と「2.5GのL2SW」を使用しているのですが、700Mbpsしか出てないようです。DPのペイロードのデータが非常に小さいからだと思います。あとで、チューニングしてみようと思います。
Port statistics ====================================
######################## NIC statistics for port 0 ########################
RX-packets: 26 RX-missed: 0 RX-bytes: 9804
RX-errors: 0
RX-nombuf: 0
TX-packets: 8595304 TX-errors: 0 TX-bytes: 550098844
Throughput (since last show)
Rx-pps: 13 Rx-bps: 51880
Tx-pps: 1420506 Tx-bps: 727298816
############################################################################
CTRL-Cで終了すると、最終的な統計情報が表示されます。PMDによる「全力送信」なので、ドロップが多くなっています。
Waiting for lcores to finish...
---------------------- Forward statistics for port 0 ----------------------
RX-packets: 30 RX-dropped: 0 RX-total: 30
TX-packets: 10016425 TX-dropped: 556749345 TX-total: 566765770
----------------------------------------------------------------------------
+++++++++++++++ Accumulated forward statistics for all ports+++++++++++++++
RX-packets: 30 RX-dropped: 0 RX-total: 30
TX-packets: 10016425 TX-dropped: 556749345 TX-total: 566765770
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Done.
Stopping port 0...
Stopping ports...
Done
Shutting down port 0...
Closing ports...
Port 0 is closed
Done
Bye...
- 相手先でtcpdumpを録ってみます。かなり小さいUDPパケットが送られています。
- testpmdのパラメータを変更することで、いろいろなUDPパケットを送信することができます。
16:15:18.561939 IP 192.168.2.123.5000 > 192.168.2.111.5000: UDP, length 22
16:15:18.561939 IP 192.168.2.123.5000 > 192.168.2.111.5000: UDP, length 22
16:15:18.561939 IP 192.168.2.123.5000 > 192.168.2.111.5000: UDP, length 22
16:15:18.561939 IP 192.168.2.123.5000 > 192.168.2.111.5000: UDP, length 22
3. 今後
testpmdによる、UDP受信を紹介する予定です。