Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/s5uishida/install_vpp_upf_dpdk

Install VPP-UPF with DPDK on Host
https://github.com/s5uishida/install_vpp_upf_dpdk

5g 5gc dpdk free5gc open5gs openairinterface upf upg-vpp vpp

Last synced: about 1 month ago
JSON representation

Install VPP-UPF with DPDK on Host

Awesome Lists containing this project

README

        

# Install VPP-UPF with DPDK on Host
This briefly describes the steps and configuration to build and install [oai-cn5g-upf-vpp](https://gitlab.eurecom.fr/oai/cn5g/oai-cn5g-upf-vpp) based on [travelping/upg-vpp](https://github.com/travelping/upg-vpp).
**It is intended to be prepared for use with [Open5GS](https://github.com/open5gs/open5gs) and [free5GC](https://github.com/free5gc/free5gc).**

---

### [Sample Configurations and Miscellaneous for Mobile Network](https://github.com/s5uishida/sample_config_misc_for_mobile_network)

---

## Table of Contents

- [Simple Overview of VPP-UPF and Data Network Gateway](#overview)
- [Build OAI UPF (VPP-UPF) on VM-UP](#build)
- [Clone OAI UPF (VPP-UPF)](#clone)
- [Change to build all VPP plugins](#change)
- [Edit oai-cn5g-upf-vpp/build/scripts/build_helper.upf](#edit)
- [Install VPP-UPF software dependencies](#depend)
- [Build VPP-UPF](#build_1)
- [Setup VPP-UPF with DPDK on VM-UP](#setup_up)
- [Install dpdk-devbind.py](#install_dpdk)
- [Case of using kernel module "uio_pci_generic"](#uio_pci_generic)
- [Load kernel module "uio_pci_generic"](#load_module)
- [Check Interfaces](#check_interfaces)
- [Bind ens20/ens21/ens22 interfaces to DPDK compatible driver (e.g. uio_pci_generic here)](#bind_interfaces)
- [Verify DPDK binding](#verify_binding)
- [Case of using kernel module "vfio-pci"](#vfio_pci)
- [Create configuration files](#conf)
- [Run VPP-UPF with DPDK on VM-UP](#run)
- [Verify interfaces at VPP](#verify)
- [Setup Data Network Gateway on VM-DN](#setup_dn)
- [Sample Configurations](#sample_conf)
- [For 5G](#5g_conf)
- [For 4G](#4g_conf)
- [Annex 1. Build and Configure UPG-VPP v1.13.0 on VM-UP](#annex_1)
- [Confirmed Version List](#ver_list)
- [Install required packages](#install_pkg)
- [Build VPP v22.10 applied with patches of FPP-VPP v22.10.13](#build_vpp)
- [Build binaries for debugging](#build_vpp_debug)
- [Install the built VPP packages](#install_vpp_pkg)
- [Build UPG-VPP v1.13.0](#build_upg_vpp)
- [Install the built UPG-VPP packages](#install_upg_vpp_pkg)
- [Changes in configuration files of UPG-VPP](#changes_up)
- [Changes when installing the built packages](#changes_up_pkg)
- [Run UPG-VPP with DPDK](#run_upg_vpp)
- [Run UPG-VPP when installing the built packages](#run_upg_vpp_pkg)
- [Changelog (summary)](#changelog)

---

## Simple Overview of VPP-UPF and Data Network Gateway

This describes a simple configuration of VPP-UPF and Data Network Gateway, focusing on U-Plane.
**Note that this configuration is implemented with Proxmox VE VMs.**

The following minimum configuration was set as a condition.
- One UPF and Data Network Gateway

The built simulation environment is as follows.

The VPP-UPF used is as follows.
- VPP-UPF - OpenAir CN 5G for UPF v1.5.1 (2023.05.15) - https://gitlab.eurecom.fr/oai/cn5g/oai-cn5g-upf-vpp

Each VMs are as follows.
| VM | SW & Role | IP address | OS | CPU
(Min) | Mem
(Min) | HDD
(Min) |
| --- | --- | --- | --- | --- | --- | --- |
| VM-UP | OpenAir CN 5G for UPF | 192.168.0.151/24 | Ubuntu 22.04 | 2 | 8GB | 20GB |
| VM-DN | Data Network Gateway | 192.168.0.152/24 | Ubuntu 24.04 | 1 | 1GB | 10GB |

The network interfaces of each VM are as follows.
**Note. Do not enable(up) any devices that will be under the control of DPDK.
These devices will be enabled and set IP addresses in the `init.conf` file of VPP-UPF.**
| VM | Device | Model | Linux Bridge | IP address | Interface | Under DPDK |
| --- | --- | --- | --- | --- | --- | --- |
| VM-UP | ens18 | VirtIO | vmbr1 | 10.0.0.151/24 | (NAPT NW) | -- |
| | ens19 | VirtIO | mgbr0 | 192.168.0.151/24 | (Mgmt NW) | -- |
| | ens20 | VirtIO | vmbr3 | 192.168.13.151/24 | N3 | x |
| | ens21 | VirtIO | vmbr4 | 192.168.14.151/24 | N4 | x |
| | ens22 | VirtIO | vmbr6 | 192.168.16.151/24 | N6 | x |
| VM-DN | ens18 | VirtIO | vmbr1 | 10.0.0.152/24 | (NAPT NW) | -- |
| | ens19 | VirtIO | mgbr0 | 192.168.0.152/24 | (Mgmt NW) | -- |
| | ens20 | VirtIO | vmbr6 | 192.168.16.152/24 | N6 | -- |

Linux Bridges of Proxmox VE are as follows.
| Linux Bridge | Network CIDR | Interface |
| --- | --- | --- |
| vmbr1 | 10.0.0.0/24 | NAPT NW |
| mgbr0 | 192.168.0.0/24 | Mgmt NW |
| vmbr3 | 192.168.13.0/24 | N3 |
| vmbr4 | 192.168.14.0/24 | N4 |
| vmbr6 | 192.168.16.0/24 | N6 |

Set network instance to `internet`.
| Network Instance |
| --- |
| internet |

## Build OAI UPF (VPP-UPF) on VM-UP

Please refer to the following for building OAI UPF (VPP-UPF).
- VPP-UPF - OpenAir CN 5G for UPF v1.5.1 (2023.05.15) - https://gitlab.eurecom.fr/oai/cn5g/oai-cn5g-upf-vpp/-/blob/master/docs/INSTALL_ON_HOST.md

### Clone OAI UPF (VPP-UPF)

```
# git clone https://gitlab.eurecom.fr/oai/cn5g/oai-cn5g-upf-vpp.git
# cd oai-cn5g-upf-vpp
# git checkout develop
```

### Change to build all VPP plugins

Rename the patch file so as not to apply the patch for building only `dpdk` and `upf` plugins.

```
# cd oai-cn5g-upf-vpp/scripts/patches
# mv build_selected_plugins.patch build_selected_plugins.patch_not_use
```

### Edit oai-cn5g-upf-vpp/build/scripts/build_helper.upf

```diff
--- build_helper.upf.orig 2023-07-09 08:19:54.945596895 +0900
+++ build_helper.upf 2023-07-09 09:55:03.435811764 +0900
@@ -122,11 +122,11 @@

add_Travelping_upf_plugin(){
GIT_URL=https://github.com/travelping/upg-vpp.git
- GIT_BRANCH=master
+ GIT_BRANCH=stable/1.2
echo_info "Cloning Travelping UPG plugin"
pushd $OPENAIRCN_DIR/
git clone -b $GIT_BRANCH $GIT_URL
- cd $OPENAIRCN_DIR/upg-vpp && git checkout -f 1f047425c5c99db44c2e599ad1dfd767d426cce8
+ cd $OPENAIRCN_DIR/upg-vpp
mkdir -p -- $OPENAIRCN_DIR/vpp/patches
cp -rf $OPENAIRCN_DIR/upg-vpp/upf/ $OPENAIRCN_DIR/vpp/src/plugins/
cp -rf $OPENAIRCN_DIR/upg-vpp/vpp-patches/* $OPENAIRCN_DIR/vpp/patches
@@ -153,9 +153,7 @@
$SUDO cp -rf $OPENAIRCN_DIR/vpp/build-root/install-vpp-native/vpp/bin/vppctl /bin/
echo_info "Copied binaries to /bin"
# Copying necessary libraries
-# $SUDO cp -rf $OPENAIRCN_DIR/vpp/build-root/install-vpp-native/vpp/lib/vpp_plugins /usr/lib/x86_64-linux-gnu/vpp_plugins/
- $SUDO cp -rf $OPENAIRCN_DIR/vpp/build-root/install-vpp-native/vpp/lib/vpp_plugins/upf_plugin.so /usr/lib/x86_64-linux-gnu/vpp_plugins/
- $SUDO cp -rf $OPENAIRCN_DIR/vpp/build-root/install-vpp-native/vpp/lib/vpp_plugins/dpdk_plugin.so /usr/lib/x86_64-linux-gnu/vpp_plugins/
+ $SUDO cp -rf $OPENAIRCN_DIR/vpp/build-root/install-vpp-native/vpp/lib/vpp_plugins /usr/lib/x86_64-linux-gnu/vpp_plugins/
$SUDO cp -rf $OPENAIRCN_DIR/vpp/build-root/install-vpp-native/vpp/lib/libvppinfra.so.21.01.1 /usr/lib/x86_64-linux-gnu/
$SUDO cp -rf $OPENAIRCN_DIR/vpp/build-root/install-vpp-native/vpp/lib/libvnet.so.21.01.1 /usr/lib/x86_64-linux-gnu/
$SUDO cp -rf $OPENAIRCN_DIR/vpp/build-root/install-vpp-native/vpp/lib/libvlibmemory.so.21.01.1 /usr/lib/x86_64-linux-gnu/
```

### Install VPP-UPF software dependencies

```
# cd oai-cn5g-upf-vpp/build/scripts
# ./build_vpp_upf -I -f
```

### Build VPP-UPF

```
# cd oai-cn5g-upf-vpp/build/scripts
# ./build_vpp_upf -c -V
```

## Setup VPP-UPF with DPDK on VM-UP

Please refer to the following for setup VPP-UPF with DPDK.
- VPP-UPF - OpenAir CN 5G for UPF v1.5.1 (2023.05.15) - https://gitlab.eurecom.fr/oai/cn5g/oai-cn5g-upf-vpp/-/blob/master/docs/VPP_UPG_WITH_DPDK.md

### Install dpdk-devbind.py

```
# wget https://raw.githubusercontent.com/DPDK/dpdk/main/usertools/dpdk-devbind.py -O /usr/local/bin/dpdk-devbind.py
# chmod +x /usr/local/bin/dpdk-devbind.py
```

### Case of using kernel module "uio_pci_generic"

#### Load kernel module "uio_pci_generic"

```
# modprobe uio_pci_generic
```

#### Check Interfaces

```
# lshw -c network -businfo
Bus info Device Class Description
====================================================
pci@0000:00:12.0 network Virtio network device
virtio@1 ens18 network Ethernet interface
pci@0000:00:13.0 network Virtio network device
virtio@2 ens19 network Ethernet interface
pci@0000:00:14.0 network Virtio network device
virtio@3 ens20 network Ethernet interface
pci@0000:00:15.0 network Virtio network device
virtio@4 ens21 network Ethernet interface
pci@0000:00:16.0 network Virtio network device
virtio@5 ens22 network Ethernet interface
```

#### Bind ens20/ens21/ens22 interfaces to DPDK compatible driver (e.g. uio_pci_generic here)

```
# dpdk-devbind.py -b uio_pci_generic 0000:00:14.0 --force
# dpdk-devbind.py -b uio_pci_generic 0000:00:15.0 --force
# dpdk-devbind.py -b uio_pci_generic 0000:00:16.0 --force
```

#### Verify DPDK binding

```
# lshw -c network -businfo
Bus info Device Class Description
====================================================
pci@0000:00:12.0 network Virtio network device
virtio@1 ens18 network Ethernet interface
pci@0000:00:13.0 network Virtio network device
virtio@2 ens19 network Ethernet interface
pci@0000:00:14.0 network Virtio network device
pci@0000:00:15.0 network Virtio network device
pci@0000:00:16.0 network Virtio network device
```
```
# dpdk-devbind.py -s

Network devices using DPDK-compatible driver
============================================
0000:00:14.0 'Virtio network device 1000' drv=uio_pci_generic unused=vfio-pci
0000:00:15.0 'Virtio network device 1000' drv=uio_pci_generic unused=vfio-pci
0000:00:16.0 'Virtio network device 1000' drv=uio_pci_generic unused=vfio-pci

Network devices using kernel driver
===================================
0000:00:12.0 'Virtio network device 1000' if=ens18 drv=virtio-pci unused=vfio-pci,uio_pci_generic *Active*
0000:00:13.0 'Virtio network device 1000' if=ens19 drv=virtio-pci unused=vfio-pci,uio_pci_generic *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
==============================

No 'Misc (rawdev)' devices detected
===================================

No 'Regex' devices detected
===========================

No 'ML' devices detected
========================
```

### Case of using kernel module "vfio-pci"

When using the kernel built-in **vfio-pci** module, please down the `ens20`/`ens21`/`ens22` interfaces in advance.
And, refer to [this](https://doc.dpdk.org/guides/linux_gsg/linux_drivers.html) and set the kernel to IOMMU mode.
Alternatively, it can be used in No-IOMMU mode.
Then, these interfaces are under DPDK control by running `vpp` without explicit **vfio-pci** binding.

### Create configuration files

Create `/root/openair-upf` directory and put the configuration files there.

- `/root/openair-upf/startup.conf`

```
unix {
nodaemon
log /tmp/vpp.log
full-coredump
gid vpp
interactive
cli-listen /run/vpp/cli.sock
exec /root/openair-upf/init.conf
}

api-trace {
on
}

cpu {
main-core 0
corelist-workers 1
}

api-segment {
gid vpp
}

dpdk {
dev 0000:00:14.0 {name n3}
dev 0000:00:15.0 {name n4}
dev 0000:00:16.0 {name n6}
}

plugins {
path /usr/lib/x86_64-linux-gnu/vpp_plugins/
plugin ikev2_plugin.so {disable}
plugin dpdk_plugin.so {enable}
plugin upf_plugin.so {enable}
}
```
For example, if you prepare four CPU cores and want to assign CPU core (`#0`) to `main-core` and three CPU cores (`#1-3`) to `corelist-workers`, configure the `startup.conf` file as follows.
```
cpu {
main-core 0
corelist-workers 1-3
}
```
As a result, each of the three CPU cores has a usage rate of 100% (300% in total). When displayed using the `top` command, it looks like the following.
```
top - 22:52:57 up 4 min, 4 users, load average: 2.73, 1.22, 0.47
Tasks: 151 total, 2 running, 149 sleeping, 0 stopped, 0 zombie
%Cpu(s): 75.2 us, 0.2 sy, 0.0 ni, 24.5 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 7935.3 total, 6126.9 free, 1170.5 used, 638.0 buff/cache
MiB Swap: 0.0 total, 0.0 free, 0.0 used. 6524.8 avail Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1204 root 20 0 82.2g 981656 29860 R 302.0 12.1 5:48.50 vpp_main <--
102 root 20 0 0 0 0 I 0.3 0.0 0:00.11 kworker/2:1-events
...
```

- `/root/openair-upf/init.conf`

Set network instance to `internet`.
```
set interface ip table n6 0
set interface mtu 9000 n6
set interface ip address n6 192.168.16.151/24
set interface state n6 up

set interface ip table n4 0
set interface mtu 9000 n4
set interface ip address n4 192.168.14.151/24
set interface state n4 up

set interface ip table n3 0
set interface mtu 9000 n3
set interface ip address n3 192.168.13.151/24
set interface state n3 up

ip route add 0.0.0.0/0 table 0 via 192.168.16.152 n6

upf pfcp endpoint ip 192.168.14.151 vrf 0

upf node-id fqdn 192.168.14.151

upf nwi name internet vrf 0

upf specification release 16

upf gtpu endpoint ip 192.168.13.151 nwi internet teid 0x000004d2/2
```
By adding the following line as in `init.conf` above,
```
upf specification release 16
```
`FTUP: Supported` is set in `UP Function Features` of `PFCP Association Setup Response` from VPP-UPF.

## Run VPP-UPF with DPDK on VM-UP

```
# /usr/bin/vpp -c /root/openair-upf/startup.conf
clib_sysfs_prealloc_hugepages:260: pre-allocating 20 additional 2048K hugepages on numa node 0
0: clib_sysfs_prealloc_hugepages:260: pre-allocating 8 additional 2048K hugepages on numa node 0
dpdk [warn ]: not enough DPDK crypto resources
dpdk [warn ]: unsupported rx offloads requested on port 0: scatter
dpdk [warn ]: unsupported rx offloads requested on port 1: scatter
dpdk [warn ]: unsupported rx offloads requested on port 2: scatter
dpdk/cryptodev [warn ]: dpdk_cryptodev_init: Not enough cryptodevs
_______ _ _ _____ ___
__/ __/ _ \ (_)__ | | / / _ \/ _ \
_/ _// // / / / _ \ | |/ / ___/ ___/
/_/ /____(_)_/\___/ |___/_/ /_/

vpp#
```

### Verify interfaces at VPP

```
vpp# show hardware-interfaces
Name Idx Link Hardware
local0 0 down local0
Link speed: unknown
local
0: format_dpdk_device:590: rte_eth_dev_rss_hash_conf_get returned -95
n3 1 up n3
Link speed: 4294 Gbps
Ethernet address bc:24:11:d8:09:23
Red Hat Virtio
carrier up half duplex mtu 9000
flags: admin-up pmd maybe-multiseg
Devargs:
rx: queues 1 (max 1), desc 256 (min 0 max 65535 align 1)
tx: queues 1 (max 1), desc 256 (min 0 max 65535 align 1)
pci: device 1af4:1000 subsystem 1af4:0001 address 0000:00:14.00 numa 0
max rx packet len: 9728
promiscuous: unicast off all-multicast on
vlan offload: strip off filter off qinq off
rx offload avail: vlan-strip udp-cksum tcp-cksum tcp-lro vlan-filter
jumbo-frame
rx offload active: jumbo-frame
tx offload avail: vlan-insert udp-cksum tcp-cksum tcp-tso multi-segs
tx offload active: multi-segs
rss avail: none
rss active: none
tx burst function: virtio_xmit_pkts
rx burst function: virtio_recv_mergeable_pkts

0: format_dpdk_device:590: rte_eth_dev_rss_hash_conf_get returned -95
n4 2 up n4
Link speed: 4294 Gbps
Ethernet address bc:24:11:f6:bf:06
Red Hat Virtio
carrier up half duplex mtu 9000
flags: admin-up pmd maybe-multiseg
Devargs:
rx: queues 1 (max 1), desc 256 (min 0 max 65535 align 1)
tx: queues 1 (max 1), desc 256 (min 0 max 65535 align 1)
pci: device 1af4:1000 subsystem 1af4:0001 address 0000:00:15.00 numa 0
max rx packet len: 9728
promiscuous: unicast off all-multicast on
vlan offload: strip off filter off qinq off
rx offload avail: vlan-strip udp-cksum tcp-cksum tcp-lro vlan-filter
jumbo-frame
rx offload active: jumbo-frame
tx offload avail: vlan-insert udp-cksum tcp-cksum tcp-tso multi-segs
tx offload active: multi-segs
rss avail: none
rss active: none
tx burst function: virtio_xmit_pkts
rx burst function: virtio_recv_mergeable_pkts

n6 3 up n6
Link speed: 4294 Gbps
Ethernet address bc:24:11:e4:9c:d1
Red Hat Virtio
carrier up half duplex mtu 9000
flags: admin-up pmd maybe-multiseg
Devargs:
rx: queues 1 (max 1), desc 256 (min 0 max 65535 align 1)
tx: queues 1 (max 1), desc 256 (min 0 max 65535 align 1)
pci: device 1af4:1000 subsystem 1af4:0001 address 0000:00:16.00 numa 0
max rx packet len: 9728
promiscuous: unicast off all-multicast on
vlan offload: strip off filter off qinq off
rx offload avail: vlan-strip udp-cksum tcp-cksum tcp-lro vlan-filter
jumbo-frame
rx offload active: jumbo-frame
tx offload avail: vlan-insert udp-cksum tcp-cksum tcp-tso multi-segs
tx offload active: multi-segs
rss avail: none
rss active: none
tx burst function: virtio_xmit_pkts
rx burst function: virtio_recv_mergeable_pkts

tx frames ok 1
tx bytes ok 42
extended stats:
tx_good_packets 1
tx_good_bytes 42
tx_q0_packets 1
tx_q0_bytes 42
tx_q0_good_packets 1
tx_q0_good_bytes 42
tx_q0_broadcast_packets 1
tx_q0_undersize_packets 1
upf-nwi-internet 4 up upf-nwi-internet
Link speed: unknown
GTPU
vpp#
```

```
vpp# show interface address
local0 (dn):
n3 (up):
L3 192.168.13.151/24
n4 (up):
L3 192.168.14.151/24
n6 (up):
L3 192.168.16.151/24
upf-nwi-internet (up):
vpp#
```

```
vpp# show udp punt
IPV4 UDP ports punt : 2152, 8805
IPV6 UDP ports punt : 2152
vpp#
```

## Setup Data Network Gateway on VM-DN

First, uncomment the next line in the `/etc/sysctl.conf` file and reflect it in the OS.
```
net.ipv4.ip_forward=1
```
```
# sysctl -p
```
Next, configure NAPT and routing to N6 IP address of VPP-UPF.
```
# iptables -t nat -A POSTROUTING -s -j MASQUERADE
# ip route add via 192.168.16.151 dev ens20
```
**Note. Set `` according to the core network.
ex) `10.45.0.0/16`**

---
With the above steps, the VPP-UPF environment with DPDK has been constructed.
You will be able to work VPP-UPF with Open5GS and free5GC.
I would like to thank the excellent developers and all the contributors of OpenAir CN 5G for UPF, UPG-VPP and DPDK.

## Sample Configurations

### For 5G

- [Open5GS 5GC & UERANSIM UE / RAN Sample Configuration - VPP-UPF with DPDK](https://github.com/s5uishida/open5gs_5gc_ueransim_vpp_upf_dpdk_sample_config)
- [free5GC 5GC & UERANSIM UE / RAN Sample Configuration - VPP-UPF with DPDK](https://github.com/s5uishida/free5gc_ueransim_vpp_upf_dpdk_sample_config)

### For 4G

- [Open5GS EPC & srsRAN 4G with ZeroMQ UE / RAN Sample Configuration - VPP-UPF(PGW-U) with DPDK](https://github.com/s5uishida/open5gs_epc_srsran_vpp_upf_dpdk_sample_config)

## Annex 1. Build and Configure UPG-VPP v1.13.0 on VM-UP

For a simple overview of VPP-UPF at the beginning of this article, read **OAI-CN5G-UPF-VPP** as **UPG-VPP**.

VM-UP is as follows.

| VM | SW & Role | IP address | OS | CPU
(Min) | Mem
(Min) | HDD
(Min) |
| --- | --- | --- | --- | --- | --- | --- |
| VM-UP | UPG-VPP U-Plane | 192.168.0.151/24 | Ubuntu 22.04 | 2 | 8GB | 20GB |

### Confirmed Version List

This build instruction is based on `vpp.spec` of [UPG-VPP](https://github.com/travelping/upg-vpp), and `vpp.spec` and `Dockerfile` of [FPP-VPP](https://github.com/travelping/fpp-vpp).
I simply confirmed the operation of the following versions.

| UPG-VPP | FPP-VPP | VPP |
| --- | --- | --- |
| `tag:v1.13.0` | `tag:v22.10.13` | `branch:stable/2210`
`commit:07e0c05e698cf5ffd1e2d2de0296d1907519dc3d` |
| `tag:v1.12.0` | `tag:v22.10.12` | `branch:stable/2210`
`commit:07e0c05e698cf5ffd1e2d2de0296d1907519dc3d` |
| `tag:v1.11.0` | `tag:v22.10.11` | `branch:stable/2210`
`commit:07e0c05e698cf5ffd1e2d2de0296d1907519dc3d` |

### Install required packages

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

### Build VPP v22.10 applied with patches of FPP-VPP v22.10.13

```
# 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/
```
Then update the search path information for the shared libraries added for VPP.
```
# echo "/usr/local/vpp/lib/x86_64-linux-gnu" >> /etc/ld.so.conf.d/vpp.conf
# ldconfig
```
If you want to install the built files as packages without manually copying these, build binary packages as follows.
```
# 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
```

#### Build binaries for debugging

If you want to build in debug mode, make as follows.
```
...
# make build
# cp -r build-root/install-vpp_debug-native/vpp /usr/local/
```
If you want to install the built files as packages without manually copying these, build binary packages as follows.
```
# make pkg-deb-debug
```

#### Install the built VPP packages

If you want to install the VPP packages on a host other than the one on which these were built, first install the following dependent packages.
```
# apt install libnl-route-3-200
```
Then install the VPP packages.
```
# cd build-root
# dpkg -i *.deb
```
This allows you to operate VPP service using `systemctl`.

### Build 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
```
Now the UPG-VPP was built in `/usr/local/vpp`.

**Note.
UPG-VPP v1.13.0 does not support `PDU Session container`.
Therefore, some gNodeBs may not accept GTP traffic from UPG-VPP that does not contain `DL PDU SESSION INFORMATION` in the `PDU Session container`.
In that case, there is a way to try the OAI patch by referring to [here](https://github.com/travelping/upg-vpp/issues/387#issuecomment-1935837642).
Also, [this](./patches/gtp_ext_hdr_qfi_1.patch) is a temporary patch for UPG-VPP v1.13.0 based on the OAI patch. QFI is fixed to 1.
I confirmed that it works with the gNodeB of srsRAN_Project.**

If you want to install the built `upf_plugin.so` etc as packages without manually copying these, build binary packages as follows.
```
# 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
```

#### Install the built UPG-VPP packages

If you want to install the UPG-VPP packages on a host other than the one on which these were built, first install the following dependent packages.
```
# apt install libhyperscan-dev
```
Then install the UPG-VPP packages.
```
# cd build
# dpkg -i *.deb
```

### Changes in configuration files of UPG-VPP

Then see [here](#conf) for the original files.

- `openair-upf/startup.conf`

```diff
--- 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`
There is no change.

#### Changes when installing the built packages

The configuration files used when operating VPP service with `systemctl` are located in the following directory by default.
Then see [here](#conf) for the original files.

- `/etc/vpp/startup.conf`

```diff
--- 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}
}
```

- `/etc/vpp/init.conf`
There is no change.

### Run UPG-VPP with DPDK

As a prerequisite, see [here](https://github.com/s5uishida/install_vpp_upf_dpdk#setup_up) for instructions on binding N3, N4 and N6 network interfaces to DPDK compatible driver.

First, create group `vpp` if it doesn't exist.
```
# addgroup vpp
```
Then run UPG-VPP with DPDK.
```
# /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#
```

#### Run UPG-VPP when installing the built packages

```
# systemctl restart vpp
# systemctl status vpp
â vpp.service - vector packet processing engine
Loaded: loaded (/lib/systemd/system/vpp.service; disabled; vendor preset: enabled)
Active: active (running) since Mon 2024-10-14 06:17:55 JST; 8s ago
Process: 1080 ExecStartPre=/sbin/modprobe uio_pci_generic (code=exited, status=0/SUCCESS)
Main PID: 1085 (vpp_main)
Tasks: 3 (limit: 9395)
Memory: 1.4G
CPU: 8.404s
CGroup: /system.slice/vpp.service
ââ1085 /usr/bin/vpp -c /etc/vpp/startup.conf

Oct 14 06:17:55 upg-vpp11 systemd[1]: Starting vector packet processing engine...
Oct 14 06:17:55 upg-vpp11 systemd[1]: Started vector packet processing engine.
Oct 14 06:17:55 upg-vpp11 vpp[1085]: perfmon [warn ]: skipping source 'intel-uncore' - intel_uncore_init: no uncore units found
Oct 14 06:17:56 upg-vpp11 vpp[1085]: 0: linux_epoll_file_update:120: epoll_ctl: Operation not permitted (errno 1)
```

## Changelog (summary)

- [2024.10.14] Changed the VM environment from Virtualbox to Proxmox VE.
- [2024.06.04] Added confirmation of operation with gNodeB of srsRAN_Project.
- [2024.05.04] Changed the UPG-VPP OS from Ubuntu 20.04 to 22.04.
- [2024.03.30] Updated to `v1.13.0` tag.
- [2024.02.24] Added a procedure to build and install the packages.
- [2024.02.11] Updated to `v1.12.0` tag. Added the information that may be useful when gNodeB does not accept GTP traffic from UPG-VPP.
- [2023.12.12] There is no change from `v1.11.0-rc.2`, and it has been tagged as `v1.11.0`.
- [2023.12.03] Updated to `v1.11.0-rc.2` tag.
- [2023.12.02] Added case of using kernel built-in **vfio-pci** module.
- [2023.11.08] Added a building procedure for UPG-VPP v1.10.0 on Host.
- [2023.09.13] Added sample configurations.
- [2023.07.09] Changed to build all VPP plugins.
- [2023.07.05] When installing on host, changed to use the `stable/1.2` branch of `travelping/upg-vpp` described in `oai-cn5g-upf-vpp/docker/Dockerfile.*`.
- [2023.06.18] Added `upf specification release 16` line in `init.conf`. Along with this, the corresponding description was deleted because the correspondence in the case of Open5GS became unnecessary.
- [2023.06.15] Initial release.