MPLS Traffic Engineering with RSVP-TE on IOS XRd

Overview

In this lab we will configure MPLS Traffic Engineering with RSVP-TE on IOS XRd in Cisco Modeling Labs and create tunnels for customer Layer 3 VPN traffic. RSVP-TE (Resource Reservation Protocol – Traffic Engineering) is a tool which allows engineers to create MPLS tunnels between routers with bandwidth reservations. RSVP-TE allows bandwidth requirements to be considered when establishing a Label Switched Path (LSP), making it useful when traffic engineering decisions need to account for available capacity. In addition to bandwidth reservation, it supports path engineering which allows us to control which path traffic takes through our MPLS core.

Scenario

We are providing Layer 3 VPN services to two customers, Customer A and Customer B. Per our Service Level Agreements (SLAs), Customer A should have a 50 Mbps VPN and Customer B should have a 100 Mbps VPN. Traffic is currently flowing according to the IS-IS best path, leaving some links on our network underutilized. Additionally, we currently have no bandwidth reservation mechanism to account for our SLA requirements. To account for these bandwidth requirements, we will create an MPLS tunnel for each customer using RSVP-TE. To maximize efficient utilization of our core resources, each tunnel will take a different path through our network.

Method

Cisco does not support RSVP-TE over unnumbered links, so first we will assign IP addresses to all core links. We will then configure IS-IS to support MPLS traffic engineering before enabling RSVP-TE and MPLS traffic engineering on the core interfaces. Next, we will define explicit paths between PE-1 and PE-2, create the tunnels, and steer customer traffic into them. We will use routing tables, traceroutes, and MPLS forwarding counters to verify the resulting traffic paths.

Equipment

I’ll be starting with the topology I built in my Layer 3 MPLS VPN lab. If you’d like to follow along, you can download the Layer 3 MPLS VPN CML topology and router configurations.

  • Customer Edge Routers (IOSv)
    • CE-1A
    • CE-1B
    • CE-2A
    • CE-2B
  • Provider Edge Routers (XRd)
    • PE-1
    • PE-2
  • Provider Core Routers (XRd)
    • P1
    • P2

Prequel – How Traffic Flows Without RSVP-TE

Layer 3 MPLS VPN traffic flow without RSVP-TE.

Without RSVP-TE, traffic uses the IS-IS best path available in the routing table. This means that all traffic will follow the path IS-IS chooses through the network. Currently, IS-IS is using the PE-1 > P1 > PE-2 path.

We can verify this by running traceroutes from CE-1A to CE-2A and CE-1B to CE-2B.

Traceroute from CE-1A to CE-2A before RSVP-TE traffic steering
Traceroute from CE-1B to CE-2B before RSVP-TE traffic steering

This leaves the PE-1 > P2 > PE-2 path underutilized while all customer traffic is concentrated on the path through P1. Our goal is to distribute customer traffic across both core paths so that we can make better use of the available network resources, as shown below.

Layer 3 MPLS VPN traffic flow with RSVP-TE.

Step 1 – Configuring IP Addresses on Core Links

In order for RSVP to work properly, we need IP Addresses on all links in the core. I’ll remove the ipv4 unnumbered setting and use /30 subnets between each router. I’ll assign the IP addresses as follows:

RouterInterfaceIP AddressNetwork
PE-1Gi0/0/0/010.1.0.110.1.0.0 /30
PE-1Gi0/0/0/210.2.0.110.2.0.0 /30
P1Gi0/0/0/010.1.0.210.1.0.0 /30
P1Gi0/0/0/110.3.0.110.3.0.0 /30
P2Gi0/0/0/010.2.0.210.2.0.0 /30
P2Gi0/0/0/110.4.0.110.4.0.0 /30
PE-2Gi0/0/0/010.3.0.210.3.0.0 /30
PE-2Gi0/0/0/210.4.0.210.4.0.0 /30

Here’s the updated topology showing the network addresses used on the core links:

MPLS Core with numbered core links

With IP addresses on all of the core-facing interfaces, we can now begin to configure IS-IS for RSVP-TE.

Step 2 – Configuring IS-IS for MPLS Traffic Engineering

We will need to configure IS-IS to use the wide metric style. Wide metrics allow IS-IS to carry additional attributes beyond standard routing information. These attributes include traffic engineering information like available bandwidth. For more information on wide metrics, see the Juniper IS-IS user guide.

We also need to explicitly enable MPLS traffic engineering in our IS-IS process. We will specify a router id to be used for traffic engineering. In this case we will simply use the loopback 0 interface as the router id. Finally, we need to tell IS-IS which levels it should advertise traffic engineering information on. The options are level 1 only, level 2 only, or both. Since our routers are all operating in L1/L2 mode by default, we will enable traffic engineering on both.

