Segment Routing Basic Configuration

Segment Routing is as of mid 2017 available on multiple vendors service provider routing platforms (Cisco, Juniper, Nokia, Arista). In this post I’m going to show how to configure MPLS Segment Routing in Cisco IOS XR as well as take a closer look at the adjacency and prefix segments.

Topology

The example topology consist of six XRv routers with IP addresses configured as seen in the figure above.

IGP configuration

IGP segments are the most fundamental segment types in Segment Routing. They are used in SR domain to forward traffic to destination through IGP calculated shortest path or through certain nodes/links. As the name implies, these segments are distributed by IGP (link-state IGP to be precise).

I’m using IS-IS in this example but OSPF could also be used. Here is IS-IS configuration from XRv-1:

router isis 1
 is-type level-2-only
 net 49.0001.0001.0001.1001.00
 address-family ipv4 unicast
  metric-style wide
  segment-routing mpls
 !
 interface Loopback0
  passive
  address-family ipv4 unicast
  !
 !
 interface GigabitEthernet0/0/0/1
  point-to-point
  address-family ipv4 unicast
  !
 !
 interface GigabitEthernet0/0/0/2
  point-to-point
  address-family ipv4 unicast
  !
 !
!

All the other routers have similar configuration. IS-IS is enabled on connecting interfaces as well as on loopbacks. Only level-2 adjacencies are enable for simplicity.

The key command here is the segment-routing mpls which enables Segment Routing in all IS-IS interfaces for IPv4 address family. The router also starts advertising local adjacency and prefix segments to its neighbors.

Adjacency Segments

Let’s take a look at adjacency segments first. Adjacency segments are local to each router and represent IGP adjacencies to other routers. When router receives packet with adjacency-SID as the top label, it pops the label and forwards the packet over a link that the adjacency is attached.

The adjacency-SIDs can be verified by show isis adjacency detail command:

RP/0/0/CPU0:XRv-1#show isis adjacency detail

IS-IS 1 Level-2 adjacencies:
System Id      Interface        SNPA           State Hold Changed  NSF IPv4 IPv6
                                                                       BFD  BFD
XRv-2          Gi0/0/0/1        *PtoP*         Up    27   00:01:58 Yes None None
  Area Address:           49.0001
  Neighbor IPv4 Address:  172.16.1.2*
  Adjacency SID:          24002
  Non-FRR Adjacency SID:  24003
  Topology:               IPv4 Unicast
XRv-3          Gi0/0/0/2        *PtoP*         Up    26   00:01:55 Yes None None
  Area Address:           49.0001
  Neighbor IPv4 Address:  172.16.2.2*
  Adjacency SID:          24000
  Non-FRR Adjacency SID:  24001
  Topology:               IPv4 Unicast

Here we can see that XRv-1 has allocated two SIDs for each of its IS-IS adjacencies: protected and non-protected. The protected adjacency-SID is used for fast reroute mechanisms such as TI-LFA.

Adjacency-SIDs can also be verified from IS-IS LSDB:

RP/0/0/CPU0:XRv-1#show isis database verbose XRv-1

IS-IS 1 (Level-2) Link State Database
LSPID                 LSP Seq Num  LSP Checksum  LSP Holdtime  ATT/P/OL
XRv-1.00-00         * 0x0000000a   0xd6f8        918             0/0/0
  Area Address:   49.0001
  NLPID:          0xcc
  Hostname:       XRv-1
  IP Address:     1.1.1.1
  Router Cap:     1.1.1.1, D:0, S:0
    Segment Routing: I:1 V:0, SRGB Base: 16000 Range: 8000
  Metric: 10         IS-Extended XRv-2.00
    Interface IP Address: 172.16.1.1
    Neighbor IP Address: 172.16.1.2
    ADJ-SID: F:0 B:1 V:1 L:1 S:0 weight:0 Adjacency-sid:24002
    ADJ-SID: F:0 B:0 V:1 L:1 S:0 weight:0 Adjacency-sid:24003
  Metric: 10         IS-Extended XRv-3.00
    Interface IP Address: 172.16.2.1
    Neighbor IP Address: 172.16.2.2
    ADJ-SID: F:0 B:1 V:1 L:1 S:0 weight:0 Adjacency-sid:24000
    ADJ-SID: F:0 B:0 V:1 L:1 S:0 weight:0 Adjacency-sid:24001
  Metric: 0          IP-Extended 1.1.1.1/32
  Metric: 10         IP-Extended 172.16.1.0/24
  Metric: 10         IP-Extended 172.16.2.0/24

Here is a snippet from packet capture of IS-IS Link-state PDU advertised by Xrv-1:

SR-adj-sid-capture

Ajacency-SIDs are advertised using Extended IS reachability TLV and Adj-SID sub-TLV. The Adj-SID sub-TLV consist of flags, weight and the SID value.

Encapsulation flag specifies address family of the outgoing encapsulation.
Backup flag indicates that the SID is eligible for protection (for FRR as mentioned above). Value flag is set if the SID is an absolute value and not index. Set-flag indicates if the SID refers to a set of multiple adjacencies.
Local Significance flag indicates that this SID value is locally significant to the advertising node.
Set flag is set when SID refers to a set of multiple adjacencies.

Weight value is used for load balancing between multiple adjacencies.
The SID value field itself can contain absolute value or index depending if the local significance and value flags are set. These flags are always set in IOS XR for adjacency segments, so the SID is an absolute label value.

If we run the show mpls forwarding command, we see that each router has associated the SID labels in LFIB with pop action and outgoing interface + next hop address of the adjacent neighbor:

RP/0/0/CPU0:XRv-1#show mpls forwarding

