diff options
Diffstat (limited to '2016/netdevconf-gtp/netdev-gtp.adoc')
-rw-r--r-- | 2016/netdevconf-gtp/netdev-gtp.adoc | 236 |
1 files changed, 236 insertions, 0 deletions
diff --git a/2016/netdevconf-gtp/netdev-gtp.adoc b/2016/netdevconf-gtp/netdev-gtp.adoc new file mode 100644 index 0000000..897a0b1 --- /dev/null +++ b/2016/netdevconf-gtp/netdev-gtp.adoc @@ -0,0 +1,236 @@ +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? |