Skip to main content
  1. Network Articles/
  2. MPLS Articles/

What Is MPLS TE (RSVP-TE)

Table of Contents

What Is MPLS TE (RSVP-TE)

An IGP picks a single shortest path per destination and puts all traffic on it. In MPLS TE (Traffic Engineering), the tunnel ingress (head-end) decides the path and sets up labels along it. The path can be given explicitly by the operator or computed by the head-end. This article explains how it works, then uses an IOS XR (XRd) lab to see what the tunnel does when an explicit path breaks.

The three components

Component Role
IGP TE extensions Flood link attributes to every router. Each router keeps them as the TED (TE database)
Path decision The head-end checks an explicit path against the TED, or computes a path that meets the conditions with CSPF
RSVP-TE Signals along the chosen path and distributes labels

How CSPF chooses a path under constraints such as bandwidth and color is covered in MPLS TE CSPF and Path Constraints.

Choosing the path: path-option

A tunnel can have several numbered path-options. The head-end tries them in ascending order and moves to the next one when a path-option cannot be used.

Type Configuration Path
Explicit path path-option 10 explicit name <name> Follows the hops listed in explicit-path
Dynamic path path-option 20 dynamic Computed by CSPF (the same as the IGP when there are no constraints)

A typical setup uses 10 for the explicit path and 20 for the dynamic path, so the tunnel stays up with the dynamic path when the explicit path cannot be used.

strict and loose

Each hop of an explicit path is strict or loose. RSVP-TE carries them in the EXPLICIT_ROUTE (ERO) of the Path message: a subobject with the L bit set is loose, and one without it is strict (RFC 3209 section 4.3.3).

Type Meaning (section 4.3.3.1) Choosing the next hop (section 4.3.4)
strict No other node between it and the preceding node If not directly connected, return Bad strict node (SHOULD)
loose Other nodes may lie between it and the preceding node Pick a next hop on the path toward that node

The RFC lets transit nodes expand a loose segment. However, when the head-end’s TED holds the whole path (for example within one area), IOS XR computes the loose segment itself and sends an ERO made only of strict hops. The benefit of loose is that the head-end keeps room to choose the path again.

RSVP-TE signalling

Message Direction Main objects
Path head-end → tail-end EXPLICIT_ROUTE (ERO), LABEL_REQUEST
Resv tail-end → head-end LABEL, RECORD_ROUTE (the path actually taken)
PathErr Node that found the error → head-end ERROR_SPEC (error code, value and the reporting node)

RFC 3209 states that labels are allocated downstream and distributed upstream in Resv (section 1.1). Routing problems use Error Code 24 (Routing Problem): value 2 is Bad strict node, value 4 is Bad initial subobject, and value 5 is No route available toward destination (section 4.5).

Behavior on failure

When a link along an explicit path goes down, things proceed as follows.

  1. The node just before the failed link returns PathErr(24,5) (No route available toward destination) to the head-end
  2. The head-end drops the LSP and tries the path-options again in order. An explicit path made only of strict hops can only compute the same path, so the tunnel comes back on the next path-option (the dynamic path)
  3. An explicit path with a loose segment lets the head-end recompute that segment, so the tunnel comes back on the same path-option over a different route
  4. Either way the old LSP is already unusable, so the new LSP cannot be brought up before the old one is removed (make-before-break). The tunnel goes down once and is signalled again

When the link comes back, the tunnel does not return to the original path-option on its own, because the current LSP is working. It moves back at periodic reoptimization or on a manual mpls traffic-eng reoptimize, which is make-before-break and does not interrupt traffic.

How a path-option is changed matters too

Removing the path-option in use with no tears the LSP and the tunnel is signalled again. Overwriting the same path-option number is treated as reoptimization and moves with make-before-break.

verbatim

IOS XR normally checks an explicit path against the TED before sending it. If strict hops that are not directly connected are listed, the head-end cannot compute a path and no Path is sent. With verbatim the TED check is skipped and the Path is sent with the configured ERO. Which node rejects it, and with which error, is examined in the lab.

Lab topology

An upper path and a lower path joined by rungs, like a ladder. The core runs OSPF area 0 and LDP, and CE1 and CE2 attach to the PEs through VRF CUST-A. No TE constraints (bandwidth, color) are used.

Segment OSPF cost Role
Upper PE1 - P1 - P2 - PE2 10 ×3 = 30 IGP shortest path, used by the dynamic path
Lower PE1 - P3 - P4 - PE2 20 ×3 = 60 Used by the explicit path
Rungs P1 - P3 / P2 - P4 30 Detour for loose
Router Lo0 Role
PE1 2.2.2.2 head-end
P1 / P2 3.3.3.3 / 4.4.4.4 Upper path
P3 / P4 5.5.5.5 / 6.6.6.6 Lower path
PE2 7.7.7.7 tail-end
CE1 / CE2 1.1.1.1 / 8.8.8.8 AS 65101 / AS 65102

