Introduction

I’m currently designing and implementing a large network which will run MPLS.
This network will replace an old network that was mainly L2 based and did not
run MPLS, only VRF lite. There are a few customers that need to have diverse
paths in the network and quick convergence when a failure occurs.
This led me to consider MPLS-TE for those customers and to have plain MPLS
through LDP for other customers buying VPNs. What is the usage for MPLS-TE?

Weaknesses of IGP

When using normal IP forwarding a least cost path is calculated through an IGP,
such as OSPF or ISIS. The problem though is that only the least cost path will
be utilized, any links not on the best path will sit idle, which is a waste of
bandwidth. IGP metrics can be manipulated but that only moves the problem to
other links, it does not solve the root cause. Manipulating metrics is cumbersome
and prone to error. It’s difficult to think of all the traffic flows in the network
and get all the metrics correct. IGPs also lack the granularity in metrics to
utilize all the bandwidth in the network.

RSVP-TE

RSVP in the past was a protocol used for quality of service in the Intserv model.
It never got a lot of traction due to scalability issues of keeping state in the
core of the network. RSVP was modified to support MPLS and that protocol is known
as RSVP-TE. RSVP-TE provides support for:

  • Explicit path configuration
  • Path numbering
  • Route recording

RSVP assigns labels to the LSPs. The headend of the tunnel sends PATH messages
towards the tailend and then from the tailend back, RESV messages are sent together
with a label to use for the LSP.

RSVP-TE1

Constrained SPF (CSPF)

To overcome the limitations of IGPs mentioned above in the post, the SPF algorithm has
to be modified. This is called Constrained SPF (CSPF) and besides a simple metric it
can take other factors into account such as:

  • Bandwidth
  • Affinity
  • Administrative weight
  • Explicitly defined path

To support this modified SPF algorithm and to carry the information needed in the
LSU/LSP, the IGPs have been modified to support this. OSPF supports TE by using
an opaque LSA. ISIS which is easily modifiable with TLVs, supports TE through a new
TLV. When using ISIS as the IGP, a wide style metric must be used to support TE.

The CSPF path can either be calculated dynamically by the router or the user can
configure an explicit path. Both methods support the use of constraints to build
the path.

Routing Across an TE Tunnel

Once the tunnel has been built, traffic must be sent through the tunnel.
This can be achieved in a couple of different ways:

  • Static routing
  • Dynamic routing
  • Policy-based routing

The Lab

That was a brief overview of MPLS-TE. To test this out in a lab I have setup a
topology like this:

MPLS-TE1

All routers are running IOS except for one router. This is to show the syntax of
IOS-XR and for me to practice using it. IOS1 and IOS6 advertise their loopbacks to
the PE routers. Normal routing has been setup as well as MPLS and BGP. This is the
configuration so far:

IOS1:

router bgp 1
 bgp log-neighbor-changes
 network 1.1.1.1 mask 255.255.255.255
 network 11.11.11.11 mask 255.255.255.255
 neighbor 12.12.12.1 remote-as 100

IOS2:

ip vrf CUST_1
 rd 1:1
 route-target export 1:1
 route-target import 1:1
!
interface Loopback0
 ip address 2.2.2.2 255.255.255.255
 ip router isis backbone
!
interface Loopback1
 ip address 22.22.22.22 255.255.255.255
 ip router isis backbone
!
interface GigabitEthernet0/0
 ip vrf forwarding CUST_1
 ip address 12.12.12.1 255.255.255.254
! 
interface GigabitEthernet0/1
 ip address 23.23.23.0 255.255.255.254
 ip router isis backbone
 mpls ip
 isis circuit-type level-2-only
!
interface GigabitEthernet0/2
 ip address 25.25.25.0 255.255.255.254
 ip router isis backbone
 mpls ip
 isis circuit-type level-2-only
!
router isis backbone
 net 49.0001.0002.0002.0002.0002.00
 is-type level-2-only
 metric-style wide
 passive-interface default
 no passive-interface GigabitEthernet0/1
 no passive-interface GigabitEthernet0/2
!
router bgp 100
 bgp router-id 2.2.2.2
 bgp log-neighbor-changes
 neighbor 7.7.7.7 remote-as 100
 neighbor 7.7.7.7 update-source Loopback0
 !        
 address-family vpnv4
  neighbor 7.7.7.7 activate
  neighbor 7.7.7.7 send-community extended
 exit-address-family
 !
 address-family ipv4 vrf CUST_1
  neighbor 12.12.12.0 remote-as 1
  neighbor 12.12.12.0 activate
  neighbor 12.12.12.0 as-override
