Traffic sent across RSVP-signaled LSPs without any additional configuration is susceptible to quite some down-time when a node or a link in the network fails. In a previous article here, I made an LSP more robust by configuring a primary and a secondary LSP. Let’s further enhance the LSP by configuring and verifying fast-reroute (FRR).

Our starting position is an LSP from Tiberius to Commodus:

FRR

The LSP already has a primary and a secondary path. Let’s look at the current MPLS configuration:

play@MX480-TEST:Tiberius> show configuration protocols mpls
revert-timer 0;
label-switched-path to_Commodus {
    to 1.1.1.4;
    ldp-tunneling;
    primary via_Hadrian;
    secondary via_Romulus {
        standby;
    }
}
path via_Romulus {
    1.1.1.6 strict;
}
path via_Hadrian {
    1.1.1.10 strict;
}
interface xe-0/2/0.9;
interface xe-0/2/0.3;                    

Configuring FRR is nothing more than adding the following statement to the label-switched-path on the ingress router (Tiberius):

set protocols mpls label-switched-path to_Commodus fast-reroute                    

This will make the ingress LSR add an object to the RSVP path messages that it sends out. Through this object, it is basically requesting all transit LSRs encountered along the LSP to try and signal for detours. Imagine that the link between Nero and Septimus breaks:

FRR

As soon as Nero sees that the link is broken, it will do two things. Nero will send a PathErr message to the ingress LSR (Tiberius). Additionally, since the LSP is now broken, the Nero router will immediately start using the detour (red line). This way, it can still deliver traffic that is currently being received across the LSP. This as opposed to black holing it.

The nice thing is that these detours are available immediately. The bad thing is that they can serve only 1 LSP. Every LSP configured for FRR will have transit routers signal their own and individual detour LSPs.

Back to the example, let’s verify that the LSP is now configured for FRR:

play@MX480-TEST:Tiberius> show mpls lsp name to_Commodus detail
Ingress LSP: 1 sessions

1.1.1.4
  From: 1.1.1.9, State: Up, ActiveRoute: 0, LSPname: to_Commodus
  ActivePath: via_Hadrian (primary)
  FastReroute desired
  LSPtype: Static Configured, Penultimate hop popping
  LoadBalance: Random
  Encoding type: Packet, Switching type: Packet, GPID: IPv4
  Revert timer: 0
 *Primary   via_Hadrian      State: Up
    Priorities: 7 0
    SmartOptimizeTimer: 180
    Computed ERO (S [L] denotes strict [loose] hops): (CSPF metric: 40)
 2.0.0.33 S 2.0.0.42 S 2.0.0.66 S 2.0.0.21 S
    Received RRO (ProtectionFlag 1=Available 2=InUse 4=B/W 8=Node 10=SoftPreempt 20=Node-ID):
          2.0.0.33(flag=9) 2.0.0.42(flag=9) 2.0.0.66(flag=1) 2.0.0.21
  Standby   via_Romulus      State: Up
    Priorities: 7 0
    SmartOptimizeTimer: 180
    Computed ERO (S [L] denotes strict [loose] hops): (CSPF metric: 40)
 2.0.0.9 S 2.0.0.49 S 2.0.0.57 S 2.0.0.54 S
    Received RRO (ProtectionFlag 1=Available 2=InUse 4=B/W 8=Node 10=SoftPreempt 20=Node-ID):
          2.0.0.9(flag=9) 2.0.0.49(flag=9) 2.0.0.57(flag=1) 2.0.0.54
Total 1 displayed, Up 1, Down 0                    

The previous command is an indication that the ingress LSR, Tiberius, is indicating to other routers that this path should be protected by FRR. The other routers, as long as they understand the RSVP object for FRR and as long as the topology permits them, will now seek to establish detours.

The fact that FRR was requested is also visible on the transit LSRs. Let’s look at the LSPs primary path on the Nero router:

play@MX480-TEST:Nero> show rsvp session transit name to_Commodus detail
Transit RSVP: 6 sessions, 1 detours