As the link along the explicit path, P3 - P4 is shut down on both ends. Before shutting it down, PE1 starts an LSP Ping through the tunnel (ping mpls traffic-eng tunnel-te 0, 600 probes at 100 ms intervals) to count the loss.

Overview of the test

STEP Change What it shows
0 Initial state (no tunnel) The IGP shortest path is the upper path
1 path-option 10 dynamic The upper path, same as the IGP. Path and Resv
2 Explicit path (lower path, all strict) as 10, dynamic as 20 Uses the lower path. The path-option in use was removed, so the tunnel is signalled again
3 Shut down P3 - P4 on both ends PathErr(24,5). Signalled again on path-option 20 (upper path)
4 Restore P3 - P4 and reoptimize manually Stays on 20 after restoration. Reoptimization returns it to 10 without interruption
5 Overwrite with an explicit path of strict P3 and loose PE2 The ERO is all strict. An overwrite, so no interruption
6 Shut down P3 - P4 on both ends again Signalled again over the rung on path-option 10
7 Restore and overwrite 10 with a non-adjacent strict hop (P2 after P3) The head-end rejects it and uses 20
8 Add verbatim to the same explicit path and reoptimize manually A Path is sent and a transit node returns an error
9 Remove everything (final state) Back to the STEP 0 state

The following sections are grouped by theme rather than by STEP.

Dynamic path and explicit path (STEP 1 and 2)

Configuration committed on PE1 in STEP 1
RP/0/RP0/CPU0:PE1#show configuration commit changes last 1
Sun Sep 13 12:26:25.806 UTC
!! Building configuration...
!! IOS XR Configuration 26.1.1
interface tunnel-te0
 ipv4 unnumbered Loopback0
 destination 7.7.7.7
 record-route
 path-option 10 dynamic
!
end
STEP 1 PE1 show mpls traffic-eng tunnels (path)
  Path info (OSPF 1 area 0):
  Hop0: 10.2.3.3
  Hop1: 10.3.4.4
  Hop2: 10.4.7.7
  Hop3: 7.7.7.7

The dynamic path is the upper path (P1 → P2), the same as the IGP. No.1078 in the capture between PE1 and P1 is the Path at this time.

STEP 1 No.1078 PATH (PE1 to PE2, tshark -V excerpt)
Internet Protocol Version 4, Src: 2.2.2.2, Dst: 7.7.7.7
        Message Type: PATH Message.  (1)
    EXPLICIT ROUTE: IPv4 10.2.3.3, IPv4 10.3.4.4, IPv4 10.4.7.7,
        IPv4 Subobject - 10.2.3.3, Strict
            0... .... = Hop: Strict Hop
        IPv4 Subobject - 10.3.4.4, Strict
            0... .... = Hop: Strict Hop
        IPv4 Subobject - 10.4.7.7, Strict
            0... .... = Hop: Strict Hop
        IPv4 Subobject - 7.7.7.7, Strict
            0... .... = Hop: Strict Hop
    LABEL REQUEST: Basic: L3PID: IPv4 (0x0800)
    RECORD ROUTE: IPv4 10.2.3.2
Download the pcap of the packet in the tshark output above (No.1078 PATH)

The ERO lists the path computed by the head-end as strict hops. The Resv that P1 returns right after (No.1079) carries the label pushed onto the tunnel.

STEP 1 No.1079 RESV (P1 to PE1, tshark -V excerpt)
Internet Protocol Version 4, Src: 10.2.3.3, Dst: 10.2.3.2
            Message Type: RESV Message.  (2)
        LABEL: 24010
            Label: 24010
        RECORD ROUTE: IPv4 10.2.3.3, IPv4 10.3.4.4, IPv4 10.4.7.7
Download the pcap of the packet in the tshark output above (No.1079 RESV)

In STEP 2, an explicit path listing the lower path as all strict hops became path-option 10, and the dynamic path moved to 20.

Configuration committed on PE1 in STEP 2
RP/0/RP0/CPU0:PE1#show configuration commit changes last 1
Sun Sep 13 12:34:12.096 UTC
!! Building configuration...
!! IOS XR Configuration 26.1.1
explicit-path name LOWER-STRICT
 index 10 next-address strict ipv4 unicast 10.2.5.5
 index 20 next-address strict ipv4 unicast 10.5.6.6
 index 30 next-address strict ipv4 unicast 10.6.7.7
!
interface tunnel-te0
 no path-option 10 dynamic
 path-option 10 explicit name LOWER-STRICT
 path-option 20 dynamic
!
end
STEP 2 PE1 show mpls traffic-eng tunnels (excerpt)
    path option 10,  type explicit LOWER-STRICT (Basis for Setup, path weight 60)
      Accumulative metrics: TE 60 IGP 60 Delay 900000 
      Accumulative biased metrics: TE 60 IGP 60 Delay 900000 
    path option 20,  type dynamic 
