Skip to content

travelping/upg-vpp

Repository files navigation

User Plane Gateway (UPG) based on VPP

CI

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)

Current State

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.

Working features

  • 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

Not yet working

  • Buffer Action Rules (BAR)
  • QoS Enforcement Rule (QER)

Limitations

  • FAR action with destination LI are not implemented
  • Ethernet bearer support

Development setup

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 in make commands
  • Makefile provides a user interface for the environment
  • upf-plugin/upf/ contains the source code of the plugin1
  • upf-plugin/upf/test/ contains the integration tests1
  • upf-plugin/vpp-base/ contains the base VPP repository

DEB packages containing UPG can be built using:

make debs

After 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 image

You can run integration tests with:

make test

To run E2E tests, use:

make e2e

Commands 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=release

There's a simple dockerized environment wrapped in 'make' commands. To enter it, run:

make buildenv

The following make commands are supported in a dockerized environment:

  • make install rebuilds UPG and installs the resulting binaries into the current environment.
  • make test builds VPP and runs UPG integration tests. The compilation results are retained under vpp/.
  • make retest runs UPG integration tests without building VPP. These can be run under make test to rerun the tests quickly if there were no UPG / VPP code changes.
  • make e2e builds UPG and runs E2E tests for it. For more information, see E2E test documentation.
  • make retest-e2e runs E2E tests without building VPP.
  • make checkstyle performs style checks on the source code.
  • make genbinapi generates the govpp binary API used in E2E tests.

CI and releases

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 commit
  • build (debug + release): build Docker images and binaries/packages
  • checkstyle: check for style errors in the code
  • test: unit and e2e tests for release and debug builds
  • conclude: intermediate job used for sync by the release workflow
  • slack: 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: features
  • fix: fixes
  • test: tests

1: Historically, the project was named simply "UPF". There may be more UPF->UPG renames later

VS Code

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",
	],
}