お腹.ヘッタ。

関数型とかセキュリティとか勉強したい。進捗つらぽよ

VPP上の開発・デバッグ方法テクニック

ビルド方法やテストの実行テクニックに関してはVPPにSRv6 MUP Plugin APIを追加している話開発方法とパッチを出すときの Tips に書いたりしてるわけですが、もう少しフォローアップする話があってもいいかなー(書いとくと後で思い出すのに便利)と思い記事を書きました。

この記事は自分が便利だと思った物を追記してくスタイルなのでサイレントで更新されたりします。

プログラムのデバッグ方法

ここでは printf ではもう辛くなった人向けです。たとえばCに慣れてなくて初期化されてなくて困ってるとかそういう人が便利に使う想定です。

AddressSanitizer

アドレスサニタイザーってやつです。VPPはマルチスレッドな感じでvalgrindが使えない環境なので使うと便利だったというやつです。 詳しくはここを見ると良さそう。

s3-docs.fd.io

make build VPP_EXTRA_CMAKE_ARGS=-DVPP_ENABLE_SANITIZE_ADDR=ON

GDB

gdbなので使い方はググってくれ

世の中にはいい記事がいっぱいあります。 https://uguisu.skr.jp/Windows/gdb.html

make debug

Trace

コードレベルではなく、設定や構成レベルのデバッグに有用です。

# VMのNICがある部分からパケットを受け取るときはここを見る
trace add dpdk-input 10
show trace
clear trace

# VTAPなどの部分からパケットを受け取るときはここを見る
trace add virtio-input 100
show trace
clear trace

# それぞれの処理nodeへの着信カウンターを見ることでどの処理が多く動いてるかがわかる
show runtime

packet trace

https://vps3-docs.fd.io/vpp/23.06/cli-reference/clis/clicmd_src_plugins_dispatch-trace.html

# pcap をtx側のものを全て取得する
pcap trace tx on

# 取得したものを書き出し(/tmp/tx.pcapに書き込まれる。 txをrxに置き換えても成り立つ仕様)
pcap trace tx off

pluginの有効化と Linux-CPの利用法

confの中に以下のように入れることで pluginが有効化されます

plugins {
  plugin linux_cp_plugin.so { enable }
}

linux-cp設定例

tap(つまりただのL2の分岐機能です)を使うことで hostのlinuxに入れれて便利という話があったりしますが、これはそれはうまいことlinux側と協調動作するというわけではないです。

そこでlinux-cpを利用するとVPPとLinuxが協調動作します。つまりVPPを普通のlinuxっぽく利用できます。 詳しくはこの一連の記事を見るのがおすすめです。

これを利用することでLinuxでVPP+FRRを動作させてBGPを話すサーバーとして使うことができます。

ipng.ch

(ちなみに、以前はvppsbの中にrouterプラグインがあって、それは特定プロトコルだけ分離してcplaneに投げてくれるいわゆるtap-inject機能がありましたが、それはもう古いのでlinuxcpを使いましょう)

# lcp use netlink
cat << EOF > /etc/sysctl.d/81-vpp-Netlink.conf 
# Increase Netlink to 64M
net.core.rmem_default=67108864
net.core.wmem_default=67108864
net.core.rmem_max=67108864
net.core.wmem_max=67108864
EOF
sudo sysctl -p

VPP

set interface state eth1 up
set interface ip address eth1 172.0.1.2/24
set interface state eth2 up 
set interface ip address eth2 fc00:12::1/64

loopback create-interface
set interface state loop0 up
set interface ip address loop0 fc00:1::1/64

lcp lcp-sync on
lcp lcp-auto-subint on
lcp create eth1 host-if eth1
lcp create eth2 host-if eth2

linux

sudo ip link set eth1 up
sudo ip addr add 172.0.1.2/24 dev eth1
sudo ip link set eth2 up
sudo ip addr add fc00:12::1/64 dev eth2