!
mpls ldp router-id Loopback0 force

XR1:

vrf CUST_1
 address-family ipv4 unicast
  import route-target
   1:1
  !
  export route-target
   1:1
  !
 !
!
interface Loopback0
 ipv4 address 7.7.7.7 255.255.255.255
!
interface GigabitEthernet0/0/0/0
 ipv4 address 47.47.47.1 255.255.255.254
!
interface GigabitEthernet0/0/0/1
 ipv4 address 57.57.57.1 255.255.255.254
!
interface GigabitEthernet0/0/0/2
 vrf CUST_1
 ipv4 address 76.76.76.1 255.255.255.254
!
route-policy PASS
  pass
end-policy
!
router isis backbone
 is-type level-2-only
 net 49.0001.0007.0007.0007.0007.00
 address-family ipv4 unicast
  metric-style wide
 !
 interface Loopback0
  passive
  address-family ipv4 unicast
  !
 !
 interface GigabitEthernet0/0/0/0
  address-family ipv4 unicast
  !
 !
 interface GigabitEthernet0/0/0/1
  address-family ipv4 unicast
  !
 !
!
router bgp 100
 bgp router-id 7.7.7.7
 address-family ipv4 unicast
 !
 address-family vpnv4 unicast
 !
 neighbor 2.2.2.2
  remote-as 100
  update-source Loopback0
  address-family vpnv4 unicast
  !
 !
 vrf CUST_1
  rd 1:1
  address-family ipv4 unicast
  !
  neighbor 76.76.76.0
   remote-as 1
   address-family ipv4 unicast
 route-policy PASS in
    route-policy PASS out
    as-override
   !
  !
 !
!
mpls ldp
 router-id 7.7.7.7
 interface GigabitEthernet0/0/0/0
  address-family ipv4
  !
 !
 interface GigabitEthernet0/0/0/1
  address-family ipv4

IOS6:

interface Loopback0
 ip address 6.6.6.6 255.255.255.255
!
interface Loopback1
 ip address 66.66.66.66 255.255.255.255
!
router bgp 1
 bgp log-neighbor-changes
 network 6.6.6.6 mask 255.255.255.255
 network 66.66.66.66 mask 255.255.255.255
 neighbor 76.76.76.1 remote-as 100

The other configuration has been left out, it’s just plain IGP routing and enabling MPLS.
The lab is currently using MPLS VPN and taking the upper path due to the IGP path
being shorter. Let’s confirm this with a traceroute.

IOS1#traceroute 6.6.6.6 numeric source lo0
Type escape sequence to abort.
Tracing the route to 6.6.6.6
VRF info: (vrf in name/id, vrf out name/id)
  1 12.12.12.1 1 msec 0 msec 0 msec
  2 25.25.25.1 [MPLS: Labels 24/16012 Exp 0] 8 msec 9 msec 4 msec
  3 57.57.57.1 [MPLS: Label 16012 Exp 0] 23 msec 5 msec 8 msec
  4 76.76.76.0 2 msec *  2 msec

The traceroute confirms this.

MPLS-TE tunnels are always unidirectional. To configure MPLS-TE we need to
go through the following steps:

  • Enable CEF (default)
  • Enable TE support in IGP
  • Enable MPLS-TE tunnels globally
  • Enable MPLS-TE tunnels on interface(s) in path
  • Enable RSVP on interface(s) in path

The following configuration is added to all IOS routers:

IOS2(config)#mpls traffic-eng tunnels 
IOS2(config)#int range gi0/1 - 2
IOS2(config-if-range)#mpls traffic-eng tunnels
IOS2(config-if-range)#ip rsvp bandwidth
IOS2(config-if-range)#router isis backbone
IOS2(config-router)#metric-style wide
IOS2(config-router)#mpls traffic-eng level-2
IOS2(config-router)#mpls traffic-eng router-id lo0

The following configuration is added to the IOS-XR router:

router isis backbone
 address-family ipv4 unicast 
  metric-style wide 
  mpls traffic-eng level-2-only 
  mpls traffic-eng router-id Loopback0 
rsvp 
 interface GigabitEthernet0/0/0/0
 ! 
 interface GigabitEthernet0/0/0/1
 ! 