STEP 2 PE1 show mpls traffic-eng tunnels (excerpt)
  History:
    Tunnel has been up for: 00:03:55 (since Sun Sep 13 12:34:11 UTC 2026)
    Current LSP:
      Uptime: 00:03:55 (since Sun Sep 13 12:34:11 UTC 2026)
    Prior LSP:
      ID: 3 Path Option: 10
      Removal Trigger: path tear

  Path info (OSPF 1 area 0):
  Hop0: 10.2.5.5
  Hop1: 10.5.6.6
  Hop2: 10.6.7.7
  Hop3: 7.7.7.7

The tunnel moved to the lower path (P3 → P4) with the explicit path on path-option 10. However, Tunnel has been up for restarted at 12:34:11 and the previous LSP was removed by path tear. The path-option 10 dynamic in use was removed with no, so the tunnel went down once and was signalled again.

Link failure and restoration (STEP 3 and 4)

P3 - P4 along the explicit path is shut down on both ends.

Configuration committed on P3 in STEP 3
RP/0/RP0/CPU0:P3#show configuration commit changes last 1
Sun Sep 13 12:42:28.821 UTC
!! Building configuration...
!! IOS XR Configuration 26.1.1
interface GigabitEthernet0/0/0/1
 shutdown
!
end
Configuration committed on P4 in STEP 3
RP/0/RP0/CPU0:P4#show configuration commit changes last 1
Sun Sep 13 12:42:35.245 UTC
!! Building configuration...
!! IOS XR Configuration 26.1.1
interface GigabitEthernet0/0/0/0
 shutdown
!
end
STEP 3 PE1 show mpls traffic-eng tunnels (excerpt)
    path option 20,  type dynamic  (Basis for Setup, path weight 30)
      Accumulative metrics: TE 30 IGP 30 Delay 900000 
      Accumulative biased metrics: TE 30 IGP 30 Delay 900000 
    path option 10,  type explicit LOWER-STRICT
    Last PCALC Error: Sun Sep 13 12:42:27 2026
      Info: No path to destination, 7.7.7.7 (holdown)
    Last Signalled Error : Sun Sep 13 12:42:27 2026
      Info: [4] PathErr(24,5)-(Error: routing (24), Suberror: no route to dest (5)) at 10.5.6.5

P3 (10.5.6.5) returned PathErr(24,5), and the tunnel was signalled again on the dynamic path of path-option 20 (upper path). No.1354 between PE1 and P3 is that PathErr.

STEP 3 No.1354 PATH ERROR (P3 to PE1, tshark -V excerpt)
Internet Protocol Version 4, Src: 10.2.5.5, Dst: 10.2.5.2
            Message Type: PATH ERROR Message.  (3)
        ERROR: IPv4, Error code: Routing Error, Value: 5, Error Node: 10.5.6.5
            Error node: 10.5.6.5
            Error code: Routing Error (24)
            Error value: No route available toward destination (5)
Download the pcap of the packet in the tshark output above (No.1354 PATH ERROR)
STEP 3 PE1 show mpls traffic-eng tunnels (excerpt)
  History:
    Tunnel has been up for: 00:04:50 (since Sun Sep 13 12:42:28 UTC 2026)
    Current LSP:
      Uptime: 00:04:50 (since Sun Sep 13 12:42:28 UTC 2026)
    Prior LSP:
      ID: 4 Path Option: 10
      Removal Trigger: path error

  Path info (OSPF 1 area 0):
  Hop0: 10.2.3.3
  Hop1: 10.3.4.4
  Hop2: 10.4.7.7
  Hop3: 7.7.7.7

The previous LSP was removed by path error, and the tunnel restarted at 12:42:28. Of the LSP Ping probes sent across the link failure, only 1 of 600 was Q (request not sent).

STEP 3 PE1 ping mpls traffic-eng tunnel-te 0 (600 probes across the link failure)
RP/0/RP0/CPU0:PE1#ping mpls traffic-eng tunnel-te 0 repeat 600 interval 100 timeout 1

Sun Sep 13 12:42:16.245 UTC

Sending 600, 100-byte MPLS Echos to tunnel-te0,
      timeout is 1 seconds, send interval is 100 msec:

Codes: '!' - success, 'Q' - request not sent, '.' - timeout,
  'L' - labeled output interface, 'B' - unlabeled output interface, 
  'D' - DS Map mismatch, 'F' - no FEC mapping, 'f' - FEC mismatch,
  'M' - malformed request, 'm' - unsupported tlvs, 'N' - no rx label, 
  'P' - no rx intf label prot, 'p' - premature termination of LSP, 
  'R' - transit router, 'I' - unknown upstream index,
  'X' - unknown return code, 'x' - return code 0

Type escape sequence to abort.

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!Q!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Success rate is 99 percent (599/600), round-trip min/avg/max = 11/16/80 ms