On each core router we will run the following commands to configure IS-IS for traffic engineering:

router isis CORE
  address-family ipv4 unicast
    metric-style wide
    mpls traffic-eng router-id Lo0
    mpls traffic-eng level-1-2

Now that IS-IS is configured to advertise traffic engineering information, we can move on to enabling MPLS Traffic Engineering.

Step 3 – Enabling MPLS Traffic Engineering

MPLS traffic engineering must be enabled for each interface that we want to use it on. This is straightforward on IOS XR, we simply enter MPLS traffic engineering configuration mode and specify the interfaces to enable it on.

Here are the commands for enabling MPLS-TE on all core routers:

!!! PE-1 and PE-2 !!!
mpls traffic-eng
  interface gi0/0/0/0
  interface gi0/0/0/2
!!! P1 and P2 !!!
mpls traffic-eng
  interface gi0/0/0/0
  interface gi0/0/0/1

Step 4 – Configuring RSVP Bandwidth on MPLS Interfaces

Our next step is to configure the RSVP reservable bandwidth on all of our core MPLS interfaces. On IOS XR, we must first enter RSVP configuration mode with rsvp. Then we will enter RSVP interface configuration mode for each interface we want RSVP to operate on. Here, we need to tell RSVP how much of the interface’s bandwidth it is allowed to reserve for tunnels. I’ll be using 75%, which limits RSVP reservations to 75% of the interface bandwidth and leaves the remaining bandwidth unavailable for RSVP reservations.

Here are the commands for configuring RSVP bandwidth on all core routers:

!!! PE-1 and PE-2 !!!
rsvp
  interface gi0/0/0/0
    bandwidth percentage 75
  interface gi0/0/0/2
    bandwidth percentage 75
!!! P1 and P2 !!!
rsvp
  interface gi0/0/0/0
    bandwidth percentage 75
  interface gi0/0/0/1
    bandwidth percentage 75

With RSVP and MPLS-TE enabled we can now create our tunnels.

Step 5 – Creating the Explicit Paths

Our first step in creating RSVP-TE tunnels is to define explicit paths. These paths will identify which routers the tunnels will travel through and the order that they will travel through them. The router where traffic enters the tunnel is also known as the ingress router or the headend router. The router where traffic exits the tunnel is also known as the egress router or the tailend router.

RSVP-TE tunnels only need to be configured on the headend router. The RSVP protocol will tell the rest of the routers about the tunnel, and they will reserve resources accordingly. Tunnels are unidirectional by nature, meaning that they only affect traffic flowing from headend to tailend. If we want return traffic to flow through the same path then we need to create an opposite tunnel on the tailend.

Therefore, we will need to create four explicit paths. Two paths will route Customer A traffic back and forth along the top half of the core via P2. The other two paths will route Customer B traffic back and forth through the bottom half of the core via P1. Here is a visual reminder of the traffic flow we are planning:

Layer 3 MPLS VPN traffic flow with RSVP-TE.

Explicit paths are configured by entering explicit path configuration mode in IOS XR. Once there, we will describe the path using the format index [index] next-address [IP Address]. The index number defines the order in which traffic flows through the routers. Traffic follows the path from the lowest index to the highest. We will use increments of 10 for index numbers.

The full configurations for all four explicit paths are as follows:

!!! PE-1 !!!
explicit-path name PE2_VIA_P2
  index 10 next-address 10.2.0.2
  index 20 next-address 10.4.0.2
explicit-path name PE2_VIA_P1
  index 10 next-address 10.1.0.2
  index 20 next-address 10.3.0.2
!!! PE-2 !!!
explicit-path name PE1_VIA_P2
  index 10 next-address 10.4.0.1
  index 20 next-address 10.2.0.1
explicit-path name PE1_VIA_P1
  index 10 next-address 10.3.0.1
  index 20 next-address 10.1.0.1

With the paths created, we can now move on to creating the tunnels themselves.

Step 6 – Creating the RSVP-TE Tunnel Interfaces

A tunnel manifests as an interface in IOS XR. There are various types of tunnels so we need to specify that we are creating a traffic engineering tunnel with the -te suffix. For Customer A’s traffic I’ll use the interface name tunnel-te100 and for Customer B I’ll use tunnel-te200. In interface configuration mode for the tunnel we will configure the IP Address, destination, explicit path, and bandwidth reservation requirement.

The tunnel interfaces will use the router’s loopback IP address. Tunnel 100 will reserve 50 Mbps for Customer A, while tunnel 200 will reserve 100 Mbps for Customer B.

All put together, the tunnel configurations are as follows:

