FD.io VPP
v21.10.1-2-g0a485f517
Vector Packet Processing
|
This plugin module can provide the stateless mobile user plane protocols translation between GTP-U and SRv6. The plugin also provides FIB table lookup for an IPv4/IPv6 packet encapsulated in GTP-U. These plugin functions take advantage of SRv6 network programmability.
SRv6 Mobile User Plane defines the user plane protocol using SRv6 including following stateless translation functions:
These functions benefit user plane(overlay) to be able to utilize data plane(underlay) networks properly. And also it benefits data plane to be able to handle user plane in routing paradigm.
In addition to the above functions, the plugin supports following functions:
Noted that the prefix of function names follow naming convention of SRv6 network programming. "T" means transit function, "End" means end function, "M" means Mobility specific function. The suffix "D" and "E" mean that "decapsulation" and "encapsulation" respectively.
All SRv6 mobile functions are implemented as VPP plugin modules. The plugin modules leverage the sr_policy and sr_localsid mechanisms.
The GTP-U tunnel and flow identifiers of a receiving packet are mapped to a Segment Identifier(SID) of sending SRv6 packets.
In case that IPv4 networks are the infrastructure of GTP-U, T.M.GTP4.D function translates the receiving GTP-U packets to SRv6 packets.
A T.M.GTP4.D function is associated with the following mandatory parameters:
The following command instantiates a new T.M.GTP4.D function.
For example, the below command configures the SID 2001:db8::1 with t.m.gtp4.d
behavior for translating receiving GTP-U over IPv4 packets to SRv6 packets with next-header type is IPv4.
It should be interesting how a SRv6 BSID works to decapsulate the receiving GTP-U packets over IPv4 header. To utilize t.m.gtp4.d
function, you need to configure some SR steering policy like:
The above steering policy with the BSID of t.m.gtp4.d
would work properly for the GTP-U packets destined to 172.20.0.1.
If you have a SID(s) list of SR policy which the configured gtp4.d function to be applied, the SR Policy can be configured as following:
In case that GTP-U is deployed over IPv6 infrastructure, you don't need to configure T.M.GTP4.D function and associated SR steering policy. Instead of that, you just need to configure a localsid of End.M.GTP6.D segment.
An End.M.GTP6.D segment is associated with the following mandatory parameters:
The following command instantiates a new End.M.GTP6.D function.
For example, the below command configures the SID prefix 2001:db8::/64 with end.m.gtp6.d
behavior for translating receiving GTP-U over IPv6 packets which have IPv6 destination addresses within 2001:db8::/64 to SRv6 packets. The dst IPv6 address of the outgoing packets consists of D4::/64 followed by QFI and TEID.
In another case, the translated packets from GTP-U over IPv6 to SRv6 will be re-translated back to GTP-U, which is so called 'Drop-In' mode.
In Drop-In mode, an additional IPv6 specific end segment is required, named End.M.GTP6.D.Di. It is because that unlike end.m.gtp6.d
, it needs to preserve original IPv6 dst address as the last SID in the SRH.
Regardless of that difference exists, the required configuration parameters are same as end.m.gtp6.d
.
The following command instantiates a new End.M.GTP6.D.Di function.
The SRv6 Mobile functions on SRv6 to GTP-U direction are End.M.GTP4.E and End.M.GTP6.D.
In this direction with GTP-U over IPv4 infrastructure, an End.M.GTP4.E segment is associated with the following mandatory parameters:
The following command instantiates a new End.M.GTP4.E function.
For example, the below command configures the SID prefix 2001:db8::/32 with end.m.gtp4.e
behavior for translating the receiving SRv6 packets to GTP-U packets encapsulated with UDP/IPv4 header. All the GTP-U tunnel and flow identifiers are extracted from the active SID in the receiving packets. The src IPv4 address of sending GTP-U packets is extracted from the configured bit position in the src IPv6 address.
In IPv6 infrastructure case, an End.M.GTP6.E segment is associated with the following mandatory parameters:
The following command instantiates a new End.M.GTP6.E function.
For example, the below command configures the SID prefix 2001:db8::/64 with end.m.gtp6.e
behavior for translating the receiving SRv6 packets to GTP-U packets encapsulated with UDP/IPv6 header. While the last SID indicates GTP-U dst IPv6 address, 32-bits GTP-U TEID and 6-bits QFI are extracted from the active SID in the receiving packets.
SRv6 Mobile functions of t.m.gtp4.dt*
and end.m.gtp6.dt*
support decapsulating outer IP/UDP/GTP-U headers and forwarding inner IP packet based on specific fib table.
In case of the both outer and inner IP address families are IPv4, t.m.gtp4.dt4
function supports GTP-U decapsulation and fib lookup for inner IPv4 with an associated steering policy and the following parameters:
The following command instantiates a new T.M.GTP4.DT4 function.
For example, the below commands configure D5:: as the SID instantiates t.m.gtp4.dt4
function. A steering policy for packets destine to 172.20.0.1 binds to the SID.
In addition, inner IPv6, or mix of IPv4 and IPv6 inner packet cases require the function to be configured with local-fib table.
This is inner IPv6 case specific. The reason is that GTP-U encapsulates link local IPv6 packet for NDP (Neighber Discovery Protocol). Outer GTP-U header should be kept until the packets reach to the node responsible for NDP handling. It is typically UPF(User Plane Function) node.
The following command instantiate a new T.M.GTP4.DT6 function.
Following example configures fib 0 for inner packet and fib 1 for outer GTP-U packet forwarding:
If you need to suport both IPv4 and IPv6 inner packet lookup with just one SID, you can configure t.m.gtp4.dt46
function:
In case of GTP-U over IPv6 case, end.m.gtp6.dt4
, end.m.gtp6.dt6
and end.m.gtp6.dt46
functions support inner IPv4, IPv6 and IPv4/IPv6 lookup and forwarding respectively. Specifiyng fib table for inner IP packet forwarding is required as same as GTP-U over IPv4 case, and local-fib table for inner IPv6 and IPv4/IPv6 cases as well.
To run some demo setup please refer to: What's runner.py
doing?