In STEP 4 the link was restored, and the state was checked 90 seconds later.

STEP 4 PE1 show mpls traffic-eng tunnels 0 (90 seconds after restoration, excerpt)
    path option 20,  type dynamic  (Basis for Setup, path weight 30)
      Accumulative metrics: TE 30 IGP 30 Delay 900000 
      Accumulative biased metrics: TE 30 IGP 30 Delay 900000 
    path option 10,  type explicit LOWER-STRICT
    Last PCALC Error: Sun Sep 13 12:42:27 2026
      Info: No path to destination, 7.7.7.7 (holdown)
    Last Signalled Error : Sun Sep 13 12:42:27 2026
      Info: [4] PathErr(24,5)-(Error: routing (24), Suberror: no route to dest (5)) at 10.5.6.5
STEP 4 PE1 show mpls traffic-eng topology path (trial computation with the explicit path)
RP/0/RP0/CPU0:PE1#show mpls traffic-eng topology path destination 7.7.7.7 explicit-path name LOWER-STRICT

Sun Sep 13 12:53:18.708 UTC
Path Setup to 7.7.7.7: FULL_PATH
bw 0 (CT0), min_bw 1000000, metric: 60
Accumulated Metrics: TE: 60, IGP: 60, Delay: 900000
Accumulated Biased Metrics: TE: 60, IGP: 60, Delay: 900000
setup_pri 0, hold_pri 0
Affinity: 0x0/0x0
Biased-to explicit path: 
Node hop count 3
Hop0:10.2.5.5
Hop1:10.5.6.6
Hop2:10.6.7.7
Hop3:7.7.7.7

The explicit path can be computed, yet the tunnel stays on path-option 20. It was reoptimized manually.

STEP 4 PE1 manual reoptimization
RP/0/RP0/CPU0:PE1#mpls traffic-eng reoptimize 0

Sun Sep 13 12:53:22.034 UTC
STEP 4 PE1 show mpls traffic-eng tunnels 0 (after reoptimization, excerpt)
    path option 10,  type explicit LOWER-STRICT (Basis for Setup, path weight 60)
      Accumulative metrics: TE 60 IGP 60 Delay 900000 
      Accumulative biased metrics: TE 60 IGP 60 Delay 900000 
    Last Signalled Error : Sun Sep 13 12:42:27 2026
      Info: [4] PathErr(24,5)-(Error: routing (24), Suberror: no route to dest (5)) at 10.5.6.5
    path option 20,  type dynamic 
STEP 4 PE1 show mpls traffic-eng tunnels 0 (after reoptimization, excerpt)
    Tunnel has been up for: 00:11:57 (since Sun Sep 13 12:42:28 UTC 2026)
    Current LSP:
      Uptime: 00:01:03 (since Sun Sep 13 12:53:22 UTC 2026)
    Prior LSP:
      ID: 5 Path Option: 20
      Removal Trigger: reoptimization completed

  Path info (OSPF 1 area 0):
  Hop0: 10.2.5.5
  Hop1: 10.5.6.6
  Hop2: 10.6.7.7
  Hop3: 7.7.7.7

The tunnel is back on path-option 10. The LSP is new from 12:53:22, but Tunnel has been up for continues from 12:42:28, and the previous LSP was removed by reoptimization completed. It is make-before-break, so there is no interruption.

loose (STEP 5 and 6)

In STEP 5, path-option 10 was overwritten with an explicit path that has P3 as strict and PE2 as loose.

Configuration committed on PE1 in STEP 5
RP/0/RP0/CPU0:PE1#show configuration commit changes last 1
Sun Sep 13 13:02:07.695 UTC
!! Building configuration...
!! IOS XR Configuration 26.1.1
explicit-path name LOWER-LOOSE
 index 10 next-address strict ipv4 unicast 10.2.5.5
 index 20 next-address loose ipv4 unicast 7.7.7.7
!
interface tunnel-te0
 path-option 10 explicit name LOWER-LOOSE
!
end
STEP 5 PE1 show mpls traffic-eng tunnels detail (ERO sent, excerpt)
        Explicit Route:
          Strict, 10.2.5.5
          Strict, 10.5.6.6
          Strict, 10.6.7.7
          Strict, 7.7.7.7

Loose was configured, yet all four ERO entries are Strict. The head-end filled in the loose segment (from P3 to PE2). In the Path No.2380 between PE1 and P3, no subobject has the L bit either.

STEP 5 No.2380 PATH (PE1 to P3, tshark -V excerpt)
Internet Protocol Version 4, Src: 10.2.5.2, Dst: 10.2.5.5
            Message Type: PATH Message.  (1)
        EXPLICIT ROUTE: IPv4 10.2.5.5, IPv4 10.5.6.6, IPv4 10.6.7.7,
            IPv4 Subobject - 10.2.5.5, Strict
                0... .... = Hop: Strict Hop
            IPv4 Subobject - 10.5.6.6, Strict
                0... .... = Hop: Strict Hop
            IPv4 Subobject - 10.6.7.7, Strict
                0... .... = Hop: Strict Hop
            IPv4 Subobject - 7.7.7.7, Strict
                0... .... = Hop: Strict Hop
