From Scratch #1: Configuring an Explicit Path using MPLS-TE

Here is a step by step configuration example to configure a specific path using MPLS-TE tunnels.

This was originally going to be a post about MPLS Fast Reroute. However two things happened, one the post became excessively long and two, I realised none of my simulated routers support MPLS FRR. Also, the Cisco Feature Navigator is lying to me again (FRR is supported on a 6500, FN claims this isn’t so.)

So, without further ado, here is how to configure a specific path using MPLS Traffic Engineering Tunnels.

Basic info. I have created this in GNS3 using 2961s. We have 3 routers, shown below.

MPLS-TE Routers

MPLS-TE Routers

Routers have loopback addresses and point to point addresses on their FastEthernet interfaces. IP addresses are shown above.

The routers will be configured to run OSPF as their IGP, OSPF is process 10, all interfaces are in area 0. This should be pretty straightforward for most of you. You could also use IS-IS as your IGP. These are the only two IGPs that support MPLS-TE.

Here is the config on Odin:

*Mar 1 00:08:43.851: %SYS-5-CONFIG_I: Configured from console by console
Odin(config)#router ospf 10
Odin(config-router)#net area 0
*Mar 1 00:09:00.291: %OSPF-5-ADJCHG: Process 10, Nbr on FastEthernet1/0 from LOADING to FULL, Loading Done
*Mar 1 00:09:04.287: %OSPF-5-ADJCHG: Process 10, Nbr on FastEthernet0/0 from LOADING to FULL, Loading Done

Note, I don’t actually recommend using a for your OSPF network statement. I’m just doing it in the lab here. In production networks I generally prefer to either use /32 subnet masks, or masks that reflect the interface subnet. Not that it really matters.

Confirming OSPF is running properly:

Odin#sho ip ospf neigh
Neighbor ID Pri State Dead Time Address Interface 1 FULL/DR 00:00:31 FastEthernet1/0 1 FULL/DR 00:00:35 FastEthernet0/0


Again, going to rush through the basic MPLS config. Enable MPLS globally and on the relevant interfaces. Here it is on Odin.

Odin#conf t
Enter configuration commands, one per line. End with CNTL/Z.
Odin(config)#mpls ip
Odin(config)#int f0/0
Odin(config-if)#mpls ip
Odin(config-if)#int f1/0
Odin(config-if)#mpls ip
*Mar 1 00:07:43.547: %LDP-5-NBRCHG: LDP Neighbor (1) is UP
*Mar 1 00:07:49.623: %LDP-5-NBRCHG: LDP Neighbor (2) is UP

LDP comes up, so all looks pretty happy. You can verify with show mpls ldp neighbor if you wish.

On top of the very basic MPLS configuration, you need to enable MPLS Traffic Engineering. There is two parts to this. One part is enabling it on your MPLS interfaces. The second part is enabling MPLS Traffic Engineering in your IGP.

Configuration on Njord is:

Njord(config)#mpls traffic-eng tunnels
Njord(config)#interface FastEthernet0/0
Njord(config-if)#mpls traffic-eng tunnels
Njord(config-if)#interface FastEthernet1/0
Njord(config-if)#mpls traffic-eng tunnels
Njord(config-if)#router ospf 10
Njord(config-router)# mpls traffic-eng router-id Loopback0
Njord(config-router)# mpls traffic-eng area 0

The configuration is exactly the same on all three routers.

Quick check to see that traffic engineering is enabled on the interfaces and working nicely. I recommend checking out the below command, it has a lot of interesting details.

Njord#show mpls traffic-eng link-management summary
System Information::
 Links Count: 2
 Flooding System: enabled
IGP Area ID:: ospf area 0
 Flooding Protocol: OSPF
 Flooding Status: data flooded
 Periodic Flooding: enabled (every 180 seconds)
 Flooded Links: 2
 IGP System ID:
 MPLS TE Router ID:
 IGP Neighbors: 2
