KVMのVM環境でDPDK22.11のl2fwdを動かす 前編 ~DPDK入門 第19回~
前編である今回はDPDK22.11をベースにKVMのVM環境でサンプルアプリケーションを動かす方法をご紹介したいと思います。
KVMのVM環境でDPDK22.11のl2fwdを動かす 前編 ~DPDK入門 第19回~
はじめに
こんにちは, NTTテクノクロス株式会社の村木です。
DPDKは継続的に開発が続けられており, 本DPDK入門連載で以前紹介した動かし方と比べてdpdk-setup.shが無くなるなど, 少し異なる部分も出てきました。
そのため, 前編である今回はDPDK22.11をベースにKVMのVM環境でサンプルアプリケーションを動かす方法をご紹介したいと思います。
また, 次回後編ではDPDKのサンプルプログラムを改造してMACアドレスによるフィルター機能を実装する簡単な例をご紹介いたします。
本記事で紹介しているDPDKやサンプルプログラムの概要については本DPDK入門連載の以下の記事をご確認ください。
・DPDKとは? ~DPDK入門 第1回~
・DPDKのパケット処理 ~DPDK入門 第2回~

動作環境について
ホスト側の準備作業
まずはホストで検証に利用するVMを作成していきます。
※ホストで実施
◯VM作成
事前にRocky 8.6のISOファイルをホストに準備しておく。
→本例では/var/tmp
配下に配置している
・CALL VM
sudo virt-install \
--name CALL \
--memory 4096 \
--vcpus 2 \
--disk /var/lib/libvirt/images/rocky8.6_CALL.qcow2,size=20,format=qcow2 \
--os-variant rocky8.6 \
--location /vat/tmp/Rocky-x86_64-minimal.iso \
--graphics none \
--extra-args console=ttyS0,115200n8
・DPDK VM
sudo virt-install \
--name DPDK \
--memory 8192 \
--vcpus 4 \
--disk /var/lib/libvirt/images/rocky8.6_DPDK.qcow2,size=20,format=qcow2 \
--os-variant rocky8.6 \
--location /vat/tmp/Rocky-x86_64-minimal.iso \
--graphics none \
--extra-args console=ttyS0,115200n8
・OSインストール時の選択例(あくまで一例のため都合にあわせて変更する)
以下はCALL VM設定時の例
・Language settings
:37) Japanese
・Time settings
:2) Asia
, 73) Tokyo
・Software selection
:minimal
・Kdump
:
・Network configuration
:
・Set host name
:CALL
・Configure device ens2
:
・IPv6 address
:ignore
・Connect automatically after reboot
:[x]
・Apply configuration in installer
:[x]
・Root password
:※任意
・User creation
:[x]
・Create user
:
・Full name
:※任意
・Password
:※任意
・Administrator
:[x]
◯SSH設定
・OSインストール後のターミナル画面で以下を実施する
※このタイミングで適宜環境変数やdnf.confのproxy設定を実施する
・最新化
sudo dnf update -y
sudo dnf upgrade -y
・sshをインストール
sudo dnf install ssh
・サービスを起動
sudo systemctl start sshd
・自動的にSSHサーバが起動するようにする
sudo systemctl enable sshd
※インストール後はターミナルを一度抜ける
VM初期設定
次に作成したVMにSSHログインして初期設定を実施します。
※ホストで実施
※CALL VMとDPDK VMでSSHのIPアドレス以外は同じ手順を流す
◯CALLのDefault
のIPアドレスを確認
→CALL以外もDefault
のIPアドレス以外は全部一緒
sudo virsh net-dhcp-leases default
Expiry Time MAC address Protocol IP address Hostname Client ID or DUID
-------------------------------------------------------------------------------------------------------------------
YYYY-MM-DD hh:mm:ss XX:XX:XX:XX:XX:XX ipv4 192.168.122.212/24 CALL XX:XX:XX:XX:XX:XX:XX
・SSHログイン
ssh user@192.168.122.212
※CALL VMで実施
◯必要に応じてfirewallとSELinuxの停止
・firewallサービス停止
sudo systemctl stop firewalld
・firewall自動起動設定を無効にする
sudo systemctl disable firewalld
・再起動後から永続的にSELinuxを無効化
sudo vi /etc/selinux/config
〜〜省略〜〜
SELINUX=disabled
・本ターミナルにおける一時的な無効化
sudo setenforce 0
各VMに検証で利用するブリッジを割り当て
作成した各VMに検証に利用するブリッジを割り当てます。
※一例としてCALL VMにbr_CALLtoDPDK
とbr_DPDKtoCALL
を割り当てる手順を記載するが, DPDK VM側も基本的に同手順
※br_DPDKtoCALL2
については後述とし, 現時点では追加しない
※ホスト実施
◯ブリッジ作成(ホストを再起動するたびに実施する必要がある)
sudo brctl addbr br_CALLtoDPDK
sudo brctl addbr br_DPDKtoCALL
◯ブリッジ立ち上げ(ホストを再起動するたびに実施する必要がある)
sudo ifconfig br_CALLtoDPDK up
sudo ifconfig br_DPDKtoCALL up
◯VMを停止
sudo virsh shutdown CALL
Domain CALL is being shutdown
◯VMにブリッジを割り当て
→bridge
部分を追記
sudo virsh edit CALL
<domain type='kvm'>
<name>CALL</name>
<uuid>6439ac13-5e55-4c4f-8e3e-b63c227869e8</uuid>
<memory unit='KiB'>2097152</memory>
<currentMemory unit='KiB'>2097152</currentMemory>
<vcpu placement='static'>2</vcpu>
~中略~
<interface type='network'>
<mac address='XX:XX:XX:XX:XX:XX'/>
<source network='default'/>
<model type='rtl8139'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
</interface>
<interface type='bridge'>
<source bridge='br_CALLtoDPDK'/>
<model type='virtio'/>
</interface>
<interface type='bridge'>
<source bridge='br_DPDKtoCALL'/>
<model type='virtio'/>
</interface>
~中略~
</devices>
</domain>
Domain CALL XML configuration edited.
◯ブリッジ割り当て設定を反映
sudo virsh define /etc/libvirt/qemu/CALL.xml
Domain CALL defined from /etc/libvirt/qemu/CALL.xml
◯VMにブリッジが割り当てられたことを確認
sudo virsh domiflist CALL
Interface Type Source Model MAC
-------------------------------------------------------
- network default rtl8139 XX:XX:XX:XX:XX:XX
- bridge br_CALLtoDPDK virtio XX:XX:XX:XX:XX:XX
- bridge br_DPDKtoCALL virtio XX:XX:XX:XX:XX:XX
◯VM起動
sudo virsh start CALL
Domain CALL started
各VMに割り当てたブリッジにIPアドレス設定
各VMに割り当てたブリッジにIPアドレスを設定します。
※一例としてCALL VMに割り当てたbr_CALLtoDPDK
とbr_DPDKtoCALL
にそれぞれ10.0.1.10
と10.0.2.10
を設定する手順を記載するが, DPDK VM側も設定するIPアドレス以外は基本的に同手順
※ホストで実施
◯CALL VMにSSHログイン
ssh user@192.168.122.212
※CALL VMで実施
◯追加されたデバイスにIPを割り当て(ens5
, ens6
が追加されたとする)
※ens2はdefault
ネットワークのデバイス
・デバイス(ens5
, ens6
)が追加されていることを確認
→また, 追加したデバイス(ens5
,ens6
)にはIPアドレスが設定されていないことを確認する
ip a
・デバイスの状態を確認(現状は切断済みの状態)
sudo nmcli device
DEVICE TYPE STATE CONNECTION
ens2 ethernet connected ens2
ens5 ethernet disconnected --
ens6 ethernet disconnected --
lo loopback unmanaged --
・接続プロファイルを作成
sudo nmcli connection add type ethernet ifname ens5 con-name ens5
sudo nmcli connection add type ethernet ifname ens6 con-name ens6
・IPアドレスを設定
sudo nmcli connection modify ens5 ipv4.method manual ipv4.addresses 10.0.1.10/24
sudo nmcli connection modify ens6 ipv4.method manual ipv4.addresses 10.0.2.10/24
・デバイスに接続
sudo nmcli device connect ens5
sudo nmcli device connect ens6
・デバイスの状態を確認(接続済みの状態)
sudo nmcli device
DEVICE TYPE STATE CONNECTION
ens2 ethernet connected ens2
ens5 ethernet connected ens5
ens6 ethernet connected ens6
lo loopback unmanaged --
・追加したデバイス(ens5
,ens6
)にIPアドレスが設定されていることを確認する
ip a
CALL VMへtrafgen
とtshark
を導入
CALL VMへ検証に利用するツール類を導入します。
※CALL VMで実施
◯epel
リポジトリの追加
sudo dnf config-manager --set-enabled powertools
sudo dnf install epel-release -y
sudo dnf update -y
sudo dnf upgrade -y
◯trafgen
のインストール
sudo dnf install netsniff-ng -y
trafgen -v
trafgen 0.6.8 (Flutternozzle), Git id: (none)
multithreaded zero-copy network packet generator
http://www.netsniff-ng.org
Please report bugs at https://github.com/netsniff-ng/netsniff-ng/issues
Copyright (C) 2011-2013 Daniel Borkmann <dborkma@tik.ee.ethz.ch>,
Swiss federal institute of technology (ETH Zurich)
License: GNU GPL version 2.0
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
◯tshark
のインストール
sudo dnf -y install wireshark
tshark -v
DPDK VMにdpdk
をインストール
DPDK VMへ検証に利用するdpdk
と関連パッケージ等を導入します。
※DPDK VMで実施
◯kernel-devel
のインストール
※kernel
バージョンに対応したkernel-devel
をインストールする必要がある
・資材ダウンロード
TARGET_KERNEL_DEVEL=kernel-devel-`uname -r`
cd /usr/local/src
wget "ftp://mirror.switch.ch/pool/4/mirror/scientificlinux/6.4/x86_64/updates/security/${TARGET_KERNEL_DEVEL}.rpm"
ls -l ${TARGET_KERNEL_DEVEL}.rpm
・インストール
rpm -ivh ${TARGET_KERNEL_DEVEL}.rpm
◯python3.8
インストール
sudo dnf install python38 -y
python3 -V
Python 3.8.17
pip3 -V
pip 19.3.1 from /usr/lib/python3.8/site-packages/pip (python 3.8)
◯関連パッケージをインストール
※このタイミングで必要に応じてpip
のproxy設定を実施する
sudo pip3 install pyelftools
sudo pip3 install meson ninja
sudo dnf groupinstall "Development Tools" -y
sudo dnf install kernel-headers -y
◯資材をダウンロード
→本例では/var/tmp配下にDPDK資材をダウンロードしている
※このタイミングで必要に応じでwget
のproxy設定を実施する
cd /vat/tmp
wget https://fast.dpdk.org/rel/dpdk-22.11.4.tar.gz
ls
dpdk-22.11.4.tar.gz
◯DPDKのビルド/インストール
※以降, DPDK VMの作業はroot
で実施する
sudo su -
# cd /var/tmp
# tar -zxvf ./dpdk-22.11.4.tar.gz -C /opt/
# cd /opt/dpdk-stable-22.11.4/
# meson build
# cd build
# ninja
# ninja install
◯環境変数の設定(以下を末尾に追記)
# vi /root/.bashrc
~中略~
export RTE_SDK=/opt/dpdk-stable-22.11.4
export RTE_TARGET=x86_64-native-linuxapp-gcc
# source /root/.bashrc
◯ドライバ追加
※make
に失敗した場合はkernel
バージョンに対応したkernel-devel
がインストールされているかを確認する
# wget https://git.dpdk.org/dpdk-kmods/snapshot/dpdk-kmods-e721c733cd24206399bebb8f0751b0387c4c1595.tar.gz
# tar xvfz dpdk-kmods-e721c733cd24206399bebb8f0751b0387c4c1595.tar.gz
# cd ./dpdk-kmods-e721c733cd24206399bebb8f0751b0387c4c1595/linux/igb_uio/
# make
# cp ./igb_uio.ko /opt/dpdk-stable-22.11.4/drivers/
# modprobe uio
# insmod /opt/dpdk-stable-22.11.4/drivers/igb_uio.ko
◯ドライバ追加確認
# lsmod | grep -e Module -e 'uio'
Module Size Used by
igb_uio 16384 0
uio 20480 1 igb_uio
◯root
ユーザを抜ける
# exit
$
DPDK VMでdpdk
のサンプルプログラムHello World
を実行
DPDK VMへ導入したdpdk
の動作確認のため, サンプルプログラムHello World
を実行を実行します。
実行に際してdpdk
プログラムの動作に必要なHugepageの設定も実施します。
※DPDK VMで実施
◯Hugepageの設定
→2MBを128ページ確保する例
・必要パッケージをインストール
sudo dnf install numactl numactl-devel -y
・バックアップ
sudo -E cp /etc/default/grub /etc/default/grub.org
・設定変更(default_hugepagesz=1G hugepagesz=2M hugepages=128を追記)
sudo vi /etc/default/grub
GRUB_CMDLINE_LINUX="resume=/dev/mapper/rl-swap rd.lvm.lv=rl/root rd.lvm.lv=rl/swap console=ttyS0,115200n8 default_hugepagesz=1G hugepagesz=2M hugepages=128"
・設定変更を反映(BIOSベースマシンの場合)
sudo -E grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file ...
done
・設定変更を反映(UEFIベースのマシンの場合)
sudo -E grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg
・再起動→再ログイン
sudo reboot
・反映確認
cat /proc/meminfo | grep HugePage
AnonHugePages: 4096 kB
ShmemHugePages: 0 kB
FileHugePages: 0 kB
HugePages_Total: 128
HugePages_Free: 128
HugePages_Rsvd: 0
HugePages_Surp: 0
◯Hello World
サンプルプログラムの実行
※以降root
ユーザで実施
・環境変数の設定
sudo su -
# vi /etc/profile(以下を末尾に追記)
export PKG_CONFIG_PATH="/usr/local/lib64/pkgconfig/"
export LD_LIBRARY_PATH="/usr/local/lib64"
# source vi /etc/profile
・Hello World
のコンパイル
→make
時にMakefile:14: *** "no installation of DPDK found". Stop.
のErrorが発生した場合は
export PKG_CONFIG_PATH="/usr/local/lib64/pkgconfig/"
が環境変数に設定されているか確認すること
# cd /opt/dpdk-stable-22.11.4/examples/helloworld
# make
cc -O3 -I/usr/local/include -include rte_config.h -march=native -DALLOW_EXPERIMENTAL_API main.c -o build/helloworld-shared -Wl,--as-needed -L/usr/local/lib64 -lrte_node -lrte_graph -lrte_pipeline -lrte_table -lrte_pdump -lrte_port -lrte_fib -lrte_ipsec -lrte_vhost -lrte_stack -lrte_security -lrte_sched -lrte_reorder -lrte_rib -lrte_dmadev -lrte_regexdev -lrte_rawdev -lrte_power -lrte_pcapng -lrte_member -lrte_lpm -lrte_latencystats -lrte_jobstats -lrte_ip_frag -lrte_gso -lrte_gro -lrte_gpudev -lrte_eventdev -lrte_efd -lrte_distributor -lrte_cryptodev -lrte_compressdev -lrte_cfgfile -lrte_bpf -lrte_bitratestats -lrte_bbdev -lrte_acl -lrte_timer -lrte_hash -lrte_metrics -lrte_cmdline -lrte_pci -lrte_ethdev -lrte_meter -lrte_net -lrte_mbuf -lrte_mempool -lrte_rcu -lrte_ring -lrte_eal -lrte_telemetry -lrte_kvargs
ln -sf helloworld-shared build/helloworld
・Hello World
の実行
→helloworld
実行時に./helloworld: error while loading shared libraries: librte_eal.so.23: cannot open shared object file: No such file or directory
のErrorが発生した場合は
"export LD_LIBRARY_PATH=/usr/local/lib64"
が環境変数に設定されているか確認すること
# cd ./build
# ./helloworld(2コアマシンなので2コア分の情報が出力される)
EAL: Detected CPU lcores: 2
EAL: Detected NUMA nodes: 1
EAL: Detected shared linkage of DPDK
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'PA'
EAL: Probe PCI driver: net_virtio (1af4:1000) device: 0000:00:02.0 (socket -1)
eth_virtio_pci_init(): Failed to init PCI device
EAL: Requested device 0000:00:02.0 cannot be used
EAL: Probe PCI driver: net_virtio (1af4:1000) device: 0000:00:05.0 (socket -1)
eth_virtio_pci_init(): Failed to init PCI device
EAL: Requested device 0000:00:05.0 cannot be used
EAL: Probe PCI driver: net_virtio (1af4:1000) device: 0000:00:06.0 (socket -1)
eth_virtio_pci_init(): Failed to init PCI device
EAL: Requested device 0000:00:06.0 cannot be used
TELEMETRY: No legacy callbacks, legacy socket not created
hello from core 1
hello from core 0
Pingを用いてDPDK
のサンプルプログラムl2fwd
を実行
DPDK VMへ導入したdpdk
の動作確認のため, サンプルプログラムl2fwd
を実行を実行します。
実行に際してdpdk
プログラムに必要なNICのバインド設定も実施します。
まずは簡易的な確認としてCALL VMからPingを飛ばして確認していきます。

