1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

UPG-VPP v1.13.0をネイティブにビルドする方法

Posted at

UPG-VPPは、Travelpingが開発したVPP UPFであり、DPDKと連携して動作することができます。4G PGW-Uあるいは5G UPFとして、GTP-U U-Planeを比較的手軽に高速処理することができます。実際に、複数の通信事業者(Tier1以下)において、erGWと組み合わせてGGSN/PGWとして実稼働しているそうです。

本記事では、公開されているコンテナスタイルのビルド方法とは別に、OSネイティブにビルドする方法を説明します。

動作確認したVMの仕様は以下の通りです。

OS CPU (Min) Memory (Min) HDD (Min)
Ubuntu 22.04 2 8GB 20GB

動作確認済みバージョン一覧

このビルド手順は、UPG-VPPvpp.specFPP-VPPvpp.specDockerfileを元に作成しています。以下のバージョンで簡単に動作確認をしました。

UPG-VPP FPP-VPP VPP iPerf3
v1.13.0 v22.10.13 branch:stable/2210
commit:07e0c05e698cf5ffd1e2d2de0296d1907519dc3d
OK
v1.12.0 v22.10.12 branch:stable/2210
commit:07e0c05e698cf5ffd1e2d2de0296d1907519dc3d
OK
v1.11.0 v22.10.11 branch:stable/2210
commit:07e0c05e698cf5ffd1e2d2de0296d1907519dc3d
OK
v1.10.0 v22.10.10 branch:stable/2210
commit:07e0c05e698cf5ffd1e2d2de0296d1907519dc3d
NG

ビルドに必要なパッケージをインストール

# apt install build-essential git meson ninja-build libhyperscan-dev

FPP-VPP v22.10.13のパッチを適用したVPP v22.10をビルド

# cd ~
# git clone https://github.com/travelping/fpp-vpp.git
# cd fpp-vpp
# git checkout refs/tags/v22.10.13
# cd ~
# git clone https://github.com/FDio/vpp.git
# cd vpp
# git checkout stable/2210
# git reset --hard 07e0c05e698cf5ffd1e2d2de0296d1907519dc3d
# git am ../fpp-vpp/vpp-patches/*.patch
# make install-dep
# make install-ext-deps
# make build-release
# cp -r build-root/install-vpp-native/vpp /usr/local/

次に、VPP用に追加された共有ライブラリの検索パスの情報を更新します。

# echo "/usr/local/vpp/lib/x86_64-linux-gnu" >> /etc/ld.so.conf.d/vpp.conf
# ldconfig

ビルドされたファイルを手動でコピーせずにパッケージとしてインストールする場合は、次のようにバイナリパッケージをビルドします。

# make pkg-deb
...
# cd build-root
# ls -l *.deb
-rw-r--r-- 1 root root   194014 May  4 23:52 libvppinfra_22.10.0-33~g13e629901_amd64.deb
-rw-r--r-- 1 root root   144410 May  4 23:52 libvppinfra-dev_22.10.0-33~g13e629901_amd64.deb
-rw-r--r-- 1 root root    26466 May  4 23:52 python3-vpp-api_22.10.0-33~g13e629901_amd64.deb
-rw-r--r-- 1 root root  5575156 May  4 23:52 vpp_22.10.0-33~g13e629901_amd64.deb
-rw-r--r-- 1 root root 82589604 May  4 23:52 vpp-dbg_22.10.0-33~g13e629901_amd64.deb
-rw-r--r-- 1 root root  1294366 May  4 23:52 vpp-dev_22.10.0-33~g13e629901_amd64.deb
-rw-r--r-- 1 root root  4736556 May  4 23:52 vpp-plugin-core_22.10.0-33~g13e629901_amd64.deb
-rw-r--r-- 1 root root   363268 May  4 23:52 vpp-plugin-devtools_22.10.0-33~g13e629901_amd64.deb
-rw-r--r-- 1 root root  4465408 May  4 23:52 vpp-plugin-dpdk_22.10.0-33~g13e629901_amd64.deb

デバッグ用のバイナリをビルド

デバッグモードでビルドする場合は以下のようにします。

...
# make build
# cp -r build-root/install-vpp_debug-native/vpp /usr/local/

ビルドされたファイルを手動でコピーせずにパッケージとしてインストールする場合は、次のようにバイナリパッケージをビルドします。

# make pkg-deb-debug

ビルドしたVPPパッケージをインストール

VPPをビルドしたホスト以外でVPPパッケージをインストールする場合は、まず次の依存パッケージをインストールします。

# apt install libnl-route-3-200

次に、VPPパッケージをインストールします。

# cd build-root
# dpkg -i *.deb

これにより、systemctlを使用してVPPサービスを操作できるようになります。

UPG-VPP v1.13.0をビルド

# cd ~
# git clone https://github.com/travelping/upg-vpp.git
# cd upg-vpp
# git checkout refs/tags/v1.13.0
# make version
# mkdir build
# cd build
# cmake -DVPP_HOME=/usr/local/vpp ..
# make
# cp upf_plugin.so /usr/local/vpp/lib/x86_64-linux-gnu/vpp_plugins

これにより、/usr/local/vppにUPG-VPPが構築されました。

注意点。
UPG-VPP v1.13.0はPDU Session containerをサポートしていません。そのため、一部のgNodeBではPDU Session containerDL PDU SESSION INFORMATIONが含まれていないUPG-VPPからのGTPトラフィックを受け付けない場合があります。その場合は、こちらを参考にしてOAIのパッチを試す方法があります。また、こちらに、OAIのパッチを元に作成したUPG-VPP v1.13.0用の暫定パッチがあります。このパッチはQFI=1に固定されています。srsRAN_ProjectのgNodeBで動作を確認しました。