Link ID:: Fa0/0 (
 Link Status:
 Physical Bandwidth: 100000 kbits/sec
 Max Res Global BW: 0 kbits/sec (reserved: 100% in, 100% out)
 Max Res Sub BW: 0 kbits/sec (reserved: 100% in, 100% out)
 MPLS TE Link State: MPLS TE on, RSVP on, admin-up, flooded
 Inbound Admission: reject-huge
 Outbound Admission: allow-if-room
 Admin. Weight: 1 (IGP)
 IGP Neighbor Count: 1
Link ID:: Fa1/0 (
 Link Status:
 Physical Bandwidth: 100000 kbits/sec
 Max Res Global BW: 0 kbits/sec (reserved: 100% in, 100% out)
 Max Res Sub BW: 0 kbits/sec (reserved: 100% in, 100% out)
 MPLS TE Link State: MPLS TE on, RSVP on, admin-up, flooded
 Inbound Admission: reject-huge
 Outbound Admission: allow-if-room
 Admin. Weight: 1 (IGP)
 IGP Neighbor Count: 1

For our purposes, we are just glad there are two interfaces there. If you were reserving bandwidth for a specific purpose then this command is the bombdiggity.

Now I am only going to create a tunnel. The tunnel will go from Thor directly to Njord, once it’s up and running we’ll play around with it a bit to force the traffic to go through Odin. Remember, tunnels are unidirectional. So this LSP will have no bearing on traffic coming back to Thor.

Configuration for the tunnel on Thor:

Thor(config)#interface Tunnel10
Thor(config-if)# ip unnumbered Loopback0
Thor(config-if)# mpls ip
Thor(config-if)# tunnel destination
Thor(config-if)# tunnel mode mpls traffic-eng
Thor(config-if)# tunnel mpls traffic-eng autoroute announce
Thor(config-if)# tunnel mpls traffic-eng path-option 1 dynamic

I will explain those commands shortly. But for now, if everything is working nicely, this tunnel should be visible on all MPLS routers is traverses. There are three kinds of routers, head-end routers, midpoint routers and tail-end routers. In this case it’s only Thor and Njord, head and tail, but if it was a multi-hop tunnel you can use this command on any router in LSP – the midpoints. Here it is on Njord (the tail end).

Njord#show mpls traffic-eng tunnels brief
Signalling Summary:
 LSP Tunnels Process: running
 RSVP Process: running
 Forwarding: enabled
 Periodic reoptimization: every 3600 seconds, next in 1989 seconds
 Periodic auto-bw collection: disabled
Thor_t10 Fa1/0 - up/up
Displayed 0 (of 0) heads, 0 (of 0) midpoints, 1 (of 1) tails

Straight away, you will see traffic being routed out this tunnel.

Thor#show ip route
Routing entry for
 Known via "ospf 10", distance 110, metric 2, type intra area
 Last update from on Tunnel10, 00:13:18 ago
 Routing Descriptor Blocks:
 *, from, 00:13:18 ago, via Tunnel10
 Route metric is 2, traffic share count is 1

So what did those commands do? We’ll go through them one by one.

mpls ip: Not strictly necessary for what we are doing. If the tunnel were to end on a P router (as opposed to the PE in our scenario) this would be needed.

tunnel destination: Sets the tunnel destination. Cisco were unusually cryptic with this command.

tunnel mpls traffic-eng autoroute announce: Announces this tunnel into the IGP. If you wanted to only route traffic into the tunnel via a static route or PBR then you wouldn’t need to do this. In our case it tells OSPF that the interface is present (and is directly connected on the other end).

mpls traffic-eng path-option 1 dynamic: You can have multiple paths, hence the number 1. The CSPF goes through these sequentially until it finds a usable path. I will do a post on having multiple paths later. Dynamic creates the path dynamically, the other option is explicit. Which we’ll have a play with now.

Creating an explicit path:

Thor(config)#int tun 10
Thor(config-if)#$ traffic-eng path-option 1 explicit name ROUNDABOUT
Thor(config-if)#ip explicit-path name ROUNDABOUT

These commands are fairly intuitive. Note the next addresses are the far end of the point-to-point links – like if you were doing a static route out a point to point. The cool thing is you can now see the tunnel is signalled through the mid-point (Odin).

Odin#show mpls traffic-eng tunnels
LSP Tunnel Thor_t10 is signalled, connection is up
 InLabel : FastEthernet0/0, 19
 OutLabel : FastEthernet1/0, implicit-null
 RSVP Signalling Info:
 Src, Dst, Tun_Id 10, Tun_Instance 12
 RSVP Path Info:
 My Address:
 Explicit Route:
 Record Route: NONE
 Tspec: ave rate=0 kbits, burst=1000 bytes, peak rate=0 kbits
 RSVP Resv Info:
 Record Route: NONE
 Fspec: ave rate=0 kbits, burst=1000 bytes, peak rate=0 kbits

How cool is that. That command tells you the ingoing and outgoing labels, interfaces, originating router and end point.

So now traffic from Thor to Njord is routed through Odin. Note the traffic is now asymmetric. The return path is still direct. The other option for your explicit path is instead of defining hop-by-hop ip addresses, you define exclusions. For example:

Thor(config-if)#$ traffic-eng path-option 1 explicit name ROUNDABOUT

In our example, gives the exact same results. But in a much larger network might be more useful for a backup path, as the path is still dynamically configured and can use all other available paths.

I think this post is more than long enough so we’ll stop here. There is a lot more to MPLS-TE than this obviously and I hope to make more posts on it in the near future.

This entry was posted in Config, From Scratch, IOS, MPLS by Tom. Bookmark the permalink.

2 thoughts on “From Scratch #1: Configuring an Explicit Path using MPLS-TE

Leave a Reply

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