1.1.1.4
  From: 1.1.1.9, LSPstate: Up, ActiveRoute: 0
  LSPname: to_Commodus, LSPpath: Primary
  Suggested label received: -, Suggested label sent: -
  Recovery label received: -, Recovery label sent: 300352
  Resv style: 1 FF, Label in: 302112, Label out: 300352
  Time left:  122, Since: Wed May 13 23:29:49 2015
  Tspec: rate 0bps size 0bps peak Infbps m 20 M 1500
  Port number: sender 5 receiver 12470 protocol 0
  FastReroute desired
  PATH rcvfrom: 2.0.0.41 (xe-0/2/0.11) 12 pkts
  Adspec: received MTU 1500 sent MTU 1500
  PATH sentto: 2.0.0.66 (xe-0/3/0.17) 6 pkts
  RESV rcvfrom: 2.0.0.66 (xe-0/3/0.17) 3 pkts
  Explct route: 2.0.0.66 2.0.0.21
  Record route: 2.0.0.34 2.0.0.41 <self> 2.0.0.66 2.0.0.21
    Detour is Up
    Detour Tspec: rate 0bps size 0bps peak Infbps m 20 M 1500
    Detour adspec: received MTU 1500 sent MTU 1500
    Path MTU: received 1500
    Detour PATH sentto: 2.0.0.45 (xe-0/2/0.12) 5 pkts
    Detour RESV rcvfrom: 2.0.0.45 (xe-0/2/0.12) 2 pkts
    Detour Explct route: 2.0.0.45 2.0.0.57 2.0.0.54
    Detour Record route: 2.0.0.34 2.0.0.41 <self> 2.0.0.45 2.0.0.57 2.0.0.54
    Detour Label out: 300848                    

FRR was requested and a detour was granted. The ‘Detour Explct route’ part is the physical path that the detour takes. These IP addresses belong to Augustus, Caligula and Commodus. So in this case, the detour will skip the Septimus node completely.

The detour LSP is pre-signaled, so in this case, we will be able to see the detour LSP on the Augustus router as well:

play@MX480-TEST:Augustus> show rsvp session transit name to_Commodus detail
Transit RSVP: 6 sessions, 1 detours

1.1.1.4
  From: 1.1.1.9, LSPstate: Up, ActiveRoute: 0
  LSPname: to_Commodus, LSPpath: Primary
  Suggested label received: -, Suggested label sent: -
  Recovery label received: -, Recovery label sent: 301472
  Resv style: 1 FF, Label in: 300864, Label out: 301472
  Time left:  123, Since: Wed May 13 23:29:52 2015
  Tspec: rate 0bps size 0bps peak Infbps m 20 M 1500
  Port number: sender 5 receiver 12470 protocol 0
  Detour branch from 2.0.0.37, to skip 1.1.1.11, Up
    Tspec: rate 0bps size 0bps peak Infbps m 20 M 1500
    Adspec: received MTU 1500
    Path MTU: received 0
    PATH rcvfrom: 2.0.0.50 (xe-0/3/0.13) 9 pkts
    Adspec: received MTU 1500 sent MTU 1500
    PATH sentto: 2.0.0.57 (xe-0/2/0.15) 1 pkts
    RESV rcvfrom: 2.0.0.57 (xe-0/2/0.15) 3 pkts
    Explct route: 2.0.0.57 2.0.0.54
    Record route: 2.0.0.34 2.0.0.37 2.0.0.50 <self> 2.0.0.57 2.0.0.54
    Label in: 300864, Label out: 301472
  Detour branch from 2.0.0.46, to skip 1.1.1.12, Up
    Tspec: rate 0bps size 0bps peak Infbps m 20 M 1500
    Adspec: received MTU 1500
    Path MTU: received 0
    PATH rcvfrom: 2.0.0.46 (xe-0/3/0.12) 12 pkts
    Adspec: received MTU 1500
    PATH sentto: 2.0.0.57 (xe-0/2/0.15) 0 pkts
    RESV rcvfrom: 2.0.0.57 (xe-0/2/0.15) 0 pkts
    Explct route: 2.0.0.57 2.0.0.54
    Record route: 2.0.0.34 2.0.0.41 2.0.0.46 <self> 2.0.0.57 2.0.0.54
    Label in: 300848, Label out: 301472                    

As soon as Nero detect a problem, it can immediately start using the detour label and the Augustus node will know what to do with it.

FRR is extremely easy to configure, but the main caveat is the lack of scalability. Every LSR will need signal a detour for all the LSPs that transit the router. In this scenario, FRR is requested for both the primary and the secondary route. Since all but the egress LSR can generate a detour, this single LSP will lead to about 6 or so detours. Imagine activating FRR for 500 LSPs in a larger network with far more transit LSRs per LSP. Better get into link-protection and node-link-protection fast if you have a big network.