Download the pcap of the packet in the tshark output above (No.2380 PATH)
STEP 5 PE1 show mpls traffic-eng tunnels (excerpt)
  History:
    Tunnel has been up for: 00:23:56 (since Sun Sep 13 12:42:28 UTC 2026)
    Current LSP:
      Uptime: 00:04:18 (since Sun Sep 13 13:02:06 UTC 2026)
    Prior LSP:
      ID: 6 Path Option: 10
      Removal Trigger: reoptimization completed

  Path info (OSPF 1 area 0):
  Hop0: 10.2.5.5
  Hop1: 10.5.6.6
  Hop2: 10.6.7.7
  Hop3: 7.7.7.7

Because the same number was overwritten, the previous LSP was removed by reoptimization completed and the tunnel was not interrupted (unlike STEP 2).

In STEP 6, the same P3 - P4 was shut down on both ends again.

Configuration committed on P3 in STEP 6
RP/0/RP0/CPU0:P3#show configuration commit changes last 1
Sun Sep 13 13:10:41.073 UTC
!! Building configuration...
!! IOS XR Configuration 26.1.1
interface GigabitEthernet0/0/0/1
 shutdown
!
end
Configuration committed on P4 in STEP 6
RP/0/RP0/CPU0:P4#show configuration commit changes last 1
Sun Sep 13 13:10:47.680 UTC
!! Building configuration...
!! IOS XR Configuration 26.1.1
interface GigabitEthernet0/0/0/0
 shutdown
!
end
STEP 6 PE1 show mpls traffic-eng tunnels (excerpt)
    path option 10,  type explicit LOWER-LOOSE (Basis for Setup, path weight 70)
      Accumulative metrics: TE 70 IGP 70 Delay 1200000 
      Accumulative biased metrics: TE 70 IGP 70 Delay 1200000 
    Last Signalled Error : Sun Sep 13 13:10:40 2026
      Info: [7] PathErr(24,5)-(Error: routing (24), Suberror: no route to dest (5)) at 10.5.6.5
    path option 20,  type dynamic 
STEP 6 PE1 show mpls traffic-eng tunnels (excerpt)
  History:
    Tunnel has been up for: 00:05:00 (since Sun Sep 13 13:10:40 UTC 2026)
    Current LSP:
      Uptime: 00:05:00 (since Sun Sep 13 13:10:40 UTC 2026)
    Reopt. LSP:
      Last Failure:
        LSP not signalled, identical to the [CURRENT] LSP
        Date/Time: Sun Sep 13 13:12:42 UTC 2026 [00:02:58 ago]
    Prior LSP:
      ID: 7 Path Option: 10
      Removal Trigger: path error

  Path info (OSPF 1 area 0):
  Hop0: 10.2.5.5
  Hop1: 10.3.5.3
  Hop2: 10.3.4.4
  Hop3: 10.4.7.7
  Hop4: 7.7.7.7

P3 returned the same PathErr(24,5), but this time the tunnel was signalled again on path-option 10 over P3 → P1 (rung) → P2 → PE2 (path weight 70). This is the ERO of the Path right after re-signalling (No.2911).

STEP 6 No.2911 PATH (PE1 to P3, tshark -V excerpt)
Internet Protocol Version 4, Src: 10.2.5.2, Dst: 10.2.5.5
            Message Type: PATH Message.  (1)
        EXPLICIT ROUTE: IPv4 10.2.5.5, IPv4 10.3.5.3, IPv4 10.3.4.4, ...
            IPv4 Subobject - 10.2.5.5, Strict
                0... .... = Hop: Strict Hop
            IPv4 Subobject - 10.3.5.3, Strict
                0... .... = Hop: Strict Hop
            IPv4 Subobject - 10.3.4.4, Strict
                0... .... = Hop: Strict Hop
            IPv4 Subobject - 10.4.7.7, Strict
                0... .... = Hop: Strict Hop
            IPv4 Subobject - 7.7.7.7, Strict
                0... .... = Hop: Strict Hop
Download the pcap of the packet in the tshark output above (No.2911 PATH)

The detour was made by the head-end, not by P3. The tunnel went down once and restarted at 13:10:40, and 3 LSP Ping probes were lost.

STEP 6 PE1 ping mpls traffic-eng tunnel-te 0 (600 probes across the link failure)
RP/0/RP0/CPU0:PE1#ping mpls traffic-eng tunnel-te 0 repeat 600 interval 100 timeout 1

Sun Sep 13 13:10:28.100 UTC

