UPG implements a GTP-U user plane based on 3GPP TS 23.214 and 3GPP TS 29.244 Release 15. It is implemented as an out-of-tree plugin for FD.io VPP.
The possible uses for UPG are:
- User Plane Function (UPF) in 5G networks
- Packet Data Network Gateway User plane (PGW-U)
- Traffic Detection Function User plane (TDF-U)
UPG is used in production in conjunction with erGW as GGSN/PGW in multiple installations in several telecom operators (Tier 1 and smaller).
For the list of known issues, see KNOWN_ISSUES document.
- PFCP protocol
- en-/decoding of most IEs
- heartbeat
- node-related messages
- session-related messages
- Uplink and Downlink Packet Detection Rules (PDR) and Forward Action Rules (FAR) -- (some parts)
- IPv4 -- inner and outer
- IPv6 -- inner and outer
- Usage Reporting Rules (URR)
- PFCP Session Reports
- Linked Usage Reports
- Buffer Action Rules (BAR)
- QoS Enforcement Rule (QER)
- FAR action with destination LI are not implemented
- Ethernet bearer support
Design rationale for the development environment is this:
- provide an easily reproducible development and build environment usable both on CI and locally
- provide quick commands for common tasks
- simplify bisecting against upstream VPP
- discourage downstream VPP changes, as we should make an effort to upstream them
Relevant parts of the source tree layout:
build/contains helper scripts, most of which are wrapped inmakecommandsMakefileprovides a user interface for the environmentupf-plugin/upf/contains the source code of the plugin1upf-plugin/upf/test/contains the integration tests1upf-plugin/vpp-base/contains the base VPP repository
DEB packages containing UPG can be built using:
make debsAfter a successful build, you can find the packages in the .out directory.
To build a Docker image that contains UPG along with the base VPP, run:
make imageYou can run integration tests with:
make testTo run E2E tests, use:
make e2eCommands for building an image and running tests default to debug builds.
To do a release build instead, pass BUILD_TYPE=release to make:
make e2e BUILD_TYPE=releaseThere's a simple dockerized environment wrapped in 'make' commands. To enter it, run:
make buildenvThe following make commands are supported in a dockerized environment:
make installrebuilds UPG and installs the resulting binaries into the current environment.make testbuilds VPP and runs UPG integration tests. The compilation results are retained undervpp/.make retestruns UPG integration tests without building VPP. These can be run undermake testto rerun the tests quickly if there were no UPG / VPP code changes.make e2ebuilds UPG and runs E2E tests for it. For more information, see E2E test documentation.make retest-e2eruns E2E tests without building VPP.make checkstyleperforms style checks on the source code.make genbinapigenerates the govpp binary API used in E2E tests.
The CI for UPG-VPP is based on GitHub Actions. Currently, the CI only runs for pushes to branches in the repository itself. The jobs include:
prepare: make sure the build image is available for the commitbuild(debug + release): build Docker images and binaries/packagescheckstyle: check for style errors in the codetest: unit and e2e tests for release and debug buildsconclude: intermediate job used for sync by the release workflowslack: internal notification job
The images built per-commit expire within 7 days.
When a tag is pushed, the release workflow is also run for it,
re-tagging the images built as part of the normal build process
(preserving the old tags too). The release notes
list the PRs with the following tags:
feature,enhancement: featuresfix: fixestest: tests
1: Historically, the project was named simply "UPF". There may be more UPF->UPG renames later
It is possible to attach to a running buildenv container with VS Code to get full IntelliSense.
To do that, run make code.
Note: This command leaves the buildenv running in the background.
After attaching for the first time, some VS Code plugins may not be enabled.
To fix that, open: F1 -> "Dev Containers: Open Named Container Configuration File"
And specify what plugins you'd like loaded at start.
Here are some nice plugins to work with this repo:
{
"workspaceFolder": "/src",
"extensions": [
"eamodio.gitlens",
"EditorConfig.EditorConfig",
"golang.go",
"ms-azuretools.vscode-docker",
"ms-vscode.cmake-tools",
"ms-vscode.cpptools",
"ms-vscode.cpptools-extension-pack",
"ms-vscode.cpptools-themes",
"ms-vscode.makefile-tools",
"llvm-vs-code-extensions.vscode-clangd",
"xaver.clang-format",
"twxs.cmake",
],
}