情報畑でつかまえてロゴ
本サイトは NTTテクノクロスが旬の IT をキーワードに
IT 部門が今知っておきたい最新テクノロジーに関する情報をお届けするサイトです

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回~

01_network.jpg

動作環境について

今回の動作環境は以下とします。
02_Configuration.jpg

ホスト側の準備作業

まずはホストで検証に利用する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 settings37) Japanese
Time settings2) Asia, 73) Tokyo
Software selectionminimal
Kdump
Network configuration
Set host nameCALL
Configure device ens2
 ・IPv6 addressignore
 ・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_CALLtoDPDKbr_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_CALLtoDPDKbr_DPDKtoCALLにそれぞれ10.0.1.1010.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へtrafgentsharkを導入

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を飛ばして確認していきます。

03_l2fwd_ping.jpg

※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の動作確認もあわせて実施します。

04_l2fwd_trafgen.jpg

※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サンプルプログラムの改造をご紹介したいと思います。

本件に関するお問い合わせ

NTTテクノクロス
フューチャーネットワーク事業部

村木 遼亮

お問い合わせ

連載シリーズ
著者プロフィール
村木 遼亮
村木 遼亮

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