Sending 600, 100-byte MPLS Echos to tunnel-te0,
      timeout is 1 seconds, send interval is 100 msec:

Codes: '!' - success, 'Q' - request not sent, '.' - timeout,
  'L' - labeled output interface, 'B' - unlabeled output interface, 
  'D' - DS Map mismatch, 'F' - no FEC mapping, 'f' - FEC mismatch,
  'M' - malformed request, 'm' - unsupported tlvs, 'N' - no rx label, 
  'P' - no rx intf label prot, 'p' - premature termination of LSP, 
  'R' - transit router, 'I' - unknown upstream index,
  'X' - unknown return code, 'x' - return code 0

Type escape sequence to abort.

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!NQQ!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Success rate is 99 percent (597/600), round-trip min/avg/max = 12/17/78 ms

Non-adjacent strict hops and verbatim (STEP 7 and 8)

In STEP 7 the link was restored, and path-option 10 was overwritten with an explicit path listing P2 (10.4.7.4), which is not directly connected, as a strict hop after P3.

Configuration committed on PE1 in STEP 7
RP/0/RP0/CPU0:PE1#show configuration commit changes last 1
Sun Sep 13 13:21:34.796 UTC
!! Building configuration...
!! IOS XR Configuration 26.1.1
explicit-path name BAD-STRICT
 index 10 next-address strict ipv4 unicast 10.2.5.5
 index 20 next-address strict ipv4 unicast 10.4.7.4
!
interface tunnel-te0
 path-option 10 explicit name BAD-STRICT
!
end
Configuration committed on P3 in STEP 7
RP/0/RP0/CPU0:P3#show configuration commit changes last 1
Sun Sep 13 13:19:51.183 UTC
!! Building configuration...
!! IOS XR Configuration 26.1.1
interface GigabitEthernet0/0/0/1
 no shutdown
!
end
Configuration committed on P4 in STEP 7
RP/0/RP0/CPU0:P4#show configuration commit changes last 1
Sun Sep 13 13:19:58.149 UTC
!! Building configuration...
!! IOS XR Configuration 26.1.1
interface GigabitEthernet0/0/0/0
 no shutdown
!
end
STEP 7 PE1 show mpls traffic-eng tunnels (excerpt)
    path option 20,  type dynamic  (Basis for Setup, path weight 30)
      Accumulative metrics: TE 30 IGP 30 Delay 900000 
      Accumulative biased metrics: TE 30 IGP 30 Delay 900000 
    path option 10,  type explicit BAD-STRICT
    Last PCALC Error [Reopt]: Sun Sep 13 13:21:34 2026
      Info: No path to destination, 7.7.7.7 (unknown, Flags: 0)
STEP 7 PE1 show mpls traffic-eng tunnels (excerpt)
  History:
    Tunnel has been up for: 00:16:11 (since Sun Sep 13 13:10:40 UTC 2026)
    Current LSP:
      Uptime: 00:05:17 (since Sun Sep 13 13:21:34 UTC 2026)
    Reopt. LSP:
      Last Failure:
        LSP not signalled, identical to the [CURRENT] LSP
        Date/Time: Sun Sep 13 13:12:42 UTC 2026 [00:14:09 ago]
    Prior LSP:
      ID: 8 Path Option: 10
      Removal Trigger: reoptimization completed

  Path info (OSPF 1 area 0):
  Hop0: 10.2.3.3
  Hop1: 10.3.4.4
  Hop2: 10.4.7.7
  Hop3: 7.7.7.7

The head-end could not compute a path (No path to destination) and moved to the upper path on path-option 20 with make-before-break. This Path never appeared on any link (the captures contain no RSVP packet with 10.4.7.4).

In STEP 8, verbatim was added to the same explicit path.

Configuration committed on PE1 in STEP 8
RP/0/RP0/CPU0:PE1#show configuration commit changes last 1
Sun Sep 13 13:31:00.996 UTC
!! Building configuration...
!! IOS XR Configuration 26.1.1
interface tunnel-te0
 path-option 10 explicit name BAD-STRICT verbatim
!
end
STEP 8 PE1 show mpls traffic-eng tunnels 0 detail (after the commit, excerpt)
    path option 20,  type dynamic  (Basis for Setup, path weight 30)
      Accumulative metrics: TE 30 IGP 30 Delay 900000 
      Accumulative biased metrics: TE 30 IGP 30 Delay 900000 
    path option 10, (verbatim) type explicit BAD-STRICT

Adding it alone does nothing. Path-option 20 is in use and meets the conditions, so there is no trigger for reoptimization. It was reoptimized manually.

STEP 8 PE1 manual reoptimization
RP/0/RP0/CPU0:PE1#mpls traffic-eng reoptimize 0

Sun Sep 13 13:33:31.946 UTC

PE1 sent the ERO as configured (No.4570 between PE1 and P3).