mpls traffic-eng 
 interface GigabitEthernet0/0/0/0
 ! 
 interface GigabitEthernet0/0/0/1

This is enough to have ISIS support MPLS-TE. From the IOS-XR router we can
see that the IGP is now carrying more information in the LSPs.

RP/0/0/CPU0:ios#show mpls traffic-eng topology 
Sun Aug 24 17:16:57.583 UTC
My_System_id: 0007.0007.0007.00 (IS-IS backbone level-2)
My_BC_Model_Type: RDM 

Signalling error holddown: 10 sec Global Link Generation 19

IGP Id: 0002.0002.0002.00, MPLS TE Id: 2.2.2.2 Router Node  (IS-IS backbone level-2)

  Link[0]:Broadcast, DR:0002.0002.0002.01, Nbr Node Id:12, gen:10
      Frag Id:0, Intf Address:23.23.23.0, Intf Id:0
      Nbr Intf Address:0.0.0.0, Nbr Intf Id:0
      TE Metric:10, IGP Metric:10
      Attribute Flags: 0x0
      Ext Admin Group: 
          Length: 256 bits
          Value : 0x::
      Attribute Names: 
      Switching Capability:None, Encoding:unassigned
      BC Model ID:RDM
      Physical BW:1000000 (kbps), Max Reservable BW Global:750000 (kbps)
      Max Reservable BW Sub:0 (kbps)
                                 Global Pool       Sub Pool
               Total Allocated   Reservable        Reservable
               BW (kbps)         BW (kbps)         BW (kbps)
               ---------------   -----------       ----------
        bw[0]:            0         750000                0
        bw[1]:            0         750000                0
        bw[2]:            0         750000                0
        bw[3]:            0         750000                0
        bw[4]:            0         750000                0
        bw[5]:            0         750000                0
        bw[6]:            0         750000                0
        bw[7]:            0         750000                0

The next step is to create the tunnel. We will build a tunnel from IOS2 to XR1.

interface Tunnel0 
 ip unnumbered Loopback0 
 tunnel mode mpls traffic-eng 
 tunnel destination 7.7.7.7 
 tunnel mpls traffic-eng autoroute announce 
 tunnel mpls traffic-eng path-option 10 dynamic 
interface tunnel-te0 
 ipv4 unnumbered Loopback0 
 autoroute announce 
 destination 2.2.2.2 
 path-option 10 dynamic 

Autoroute announce is used to advertise the tunnel into the IGP. Another option
would be a static route for the tunnel destination across the tunnel interface.

The tunnel is now up and traffic is forwarding across it.

IOS1#traceroute 6.6.6.6 numeric so lo0
Type escape sequence to abort.
Tracing the route to 6.6.6.6
VRF info: (vrf in name/id, vrf out name/id)
  1 12.12.12.1 1 msec 0 msec 0 msec
  2 25.25.25.1 [MPLS: Labels 19/16012 Exp 0] 8 msec 1 msec 3 msec
  3 57.57.57.1 [MPLS: Label 16012 Exp 0] 2 msec 3 msec 7 msec
  4 76.76.76.0 9 msec *  3 msec

The label 19 is the label used for the tunnel and label 16012 is the VPN label.
We are still using the upper path though. Let’s configure an explicit path to
use the lower path of the topology.

ip explicit-path name TO_XR1 enable 
 next-address 23.23.23.1 
 next-address 34.34.34.1 
 next-address 47.47.47.1 
! 
interface Tunnel0 
 tunnel mpls traffic-eng path-option 1 explicit name TO_XR1 
explicit-path name TO_IOS2
 index 1 next-address strict ipv4 unicast 47.47.47.0 
 index 2 next-address strict ipv4 unicast 34.34.34.0 
 index 3 next-address strict ipv4 unicast 23.23.23.0 
interface tunnel-te0 
path-option 1 explicit name TO_IOS2

We try a traceroute from IOS1 to see if the traffic is following the lower path.

IOS1#traceroute 6.6.6.6 numeric so lo0
Type escape sequence to abort.
Tracing the route to 6.6.6.6
VRF info: (vrf in name/id, vrf out name/id)
  1 12.12.12.1 1 msec 0 msec 0 msec
  2 23.23.23.1 [MPLS: Labels 19/16012 Exp 0] 5 msec 2 msec 2 msec
  3 34.34.34.1 [MPLS: Labels 21/16012 Exp 0] 2 msec 2 msec 4 msec
  4 47.47.47.1 [MPLS: Label 16012 Exp 0] 1 msec 3 msec 1 msec
  5 76.76.76.0 3 msec *  2 msec