Local  Outgoing    Prefix             Outgoing     Next Hop        Bytes       
Label  Label       or ID              Interface                    Switched    
------ ----------- ------------------ ------------ --------------- ------------
24000  Pop         SR Adj (idx 1)     Gi0/0/0/1    172.16.1.2      0           
24001  Pop         SR Adj (idx 3)     Gi0/0/0/1    172.16.1.2      0           
24002  Pop         SR Adj (idx 1)     Gi0/0/0/2    172.16.2.2      0           
24003  Pop         SR Adj (idx 3)     Gi0/0/0/2    172.16.2.2      0

Prefix Segments

Prefix segments are global segments that use the SRGB as label allocation range. Prefix-SID value can be configured as absolute or index but it has to be unique within a SR domain. IOS XR uses SRGB range 16000 - 23999 by default.

Unlike adjacency segments, prefix segments are not automatically allocated and advertised. The administrator manually assigns prefix-SIDs to IGP enabled loopback interfaces.

I assigned prefix-SID for every routers loopback interface with index value of the routers number. Here is the configuration from XRv-1:

router isis 1
 interface Loopback0
  address-family ipv4 unicast
   prefix-sid index 1

Prefix-SIDs can be verified from LSDB:

RP/0/0/CPU0:XRv-1#show isis database verbose XRv-1

IS-IS 1 (Level-2) Link State Database
LSPID                 LSP Seq Num  LSP Checksum  LSP Holdtime  ATT/P/OL
XRv-1.00-00         * 0x00000008   0x8a0e        853             0/0/0
...
  Metric: 0          IP-Extended 1.1.1.1/32
    Prefix-SID Index: 1, Algorithm:0, R:0 N:1 P:0 E:0 V:0 L:0

Let’s take a look at some packet captures. Every router advertises its Segment Routing capability and SRGB in IS-IS SR-Capabilities sub-TLV:

SR-capabilty-capture

The I and V flags specify if the router can process IPv4 or IPv6 packets on all interfaces. SID/Label sub-TLV contain the first label value of the SRGB and the range contains the number of labels.

Prefix-SIDs are advertised in Prefix-SID sub-TLV which is associated with a prefix:

SR-prefix-sid-capture

In this case XRv-1 is advertising prefix 1.1.1.1/32 with SID index value 1 as I configured before. Based on the default SRGB range, other routers will associate prefix 1.1.1.1/32 with SID value 16001.

Re-advertisement flag is set when prefix is propagated from another level or redistributed from another protocol.
Node-SID flag is set when prefix-SID is a Node-SID.
no-PHP flag is used to control penultimate hop popping behavior. If the flag is set, then penultimate router must not pop the label before forwarding. IOS XR does not set the flag by default (PHP is enabled).
Explicit-Null flag instructs penultimate router to replace the Prefix-SID label with Explicit-Null label. Unset by default in IOS XR.
Value and Local flags are used in same way as in Adj-SID sub-TLV.

We can view the prefix-SIDs in the routers LFIB:

RP/0/0/CPU0:XRv-1#show mpls forwarding                

Local  Outgoing    Prefix             Outgoing     Next Hop        Bytes       
Label  Label       or ID              Interface                    Switched    
------ ----------- ------------------ ------------ --------------- ------------
16002  Pop         SR Pfx (idx 2)     Gi0/0/0/1    172.16.1.2      0           
16003  Pop         SR Pfx (idx 3)     Gi0/0/0/2    172.16.2.2      0           
16004  16004       SR Pfx (idx 4)     Gi0/0/0/1    172.16.1.2      0           
16005  16005       SR Pfx (idx 5)     Gi0/0/0/1    172.16.1.2      0           
       16005       SR Pfx (idx 5)     Gi0/0/0/2    172.16.2.2      0           
16006  16006       SR Pfx (idx 6)     Gi0/0/0/1    172.16.1.2      0           
       16006       SR Pfx (idx 6)     Gi0/0/0/2    172.16.2.2      0

Interesting thing here is that SIDs 16005 and 16006 have two outgoing interfaces associated with them. This happens because IS-IS has calculated two equal cost paths from XRv-1 to XRv-5 and XRv-6 and Segment Routing is able to automatically take advantage of both of these paths for load balancing.

RP/0/0/CPU0:XRv-1#show isis route 6.6.6.6/32 detail

L2 6.6.6.6/32 [30/115] medium priority
     via 172.16.2.2, GigabitEthernet0/0/0/2, XRv-3, SRGB Base: 16000, Weight: 0
     via 172.16.1.2, GigabitEthernet0/0/0/1, XRv-2, SRGB Base: 16000, Weight: 0
     src XRv-6.00-00, 6.6.6.6, prefix-SID index 6, R:0 N:1 P:0 E:0 V:0 L:0

As a last verification, we can run traceroute from XRv-1 to 6.6.6.6 and see that the correct SID labels get pushed to the packets.

RP/0/0/CPU0:XRv-1#traceroute 6.6.6.6

Type escape sequence to abort.
Tracing the route to 6.6.6.6

 1  172.16.2.2 [MPLS: Label 16006 Exp 0] 9 msec  0 msec  0 msec
 2  172.16.4.2 [MPLS: Label 16006 Exp 0] 0 msec  0 msec  0 msec
 3  172.16.7.2 0 msec  *  0 msec

As the traceroute illustrates, global SID stays constantly same on every hop to the destination. This simplifies troubleshooting compared to traditional MPLS where labels are locally significant and can change at every hop.

Summary

I hope this post has demonstrated how simple basic Segment Routing functionality is and how easy it is to get running. If you only require basic MPLS connectivity between service end-points relying on the IGP shortest path, you can just advertise loopback prefix-SID from each router.

Of course there is much more to Segment Routing than this basic example shows. In a future post I’m going to cover one of the most interesting use case of SR: traffic engineering.

comments powered by Disqus