STEP 8 No.4570 PATH (PE1 to P3, tshark -V excerpt)
Internet Protocol Version 4, Src: 10.2.5.2, Dst: 10.2.5.5
            Message Type: PATH Message.  (1)
        EXPLICIT ROUTE: IPv4 10.2.5.5, IPv4 10.4.7.4
            IPv4 Subobject - 10.2.5.5, Strict
                0... .... = Hop: Strict Hop
            IPv4 Subobject - 10.4.7.4, Strict
                0... .... = Hop: Strict Hop
Download the pcap of the packet in the tshark output above (No.4570 PATH)

P3 did not return Bad strict node. It removed its own subobject and forwarded the Path to P4 along the IGP route (No.3686 between P3 and P4).

STEP 8 No.3686 PATH (P3 to P4, tshark -V excerpt)
Internet Protocol Version 4, Src: 2.2.2.2, Dst: 7.7.7.7
        Message Type: PATH Message.  (1)
    EXPLICIT ROUTE: IPv4 10.4.7.4
        IPv4 Subobject - 10.4.7.4, Strict
            0... .... = Hop: Strict Hop
    RECORD ROUTE: IPv4 10.5.6.5, IPv4 10.2.5.2
Download the pcap of the packet in the tshark output above (No.3686 PATH)

Since the first ERO entry was not itself, P4 returned Bad initial subobject (24,4) (No.3687).

STEP 8 No.3687 PATH ERROR (P4 to P3, tshark -V excerpt)
Internet Protocol Version 4, Src: 10.5.6.6, Dst: 10.5.6.5
            Message Type: PATH ERROR Message.  (3)
        ERROR: IPv4, Error code: Routing Error, Value: 4, Error Node: 10.5.6.6
            Error node: 10.5.6.6
            Error code: Routing Error (24)
            Error value: Bad initial subobject (4)
Download the pcap of the packet in the tshark output above (No.3687 PATH ERROR)
STEP 8 PE1 show mpls traffic-eng tunnels 0 detail (after reoptimization, excerpt)
    path option 20,  type dynamic  (Basis for Setup, path weight 30)
      Accumulative metrics: TE 30 IGP 30 Delay 900000 
      Accumulative biased metrics: TE 30 IGP 30 Delay 900000 
    path option 10, (verbatim) type explicit BAD-STRICT
    Last Signalled Error [Reopt] : Sun Sep 13 13:33:32 2026
      Info: [10] PathErr(24,4)-(Error: routing (24), Suberror: bad initial sub-obj (4)) at 10.5.6.6

Reoptimization failed, and the LSP on path-option 20 stayed as it was. RFC 3209 asks a node whose strict next hop is not directly connected to return Bad strict node (SHOULD), but in this IOS XR lab the rejection came from the next node, with value 4.

Results by STEP

STEP path-option used Path Tunnel re-signalled LSP Ping
1 10 (dynamic) Upper - -
2 10 (strict) Lower Yes (removed with no) -
3 20 (dynamic) Upper Yes (PathErr 24,5) 599/600
4 10 (strict) Lower No (reoptimization) -
5 10 (loose) Lower No (overwrite) -
6 10 (loose) P3 → P1 → P2 Yes (PathErr 24,5) 597/600
7 20 (dynamic) Upper No (reoptimization) -
8 20 (verbatim failed) Upper No -

Design notes

  • Always follow an explicit path with a dynamic path-option. An explicit path made only of strict hops becomes unusable when a link along it fails
  • With a loose hop, the tunnel can detour on the same path-option. Even so, on IOS XR the tunnel is signalled again once
  • The tunnel does not return to the original path after the failure is fixed. To move it back, use mpls traffic-eng reoptimize or wait for periodic reoptimization
  • Removing the path-option in use with no causes an interruption. To change it, overwrite the same number
  • verbatim skips the TED check. How the error appears depends on the implementation of the transit nodes, so use it only for segments that are not in the TED

Lab configuration and show outputs

In each STEP the following files were collected from all eight routers, one file per router. The lab configuration is the ..._run.txt (the final state is in the last STEP).

File Contents
..._show.txt show version / show route / show ospf database opaque-area / show mpls traffic-eng tunnels commands / show explicit-paths / show rsvp commands and more
..._log.txt show logging limited to that STEP
..._run.txt show running-config at that STEP (the lab configuration of that STEP)
..._ping.txt ping (50 packets, 1-second timeout) and traceroute in that STEP
..._oam.txt ping / traceroute mpls traffic-eng tunnel-te 0 and ping / traceroute mpls ipv4 (PE1 and PE2)
..._trace.txt show mpls traffic-eng trace head-end / link and show rsvp trace signalling (six core routers)
..._commit.cfg Only the configuration actually committed in that STEP, for the routers that changed
..._lspping.txt LSP Ping sent across the link failure in STEP 3 and 6 (PE1)
..._debug.txt show outputs and mpls traffic-eng reoptimize 0 taken on PE1 before and after reoptimization in STEP 4 and 8