※DPDK VMで実施
◯NICのバインド
・バインド状態の確認(Network devices using kernel driverにNICが3つあることを確認する)
# $RTE_SDK/usertools/dpdk-devbind.py --status
Network devices using kernel driver
===================================
0000:00:02.0 'Virtio network device 1000' if=ens2 drv=virtio-pci unused= *Active*
0000:00:05.0 'Virtio network device 1000' if=ens5 drv=virtio-pci unused= *Active*
0000:00:06.0 'Virtio network device 1000' if=ens6 drv=virtio-pci unused= *Active*
No 'Baseband' devices detected
==============================
No 'Crypto' devices detected
============================
No 'DMA' devices detected
=========================
No 'Eventdev' devices detected
==============================
No 'Mempool' devices detected
=============================
No 'Compress' devices detected
==============================
Misc (rawdev) devices using kernel driver
=========================================
0000:00:05.0 'Virtio block device 1001' drv=virtio-pci unused=
No 'Regex' devices detected
===========================
・igb_uioのロード
# lsmod | grep uio
# modprobe uio
# insmod /opt/dpdk-stable-22.11.4/drivers/igb_uio.ko
# lsmod | grep -e Module -e 'uio'
Module Size Used by
igb_uio 16384 0
uio 20480 1 igb_uio
・バインド対象のIFのdown
# ifconfig ens5 down
# ifconfig ens6 down
・バインド状態の確認
→バインド対象のNICが非Activeであることを確認する
# $RTE_SDK/usertools/dpdk-devbind.py --status
Network devices using kernel driver
===================================
0000:00:02.0 'Virtio network device 1000' if=ens2 drv=virtio-pci unused=igb_uio *Active*
0000:00:05.0 'Virtio network device 1000' if=ens5 drv=virtio-pci unused=igb_uio
0000:00:06.0 'Virtio network device 1000' if=ens6 drv=virtio-pci unused=igb_uio
No 'Baseband' devices detected
==============================
No 'Crypto' devices detected
============================
No 'DMA' devices detected
=========================
No 'Eventdev' devices detected
==============================
No 'Mempool' devices detected
=============================
No 'Compress' devices detected
==============================
Misc (rawdev) devices using kernel driver
=========================================
0000:00:05.0 'Virtio block device 1001' drv=virtio-pci unused=igb_uio
No 'Regex' devices detected
===========================
・NICのバインド(受信用と送信用の2つをバインド)
→バインド時にWarning: routing table indicates that interface 0000:00:05.0 is active. Not modifying
のErrorが発生した場合は, 対象IFがdown状態であることを確認する
# $RTE_SDK/usertools/dpdk-devbind.py -b igb_uio 0000:00:05.0 0000:00:06.0
・バインド状態の確認
→DPDK-compatible driver
にバインド対象のIFが表示されていることを確認する
# $RTE_SDK/usertools/dpdk-devbind.py --status
Network devices using DPDK-compatible driver
============================================
0000:00:05.0 'Virtio network device 1000' drv=igb_uio unused=
0000:00:06.0 'Virtio network device 1000' drv=igb_uio unused=
Network devices using kernel driver
===================================
0000:00:02.0 'Virtio network device 1000' if=ens2 drv=virtio-pci unused=igb_uio *Active*
No 'Baseband' devices detected
==============================
No 'Crypto' devices detected
============================
No 'DMA' devices detected
=========================
No 'Eventdev' devices detected
==============================
No 'Mempool' devices detected
=============================
No 'Compress' devices detected
==============================
Misc (rawdev) devices using kernel driver
=========================================
0000:00:05.0 'Virtio block device 1001' drv=virtio-pci unused=igb_uio
No 'Regex' devices detected
===========================
◯l2fwd
のコンパイルと実行
・l2fwdのコンパイル
# cd $RTE_SDK/examples/l2fwd
# make
cc -O3 -I/usr/local/include -include rte_config.h -march=native -DALLOW_EXPERIMENTAL_API main.c -o build/l2fwd-shared -Wl,--as-needed -L/usr/local/lib64 -lrte_node -lrte_graph -lrte_pipeline -lrte_table -lrte_pdump -lrte_port -lrte_fib -lrte_ipsec -lrte_vhost -lrte_stack -lrte_security -lrte_sched -lrte_reorder -lrte_rib -lrte_dmadev -lrte_regexdev -lrte_rawdev -lrte_power -lrte_pcapng -lrte_member -lrte_lpm -lrte_latencystats -lrte_jobstats -lrte_ip_frag -lrte_gso -lrte_gro -lrte_gpudev -lrte_eventdev -lrte_efd -lrte_distributor -lrte_cryptodev -lrte_compressdev -lrte_cfgfile -lrte_bpf -lrte_bitratestats -lrte_bbdev -lrte_acl -lrte_timer -lrte_hash -lrte_metrics -lrte_cmdline -lrte_pci -lrte_ethdev -lrte_meter -lrte_net -lrte_mbuf -lrte_mempool -lrte_rcu -lrte_ring -lrte_eal -lrte_telemetry -lrte_kvargs
ln -sf l2fwd-shared build/l2fwd
・l2fwdの実行(コア数1, NIC番号は0-1)
# cd ./build/
# ./l2fwd -l 0-1 -n 1 -- -q 1 -p 0x03
※l2fwd
の実行に失敗した場合, DPDKのビルド/インストールを実施の上再トライする
→dpdk
インストール対象マシンを再起動した際に, DPDKを再ビルド/インストールが必要になる場合がある
# cd /opt/dpdk-stable-22.11.4/
# meson build
# cd build
# ninja
# ninja install
※CALL VMで実施
◯ターミナルを2つ開く(①/②とする)
・ターミナル②でtshark
を実施しておく(ICMPに絞る)
sudo tshark -i ens6 -Y 'icmp.type==8'
・ターミナル①でping
を打つ(適当なタイミングでCtrl+C
で停止する)
sudo ping -I ens5 10.0.1.20
PING 10.0.1.20 (10.0.1.20) from 10.0.1.10 ens5: 56(84) bytes of data.
^C
--- 10.0.1.20 ping statistics ---
35 packets transmitted, 0 received, 100% packet loss, time 34855m
・ターミナル②を確認する
→DPDK VMを経由してICMPパケットがCALL VMのens6
にfwdされていることが確認できる
Running as user "root" and group "root". This could be dangerous.
Capturing on 'ens6'
1 0.000000000 10.0.1.10 → 10.0.1.20 ICMP 98 Echo (ping) request id=0x0006, seq=1/256, ttl=64
2 1.060702458 10.0.1.10 → 10.0.1.20 ICMP 98 Echo (ping) request id=0x0006, seq=2/512, ttl=64
3 2.084639057 10.0.1.10 → 10.0.1.20 ICMP 98 Echo (ping) request id=0x0006, seq=3/768, ttl=64
4 3.108704863 10.0.1.10 → 10.0.1.20 ICMP 98 Echo (ping) request id=0x0006, seq=4/1024, ttl=64
5 4.132760154 10.0.1.10 → 10.0.1.20 ICMP 98 Echo (ping) request id=0x0006, seq=5/1280, ttl=64
6 5.156652554 10.0.1.10 → 10.0.1.20 ICMP 98 Echo (ping) request id=0x0006, seq=6/1536, ttl=64
8 6.180646357 10.0.1.10 → 10.0.1.20 ICMP 98 Echo (ping) request id=0x0006, seq=7/1792, ttl=64
10 7.204715184 10.0.1.10 → 10.0.1.20 ICMP 98 Echo (ping) request id=0x0006, seq=8/2048, ttl=64
12 8.228737858 10.0.1.10 → 10.0.1.20 ICMP 98 Echo (ping) request id=0x0006, seq=9/2304, ttl=64
^C9 packets captured
※DPDK VMで実施
◯l2fwdの画面を確認
・確認後Ctrl+C
で停止
Port statistics ====================================
Statistics for port 0 ------------------------------
Packets sent: 6
Packets received: 45
Packets dropped: 0
Statistics for port 1 ------------------------------
Packets sent: 45
Packets received: 6
Packets dropped: 0
Aggregate statistics ===============================
Total packets sent: 51
Total packets received: 51
Total packets dropped: 0
====================================================
^C
Signal 2 received, preparing to exit...
Closing port 0... Done
Closing port 1... Done
Bye...
trafgen
を用いてDPDK
のサンプルプログラムl2fwd
を実行
DPDK VMへ導入したdpdk
の動作確認のため, サンプルプログラムl2fwd
を実行を実行します。
以降のサンプルプログラム改造に先んじて, CALL VMでtrafgen
の動作確認もあわせて実施します。