!!! PE-1 !!!
interface tunnel-te100
  description Tunnel for Customer A L3VPN
  ipv4 unnumbered Loopback0
  destination 3.3.3.3

  path-option 10 explicit name PE2_VIA_P2

  bandwidth 50000
!
interface tunnel-te200
  description Tunnel for Customer B L3VPN
  ipv4 unnumbered Loopback0
  destination 3.3.3.3

  path-option 10 explicit name PE2_VIA_P1

  bandwidth 100000
!!! PE-2 !!!
interface tunnel-te100
  description Tunnel for Customer A L3VPN
  ipv4 unnumbered Loopback0
  destination 1.1.1.1

  path-option 10 explicit name PE1_VIA_P2

  bandwidth 50000
!
interface tunnel-te200
  description Tunnel for Customer B L3VPN
  ipv4 unnumbered Loopback0
  destination 1.1.1.1

  path-option 10 explicit name PE1_VIA_P1

  bandwidth 100000

We can quickly verify all four tunnels with one command on PE-1, show mpls traffic-eng tunnels brief:

IOS XR show mpls traffic-eng tunnels brief output confirming four RSVP-TE tunnels are established

The top two tunnels are the tunnels originating on PE-1 and the bottom two are the tunnels originating on PE-2.

In future labs, I’ll cover tunnel protection, alternate path options, and RSVP-TE failover behavior.

Next, we need to steer Customer A’s traffic into tunnel 100 and Customer B’s traffic into tunnel 200.

Step 7 – Steering Traffic into RSVP-TE Tunnels

There are a few different ways to implement per-VRF traffic steering on IOS XR. Typically for this scenario the best option is Service Path Preference (SPP). Service Path Preference is built specifically for traffic engineering L3VPN services. It uses a forward class attribute that can be applied to customer routes via route policies. Traffic will then flow through the tunnel with the matching forward class.

However, forward classes are not supported on IOS XRd. Therefore, we are going to use some creativity and leverage BGP Next-Hop Recursion to accomplish our goal. This means I’m going to install two artificial routes in the routing table, one pointing to each tunnel. Then, I’ll use a BGP import policy to make each VRF use a separate artificial route as its next-hop. Therefore, each VRF’s traffic will be steered into a separate tunnel.

I’ll use the following scheme for the static routes:

PrefixNext Hop
10.0.0.100 /32tunnel-te100
10.0.0.200 /32tunnel-te200

Then, I’ll create the following policies:

Policy NameBGP Next-HopApply to VRF
TE_TUNNEL_10010.0.0.100CUSTOMER_A
TE_TUNNEL_20010.0.0.200CUSTOMER_B

These policies will only affect traffic on the local router so we can use the exact same configuration on both PE routers. The full configuration is as follows:

!!!!! Create the static routes !!!!!
router static
 address-family ipv4 unicast
  10.0.0.100/32 tunnel-te100
  10.0.0.200/32 tunnel-te200

!!!!! Create the policies !!!!!
route-policy TE_TUNNEL_100
 set next-hop 10.0.0.100
 pass
end-policy
route-policy TE_TUNNEL_200
 set next-hop 10.0.0.200
 pass
end-policy

!!!!! Apply the policies !!!!!
vrf CUSTOMER_A
 address-family ipv4 unicast
  import route-policy TE_TUNNEL_100
vrf CUSTOMER_B
 address-family ipv4 unicast
  import route-policy TE_TUNNEL_200

Now, at this point I received the following error:

RP/0/RP0/CPU0:PE-1#RP/0/RP0/CPU0:Jul 25 16:57:05.170 UTC: bgp[1084]: %ROUTING-BGP-4-SAME_RD_SET : Ignored import policy set operation for same RD import on 2.2.2.2/32 path received from 3.3.3.3

This is IOS XR’s way of saying it doesn’t like the fact that we have the same RD on both PE routers. This exposes a major flaw in my Layer 3 VPN design. I should have designed it with per-PE route distinguishers from the start since they cannot be changed while the VRF is active. Unfortunately, this means that we now need to rebuild the VRF which would cause a service outage in the real world. This is the perfect example of why it is important to practice things in a lab environment first.

Anyway, here are the commands we need to run to fix this:

!!!!! PE-1 !!!!!

!!!!! Remove the Address Family !!!!!
vrf CUSTOMER_A
 no address-family ipv4 unicast
vrf CUSTOMER_B
 no address-family ipv4 unicast
router bgp 500
  vrf CUSTOMER_A
    no address-family ipv4 unicast
  vrf CUSTOMER_B
    no address-family ipv4 unicast
commit
end

!!!!! Change the RD !!!!!! 
config
vrf CUSTOMER_A
 no rd 
 rd 1.1.1.1:1