STEP 0: Initial state (no tunnel)

Router show output syslog running-config ping OAM trace commit
CE1 show log run ping - - -
PE1 show log run ping oam trace -
P1 show log run ping - trace -
P2 show log run - - trace -
P3 show log run ping - trace -
P4 show log run - - trace -
PE2 show log run ping oam trace -
CE2 show log run ping - - -

STEP 1: path-option 10 dynamic

Router show output syslog running-config ping OAM trace commit
CE1 show log run ping - - -
PE1 show log run ping oam trace cfg
P1 show log run ping - trace -
P2 show log run - - trace -
P3 show log run ping - trace -
P4 show log run - - trace -
PE2 show log run ping oam trace -
CE2 show log run ping - - -

STEP 2: Explicit path (lower path, all strict) as 10, dynamic as 20

Router show output syslog running-config ping OAM trace commit
CE1 show log run ping - - -
PE1 show log run ping oam trace cfg
P1 show log run ping - trace -
P2 show log run - - trace -
P3 show log run ping - trace -
P4 show log run - - trace -
PE2 show log run ping oam trace -
CE2 show log run ping - - -

STEP 3: Shut down P3 - P4 on both ends

Router show output syslog running-config ping OAM trace commit
CE1 show log run ping - - -
PE1 show log run ping oam trace -
P1 show log run ping - trace -
P2 show log run - - trace -
P3 show log run ping - trace cfg
P4 show log run - - trace cfg
PE2 show log run ping oam trace -
CE2 show log run ping - - -

Additional PE1 records: LSP Ping

STEP 4: Restore P3 - P4 and reoptimize manually

Router show output syslog running-config ping OAM trace commit
CE1 show log run ping - - -
PE1 show log run ping oam trace -
P1 show log run ping - trace -
P2 show log run - - trace -
P3 show log run ping - trace cfg
P4 show log run - - trace cfg
PE2 show log run ping oam trace -
CE2 show log run ping - - -

Additional PE1 records: debug

STEP 5: Overwrite with an explicit path of strict P3 and loose PE2

Router show output syslog running-config ping OAM trace commit
CE1 show log run ping - - -
PE1 show log run ping oam trace cfg
P1 show log run ping - trace -
P2 show log run - - trace -
P3 show log run ping - trace -
P4 show log run - - trace -
PE2 show log run ping oam trace -
CE2 show log run ping - - -

STEP 6: Shut down P3 - P4 on both ends again

Router show output syslog running-config ping OAM trace commit
CE1 show log run ping - - -
PE1 show log run ping oam trace -
P1 show log run ping - trace -
P2 show log run - - trace -
P3 show log run ping - trace cfg
P4 show log run - - trace cfg
PE2 show log run ping oam trace -
CE2 show log run ping - - -

Additional PE1 records: LSP Ping

STEP 7: Restore and overwrite 10 with a non-adjacent strict hop (P2 after P3)

Router show output syslog running-config ping OAM trace commit
CE1 show log run ping - - -
PE1 show log run ping oam trace cfg
P1 show log run ping - trace -
P2 show log run - - trace -
P3 show log run ping - trace cfg
P4 show log run - - trace cfg
PE2 show log run ping oam trace -
CE2 show log run ping - - -

STEP 8: Add verbatim to the same explicit path and reoptimize manually

Router show output syslog running-config ping OAM trace commit
CE1 show log run ping - - -
PE1 show log run ping oam trace cfg
P1 show log run ping - trace -
P2 show log run - - trace -
P3 show log run ping - trace -
P4 show log run - - trace -
PE2 show log run ping oam trace -
CE2 show log run ping - - -

Additional PE1 records: debug

STEP 9: Remove everything (final state)

Router show output syslog running-config ping OAM trace commit
CE1 show log run ping - - -
PE1 show log run ping oam trace cfg
P1 show log run ping - trace -
P2 show log run - - trace -
P3 show log run ping - trace -
P4 show log run - - trace -
PE2 show log run ping oam trace -
CE2 show log run ping - - -

Full captures. They contain the RSVP and OSPF packets of all STEPs.

Download the full capture between PE1 and P1 (upper path)

Download the full capture between PE1 and P3 (lower path)

Download the full capture between P3 and P4 (the failed link)

Download the full capture between P1 and P3 (rung)

References

Source Sections used
RFC 3209 RSVP-TE: Extensions to RSVP for LSP Tunnels 1.1 (labels are distributed upstream in Resv), 2.5 (make-before-break), 4.3.3 and 4.3.3.1 (strict and loose, the L bit), 4.3.4 (ERO processing, Bad strict node), 4.5 (values of Error Code 24)

The behavior of path-options, the expansion of loose hops and the result of verbatim are observations on the lab router (XRd 26.1.1).