※DPDK VMで実施
◯l2fwd
の実行
# l2fwdの実行(コア数1, NIC番号は0-1)
# cd ./build/
# ./l2fwd -l 0-1 -n 1 -- -q 1 -p 0x03
※CALL VMで実施
◯ターミナルを2つ開く(①/②とする)
・ターミナル①でtrafgen
のコンフィグを作成する(適当なIPFIX Data Templateパケットの例)
vi ./sample_temlate.cfg
#include <stddef.h>
{
/* ----- Etherframe ----- */
0x52, 0x54, 0x00, 0x08, 0x25, 0x0b, /* Dst MAC address (52:54:00:08:25:0b) */
0x52, 0x54, 0x00, 0x13, 0x4e, 0x9b, /* Src MAC address (52:54:00:13:4e:9b) */
0x08, 0x00, /* Type IP */
/* ----- IP Header ----- */
0x45, /* Version, Header Length */
0x00, /* Differentiated Services Field*/
0x00, 0x48, /* Total Length */
0xef, 0x7b, /* Identification */
0x00, 0x00, /* Flags */
0x40, /* Time to Live */
0x11, /* Protocol */
csumip(14, 33), /* Header checksum */
0x0a, 0x00, 0x01, 0x0a, /* Src IP Address (10.0.1.10) */
0x0a, 0x00, 0x01, 0x14, /* Dst IP Address (10.0.1.20) */
/* ----- UDP Header ----- */
0xc3, 0xe7, /* Src port */
0x08, 0x07, /* Dst port(2055) */
0x00, 0x34, /* Length */
csumudp(14, 34), /* Checksum */
/* ----- IPFIX Header ----- */
0x00, 0x0a, /* IPFIX Version */
0x00, 0x2c, /* IPFIX Length */
0x5d, 0x2e, 0x85, 0xd3, /* Timestamp */
0x04, 0xaa, 0xaa, 0x16, /* FlowSequence */
0x00, 0x00, 0x00, 0x01, /* Observation Domain Id(1) */
0x00, 0x02, /* FlowSet Id */
0x00, 0x1c, /* FlowSet Length */
0x04, 0x00, /* Template Id */
0x00, 0x05, /* Field Count */
0x00, 0x0a, 0x00, 0x04, /* Input SNMP */
0x00, 0x0e, 0x00, 0x04, /* Output SNMP */
0x00, 0x3d, 0x00, 0x01, /* Direction */
0x01, 0x38, 0x00, 0x02, /* Data Link Frame Size */
0x01, 0x3b, 0xff, 0xff, /* Data Link Frame Section */
}
・ターミナル②でtshark
を実施しておく
sudo tshark -i ens6
・ターミナル①でtrafgen
を実行
→-n
オプションによって10パケット送信する例
sudo trafgen --dev ens5 -P 1 --conf ./sample_temlate.cfg --cpp -n 10
・ターミナル②を確認する
Running as user "root" and group "root". This could be dangerous.
Capturing on 'ens6'
1 0.000000000 10.0.1.10 → 10.0.1.20 CFLOW 86 IPFIX flow ( 44 bytes) Obs-Domain-ID=1 [Data-Template:1024]
2 0.000006928 10.0.1.10 → 10.0.1.20 CFLOW 86 IPFIX flow ( 44 bytes) Obs-Domain-ID=1 [Data-Template:1024]
3 0.000012575 10.0.1.10 → 10.0.1.20 CFLOW 86 IPFIX flow ( 44 bytes) Obs-Domain-ID=1 [Data-Template:1024]
4 0.000015930 10.0.1.10 → 10.0.1.20 CFLOW 86 IPFIX flow ( 44 bytes) Obs-Domain-ID=1 [Data-Template:1024]
5 0.000024872 10.0.1.10 → 10.0.1.20 CFLOW 86 IPFIX flow ( 44 bytes) Obs-Domain-ID=1 [Data-Template:1024]
6 0.000026393 10.0.1.10 → 10.0.1.20 CFLOW 86 IPFIX flow ( 44 bytes) Obs-Domain-ID=1 [Data-Template:1024]
7 0.000027432 10.0.1.10 → 10.0.1.20 CFLOW 86 IPFIX flow ( 44 bytes) Obs-Domain-ID=1 [Data-Template:1024]
8 0.000032079 10.0.1.10 → 10.0.1.20 CFLOW 86 IPFIX flow ( 44 bytes) Obs-Domain-ID=1 [Data-Template:1024]
9 0.000033517 10.0.1.10 → 10.0.1.20 CFLOW 86 IPFIX flow ( 44 bytes) Obs-Domain-ID=1 [Data-Template:1024]
10 0.000034470 10.0.1.10 → 10.0.1.20 CFLOW 86 IPFIX flow ( 44 bytes) Obs-Domain-ID=1 [Data-Template:1024]
^C10 packets captured
※DPDK VMで実施
◯l2fwd
の画面を確認
→確認後Ctrl+C
で停止
Port statistics ====================================
Statistics for port 0 ------------------------------
Packets sent: 15
Packets received: 34
Packets dropped: 0
Statistics for port 1 ------------------------------
Packets sent: 34
Packets received: 15
Packets dropped: 0
Aggregate statistics ===============================
Total packets sent: 49
Total packets received: 49
Total packets dropped: 0
====================================================
^C
Signal 2 received, preparing to exit...
Closing port 0... Done
Closing port 1... Done
Bye...
おわりに
前編である今回は入門編としてKVMの操作手順からDPDKの導入, パケットジェネレータであるtrafgen
の導入, DPDKサンプルプログラム実行までをご紹介しました。
次回後編ではDPDKサンプルプログラムの改造をご紹介したいと思います。
本件に関するお問い合わせ

[著者プロフィール]
フューチャーネットワーク事業部 第一ビジネスユニット
村木 遼亮(MURAKI RYOUSUKE)