The solution described in this section follows the data-plane processing defined in [
RFC 6790]. Within a SPRING path, a node may be ingress, egress, transit (regarding the entropy label processing described in [
RFC 6790]), or it can be any combination of those. For example:
-
The ingress node of a SPRING domain can be an ingress node from an entropy label perspective.
-
Any LSR terminating a segment of the SPRING path is an egress node (because it terminates the segment) but can also be a transit node if the SPRING path is not terminated because there is a subsequent SPRING MPLS label in the stack.
-
Any LSR processing a Binding SID may be a transit node and an ingress node (because it may push additional labels when processing the Binding SID).
As described earlier, an LSR may have a limitation (the ERLD) on the depth of the label stack that it can read and process in order to do multipath load-balancing based on entropy labels.
If an EL does not occur within the ERLD of an LSR in the label stack of an MPLS packet that it receives, then it would lead to poor load-balancing at that LSR. Hence, an ELI/EL pair must be within the ERLD of the LSR in order for the LSR to use the EL during load-balancing.
Adding a single ELI/EL pair for the entire SPRING path can also lead to poor load-balancing as well because the ELI/EL may not occur within the ERLD of some LSR on the path (if too deep) or may not be present in the stack when it reaches some LSRs (if it is too shallow).
In order for the EL to occur within the ERLD of LSRs along the path corresponding to a SPRING label stack, multiple <ELI, EL> pairs
MAY be inserted in this label stack.
The insertion of an ELI/EL
MUST occur only with a SPRING label advertised by an LSR that advertised an ERLD (the LSR is entropy label capable) or with a SPRING label associated with a Binding SID that has the ELC set.
The ELs among multiple <ELI, EL> pairs inserted in the stack
MAY be the same or different. The LSR that inserts <ELI, EL> pairs can have limitations on the number of such pairs that it can insert and also the depth at which it can insert them. If, due to limitations, the inserted ELs are at positions such that an LSR along the path receives an MPLS packet without an EL in the label stack within that LSR's ERLD, then the load-balancing performed by that LSR would be poor. An implementation
MAY consider multiple criteria when inserting <ELI, EL> pairs.
ECMP LAG LAG
PE1 --- P1 --- P2 --- P3 --- P4 --- P5 --- P6 --- PE2
In
Figure 5, PE1 wants to forward some MPLS VPN traffic over an explicit path to PE2 resulting in the following label stack to be pushed onto the received IP header: <Adj_P1P2, Adj_set_P2P3, Adj_P3P4, Adj_P4P5, Adj_P5P6, Adj_P6PE2, VPN_label>. PE1 is limited to push a maximum of 11 labels (MSD=11). P2, P3, and P6 have an ERLD of 3 while others have an ERLD of 10.
PE1 can only add two ELI/EL pairs in the label stack due to its MSD limitation. It should insert them strategically to benefit load-balancing along the longest part of the path.
PE1 can take into account multiple parameters when inserting ELs; as examples:
-
The ERLD value advertised by transit nodes.
-
The requirement of load-balancing for a particular label value.
-
Any service provider preference: favor beginning of the path or end of the path.
In
Figure 5, a good strategy may be to use the following stack <Adj_P1P2, Adj_set_P2P3, ELI1, EL1, Adj_P3P4, Adj_P4P5, Adj_P5P6, Adj_P6PE2, ELI2, EL2, VPN_label>. The original stack requests P2 to forward based on an L3 adjacency-set that will require load-balancing. Therefore, it is important to ensure that P2 can load-balance correctly. As P2 has a limited ERLD of 3, an ELI/EL must be inserted just after the label that P2 will use to forward. On the path to PE2, P3 has also a limited ERLD, but P3 will forward based on a regular adjacency segment that may not require load-balancing. Therefore, it does not seem important to ensure that P3 can do load-balancing despite its limited ERLD. The next nodes along the forwarding path have a high ERLD that does not cause any issue, except P6. Moreover, P6 is using some LAGs to PE2 and so is expected to load-balance. It becomes important to insert a new ELI/EL just after the P6 forwarding label.
In the case above, the ingress node was able to support a sufficient MSD to ensure end-to-end load-balancing while taking into account the path attributes. However, there might be cases where the ingress node may not have the necessary label imposition capacity.
ECMP LAG ECMP ECMP
PE1 --- P1 --- P2 --- P3 --- P4 --- P5 --- P6 --- P7 --- P8 --- PE2
In
Figure 6, PE1 wants to forward MPLS VPN traffic over an explicit path to PE2 resulting in the following label stack to be pushed onto the IP header: <Adj_P1P2, Adj_set_P2P3, Adj_P3P4, Adj_P4P5, Adj_P5P6, Adj_set_P6P7, Adj_P7P8; Adj_set_P8PE2, VPN_label>. PE1 is limited to push a maximum of 11 labels. P2, P3, and P6 have an ERLD of 3 while others have an ERLD of 15.
Using a similar strategy as the previous case may lead to a dilemma, as PE1 can only push a single ELI/EL while we may need a minimum of three to load-balance the end-to-end path. An optimized stack that would enable end-to-end load-balancing may be: <Adj_P1P2, Adj_set_P2P3, ELI1, EL1, Adj_P3P4, Adj_P4P5, Adj_P5P6, Adj_set_P6P7, ELI2, EL2, Adj_P7P8, Adj_set_P8PE2, ELI3, EL3, VPN_label>.
A decision needs to be taken to favor some part of the path for load-balancing considering that load-balancing may not work on the other parts. A service provider may decide to place the ELI/EL after the P6 forwarding label as it will allow P4 and P6 to load-balance. Placing the ELI/EL at the bottom of the stack is also a possibility enabling load-balancing for P4 and P8.
The sample cases described in the previous section showed that ELI/EL placement when the maximum number of labels to be pushed is limited is not an easy decision, and multiple criteria may be taken into account.
This section describes some considerations that an implementation
MAY take into account when placing ELI/ELs. This list of criteria is not considered exhaustive and an implementation
MAY take into account additional criteria or tiebreakers that are not documented here. As the insertion of ELI/ELs is performed by the ingress node, having ingress nodes that do not use the same criteria does not cause an interoperability issue. However, from a network design and operation perspective, it is better to have all ingress routers using the same criteria.
An implementation
SHOULD try to maximize the possibility of load-balancing along the path by inserting an ELI/EL where multiple equal-cost paths are available and minimize the number of ELI/ELs that need to be inserted. In case of a trade-off, an implementation
SHOULD provide flexibility to the operator to select the criteria to be considered when placing ELI/ELs or specify a subobjective for optimization.
2 2
PE1 -- P1 -- P2 --P3 --- P4 --- P5 -- ... -- P8 -- P9 -- PE2
| |
P3'--- P4'--- P5'
Figure 7 will be used as reference in the following subsections. All metrics are equal to 1 except P3-P4 and P4-P5, which have a metric 2. We consider the MSD of nodes to be the full limit of label imposition (including service labels, entropy labels, and transport labels).
As mentioned in
Section 7.1, the ERLD value is an important parameter to consider when inserting an ELI/EL. If an ELI/EL does not fall within the ERLD of a node on the path, the node will not be able to load-balance the traffic efficiently.
The ERLD value can be advertised via protocols, and those extensions are described in separate documents (for instance, [
ISIS-ELC] and [
OSPF-ELC]).
Let's consider a path from PE1 to PE2 using the following stack pushed by PE1: <Adj_P1P2, Node_P9, Adj_P9PE2, Service_label>.
Using the ERLD as an input parameter can help to minimize the number of required ELI/EL pairs to be inserted. An ERLD value must be retrieved for each SPRING label in the label stack.
For a label bound to an adjacency segment, the ERLD is the ERLD of the node that has advertised the adjacency segment. In the example above, the ERLD associated with Adj_P1P2 would be the ERLD of router P1, as P1 will perform the forwarding based on the Adj_P1P2 label.
For a label bound to a node segment, multiple strategies
MAY be implemented. An implementation
MAY try to evaluate the minimum ERLD value along the node segment path. If an implementation cannot find the minimum ERLD along the path of the segment or does not support the computation of the minimum ERLD, it
SHOULD instead use the ERLD of the tail-end node. Using the ERLD of the tail end of the node segment mimics the behavior of [
RFC 6790] where the ingress takes only care of the egress of the LSP. In the example above, if the implementation supports computation of minimum ERLD along the path, the ERLD associated with label Node_P9 would be the minimum ERLD between nodes {P2,P3,P4 ..., P8}. If the implementation does not support the computation of minimum ERLD, it will consider the ERLD of P9 (tail-end node of Node_P9 SID). While providing the more optimal ELI/EL placement, evaluating the minimum ERLD increases the complexity of ELI/EL insertion. As the path to the Node SID may change over time, a recomputation of the minimum ERLD is required for each topology change. This recomputation may require the positions of the ELI/ELs to change.
For a label bound to a Binding Segment, if the Binding Segment describes a path, an implementation
MAY also try to evaluate the minimum ERLD along this path. If the implementation cannot find the minimum ERLD along the path of the segment or does not support this evaluation, it
SHOULD instead use the ERLD of the node advertising the Binding SID. As for the node segment, evaluating the minimum ERLD adds complexity in the ELI/EL insertion process.
Depending on the type of segment a particular label is bound to, an implementation can deduce that this particular label will be subject to load-balancing on the path.
An MPLS label bound to a Node SID represents a path that may cross multiple hops. Load-balancing may be needed on the node starting this path but also on any node along the path.
In
Figure 7, let's consider a path from PE1 to PE2 using the following stack pushed by PE1: <Adj_P1P2, Node_P9, Adj_P9PE2, Service_label>.
If, for example, PE1 is limited to push 6 labels, it can add a single ELI/EL within the label stack. An operator may want to favor a placement that would allow load-balancing along the Node SID path. In
Figure 7, P3, which is along the Node SID path, requires load-balancing between two equal-cost paths.
An implementation
MAY try to evaluate if load-balancing is really required within a node segment path. This could be done by running an additional SPT (Shortest Path Tree) computation and analyzing of the node segment path to prevent a node segment that does not really require load-balancing from being preferred when placing ELI/ELs. Such inspection may be time consuming for implementations and without a 100% guarantee, as a node segment path may use LAGs that are invisible to the IP topology. As a simpler approach, an implementation
MAY consider that a label bound to a Node SID will be subject to load-balancing and require an ELI/ EL.
An adjacency-set is an Adj-SID that refers to a set of adjacencies. When an adjacency-set segment is used within a label stack, an implementation can deduce that load-balancing is expected at the node that advertised this adjacency segment. An implementation
MAY favor the insertion of an ELI/EL after the Adj-SID representing an adjacency-set.
When an adjacency segment representing a single IP link is used within a label stack, an implementation can deduce that load-balancing may not be expected at the node that advertised this adjacency segment.
An implementation
MAY NOT place an ELI/EL after a regular Adj-SID in order to favor the insertion of ELI/ELs following other segments.
Readers should note that an adjacency segment representing a single IP link may require load-balancing. This is the case when a LAG (L2 bundle) is implemented between two IP nodes and the L2 bundle SR extensions [
RFC 8668] are not implemented. In such a case, it could be useful to insert an ELI/EL in a readable position for the LSR advertising the label associated with the adjacency segment. To communicate the requirement for load-balancing for a particular Adjacency SID to ingress nodes, a user can enforce the use of the L2 bundle SR extensions defined in [
RFC 8668] or can declare the single adjacency as an adjacency-set.
When the L2 bundle SR extensions [
RFC 8668] are used, adjacency segments may be advertised for each member of the bundle. In this case, an implementation can deduce that load-balancing is not expected on the LSR advertising this segment and
MAY NOT insert an ELI/EL after the corresponding label.
When the L2 bundle SR extensions [
RFC 8668] are used, an adjacency segment may be advertised to represent the bundle. In this case, an implementation can deduce that load-balancing is expected on the LSR advertising this segment and
MAY insert an ELI/EL after the corresponding label.
When placing ELI/ELs, an implementation
MAY optimize the number of LSRs that both need to load-balance (i.e., have ECMPs) and that will be able to perform load-balancing (i.e., the EL is within their ERLD).
Let's consider a path from PE1 to PE2 using the following stack pushed by PE1: <Adj_P1P2, Node_P9, Adj_P9PE2, Service_label>. All routers have an ERLD of 10 except P1 and P2, which have an ERLD of 4. PE1 is able to push 6 labels, so only a single ELI/EL can be added.
In the example above, adding an ELI/EL after Adj_P1P2 will only allow load-balancing at P1, while inserting it after Adj_PE2P9 will allow load-balancing at P2, P3 ... P9 and maximize the number of LSRs that can perform load-balancing.
An implementation
MAY allow the user to favor a part of the end-to-end path when the number of ELI/ELs that can be pushed is not enough to cover the entire path. As an example, a service provider may want to favor load-balancing at the beginning of the path or at the end of the path, so the implementation favors putting the ELI/ELs near the top or the bottom of the stack.
An implementation
MAY combine multiple criteria to determine the best ELI/ELs placement. However, combining too many criteria could lead to implementation complexity and high resource consumption. Each time the network topology changes, a new evaluation of the ELI/EL placement will be necessary for each impacted LSP.