!
vrf CUSTOMER_B
 no rd 
 rd 1.1.1.1:2
!
commit

!!!!! Rebuild the Address Family !!!!!
vrf CUSTOMER_A
 address-family ipv4 unicast
  import route-policy TE_TUNNEL_100
  import route-target
   100:100
  !
  export route-target
   100:100
vrf CUSTOMER_B
 address-family ipv4 unicast
  import route-policy TE_TUNNEL_200
  import route-target
   200:200
  !
  export route-target
   200:200
router bgp 500
  vrf CUSTOMER_A
    address-family ipv4 unicast
      redistribute ospf CUSTOMER_A
  vrf CUSTOMER_B
    address-family ipv4 unicast
      redistribute ospf CUSTOMER_B
commit
!!!!! PE-2 !!!!!

!!!!! Remove the Address Family !!!!!
vrf CUSTOMER_A
 no address-family ipv4 unicast
vrf CUSTOMER_B
 no address-family ipv4 unicast
router bgp 500
  vrf CUSTOMER_A
    no address-family ipv4 unicast
  vrf CUSTOMER_B
    no address-family ipv4 unicast
commit
end

!!!!! Change the RD !!!!!! 
config
vrf CUSTOMER_A
 no rd 
 rd 3.3.3.3:1
!
vrf CUSTOMER_B
 no rd 
 rd 3.3.3.3:2
!
commit

!!!!! Rebuild the Address Family !!!!!
vrf CUSTOMER_A
 address-family ipv4 unicast
  import route-policy TE_TUNNEL_100
  import route-target
   100:100
  !
  export route-target
   100:100
vrf CUSTOMER_B
 address-family ipv4 unicast
  import route-policy TE_TUNNEL_200
  import route-target
   200:200
  !
  export route-target
   200:200
router bgp 500
  vrf CUSTOMER_A
    address-family ipv4 unicast
      redistribute ospf CUSTOMER_A
  vrf CUSTOMER_B
    address-family ipv4 unicast
      redistribute ospf CUSTOMER_B
commit

At this point, traffic steering should be implemented and our L3VPN traffic should be using the appropriate tunnels.

Step 8 – Verifying RSVP-TE and Traffic Steering

Let’s start by verifying that our BGP next-hop recursion is steering our traffic properly in the control plane. I’ll look at the routing tables to confirm that traffic is being routed to the RSVP tunnels.

IOS XR routing table showing Customer A BGP next-hop recursion into RSVP-TE tunnel 100
IOS XR routing table showing Customer B BGP next-hop recursion into RSVP-TE tunnel 200

BGP next-hop recursion is successfully steering Customer A traffic into tunnel 100 and Customer B traffic into tunnel 200.

Next, let’s verify that our tunnels appear in the MPLS forwarding table:

IOS XR MPLS forwarding table showing RSVP-TE tunnel 100 and tunnel 200 on PE-1
IOS XR MPLS forwarding table showing RSVP-TE tunnel 100 and tunnel 200 on PE-2

Keep an eye on the bytes switched counters. We’ll use them to verify that traffic is actually using the tunnels.

Next, I’ll run traceroutes across the Layer 3 VPN:

Traceroute across Customer A Layer 3 VPN showing traffic through P2 after RSVP-TE steering
Traceroute across Customer B Layer 3 VPN showing traffic through P1 after RSVP-TE steering

Customer A traffic is traveling through P2 at 10.2.0.2 and Customer B traffic is traveling through P1 at 10.1.0.2. This matches our intended traffic flow.

RSVP-TE MPLS Traffic Engineered Tunnel topology

Finally, let’s confirm that the byte counters increased from the traceroutes:

IOS XR MPLS forwarding counters showing increased bytes on RSVP-TE tunnels after traceroute traffic
IOS XR MPLS forwarding counters showing increased bytes on RSVP-TE tunnels after traceroute traffic

The bytes switched counters increased for both tunnels, confirming that traffic is using the traffic-engineered paths in the data plane.

Conclusion

In this lab, we used RSVP-TE to engineer separate paths through our MPLS core instead of allowing all customer traffic to follow the IS-IS best path through P1. We configured MPLS Traffic Engineering and RSVP, created explicit paths and TE tunnels, and used BGP next-hop recursion with VRF import route policies to steer each customer into the appropriate tunnel. We then verified that the tunnels were established and that each customer’s traffic was following the intended path through the core. This gives us more control over how customer traffic flows through the MPLS core while allowing bandwidth requirements to be considered during RSVP-TE tunnel establishment.

The complete lab.yaml file and router configuration files are available for download here: RSVP-TE_IOS_XRd.

Leave a Comment