237 lines
5.3 KiB
Plaintext
237 lines
5.3 KiB
Plaintext
Osmocom kernel-level GTP implementation
|
|
=======================================
|
|
Andreas Schultz + Harald Welte
|
|
:copyright: Andreas Schultz + Harald Welte (Liense: CC-BY-SA)
|
|
:backend: slidy
|
|
:max-width: 45em
|
|
|
|
== What is GTP / GTP in GPRS
|
|
|
|
* GTP, the 'GPRS Tunneling Protocol' was first introduced with GPRS, the
|
|
packet-switched add-on to GSM networks
|
|
* 'PDP contexts' are sessions with an external packet data network (IP)
|
|
which provide a tunnel between the phone and that external network
|
|
* GTP is used betwen the SGSN and GGSN to tunnel the User-plane (IP)
|
|
packet data of a PDP Context
|
|
* latest definition in (3GPP TS 29.281 version 12.1.0 Release 12)
|
|
|
|
[graphviz]
|
|
----
|
|
digraph G {
|
|
label="GPRS Network"
|
|
rankdir=LR;
|
|
MS0 [label="MS"]
|
|
MS0->BTS0 [label="Um", dir=both]
|
|
BTS0 [label="BTS + CCU"]
|
|
BTS0->PCU [dir=both]
|
|
PCU->SGSN [label="Gb", dir=both]
|
|
SGSN->GGSN [label="GTP", dir=both]
|
|
}
|
|
----
|
|
|
|
|
|
== GTP in UMTS
|
|
|
|
* In UMTS, PDP originally remained between SGSN and GGSN
|
|
[graphviz]
|
|
----
|
|
digraph G {
|
|
label="UMTS Network"
|
|
rankdir=LR;
|
|
UE [label="UE"]
|
|
NB [label="NodeB"]
|
|
RNC [label="RNC"]
|
|
|
|
UE->NB [label="Uu", dir=both]
|
|
NB->RNC [label="Iub", dir=both]
|
|
|
|
RNC->SGSN [label="IuPS", dir=both]
|
|
SGSN->GGSN [label="GTP", dir=both]
|
|
}
|
|
----
|
|
* With HSPA in later releases (Rel7+), user plane is moved out of SGSN
|
|
and NodeB generates GTP directly
|
|
* hNodeB (femtocell) architecture also originates GTP directly in hNodeB
|
|
[graphviz]
|
|
----
|
|
digraph G {
|
|
label="UMTS Network / Later Release"
|
|
rankdir=LR;
|
|
UE [label="UE"]
|
|
NB [label="NodeB"]
|
|
RNC [label="RNC"]
|
|
|
|
UE->NB [label="Uu", dir=both]
|
|
NB->RNC [label="Iub", dir=both]
|
|
|
|
RNC->SGSN [label="IuPS", dir=both]
|
|
SGSN->GGSN [label="GTP-C", dir=both]
|
|
NB->GGSN [label="GTP-U", dir=both]
|
|
}
|
|
----
|
|
|
|
|
|
== GTP in LTE
|
|
|
|
* LTE uses GTP at even more interfaces between network elements
|
|
* LTE introduces GTP-C Version 2 for control plane, but user plane
|
|
remains GTP-U v1 like before.
|
|
* What used to be the GGSN is now called PDN-GW in LTE
|
|
[graphviz]
|
|
----
|
|
digraph G {
|
|
label="LTE Network"
|
|
rankdir=LR;
|
|
UE [label="UE"]
|
|
NB [label="eNodeB"]
|
|
|
|
UE->NB [label="Uu", dir=both]
|
|
NB -> MME [label="S1", dir=both]
|
|
NB -> SGW [label="S1-U (GTP-U)", dir=both]
|
|
MME -> SGW [label="S11", dir=both]
|
|
SGW->PGW [label="S5 (GTP-U)", dir=both]
|
|
}
|
|
----
|
|
|
|
|
|
|
|
== GTP
|
|
|
|
* control (GTP-C) *and* user (GTP-U) plane protocol
|
|
* UDP based on well known ports (3386, 2152)
|
|
* per PDP context/tunnel identifiers (TID)
|
|
** one for each direction(!) in GTP v1
|
|
** is the only identifier for tunnel, not IP/Port tuples!
|
|
* support for packet sequnce numbers and reordering
|
|
|
|
|
|
== GTP-C
|
|
|
|
control protocol for:
|
|
|
|
* exchanging meta data
|
|
* assigning parameters to client:
|
|
- IPv4 addresses
|
|
- IPv6 prefixes
|
|
- DNS servers
|
|
- ...
|
|
* establishing and removing tunnels
|
|
* moving tunnel endpoints to other SGW's
|
|
|
|
|
|
== GTP-U
|
|
|
|
two main jobs:
|
|
|
|
* per client tunnelling of IP packets
|
|
* path maintenance
|
|
- echo requests/replies
|
|
- error reporting
|
|
|
|
[packetdiag]
|
|
----
|
|
{
|
|
colwidth = 32
|
|
node_height = 64
|
|
|
|
0-7: Flags
|
|
8-15: Type
|
|
16-31: Length
|
|
32-63: Tunnel ID
|
|
}
|
|
----
|
|
|
|
== Problems with Userspace GTP
|
|
|
|
* Userspace GTP was fine with GPRS speeds
|
|
** Packet rates / bandwidths small compared to routing
|
|
* With HSPA and particularly LTE, the world has changed
|
|
** Signalling / Control Plane traffic is very limited
|
|
** User Plane traffic is very high bandwidth
|
|
|
|
|
|
== Osmocom kernel-level GTP
|
|
|
|
* Move bandwidth-critical User Plane into Linux kernel
|
|
* Keep Control Plane stays in Userspace (OpenGGSN)
|
|
* Use netlink based API to control user plane in kernel
|
|
|
|
* Started by Harald Welte + Pablo Neira @ sysmocom in 2012
|
|
** unfortunately abandoned due to customer disappearing
|
|
* picked up by Andreas Schultz @ travelping in 2015
|
|
** fixed Harald + Pablo's bugs
|
|
** introduce network namespace support
|
|
|
|
|
|
== Design
|
|
|
|
* netlink API built on top of genl
|
|
* initialization:
|
|
** create GTP socket in userspace
|
|
** create tun like network interface
|
|
** bind GTP sockets to it
|
|
* for each PDP context, user space adds one record
|
|
** IP address assigned to MS for this PDP context
|
|
** TEIDs to identify mobile-originated packets
|
|
** SGSN IP for GTP header of mobile-terminated packets
|
|
|
|
== Design
|
|
|
|
* netlink API built on top of genl
|
|
* all PDP contexts share one tun device
|
|
** one tun device for all subscribers, not one per subscriber
|
|
|
|
[graphviz]
|
|
----
|
|
digraph G {
|
|
rankdir=LR;
|
|
MS0 [label="MS 10.0.0.1"];
|
|
MS1 [label="MS 10.0.0.2"];
|
|
MS2 [label="MS 10.0.0.3"];
|
|
GGSN;
|
|
tun0 [shape=box];
|
|
|
|
MS0 -> SGSN [dir=both];
|
|
MS1 -> SGSN [dir=both];
|
|
MS2 -> SGSN [dir=both];
|
|
|
|
SGSN -> GGSN [label="GTP-U", dir=both];
|
|
GGSN -> tun0 [dir=none, minlen=0];
|
|
tun0 -> SRV [label = "10.0.0.1 - 1.2.3.4", dir=both]
|
|
tun0 -> SRV [label = "10.0.0.2 - 1.2.3.4", dir=both]
|
|
tun0 -> SRV [label = "10.0.0.3 - 1.2.3.4", dir=both]
|
|
}
|
|
----
|
|
|
|
== STATUS
|
|
|
|
* working
|
|
** GTP-U v0 and v1 for IPv4 over IPv4
|
|
** multiple tunnels supported
|
|
** only single APN (multiple IP ranges not permited)
|
|
|
|
* Limitations
|
|
** no IPv6 support
|
|
** no offload support
|
|
|
|
* existing users (both GPLv2)
|
|
** OpenGGSN (http://cgit.osmocom.org/openggsn/)
|
|
** new 'ergw' Erlang GGSN / P-GW (https://github.com/travelping/ergw)
|
|
|
|
|
|
== TODO
|
|
|
|
* TODO:
|
|
** final round of clean-up, submission for mainline
|
|
** fix or remove IPv6 support
|
|
* discussion items:
|
|
** path MTU discovery
|
|
** implications by/for offloading faetures (csum / gso / ...)
|
|
* wishlist
|
|
** light-weight tunneling integration
|
|
|
|
|
|
== The End
|
|
|
|
Questions?
|