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.
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
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
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
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-valueandlow-label-value) must be set. Removing either bound also removes the other.local-blockrequiresglobal-blockto be configured.The SRGB and SRLB ranges must not overlap.
Violating any of these causes the commit to fail.
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
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
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
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
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
Note
For more information, see isis.
OSPF SR configuration
Use the following commands to enable SR on OSPF.
Enable Opaque LSA (RFC 2370) in OSPF.
Opaque LSAs are required to transport MPLS labels via OSPF.
Example:
set protocols ospf parameters opaque-lsa
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
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
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
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-valueandlow-label-value) must be set. Removing either bound also removes the other.local-blockrequiresglobal-blockto be configured.The SRGB and SRLB ranges must not overlap.
Violating any of these causes the commit to fail.
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
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
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