Segment Routing

SR is a network architecture similar to source routing. The ingress router attaches a list of segments, known as SIDs, to each packet as it enters the network.

The SID list explicitly defines the path the packet will follow. At each node, the router reads the first SID, executes its forwarding instruction, and typically removes it so the next node can process the subsequent SID.

SR relies on IGPs such as IS-IS or OSPF to advertise SIDs across the network.

Note

SR defines a control plane architecture and can be applied to existing MPLS-based data planes. In MPLS networks, segments are encoded as MPLS labels and applied at the ingress router. These labels are then distributed across the routing domain by IGPs such as IS-IS (as described in RFC 8667) or OSPF.

SR for the MPLS data plane supports IPv4, IPv6, and ECMP, and has been tested with Cisco and Juniper routers. However, this deployment is still experimental for FRR.

IS-IS SR configuration

Use the following commands to enable SR on IS-IS.

Known limitations:

  • No support for level redistribution (L1 to L2 or L2 to L1).

  • No support for BSID.

  • Only a single SRGB and the default SPF algorithm are supported.

set protocols isis segment-routing global-block high-label-value <16-1048575>

Configure the upper bound of the Segment Routing Global Block (SRGB).

The SRGB defines the range of MPLS labels reserved for mapping global segments, such as Prefix-SIDs, to FIB entries.

The range cannot exceed 65535 labels.

Example:

set protocols isis segment-routing global-block high-label-value 23999
set protocols isis segment-routing global-block low-label-value <16-1048575>

Configure the lower bound of the Segment Routing Global Block (SRGB).

The SRGB defines the range of MPLS labels reserved for mapping global segments, such as Prefix-SIDs, to FIB entries.

The range cannot exceed 65535 labels.

Example:

set protocols isis segment-routing global-block low-label-value 16000
set protocols isis segment-routing local-block high-label-value <16-1048575>

Configure the upper bound of the Segment Routing Local Block (SRLB).

The SRLB defines the range of MPLS labels that a router reserves for its local segments, such as Adjacency-SIDs.

The range cannot exceed 65535 labels.

Example:

set protocols isis segment-routing local-block high-label-value 15999
set protocols isis segment-routing local-block low-label-value <16-1048575>

Configure the lower bound of the Segment Routing Local Block (SRLB).

The SRLB defines the range of MPLS labels that a router reserves for its local segments, such as Adjacency-SIDs.

The range cannot exceed 65535 labels.

Example:

set protocols isis segment-routing local-block low-label-value 15000

Note

SR label blocks have the following configuration constraints:

  • Both bounds (high-label-value and low-label-value) must be set. Removing either bound also removes the other.

  • local-block requires global-block to be configured.

  • The SRGB and SRLB ranges must not overlap.

Violating any of these causes the commit to fail.

set protocols isis segment-routing maximum-label-depth <1-16>

Configure the MSD supported by the router.

The value depends on the MPLS data plane.

Example:

set protocols isis segment-routing maximum-label-depth 10
set protocols isis segment-routing prefix <address> index value <0-65535>

Configure a Prefix-SID with an index value for the specified IP prefix.

A Prefix-SID is a Segment Identifier associated with an IP prefix and distributed by the IGP (IS-IS).

Example:

set protocols isis segment-routing prefix 192.0.2.1/32 index value 1
set protocols isis segment-routing prefix <address> index <no-php-flag | explicit-null>

Configure a label processing flag for the indexed Prefix-SID associated with the specified IP prefix:

  • no-php-flag: Requests the upstream neighbor not to pop the Prefix-SID label before forwarding the packet.

  • explicit-null: Requests that the upstream neighbor forwards the packet with the Explicit-Null label.

Example:

set protocols isis segment-routing prefix 192.0.2.1/32 index no-php-flag
set protocols isis segment-routing prefix <address> absolute value <16-1048575>

Configure a Prefix-SID with an absolute value for the specified IP prefix

A Prefix-SID is a Segment Identifier associated with an IP prefix and distributed by the IGP (IS-IS).

Example:

set protocols isis segment-routing prefix 192.0.2.1/32 absolute value 16001
set protocols isis segment-routing prefix <address> absolute <no-php-flag | explicit-null>

Configure a label processing flag for the absolute Prefix-SID associated with the specified IP prefix:

  • no-php-flag: Requests the upstream neighbor not to pop the Prefix-SID label before forwarding the packet.

  • explicit-null: Requests that the upstream neighbor forwards the packet with the Explicit-Null label.

Example:

set protocols isis segment-routing prefix 192.0.2.1/32 absolute no-php-flag

Operational commands

show isis segment-routing node

Show all learned SR nodes.

show isis route prefix-sid

Show all learned Prefix-SIDs and their MPLS labels.

Note

For more information, see isis.

OSPF SR configuration

Use the following commands to enable SR on OSPF.

set protocols ospf parameters opaque-lsa

Enable Opaque LSA (RFC 2370) in OSPF.

Opaque LSAs are required to transport MPLS labels via OSPF.

Example:

set protocols ospf parameters opaque-lsa
set protocols ospf segment-routing global-block high-label-value <16-1048575>

