laforge-slides/2016/netdevconf-gtp/netdev-gtp.adoc

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?