Source Routing (SR)¶
Source Routing is a forwarding mechanism in a network where a path for the packet is determined at the source node. In contrast, in conventional routing, the path for the packet is determined at every node based on its destination address.
Segment Routing, RFC  leverages the Source Routing paradigm. Conceptually, a packet entering the network gets tagged with forwarding instructions, termed as segments. The tagging of segments can be carried out based on packet header such as destination address, class of service, etc, and is termed as Forwarding Equivalence Classes (FEC).
One or more ordered segments can be attached to the packet. Each segment encodes special forwarding instruction. On subsequent nodes within network, the packet is forwarded according to top segment instruction associated with the packet. As per the instruction encoded in the segment, it can be altered or dropped, or more segments can be pushed on the top.
At the last hop, all segments should’ve been dropped added by this network and network will be forwarded as per its destination address.
A Segment is an instruction that expresses the forwarding intent of the packet.
Open/R supports two types of segments described in RFC .
segment and and
Regardless of type, there is a scope associated with each segment, being
Local. The scope determines the set of nodes that can understand and
forward the packet as per the associated segment.
Scope - Local¶
The segment’s instruction can only be processed by the node that originates or own the segment. The local segment may have undesirable behavior on the other nodes.
Scope - Area¶
The segment instruction is well understood by all nodes within the area. Every node can process and forward the packet associated with this segment.
Node Segment (Node SID)¶
Node Segment is a unique segment associated with every node in an area. The
scope of this segment is the
Node Segments forwards the network packets to the associated node via
Shortest Path algorithm within an area. The segment instruction is retained on
the packet, until it reaches the destination node. Packet is then routed
according to the next segment or IP routing.
Penultimate NextHop Popping (PHP) is industry practice, where the last segment is popped up before it is forwarded to the destination node. This helps in saving one extra cycle of lookup on LER. Open/R performs PHP by default for Node Segment.
Adjacency Segment (Adj SID)¶
Adjacency Segment is a unique segment associated with every Open/R adjacency.
The scope of this segment is
Adjacency Segment forwards the network packets towards the associated adjacency and pops the segment before doing so.
Segment Routing is a concept and realizing its actual behavior can be achieved through two data plane forwarding techniques, MPLS and SRv6.
MPLS segment is encoded as 4-byte integer and is prepended onto the IP packet. Multiple segments can be added, each incurring 4-byte overhead. The packet is looked up based on the top label into a special Label Forwarding Information Base (L-FIB) in hardware and forwarded according to it. Read more
SRv6 is pure IPv6 based forwarding. The extended header of IPv6 packet is leveraged to encode segment information. Each segment is an IPv6 address and incurs 16-byte of overhead. Read more
In Open/R we chose MPLS as data-plane for forwarding mechanism for two reasons
Widely adopted and supported by network hardware
Incurs less overhead on the packet
MPLS Segment Operations¶
There are 3 types of operations a network device needs to support to segment routing with MPLS
Add one or more labels on the top of the incoming packet (determined by FEC) with egress instruction (nexthop/interface). This operation often happens on LER when packet enters into SR enabled network.
Swapping the incoming label with one or more outgoing label(s) along with egress instruction (next-hop/interface). This operation is often carried out to retain label or swap label when packet is transitioning within SR enabled network.
For tunneling purpose or to address label stack depth limitation, we can also swap an incoming label with an outgoing label-stack with an egress instruction (i.e., binding SID).
Popping the topmost label. Often carried out when the packet reaches or will reach in immediate next-hop to the destination indicated by the topmost label.
Enabling Segment Routing¶
Configuration Knob in OpenrConfig.thrift
13: optional bool enable_segment_routing
Configuring the Label Ranges¶
There are two ranges statically defined in the code as constants for Area and Local segment scopes.
Area Range: [101, 49999] Local Range: [50000, 59999]
Every route advertisement in Open/R allows the specification of forwarding type.
Setting this to
SR_MPLS via config will make all Label Edge Routers (LER) to
IP to MPLS route for all advertisement from the node advertising IP
prefixes. The advertised prefix will assume the node label (aka Prefix SID).
This works with anycast prefixes as well.
Configuration for Forwarding Type OpenrConfig.thrift
12: PrefixForwardingAlgorithm prefix_forwarding_algorithm,
There are two label types that Open/R will perform per node. A node-label which is unique within a whole network and per node adjacency-label which is unique within the node and has local significance only.
NodeSID will take node-label
AdjacencySID will take adjacency-label
Open/R supports allocating unique label/integer per node (LDP function). It is implemented as a distributed computing enabled by KvStore. Also each adjacency is assigned unique label on a node, usually derived from interface index.
You can look at the labels by inspecting adjacencies
[root@node1 ~]$ breeze kvstore adj > node1 => Version: 54, *Node Label: 21890* Neighbor Local Intf Remote Intf Metric *Label* NextHop-v4 NextHop-v6 Uptime node2 if_1_2_1 if_2_1_1 1 *50006* 169.254.0.3 fe80::b4fe:aff:feb0:4141 3d21h node33 if_1_33_1 if_33_1_1 1 *50007* 169.254.0.5 fe80::6821:64ff:fe7b:d06f 3d21h
MPLS Programming APIs¶
Open/R will compute MPLS routes as per the Segment Routing architecture. This will need to be programmed in HW. The Platform will need to provide implementation for programming these routes in HW. Open/R provides the implementation for programming these routes in MPLS enabled Linux kernel.