Configure the upper bound of the Segment Routing Global Block (SRGB).

The SRGB defines the range of MPLS labels reserved for mapping Prefix-SIDs to FIB entries.

The range cannot exceed 65535 labels.

Example:

set protocols ospf segment-routing global-block high-label-value 23999
set protocols ospf segment-routing global-block low-label-value <16-1048575>

Configure the lower bound of the Segment Routing Global Block (SRGB).

The SRGB defines the range of MPLS labels reserved for mapping Prefix-SIDs to FIB entries.

The range cannot exceed 65535 labels.

Example:

set protocols ospf segment-routing global-block low-label-value 16000
set protocols ospf segment-routing local-block high-label-value <16-1048575>

Configure the upper bound of the Segment Routing Local Block (SRLB).

The SRLB defines the range of MPLS labels that a router reserves for its local segments, such as Adjacency-SIDs.

The range cannot exceed 65535 labels.

Example:

set protocols ospf segment-routing local-block high-label-value 15999
set protocols ospf segment-routing local-block low-label-value <16-1048575>

Configure the lower bound of the Segment Routing Local Block (SRLB).

The SRLB defines the range of MPLS labels that a router reserves for its local segments, such as Adjacency-SIDs.

The range cannot exceed 65535 labels.

Example:

set protocols ospf segment-routing local-block low-label-value 15000

Note

SR label blocks have the following configuration constraints:

  • Both bounds (high-label-value and low-label-value) must be set. Removing either bound also removes the other.

  • local-block requires global-block to be configured.

  • The SRGB and SRLB ranges must not overlap.

Violating any of these causes the commit to fail.

set protocols ospf segment-routing maximum-label-depth <1-16>

Configure the MSD supported by the router.

The value depends on the MPLS data plane.

Example:

set protocols ospf segment-routing maximum-label-depth 10
set protocols ospf segment-routing prefix <address> index value <0-65535>

Configure a Prefix-SID for the specified IP prefix.

A Prefix-SID is a Segment Identifier associated with an IP prefix and distributed by the IGP (OSPF).

Prefix-SIDs are unique within an SR domain.

Example:

set protocols ospf segment-routing prefix 192.0.2.1/32 index value 1
set protocols ospf segment-routing prefix <address> index <no-php-flag | explicit-null>

Configure a label processing flag for the Prefix-SID associated with the specified IP prefix:

  • no-php-flag: Requests the upstream neighbor not to pop the Prefix-SID label before forwarding the packet.

  • explicit-null: Requests that the upstream neighbor forwards the packet with the Explicit-Null label.

Example:

set protocols ospf segment-routing prefix 192.0.2.1/32 index no-php-flag

Note

For more information, see ospf.

Examples

Enable SR on IS-IS (experimental)

The following example demonstrates a basic two-node SR topology using IS-IS.

Node 1:

set interfaces loopback lo address '198.51.100.1/32'
set interfaces ethernet eth1 address '192.0.2.1/24'

set protocols isis interface eth1
set protocols isis interface lo
set protocols isis net '49.0001.1980.5110.0001.00'
set protocols isis segment-routing global-block high-label-value '599'
set protocols isis segment-routing global-block low-label-value '550'
set protocols isis segment-routing prefix 198.51.100.1/32 index value '1'
set protocols isis segment-routing prefix 198.51.100.1/32 index explicit-null
set protocols mpls interface 'eth1'

Node 2:

set interfaces loopback lo address '198.51.100.2/32'
set interfaces ethernet eth1 address '192.0.2.2/24'

set protocols isis interface eth1
set protocols isis interface lo
set protocols isis net '49.0001.1980.5110.0002.00'
set protocols isis segment-routing global-block high-label-value '599'
set protocols isis segment-routing global-block low-label-value '550'
set protocols isis segment-routing prefix 198.51.100.2/32 index value '2'
set protocols isis segment-routing prefix 198.51.100.2/32 index explicit-null
set protocols mpls interface 'eth1'

The following outputs show that MPLS Segment Routing is enabled and that each router has learned MPLS labels for the other router’s loopback:

Node-1@vyos:~$ show mpls table
 Inbound Label  Type        Nexthop                Outbound Label
 ----------------------------------------------------------------------
 552            SR (IS-IS)  192.0.2.2              IPv4 Explicit Null     <-- Node-2 loopback learned on Node-1
 15000          SR (IS-IS)  192.0.2.2              implicit-null
 15001          SR (IS-IS)  fe80::e87:6cff:fe09:1  implicit-null
 15002          SR (IS-IS)  192.0.2.2              implicit-null
 15003          SR (IS-IS)  fe80::e87:6cff:fe09:1  implicit-null
Node-2@vyos:~$ show mpls table
 Inbound Label  Type        Nexthop               Outbound Label
 ---------------------------------------------------------------------
 551            SR (IS-IS)  192.0.2.1             IPv4 Explicit Null     <-- Node-1 loopback learned on Node-2
 15000          SR (IS-IS)  192.0.2.1             implicit-null
 15001          SR (IS-IS)  fe80::e33:2ff:fe80:1  implicit-null
 15002          SR (IS-IS)  192.0.2.1             implicit-null
 15003          SR (IS-IS)  fe80::e33:2ff:fe80:1  implicit-null

