--- MPLS BASICS: Multi Protocol Label Switching (MPLS) represents a simple technology, which is today indispensable in network cores. MPLS protocol adds a 32-bit header (Figure 1) between the second and the third network layer headers. Within these 32 bits, 20 bits are reserved for the label, 3 bits for the Traffic Class (TC) field, 1 bit for the Bottom of Stack (S) field and the remaining 8 bits are reserved for the Time to Live (TTL) field. 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Label | Label | Exp |S| TTL | Stack +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Entry Label: Label Value, 20 bits Exp: Experimental Use, 3 bits S: Bottom of Stack, 1 bit TTL: Time to Live, 8 bits Figure 1 A traffic class carried by means of a MPLS packet is defined based on the TC field. Definition of an S field enables assigning of several labels to the packets. In the label grouping, only the lowest label, closest to the IP packet, has S bit set to 1. All other labels in the label stack have S set to 0. TTL field is used just like a TTL field of the IP packet. --- BUILDING: MPLS can be built as a kernel module, or it can be built in a kernel. To build MPLS first you need to run: $ make menuconfig and enable MPLS compiling from: Network setup -> Networking options -> MPLS (Experimental) If you're running Debian based system, nice HOW-TO on compiling and installing custom kernel can be found here: https://help.ubuntu.com/community/Kernel/Compile --- RUNNING: To be able to run MPLS, you will need modified iproute2 programme which can be downloaded from: https://github.com/i-maravic/iproute2 Creation of MPLS tunnel ingress points is done with: # ip link add tunnel_name type mpls push 300 192.168.2.2 or with # ip route add 1.2.3.4 mpls push 300 192.168.2.2 To get more comprehensive explanation use: $ ip link add tunnel_name type mpls help or $ ip route help In order to be able to receive MPLS packets, interface must be MPLS enabled. This is done with: # ip link set eth0 mpls on To be able to receve MPLS packets recursively mpls0 interface must be brought up! To build MPLS tunnel cross connect and egress points use: # ip -M route add 200 mpls swap 300 dev eth0 192.168.3.3 MPLS SNMP stats are located in: /proc/net/mpls_stats MPLS sysctl parameters are located in: /proc/sys/net/mpls MPLS fully supports net namespaces. IP-MPLS multipath routes are suported Reserved labels, except the RouterAlert label, are handled properly. --- TODO: 1. Firewall support 2. ICMPv6 message sending, when TTL is exceeded or packet can't be forwarded because of MTU, from the inside of MPLS tunnel 3. MPLS multipath 3. Bridging support