improve manual: PFCP and GTP interfaces

Change-Id: Iccb3f0f52bd5006bc94d0ca06ac5d3271ea89eb9
This commit is contained in:
Neels Hofmeyr 2022-08-15 03:02:12 +02:00
parent ecf0500df9
commit bba84420ea
2 changed files with 208 additions and 0 deletions

View File

@ -22,3 +22,160 @@ The aim is to provide:
- 1000 modifications of tunnel state per second (add/remove/modify),
- 4-8 Gbps throughput,
- 100-125k concurrent GTP tunnels.
A typical network scenario using OsmoUPF is illustrated in the following
diagram:
.Typical network architecture used with OsmoUPF
[graphviz]
----
digraph G {
rankdir = LR;
UE [label="UE\n(3G phone)"]
subgraph cluster_hnbgw_mgw_upf {
style=dotted
HNBGW -> UPF [label="PFCP",constraint=false]
UPF [label=OsmoUPF,style=bold]
}
subgraph cluster_hnbgw_mgw_upf2 {
style=dotted
SGSN -> UPF2 [label="PFCP",constraint=false]
UPF2 [label=OsmoUPF,style=bold]
}
subgraph cluster_hnbgw_mgw_upf3 {
style=dotted
GGSN -> UPF3 [label="PFCP",constraint=false]
UPF3 [label=OsmoUPF,style=bold]
}
hNodeB [shape="box",label="hNodeB\n(3G femto cell)"]
UE -> hNodeB [label="Uu"]
hNodeB -> HNBGW [label="Iuh",style=dashed]
STP [label="STP\n(SCCP/M3UA)"]
HNBGW -> STP -> SGSN [label="IuPS",style=dashed]
SGSN -> GGSN [label="GTP-C",style="dashed"]
hNodeB -> UPF -> UPF2 -> UPF3 [label="GTP-U"]
UPF3 -> internet [label="apn"]
}
----
NOTE: at the time of writing this section, the only Osmocom component providing
a PFCP CPF interface is OsmoHNBGW. PFCP support has not yet made its way into
OsmoSGSN nor OsmoGGSN.
=== the PFCP interface
PFCP is specified by 3GPP TS 29.244.
OsmoUPF implements a PFCP User Plane Function interface, listening for PFCP
requests from PFCP Control Plane Function clients, to carry out proxy-relaying
and encapsulation/decapsulation of GTP tunnels.
OsmoUPF does not support the complete PFCP feature set. It detects exactly two
use cases that will provide service of actual GTP tunnels:
* GTP tunnel encapsulation/decapsulation:
- One Packet Detection Rule (PDR) accepts a GTP tunnel from the Access side
with an Outer Header Removal.
- This PDR uses a Forwarding Action Rule (FAR) for plain IP towards Core.
- Another PDR accepts plain IP on a specific IP address from Core.
- The second PDR uses a FAR towards Access with Outer Header Creation for GTP.
* GTP tunnel forwarding:
- One Packet Detection Rule (PDR) accepts a GTP tunnel from the Access side
with an Outer Header Removal.
- This PDR uses a Forwarding Action Rule (FAR) towards Core with an Outer
Header Creation for GTP.
- A second PDR+FAR pair like above, with Access and Core swapped.
Any set of rules only partially or not at all matching the above PDR and FAR
rules will not result in any actions on the GTP user plane, but will still
return a successful outcome in the PFCP messages.
For example, a rule set using an interface other than "Access" or "Core" results
in a PFCP no-op, returning PFCP responses with successful outcome, but not
providing any GTP-U service.
This is a direct result of:
- allowing PFCP rule sets to be setup incrementally by several subsequent PFCP
messages, and of
- OsmoUPF using Linux kernel features for the GTP user plane, where there is
either a full bidirectional GTP tunnel in place or none at all.
For example, a typical CPF will first establish a PFCP session with the UPF
before passing on a data service request from Access to Core, because the UPF
must first choose the GTP TEID that needs to be forwarded towards Core. When the
Core side has responded with its GTP details, the UPF is updated, to form a
complete PFCP rule set.
.Typical sequence of establishing a GTP-U tunnel relay
["mscgen"]
----
msc {
hscale="1";
sgsn[label="SGSN"],sgwc[label="SGW-C"],sgwu[label="SGW-U"],pgwc[label="PGW-C"];
sgsn << pgwc [label="Access"];
sgsn >> pgwc [label="Core"];
sgsn => sgwc [label="GTP Create Session Request\n\n\n"];
|||;
sgwc => sgwu [label="PFCP Session Establishment Request\n\n2x Create PDR\nF-TEID = CHOOSE"];
|||;
sgwc <= sgwu [label="PFCP Session Establishment Response\n\n2x Created PDR\nwith chosen F-TEID"];
|||;
sgwc => pgwc [label="GTP Create Session Request"];
sgwc <= pgwc [label="GTP Create Session Response"];
|||;
sgwc => sgwu [label="PFCP Session Modification Request\n\nUpdate FAR\nwith F-TEID from Core"];
|||;
sgwc <= sgwu [label="PFCP Session Modification Response\n\n\n"];
|||;
sgsn <= sgwc [label="GTP Create Session Response\n\n\n"];
}
----
The OsmoUPF logging as well as the VTY interface yield information on whether a
ruleset results in an actual bidirectional GTP tunnel being set up.
=== the GTP interface
OsmoUPF requires Linux kernel features to provide the GTP user plane
functionality:
- the Linux kernel GTP module for encapsulation/decapsulation between GTP and
plain IP.
- the Linux netfilter nftables feature for relaying GTP, i.e. forwarding between
two GTP tunnels.
Tunnel relaying with netfilter requires at least Linux kernel 5.17.
To be able to interact with these Linux kernel features, the osmo-upf binary
needs cap_net_admin privileges, as in:
----
sudo setcap cap_net_admin+pe /usr/bin/osmo-upf
----
Without above Linux kernel features, or when no cap_net_admin is available,
OsmoUPF is only useful for testing PFCP clients: the GTP features may be run in
mockup mode, so that OsmoUPF serves as a "dry run" PFCP server.