The following outputs show MPLS Segment Routing label assignments for IP routes:

Node-1@vyos:~$ show ip route isis
Codes: K - kernel route, C - connected, S - static, R - RIP,
       O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP,
       T - Table, v - VNC, V - VNC-Direct, A - Babel, F - PBR,
       f - OpenFabric,
       > - selected route, * - FIB route, q - queued, r - rejected, b - backup
       t - trapped, o - offload failure

I   192.0.2.0/24 [115/20] via 192.0.2.2, eth1 inactive, weight 1, 00:07:48
I>* 198.51.100.2/32 [115/20] via 192.0.2.2, eth1, label IPv4 Explicit Null, weight 1, 00:03:39
Node-2@vyos:~$ show ip route isis
Codes: K - kernel route, C - connected, S - static, R - RIP,
       O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP,
       T - Table, v - VNC, V - VNC-Direct, A - Babel, F - PBR,
       f - OpenFabric,
       > - selected route, * - FIB route, q - queued, r - rejected, b - backup
       t - trapped, o - offload failure

I   192.0.2.0/24 [115/20] via 192.0.2.1, eth1 inactive, weight 1, 00:07:46
I>* 198.51.100.1/32 [115/20] via 192.0.2.1, eth1, label IPv4 Explicit Null, weight 1, 00:03:43

Enable SR on OSPF (experimental)

The following example demonstrates a basic two-node SR topology using OSPF.

Node 1:

set interfaces loopback lo address 198.51.100.1/32
set interfaces ethernet eth0 address 192.0.2.1/24
set protocols ospf area 0 network '192.0.2.0/24'
set protocols ospf area 0 network '198.51.100.1/32'
set protocols ospf parameters opaque-lsa
set protocols ospf parameters router-id '198.51.100.1'
set protocols ospf segment-routing global-block high-label-value '1100'
set protocols ospf segment-routing global-block low-label-value '1000'
set protocols ospf segment-routing prefix 198.51.100.1/32 index explicit-null
set protocols ospf segment-routing prefix 198.51.100.1/32 index value '1'

Node 2:

set interfaces loopback lo address 198.51.100.2/32
set interfaces ethernet eth0 address 192.0.2.2/24
set protocols ospf area 0 network '192.0.2.0/24'
set protocols ospf area 0 network '198.51.100.2/32'
set protocols ospf parameters opaque-lsa
set protocols ospf parameters router-id '198.51.100.2'
set protocols ospf segment-routing global-block high-label-value '1100'
set protocols ospf segment-routing global-block low-label-value '1000'
set protocols ospf segment-routing prefix 198.51.100.2/32 index explicit-null
set protocols ospf segment-routing prefix 198.51.100.2/32 index value '2'

The following outputs show MPLS Segment Routing label assignments:

Node-1@vyos:~$ show mpls table
 Inbound Label  Type       Nexthop      Outbound Label
 -----------------------------------------------------------
 1002           SR (OSPF)  192.0.2.2    IPv4 Explicit Null  <-- Node-2 loopback learned on Node-1
 15000          SR (OSPF)  192.0.2.2    implicit-null
 15001          SR (OSPF)  192.0.2.2    implicit-null
Node-2@vyos:~$ show mpls table
 Inbound Label  Type       Nexthop      Outbound Label
 -----------------------------------------------------------
 1001           SR (OSPF)  192.0.2.1    IPv4 Explicit Null  <-- Node-1 loopback learned on Node-2
 15000          SR (OSPF)  192.0.2.1    implicit-null
 15001          SR (OSPF)  192.0.2.1    implicit-null

The following outputs show MPLS Segment Routing label assignments for IP routes:

Node-1@vyos:~$ show ip route ospf
Codes: K - kernel route, C - connected, S - static, R - RIP,
       O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP,
       T - Table, v - VNC, V - VNC-Direct, A - Babel, F - PBR,
       f - OpenFabric,
       > - selected route, * - FIB route, q - queued, r - rejected, b - backup
       t - trapped, o - offload failure

O   198.51.100.1/32 [110/0] is directly connected, lo, weight 1, 00:03:43
O>* 198.51.100.2/32 [110/1] via 192.0.2.2, eth0, label IPv4 Explicit Null, weight 1, 00:03:32
O   192.0.2.0/24 [110/1] is directly connected, eth0, weight 1, 00:03:43
Node-2@vyos:~$ show ip route ospf
Codes: K - kernel route, C - connected, S - static, R - RIP,
       O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP,
       T - Table, v - VNC, V - VNC-Direct, A - Babel, F - PBR,
       f - OpenFabric,
       > - selected route, * - FIB route, q - queued, r - rejected, b - backup
       t - trapped, o - offload failure

O>* 198.51.100.1/32 [110/1] via 192.0.2.1, eth0, label IPv4 Explicit Null, weight 1, 00:03:36
O   198.51.100.2/32 [110/0] is directly connected, lo, weight 1, 00:03:51
O   192.0.2.0/24 [110/1] is directly connected, eth0, weight 1, 00:03:51