UPF性能の簡易測定

本記事では、ローカル5G SAを想定して、データプレーンを形成する幾つかのオープンソースのUPFに関する簡単な性能測定について説明します。性能測定には、Hewlett Packard Enterpriseの技術者が開発した[PachetRusher](https://github.com/HewlettPackard/PacketRusher)を使用しました。

## UPF性能測定の簡単な概要

5GCにOpen5GSを使用して、PacketRusherで幾つかのオープンソースUPFの性能を簡単に測定します。**この構成はVirtualbox VMを使用していることに注意してください。**

この環境は以下の条件を満たす最小構成になります。

- C-Plane、U-Plane(UPF)、RAN&UE(性能測定ツール)を各1つ

構築した環境は以下の通りです。

<img width="800" alt="network-overview.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457466/359d83ce-1948-0d3e-c435-fc455b76a021.png">

5GCとRAN&UEに使用しているOSSは以下の通りです。

- 5GC - Open5GS v2.7.0 (2023.12.04) - https://github.com/open5gs/open5gs  
  *for Open5GS UPF, UPG-VPP and eUPF*
- 5GC - free5GC v3.3.0 (2023.11.03) - https://github.com/free5gc/free5gc  
  *for free5GC UPF*
- RAN&UE - PacketRusher (2023.12.06) - https://github.com/HewlettPackard/PacketRusher

UPFに使用しているOSSは以下の通りです。

- Open5GS UPF v2.7.0 (2023.12.04) - https://github.com/open5gs/open5gs
- UPG-VPP v1.11.0 (2023.12.11) - https://github.com/travelping/upg-vpp
- eUPF v0.6.0 (2023.12.05) - https://github.com/edgecomllc/eupf
- free5GC UPF v3.3.0 (2023.11.12) - https://github.com/free5gc/free5gc

各VMは以下の通りです。

| VM | SW & Role | IP address | OS | CPU | Memory | HDD |
| --- | --- | --- | --- | --- | --- | --- |
| VM1 | Open5GS 5GC<br>C-Plane | 192.168.0.111/24 | Ubuntu 22.04 | 1 | 2GB | 20GB |
| **VM-UP** | **each UPF<br>U-Plane**  | **192.168.0.151/24** | **Ubuntu<br>22.04<br>or 20.04** | **2** | **8GB** | **20GB** |
| VM-DN | Data Network<br>Gateway  | 192.168.0.152/24 | Ubuntu 22.04 | 2 | 2GB | 10GB |
| VM2 | PacketRusher RAN&UE | 192.168.0.131/24 | Ubuntu 22.04 | 2 | 2GB | 10GB |

**各VM-UP(UPFs)は以下の通りです。**

| # | SW | Date | Commit | OS |
| --- | --- | --- | --- | --- |
| a | Open5GS UPF v2.7.0 | 2023.12.04 | `177e561ba86c35d56ecf44d1775a3f4f03139cce` | Ubuntu 22.04 |
| b | UPG-VPP v1.11.0 | 2023.12.11 | `065b2ec85b8bd8f9631d1b854f7b37f11e6a1e1b` | Ubuntu 20.04 |
| c | eUPF v0.6.0 | 2023.12.05 | `d3e78b8fe10868e534c74cb793ae76923ac4a5e0` | Ubuntu 22.04 |
| d | free5GC UPF v3.3.0 | 2023.11.12 | `9b9272d9fda970f6af8bb7f1b01d4932c3bfbc8d` |Ubuntu 22.04 |

VM-UP以外の各VMのネットワークインターフェースは以下の通りです。

| VM | Device | Network Adapter | Adapter Type | IP address | Interface |
| --- | --- | --- | --- | --- | --- |
| VM1 | enp0s3 | NAT(default) | 82540EM | 10.0.2.15/24 | (VM default NW) |
| | enp0s8 | Bridged Adapter | 82540EM | 192.168.0.111/24 | (Mgmt NW) |
| | enp0s9 | NAT Network | virtio-net | 192.168.14.111/24 | N4 |
| VM-DN | enp0s3 | NAT(default) | 82540EM | 10.0.2.15/24 | (VM default NW) |
| | enp0s8 | Bridged Adapter | 82540EM | 192.168.0.152/24 | (Mgmt NW) |
| | enp0s9 | NAT Network | virtio-net | 192.168.16.152/24 | N6<br>***default GW for VM-UP*** |
| VM2 | enp0s3 | NAT(default) | 82540EM | 10.0.2.15/24 | (VM default NW) |
| | enp0s8 | Bridged Adapter | 82540EM | 192.168.0.131/24 | (Mgmt NW) |
| | enp0s9 | NAT Network | virtio-net | 192.168.13.131/24 | N3 |

**各VM-UP(UPFs)ネットワークインターフェースは以下の通りです。**
**注記。`a`～`c`のUPFはOpen5GS CNに接続しますが、`d`のfree5GC UPFは`PFCP Association Setup`で`FTUP`に対応していないため、free5GC CNに接続させます。**

| # | SW | Device | Network<br>Adapter | Adapter Type | IP address | Interface |
| --- | --- | --- | --- | --- | --- | --- |
| a | Open5GS<br>UPF | ~~enp0s3~~ | ~~NAT(default)~~ | ~~82540EM~~ | ~~10.0.2.15/24~~ | ~~(VM default NW)~~<br>***down*** |
| | | enp0s8 | Bridged Adapter | 82540EM | 192.168.0.151/24 | (Mgmt NW) |
| | | enp0s9 | NAT Network | virtio-net | 192.168.13.151/24 | N3 |
| | | enp0s10 | NAT Network | virtio-net | 192.168.14.151/24 | N4 |
| | | enp0s16 | NAT Network | virtio-net | 192.168.16.151/24 | N6 |
| b | UPG-VPP | enp0s3 | NAT(default) | 82540EM | 10.0.2.15/24 | (VM default NW) |
| | | enp0s8 | Bridged Adapter | 82540EM | 192.168.0.151/24 | (Mgmt NW) |
| | | enp0s9 | NAT Network | 82540EM | 192.168.13.151/24 | N3<br>***(Under DPDK<br>by vfio-pci)*** |
| | | enp0s10 | NAT Network | 82540EM | 192.168.14.151/24 | N4<br>***(Under DPDK<br>by vfio-pci)*** |
| | | enp0s16 | NAT Network | 82540EM | 192.168.16.151/24 | N6<br>***(Under DPDK<br>by vfio-pci)*** |
| c | eUPF | ~~enp0s3~~ | ~~NAT(default)~~ | ~~82540EM~~ | ~~10.0.2.15/24~~ | ~~(VM default NW)~~<br>***down*** |
| | | enp0s8 | Bridged Adapter | 82540EM | 192.168.0.151/24 | (Mgmt NW) |
| | | enp0s9 | NAT Network | virtio-net | 192.168.13.151/24 | N3 ***(XDP)*** |
| | | enp0s10 | NAT Network | virtio-net | 192.168.14.151/24 | N4 |
| | | enp0s16 | NAT Network | virtio-net | 192.168.16.151/24 | N6 ***(XDP)*** |
| d | free5GC UPF | ~~enp0s3~~ | ~~NAT(default)~~ | ~~82540EM~~ | ~~10.0.2.15/24~~ | ~~(VM default NW)~~<br>***down*** |
| | | enp0s8 | Bridged Adapter | 82540EM | 192.168.0.151/24 | (Mgmt NW) |
| | | enp0s9 | NAT Network | virtio-net | 192.168.13.151/24 | N3 |
| | | enp0s10 | NAT Network | virtio-net | 192.168.14.151/24 | N4 |
| | | enp0s16 | NAT Network | virtio-net | 192.168.16.151/24 | N6 |

5GのNF間のインターフェースの内、N3、N4、N6については、VirtualboxのNATネットワークで以下の通りに設定しました。

| Network Name | Network CIDR |
| --- | --- |
| N3 | 192.168.13.0/24 |
| N4 | 192.168.14.0/24 |
| N6 | 192.168.16.0/24 |

加入者情報は以下の通りです。(その他の項目はデフォルト値)
Open5GSとfree5GCの各WebConsoleから加入者情報を登録して下さい。

| IMSI | DNN | DN | Key & OPc | S-NSSAI |
| --- | --- | --- | --- | --- |
| 001010000001000 | internet | 10.45.0.0/16 | `Key:465B5CE8B199B49FAA5F0A2EE238A6BC`<br>`OPc:E8ED289DEBA952E4283B54E88E6183CA` | SST:1<br>SD:010203|

## Open5GS、free5GC、UPFs、PacketRusherの各設定ファイルの変更点

Open5GS、free5GC、UPFs、PacketRusherの各設定ファイルについては以下を参照して下さい。

- Open5GS v2.7.0 (2023.12.04) - https://open5gs.org/open5gs/docs/guide/02-building-open5gs-from-sources/
- free5GC v3.3.0 (2023.11.03) - https://free5gc.org/guide/
- UPG-VPP v1.11.0 (2023.12.11) - https://github.com/s5uishida/install_vpp_upf_dpdk#annex_1
- eUPF v0.6.0 (2023.12.05) - https://github.com/s5uishida/install_eupf
- free5GC UPF v3.3.0 (2023.11.12) - https://free5gc.org/guide/
- PacketRusher (2023.12.06) - https://github.com/HewlettPackard/PacketRusher/wiki

### Open5GS 5GC C-Planeの設定ファイルの変更点

- `open5gs/install/etc/open5gs/amf.yaml`
```diff
--- amf.yaml.orig       2023-12-05 03:49:16.000000000 +0900
+++ amf.yaml    2023-12-07 04:38:12.000000000 +0900
@@ -19,29 +19,30 @@
         - uri: http://127.0.0.200:7777
   ngap:
     server:
-      - address: 127.0.0.5
+      - address: 192.168.0.111
   metrics:
     server:
       - address: 127.0.0.5
         port: 9090
   guami:
     - plmn_id:
-        mcc: 999
-        mnc: 70
+        mcc: 001
+        mnc: 01
       amf_id:
         region: 2
         set: 1
   tai:
     - plmn_id:
-        mcc: 999
-        mnc: 70
+        mcc: 001
+        mnc: 01
       tac: 1
   plmn_support:
     - plmn_id:
-        mcc: 999
-        mnc: 70
+        mcc: 001
+        mnc: 01
       s_nssai:
         - sst: 1
+          sd: 010203
   security:
     integrity_order : [ NIA2, NIA1, NIA0 ]
     ciphering_order : [ NEA0, NEA1, NEA2 ]
```
- `open5gs/install/etc/open5gs/nrf.yaml`
```diff
--- nrf.yaml.orig       2023-12-05 03:49:16.000000000 +0900
+++ nrf.yaml    2023-12-07 03:41:26.000000000 +0900
@@ -10,8 +10,8 @@
 nrf:
   serving:  # 5G roaming requires PLMN in NRF
     - plmn_id:
-        mcc: 999
-        mnc: 70
+        mcc: 001
+        mnc: 01
   sbi:
     server:
       - address: 127.0.0.10
```
- `open5gs/install/etc/open5gs/smf.yaml`
```diff
--- smf.yaml.orig       2023-12-05 03:49:16.000000000 +0900
+++ smf.yaml    2023-12-07 03:45:36.000000000 +0900
@@ -19,28 +19,27 @@
         - uri: http://127.0.0.200:7777
   pfcp:
     server:
-      - address: 127.0.0.4
+      - address: 192.168.14.111
     client:
       upf:
-        - address: 127.0.0.7
+        - address: 192.168.14.151
+          dnn: internet
   gtpc:
     server:
       - address: 127.0.0.4
   gtpu:
     server:
-      - address: 127.0.0.4
+      - address: 192.168.14.111
   metrics:
     server:
       - address: 127.0.0.4
         port: 9090
   session:
     - subnet: 10.45.0.1/16
-    - subnet: 2001:db8:cafe::1/48
+      dnn: internet
   dns:
     - 8.8.8.8
     - 8.8.4.4
-    - 2001:4860:4860::8888
-    - 2001:4860:4860::8844
   mtu: 1400
 #  p-cscf:
 #    - 127.0.0.1
```

### free5GC 5GC C-Planeの設定ファイルの変更点

- `free5gc/config/amfcfg.yaml`
```diff
--- amfcfg.yaml.orig    2023-12-07 03:01:50.000000000 +0900
+++ amfcfg.yaml 2023-12-07 05:00:50.000000000 +0900
@@ -5,7 +5,7 @@
 configuration:
   amfName: AMF # the name of this AMF
   ngapIpList:  # the IP list of N2 interfaces on this AMF
-    - 127.0.0.18
+    - 192.168.0.111
   ngapPort: 38412 # the SCTP port listened by NGAP
   sbi: # Service-based interface information
     scheme: http # the protocol for sbi (http or https)
@@ -24,18 +24,18 @@
   servedGuamiList: # Guami (Globally Unique AMF ID) list supported by this AMF
     # <GUAMI> = <MCC><MNC><AMF ID>
     - plmnId: # Public Land Mobile Network ID, <PLMN ID> = <MCC><MNC>
-        mcc: 208 # Mobile Country Code (3 digits string, digit: 0~9)
-        mnc: 93 # Mobile Network Code (2 or 3 digits string, digit: 0~9)
+        mcc: 001 # Mobile Country Code (3 digits string, digit: 0~9)
+        mnc: 01 # Mobile Network Code (2 or 3 digits string, digit: 0~9)
       amfId: cafe00 # AMF identifier (3 bytes hex string, range: 000000~FFFFFF)
   supportTaiList:  # the TAI (Tracking Area Identifier) list supported by this AMF
     - plmnId: # Public Land Mobile Network ID, <PLMN ID> = <MCC><MNC>
-        mcc: 208 # Mobile Country Code (3 digits string, digit: 0~9)
-        mnc: 93 # Mobile Network Code (2 or 3 digits string, digit: 0~9)
+        mcc: 001 # Mobile Country Code (3 digits string, digit: 0~9)
+        mnc: 01 # Mobile Network Code (2 or 3 digits string, digit: 0~9)
       tac: 000001 # Tracking Area Code (3 bytes hex string, range: 000000~FFFFFF)
   plmnSupportList: # the PLMNs (Public land mobile network) list supported by this AMF
     - plmnId: # Public Land Mobile Network ID, <PLMN ID> = <MCC><MNC>
-        mcc: 208 # Mobile Country Code (3 digits string, digit: 0~9)
-        mnc: 93 # Mobile Network Code (2 or 3 digits string, digit: 0~9)
+        mcc: 001 # Mobile Country Code (3 digits string, digit: 0~9)
+        mnc: 01 # Mobile Network Code (2 or 3 digits string, digit: 0~9)
       snssaiList: # the S-NSSAI (Single Network Slice Selection Assistance Information) list supported by this AMF
         - sst: 1 # Slice/Service Type (uinteger, range: 0~255)
           sd: 010203 # Slice Differentiator (3 bytes hex string, range: 000000~FFFFFF)
```
- `free5gc/config/ausfcfg.yaml`
```diff
--- ausfcfg.yaml.orig   2023-12-07 03:35:34.000000000 +0900
+++ ausfcfg.yaml        2023-12-07 04:57:32.000000000 +0900
@@ -15,8 +15,8 @@
     - nausf-auth # Nausf_UEAuthentication service
   nrfUri: http://127.0.0.10:8000 # a valid URI of NRF
   plmnSupportList: # the PLMNs (Public Land Mobile Network) list supported by this AUSF
-    - mcc: 208 # Mobile Country Code (3 digits string, digit: 0~9)
-      mnc: 93  # Mobile Network Code (2 or 3 digits string, digit: 0~9)
+    - mcc: 001 # Mobile Country Code (3 digits string, digit: 0~9)
+      mnc: 01  # Mobile Network Code (2 or 3 digits string, digit: 0~9)
     - mcc: 123 # Mobile Country Code (3 digits string, digit: 0~9)
       mnc: 45  # Mobile Network Code (2 or 3 digits string, digit: 0~9)
   groupId: ausfGroup001 # ID for the group of the AUSF
```
- `free5gc/config/nrfcfg.yaml`
```diff
--- nrfcfg.yaml.orig    2023-12-07 03:35:34.000000000 +0900
+++ nrfcfg.yaml 2023-12-07 04:57:38.000000000 +0900
@@ -14,8 +14,8 @@
       pem: cert/nrf.pem # NRF TLS Certificate
       key: cert/nrf.key # NRF TLS Private key
   DefaultPlmnId:
-    mcc: 208 # Mobile Country Code (3 digits string, digit: 0~9)
-    mnc: 93 # Mobile Network Code (2 or 3 digits string, digit: 0~9)
+    mcc: 001 # Mobile Country Code (3 digits string, digit: 0~9)
+    mnc: 01 # Mobile Network Code (2 or 3 digits string, digit: 0~9)
   serviceNameList: # the SBI services provided by this NRF, refer to TS 29.510
     - nnrf-nfm # Nnrf_NFManagement service
     - nnrf-disc # Nnrf_NFDiscovery service
```
- `free5gc/config/nssfcfg.yaml`
```diff
--- nssfcfg.yaml.orig   2023-12-07 03:35:34.000000000 +0900
+++ nssfcfg.yaml        2023-12-07 04:59:44.000000000 +0900
@@ -17,12 +17,12 @@
     - nnssf-nssaiavailability # Nnssf_NSSAIAvailability service
   nrfUri: http://127.0.0.10:8000 # a valid URI of NRF
   supportedPlmnList: # the PLMNs (Public land mobile network) list supported by this NSSF
-    - mcc: 208 # Mobile Country Code (3 digits string, digit: 0~9)
-      mnc: 93 # Mobile Network Code (2 or 3 digits string, digit: 0~9)
+    - mcc: 001 # Mobile Country Code (3 digits string, digit: 0~9)
+      mnc: 01 # Mobile Network Code (2 or 3 digits string, digit: 0~9)
   supportedNssaiInPlmnList: # Supported S-NSSAI List for each PLMN
     - plmnId: # Public Land Mobile Network ID, <PLMN ID> = <MCC><MNC>
-        mcc: 208 # Mobile Country Code (3 digits string, digit: 0~9)
-        mnc: 93 # Mobile Network Code (2 or 3 digits string, digit: 0~9)
+        mcc: 001 # Mobile Country Code (3 digits string, digit: 0~9)
+        mnc: 01 # Mobile Network Code (2 or 3 digits string, digit: 0~9)
       supportedSnssaiList: # Supported S-NSSAIs of the PLMN
         - sst: 1 # Slice/Service Type (uinteger, range: 0~255)
           sd: 010203 # Slice Differentiator (3 bytes hex string, range: 000000~FFFFFF)
```
- `free5gc/config/smfcfg.yaml`
```diff
--- smfcfg.yaml.orig    2023-12-07 03:35:34.000000000 +0900
+++ smfcfg.yaml 2023-12-07 20:14:45.568066057 +0900
@@ -34,22 +34,22 @@
             ipv4: 8.8.8.8
             ipv6: 2001:4860:4860::8888
   plmnList: # the list of PLMN IDs that this SMF belongs to (optional, remove this key when unnecessary)
-    - mcc: 208 # Mobile Country Code (3 digits string, digit: 0~9)
-      mnc: 93 # Mobile Network Code (2 or 3 digits string, digit: 0~9)
+    - mcc: 001 # Mobile Country Code (3 digits string, digit: 0~9)
+      mnc: 01 # Mobile Network Code (2 or 3 digits string, digit: 0~9)
   locality: area1 # Name of the location where a set of AMF, SMF, PCF and UPFs are located
   pfcp: # the IP address of N4 interface on this SMF (PFCP)
     # addr config is deprecated in smf config v1.0.3, please use the following config
-    nodeID: 127.0.0.1 # the Node ID of this SMF
-    listenAddr: 127.0.0.1 # the IP/FQDN of N4 interface on this SMF (PFCP)
-    externalAddr: 127.0.0.1 # the IP/FQDN of N4 interface on this SMF (PFCP)
+    nodeID: 192.168.14.111 # the Node ID of this SMF
+    listenAddr: 192.168.14.111 # the IP/FQDN of N4 interface on this SMF (PFCP)
+    externalAddr: 192.168.14.111 # the IP/FQDN of N4 interface on this SMF (PFCP)
   userplaneInformation: # list of userplane information
     upNodes: # information of userplane node (AN or UPF)
       gNB1: # the name of the node
         type: AN # the type of the node (AN or UPF)
       UPF: # the name of the node
         type: UPF # the type of the node (AN or UPF)
-        nodeID: 127.0.0.8 # the Node ID of this UPF
-        addr: 127.0.0.8 # the IP/FQDN of N4 interface on this UPF (PFCP)
+        nodeID: 192.168.14.151 # the Node ID of this UPF
+        addr: 192.168.14.151 # the IP/FQDN of N4 interface on this UPF (PFCP)
         sNssaiUpfInfos: # S-NSSAI information list for this UPF
           - sNssai: # S-NSSAI (Single Network Slice Selection Assistance Information)
               sst: 1 # Slice/Service Type (uinteger, range: 0~255)
@@ -57,9 +57,9 @@
             dnnUpfInfoList: # DNN information list for this S-NSSAI
               - dnn: internet
                 pools:
-                  - cidr: 10.60.0.0/16
+                  - cidr: 10.45.0.0/16
                 staticPools:
-                  - cidr: 10.60.100.0/24
+                  - cidr: 10.45.100.0/24
           - sNssai: # S-NSSAI (Single Network Slice Selection Assistance Information)
               sst: 1 # Slice/Service Type (uinteger, range: 0~255)
               sd: 112233 # Slice Differentiator (3 bytes hex string, range: 000000~FFFFFF)
@@ -72,7 +72,7 @@
         interfaces: # Interface list for this UPF
           - interfaceType: N3 # the type of the interface (N3 or N9)
             endpoints: # the IP address of this N3/N9 interface on this UPF
-              - 127.0.0.8
+              - 192.168.13.151
             networkInstances:  # Data Network Name (DNN)
               - internet
     links: # the topology graph of userplane, A and B represent the two nodes of each link
@@ -89,8 +89,10 @@
     expireTime: 16s   # default is 6 seconds
     maxRetryTimes: 3 # the max number of retransmission
   nrfUri: http://127.0.0.10:8000 # a valid URI of NRF
-  #urrPeriod: 10 # default usage report period in seconds
-  #urrThreshold: 1000 # default usage report threshold in bytes
+  urrPeriod: 10 # default usage report period in seconds
+  urrThreshold: 1000 # default usage report threshold in bytes
+  ulcl: false
+  nwInstFqdnEncoding: true
 
 logger: # log output setting
   enable: true # true or false
```

### 各UPFの設定ファイルの変更点

#### a-1. Open5GS 5GC UPF (TUN)の設定ファイルの変更点

- `open5gs/install/etc/open5gs/upf.yaml`
```diff
--- upf.yaml.orig       2023-12-05 03:49:16.000000000 +0900
+++ upf.yaml        2023-12-07 04:35:22.000000000 +0900
@@ -10,16 +10,17 @@
 upf:
   pfcp:
     server:
-      - address: 127.0.0.7
+      - address: 192.168.14.151
     client:
 #      smf:     #  UPF PFCP Client try to associate SMF PFCP Server
 #        - address: 127.0.0.4
   gtpu:
     server:
-      - address: 127.0.0.7
+      - address: 192.168.13.151
   session:
     - subnet: 10.45.0.1/16
-    - subnet: 2001:db8:cafe::1/48
+      dnn: internet
+      dev: ogstun
   metrics:
     server:
       - address: 127.0.0.7
```

#### a-2. Open5GS 5GC UPF (TAP)の設定ファイルの変更点

- `open5gs/install/etc/open5gs/upf.yaml`
```diff
--- upf.yaml.orig       2023-12-05 03:49:16.000000000 +0900
+++ upf.yaml        2023-12-07 06:45:28.000000000 +0900
@@ -10,16 +10,17 @@
 upf:
   pfcp:
     server:
-      - address: 127.0.0.7
+      - address: 192.168.14.151
     client:
 #      smf:     #  UPF PFCP Client try to associate SMF PFCP Server
 #        - address: 127.0.0.4
   gtpu:
     server:
-      - address: 127.0.0.7
+      - address: 192.168.13.151
   session:
     - subnet: 10.45.0.1/16
-    - subnet: 2001:db8:cafe::1/48
+      dnn: internet
+      dev: ogstap
   metrics:
     server:
       - address: 127.0.0.7
```

#### b. UPG-VPPの設定ファイルの変更点

元の設定ファイルは、[こちら](https://github.com/s5uishida/install_vpp_upf_dpdk#changes_up)を参照して下さい。

- `openair-upf/startup.conf`  
元ファイルからの変更はありません。

- `openair-upf/init.conf`  
元ファイルからの変更はありません。

#### c. eUPFの設定ファイルの変更点

元の設定ファイルは、[こちら](https://github.com/s5uishida/install_eupf#create-configuration-file)を参照して下さい。

- `eupf/config.yml`  
元ファイルからの変更はありません。

#### d. free5GC 5GC UPFの設定ファイルの変更点

- `free5gc/config/upfcfg.yaml`
```diff
--- upfcfg.yaml.orig    2023-12-07 03:35:34.000000000 +0900
+++ upfcfg.yaml 2023-12-07 05:05:20.000000000 +0900
@@ -3,8 +3,8 @@
 
 # The listen IP and nodeID of the N4 interface on this UPF (Can't set to 0.0.0.0)
 pfcp:
-  addr: 127.0.0.8   # IP addr for listening
-  nodeID: 127.0.0.8 # External IP or FQDN can be reached
+  addr: 192.168.14.151   # IP addr for listening
+  nodeID: 192.168.14.151 # External IP or FQDN can be reached
   retransTimeout: 1s # retransmission timeout
   maxRetrans: 3 # the max number of retransmission
 
@@ -13,7 +13,7 @@
   # The IP list of the N3/N9 interfaces on this UPF
   # If there are multiple connection, set addr to 0.0.0.0 or list all the addresses
   ifList:
-    - addr: 127.0.0.8
+    - addr: 192.168.13.151
       type: N3
       # name: upf.5gc.nctu.me
       # ifname: gtpif
@@ -22,7 +22,7 @@
 # The DNN list supported by UPF
 dnnList:
   - dnn: internet # Data Network Name
-    cidr: 10.60.0.0/24 # Classless Inter-Domain Routing for assigned IPv4 pool of UE
+    cidr: 10.45.0.0/16 # Classless Inter-Domain Routing for assigned IPv4 pool of UE
     # natifname: eth0
 
 logger: # log output setting
```

### PacketRusherの設定ファイルの変更点

- `PacketRusher/config/config.yml`
```diff
--- config.yml.orig     2023-12-07 04:20:41.373516955 +0900
+++ config.yml  2023-12-07 04:31:09.823888487 +0900
@@ -1,33 +1,33 @@
 gnodeb:
   controlif:
-    ip: "192.168.11.13"
+    ip: "192.168.0.131"
     port: 9487
   dataif:
-    ip: "192.168.11.13"
+    ip: "192.168.13.131"
     port: 2152
   plmnlist:
-    mcc: "999"
-    mnc: "70"
+    mcc: "001"
+    mnc: "01"
     tac: "000001"
     gnbid: "000008"
   slicesupportlist:
     sst: "01"
-    sd: "000001" # optional, can be removed if not used
+    sd: "010203" # optional, can be removed if not used
 
 ue:
-  msin: "0000000120"
-  key: "00112233445566778899AABBCCDDEEFF"
-  opc: "00112233445566778899AABBCCDDEEFF"
+  msin: "0000001000"
+  key: "465B5CE8B199B49FAA5F0A2EE238A6BC"
+  opc: "E8ED289DEBA952E4283B54E88E6183CA"
   amf: "8000"
   sqn: "00000000"
   dnn: "internet"
   routingindicator: "0000"
   hplmn:
-    mcc: "999"
-    mnc: "70"
+    mcc: "001"
+    mnc: "01"
   snssai:
     sst: 01
-    sd: "000001" # optional, can be removed if not used
+    sd: "010203" # optional, can be removed if not used
   integrity:
     nia0: false
     nia1: false
@@ -39,7 +39,7 @@
     nea2: true
     nea3: false
 amfif:
-  ip: "192.168.11.30"
+  ip: "192.168.0.111"
   port: 38412
 logs:
     level: 4
```

## 各UPFとData Network Gatewayのネットワーク設定

### a-1. Open5GS 5GC UPF (TUN)のネットワーク設定

まず、`/etc/sysctl.conf`ファイルの次の行のコメントを解除し、OSに反映させます。
```
net.ipv4.ip_forward=1
```
```
# sysctl -p
```
次に、VM-UPのデフォルトインターフェース`enp0s3`を落とし、デフォルトGWをN6インターフェース`enp0s16`のVM-DN IPアドレスに設定します。
```
# ip link set dev enp0s3 down
# ip route add default via 192.168.16.152 dev enp0s16
```
そして、TUNnelインターフェースを設定します。
```
# ip tuntap add name ogstun mode tun
# ip addr add 10.45.0.1/16 dev ogstun
# ip link set ogstun up
```

### a-2. Open5GS 5GC UPF (TAP)のネットワーク設定

まず、`/etc/sysctl.conf`ファイルの次の行のコメントを解除し、OSに反映させます。
```
net.ipv4.ip_forward=1
```
```
# sysctl -p
```
次に、VM-UPのデフォルトインターフェース`enp0s3`を落とし、デフォルトGWをN6インターフェース`enp0s16`のVM-DN IPアドレスに設定します。
```
# ip link set dev enp0s3 down
# ip route add default via 192.168.16.152 dev enp0s16
```
そして、TAPインターフェースを設定します。
```
# ip tuntap add name ogstap mode tap
# ip addr add 10.45.0.1/16 dev ogstap
# ip link set ogstap up
```

### b. UPG-VPPのネットワーク設定

[こちら](https://github.com/s5uishida/install_vpp_upf_dpdk#setup_up)を参考にして下さい。

### c. eUPFのネットワーク設定

まず、`/etc/sysctl.conf`ファイルの次の行のコメントを解除し、OSに反映させます。
```
net.ipv4.ip_forward=1
```
```
# sysctl -p
```
次に、VM-UPのデフォルトインターフェース`enp0s3`を落とし、デフォルトGWをN6インターフェース`enp0s16`のVM-DN IPアドレスに設定します。
```
# ip link set dev enp0s3 down
# ip route add default via 192.168.16.152 dev enp0s16
```

### d. free5GC 5GC UPFのネットワーク設定

まず、`/etc/sysctl.conf`ファイルの次の行のコメントを解除し、OSに反映させます。
```
net.ipv4.ip_forward=1
```
```
# sysctl -p
```
次に、VM-UPのデフォルトインターフェース`enp0s3`を落とし、デフォルトGWをN6インターフェース`enp0s16`のVM-DN IPアドレスに設定します。
```
# ip link set dev enp0s3 down
# ip route add default via 192.168.16.152 dev enp0s16
```

### Data Network Gatewayのネットワーク設定

まず、`/etc/sysctl.conf`ファイルの次の行のコメントを解除し、OSに反映させます。
```
net.ipv4.ip_forward=1
```
```
# sysctl -p
```
次に、NAPTとeUPFのN6 IPアドレスへのルーティングを設定します。
```
# iptables -t nat -A POSTROUTING -s 10.45.0.0/16 -j MASQUERADE
# ip route add 10.45.0.0/16 via 192.168.16.151 dev enp0s9
```

## Open5GS、free5GC、各UPF、PacketRusherビルド

Open5GS、free5GC、UPFs、PacketRusherの各ビルドについては以下を参照して下さい。
- Open5GS v2.7.0 (2023.12.04) - https://open5gs.org/open5gs/docs/guide/02-building-open5gs-from-sources/
- free5GC v3.3.0 (2023.11.03) - https://free5gc.org/guide/
- UPG-VPP v1.11.0 (2023.12.11) - https://github.com/s5uishida/install_vpp_upf_dpdk#annex_1
- eUPF v0.6.0 (2023.12.05) - https://github.com/s5uishida/install_eupf
- free5GC UPF v3.3.0 (2023.11.12) - https://free5gc.org/guide/
- PacketRusher (2023.12.06) - https://github.com/HewlettPackard/PacketRusher/wiki

Open5GSとfree5GC C-PlaneマシンにMongoDBをインストールして下さい。なお、MongoDBのデータベースを簡単に確認するには、[MongoDB Compass](https://www.mongodb.com/products/compass)が便利です。

## Open5GS、free5GC、各UPF実行

性能測定の対象のUPFを選択し、最初にUPFを起動し、次に5GC(Open5GS or free5GC)を起動します。

### UPF実行

#### a-1. Open5GS 5GC UPF (TUN)実行

TUNインターフェース向けに設定ファイルを変更して下さい。
```
# cd open5gs
# ./install/bin/open5gs-upfd
```

#### a-2. Open5GS 5GC UPF (TAP)実行

TAPインターフェース向けに設定ファイルを変更して下さい。
```
# cd open5gs
# ./install/bin/open5gs-upfd
```

#### b. UPG-VPP実行

[こちら](https://github.com/s5uishida/install_vpp_upf_dpdk#run)を参考にして下さい。

#### c. eUPF実行

[こちら](https://github.com/s5uishida/install_eupf#run)を参考にして下さい。

#### d. free5GC 5GC UPF実行

```
# cd free5gc
# ./bin/upf
```

### 5GC C-Plane実行

#### Open5GS 5GC C-Plane実行

```
./install/bin/open5gs-nrfd &
sleep 2
./install/bin/open5gs-scpd &
sleep 2
./install/bin/open5gs-amfd &
sleep 2
./install/bin/open5gs-smfd &
./install/bin/open5gs-ausfd &
./install/bin/open5gs-udmd &
./install/bin/open5gs-udrd &
./install/bin/open5gs-pcfd &
./install/bin/open5gs-nssfd &
./install/bin/open5gs-bsfd &
```

#### free5GC 5GC C-Plane実行

以下のシェルスクリプトを作成して、実行します。
```bash
#!/usr/bin/env bash

PID_LIST=()

NF_LIST="nrf amf smf udr pcf udm nssf ausf chf"

export GIN_MODE=release

for NF in ${NF_LIST}; do
    ./bin/${NF} &
    PID_LIST+=($!)
    sleep 1
done

function terminate()
{
    sudo kill -SIGTERM ${PID_LIST[${#PID_LIST[@]}-2]} ${PID_LIST[${#PID_LIST[@]}-1]}
    sleep 2
}

trap terminate SIGINT
wait ${PID_LIST}
```

## PacketRusherを用いて性能測定

ここでは、1つのUEによる1つの接続のみを測定します。
まず、PacketRusherを実行して、性能測定に使用する接続を確立します。 次に、Data Network Gateway VM上にiperf3サーバを起動します。

### VM2上でPacketRusherを実行

一つのUE相当の接続を確立します。

```
# cd PacketRusher
# ./packetrusher ue
INFO[0000] PacketRusher version 1.0.1                   
INFO[0000] ---------------------------------------      
INFO[0000] [TESTER] Starting test function: Testing an ue attached with configuration 
INFO[0000] [TESTER][UE] Number of UEs: 1                
INFO[0000] [TESTER][UE] disableTunnel is false          
INFO[0000] [TESTER][GNB] Control interface IP/Port: 192.168.0.131/9487 
INFO[0000] [TESTER][GNB] Data interface IP/Port: 192.168.13.131/2152 
INFO[0000] [TESTER][AMF] AMF IP/Port: 192.168.0.111/38412 
INFO[0000] ---------------------------------------      
INFO[0000] [GNB] SCTP/NGAP service is running           
INFO[0000] [GNB] Initiating NG Setup Request            
INFO[0000] [GNB][SCTP] Receive message in 0 stream      
INFO[0000] [GNB][NGAP] Receive NG Setup Response        
INFO[0000] [GNB][AMF] AMF Name: open5gs-amf0            
INFO[0000] [GNB][AMF] State of AMF: Active              
INFO[0000] [GNB][AMF] Capacity of AMF: 255              
INFO[0000] [GNB][AMF] PLMNs Identities Supported by AMF -- mcc: 001 mnc:01 
INFO[0000] [GNB][AMF] List of AMF slices Supported by AMF -- sst:01 sd:010203 
INFO[0001] [TESTER] TESTING REGISTRATION USING IMSI 0000001000 UE 
INFO[0001] [UE] Initiating Registration                 
INFO[0001] [UE] Switched from state 0 to state 1        
INFO[0001] [GNB][SCTP] Receive message in 1 stream      
INFO[0001] [GNB][NGAP] Receive Downlink NAS Transport   
INFO[0001] [UE][NAS] Message without security header    
INFO[0001] [UE][NAS] Receive Authentication Request     
INFO[0001] [UE][NAS][MAC] Authenticity of the authentication request message: OK 
INFO[0001] [UE][NAS][SQN] SQN of the authentication request message: VALID 
INFO[0001] [UE][NAS] Send authentication response       
INFO[0001] [UE] Switched from state 1 to state 2        
INFO[0001] [GNB][SCTP] Receive message in 1 stream      
INFO[0001] [GNB][NGAP] Receive Downlink NAS Transport   
INFO[0001] [UE][NAS] Message with security header       
INFO[0001] [UE][NAS] Message with integrity and with NEW 5G NAS SECURITY CONTEXT 
INFO[0001] [UE][NAS] successful NAS MAC verification    
INFO[0001] [UE][NAS] Receive Security Mode Command      
INFO[0001] [UE][NAS] Type of ciphering algorithm is 5G-EA0 
INFO[0001] [UE][NAS] Type of integrity protection algorithm is 128-5G-IA2 
INFO[0001] [GNB][SCTP] Receive message in 1 stream      
INFO[0001] [GNB][NGAP] Receive Initial Context Setup Request 
INFO[0001] [GNB][UE] UE Context was created with successful 
INFO[0001] [GNB][UE] UE RAN ID 1                        
INFO[0001] [GNB][UE] UE AMF ID 1                        
INFO[0001] [GNB][UE] UE Mobility Restrict --Plmn-- Mcc: not informed Mnc: not informed 
INFO[0001] [GNB][UE] UE Masked Imeisv: 1110000000ffff00 
INFO[0001] [GNB][UE] Allowed Nssai-- Sst: [01] Sd: [010203] 
INFO[0001] [GNB][NAS][UE] Send Registration Accept.     
INFO[0001] [GNB][NGAP][AMF] Send Initial Context Setup Response. 
INFO[0001] [GNB] Initiating Initial Context Setup Response 
INFO[0001] [UE][NAS] Message with security header       
INFO[0001] [UE][NAS] Message with integrity and ciphered 
INFO[0001] [UE][NAS] successful NAS MAC verification    
INFO[0001] [UE][NAS] successful NAS CIPHERING           
INFO[0001] [UE][NAS] Receive Registration Accept        
INFO[0001] [UE][NAS] UE 5G GUTI: [192 0 1 200]          
INFO[0001] [UE] Switched from state 2 to state 3        
INFO[0001] [UE] Initiating New PDU Session              
INFO[0001] [UE] Initiating New PDU Session              
INFO[0001] [GNB][SCTP] Receive message in 1 stream      
INFO[0001] [GNB][NGAP] Receive Downlink NAS Transport   
INFO[0001] [UE][NAS] Message with security header       
INFO[0001] [UE][NAS] Message with integrity and ciphered 
INFO[0001] [UE][NAS] successful NAS MAC verification    
INFO[0001] [UE][NAS] successful NAS CIPHERING           
INFO[0001] [UE][NAS] Receive Configuration Update Command 
INFO[0001] [UE] Initiating Configuration Update Complete 
INFO[0001] [GNB][SCTP] Receive message in 1 stream      
INFO[0001] [GNB][NGAP] Receive PDU Session Resource Setup Request 
INFO[0001] [GNB][NGAP][UE] PDU Session was created with successful. 
INFO[0001] [GNB][NGAP][UE] PDU Session Id: 1            
INFO[0001] [GNB][NGAP][UE] NSSAI Selected --- sst: NSSAI was not selected sd: NSSAI was not selected 
INFO[0001] [GNB][NGAP][UE] PDU Session Type: ipv4       
INFO[0001] [GNB][NGAP][UE] QOS Flow Identifier: 1       
INFO[0001] [GNB][NGAP][UE] Uplink Teid: 655784950       
INFO[0001] [GNB][NGAP][UE] Downlink Teid: 1             
INFO[0001] [GNB][NGAP][UE] Non-Dynamic-5QI: 9           
INFO[0001] [GNB][NGAP][UE] Priority Level ARP: 8        
INFO[0001] [GNB][NGAP][UE] UPF Address: 192.168.13.151 :2152 
INFO[0001] [GNB] Initiating PDU Session Resource Setup Response 
INFO[0001] [UE][NAS] Message with security header       
INFO[0001] [UE][NAS] Message with integrity and ciphered 
INFO[0001] [UE][NAS] successful NAS MAC verification    
INFO[0001] [UE][NAS] successful NAS CIPHERING           
INFO[0001] [UE][NAS] Receive DL NAS Transport           
INFO[0001] [UE][NAS] Receiving PDU Session Establishment Accept 
INFO[0001] [UE][NAS] PDU session QoS RULES: [1 0 6 49 49 1 1 255 1] 
INFO[0001] [UE][NAS] PDU session DNN: internet          
INFO[0001] [UE][NAS] PDU session NSSAI -- sst: 1 sd: 123 
INFO[0001] [UE][NAS] PDU address received: 10.45.0.2    
INFO[0002] [UE][GTP] Interface val0000001000 has successfully been configured for UE 10.45.0.2 
INFO[0002] [UE][GTP] You can do traffic for this UE using VRF vrf0000001000, eg: 
INFO[0002] [UE][GTP] sudo ip vrf exec vrf0000001000 iperf3 -c IPERF_SERVER -p PORT -t 9000 
```
UE/VRF のコンテキストでコマンドを実行する度に`ip vrf exec vrf0000001000`コマンドを記述することを避けるには、次のようにコマンドを実行します。
```
# ip vrf exec vrf0000001000 bash
```
これにより、シェル内のすべてのコマンドがtunnelを使用するようになります。

### Data Network Gateway (VM-DN)上でiPerf3サーバを実行

```
# iperf3 -s
```

### VM2上でpingとiPerf3クライアントを実行

Data Network GatewayのN6インターフェイスのアドレス(`192.168.16.152`)に対してpingとiperf3クライアントを試します。

例）下記測定で使用したUPFはUPG-VPP v1.11.0です。

```
# ping 192.168.16.152 -c 10
PING 192.168.16.152 (192.168.16.152) 56(84) bytes of data.
64 bytes from 192.168.16.152: icmp_seq=1 ttl=63 time=0.345 ms
64 bytes from 192.168.16.152: icmp_seq=2 ttl=63 time=0.325 ms
64 bytes from 192.168.16.152: icmp_seq=3 ttl=63 time=0.417 ms
64 bytes from 192.168.16.152: icmp_seq=4 ttl=63 time=0.337 ms
64 bytes from 192.168.16.152: icmp_seq=5 ttl=63 time=0.692 ms
64 bytes from 192.168.16.152: icmp_seq=6 ttl=63 time=0.300 ms
64 bytes from 192.168.16.152: icmp_seq=7 ttl=63 time=0.440 ms
64 bytes from 192.168.16.152: icmp_seq=8 ttl=63 time=0.319 ms
64 bytes from 192.168.16.152: icmp_seq=9 ttl=63 time=0.521 ms
64 bytes from 192.168.16.152: icmp_seq=10 ttl=63 time=0.290 ms

--- 192.168.16.152 ping statistics ---
10 packets transmitted, 10 received, 0% packet loss, time 9205ms
rtt min/avg/max/mdev = 0.290/0.398/0.692/0.119 ms
```
```
# iperf3 -c 192.168.16.152 
Connecting to host 192.168.16.152, port 5201
[  5] local 10.45.0.2 port 51488 connected to 192.168.16.152 port 5201
[ ID] Interval           Transfer     Bitrate         Retr  Cwnd
[  5]   0.00-1.00   sec   132 MBytes  1.11 Gbits/sec  164    255 KBytes       
[  5]   1.00-2.00   sec   135 MBytes  1.13 Gbits/sec   82    270 KBytes       
[  5]   2.00-3.00   sec   140 MBytes  1.17 Gbits/sec   85    370 KBytes       
[  5]   3.00-4.00   sec   140 MBytes  1.17 Gbits/sec  129    277 KBytes       
[  5]   4.00-5.00   sec   137 MBytes  1.15 Gbits/sec   23    236 KBytes       
[  5]   5.00-6.00   sec   137 MBytes  1.15 Gbits/sec   28    368 KBytes       
[  5]   6.00-7.00   sec   137 MBytes  1.15 Gbits/sec  121    269 KBytes       
[  5]   7.00-8.00   sec   129 MBytes  1.08 Gbits/sec   28    295 KBytes       
[  5]   8.00-9.00   sec   131 MBytes  1.10 Gbits/sec   95    223 KBytes       
[  5]   9.00-10.00  sec   136 MBytes  1.14 Gbits/sec   30    361 KBytes       
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-10.00  sec  1.32 GBytes  1.14 Gbits/sec  785             sender
[  5]   0.00-10.04  sec  1.32 GBytes  1.13 Gbits/sec                  receiver

iperf Done.
```

## 測定結果

以下の測定値は、VM2上のPacketRusherによって割り当てられたIPアドレス`10.45.0.0/16`とVM-DN上のData Network GatewayのN6インターフェイスのIP アドレス`192.168.16.152`の間で測定した値です。

**5GCにOpen5GS C-Planeを使用した場合**
| # | UPF | Date | 1) TCP<br>throughput | 2) UDP<br>throughput | 2) UDP<br>packet<br>loss | 3) RTT<br>(msec) | 
| --- | --- | --- | --- | --- | --- | --- |
| a-1 | Open5GS UPF<br>v2.7.0 (TUN) | 2023.12.04 | S:205 Mbps<br>R:204 Mbps | S:458 Mbps<br>R:319 Mbps | 30% | 1.081 |
| a-2 | Open5GS UPF<br>v2.7.0 (TAP) | 2023.12.04 | S:275 Mbps<br>R:273 Mbps | S:465 Mbps<br>R:314 Mbps | 32% | 1.198 |
| b | UPG-VPP v1.11.0 | 2023.12.11 | S:1.14 Gbps<br>R:1.13 Gbps | S:461 Mbps<br>R:455 Mbps | 0.96% | 0.398 |
| c | **4) eUPF v0.6.0** | 2023.12.05 | S:359 Mbps<br>R:356 Mbps | S:426 Mbps<br>R:409 Mbps | 3.6% | 0.882 |

<details><summary>a-1. Open5GS UPF v2.7.0 (TUN)のPingとiPerf3ログ</summary>

```
# iperf3 -c 192.168.16.152
Connecting to host 192.168.16.152, port 5201
[  5] local 10.45.0.2 port 44534 connected to 192.168.16.152 port 5201
[ ID] Interval           Transfer     Bitrate         Retr  Cwnd
[  5]   0.00-1.00   sec  20.8 MBytes   175 Mbits/sec    8   80.0 KBytes       
[  5]   1.00-2.00   sec  25.6 MBytes   215 Mbits/sec   14   92.4 KBytes       
[  5]   2.00-3.00   sec  24.1 MBytes   202 Mbits/sec   21   99.3 KBytes       
[  5]   3.00-4.00   sec  25.6 MBytes   215 Mbits/sec   22    105 KBytes       
[  5]   4.00-5.00   sec  24.2 MBytes   203 Mbits/sec    8    109 KBytes       
[  5]   5.00-6.00   sec  26.1 MBytes   219 Mbits/sec   22   92.4 KBytes       
[  5]   6.00-7.00   sec  26.4 MBytes   221 Mbits/sec   10    106 KBytes       
[  5]   7.00-8.00   sec  23.3 MBytes   195 Mbits/sec   10    105 KBytes       
[  5]   8.00-9.00   sec  22.2 MBytes   187 Mbits/sec   12    105 KBytes       
[  5]   9.00-10.00  sec  26.5 MBytes   222 Mbits/sec   15   82.7 KBytes       
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-10.00  sec   245 MBytes   205 Mbits/sec  142             sender
[  5]   0.00-10.04  sec   244 MBytes   204 Mbits/sec                  receiver

iperf Done.
```
```
# iperf3 -c 192.168.16.152 -u -b 500M
Connecting to host 192.168.16.152, port 5201
[  5] local 10.45.0.2 port 40673 connected to 192.168.16.152 port 5201
[ ID] Interval           Transfer     Bitrate         Total Datagrams
[  5]   0.00-1.00   sec  57.8 MBytes   485 Mbits/sec  42949  
[  5]   1.00-2.00   sec  46.3 MBytes   389 Mbits/sec  34418  
[  5]   2.00-3.00   sec  56.0 MBytes   470 Mbits/sec  41565  
[  5]   3.00-4.00   sec  56.4 MBytes   473 Mbits/sec  41911  
[  5]   4.00-5.00   sec  53.5 MBytes   449 Mbits/sec  39720  
[  5]   5.00-6.00   sec  61.5 MBytes   516 Mbits/sec  45651  
[  5]   6.00-7.00   sec  49.3 MBytes   413 Mbits/sec  36579  
[  5]   7.00-8.00   sec  56.6 MBytes   475 Mbits/sec  42031  
[  5]   8.00-9.00   sec  53.3 MBytes   447 Mbits/sec  39616  
[  5]   9.00-10.00  sec  55.1 MBytes   463 Mbits/sec  40948  
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Jitter    Lost/Total Datagrams
[  5]   0.00-10.00  sec   546 MBytes   458 Mbits/sec  0.000 ms  0/405388 (0%)  sender
[  5]   0.00-10.04  sec   382 MBytes   319 Mbits/sec  0.040 ms  121698/405375 (30%)  receiver

iperf Done.
```
```
# ping 192.168.16.152 -c 10
PING 192.168.16.152 (192.168.16.152) 56(84) bytes of data.
64 bytes from 192.168.16.152: icmp_seq=1 ttl=63 time=1.09 ms
64 bytes from 192.168.16.152: icmp_seq=2 ttl=63 time=0.993 ms
64 bytes from 192.168.16.152: icmp_seq=3 ttl=63 time=0.879 ms
64 bytes from 192.168.16.152: icmp_seq=4 ttl=63 time=1.24 ms
64 bytes from 192.168.16.152: icmp_seq=5 ttl=63 time=1.08 ms
64 bytes from 192.168.16.152: icmp_seq=6 ttl=63 time=1.17 ms
64 bytes from 192.168.16.152: icmp_seq=7 ttl=63 time=1.25 ms
64 bytes from 192.168.16.152: icmp_seq=8 ttl=63 time=1.10 ms
64 bytes from 192.168.16.152: icmp_seq=9 ttl=63 time=1.09 ms
64 bytes from 192.168.16.152: icmp_seq=10 ttl=63 time=0.922 ms

--- 192.168.16.152 ping statistics ---
10 packets transmitted, 10 received, 0% packet loss, time 9011ms
rtt min/avg/max/mdev = 0.879/1.081/1.252/0.116 ms
```

</details>

<details><summary>a-2. Open5GS UPF v2.7.0 (TAP)のPingとiPerf3ログ</summary>

```
# iperf3 -c 192.168.16.152
Connecting to host 192.168.16.152, port 5201
[  5] local 10.45.0.2 port 59000 connected to 192.168.16.152 port 5201
[ ID] Interval           Transfer     Bitrate         Retr  Cwnd
[  5]   0.00-1.00   sec  36.4 MBytes   305 Mbits/sec   47    102 KBytes       
[  5]   1.00-2.00   sec  38.0 MBytes   319 Mbits/sec   40   84.1 KBytes       
[  5]   2.00-3.00   sec  35.6 MBytes   299 Mbits/sec   25   77.2 KBytes       
[  5]   3.00-4.00   sec  25.1 MBytes   210 Mbits/sec   16   89.6 KBytes       
[  5]   4.00-5.00   sec  26.0 MBytes   218 Mbits/sec   26   96.5 KBytes       
[  5]   5.00-6.00   sec  35.3 MBytes   296 Mbits/sec   18    116 KBytes       
[  5]   6.00-7.00   sec  39.3 MBytes   329 Mbits/sec   37   95.1 KBytes       
[  5]   7.00-8.00   sec  38.0 MBytes   319 Mbits/sec   28    102 KBytes       
[  5]   8.00-9.00   sec  25.9 MBytes   217 Mbits/sec   16   75.8 KBytes       
[  5]   9.00-10.00  sec  27.9 MBytes   233 Mbits/sec   15   97.9 KBytes       
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-10.00  sec   327 MBytes   275 Mbits/sec  268             sender
[  5]   0.00-10.04  sec   327 MBytes   273 Mbits/sec                  receiver

iperf Done.
```
```
# iperf3 -c 192.168.16.152 -u -b 500M
Connecting to host 192.168.16.152, port 5201
[  5] local 10.45.0.2 port 36906 connected to 192.168.16.152 port 5201
[ ID] Interval           Transfer     Bitrate         Total Datagrams
[  5]   0.00-1.00   sec  59.6 MBytes   500 Mbits/sec  44260  
[  5]   1.00-2.00   sec  59.6 MBytes   500 Mbits/sec  44232  
[  5]   2.00-3.00   sec  59.6 MBytes   500 Mbits/sec  44294  
[  5]   3.00-4.00   sec  55.3 MBytes   464 Mbits/sec  41030  
[  5]   4.00-5.00   sec  53.2 MBytes   446 Mbits/sec  39492  
[  5]   5.00-6.00   sec  54.0 MBytes   453 Mbits/sec  40119  
[  5]   6.00-7.00   sec  53.5 MBytes   448 Mbits/sec  39703  
[  5]   7.00-8.00   sec  47.0 MBytes   395 Mbits/sec  34927  
[  5]   8.00-9.00   sec  54.8 MBytes   460 Mbits/sec  40721  
[  5]   9.00-10.00  sec  58.1 MBytes   487 Mbits/sec  43113  
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Jitter    Lost/Total Datagrams
[  5]   0.00-10.00  sec   555 MBytes   465 Mbits/sec  0.000 ms  0/411891 (0%)  sender
[  5]   0.00-10.04  sec   375 MBytes   314 Mbits/sec  0.016 ms  133181/411891 (32%)  receiver

iperf Done.
```
```
# ping 192.168.16.152 -c 10
PING 192.168.16.152 (192.168.16.152) 56(84) bytes of data.
64 bytes from 192.168.16.152: icmp_seq=1 ttl=63 time=1.87 ms
64 bytes from 192.168.16.152: icmp_seq=2 ttl=63 time=0.860 ms
64 bytes from 192.168.16.152: icmp_seq=3 ttl=63 time=1.17 ms
64 bytes from 192.168.16.152: icmp_seq=4 ttl=63 time=1.02 ms
64 bytes from 192.168.16.152: icmp_seq=5 ttl=63 time=1.01 ms
64 bytes from 192.168.16.152: icmp_seq=6 ttl=63 time=1.15 ms
64 bytes from 192.168.16.152: icmp_seq=7 ttl=63 time=1.09 ms
64 bytes from 192.168.16.152: icmp_seq=8 ttl=63 time=1.16 ms
64 bytes from 192.168.16.152: icmp_seq=9 ttl=63 time=0.936 ms
64 bytes from 192.168.16.152: icmp_seq=10 ttl=63 time=1.72 ms

--- 192.168.16.152 ping statistics ---
10 packets transmitted, 10 received, 0% packet loss, time 9036ms
rtt min/avg/max/mdev = 0.860/1.198/1.867/0.313 ms
```

</details>

<details><summary>b. UPG-VPP v1.11.0のPingとiPerf3ログ</summary>

```
# iperf3 -c 192.168.16.152
Connecting to host 192.168.16.152, port 5201
[  5] local 10.45.0.2 port 51488 connected to 192.168.16.152 port 5201
[ ID] Interval           Transfer     Bitrate         Retr  Cwnd
[  5]   0.00-1.00   sec   132 MBytes  1.11 Gbits/sec  164    255 KBytes       
[  5]   1.00-2.00   sec   135 MBytes  1.13 Gbits/sec   82    270 KBytes       
[  5]   2.00-3.00   sec   140 MBytes  1.17 Gbits/sec   85    370 KBytes       
[  5]   3.00-4.00   sec   140 MBytes  1.17 Gbits/sec  129    277 KBytes       
[  5]   4.00-5.00   sec   137 MBytes  1.15 Gbits/sec   23    236 KBytes       
[  5]   5.00-6.00   sec   137 MBytes  1.15 Gbits/sec   28    368 KBytes       
[  5]   6.00-7.00   sec   137 MBytes  1.15 Gbits/sec  121    269 KBytes       
[  5]   7.00-8.00   sec   129 MBytes  1.08 Gbits/sec   28    295 KBytes       
[  5]   8.00-9.00   sec   131 MBytes  1.10 Gbits/sec   95    223 KBytes       
[  5]   9.00-10.00  sec   136 MBytes  1.14 Gbits/sec   30    361 KBytes       
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-10.00  sec  1.32 GBytes  1.14 Gbits/sec  785             sender
[  5]   0.00-10.04  sec  1.32 GBytes  1.13 Gbits/sec                  receiver

iperf Done.
```
```
# iperf3 -c 192.168.16.152 -u -b 500M
Connecting to host 192.168.16.152, port 5201
[  5] local 10.45.0.2 port 38553 connected to 192.168.16.152 port 5201
[ ID] Interval           Transfer     Bitrate         Total Datagrams
[  5]   0.00-1.00   sec  55.9 MBytes   469 Mbits/sec  41483  
[  5]   1.00-2.00   sec  52.2 MBytes   438 Mbits/sec  38746  
[  5]   2.00-3.00   sec  62.1 MBytes   521 Mbits/sec  46107  
[  5]   3.00-4.00   sec  53.7 MBytes   450 Mbits/sec  39849  
[  5]   4.00-5.00   sec  54.0 MBytes   453 Mbits/sec  40135  
[  5]   5.00-6.00   sec  50.6 MBytes   425 Mbits/sec  37609  
[  5]   6.00-7.00   sec  53.0 MBytes   445 Mbits/sec  39367  
[  5]   7.00-8.00   sec  52.7 MBytes   442 Mbits/sec  39120  
[  5]   8.00-9.00   sec  58.2 MBytes   488 Mbits/sec  43203  
[  5]   9.00-10.00  sec  57.2 MBytes   480 Mbits/sec  42467  
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Jitter    Lost/Total Datagrams
[  5]   0.00-10.00  sec   550 MBytes   461 Mbits/sec  0.000 ms  0/408086 (0%)  sender
[  5]   0.00-10.04  sec   544 MBytes   455 Mbits/sec  0.018 ms  3914/408086 (0.96%)  receiver

iperf Done.
```
```
# ping 192.168.16.152 -c 10
PING 192.168.16.152 (192.168.16.152) 56(84) bytes of data.
64 bytes from 192.168.16.152: icmp_seq=1 ttl=63 time=0.345 ms
64 bytes from 192.168.16.152: icmp_seq=2 ttl=63 time=0.325 ms
64 bytes from 192.168.16.152: icmp_seq=3 ttl=63 time=0.417 ms
64 bytes from 192.168.16.152: icmp_seq=4 ttl=63 time=0.337 ms
64 bytes from 192.168.16.152: icmp_seq=5 ttl=63 time=0.692 ms
64 bytes from 192.168.16.152: icmp_seq=6 ttl=63 time=0.300 ms
64 bytes from 192.168.16.152: icmp_seq=7 ttl=63 time=0.440 ms
64 bytes from 192.168.16.152: icmp_seq=8 ttl=63 time=0.319 ms
64 bytes from 192.168.16.152: icmp_seq=9 ttl=63 time=0.521 ms
64 bytes from 192.168.16.152: icmp_seq=10 ttl=63 time=0.290 ms

--- 192.168.16.152 ping statistics ---
10 packets transmitted, 10 received, 0% packet loss, time 9205ms
rtt min/avg/max/mdev = 0.290/0.398/0.692/0.119 ms
```

</details>

<details><summary>c. eUPF v0.6.0のPingとiPerf3ログ</summary>

```
# iperf3 -c 192.168.16.152
Connecting to host 192.168.16.152, port 5201
[  5] local 10.45.0.2 port 50792 connected to 192.168.16.152 port 5201
[ ID] Interval           Transfer     Bitrate         Retr  Cwnd
[  5]   0.00-1.00   sec  45.1 MBytes   379 Mbits/sec  101    178 KBytes       
[  5]   1.00-2.00   sec  41.8 MBytes   351 Mbits/sec   29    188 KBytes       
[  5]   2.00-3.00   sec  44.3 MBytes   372 Mbits/sec   31    230 KBytes       
[  5]   3.00-4.00   sec  47.0 MBytes   394 Mbits/sec   40    245 KBytes       
[  5]   4.00-5.00   sec  40.1 MBytes   337 Mbits/sec   82    165 KBytes       
[  5]   5.00-6.00   sec  41.5 MBytes   348 Mbits/sec   28    211 KBytes       
[  5]   6.00-7.00   sec  48.5 MBytes   406 Mbits/sec   37    290 KBytes       
[  5]   7.00-8.00   sec  44.4 MBytes   373 Mbits/sec   52    194 KBytes       
[  5]   8.00-9.00   sec  38.2 MBytes   320 Mbits/sec   36    190 KBytes       
[  5]   9.00-10.00  sec  37.1 MBytes   311 Mbits/sec   35    185 KBytes       
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-10.00  sec   428 MBytes   359 Mbits/sec  471             sender
[  5]   0.00-10.04  sec   426 MBytes   356 Mbits/sec                  receiver

iperf Done.
```
```
# iperf3 -c 192.168.16.152 -u -b 500M
Connecting to host 192.168.16.152, port 5201
[  5] local 10.45.0.2 port 32867 connected to 192.168.16.152 port 5201
[ ID] Interval           Transfer     Bitrate         Total Datagrams
[  5]   0.00-1.00   sec  59.5 MBytes   499 Mbits/sec  44186  
[  5]   1.00-2.00   sec  59.6 MBytes   500 Mbits/sec  44249  
[  5]   2.00-3.00   sec  59.7 MBytes   501 Mbits/sec  44314  
[  5]   3.00-4.00   sec  51.4 MBytes   431 Mbits/sec  38199  
[  5]   4.00-5.00   sec  46.0 MBytes   386 Mbits/sec  34180  
[  5]   5.00-6.00   sec  43.2 MBytes   362 Mbits/sec  32048  
[  5]   6.00-7.00   sec  45.0 MBytes   378 Mbits/sec  33432  
[  5]   7.00-8.00   sec  47.7 MBytes   400 Mbits/sec  35413  
[  5]   8.00-9.00   sec  48.7 MBytes   409 Mbits/sec  36185  
[  5]   9.00-10.00  sec  47.1 MBytes   395 Mbits/sec  35008  
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Jitter    Lost/Total Datagrams
[  5]   0.00-10.00  sec   508 MBytes   426 Mbits/sec  0.000 ms  0/377214 (0%)  sender
[  5]   0.00-10.04  sec   490 MBytes   409 Mbits/sec  0.024 ms  13452/377209 (3.6%)  receiver

iperf Done.
```
```
# ping 192.168.16.152 -c 10
PING 192.168.16.152 (192.168.16.152) 56(84) bytes of data.
64 bytes from 192.168.16.152: icmp_seq=1 ttl=64 time=0.642 ms
64 bytes from 192.168.16.152: icmp_seq=2 ttl=64 time=1.05 ms
64 bytes from 192.168.16.152: icmp_seq=3 ttl=64 time=0.842 ms
64 bytes from 192.168.16.152: icmp_seq=4 ttl=64 time=0.915 ms
64 bytes from 192.168.16.152: icmp_seq=5 ttl=64 time=0.927 ms
64 bytes from 192.168.16.152: icmp_seq=6 ttl=64 time=0.865 ms
64 bytes from 192.168.16.152: icmp_seq=7 ttl=64 time=0.894 ms
64 bytes from 192.168.16.152: icmp_seq=8 ttl=64 time=0.955 ms
64 bytes from 192.168.16.152: icmp_seq=9 ttl=64 time=0.852 ms
64 bytes from 192.168.16.152: icmp_seq=10 ttl=64 time=0.875 ms

--- 192.168.16.152 ping statistics ---
10 packets transmitted, 10 received, 0% packet loss, time 9091ms
rtt min/avg/max/mdev = 0.642/0.882/1.053/0.099 ms
```

</details>

**5GCにfree5GC C-Planeを使用した場合**
| # | UPF | Date | 1) TCP<br>throughput | 2) UDP<br>throughput | 2) UDP<br>packet<br>loss | 3) RTT<br>(msec) | 
| --- | --- | --- | --- | --- | --- | --- |
| b | UPG-VPP v1.11.0 | 2023.12.11 | S:1.13 Gbps<br>R:1.13 Gbps | S:500 Mbps<br>R:492 Mbps | 1.3% | 0.366 |
| c | **4) eUPF v0.6.0** | 2023.12.05 | S:358 Mbps<br>R:355 Mbps | S:392 Mbps<br>R:382 Mbps | 2% | 0.850 |
| d | free5GC UPF v3.3.0 | 2023.11.12 | S:233 Mbps<br>R:229 Mbps | S:499 Mbps<br>R:382 Mbps | 23% | 0.786 |

<details><summary>b. UPG-VPP v1.11.0のPingとiPerf3ログ</summary>

```
# iperf3 -c 192.168.16.152
Connecting to host 192.168.16.152, port 5201
[  5] local 10.45.0.1 port 33028 connected to 192.168.16.152 port 5201
[ ID] Interval           Transfer     Bitrate         Retr  Cwnd
[  5]   0.00-1.00   sec   131 MBytes  1.10 Gbits/sec  145    239 KBytes       
[  5]   1.00-2.00   sec   136 MBytes  1.14 Gbits/sec   88    265 KBytes       
[  5]   2.00-3.00   sec   131 MBytes  1.10 Gbits/sec    6    298 KBytes       
[  5]   3.00-4.00   sec   130 MBytes  1.09 Gbits/sec   19    346 KBytes       
[  5]   4.00-5.00   sec   144 MBytes  1.21 Gbits/sec   64    370 KBytes       
[  5]   5.00-6.00   sec   133 MBytes  1.12 Gbits/sec   42    244 KBytes       
[  5]   6.00-7.00   sec   132 MBytes  1.11 Gbits/sec   43    296 KBytes       
[  5]   7.00-8.00   sec   138 MBytes  1.15 Gbits/sec   89    327 KBytes       
[  5]   8.00-9.00   sec   139 MBytes  1.16 Gbits/sec   49    285 KBytes       
[  5]   9.00-10.00  sec   136 MBytes  1.14 Gbits/sec   80    316 KBytes       
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-10.00  sec  1.32 GBytes  1.13 Gbits/sec  625             sender
[  5]   0.00-10.04  sec  1.32 GBytes  1.13 Gbits/sec                  receiver

iperf Done.
```
```
# iperf3 -c 192.168.16.152 -u -b 500M
Connecting to host 192.168.16.152, port 5201
[  5] local 10.45.0.1 port 49554 connected to 192.168.16.152 port 5201
[ ID] Interval           Transfer     Bitrate         Total Datagrams
[  5]   0.00-1.00   sec  59.6 MBytes   500 Mbits/sec  44257  
[  5]   1.00-2.00   sec  59.6 MBytes   500 Mbits/sec  44243  
[  5]   2.00-3.00   sec  59.6 MBytes   500 Mbits/sec  44282  
[  5]   3.00-4.00   sec  59.6 MBytes   500 Mbits/sec  44250  
[  5]   4.00-5.00   sec  59.6 MBytes   500 Mbits/sec  44275  
[  5]   5.00-6.00   sec  59.6 MBytes   500 Mbits/sec  44263  
[  5]   6.00-7.00   sec  59.6 MBytes   500 Mbits/sec  44223  
[  5]   7.00-8.00   sec  59.6 MBytes   500 Mbits/sec  44287  
[  5]   8.00-9.00   sec  59.6 MBytes   500 Mbits/sec  44261  
[  5]   9.00-10.00  sec  59.6 MBytes   500 Mbits/sec  44278  
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Jitter    Lost/Total Datagrams
[  5]   0.00-10.00  sec   596 MBytes   500 Mbits/sec  0.000 ms  0/442619 (0%)  sender
[  5]   0.00-10.04  sec   589 MBytes   492 Mbits/sec  0.013 ms  5535/442619 (1.3%)  receiver

iperf Done.
```
```
# ping 192.168.16.152 -c 10
PING 192.168.16.152 (192.168.16.152) 56(84) bytes of data.
64 bytes from 192.168.16.152: icmp_seq=1 ttl=63 time=0.306 ms
64 bytes from 192.168.16.152: icmp_seq=2 ttl=63 time=0.413 ms
64 bytes from 192.168.16.152: icmp_seq=3 ttl=63 time=0.534 ms
64 bytes from 192.168.16.152: icmp_seq=4 ttl=63 time=0.281 ms
64 bytes from 192.168.16.152: icmp_seq=5 ttl=63 time=0.368 ms
64 bytes from 192.168.16.152: icmp_seq=6 ttl=63 time=0.361 ms
64 bytes from 192.168.16.152: icmp_seq=7 ttl=63 time=0.272 ms
64 bytes from 192.168.16.152: icmp_seq=8 ttl=63 time=0.322 ms
64 bytes from 192.168.16.152: icmp_seq=9 ttl=63 time=0.309 ms
64 bytes from 192.168.16.152: icmp_seq=10 ttl=63 time=0.500 ms

--- 192.168.16.152 ping statistics ---
10 packets transmitted, 10 received, 0% packet loss, time 9233ms
rtt min/avg/max/mdev = 0.272/0.366/0.534/0.085 ms
```

</details>

<details><summary>c. eUPF v0.6.0のPingとiPerf3ログ</summary>

```
# iperf3 -c 192.168.16.152
Connecting to host 192.168.16.152, port 5201
[  5] local 10.45.0.1 port 44176 connected to 192.168.16.152 port 5201
[ ID] Interval           Transfer     Bitrate         Retr  Cwnd
[  5]   0.00-1.00   sec  37.7 MBytes   316 Mbits/sec  119    200 KBytes       
[  5]   1.00-2.00   sec  46.6 MBytes   391 Mbits/sec   21    239 KBytes       
[  5]   2.00-3.00   sec  45.1 MBytes   378 Mbits/sec    4    305 KBytes       
[  5]   3.00-4.00   sec  38.5 MBytes   323 Mbits/sec   64    186 KBytes       
[  5]   4.00-5.00   sec  43.2 MBytes   362 Mbits/sec   46    258 KBytes       
[  5]   5.00-6.00   sec  41.4 MBytes   348 Mbits/sec   28    182 KBytes       
[  5]   6.00-7.00   sec  43.9 MBytes   368 Mbits/sec    3    256 KBytes       
[  5]   7.00-8.00   sec  45.0 MBytes   377 Mbits/sec   50    170 KBytes       
[  5]   8.00-9.00   sec  41.9 MBytes   351 Mbits/sec   43    181 KBytes       
[  5]   9.00-10.00  sec  43.8 MBytes   367 Mbits/sec   56    167 KBytes       
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-10.00  sec   427 MBytes   358 Mbits/sec  434             sender
[  5]   0.00-10.05  sec   425 MBytes   355 Mbits/sec                  receiver

iperf Done.
```
```
# iperf3 -c 192.168.16.152 -u -b 500M
Connecting to host 192.168.16.152, port 5201
[  5] local 10.45.0.1 port 50301 connected to 192.168.16.152 port 5201
[ ID] Interval           Transfer     Bitrate         Total Datagrams
[  5]   0.00-1.00   sec  45.7 MBytes   383 Mbits/sec  33907  
[  5]   1.00-2.00   sec  42.3 MBytes   355 Mbits/sec  31389  
[  5]   2.00-3.00   sec  45.9 MBytes   385 Mbits/sec  34066  
[  5]   3.00-4.00   sec  47.3 MBytes   397 Mbits/sec  35153  
[  5]   4.00-5.00   sec  47.4 MBytes   397 Mbits/sec  35178  
[  5]   5.00-6.00   sec  46.2 MBytes   388 Mbits/sec  34314  
[  5]   6.00-7.00   sec  52.0 MBytes   436 Mbits/sec  38619  
[  5]   7.00-8.00   sec  46.0 MBytes   386 Mbits/sec  34189  
[  5]   8.00-9.00   sec  50.2 MBytes   421 Mbits/sec  37243  
[  5]   9.00-10.00  sec  44.3 MBytes   371 Mbits/sec  32866  
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Jitter    Lost/Total Datagrams
[  5]   0.00-10.00  sec   467 MBytes   392 Mbits/sec  0.000 ms  0/346924 (0%)  sender
[  5]   0.00-10.04  sec   458 MBytes   382 Mbits/sec  0.032 ms  7034/346924 (2%)  receiver

iperf Done.
```
```
# ping 192.168.16.152 -c 10
PING 192.168.16.152 (192.168.16.152) 56(84) bytes of data.
64 bytes from 192.168.16.152: icmp_seq=1 ttl=64 time=1.10 ms
64 bytes from 192.168.16.152: icmp_seq=2 ttl=64 time=0.986 ms
64 bytes from 192.168.16.152: icmp_seq=3 ttl=64 time=0.797 ms
64 bytes from 192.168.16.152: icmp_seq=4 ttl=64 time=0.751 ms
64 bytes from 192.168.16.152: icmp_seq=5 ttl=64 time=0.716 ms
64 bytes from 192.168.16.152: icmp_seq=6 ttl=64 time=0.797 ms
64 bytes from 192.168.16.152: icmp_seq=7 ttl=64 time=0.779 ms
64 bytes from 192.168.16.152: icmp_seq=8 ttl=64 time=0.751 ms
64 bytes from 192.168.16.152: icmp_seq=9 ttl=64 time=0.971 ms
64 bytes from 192.168.16.152: icmp_seq=10 ttl=64 time=0.855 ms

--- 192.168.16.152 ping statistics ---
10 packets transmitted, 10 received, 0% packet loss, time 9148ms
rtt min/avg/max/mdev = 0.716/0.850/1.102/0.120 ms
```

</details>

<details><summary>d. free5GC UPF v3.3.0のPingとiPerf3ログ</summary>

```
# iperf3 -c 192.168.16.152
Connecting to host 192.168.16.152, port 5201
[  5] local 10.45.0.1 port 60170 connected to 192.168.16.152 port 5201
[ ID] Interval           Transfer     Bitrate         Retr  Cwnd
[  5]   0.00-1.00   sec  32.2 MBytes   270 Mbits/sec  116    307 KBytes       
[  5]   1.00-2.00   sec  27.9 MBytes   234 Mbits/sec   11    291 KBytes       
[  5]   2.00-3.00   sec  29.4 MBytes   246 Mbits/sec    9    259 KBytes       
[  5]   3.00-4.00   sec  24.9 MBytes   209 Mbits/sec    0    324 KBytes       
[  5]   4.00-5.00   sec  30.6 MBytes   257 Mbits/sec    0    389 KBytes       
[  5]   5.00-6.00   sec  23.3 MBytes   196 Mbits/sec   17    323 KBytes       
[  5]   6.00-7.00   sec  27.5 MBytes   231 Mbits/sec   60    266 KBytes       
[  5]   7.00-8.00   sec  27.9 MBytes   234 Mbits/sec    0    335 KBytes       
[  5]   8.00-9.00   sec  26.9 MBytes   226 Mbits/sec   18    303 KBytes       
[  5]   9.00-10.00  sec  26.6 MBytes   223 Mbits/sec    4    272 KBytes       
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-10.00  sec   277 MBytes   233 Mbits/sec  235             sender
[  5]   0.00-10.05  sec   274 MBytes   229 Mbits/sec                  receiver

iperf Done.
```
```
# iperf3 -c 192.168.16.152 -u -b 500M
Connecting to host 192.168.16.152, port 5201
[  5] local 10.45.0.1 port 51844 connected to 192.168.16.152 port 5201
[ ID] Interval           Transfer     Bitrate         Total Datagrams
[  5]   0.00-1.00   sec  58.2 MBytes   488 Mbits/sec  43230  
[  5]   1.00-2.00   sec  60.9 MBytes   511 Mbits/sec  45216  
[  5]   2.00-3.00   sec  59.6 MBytes   500 Mbits/sec  44289  
[  5]   3.00-4.00   sec  59.5 MBytes   499 Mbits/sec  44183  
[  5]   4.00-5.00   sec  58.3 MBytes   489 Mbits/sec  43279  
[  5]   5.00-6.00   sec  60.5 MBytes   507 Mbits/sec  44919  
[  5]   6.00-7.00   sec  59.6 MBytes   500 Mbits/sec  44242  
[  5]   7.00-8.00   sec  60.2 MBytes   505 Mbits/sec  44708  
[  5]   8.00-9.00   sec  58.4 MBytes   490 Mbits/sec  43391  
[  5]   9.00-10.00  sec  60.1 MBytes   504 Mbits/sec  44626  
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Jitter    Lost/Total Datagrams
[  5]   0.00-10.00  sec   595 MBytes   499 Mbits/sec  0.000 ms  0/442083 (0%)  sender
[  5]   0.00-10.04  sec   457 MBytes   382 Mbits/sec  0.180 ms  102488/442055 (23%)  receiver

iperf Done.
```
```
# ping 192.168.16.152 -c 10
PING 192.168.16.152 (192.168.16.152) 56(84) bytes of data.
64 bytes from 192.168.16.152: icmp_seq=1 ttl=63 time=0.575 ms
64 bytes from 192.168.16.152: icmp_seq=2 ttl=63 time=1.03 ms
64 bytes from 192.168.16.152: icmp_seq=3 ttl=63 time=0.903 ms
64 bytes from 192.168.16.152: icmp_seq=4 ttl=63 time=0.811 ms
64 bytes from 192.168.16.152: icmp_seq=5 ttl=63 time=0.711 ms
64 bytes from 192.168.16.152: icmp_seq=6 ttl=63 time=0.632 ms
64 bytes from 192.168.16.152: icmp_seq=7 ttl=63 time=0.784 ms
64 bytes from 192.168.16.152: icmp_seq=8 ttl=63 time=0.821 ms
64 bytes from 192.168.16.152: icmp_seq=9 ttl=63 time=0.748 ms
64 bytes from 192.168.16.152: icmp_seq=10 ttl=63 time=0.844 ms

--- 192.168.16.152 ping statistics ---
10 packets transmitted, 10 received, 0% packet loss, time 9103ms
rtt min/avg/max/mdev = 0.575/0.786/1.032/0.124 ms
```

</details>

1. `iperf3 -c 192.168.16.152`  
2. `iperf3 -c 192.168.16.152 -u -b 500M`<br>**UDP packet loss** は、性能限界を比較するために意図的に負荷(500 Mbps)をかけて測定した値です。  
3. `ping 192.168.16.152 -c 10`
4. Virtualbox VM上で実行している都合、`xdp_attach_mode`を`generic`に設定した場合の測定値です。 `generic`モードはkernelレベルで実装されるため、性能向上には寄与しないことに注意して下さい。`native`(driverレベルの実装)または`offload`(NICレベルの実装)に設定すると、性能向上が期待できます。参考までに、XDPをサポートするドライバの一覧は[こちら](https://github.com/iovisor/bcc/blob/master/docs/kernel-versions.md#xdp)にあります。

これらの測定結果から、UPG-VPPがVirtualbox VM上でも比較的優れた性能を示しています。今回の測定は非常に単純な測定であり、Virtualbox VM間の測定ではあまり意味がないかもしれませんが、UPFの相対的な性能比較の観点から若干参考になるかもしれません。

## 最後に

本記事では、以下の技術を採用したオープンソースのUPFについて、簡単に性能を比較してみました。

1. VPP+DPDK
2. eBPF/XDP
3. GTP Linux kernel module
4. ユーザ空間におけるGTP処理(TUNnelインターフェース)
5. ユーザ空間におけるGTP処理(TAPインターフェース)

今回、性能測定に使用したツールをPacketRusherの開発者からご紹介頂き、丁度その頃、eBPF/XDP UFPのeUPFがFTUPに対応したことで他のUPFと同じNW構成で稼働できるようになったことから、幾つか主要な技術で実装されたUPFの性能比較を簡単に実施しました。ただ、測定環境はVirtualbox VMのため、各UPF VMのリソース条件を揃え易い半面、実性能の観点ではあまり参考にならないと考えています。なお、ネットワーク性能がUPF処理の頭打ちにならないよう、ネットワークアダプタにはvirtio-netを採用する等、若干考慮してNWを構成しました。そのため、今回の測定結果は、あくまでリソースを同一に揃えたUPFによる相対的な性能評価と位置付けています。実機のNICによるUPFの性能を検証する上で、少しでも参考になれれば幸いです。

最後に、元記事は[Github](https://github.com/s5uishida/simple_measurement_of_upf_performance)に書いたものです。[HPE Developer BlogのPacketRusher紹介記事](https://developer.hpe.com/blog/open-sourcing-packetrusher-a-5g-core-performance-tester/)からもリンクして頂きました。

## 主な変更履歴

- [2024.02.14] 初版。