This is the power of MPLS-TE. The ability to from the headend, define where
the traffic should go. This is essentially source routing. There are also new
features coming out such as segment routing which does something similar by
extending OSPF and ISIS and generating labels through the IGP.

What happens if the explicit path goes down? We can use a dynamic path as a
fallback by setting it to a higher ID in our tunnel configuration.
This is the current configuration of the tunnel:

interface Tunnel0
 ip unnumbered Loopback0
 tunnel mode mpls traffic-eng
 tunnel destination 7.7.7.7
 tunnel mpls traffic-eng autoroute announce
 tunnel mpls traffic-eng path-option 1 explicit name TO_XR1
 tunnel mpls traffic-eng path-option 10 dynamic

We will initiate a ping from IOS1, then I will shutdown IOS4 interface towards IOS3.
Traffic should then go over the upper path again.

IOS1#ping 6.6.6.6 so lo0 re 100000
Type escape sequence to abort.
Sending 100000, 100-byte ICMP Echos to 6.6.6.6, timeout is 2 seconds:
Packet sent with a source address of 1.1.1.1 
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!.!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Success rate is 99 percent (2876/2878), round-trip min/avg/max = 1/3/22 ms
IOS1# 

Only a single packet was lost. We confirm on IOS2 that the secondary path
is being used.

IOS2#show mpls traffic-eng tunnels 

Name: IOS2_t0                             (Tunnel0) Destination: 7.7.7.7
  Status:
    Admin: up         Oper: up     Path: valid       Signalling: connected
    path option 10, type dynamic (Basis for Setup, path weight 20)
    path option 1, type explicit TO_XR1

IOS1 is using the upper path again.

IOS1#traceroute 6.6.6.6 numeric so lo0
Type escape sequence to abort.
Tracing the route to 6.6.6.6
VRF info: (vrf in name/id, vrf out name/id)
  1 12.12.12.1 2 msec 0 msec 0 msec
  2 25.25.25.1 [MPLS: Labels 19/16012 Exp 0] 8 msec 8 msec 6 msec
  3 57.57.57.1 [MPLS: Label 16012 Exp 0] 2 msec 6 msec 10 msec
  4 76.76.76.0 1 msec *  2 msec

Conclusion

MPLS-TE can help overcome some of the limitations that come bundled with
IGPs, such as not utilizing links and not being able to consider constraints,
solely relying on a metric that says nothing about the bandwidth available.
MPLS-TE can be used to provide fast convergence by defining several path options.
It can also be combined with FRR to provide convergence times around 50ms.

A Quick Look at MPLS-TE
Tagged on:                 

4 thoughts on “A Quick Look at MPLS-TE

  • October 25, 2014 at 5:30 pm
    Permalink

    Nice article! One important aspect of RSVP-TE is that routers involved currently need to be in the same IGP area for the CSPF to run. Meaning the RSVP-TE extensions are not reaching outside of an area. An IGP area could be an OSPF area or IS-IS level. I noticed your routers are actually in different IS-IS areas but in the same IS-IS level, maybe that was your intention. Everything left of the system id (always 6 bytes) in the NSAP is considered to be the area:

    net 49.0001.0002.0002.0002.0002.00
    net 49.0001.0007.0007.0007.0007.00

    area: 49.0001.0002
    area: 49.0001.0007

    Regards
    Sebastian

    Reply
    • October 26, 2014 at 8:34 am
      Permalink

      Thanks Sebastian!

      I must have made a mistake there. Do you use MPLS-TE? It’s a nice addition but the number of tunnels can grow quickly, the administrative overhead seems quite heavey unless you have some kind of auto tunnel setup.

      Reply
  • October 26, 2014 at 5:43 pm
    Permalink

    Yes, I use MPLS-TE for FRR and to influence LSP setup with administrative-groups or “link coloring” as a constraint. I have however never configured MPLS-TE on Cisco, only on other vendor platforms. I am currently looking into how similar setup is done on IOS XR. From my quick research it seems like Cisco is calling administrative-groups for affinity.

    Reply

Leave a Reply to reaper81 Cancel reply

Your email address will not be published. Required fields are marked *