View File

@ -0,0 +1,51 @@
== Running OsmoUPF
The OsmoUPF executable (`osmo-upf`) offers the following command-line
arguments:
=== SYNOPSIS
*osmo-hnbgw* [-h|-V] [-d 'DBGMASK'] [-D] [-c 'CONFIGFILE'] [-s] [-T] [-e 'LOGLEVEL']
=== OPTIONS
*-h, --help*::
Print a short help message about the supported options
*-V, --version*::
Print the compile-time version number of the OsmoHNBGW program
*-D, --daemonize*::
Fork the process as a daemon into background.
*-c, --config-file 'CONFIGFILE'*::
Specify the file and path name of the configuration file to be
used. If none is specified, use `osmo-msc.cfg` in the current
working directory.
=== Multiple instances
Running multiple instances of `osmo-upf` on the same computer is possible if
all interfaces (VTY, CTRL, PFCP) are separated using the appropriate
configuration options. The IP based interfaces are binding to local host by
default. In order to separate the processes, the user has to bind those
services to different ports, or different specific IP addresses.
The VTY and the Control interface can be bound to IP addresses from the loopback
address range, for example:
----
line vty
bind 127.0.0.2
ctrl
bind 127.0.0.2
----
The PFCP port is specified to be fixed as port 8805. Hence, each osmo-upf
process needs to run on a distinct local interface:
----
pfcp
local-addr 10.9.0.2
----
For GTP encapsulation/decapsulation and GTP tunnel relaying, osmo-upf depends on
the IP addresses configured at the Linux kernel GTP module, and the IP addresses
negotiated within PFCP by the control plane function.