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 installation in several telecom operators (Tier 1 and smaller).
- 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
- Error handling in Sx procedures is weak
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 effort to upstream them
Relevant parts of the source tree layout:
hack/
contains helper scripts most of which are wrapped inmake
commandsMakefile
provides user interface for the environmentupf/
contains the source code of the plugin 1upf/test/
contains the integration tests 1vpp/
contains VPP source code and is not committedvpp-patches/
contains patches to apply to the upstream VPP code (applied automatically viagit am
; generated by hand withgit format-patch
)vpp.spec
contains the info on VPP repo, branch and commit to use
upg/
is symlinked to the VPP plugins directory, one can just go
to vpp/
directory after make update-vpp
and follow
upstream VPP build instructions. But, as an alternative,
UPG does provide some build helpers of its own.
There's a simple dockerized environment wrapped in 'make'
commands. During the development cycle, VPP is cloned into vpp/
subdirectory from an upstream repository with some of the
patches applied. This is done automatically but can
also be done via make update-vpp
which will delete all of the
changes made to vpp/
directory. You can make temporary changes under
vpp/
for debugging purposes.
The "build image" which is used for the devenv is tagged with a hash
of Dockerfile.build
as well as VPP's external dependencies.
The following make
commands are supported:
make image-debug
builds a debug UPG Docker image namedupg:debug
make image-release
builds a release UPG Docker image namedupg:release
make test-debug
,make test-release
build VPP and run UPG integration tests in debug and release mode respectively. The compilation results are retained undervpp/
make retest-debug
,make retest-release
run UPG integration tests in debug and release mode respectively without building VPP. These can be run undermake test-debug
/make test-release
to re-run the tests quickly if there were no UPG / VPP code changesmake ensure-build-image
checks if the build image exists or can be pulled and builds it otherwisemake update-build-image-tag
updates the build image tag in.gitlab-ci.yaml
and Dockerfiles according to the hash calculated fromDockerfile.build
and VPP external dependenciesmake install-hooks
installs git hooks in the repo which prevent the user from making commits that containZZZZZ:
substring. This is handy for debug print likeclib_warning("ZZZZZ: i %d", i);
make update-vpp
re-clones VPP intovpp/
directorymake buildenv
runs an interactive shell inside the build environment with UPG and VPP sources mounted into the containermake e2e-debug
andmake e2e-release
build UPG in debug and release mode respectively and run E2E tests for it. For more information, see E2E test documentation
If docker is used, one should set the following environment variable to enable wrapping the internally run commands in a docker container:
export UPG_DOCKER_BUILDENV=1
As an alternative, it’s possible to run commands such as
$ make -C vpp test TEST=test_upf V=2 EXTERN_TESTS=../../upf/test
using VPP’s usual Makefile. upf/ subdirectory is symlinked to
vpp/src/plugins/upf
(note though that there's an issue with VPP's
test discovery mechanism, thus EXTERN_TEST=...
variable is required
to run the tests).