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:

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:

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.