ビルド方法やテストの実行テクニックに関してはVPPにSRv6 MUP Plugin APIを追加している話 の 開発方法とパッチを出すときの Tips
に書いたりしてるわけですが、もう少しフォローアップする話があってもいいかなー(書いとくと後で思い出すのに便利)と思い記事を書きました。
この記事は自分が便利だと思った物を追記してくスタイルなのでサイレントで更新されたりします。
プログラムのデバッグ方法
ここでは printf
ではもう辛くなった人向けです。たとえばCに慣れてなくて初期化されてなくて困ってるとかそういう人が便利に使う想定です。
AddressSanitizer
アドレスサニタイザーってやつです。VPPはマルチスレッドな感じでvalgrindが使えない環境なので使うと便利だったというやつです。 詳しくはここを見ると良さそう。
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を話すサーバーとして使うことができます。
(ちなみに、以前はvppsbの中にrouterプラグインがあって、それは特定プロトコルだけ分離してcplaneに投げてくれるいわゆるtap-inject機能がありましたが、それはもう古いのでlinuxcpを使いましょう)
netlink
# 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