ビルドしたupf_plugin.soなどを手動でコピーせずにパッケージとしてインストールしたい場合は、次のようにバイナリパッケージをビルドします。

# make package
...
# ls -l *.deb
-rw-r--r-- 1 root root 2866388 May  4 23:57 upf-plugin_1.13.0_amd64.deb
-rw-r--r-- 1 root root   38746 May  4 23:57 upf-plugin-dev_1.13.0_amd64.deb

ビルドしたUPG-VPPパッケージをインストール

UPG-VPPをビルドしたホスト以外にUPG-VPPパッケージをインストールする場合は、まず次の依存パッケージをインストールします。

# apt install libhyperscan-dev

次に、UPG-VPPパッケージをインストールします。

# cd build
# dpkg -i *.deb

UPG-VPPの設定ファイルの変更

元のファイルについては、こちらを参照して下さい。

  • openair-upf/startup.conf
--- startup.conf.orig   2023-07-09 11:59:18.000000000 +0900
+++ startup.conf        2023-11-12 15:54:33.395276365 +0900
@@ -1,3 +1,5 @@
+heapsize 2G
+
 unix {
   nodaemon
   log /tmp/vpp.log
@@ -28,8 +30,8 @@
 }
 
 plugins {
-  path /usr/lib/x86_64-linux-gnu/vpp_plugins/
-  plugin ikev2_plugin.so {disable}
+  path /usr/local/vpp/lib/x86_64-linux-gnu/vpp_plugins/
+  plugin oddbuf_plugin.so {enable}
   plugin dpdk_plugin.so {enable}
   plugin upf_plugin.so {enable}
 }
  • openair-upf/init.conf
    変更はありません。

ビルドしたパッケージをインストールする場合の設定ファイルの変更

systemctlでVPPサービスを操作するときに使用する設定ファイルは、デフォルトでは以下のディレクトリにあります。元のファイルについてはこちらを参照して下さい。

  • /etc/vpp/startup.conf
--- startup.conf.orig   2023-07-09 11:59:18.000000000 +0900
+++ startup.conf        2024-02-24 12:22:32.506567556 +0900
@@ -1,3 +1,5 @@
+heapsize 2G
+
 unix {
   nodaemon
   log /tmp/vpp.log
@@ -5,7 +7,7 @@
   gid vpp
   interactive
   cli-listen /run/vpp/cli.sock
-  exec /root/openair-upf/init.conf
+  exec /etc/vpp/init.conf
 }
 
 api-trace {
@@ -28,8 +30,8 @@
 }
 
 plugins {
-  path /usr/lib/x86_64-linux-gnu/vpp_plugins/
-  plugin ikev2_plugin.so {disable}
+  path /usr/lib/x86_64-linux-gnu/vpp_plugins/:/usr/local/lib/vpp_plugins/
+  plugin oddbuf_plugin.so {enable}
   plugin dpdk_plugin.so {enable}
   plugin upf_plugin.so {enable}
 }
  • openair-upf/init.conf
    変更はありません。

DPDKでUPG-VPPを実行

前提として、N3、N4およびN6ネットワークのインターフェイスをDPDK互換ドライバーにバインドする手順については、こちらを参照して下さい。

まず、グループvppが存在しない場合は作成します。

# addgroup vpp

次に、DPDKを使用してUPG-VPPを実行します。

# /usr/local/vpp/bin/vpp -c /root/openair-upf/startup.conf
perfmon              [warn  ]: skipping source 'intel-uncore' - intel_uncore_init: no uncore units found
    _______    _        _   _____  ___ 
 __/ __/ _ \  (_)__    | | / / _ \/ _ \
 _/ _// // / / / _ \   | |/ / ___/ ___/
 /_/ /____(_)_/\___/   |___/_/  /_/    

vpp# 

ビルドしたパッケージをインストールした場合のUPG-VPPを実行

# systemctl restart vpp
# systemctl status vpp
● vpp.service - vector packet processing engine
     Loaded: loaded (/lib/systemd/system/vpp.service; enabled; vendor preset: enabled)
     Active: active (running) since Sun 2024-05-05 00:54:16 JST; 1s ago
    Process: 2547 ExecStartPre=/sbin/modprobe uio_pci_generic (code=exited, status=0/SUCCESS)
   Main PID: 2548 (vpp)
      Tasks: 2 (limit: 9387)
     Memory: 1.3G
        CPU: 1.023s
     CGroup: /system.slice/vpp.service
             └─2548 /usr/bin/vpp -c /etc/vpp/startup.conf

May 05 00:54:16 upg-vpp-11 systemd[1]: Starting vector packet processing engine...
May 05 00:54:16 upg-vpp-11 systemd[1]: Started vector packet processing engine.
May 05 00:54:16 upg-vpp-11 vpp[2548]: perfmon              [warn  ]: skipping source 'intel-uncore' - intel_uncore_init: no uncore units found

4G、5Gコア連携の設定例

5Gの場合

4Gの場合

最後に

元々、UPG-VPPのビルド手順はコンテナスタイルのみ公開されていましたが、うまくDocker imageをビルドすることができませんでした。また、以前、わたし以外にもビルドができない指摘がIssuesに上がっていました。そこで、Issuesの指摘やDockerfile、specファイルを参考に、まずは、OSネイティブにビルドする手順を紐解くことから始め、動作確認することができましたので、備忘録として手順をまとめました。OSSのUPFの中では、DPDKと連携するUPG-VPPはとても高速なU-Planeを実現できるのではと思います。
他に高速なUPFの例としては、eUPF(eBPF/XDP UPF)をnativeモード(ドライバレベル) or offloadモード(NICレベル)で動作させる場合でしょうか(推測)。

最後に、元記事はGithubに書いたものです。

主な変更履歴

  • [2024.09.12] 初版。
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?