rfc8662xml2.original.xml | rfc8662.xml | |||
---|---|---|---|---|
<?xml version="1.0" encoding="US-ASCII"?> | <?xml version='1.0' encoding='utf-8'?> | |||
<!DOCTYPE rfc SYSTEM "rfc2629.dtd"[ | <rfc xmlns:xi="http://www.w3.org/2001/XInclude" version="3" category="std" conse | |||
<!ENTITY RFC2119 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/referen | nsus="true" docName="draft-ietf-mpls-spring-entropy-label-12" indexInclude="true | |||
ce.RFC.2119.xml"> | " ipr="trust200902" number="8662" prepTime="2019-12-04T22:14:22" scripts="Common | |||
<!ENTITY RFC6790 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/referen | ,Latin" sortRefs="false" submissionType="IETF" symRefs="true" tocDepth="3" tocIn | |||
ce.RFC.6790.xml"> | clude="true" xml:lang="en"> | |||
<!ENTITY RFC4206 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/referen | <link href="https://datatracker.ietf.org/doc/draft-ietf-mpls-spring-entropy-la | |||
ce.RFC.4206.xml"> | bel-12" rel="prev"/> | |||
<!ENTITY RFC7325 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/referen | <link href="https://dx.doi.org/10.17487/rfc8662" rel="alternate"/> | |||
ce.RFC.7325.xml"> | <link href="urn:issn:2070-1721" rel="alternate"/> | |||
<!ENTITY RFC7855 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/referen | ||||
ce.RFC.7855.xml"> | ||||
<!ENTITY RFC8174 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/referen | ||||
ce.RFC.8174.xml"> | ||||
<!ENTITY SR SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml3/reference.I | ||||
-D.ietf-spring-segment-routing.xml"> | ||||
<!ENTITY SR-MPLS SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml3/refere | ||||
nce.I-D.ietf-spring-segment-routing-mpls.xml"> | ||||
<!ENTITY ISIS-ELC SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml3/refer | ||||
ence.I-D.ietf-isis-mpls-elc.xml"> | ||||
<!ENTITY OSPF-ELC SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml3/refer | ||||
ence.I-D.ietf-ospf-mpls-elc.xml"> | ||||
<!ENTITY OSPF-MSD SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml3/refer | ||||
ence.I-D.ietf-ospf-segment-routing-msd.xml"> | ||||
<!ENTITY ISIS-MSD SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml3/refer | ||||
ence.I-D.ietf-isis-segment-routing-msd.xml"> | ||||
<!ENTITY BGP-MSD SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml3/refere | ||||
nce.I-D.ietf-idr-bgp-ls-segment-routing-msd.xml"> | ||||
<!ENTITY SR-L2-BUNDLES SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml3/ | ||||
reference.I-D.ietf-isis-l2bundles.xml"> | ||||
]> | ||||
<?rfc toc="yes" ?> | ||||
<?rfc tocompact="yes"?> | ||||
<?rfc tocdepth="4"?> | ||||
<?rfc tocindent="yes"?> | ||||
<?rfc symrefs="yes" ?> | ||||
<?rfc sortrefs="no"?> | ||||
<?rfc rfcedstyle="yes"?> | ||||
<?rfc subcompact="no"?> | ||||
<?rfc compact="yes" ?> | ||||
<?rfc iprnotified="Yes" ?> | ||||
<?rfc strict="no" ?> | ||||
<rfc ipr="trust200902" category="std" docName="draft-ietf-mpls-spring-entropy-la | ||||
bel-12" obsoletes="" updates="" submissionType="IETF" xml:lang="en"> | ||||
<front> | <front> | |||
<title abbrev="Entropy Labels for SPRING tunnels">Entropy label for SPRING t | <title abbrev="Entropy Labels for SPRING Tunnels">Entropy Label for Source P | |||
unnels</title> | acket Routing in Networking (SPRING) Tunnels</title> | |||
<seriesInfo name="RFC" value="8662" stream="IETF"/> | ||||
<author initials="S" surname="Kini" fullname="Sriganesh Kini"> | <author initials="S" surname="Kini" fullname="Sriganesh Kini"> | |||
<organization></organization> | <organization showOnFrontPage="true"/> | |||
<address> | <address> | |||
<postal> | <postal> | |||
<street></street> | <street/> | |||
<city></city> | <city/> | |||
<region></region> | <region/> | |||
<code></code> | <code/> | |||
<country></country> | <country/> | |||
</postal> | </postal> | |||
<email>sriganeshkini@gmail.com</email> | <email>sriganeshkini@gmail.com</email> | |||
</address> | </address> | |||
</author> | </author> | |||
<author initials="K" surname="Kompella" fullname="Kireeti Kompella"> | <author initials="K" surname="Kompella" fullname="Kireeti Kompella"> | |||
<organization>Juniper</organization> | <organization showOnFrontPage="true">Juniper</organization> | |||
<address> | <address> | |||
<postal> | <postal> | |||
<street></street> | <street/> | |||
<city></city> | <city/> | |||
<region></region> | <region/> | |||
<code></code> | <code/> | |||
<country></country> | <country/> | |||
</postal> | </postal> | |||
<email>kireeti@juniper.net</email> | <email>kireeti@juniper.net</email> | |||
</address> | </address> | |||
</author> | </author> | |||
<author initials="S" surname="Sivabalan" fullname="Siva Sivabala | <author initials="S" surname="Sivabalan" fullname="Siva Sivabalan"> | |||
n"> | <organization showOnFrontPage="true">Cisco</organization> | |||
<organization>Cisco</organization> | ||||
<address> | <address> | |||
<postal> | <postal> | |||
<street></street> | <street/> | |||
<city></city> | <city/> | |||
<region></region> | <region/> | |||
<code></code> | <code/> | |||
<country></country> | <country/> | |||
</postal> | </postal> | |||
<email>msiva@cisco.com</email> | <email>msiva@cisco.com</email> | |||
</address> | </address> | |||
</author> | </author> | |||
<author initials="S" surname="Litkowski" fullname="Stephane Litk | <author initials="S" surname="Litkowski" fullname="Stephane Litkowski"> | |||
owski"> | <organization showOnFrontPage="true">Orange</organization> | |||
<organization>Orange</organization> | ||||
<address> | <address> | |||
<postal> | <postal> | |||
<street></street> | <street/> | |||
<city></city> | <city/> | |||
<region></region> | <region/> | |||
<code></code> | <code/> | |||
<country></country> | <country/> | |||
</postal> | </postal> | |||
<email>stephane.litkowski@orange.com</email> | <email>slitkows.ietf@gmail.com</email> | |||
</address> | </address> | |||
</author> | </author> | |||
<author initials="R" surname="Shakir" fullname="Rob Shakir"> | <author initials="R" surname="Shakir" fullname="Rob Shakir"> | |||
<organization>Google</organization> | <organization showOnFrontPage="true">Google</organization> | |||
<address> | <address> | |||
<postal> | <postal> | |||
<street></street> | <street/> | |||
<city></city> | <city/> | |||
<region></region> | <region/> | |||
<code></code> | <code/> | |||
<country></country> | <country/> | |||
</postal> | </postal> | |||
<email>rjs@rob.sh</email> | <email>robjs@google.com</email> | |||
</address> | </address> | |||
</author> | </author> | |||
<author initials="J" surname="Tantsura" fullname="Jeff Tantsura" | <author initials="J" surname="Tantsura" fullname="Jeff Tantsura"> | |||
> | <organization showOnFrontPage="true">Apstra, Inc.</organization> | |||
<organization></organization> | ||||
<address> | <address> | |||
<postal> | <postal> | |||
<street></street> | <street/> | |||
<city></city> | <city/> | |||
<region></region> | <region/> | |||
<code></code> | <code/> | |||
<country></country> | <country/> | |||
</postal> | </postal> | |||
<email>jefftant@gmail.com</email> | <email>jefftant.ietf@gmail.com</email> | |||
</address> | </address> | |||
</author> | </author> | |||
<date month="12" year="2019"/> | ||||
<date year="2018" /> | ||||
<area>Routing</area> | <area>Routing</area> | |||
<workgroup>Network Working Group</workgroup> | <keyword>Flow-aware load balancing</keyword> | |||
<abstract> | <keyword>ECMP</keyword> | |||
<keyword>equal-cost multipath</keyword> | ||||
<t> | <abstract pn="section-abstract"> | |||
Segment Routing (SR) leverages the source routing paradigm. A node | <t pn="section-abstract-1"> | |||
steers a packet through an ordered list of instructions, called | Segment Routing (SR) leverages the source-routing paradigm. A node steers a | |||
segments. Segment Routing can be applied to the Multi Protocol Label | packet through an ordered list of instructions, called segments. Segment | |||
Switching (MPLS) data plane. Entropy label (EL) is a technique used | Routing can be applied to the Multiprotocol Label Switching (MPLS) data | |||
in MPLS to improve load-balancing. This document examines and | plane. Entropy labels (ELs) are used in MPLS to improve load-balancing. | |||
describes how ELs are to be applied to Segment Routing MPLS. | This document examines and describes how ELs are to be applied to Segment | |||
Routing MPLS. | ||||
</t> | </t> | |||
</abstract> | </abstract> | |||
<boilerplate> | ||||
<section anchor="status-of-memo" numbered="false" removeInRFC="false" toc= | ||||
"exclude" pn="section-boilerplate.1"> | ||||
<name slugifiedName="name-status-of-this-memo">Status of This Memo</name | ||||
> | ||||
<t pn="section-boilerplate.1-1"> | ||||
This is an Internet Standards Track document. | ||||
</t> | ||||
<t pn="section-boilerplate.1-2"> | ||||
This document is a product of the Internet Engineering Task Force | ||||
(IETF). It represents the consensus of the IETF community. It has | ||||
received public review and has been approved for publication by | ||||
the Internet Engineering Steering Group (IESG). Further | ||||
information on Internet Standards is available in Section 2 of | ||||
RFC 7841. | ||||
</t> | ||||
<t pn="section-boilerplate.1-3"> | ||||
Information about the current status of this document, any | ||||
errata, and how to provide feedback on it may be obtained at | ||||
<eref target="https://www.rfc-editor.org/info/rfc8662" brackets="non | ||||
e"/>. | ||||
</t> | ||||
</section> | ||||
<section anchor="copyright" numbered="false" removeInRFC="false" toc="excl | ||||
ude" pn="section-boilerplate.2"> | ||||
<name slugifiedName="name-copyright-notice">Copyright Notice</name> | ||||
<t pn="section-boilerplate.2-1"> | ||||
Copyright (c) 2019 IETF Trust and the persons identified as the | ||||
document authors. All rights reserved. | ||||
</t> | ||||
<t pn="section-boilerplate.2-2"> | ||||
This document is subject to BCP 78 and the IETF Trust's Legal | ||||
Provisions Relating to IETF Documents | ||||
(<eref target="https://trustee.ietf.org/license-info" brackets="none | ||||
"/>) in effect on the date of | ||||
publication of this document. Please review these documents | ||||
carefully, as they describe your rights and restrictions with | ||||
respect to this document. Code Components extracted from this | ||||
document must include Simplified BSD License text as described in | ||||
Section 4.e of the Trust Legal Provisions and are provided without | ||||
warranty as described in the Simplified BSD License. | ||||
</t> | ||||
</section> | ||||
</boilerplate> | ||||
<toc> | ||||
<section anchor="toc" numbered="false" removeInRFC="false" toc="exclude" p | ||||
n="section-toc.1"> | ||||
<name slugifiedName="name-table-of-contents">Table of Contents</name> | ||||
<ul bare="true" empty="true" indent="2" spacing="compact" pn="section-to | ||||
c.1-1"> | ||||
<li pn="section-toc.1-1.1"> | ||||
<t keepWithNext="true" pn="section-toc.1-1.1.1"><xref derivedContent | ||||
="1" format="counter" sectionFormat="of" target="section-1"/>. <xref derivedCon | ||||
tent="" format="title" sectionFormat="of" target="name-introduction">Introductio | ||||
n</xref></t> | ||||
<ul bare="true" empty="true" indent="2" spacing="compact" pn="sectio | ||||
n-toc.1-1.1.2"> | ||||
<li pn="section-toc.1-1.1.2.1"> | ||||
<t keepWithNext="true" pn="section-toc.1-1.1.2.1.1"><xref derive | ||||
dContent="1.1" format="counter" sectionFormat="of" target="section-1.1"/>. <xre | ||||
f derivedContent="" format="title" sectionFormat="of" target="name-requirements- | ||||
language">Requirements Language</xref></t> | ||||
</li> | ||||
</ul> | ||||
</li> | ||||
<li pn="section-toc.1-1.2"> | ||||
<t keepWithNext="true" pn="section-toc.1-1.2.1"><xref derivedContent | ||||
="2" format="counter" sectionFormat="of" target="section-2"/>. <xref derivedCon | ||||
tent="" format="title" sectionFormat="of" target="name-abbreviations-and-termino | ||||
lo">Abbreviations and Terminology</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.3"> | ||||
<t keepWithNext="true" pn="section-toc.1-1.3.1"><xref derivedContent | ||||
="3" format="counter" sectionFormat="of" target="section-3"/>. <xref derivedCon | ||||
tent="" format="title" sectionFormat="of" target="name-use-case-requiring-multip | ||||
at">Use Case Requiring Multipath Load-Balancing</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.4"> | ||||
<t keepWithNext="true" pn="section-toc.1-1.4.1"><xref derivedContent | ||||
="4" format="counter" sectionFormat="of" target="section-4"/>. <xref derivedCon | ||||
tent="" format="title" sectionFormat="of" target="name-entropy-readable-label-de | ||||
pt">Entropy Readable Label Depth</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.5"> | ||||
<t keepWithNext="true" pn="section-toc.1-1.5.1"><xref derivedContent | ||||
="5" format="counter" sectionFormat="of" target="section-5"/>. <xref derivedCon | ||||
tent="" format="title" sectionFormat="of" target="name-maximum-sid-depth">Maximu | ||||
m SID Depth</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.6"> | ||||
<t keepWithNext="true" pn="section-toc.1-1.6.1"><xref derivedContent | ||||
="6" format="counter" sectionFormat="of" target="section-6"/>. <xref derivedCon | ||||
tent="" format="title" sectionFormat="of" target="name-lsp-stitching-using-the-b | ||||
in">LSP Stitching Using the Binding SID</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.7"> | ||||
<t keepWithNext="true" pn="section-toc.1-1.7.1"><xref derivedContent | ||||
="7" format="counter" sectionFormat="of" target="section-7"/>. <xref derivedCon | ||||
tent="" format="title" sectionFormat="of" target="name-insertion-of-entropy-labe | ||||
ls">Insertion of Entropy Labels for SPRING Path</xref></t> | ||||
<ul bare="true" empty="true" indent="2" spacing="compact" pn="sectio | ||||
n-toc.1-1.7.2"> | ||||
<li pn="section-toc.1-1.7.2.1"> | ||||
<t keepWithNext="true" pn="section-toc.1-1.7.2.1.1"><xref derive | ||||
dContent="7.1" format="counter" sectionFormat="of" target="section-7.1"/>. <xre | ||||
f derivedContent="" format="title" sectionFormat="of" target="name-overview">Ove | ||||
rview</xref></t> | ||||
<ul bare="true" empty="true" indent="2" spacing="compact" pn="se | ||||
ction-toc.1-1.7.2.1.2"> | ||||
<li pn="section-toc.1-1.7.2.1.2.1"> | ||||
<t keepWithNext="true" pn="section-toc.1-1.7.2.1.2.1.1"><xre | ||||
f derivedContent="7.1.1" format="counter" sectionFormat="of" target="section-7.1 | ||||
.1"/>. <xref derivedContent="" format="title" sectionFormat="of" target="name-e | ||||
xample-1-the-ingress-node-">Example 1: The Ingress Node Has a Sufficient MSD</xr | ||||
ef></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.7.2.1.2.2"> | ||||
<t keepWithNext="true" pn="section-toc.1-1.7.2.1.2.2.1"><xre | ||||
f derivedContent="7.1.2" format="counter" sectionFormat="of" target="section-7.1 | ||||
.2"/>. <xref derivedContent="" format="title" sectionFormat="of" target="name-e | ||||
xample-2-the-ingress-node-">Example 2: The Ingress Node Does Not Have a Sufficie | ||||
nt MSD</xref></t> | ||||
</li> | ||||
</ul> | ||||
</li> | ||||
<li pn="section-toc.1-1.7.2.2"> | ||||
<t keepWithNext="true" pn="section-toc.1-1.7.2.2.1"><xref derive | ||||
dContent="7.2" format="counter" sectionFormat="of" target="section-7.2"/>. <xre | ||||
f derivedContent="" format="title" sectionFormat="of" target="name-consideration | ||||
s-for-the-plac">Considerations for the Placement of Entropy Labels</xref></t> | ||||
<ul bare="true" empty="true" indent="2" spacing="compact" pn="se | ||||
ction-toc.1-1.7.2.2.2"> | ||||
<li pn="section-toc.1-1.7.2.2.2.1"> | ||||
<t keepWithNext="true" pn="section-toc.1-1.7.2.2.2.1.1"><xre | ||||
f derivedContent="7.2.1" format="counter" sectionFormat="of" target="section-7.2 | ||||
.1"/>. <xref derivedContent="" format="title" sectionFormat="of" target="name-e | ||||
rld-value">ERLD Value</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.7.2.2.2.2"> | ||||
<t keepWithNext="true" pn="section-toc.1-1.7.2.2.2.2.1"><xre | ||||
f derivedContent="7.2.2" format="counter" sectionFormat="of" target="section-7.2 | ||||
.2"/>. <xref derivedContent="" format="title" sectionFormat="of" target="name-s | ||||
egment-type">Segment Type</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.7.2.2.2.3"> | ||||
<t keepWithNext="true" pn="section-toc.1-1.7.2.2.2.3.1"><xre | ||||
f derivedContent="7.2.3" format="counter" sectionFormat="of" target="section-7.2 | ||||
.3"/>. <xref derivedContent="" format="title" sectionFormat="of" target="name-m | ||||
aximizing-number-of-lsrs-t">Maximizing Number of LSRs That Will Load-Balance</xr | ||||
ef></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.7.2.2.2.4"> | ||||
<t keepWithNext="true" pn="section-toc.1-1.7.2.2.2.4.1"><xre | ||||
f derivedContent="7.2.4" format="counter" sectionFormat="of" target="section-7.2 | ||||
.4"/>. <xref derivedContent="" format="title" sectionFormat="of" target="name-p | ||||
reference-for-a-part-of-th">Preference for a Part of the Path</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.7.2.2.2.5"> | ||||
<t keepWithNext="true" pn="section-toc.1-1.7.2.2.2.5.1"><xre | ||||
f derivedContent="7.2.5" format="counter" sectionFormat="of" target="section-7.2 | ||||
.5"/>. <xref derivedContent="" format="title" sectionFormat="of" target="name-c | ||||
ombining-criteria">Combining Criteria</xref></t> | ||||
</li> | ||||
</ul> | ||||
</li> | ||||
</ul> | ||||
</li> | ||||
<li pn="section-toc.1-1.8"> | ||||
<t keepWithNext="true" pn="section-toc.1-1.8.1"><xref derivedContent | ||||
="8" format="counter" sectionFormat="of" target="section-8"/>. <xref derivedCon | ||||
tent="" format="title" sectionFormat="of" target="name-a-simple-example-algorith | ||||
m">A Simple Example Algorithm</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.9"> | ||||
<t keepWithNext="true" pn="section-toc.1-1.9.1"><xref derivedContent | ||||
="9" format="counter" sectionFormat="of" target="section-9"/>. <xref derivedCon | ||||
tent="" format="title" sectionFormat="of" target="name-deployment-considerations | ||||
">Deployment Considerations</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.10"> | ||||
<t keepWithNext="true" pn="section-toc.1-1.10.1"><xref derivedConten | ||||
t="10" format="counter" sectionFormat="of" target="section-10"/>. <xref derivedC | ||||
ontent="" format="title" sectionFormat="of" target="name-options-considered">Opt | ||||
ions Considered</xref></t> | ||||
<ul bare="true" empty="true" indent="2" spacing="compact" pn="sectio | ||||
n-toc.1-1.10.2"> | ||||
<li pn="section-toc.1-1.10.2.1"> | ||||
<t keepWithNext="true" pn="section-toc.1-1.10.2.1.1"><xref deriv | ||||
edContent="10.1" format="counter" sectionFormat="of" target="section-10.1"/>. < | ||||
xref derivedContent="" format="title" sectionFormat="of" target="name-single-el- | ||||
at-the-bottom-of-">Single EL at the Bottom of the Stack</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.10.2.2"> | ||||
<t keepWithNext="true" pn="section-toc.1-1.10.2.2.1"><xref deriv | ||||
edContent="10.2" format="counter" sectionFormat="of" target="section-10.2"/>. < | ||||
xref derivedContent="" format="title" sectionFormat="of" target="name-an-el-per- | ||||
segment-in-the-st">An EL per Segment in the Stack</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.10.2.3"> | ||||
<t keepWithNext="true" pn="section-toc.1-1.10.2.3.1"><xref deriv | ||||
edContent="10.3" format="counter" sectionFormat="of" target="section-10.3"/>. < | ||||
xref derivedContent="" format="title" sectionFormat="of" target="name-a-reusable | ||||
-el-for-a-stack-o">A Reusable EL for a Stack of Tunnels</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.10.2.4"> | ||||
<t keepWithNext="true" pn="section-toc.1-1.10.2.4.1"><xref deriv | ||||
edContent="10.4" format="counter" sectionFormat="of" target="section-10.4"/>. < | ||||
xref derivedContent="" format="title" sectionFormat="of" target="name-el-at-top- | ||||
of-stack">EL at Top of Stack</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.10.2.5"> | ||||
<t keepWithNext="true" pn="section-toc.1-1.10.2.5.1"><xref deriv | ||||
edContent="10.5" format="counter" sectionFormat="of" target="section-10.5"/>. < | ||||
xref derivedContent="" format="title" sectionFormat="of" target="name-els-at-rea | ||||
dable-label-stack">ELs at Readable Label Stack Depths</xref></t> | ||||
</li> | ||||
</ul> | ||||
</li> | ||||
<li pn="section-toc.1-1.11"> | ||||
<t keepWithNext="true" pn="section-toc.1-1.11.1"><xref derivedConten | ||||
t="11" format="counter" sectionFormat="of" target="section-11"/>. <xref derivedC | ||||
ontent="" format="title" sectionFormat="of" target="name-iana-considerations">IA | ||||
NA Considerations</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.12"> | ||||
<t keepWithNext="true" pn="section-toc.1-1.12.1"><xref derivedConten | ||||
t="12" format="counter" sectionFormat="of" target="section-12"/>. <xref derivedC | ||||
ontent="" format="title" sectionFormat="of" target="name-security-considerations | ||||
">Security Considerations</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.13"> | ||||
<t keepWithNext="true" pn="section-toc.1-1.13.1"><xref derivedConten | ||||
t="13" format="counter" sectionFormat="of" target="section-13"/>. <xref derivedC | ||||
ontent="" format="title" sectionFormat="of" target="name-references">References< | ||||
/xref></t> | ||||
<ul bare="true" empty="true" indent="2" spacing="compact" pn="sectio | ||||
n-toc.1-1.13.2"> | ||||
<li pn="section-toc.1-1.13.2.1"> | ||||
<t keepWithNext="true" pn="section-toc.1-1.13.2.1.1"><xref deriv | ||||
edContent="13.1" format="counter" sectionFormat="of" target="section-13.1"/>. < | ||||
xref derivedContent="" format="title" sectionFormat="of" target="name-normative- | ||||
references">Normative References</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.13.2.2"> | ||||
<t keepWithNext="true" pn="section-toc.1-1.13.2.2.1"><xref deriv | ||||
edContent="13.2" format="counter" sectionFormat="of" target="section-13.2"/>. < | ||||
xref derivedContent="" format="title" sectionFormat="of" target="name-informativ | ||||
e-references">Informative References</xref></t> | ||||
</li> | ||||
</ul> | ||||
</li> | ||||
<li pn="section-toc.1-1.14"> | ||||
<t keepWithNext="true" pn="section-toc.1-1.14.1"><xref derivedConten | ||||
t="" format="none" sectionFormat="of" target="section-appendix.a"/><xref derived | ||||
Content="" format="title" sectionFormat="of" target="name-acknowledgements">Ackn | ||||
owledgements</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.15"> | ||||
<t keepWithNext="true" pn="section-toc.1-1.15.1"><xref derivedConten | ||||
t="" format="none" sectionFormat="of" target="section-appendix.b"/><xref derived | ||||
Content="" format="title" sectionFormat="of" target="name-contributors">Contribu | ||||
tors</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.16"> | ||||
<t keepWithNext="true" pn="section-toc.1-1.16.1"><xref derivedConten | ||||
t="" format="none" sectionFormat="of" target="section-appendix.c"/><xref derived | ||||
Content="" format="title" sectionFormat="of" target="name-authors-addresses">Aut | ||||
hors' Addresses</xref></t> | ||||
</li> | ||||
</ul> | ||||
</section> | ||||
</toc> | ||||
</front> | </front> | |||
<middle> | <middle> | |||
<section title="Introduction" toc="default"> | <section toc="include" numbered="true" removeInRFC="false" pn="section-1"> | |||
<t> | <name slugifiedName="name-introduction">Introduction</name> | |||
Segment Routing <xref target="I-D.ietf-spring-segment-routing"/> is based on | <t pn="section-1-1"> | |||
source routed tunnels | Segment Routing <xref target="RFC8402" format="default" sectionFormat="of" de | |||
to steer a packet along a particular path. This path is encoded as an ordere | rivedContent="RFC8402"/> is based on | |||
d list of segments. | source-routed tunnels to steer a packet along a particular path. This path | |||
When applied to the MPLS dataplane <xref target="I-D.ietf-spring-segment- | is encoded as an ordered list of segments. When applied to the MPLS data | |||
routing-mpls"/>, each segment is an LSP (Label Switched Path) with an associated | plane <xref target="RFC8660" format="default" sectionFormat="of" derivedConte | |||
MPLS label value. | nt="RFC8660"/>, each segment is an LSP | |||
Hence, label stacking is used to represent the ordered list of segments a | (Label Switched Path) with an associated MPLS label value. Hence, label | |||
nd the label stack associated with an SR tunnel can be seen as nested LSPs (LSP | stacking is used to represent the ordered list of segments, and the label | |||
hierarchy) in the MPLS architecture. | stack associated with an SR tunnel can be seen as nested LSPs (LSP | |||
</t> | hierarchy) in the MPLS architecture. | |||
<t> | </t> | |||
<t pn="section-1-2"> | ||||
Using label stacking to encode the list of segments has implications on t he label stack depth. | Using label stacking to encode the list of segments has implications on t he label stack depth. | |||
</t> | </t> | |||
<t pn="section-1-3"> | ||||
<t> | Traffic load-balancing over ECMP (Equal-Cost Multipath) or LAGs (Link | |||
Traffic load-balancing over ECMP (Equal Cost Multi Path) or LAGs (Link Aggreg | Aggregation Groups) is usually based on a hashing function. The local node | |||
ation Groups) is usually based on a | that performs the load-balancing is required to read some header fields in | |||
hashing function. The local node which performs the load-balancing is require | the incoming packets and then compute a hash based on those fields. The | |||
d to read some header fields in the incoming packets | result of the hash is finally mapped to a list of outgoing next hops. The | |||
and then computes a hash based on those fields. The result of the hash is fin | hashing technique is required to perform a per-flow load-balancing and | |||
ally mapped to a list of outgoing nexthops. | thus, prevents packet misordering. For IP traffic, the usual fields that | |||
The hashing technique is required to perform a per-flow load-balancing and th | are hashed are the source address, the destination address, the protocol | |||
us prevents packet misordering. For IP traffic, the usual fields that are hashed | type, and, if provided by the upper layer, the source port and destination | |||
are | port. | |||
the source address, the destination address, the protocol type, and, if provi | ||||
ded by the upper layer, the source port and destination port. | ||||
</t> | </t> | |||
<t> | <t pn="section-1-4"> | |||
The MPLS architecture brings some challenges when an LSR tries to look up at | The MPLS architecture brings some challenges when an LSR (Label Switching | |||
header fields. An LSR (Label Switching Router) needs be able to look up at heade | Router) tries to look up at header fields. An LSR needs be able to look up | |||
r fields that are beyond the MPLS label stack while the MPLS header does not pro | at header fields that are beyond the MPLS label stack while the MPLS header | |||
vide any information about the upper layer protocol. | does not provide any information about the upper-layer protocol. An LSR | |||
An LSR must perform a deeper inspection compared to an ingress router which c | must perform a deeper inspection compared to an ingress router, which could | |||
ould be challenging for some hardware. | be challenging for some hardware. Entropy labels (ELs) <xref target="RFC6790 | |||
Entropy label (EL) <xref target="RFC6790"/> is a technique used in the MPLS d | " format="default" sectionFormat="of" derivedContent="RFC6790"/> are used in the | |||
ata | MPLS data | |||
plane to provide entropy for load-balancing. | plane to provide entropy for load-balancing. The idea behind the entropy | |||
The idea behind the entropy label is that the ingress router computes a hash | label is that the ingress router computes a hash based on several fields | |||
based on several fields from a given packet and places the result in an addition | from a given packet and places the result in an additional label named | |||
al label, named "entropy label". | "entropy label". Then, this entropy label can be used as part of the hash | |||
Then, this entropy label can be used as part of the hash keys used by an LSR. | keys used by an LSR. Using the entropy label as part of the hash keys | |||
Using the entropy label as part of the hash keys reduces the need for deep pack | reduces the need for deep packet inspection in the LSR while keeping a good | |||
et inspection in the LSR while keeping a good level of entropy in the load-balan | level of entropy in the load-balancing. When the entropy label is used, | |||
cing. | the keys used in the hashing functions are still a local configuration | |||
When the entropy label is used, the keys used in the hashing functions are st | matter, and an LSR may use solely the entropy label or a combination of | |||
ill a local configuration matter and an LSR may use solely the entropy label or | multiple fields from the incoming packet. | |||
a combination of multiple fields from the incoming packet. | </t> | |||
</t> | <t pn="section-1-5"> | |||
<t> | ||||
When using LSP | When using LSP | |||
hierarchies, there are implications on how <xref target="RFC6790"/> should be | hierarchies, there are implications on how <xref target="RFC6790" format="def ault" sectionFormat="of" derivedContent="RFC6790"/> should be | |||
applied. The current document addresses the case where a hierarchy | applied. The current document addresses the case where a hierarchy | |||
is created at a single LSR as required by Segment Routing. | is created at a single LSR as required by Segment Routing. | |||
</t> | </t> | |||
<t> | <t pn="section-1-6"> | |||
A use-case requiring load-balancing with SR is given in <xref target="usecase | A use case requiring load-balancing with SR is given in <xref target="usecase | |||
"/>. A recommended solution is | " format="default" sectionFormat="of" derivedContent="Section 3"/>. A recommend | |||
described in <xref target="solution"/> keeping in consideration the limitatio | ed solution is | |||
ns of | described in <xref target="solution" format="default" sectionFormat="of" deri | |||
implementations when applying <xref target="RFC6790"/> to deeper label stacks | vedContent="Section 7"/> keeping in consideration the limitations of | |||
. | implementations when applying <xref target="RFC6790" format="default" section | |||
Format="of" derivedContent="RFC6790"/> to deeper label stacks. | ||||
Options that were considered to arrive at the recommended solution | Options that were considered to arrive at the recommended solution | |||
are documented for historical purposes in <xref target="other-options"/>. | are documented for historical purposes in <xref target="other-options" format | |||
="default" sectionFormat="of" derivedContent="Section 10"/>. | ||||
</t> | ||||
<section title="Requirements Language" toc="default"> | ||||
<t> The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | ||||
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | ||||
"OPTIONAL" in this document are to be interpreted as described in | ||||
BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, | ||||
they appear in all | ||||
capitals, as shown here. | ||||
</t> | </t> | |||
<section toc="include" numbered="true" removeInRFC="false" pn="section-1.1 | ||||
"> | ||||
<name slugifiedName="name-requirements-language">Requirements Language</ | ||||
name> | ||||
<t pn="section-1.1-1"> | ||||
The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", | ||||
"<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL NOT</bcp14> | ||||
", | ||||
"<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", | ||||
"<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>", | ||||
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to | ||||
be | ||||
interpreted as described in BCP 14 <xref target="RFC2119" format="default" s | ||||
ectionFormat="of" derivedContent="RFC2119"/> <xref target="RFC8174" format="defa | ||||
ult" sectionFormat="of" derivedContent="RFC8174"/> when, and only when, they app | ||||
ear in all capitals, as | ||||
shown here. | ||||
</t> | ||||
</section> | </section> | |||
</section> | </section> | |||
<section toc="include" numbered="true" removeInRFC="false" pn="section-2"> | ||||
<section title="Abbreviations and Terminology" toc="default"> | <name slugifiedName="name-abbreviations-and-terminolo">Abbreviations and T | |||
<t> | erminology</name> | |||
<list style="hanging"> | <dl newline="false" spacing="normal" indent="10" pn="section-2-1"> | |||
<t>Adj-SID - Adjacency Segment Identifier</t> | <dt pn="section-2-1.1">Adj-SID</dt> | |||
<t>ECMP - Equal Cost Multi Path</t> | <dd pn="section-2-1.2">Adjacency Segment Identifier</dd> | |||
<t>EL - Entropy Label</t> | <dt pn="section-2-1.3">ECMP</dt> | |||
<t>ELI - Entropy Label Indicator</t> | <dd pn="section-2-1.4">Equal-Cost Multipath</dd> | |||
<t>ELC - Entropy Label Capability</t> | <dt pn="section-2-1.5">EL</dt> | |||
<t>ERLD - Entropy Readable Label Depth</t> | <dd pn="section-2-1.6">Entropy Label</dd> | |||
<t>FEC - Forwarding Equivalent Class</t> | <dt pn="section-2-1.7">ELI</dt> | |||
<t>LAG - Link Aggregation Group</t> | <dd pn="section-2-1.8">Entropy Label Indicator</dd> | |||
<t>LSP - Label Switched Path</t> | <dt pn="section-2-1.9">ELC</dt> | |||
<t>LSR - Label Switching Router</t> | <dd pn="section-2-1.10">Entropy Label Capability</dd> | |||
<t>MPLS - Multiprotocol Label Switching</t> | <dt pn="section-2-1.11">ERLD</dt> | |||
<t>MSD - Maximum SID Depth</t> | <dd pn="section-2-1.12">Entropy Readable Label Depth</dd> | |||
<t>Node-SID - Node Segment Identifier</t> | <dt pn="section-2-1.13">FEC</dt> | |||
<t>OAM - Operation, Administration and Maintenance</t> | <dd pn="section-2-1.14">Forwarding Equivalence Class</dd> | |||
<t>RLD - Readable Label Depth</t> | <dt pn="section-2-1.15">LAG</dt> | |||
<t>SID - Segment Identifier</t> | <dd pn="section-2-1.16">Link Aggregation Group</dd> | |||
<t>SPT - Shortest Path Tree</t> | <dt pn="section-2-1.17">LSP</dt> | |||
<t>SR - Segment Routing</t> | <dd pn="section-2-1.18">Label Switched Path</dd> | |||
<t>SRGB - Segment Routing Global Block</t> | <dt pn="section-2-1.19">LSR</dt> | |||
<t>VPN - Virtual Private Network</t> | <dd pn="section-2-1.20">Label Switching Router</dd> | |||
</list> | <dt pn="section-2-1.21">MPLS</dt> | |||
</t> | <dd pn="section-2-1.22">Multiprotocol Label Switching</dd> | |||
<dt pn="section-2-1.23">MSD</dt> | ||||
<dd pn="section-2-1.24">Maximum SID Depth</dd> | ||||
<dt pn="section-2-1.25">Node SID</dt> | ||||
<dd pn="section-2-1.26">Node Segment Identifier</dd> | ||||
<dt pn="section-2-1.27">OAM</dt> | ||||
<dd pn="section-2-1.28">Operations, Administration, and Maintenance</dd> | ||||
<dt pn="section-2-1.29">RLD</dt> | ||||
<dd pn="section-2-1.30">Readable Label Depth</dd> | ||||
<dt pn="section-2-1.31">SID</dt> | ||||
<dd pn="section-2-1.32">Segment Identifier</dd> | ||||
<dt pn="section-2-1.33">SPT</dt> | ||||
<dd pn="section-2-1.34">Shortest Path Tree</dd> | ||||
<dt pn="section-2-1.35">SR</dt> | ||||
<dd pn="section-2-1.36">Segment Routing</dd> | ||||
<dt pn="section-2-1.37">SRGB</dt> | ||||
<dd pn="section-2-1.38">Segment Routing Global Block</dd> | ||||
<dt pn="section-2-1.39">VPN</dt> | ||||
<dd pn="section-2-1.40">Virtual Private Network</dd> | ||||
</dl> | ||||
</section> | </section> | |||
<section anchor="usecase" title="Use-case requiring multipath load-balancing" | <section anchor="usecase" toc="include" numbered="true" removeInRFC="false" | |||
toc="default"> | pn="section-3"> | |||
<figure title="Figure 1: Traffic engineering use-case"> | <name slugifiedName="name-use-case-requiring-multipat">Use Case Requiring | |||
<artwork> | Multipath Load-Balancing</name> | |||
+------+ | <t pn="section-3-1"> | |||
| | | Traffic engineering is one of the applications of MPLS and is also a | |||
+-------| P3 |-----+ | requirement for Segment Routing <xref target="RFC7855" format="default" sectionF | |||
| +-----| |---+ | | ormat="of" derivedContent="RFC7855"/>. Consider the | |||
L3| |L4 +------+ L1| |L2 +----+ | topology shown in <xref target="fig_TE_use_case" format="default" sectionFormat= | |||
| | | | +--| P4 |--+ | "of" derivedContent="Figure 1"/>. The LSR S requires data to be sent to LSR D a | |||
+-----+ +-----+ +-----+ | +----+ | +-----+ | long | |||
| S |-----| P1 |------------| P2 |--+ +--| D | | a traffic-engineered path that goes over the link L1. Good load-balancing is | |||
| | | | | |--+ +--| | | also required across equal-cost paths (including parallel links). To steer | |||
+-----+ +-----+ +-----+ | +----+ | +-----+ | traffic along a path that crosses link L1, the label stack that LSR S creates | |||
+--| P5 |--+ | consists of a label to the Node SID of LSR P3 stacked over the label for the | |||
+----+ | Adj-SID (Adjacency Segment Identifier) of link L1 and that in turn is stacked | |||
S=Source LSR, D=Destination LSR, P1,P2,P3,P4,P5=Transit LSRs, | over the label to the Node SID of LSR D. For simplicity, lets assume that all | |||
L1,L2,L3,L4=Links | LSRs use the same label space for Segment Routing (as a reminder, it is called | |||
the SRGB, Segment Routing Global Block). Let L_N-Px denote the label to be | ||||
</artwork> | used to reach the Node SID of LSR Px. Let L_A-Ln denote the label used for | |||
</figure> | the Adj-SID for link Ln. In our example, the LSR S must use the label stack | |||
<t> | <L_N-P3, L_A-L1, L_N-D>. However, to achieve good load-balancing over | |||
Traffic-engineering is one of the applications of MPLS and is | the equal-cost paths P2-P4-D, P2-P5-D, and the parallel links L3 and L4, a | |||
also a requirement for Segment Routing <xref target="RFC7855"/>. | mechanism such as entropy labels <xref target="RFC6790" format="default" section | |||
Consider the topology shown in Figure 1. | Format="of" derivedContent="RFC6790"/> should be adapted | |||
The LSR S requires data to be sent to LSR D along a traffic-engineered path t | for Segment Routing. Indeed, the Source Packet Routing in Networking (SPRING) | |||
hat goes over the link L1. | architecture with the MPLS data plane <xref target="RFC8660" format="default" se | |||
Good load-balancing is | ctionFormat="of" derivedContent="RFC8660"/> uses nested | |||
also required across equal cost paths (including parallel links). To | MPLS LSPs composing the source-routed label stack. | |||
steer traffic along a path that crosses link L1, the label stack | </t> | |||
that LSR S creates consists of a label to the Node-SID of LSR P3, | <figure anchor="fig_TE_use_case" align="left" suppress-title="false" pn="f | |||
stacked over the label for the Adj-SID (Adjacency Segment Identifier) of link | igure-1"> | |||
L1 and that in | <name slugifiedName="name-traffic-engineering-use-cas">Traffic-Engineeri | |||
turn is stacked over the label to the Node-SID of LSR D. For | ng Use Case</name> | |||
simplicity lets assume that all LSRs use the same label space for | <artwork name="" type="" align="left" alt="" pn="section-3-2.1"> | |||
Segment Routing (as a reminder, it is called the SRGB, Segment Routing Global | +------+ | |||
Block). Let L_N-Px denote the label to be used | | | | |||
to reach the Node-SID of LSR Px. Let L_A-Ln denote the label used | +-------| P3 |-----+ | |||
for the Adj-SID for link Ln. In our example, the LSR S must use the label | | +-----| |---+ | | |||
stack <L_N-P3, L_A-L1, L_N-D>. However, to | L3| |L4 +------+ L1| |L2 +----+ | |||
achieve a good load-balancing over the equal cost paths P2-P4-D, | | | | | +--| P4 |--+ | |||
P2-P5-D and the parallel links L3 and L4, a mechanism such as entropy | +-----+ +-----+ +-----+ | +----+ | +-----+ | |||
labels <xref target="RFC6790"/> should be adapted for Segment Routing. | | S |-----| P1 |------------| P2 |--+ +--| D | | |||
Indeed, the SPRING architecture with the MPLS dataplane (<xref target="I-D.ie | | | | | | |--+ +--| | | |||
tf-spring-segment-routing-mpls"/>) uses nested MPLS LSPs composing the source ro | +-----+ +-----+ +-----+ | +----+ | +-----+ | |||
uted label stack. | +--| P5 |--+ | |||
</t> | +----+ | |||
<t> | Key: | |||
S = Source LSR | ||||
D = Destination LSR | ||||
P1, P2, P3, P4, P5 = Transit LSRs | ||||
L1, L2, L3, L4 = Links | ||||
</artwork> | ||||
</figure> | ||||
<t pn="section-3-3"> | ||||
An MPLS node may have limitations in the number of labels it can push. It may also have a limitation in the number of labels it can inspect when looking for hash keys during load-balancing. | An MPLS node may have limitations in the number of labels it can push. It may also have a limitation in the number of labels it can inspect when looking for hash keys during load-balancing. | |||
While the entropy label is normally inserted at the bottom of the transport t unnel, this may prevent an LSR from taking into account the EL in its load-balan cing function if the EL is too deep in the stack. | While the entropy label is normally inserted at the bottom of the transport t unnel, this may prevent an LSR from taking into account the EL in its load-balan cing function if the EL is too deep in the stack. | |||
In a Segment Routing environment, it is important to define the consideration s that needs to be taken into account when inserting an EL. | In a Segment Routing environment, it is important to define the consideration s that need to be taken into account when inserting an EL. | |||
Multiple ways to apply entropy labels were considered and are | Multiple ways to apply entropy labels were considered and are | |||
documented in <xref target="other-options"/> along with their trade-offs. A | documented in <xref target="other-options" format="default" sectionFormat="of | |||
recommended | " derivedContent="Section 10"/> along with their trade-offs. A recommended | |||
solution is described in <xref target="solution"/>. | solution is described in <xref target="solution" format="default" sectionForm | |||
</t> | at="of" derivedContent="Section 7"/>. | |||
</t> | ||||
</section> | </section> | |||
<section anchor="erld_definition" title="Entropy Readable Label Depth"> | <section anchor="erld_definition" numbered="true" toc="include" removeInRFC= | |||
<t> | "false" pn="section-4"> | |||
<name slugifiedName="name-entropy-readable-label-dept">Entropy Readable La | ||||
bel Depth</name> | ||||
<t pn="section-4-1"> | ||||
The Entropy Readable Label Depth (ERLD) is defined as the number of labels a router can both: | The Entropy Readable Label Depth (ERLD) is defined as the number of labels a router can both: | |||
<list style="letters"> | </t> | |||
<t>Read in an MPLS packet received on its incoming interface(s) (starting fro | <ol spacing="normal" type="a" start="1" pn="section-4-2"> | |||
m the top of the stack).</t> | <li pn="section-4-2.1" derivedCounter="a.">Read in an MPLS packet receiv | |||
<t>Use in its load-balancing function.</t> | ed on its incoming interface(s) (starting from the top of the stack).</li> | |||
</list> | <li pn="section-4-2.2" derivedCounter="b.">Use in its load-balancing fun | |||
</t> | ction.</li> | |||
<t>The ERLD means that the router will perform load-balancing using the EL la | </ol> | |||
bel if the EL is placed within the first ERLD labels.</t> | <t pn="section-4-3">The ERLD means that the router will perform load-balan | |||
<t>A router capable of reading N labels but not using an EL located within th | cing using the EL if the EL is placed within the first ERLD labels.</t> | |||
ose N labels MUST consider its ERLD to be 0.</t> | <t pn="section-4-4">A router capable of reading N labels but not using an | |||
<t> | EL located within those N labels <bcp14>MUST</bcp14> consider its ERLD to be 0.< | |||
In a distributed switching architecture, each linecard may have a different c | /t> | |||
apability in terms of ERLD. For simplicity, an implementation MAY use the minimu | <t pn="section-4-5"> | |||
m ERLD of all linecards as the ERLD value for the system. | In a distributed switching architecture, each line card may have a | |||
</t> | different capability in terms of ERLD. For simplicity, an implementation | |||
<t>There may also be a case where a router has a fast switching path (handled | <bcp14>MAY</bcp14> use the minimum ERLD of all line cards as the ERLD value f | |||
by an ASIC or network processor) and a slow switching path (handled by a CPU) w | or the system. | |||
ith a different ERLD for each switching path. Again, for simplicity's sake, an i | </t> | |||
mplementation MAY use the minimum ERLD as the ERLD value for the system.</t> | <t pn="section-4-6">There may also be a case where a router has a fast swi | |||
<t>The drawback of using a single ERLD for a system lower than the capability | tching path | |||
of one or more specific component is that it may increase the number of ELI/ELs | (handled by an Application-Specific Integrated Circuit, or ASIC, or network p | |||
inserted. This leads to an increase of the label stack size and may have an imp | rocessor) and a slow switching path (handled by a CPU) with a different ERLD for | |||
act on the capability of the ingress node to push this label stack.</t> | each switching path. Again, for simplicity's sake, an implementation <bcp14>MAY | |||
<t>Examples:</t> | </bcp14> use the minimum ERLD as the ERLD value for the system.</t> | |||
<figure title="Figure 2: Label stacks with ELI/EL"> | <t pn="section-4-7">The drawback of using a single ERLD for a system lower | |||
<artwork> | than the capability of one or more specific components is that it may increase | |||
| Payload | | the number of ELI/ELs inserted. This leads to an increase of the label stack siz | |||
+----------+ | e and may have an impact on the capability of the ingress node to push this labe | |||
| Payload | | EL | P7 | l stack.</t> | |||
+----------+ +----------+ | <t pn="section-4-8">Examples:</t> | |||
| Payload | | EL | | ELI | | <figure anchor="fig_label_stacks" align="left" suppress-title="false" pn=" | |||
+----------+ +----------+ +----------+ | figure-2"> | |||
| Payload | | EL | | ELI | | Label 50 | | <name slugifiedName="name-label-stacks-with-eli-el">Label Stacks with EL | |||
+----------+ +----------+ +----------+ +----------+ | I/EL</name> | |||
| Payload | | EL | | ELI | | Label 40 | | Label 40 | | <artwork name="" type="" align="left" alt="" pn="section-4-9.1"> | |||
+----------+ +----------+ +----------+ +----------+ +----------+ | | Payload | | |||
| EL | | ELI | | Label 30 | | Label 30 | | Label 30 | | +----------+ | |||
+----------+ +----------+ +----------+ +----------+ +----------+ | | Payload | | EL | P7 | |||
| ELI | | Label 20 | | Label 20 | | Label 20 | | Label 20 | | +----------+ +----------+ | |||
+----------+ +----------+ +----------+ +----------+ +----------+ | | Payload | | EL | | ELI | | |||
| Label 16 | | Label 16 | | Label 16 | | Label 16 | | Label 16 | P1 | +----------+ +----------+ +----------+ | |||
+----------+ +----------+ +----------+ +----------+ +----------+ | | Payload | | EL | | ELI | | Label 50 | | |||
Packet 1 Packet 2 Packet 3 Packet 4 Packet 5 | +----------+ +----------+ +----------+ +----------+ | |||
</artwork> | | Payload | | EL | | ELI | | Label 40 | | Label 40 | | |||
</figure> | +----------+ +----------+ +----------+ +----------+ +----------+ | |||
<t> | | EL | | ELI | | Label 30 | | Label 30 | | Label 30 | | |||
In Figure 2, we consider the displayed packets received on a router interface | +----------+ +----------+ +----------+ +----------+ +----------+ | |||
. We consider also a single ERLD value for the router. | | ELI | | Label 20 | | Label 20 | | Label 20 | | Label 20 | | |||
<list style="symbols"> | +----------+ +----------+ +----------+ +----------+ +----------+ | |||
<t>If the router has an ERLD of 3, it will be able to load-balance Packet 1 d | | Label 16 | | Label 16 | | Label 16 | | Label 16 | | Label 16 | P1 | |||
isplayed in Figure 2 using the EL as part of the load-balancing keys. The ERLD v | +----------+ +----------+ +----------+ +----------+ +----------+ | |||
alue of 3 means that the router can read and take into account the entropy label | Packet 1 Packet 2 Packet 3 Packet 4 Packet 5 | |||
for load-balancing if it is placed between position 1 (top of the MPLS label st | </artwork> | |||
ack) and position 3.</t> | </figure> | |||
<t>If the router has an ERLD of 5, it will be able to load-balance Packets 1 | <t pn="section-4-10"> | |||
to 3 in Figure 2 using the EL as part of the load-balancing keys. Packets 4 and | In <xref target="fig_label_stacks" format="default" sectionFormat="of" derive | |||
5 have the EL placed at a position greater than 5, so the router is not able to | dContent="Figure 2"/>, we consider the displayed packets received on a router in | |||
read it and use as part of the load-balancing keys.</t> | terface. We consider also a single ERLD value for the router. | |||
<t>If the router has an ERLD of 10, it will be able to load-balance all the p | </t> | |||
ackets displayed in Figure 2 using the EL as part of the load-balancing keys.</t | <ul spacing="normal" bare="false" empty="false" pn="section-4-11"> | |||
> | <li pn="section-4-11.1">If the router has an ERLD of 3, it will be able | |||
</list> | to load-balance Packet 1 displayed in <xref target="fig_label_stacks" format="de | |||
</t> | fault" sectionFormat="of" derivedContent="Figure 2"/> using the EL as part of th | |||
e load-balancing keys. The ERLD value of 3 means that the router can read and ta | ||||
<t>To allow an efficient load-balancing based on entropy labels, a router run | ke into account the entropy label for load-balancing if it is placed between pos | |||
ning SPRING SHOULD advertise its ERLD (or ERLDs), so all the other SPRING router | ition 1 (top of the MPLS label stack) and position 3.</li> | |||
s in the network are aware of its capability. How this advertisement is done is | <li pn="section-4-11.2">If the router has an ERLD of 5, it will be able | |||
outside the scope of this document (see <xref target="erld"/> for potential appr | to load-balance Packets | |||
oaches). | 1 to 3 in <xref target="fig_label_stacks" format="default" sectionFormat="of" | |||
</t> | derivedContent="Figure 2"/> using the EL as part of the load-balancing keys. Pa | |||
<t> | ckets | |||
4 and 5 have the EL placed at a position greater than 5, so the router is | ||||
not able to read it and use it as part of the load-balancing keys.</li> | ||||
<li pn="section-4-11.3">If the router has an ERLD of 10, it will be able | ||||
to load-balance all the packets displayed in <xref target="fig_label_stacks" fo | ||||
rmat="default" sectionFormat="of" derivedContent="Figure 2"/> using the EL as pa | ||||
rt of the load-balancing keys.</li> | ||||
</ul> | ||||
<t pn="section-4-12">To allow an efficient load-balancing based on entropy | ||||
labels, a router running SPRING <bcp14>SHOULD</bcp14> advertise its ERLD (or ER | ||||
LDs), so all the other SPRING routers in the network are aware of its capability | ||||
. How this advertisement is done is outside the scope of this document (see <xre | ||||
f target="erld" format="default" sectionFormat="of" derivedContent="Section 7.2. | ||||
1"/> for potential approaches). | ||||
</t> | ||||
<t pn="section-4-13"> | ||||
To advertise an ERLD value, a SPRING router: | To advertise an ERLD value, a SPRING router: | |||
<list style="symbols"> | </t> | |||
<t>MUST be entropy label capable and, as a consequence, MUST apply the datapl | <ul spacing="normal" bare="false" empty="false" pn="section-4-14"> | |||
ane procedures defined in <xref target="RFC6790"/>.</t> | <li pn="section-4-14.1"> | |||
<t>MUST be able to read an ELI/EL which is located within its ERLD value.</t> | <bcp14>MUST</bcp14> be entropy label capable and, as a consequence, <b | |||
<t>MUST take into account an EL within the first ERLD labels in its load-bala | cp14>MUST</bcp14> apply the data-plane procedures defined in <xref target="RFC67 | |||
ncing function.</t> | 90" format="default" sectionFormat="of" derivedContent="RFC6790"/>.</li> | |||
</list> | <li pn="section-4-14.2"> | |||
</t> | <bcp14>MUST</bcp14> be able to read an ELI/EL, which is located within | |||
</section> | its ERLD value.</li> | |||
<section anchor="msd" title="Maximum SID Depth"> | <li pn="section-4-14.3"> | |||
<t> | <bcp14>MUST</bcp14> take into account an EL within the first ERLD labe | |||
The Maximum SID Depth defines the maximum number of labels that a particular | ls in its load-balancing function.</li> | |||
node can impose on a packet. This can include any kind of labels (service, entro | </ul> | |||
py, transport...). | </section> | |||
In an MPLS network, the MSD is a limit of the head-end of an SR tunnel or a B | <section anchor="msd" numbered="true" toc="include" removeInRFC="false" pn=" | |||
inding-SID | section-5"> | |||
anchor node that performs imposition of additional labels on an existing labe | <name slugifiedName="name-maximum-sid-depth">Maximum SID Depth</name> | |||
l stack. | <t pn="section-5-1"> | |||
</t> | The Maximum SID Depth defines the maximum number of labels that a | |||
<t> | particular node can impose on a packet. This can include any kind of labels | |||
Depending on the number of MPLS operations (POP, SWAP...) to be performed bef | (service, entropy, transport, etc.). In an MPLS network, the MSD is a | |||
ore the PUSH, the MSD can vary due to hardware or software limitations. | limit of the head-end of an SR tunnel or a Binding SID anchor node that | |||
As for the ERLD, different MSD limits can exist within a single node based on | performs imposition of additional labels on an existing label stack. | |||
the linecard types used in a distributed switching system. Thus, the MSD is a p | </t> | |||
er link and/or per node property. | <t pn="section-5-2"> | |||
</t> | Depending on the number of MPLS operations (POP, SWAP, etc.) to be performed | |||
<t> | before the PUSH, the MSD can vary due to hardware or software limitations. | |||
An external controller can be used to program a label stack on a | As for the ERLD, different MSD limits can exist within a single node based | |||
particular node. This node SHOULD advertise its MSD to the controller in orde | on the line-card types used in a distributed switching system. Thus, the MSD | |||
r to let the controller know the maximum label stack depth of the path computed | is a per link and/or per-node property. | |||
that is supported on the head-end. | </t> | |||
How this advertisement is done is | <t pn="section-5-3"> | |||
outside the scope of this document (<xref target="I-D.ietf-isis-segment-routi | An external controller can be used to program a label stack on a particular | |||
ng-msd"/>, <xref target="I-D.ietf-isis-segment-routing-msd"/> and <xref target=" | node. This node <bcp14>SHOULD</bcp14> advertise its MSD to the controller | |||
I-D.ietf-idr-bgp-ls-segment-routing-msd"/> provide examples of advertisement of | in order to let the controller know the maximum label stack depth of the | |||
MSD). | path computed that is supported on the head-end. | |||
As the controller does not have | ||||
the knowledge of the entire label stack to be pushed by the node, in addition | How this advertisement is done is outside the scope of this | |||
to the MSD value, the | document. (<xref target="RFC8476" format="default" sectionFormat="of" derived | |||
node SHOULD advertise the type of the MSD. | Content="RFC8476"/>, <xref target="RFC8491" format="default" sectionFormat="of" | |||
For instance, the MSD value can represent the limit for pushing transport lab | derivedContent="RFC8491"/>, and <xref target="I-D.ietf-idr-bgp-ls-segment-routin | |||
els only while in reality the node can push an additional service label. As anot | g-msd" format="default" sectionFormat="of" derivedContent="MSD-BGP"/> provide | |||
her example, the MSD value can represent the full limit of the node including al | examples of advertisement of the MSD.) As the controller does not have the | |||
l label types (transport, service, entropy...). | knowledge of the entire label stack to be pushed by the node, in addition | |||
This gives the ability for the controller to program a label stack while leav | to the MSD value, the node <bcp14>SHOULD</bcp14> advertise the type of the | |||
ing room for the local node to add more labels (e.g., service, entropy,...) with | MSD. For instance, the MSD value can represent the limit for pushing | |||
out reaching the hardware/software limit. | transport labels only while in reality the node can push an additional | |||
If the node does not provide the meaning of the MSD value, the controller cou | service label. As another example, the MSD value can represent the full | |||
ld program an LSP using a number of labels equal to the full limit of the node. | limit of the node including all label types (transport, service, entropy, | |||
When receiving this label stack from the controller, the ingress node may not be | etc.). This gives the ability for the controller to program a label stack | |||
able to add any service (L2VPN, L3VPN, EVPN...) label on top of this label stac | while leaving room for the local node to add more labels (e.g., service, | |||
k. | entropy, etc.) without reaching the hardware/software limit. If the node | |||
The consequence could be for the ingress node to drop service packets that sh | does not provide the meaning of the MSD value, the controller could program | |||
ould have been forwarded over the LSP. | an LSP using a number of labels equal to the full limit of the node. When | |||
</t> | receiving this label stack from the controller, the ingress node may not be | |||
<figure title="Figure 3"> | able to add any service (L2VPN, L3VPN, EVPN, etc.) label on top of this | |||
<artwork> | label stack. The consequence could be for the ingress node to drop service | |||
packets that should have been forwarded over the LSP. | ||||
</t> | ||||
<figure anchor="fig_packet" align="left" suppress-title="false" pn="figure | ||||
-3"> | ||||
<name slugifiedName="name-topology-illustrating-label">Topology Illustra | ||||
ting Label Stack Reduction</name> | ||||
<artwork name="" type="" align="left" alt="" pn="section-5-4.1"> | ||||
P7 ---- P8 ---- P9 | P7 ---- P8 ---- P9 | |||
/ \ | / \ | |||
PE1 --- P1 --- P2 --- P3 --- P4 --- P5 --- P6 --- PE2 | PE1 --- P1 --- P2 --- P3 --- P4 --- P5 --- P6 --- PE2 | |||
| \ | | | \ | | |||
----> P10 \ | | ||||
IP Pkt | \ | | IP Pkt | \ | | |||
P11 --- P12 --- P13 | P11 --- P12 --- P13 | |||
100 10000 | 100 10000 | |||
</artwork> | </artwork> | |||
</figure> | </figure> | |||
<t> | <t pn="section-5-5"> | |||
In Figure 3, an IP packet comes into the MPLS network at PE1. All metrics are | In <xref target="fig_packet" format="default" sectionFormat="of" derivedConte | |||
considered equal to 1 except P12-P13 which is 10000 and P11-P12 which is 100. | nt="Figure 3"/>, an IP packet comes into the MPLS network at PE1. All metrics | |||
PE1 wants to steer the traffic using a SPRING path to PE2 along PE1->P1->P7-> | are considered equal to 1 except P12-P13, which is 10000, and P11-P12, | |||
P8->P9->P4->P5->P10->P11->P12->P13->PE2. | which is 100. PE1 wants to steer the traffic using a SPRING path to PE2 | |||
By using Adj-SIDs only, PE1 (acting as an I-LSR) will be required to push 10 | along PE1 -> P1 -> P7 -> P8 -> P9 -> P4 -> P5 -> P10 -&g | |||
labels on the IP packet received and thus requires an MSD of 10. | t; P11 -> P12 -> P13 | |||
If the IP packet should be carried over an MPLS service like a regular layer | -> PE2. By using Adj-SIDs only, PE1 (acting as an ingress LSR, also known | |||
3 VPN, an additional service label should be imposed, requiring an MSD of 11 for | as an I-LSR) will be required to push 10 labels on the IP packet received | |||
PE1. | and thus, requires an MSD of 10. If the IP packet should be carried over | |||
In addition, if PE1 wants to insert an ELI/EL for load-balancing purpose, PE1 | an MPLS service like a regular layer 3 VPN, an additional service label | |||
will need to push 13 labels on the IP packet requiring an MSD of 13. | should be imposed requiring an MSD of 11 for PE1. In addition, if PE1 | |||
</t> | wants to insert an ELI/EL for load-balancing purposes, PE1 will need to | |||
<t> | push 13 labels on the IP packet requiring an MSD of 13. | |||
In the SPRING architecture, Node-SIDs or Binding-SIDs can be used to reduce t | </t> | |||
he label stack size. As an example, to steer the traffic on the same path as bef | <t pn="section-5-6"> | |||
ore, PE1 could use the following label stack: <Node_P9, Node_P5, Binding_P5, | In the SPRING architecture, Node SIDs or Binding SIDs can be used to reduce t | |||
Node_PE2>. | he label stack size. As an example, to steer the traffic on the same path as bef | |||
In this example we consider a combination of Node-SIDs and a Binding-SID adve | ore, PE1 could use the following label stack: <Node_P9, Node_P5, Binding_P5, | |||
rtised by P5 that will stitch the traffic along the path P10->P11->P12->P13. The | Node_PE2>. | |||
instruction associated with the Binding-SID at P5 is thus to swap Binding_P5 to | In this example, we consider a combination of Node SIDs and a Binding SID | |||
Adj_P12-P13 and then push <Adj_P11-P12, Node_P11>. | advertised by P5 that will stitch the traffic along the path P10 -> P11 | |||
P5 acts as a stitching node that pushes additional labels on an existing labe | -> P12 -> P13. The instruction associated with the Binding SID at P5 is | |||
l stack, P5's MSD needs also to be taken into account and may limit the number o | thus to swap Binding_P5 to Adj_P12-P13 and then push <Adj_P11-P12, Node_P11& | |||
f labels that can be imposed. | gt;. | |||
</t> | P5 acts as a stitching node that pushes additional labels on an existing labe | |||
</section> | l stack; P5's MSD needs also to be taken into account and may limit the number o | |||
<section anchor="stitching" title="LSP stitching using the Binding-SID"> | f labels that can be imposed. | |||
<t> | </t> | |||
The Binding-SID allows binding a segment identifier to an existing LSP. As ex | </section> | |||
amples, the Binding-SID can represent an RSVP-TE tunnel, an LDP path (through th | <section anchor="stitching" numbered="true" toc="include" removeInRFC="false | |||
e mapping server advertisement), or a SPRING path. | " pn="section-6"> | |||
Each tail-end router of an MPLS LSP associated with a Binding-SID has its own | <name slugifiedName="name-lsp-stitching-using-the-bin">LSP Stitching Using | |||
entropy label capability. The entropy label capability of the associated LSP is | the Binding SID</name> | |||
advertised in the control plane protocol used to signal the LSP. | <t pn="section-6-1"> | |||
</t> | The Binding SID allows binding a segment identifier to an existing LSP. As | |||
<t> | examples, the Binding SID can represent an RSVP-TE tunnel, an LDP path | |||
In Figure 4, we consider that: | (through the Mapping Server Advertisement), or a SPRING path. Each | |||
<list style="symbols"> | tail-end router of an MPLS LSP associated with a Binding SID has its own | |||
<t>P6, PE2, P10, P11, P12, P13 are pure LDP routers.</t> | entropy label capability. The entropy label capability of the associated | |||
<t>PE1, P1, P2, P3, P4, P7, P8, P9 are pure SPRING routers.</t> | LSP is advertised in the control-plane protocol used to signal the LSP. | |||
<t>P5 is running SPRING and LDP.</t> | </t> | |||
<t>P5 acts as a mapping server and advertises Prefix SIDs for the LDP FEC | <t pn="section-6-2"> | |||
s: an index value of 20 is used for PE2.</t> | In <xref target="fig_stitching_example" format="default" sectionFormat="of" deri | |||
<t>All SPRING routers use an SRGB of [1000, 1999].</t> | vedContent="Figure 4"/>, we consider that: | |||
<t>P6 advertises label 20 for the PE2 FEC.</t> | </t> | |||
<t>Traffic from PE1 to PE2 uses the shortest path.</t> | <ul spacing="normal" bare="false" empty="false" pn="section-6-3"> | |||
</list> | <li pn="section-6-3.1">P6, PE2, P10, P11, P12, and P13 are pure LDP rout | |||
</t> | ers.</li> | |||
<figure> | <li pn="section-6-3.2">PE1, P1, P2, P3, P4, P7, P8, and P9 are pure SPRI | |||
<artwork> | NG routers.</li> | |||
<li pn="section-6-3.3">P5 is running SPRING and LDP.</li> | ||||
<li pn="section-6-3.4">P5 acts as a Mapping Server and advertises Prefix | ||||
-SIDs for the LDP FECs: an index value of 20 is used for PE2.</li> | ||||
<li pn="section-6-3.5">All SPRING routers use an SRGB of [1000, 1999].</ | ||||
li> | ||||
<li pn="section-6-3.6">P6 advertises label 20 for the PE2 FEC.</li> | ||||
<li pn="section-6-3.7">Traffic from PE1 to PE2 uses the shortest path.</ | ||||
li> | ||||
</ul> | ||||
<figure anchor="fig_stitching_example" align="left" suppress-title="false" | ||||
pn="figure-4"> | ||||
<name slugifiedName="name-example-illustrating-need-f">Example Illustrat | ||||
ing Need for ELC Propagation</name> | ||||
<artwork name="" type="" align="left" alt="" pn="section-6-4.1"> | ||||
PE1 ----- P1 -- P2 -- P3 -- P4 ---- P5 --- P6 --- PE2 | PE1 ----- P1 -- P2 -- P3 -- P4 ---- P5 --- P6 --- PE2 | |||
--> +----+ +----+ +----+ +----+ | ||||
--> +----+ +----+ +----+ +----+ | ||||
IP Pkt | IP | | IP | | IP | | IP | | IP Pkt | IP | | IP | | IP | | IP | | |||
+----+ +----+ +----+ +----+ | +----+ +----+ +----+ +----+ | |||
|1020| |1020| | 20 | | |1020| |1020| | 20 | | |||
+----+ +----+ +----+ | +----+ +----+ +----+ | |||
SPRING LDP | SPRING LDP | |||
</artwork> | </artwork> | |||
</figure> | </figure> | |||
<t>In terms of packet forwarding, by learning the mapping-server advertis | <t pn="section-6-5">In terms of packet forwarding, by learning the Mapping | |||
ement from P5, PE1 imposes a label 1020 to an IP packet destined to PE2. | Server Advertisement from P5, PE1 imposes a label 1020 to an IP packet destined | |||
SPRING routers along the shortest path to PE2 will switch the traffic unt | to PE2. | |||
il it reaches P5. P5 will perform the LSP stitching by swapping the SPRING label | SPRING routers along the shortest path to PE2 will switch the traffic | |||
1020 to the LDP label 20 advertised by the nexthop P6. | until it reaches P5. P5 will perform the LSP stitching by swapping the | |||
SPRING label 1020 to the LDP label 20 advertised by the next hop P6. | ||||
P6 will finally forward the packet using the LDP label towards PE2.</t> | P6 will finally forward the packet using the LDP label towards PE2.</t> | |||
<t> | <t pn="section-6-6"> | |||
PE1 cannot push an ELI/EL for the Binding-SID without knowing that the ta | PE1 cannot push an ELI/EL for the Binding SID without knowing that the | |||
il-end of the LSP associated with the binding (PE2) is entropy label capable. | tail end of the LSP associated with the binding (PE2) is entropy label ca | |||
</t> | pable. | |||
<t> | </t> | |||
To accommodate the mix of signaling protocols involved during the stitchi | <t pn="section-6-7"> | |||
ng, the entropy label capability SHOULD be propagated between the signaling doma | To accommodate the mix of signaling protocols involved during the stitchi | |||
ins. | ng, the entropy label capability <bcp14>SHOULD</bcp14> be propagated between the | |||
Each Binding-SID SHOULD have its own entropy label capability that MUST b | signaling domains. | |||
e inherited from the entropy label capability of the associated LSP. | Each Binding SID <bcp14>SHOULD</bcp14> have its own entropy label capabil | |||
If the router advertising the Binding-SID does not know the ELC state of | ity that <bcp14>MUST</bcp14> be inherited from the entropy label capability of t | |||
the target FEC, it MUST NOT set the ELC for the Binding-SID. | he associated LSP. | |||
An ingress node MUST NOT push an ELI/EL associated with a Binding-SID unl | If the router advertising the Binding SID does not know the ELC state | |||
ess this Binding-SID has the entropy label capability. | of the target FEC, it <bcp14>MUST NOT</bcp14> set the ELC for the | |||
How the entropy label capability is advertised for a Binding-SID is outsi | Binding SID. | |||
de the scope of this document (see <xref target="erld"/> for potential approache | An ingress node <bcp14>MUST NOT</bcp14> push an ELI/EL associated with | |||
s). | a Binding SID unless this Binding SID has the entropy label capability. | |||
</t> | How the entropy label capability is advertised for a Binding SID is outsi | |||
<t> | de the scope of this document (see <xref target="erld" format="default" sectionF | |||
In our example, if PE2 is LDP entropy label capable, it will add the entr | ormat="of" derivedContent="Section 7.2.1"/> for potential approaches). | |||
opy label capability in its LDP advertisement. When P5 receives the FEC/label bi | </t> | |||
nding for PE2, it learns about the ELC and can set the ELC in the mapping server | <t pn="section-6-8"> | |||
advertisement. Thus PE1 learns about the ELC of PE2 and may push an ELI/EL asso | In our example, if PE2 is LDP entropy label capable, it will add the | |||
ciated with the Binding-SID. | entropy label capability in its LDP advertisement. When P5 receives | |||
</t> | the FEC/label binding for PE2, it learns about the ELC and can set the | |||
<t> | ELC in the Mapping Server Advertisement. Thus, PE1 learns about the | |||
The proposed solution only works if the SPRING router advertising the Bin | ELC of PE2 and may push an ELI/EL associated with the Binding SID. | |||
ding-SID is also performing the dataplane LSP stitching. | </t> | |||
In our example, if the mapping server function is hosted on P8 instead of | <t pn="section-6-9"> | |||
P5, P8 does not know about the ELC state of PE2's LDP FEC. As a consequence, it | The proposed solution only works if the SPRING router advertising the | |||
does not set the ELC for the associated Binding-SID. | Binding SID is also performing the data-plane LSP stitching. | |||
</t> | In our example, if the Mapping Server function is hosted on P8 instead | |||
</section> | of P5, P8 does not know about the ELC state of PE2's LDP FEC. As a | |||
consequence, it does not set the ELC for the associated Binding SID. | ||||
<section anchor="solution" title="Insertion of entropy labels for SPRING path" | </t> | |||
toc="default"> | </section> | |||
<section anchor="overview" title="Overview"> | <section anchor="solution" toc="include" numbered="true" removeInRFC="false" | |||
<t> | pn="section-7"> | |||
The solution described in this section follows the dataplane processing d | <name slugifiedName="name-insertion-of-entropy-labels">Insertion of Entrop | |||
efined in <xref target="RFC6790"/>. Within a SPRING path, a node may be ingress, | y Labels for SPRING Path</name> | |||
egress, transit (regarding the entropy label processing described in <xref targ | <section anchor="overview" numbered="true" toc="include" removeInRFC="fals | |||
et="RFC6790"/>), or it can be any combination of those. | e" pn="section-7.1"> | |||
<name slugifiedName="name-overview">Overview</name> | ||||
<t pn="section-7.1-1"> | ||||
The solution described in this section follows the data-plane processing | ||||
defined in <xref target="RFC6790" format="default" sectionFormat="of" derivedCon | ||||
tent="RFC6790"/>. Within a SPRING path, a node may be ingress, egress, transit ( | ||||
regarding the entropy label processing described in <xref target="RFC6790" forma | ||||
t="default" sectionFormat="of" derivedContent="RFC6790"/>), or it can be any com | ||||
bination of those. | ||||
For example: | For example: | |||
<list style="symbols"> | </t> | |||
<t>The ingress node of a SPRING domain can be an ingress node fro | <ul spacing="normal" bare="false" empty="false" pn="section-7.1-2"> | |||
m an entropy label perspective.</t> | <li pn="section-7.1-2.1">The ingress node of a SPRING domain can be an | |||
<t>Any LSR terminating a segment of the SPRING path is an egress | ingress node from an entropy label perspective.</li> | |||
node (because it terminates the segment) but can also be a transit node if the S | <li pn="section-7.1-2.2">Any LSR terminating a segment of the SPRING p | |||
PRING path is not terminated because there is a subsequent SPRING MPLS label in | ath is an egress node (because it terminates the segment) but can also be a tran | |||
the stack.</t> | sit node if the SPRING path is not terminated because there is a subsequent SPRI | |||
<t>Any LSR processing a Binding-SID may be a transit node and an | NG MPLS label in the stack.</li> | |||
ingress node (because it may push additional labels when processing the Binding- | <li pn="section-7.1-2.3">Any LSR processing a Binding SID may be a tra | |||
SID).</t> | nsit node and an | |||
</list> | ingress node (because it may push additional labels when processing | |||
</t> | the Binding SID).</li> | |||
<t> | </ul> | |||
<t pn="section-7.1-3"> | ||||
As described earlier, an LSR may have a limitation (the ERLD) on the dept h of the label stack that it | As described earlier, an LSR may have a limitation (the ERLD) on the dept h of the label stack that it | |||
can read and process in order to do multipath load-balancing based on entropy labels.</t> | can read and process in order to do multipath load-balancing based on entropy labels.</t> | |||
<t>If an EL does not occur within the ERLD of an | <t pn="section-7.1-4">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 | 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 | 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 | must be within the ERLD of the LSR in order for the LSR to use the EL | |||
during load-balancing. | during load-balancing. | |||
</t> | </t> | |||
<t> | <t pn="section-7.1-5"> | |||
Adding a single ELI/EL pair for the entire SPRING path can also lead | 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 | 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 | 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 the stack when it reaches some LSRs (if it is too shallow). | |||
</t> | </t> | |||
<t> | <t pn="section-7.1-6"> | |||
In order for the EL to occur within the ERLD of LSRs along the path | 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 | corresponding to a SPRING label stack, multiple <ELI, EL> pairs <bcp14> MAY</bcp14> be | |||
inserted in this label stack. | inserted in this label stack. | |||
</t> | </t> | |||
<t> | <t pn="section-7.1-7"> | |||
The insertion of an ELI/EL MUST occur only with a SPRING label advertised by | The insertion of an ELI/EL <bcp14>MUST</bcp14> occur only with a SPRING | |||
an LSR that advertised an ERLD (the LSR is entropy label capable) or with a SPRI | label advertised by an LSR that advertised an ERLD (the LSR is entropy | |||
NG label associated with a Binding-SID that has the ELC set. | label capable) or with a SPRING label associated with a Binding SID that has | |||
</t> | the ELC set. | |||
<t> | </t> | |||
<t pn="section-7.1-8"> | ||||
The ELs among multiple <ELI, EL> pairs inserted in the | The ELs among multiple <ELI, EL> pairs inserted in the | |||
stack MAY be the same or different. The LSR that inserts <ELI, EL> pair s | stack <bcp14>MAY</bcp14> be the same or different. The LSR that inserts <E LI, EL> pairs | |||
can have limitations on the number of such pairs that it can insert | 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 | 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 | 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 | 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 | within that LSR's ERLD, then the load-balancing performed by that LSR | |||
would be poor. An implementation MAY consider multiple criteria when insertin | would be poor. An implementation <bcp14>MAY</bcp14> consider multiple criteri | |||
g <ELI, EL> pairs. | a when inserting <ELI, EL> pairs. | |||
</t> | </t> | |||
<section anchor="ex1" title="Example 1 where the ingress node has a suffi | <section anchor="ex1" numbered="true" toc="include" removeInRFC="false" | |||
cient MSD"> | pn="section-7.1.1"> | |||
<figure title="Figure 5"> | <name slugifiedName="name-example-1-the-ingress-node-">Example 1: The | |||
<artwork> | Ingress Node Has a Sufficient MSD</name> | |||
<figure anchor="fig_ex1" align="left" suppress-title="false" pn="figur | ||||
e-5"> | ||||
<name slugifiedName="name-accommodating-msd-limitatio">Accommodating | ||||
MSD Limitations</name> | ||||
<artwork name="" type="" align="left" alt="" pn="section-7.1.1-1.1"> | ||||
ECMP LAG LAG | ECMP LAG LAG | |||
PE1 --- P1 --- P2 --- P3 --- P4 --- P5 --- P6 --- PE2 | PE1 --- P1 --- P2 --- P3 --- P4 --- P5 --- P6 --- PE2 | |||
</artwork> | ||||
</artwork> | </figure> | |||
</figure> | <t pn="section-7.1.1-2"> | |||
<t> | In <xref target="fig_ex1" format="default" sectionFormat="of" derivedCont | |||
In Figure 5, PE1 wants to forward some MPLS VPN traffic over an explicit | ent="Figure 5"/>, PE1 wants to forward some MPLS VPN traffic over an explicit pa | |||
path to PE2 resulting in the following label stack to be pushed onto the receive | th to PE2 resulting in the following label stack to be pushed onto the received | |||
d IP header: <Adj_P1P2, Adj_set_P2P3, Adj_P3P4, Adj_P4P5, Adj_P5P6, Adj_P6PE2 | IP header: <Adj_P1P2, Adj_set_P2P3, Adj_P3P4, Adj_P4P5, Adj_P5P6, Adj_P6PE2, | |||
, VPN_label>. | VPN_label>. | |||
PE1 is limited to push a maximum of 11 labels (MSD=11). P2, P3 and P6 have an ER | PE1 is limited to push a maximum of 11 labels (MSD=11). P2, P3, and P6 have an E | |||
LD of 3 while others have an ERLD of 10. | RLD of 3 while others have an ERLD of 10. | |||
</t> | </t> | |||
<t> | <t pn="section-7.1.1-3"> | |||
PE1 can only add two ELI/EL pairs in the label stack due to its MSD limit ation. It should insert them strategically to benefit load-balancing along the l ongest part of the path. | PE1 can only add two ELI/EL pairs in the label stack due to its MSD limit ation. It should insert them strategically to benefit load-balancing along the l ongest part of the path. | |||
</t> | </t> | |||
<t> | <t pn="section-7.1.1-4"> | |||
PE1 can take into account multiple parameters when inserting ELs, as exam | PE1 can take into account multiple parameters when inserting ELs; as exam | |||
ples: | ples: | |||
<list style="symbols"> | </t> | |||
<t>The ERLD value advertised by transit nodes.</t> | <ul spacing="normal" bare="false" empty="false" pn="section-7.1.1-5"> | |||
<t>The requirement of load-balancing for a particular label value.</t> | <li pn="section-7.1.1-5.1">The ERLD value advertised by transit node | |||
<t>Any service provider preference: favor beginning of the path or end of | s.</li> | |||
the path.</t> | <li pn="section-7.1.1-5.2">The requirement of load-balancing for a p | |||
</list> | articular label value.</li> | |||
</t> | <li pn="section-7.1.1-5.3">Any service provider preference: favor be | |||
<t> | ginning of the path or end of the path.</li> | |||
In Figure 5, a good strategy may be to use the following stack <Adj_P1 | </ul> | |||
P2, Adj_set_P2P3, ELI1, EL1, Adj_P3P4, Adj_P4P5, Adj_P5P6, Adj_P6PE2, ELI2, EL2, | <t pn="section-7.1.1-6"> | |||
VPN_label>. | In <xref target="fig_ex1" format="default" sectionFormat="of" derivedCont | |||
The original stack requests P2 to forward based on a L3 adjacency set that will | ent="Figure 5"/>, a good strategy may be to use the following stack <Adj_P1P2 | |||
require load-balancing. Therefore it is important to ensure that P2 can load-bal | , Adj_set_P2P3, ELI1, EL1, Adj_P3P4, Adj_P4P5, Adj_P5P6, Adj_P6PE2, ELI2, EL2, V | |||
ance correctly. | PN_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-b | ||||
alance correctly. | ||||
As P2 has a limited ERLD of 3, an ELI/EL must be inserted just after the label t hat P2 will use to forward. | As P2 has a limited ERLD of 3, an ELI/EL must be inserted just after the label t hat P2 will use to forward. | |||
On the path to PE2, P3 has also a limited ERLD, but P3 will forward based on a r egular adjacency segment that may not require load-balancing. | On the path to PE2, P3 has also a limited ERLD, but P3 will forward based on a r egular adjacency segment that may not require load-balancing. | |||
Therefore it does not seem important to ensure that P3 can do load-balancing des | Therefore, it does not seem important to ensure that P3 can do load-balancing de | |||
pite its limited ERLD. | spite its limited ERLD. | |||
The next nodes along the forwarding path have a high ERLD that does not cause an | The next nodes along the forwarding path have a high ERLD that does not cause | |||
y issue, except P6. Moreover, P6 is using some LAGs to PE2 and so is expected to | any issue, except P6. Moreover, P6 is using some LAGs to PE2 and so is | |||
load-balance. | expected to load-balance. | |||
It becomes important to insert a new ELI/EL just after the P6 forwarding label. | It becomes important to insert a new ELI/EL just after the P6 forwarding label. | |||
</t> | </t> | |||
<t> | <t pn="section-7.1.1-7"> | |||
In the case above, the ingress node had a sufficient MSD to ensure end-to | In the case above, the ingress node was able to support a sufficient MSD | |||
-end load-balancing taking into the path attributes. | 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. | However, there might be cases where the ingress node may not have the necessary label imposition capacity. | |||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="ex2" title="Example 2 where the ingress node does not ha | <section anchor="ex2" numbered="true" toc="include" removeInRFC="false" | |||
ve a sufficient MSD"> | pn="section-7.1.2"> | |||
<name slugifiedName="name-example-2-the-ingress-node-">Example 2: The | ||||
<figure title="Figure 6"> | Ingress Node Does Not Have a Sufficient MSD</name> | |||
<artwork> | <figure anchor="fig_ex2" align="left" suppress-title="false" pn="figur | |||
e-6"> | ||||
<name slugifiedName="name-msd-considerations">MSD Considerations</na | ||||
me> | ||||
<artwork name="" type="" align="left" alt="" pn="section-7.1.2-1.1"> | ||||
ECMP LAG ECMP ECMP | ECMP LAG ECMP ECMP | |||
PE1 --- P1 --- P2 --- P3 --- P4 --- P5 --- P6 --- P7 --- P8 --- PE2 | PE1 --- P1 --- P2 --- P3 --- P4 --- P5 --- P6 --- P7 --- P8 --- PE2 | |||
</artwork> | ||||
</artwork> | </figure> | |||
</figure> | <t pn="section-7.1.2-2"> | |||
<t> | In <xref target="fig_ex2" format="default" sectionFormat="of" derivedCont | |||
In Figure 6, PE1 wants to forward MPLS VPN traffic over an explicit path | ent="Figure 6"/>, PE1 wants to forward MPLS VPN traffic over an explicit path to | |||
to PE2 resulting in the following label stack to be pushed onto the IP header: & | PE2 resulting in the following label stack to be pushed onto the IP header: < | |||
lt;Adj_P1P2, Adj_set_P2P3, Adj_P3P4, Adj_P4P5, Adj_P5P6, Adj_set_P6P7, Adj_P7P8; | ;Adj_P1P2, Adj_set_P2P3, Adj_P3P4, Adj_P4P5, Adj_P5P6, Adj_set_P6P7, Adj_P7P8; A | |||
Adj_set_P8PE2, VPN_label>. | dj_set_P8PE2, VPN_label>. | |||
PE1 is limited to push a maximum of 11 labels. P2, P3 and P6 have an ERLD of 3 w | PE1 is limited to push a maximum of 11 labels. P2, P3, and P6 have an ERLD of 3 | |||
hile others have an ERLD of 15. | while others have an ERLD of 15. | |||
</t> | </t> | |||
<t> | <t pn="section-7.1.2-3"> | |||
Using a similar strategy as the previous case may lead to a dilemma, as P E1 can only push a single ELI/EL while we may need a minimum of three to load-ba lance the end-to-end path. | Using a similar strategy as the previous case may lead to a dilemma, as P E1 can only push a single ELI/EL while we may need a minimum of three to load-ba lance the end-to-end path. | |||
An optimized stack that would enable end-to-end load-balancing may be: <Adj_P 1P2, 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>. | An optimized stack that would enable end-to-end load-balancing may be: <Adj_P 1P2, 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>. | |||
</t> | </t> | |||
<t> | <t pn="section-7.1.2-4"> | |||
A decision needs to be taken to favor some part of the path for load-bala ncing considering that load-balancing may not work on the other parts. | A decision needs to be taken to favor some part of the path for load-bala ncing 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 | A service provider may decide to place the ELI/EL after the P6 forwarding | |||
as it will allow P4 and P6 to load-balance. Placing the ELI/EL at bottom of the | label as it will allow P4 and P6 to load-balance. Placing the ELI/EL at the bott | |||
stack is also a possibility enabling load-balancing for P4 and P8. | om of the stack is also a possibility enabling load-balancing for P4 and P8. | |||
</t> | </t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="el_placement" title="Considerations for the placement of | <section anchor="el_placement" numbered="true" toc="include" removeInRFC=" | |||
entropy labels"> | false" pn="section-7.2"> | |||
<t> | <name slugifiedName="name-considerations-for-the-plac">Considerations fo | |||
The sample cases described in the previous section showed that ELI/EL pla | r the Placement of Entropy Labels</name> | |||
cement when the maximum number of labels to be pushed is limited is not an easy | <t pn="section-7.2-1"> | |||
decision and multiple criteria may be taken into account. | The sample cases described in the previous section showed that ELI/EL pla | |||
</t> | cement when the maximum number of labels to be pushed is limited is not an easy | |||
<t> | decision, and multiple criteria may be taken into account. | |||
This section describes some considerations that an implementation MAY tak | </t> | |||
e into account when placing ELI/ELs. This list of criteria is not considered exh | <t pn="section-7.2-2"> | |||
austive and an implementation MAY take into account additional criteria or tie-b | This section describes some considerations that an implementation <bcp14> | |||
reakers that are not documented here. | MAY</bcp14> take into account when placing ELI/ELs. This list of criteria is not | |||
considered exhaustive and an implementation <bcp14>MAY</bcp14> take into accoun | ||||
t additional criteria or tiebreakers that are not documented here. | ||||
As the insertion of ELI/ELs is performed by the ingress node, having ingr ess nodes that do not use the same criteria does not cause an interoperability i ssue. However, from a network design and operation perspective, it is better to have all ingress routers using the same criteria. | As the insertion of ELI/ELs is performed by the ingress node, having ingr ess nodes that do not use the same criteria does not cause an interoperability i ssue. However, from a network design and operation perspective, it is better to have all ingress routers using the same criteria. | |||
</t> | </t> | |||
<t> | <t pn="section-7.2-3"> | |||
An implementation SHOULD try to maximize the possibility of load-balancin | An implementation <bcp14>SHOULD</bcp14> try to maximize the possibility o | |||
g along the path by inserting an ELI/EL where multiple equal cost paths are avai | f load-balancing along the path by inserting an ELI/EL where multiple equal-cost | |||
lable and minimize the number of ELI/ELs that need to be inserted. | 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 | In case of a trade-off, an implementation <bcp14>SHOULD</bcp14> provide flex | |||
a sub-objective for optimization. | ibility to the operator to select the criteria to be considered when placing ELI | |||
</t> | /ELs or specify a subobjective for optimization. | |||
</t> | ||||
<figure title="Figure 7"> | <figure anchor="fig_consid_sample" align="left" suppress-title="false" p | |||
<artwork> | n="figure-7"> | |||
<name slugifiedName="name-msd-trade-offs">MSD Trade-Offs</name> | ||||
<artwork name="" type="" align="left" alt="" pn="section-7.2-4.1"> | ||||
2 2 | 2 2 | |||
PE1 -- P1 -- P2 --P3 --- P4 --- P5 -- ... -- P8 -- P9 -- PE2 | PE1 -- P1 -- P2 --P3 --- P4 --- P5 -- ... -- P8 -- P9 -- PE2 | |||
| | | | | | |||
P3'--- P4'--- P5' | P3'--- P4'--- P5' | |||
</artwork> | </artwork> | |||
</figure> | </figure> | |||
<t> | <t pn="section-7.2-5"><xref target="fig_consid_sample" format="default" | |||
Figure 7 will be used as reference in the following subsections. All metr | sectionFormat="of" derivedContent="Figure 7"/> will be used as reference in the | |||
ics are equal to 1, except P3-P4 and P4-P5 which have a metric 2. | following subsections. All | |||
We consider the MSD of nodes to be the full limit of label imposition (in | metrics are equal to 1 except P3-P4 and P4-P5, which have a metric 2. | |||
cluding service labels, entropy labels and transport labels). | We consider the MSD of nodes to be the full limit of label imposition | |||
</t> | (including service labels, entropy labels, and transport labels). | |||
<section anchor="erld" title="ERLD value"> | </t> | |||
<t> | <section anchor="erld" numbered="true" toc="include" removeInRFC="false" | |||
As mentioned in <xref target="overview"/>, the ERLD value is an i | pn="section-7.2.1"> | |||
mportant parameter to consider when inserting an ELI/EL. If an ELI/EL does not f | <name slugifiedName="name-erld-value">ERLD Value</name> | |||
all within the ERLD of a node on the path, the node will not be able to load-bal | <t pn="section-7.2.1-1"> | |||
ance the traffic efficiently. | As mentioned in <xref target="overview" format="default" sectionF | |||
</t> | ormat="of" derivedContent="Section 7.1"/>, the ERLD value is an important parame | |||
<t> | ter to consider when inserting an ELI/EL. If an ELI/EL does not fall within the | |||
The ERLD value can be advertised via protocols and those extensio | ERLD of a node on the path, the node will not be able to load-balance the traffi | |||
ns are described in separate documents (for instance, <xref target="I-D.ietf-isi | c efficiently. | |||
s-mpls-elc"/> and <xref target="I-D.ietf-ospf-mpls-elc"/>). | </t> | |||
</t> | <t pn="section-7.2.1-2"> | |||
<t> | The ERLD value can be advertised via protocols, and those extensi | |||
ons are described in separate documents (for instance, <xref target="I-D.ietf-is | ||||
is-mpls-elc" format="default" sectionFormat="of" derivedContent="ISIS-ELC"/> and | ||||
<xref target="I-D.ietf-ospf-mpls-elc" format="default" sectionFormat="of" deriv | ||||
edContent="OSPF-ELC"/>). | ||||
</t> | ||||
<t pn="section-7.2.1-3"> | ||||
Let's consider a path from PE1 to PE2 using the following stack p ushed by PE1: <Adj_P1P2, Node_P9, Adj_P9PE2, Service_label>. | Let's consider a path from PE1 to PE2 using the following stack p ushed by PE1: <Adj_P1P2, Node_P9, Adj_P9PE2, Service_label>. | |||
</t> | </t> | |||
<t> | <t pn="section-7.2.1-4"> | |||
Using the ERLD as an input parameter can help to minimize the num ber of required ELI/EL pairs to be inserted. | Using the ERLD as an input parameter can help to minimize the num ber of required ELI/EL pairs to be inserted. | |||
An ERLD value must be retrieved for each SPRING label in the label stack . | An ERLD value must be retrieved for each SPRING label in the label stack . | |||
</t> | </t> | |||
<t> | <t pn="section-7.2.1-5"> | |||
For a label bound to an adjacency segment, the ERLD is the ERLD o | For a label bound to an adjacency segment, the ERLD is the ERLD o | |||
f the node that has advertised the adjacency segment. In the example above, the | f 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 | ERLD associated with Adj_P1P2 would be the ERLD of router P1, as P1 will perform | |||
the forwarding based on the Adj_P1P2 label. | the forwarding based on the Adj_P1P2 label. | |||
</t> | </t> | |||
<t> | <t pn="section-7.2.1-6"> | |||
For a label bound to a node segment, multiple strategies MAY be i | For a label bound to a node segment, multiple strategies <bcp14>M | |||
mplemented. An implementation MAY try to evaluate the minimum ERLD value along t | AY</bcp14> be implemented. An implementation <bcp14>MAY</bcp14> try to evaluate | |||
he node segment path. | the minimum ERLD value along the node segment path. | |||
If an implementation cannot find the minimum ERLD along the path of the segment | If an implementation cannot find the minimum ERLD along the path of the | |||
or does not support the computation of the minimum ERLD, it SHOULD instead use t | segment or does not support the computation of the minimum ERLD, it <bcp14>SHOUL | |||
he ERLD of the tail-end node. Using the ERLD of the tail-end of the node segment | D</bcp14> | |||
mimics the behavior of <xref target="RFC6790"/> where the ingress takes only ca | instead use the ERLD of the tail-end node. Using the ERLD of the tail end of the | |||
re of the egress of the LSP. | node segment mimics the behavior of <xref target="RFC6790" format="default" sec | |||
tionFormat="of" derivedContent="RFC6790"/> 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 ERL D between nodes {P2,P3,P4 ..., P8}. | 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 ERL D between nodes {P2,P3,P4 ..., P8}. | |||
If the implementation does not support the computation of minimum ERLD, it will | If the implementation does not support the computation of minimum ERLD, it | |||
consider the ERLD of P9 (tail-end node of Node_P9 SID). While providing the more | will consider the ERLD of P9 (tail-end node of Node_P9 SID). While providing | |||
optimal ELI/EL placement, evaluating the minimum ERLD increases the complexity | the more optimal ELI/EL placement, evaluating the minimum ERLD increases the | |||
of ELI/EL insertion. As the path to the Node-SID may change over time, a recompu | complexity of ELI/EL insertion. As the path to the Node SID may change over time | |||
tation of the minimum ERLD is required for each topology change. This recomputat | , a recomputation of the minimum ERLD is required for each topology change. This | |||
ion may require the positions of the ELI/ELs to change. | recomputation may require the positions of the ELI/ELs to change. | |||
</t> | </t> | |||
<t> | <t pn="section-7.2.1-7"> | |||
For a label bound to a binding segment, if the binding segment describes a path, | For a label bound to a Binding Segment, if the Binding Segment describes a | |||
an implementation MAY also try to evaluate the minimum ERLD along this path. If | path, an implementation <bcp14>MAY</bcp14> also try to evaluate the minimum ERLD | |||
the implementation cannot find the minimum ERLD along the path of the segment o | along this | |||
r does not support this evaluation, it SHOULD instead use the ERLD of the node a | path. If the implementation cannot find the minimum ERLD along the path of the | |||
dvertising the Binding-SID. | segment or does not support this evaluation, it <bcp14>SHOULD</bcp14> instead us | |||
As for the node segment, evaluating the minimum ERLD adds complexity in the ELI/ | e the ERLD of | |||
EL insertion process. | the node advertising the Binding SID. As for the node segment, evaluating the | |||
</t> | minimum ERLD adds complexity in the ELI/EL insertion process. | |||
</section> | </t> | |||
<section anchor="sid-type" title="Segment type"> | </section> | |||
<t> | <section anchor="sid-type" numbered="true" toc="include" removeInRFC="fa | |||
Depending on the type of segment a particular label is bound to, | lse" pn="section-7.2.2"> | |||
an implementation can deduce that this particular label will be subject to load- | <name slugifiedName="name-segment-type">Segment Type</name> | |||
balancing on the path. | <t pn="section-7.2.2-1"> | |||
</t> | Depending on the type of segment a particular label is bound | |||
<section anchor="node-sid" title="Node-SID"> | to, an implementation can deduce that this particular label | |||
<t> | will be subject to load-balancing on the path. | |||
An MPLS label bound to a Node-SID represents a path that | </t> | |||
may cross multiple hops. | <section anchor="node-sid" numbered="true" toc="exclude" removeInRFC=" | |||
Load-balancing may be needed on the node starting this path but also on any node | false" pn="section-7.2.2.1"> | |||
along the path. | <name slugifiedName="name-node-sid">Node SID</name> | |||
</t> | <t pn="section-7.2.2.1-1"> | |||
<t> | An MPLS label bound to a Node SID represents a path | |||
In Figure 7, let's consider a path from PE1 to PE2 using | that may cross multiple hops. Load-balancing may be | |||
the following stack pushed by PE1: <Adj_P1P2, Node_P9, Adj_P9PE2, Service_lab | needed on the node starting this path but also on any | |||
el>. | node along the path. | |||
</t> | </t> | |||
<t> | <t pn="section-7.2.2.1-2"> | |||
If, for example, PE1 is limited to push 6 labels, it can | In <xref target="fig_consid_sample" format="default" sect | |||
add a single ELI/EL within the label stack. | ionFormat="of" derivedContent="Figure 7"/>, let's consider a path from PE1 to PE | |||
An operator may want to favor a placement that would allow load-balancing along | 2 using the following stack pushed by PE1: <Adj_P1P2, Node_P9, Adj_P9PE2, Ser | |||
the Node-SID path. | vice_label>. | |||
In Figure 7, P3 which is along the Node-SID path requires load-balancing between | </t> | |||
two equal-cost paths. | <t pn="section-7.2.2.1-3"> | |||
</t> | If, for example, PE1 is limited to push 6 labels, it | |||
<t> | can add a single ELI/EL within the label stack. An | |||
An implementation MAY try to evaluate if load-balancing is really | operator may want to favor a placement that would | |||
allow load-balancing along the Node SID path. In | ||||
<xref target="fig_consid_sample" format="default" section | ||||
Format="of" derivedContent="Figure 7"/>, | ||||
P3, which is along the Node SID path, | ||||
requires load-balancing between two equal-cost paths. | ||||
</t> | ||||
<t pn="section-7.2.2.1-4"> | ||||
An implementation <bcp14>MAY</bcp14> try to evaluate if load-balancing is really | ||||
required within a node segment path. This could be done by running | required within a node segment path. This could be done by running | |||
an additional SPT (Shortest Path Tree) computation and analysing of the node segment path to | 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 | prevent a node segment that does not really require load-balancing from | |||
being preferred when placing ELI/ELs. Such inspection may be time | being preferred when placing ELI/ELs. Such inspection may be time | |||
consuming for implementations and without a 100% guarantee, as a node | consuming for implementations and without a 100% guarantee, as a node | |||
segment path may use LAGs that are invisible to the IP | segment path may use LAGs that are invisible to the IP | |||
topology. As a simpler approach, an implementation MAY consider that a label | topology. As a simpler approach, an implementation <bcp14>MAY</bcp14> consid | |||
bound | er that a label bound | |||
to a Node-SID will be subject to load-balancing and requires an | to a Node SID will be subject to load-balancing and require an | |||
ELI/EL. | ELI/EL. | |||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="adj-sid1" title="Adjacency-set SID"> | <section anchor="adj-sid1" numbered="true" toc="exclude" removeInRFC=" | |||
<t> | false" pn="section-7.2.2.2"> | |||
An adjacency-set is an Adj-SID that refers to a set of ad | <name slugifiedName="name-adjacency-set-sid">Adjacency-Set SID</name | |||
jacencies. When an adjacency-set segment is used within a label stack, an implem | > | |||
entation can deduce that load-balancing is expected at the node that advertised | <t pn="section-7.2.2.2-1"> | |||
this adjacency segment. | An adjacency-set is an Adj-SID that refers to a set of | |||
An implementation MAY favor the insertion of an ELI/EL af | adjacencies. When an adjacency-set segment is used | |||
ter the Adj-SID representing an adjacency-set. | within a label stack, an implementation can deduce | |||
</t> | that load-balancing is expected at the node that | |||
</section> | advertised this adjacency segment. An implementation | |||
<section anchor="adj-sid2" title="Adjacency-SID represent | <bcp14>MAY</bcp14> favor the insertion of an ELI/EL | |||
ing a single IP link"> | after the Adj-SID representing an adjacency-set. | |||
<t> | </t> | |||
</section> | ||||
<section anchor="adj-sid2" numbered="true" toc="exclude" removeInRFC=" | ||||
false" pn="section-7.2.2.3"> | ||||
<name slugifiedName="name-adjacency-sid-representing-">Adjacency SID | ||||
Representing a Single IP Link</name> | ||||
<t pn="section-7.2.2.3-1"> | ||||
When an adjacency segment representing a single IP link i s used within a label stack, an implementation can deduce that load-balancing ma y not be expected at the node that advertised this adjacency segment. | When an adjacency segment representing a single IP link i s used within a label stack, an implementation can deduce that load-balancing ma y not be expected at the node that advertised this adjacency segment. | |||
</t> | </t> | |||
<t> | <t pn="section-7.2.2.3-2"> | |||
An implementation MAY NOT place an ELI/EL after a regular | An implementation <bcp14>MAY</bcp14> NOT place an ELI/EL | |||
Adj-SID in order to favor the insertion of ELI/ELs following other segments. | after a regular Adj-SID in order to favor the insertion of ELI/ELs following oth | |||
</t> | er segments. | |||
<t> | </t> | |||
Readers should note that an adjacency segment representin | <t pn="section-7.2.2.3-3"> | |||
g a single IP link may require load-balancing. This is the case when a LAG (L2 b | Readers should note that an adjacency segment representin | |||
undle) is implemented between two IP nodes and the L2 bundle SR extensions <xref | g a single IP link may require load-balancing. This is the case when a LAG (L2 b | |||
target="I-D.ietf-isis-l2bundles"/> are not implemented. | undle) is implemented between two IP nodes and the L2 bundle SR extensions <xref | |||
target="RFC8668" format="default" sectionFormat="of" derivedContent="RFC8668"/> | ||||
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 adjac ency segment. | 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 adjac ency segment. | |||
To communicate the requirement for load-balancing for a p | To communicate the requirement for load-balancing for | |||
articular Adjacency-SID to ingress nodes, a user can enforce the use of the L2 b | a particular Adjacency SID to ingress nodes, a user can e | |||
undle SR extensions defined in <xref target="I-D.ietf-isis-l2bundles"/> or can d | nforce the use of the L2 bundle SR extensions defined in <xref target="RFC8668" | |||
eclare the single adjacency as an adjacency-set. | format="default" sectionFormat="of" derivedContent="RFC8668"/> or can declare th | |||
</t> | e single adjacency as an adjacency-set. | |||
</section> | </t> | |||
<section anchor="adj-sid3" title="Adjacency-SID represent | </section> | |||
ing a single link within an L2 bundle"> | <section anchor="adj-sid3" numbered="true" toc="exclude" removeInRFC=" | |||
<t> | false" pn="section-7.2.2.4"> | |||
When the L2 bundle SR extensions <xref target="I-D.ietf-i | <name slugifiedName="name-adjacency-sid-representing-a">Adjacency SI | |||
sis-l2bundles"/> are used, adjacency segments may be advertised for each member | D Representing a Single Link within an L2 Bundle</name> | |||
of the bundle. | <t pn="section-7.2.2.4-1"> | |||
In this case, an implementation can deduce that load-bala | When the L2 bundle SR extensions <xref target="RFC8668" f | |||
ncing is not expected on the LSR advertising this segment and MAY NOT insert an | ormat="default" sectionFormat="of" derivedContent="RFC8668"/> are used, adjacenc | |||
ELI/EL after the corresponding label. | y segments may be advertised for each member of the bundle. | |||
</t> | In this case, an implementation can deduce that load-bala | |||
</section> | ncing is not expected on the LSR advertising this segment and <bcp14>MAY</bcp14> | |||
<section anchor="adj-sid4" title="Adjacency-SID represent | NOT insert an ELI/EL after the corresponding label. | |||
ing an L2 bundle"> | </t> | |||
<t> | </section> | |||
When the L2 bundle SR extensions <xref target="I-D.ietf-i | <section anchor="adj-sid4" numbered="true" toc="exclude" removeInRFC=" | |||
sis-l2bundles"/> are used, an adjacency segment may be advertised to represent t | false" pn="section-7.2.2.5"> | |||
he bundle. | <name slugifiedName="name-adjacency-sid-representing-an">Adjacency S | |||
In this case, an implementation can deduce that load-balancing is expected on th | ID Representing an L2 Bundle</name> | |||
e LSR advertising this segment and MAY insert an ELI/EL after the corresponding | <t pn="section-7.2.2.5-1"> | |||
label. | When the L2 bundle SR extensions <xref target="RFC8668" f | |||
</t> | ormat="default" sectionFormat="of" derivedContent="RFC8668"/> are used, an adjac | |||
</section> | ency segment may be advertised to represent the bundle. | |||
In this case, an implementation can deduce that load-balancing is expected on th | ||||
</section> | e LSR advertising this segment and <bcp14>MAY</bcp14> insert an ELI/EL after the | |||
<section title="Maximizing number of LSRs that will load-balance" | corresponding label. | |||
> | </t> | |||
<t> | </section> | |||
When placing ELI/ELs, an implementation MAY optimize the | </section> | |||
number of LSRs that both need to load-balance (i.e., have | <section numbered="true" toc="include" removeInRFC="false" pn="section-7 | |||
ECMP paths) and that will be able to perform load-balancing (i.e., | .2.3"> | |||
the EL label is within their ERLD). | <name slugifiedName="name-maximizing-number-of-lsrs-t">Maximizing Numb | |||
</t> | er of LSRs That Will Load-Balance</name> | |||
<t> | <t pn="section-7.2.3-1"> | |||
Let's consider a path from PE1 to PE2 using the following stack p | When placing ELI/ELs, an implementation <bcp14>MAY</bcp14> | |||
ushed by PE1: <Adj_P1P2, Node_P9, Adj_P9PE2, Service_label>. | optimize the number of LSRs that both need to load-balance | |||
All routers have an ERLD of 10, except P1 and P2 which have an ERLD of 4. PE1 is | (i.e., have ECMPs) and that will be able to perform | |||
able to push 6 labels, so only a single ELI/EL can be added. | load-balancing (i.e., the EL is within their ERLD). | |||
</t> | </t> | |||
<t> | <t pn="section-7.2.3-2"> | |||
In the example above, adding an ELI/EL after Adj_P1P2 will only a | Let's consider a path from PE1 to PE2 using the following | |||
llow load-balancing at P1 while inserting it after Adj_PE2P9, will allow load-ba | stack pushed by PE1: <Adj_P1P2, Node_P9, Adj_P9PE2, | |||
lancing at P2,P3 ... P9 and maximizing the number of LSRs that can perform load- | Service_label>. All routers have an ERLD of 10 except P1 | |||
balancing. | and P2, which have an ERLD of 4. PE1 is able to push 6 labels, | |||
</t> | so only a single ELI/EL can be added. | |||
</section> | </t> | |||
<section title="Preference for a part of the path"> | <t pn="section-7.2.3-3"> | |||
<t> | In the example above, adding an ELI/EL after Adj_P1P2 will | |||
An implementation MAY allow the user to favor a part of the end-t | only allow load-balancing at P1, while inserting it after | |||
o-end path when the number of ELI/ELs that can be pushed is not enough to cover | Adj_PE2P9 will allow load-balancing at P2, P3 ... P9 and | |||
the entire path. | maximize the number of LSRs that can perform load-balancing. | |||
As an example, a service provider may want to favor load-balancing at the beginn | </t> | |||
ing of the path or at the end of path, so the implementation favors putting the | </section> | |||
ELI/ELs near the top or near of the bottom of the stack. | <section numbered="true" toc="include" removeInRFC="false" pn="section-7 | |||
</t> | .2.4"> | |||
</section> | <name slugifiedName="name-preference-for-a-part-of-th">Preference for | |||
<section title="Combining criteria"> | a Part of the Path</name> | |||
<t> | <t pn="section-7.2.4-1"> | |||
An implementation MAY combine multiple criteria to determine the | An implementation <bcp14>MAY</bcp14> allow the user to favor a pa | |||
best ELI/ELs placement. However, combining too many criteria could lead to imple | rt of the end-to-end path when the number of ELI/ELs that can be pushed is not e | |||
mentation complexity and high resource consumption. | nough to cover the entire path. | |||
Each time the network topology changes, a new | As an example, a service provider may want to favor load-balancing at the | |||
evaluation of the ELI/EL placement will be necessary for each | beginning of the path or at the end of the path, so the implementation favors | |||
impacted LSPs. | putting the ELI/ELs near the top or the bottom of the stack. | |||
</t> | </t> | |||
</section> | </section> | |||
</section> | <section numbered="true" toc="include" removeInRFC="false" pn="section-7 | |||
</section> | .2.5"> | |||
<section anchor="algo-example" title="A simple example algorithm" toc="default" | <name slugifiedName="name-combining-criteria">Combining Criteria</name | |||
> | > | |||
<t> | <t pn="section-7.2.5-1"> | |||
A simple implementation might take into account the ERLD when placing ELI/EL wh | An implementation <bcp14>MAY</bcp14> combine multiple criteria to | |||
ile trying to minimize the number of ELI/ELs inserted and trying to maximize the | determine | |||
number of LSRs that can load-balance. | the best ELI/ELs placement. However, combining too many | |||
</t> | criteria could lead to implementation complexity and high | |||
<t> | resource consumption. Each time the network topology changes, | |||
a new evaluation of the ELI/EL placement will be necessary for | ||||
each impacted LSP. | ||||
</t> | ||||
</section> | ||||
</section> | ||||
</section> | ||||
<section anchor="algo-example" toc="include" numbered="true" removeInRFC="fa | ||||
lse" pn="section-8"> | ||||
<name slugifiedName="name-a-simple-example-algorithm">A Simple Example Alg | ||||
orithm</name> | ||||
<t pn="section-8-1"> | ||||
A simple implementation might take into account the ERLD when placing ELI/EL | ||||
while trying to minimize the number of ELI/ELs inserted and trying to | ||||
maximize the number of LSRs that can load-balance. | ||||
</t> | ||||
<t pn="section-8-2"> | ||||
The example algorithm is based on the following considerations: | The example algorithm is based on the following considerations: | |||
<list style="symbols"> | </t> | |||
<t>An LSR that can insert a limited number of <ELI, EL> pairs should inse | <ul spacing="normal" bare="false" empty="false" pn="section-8-3"> | |||
rt such pairs deeper in the stack.</t> | <li pn="section-8-3.1">An LSR that can insert a limited number of <EL | |||
<t>An LSR should try to insert <ELI, EL> pairs at positions to maximize t | I, EL> pairs should insert such pairs deeper in the stack.</li> | |||
he number of transit LSRs for which the EL occurs within the ERLD of those LSRs. | <li pn="section-8-3.2">An LSR should try to insert <ELI, EL> pairs | |||
</t> | at positions to maximize the number of transit LSRs for which the EL occurs wit | |||
<t>An LSR should try to insert the minimum number of such pairs while trying to | hin the ERLD of those LSRs.</li> | |||
satisfy the above criteria.</t> | <li pn="section-8-3.3">An LSR should try to insert the minimum number of | |||
</list> | such pairs while trying to satisfy the above criteria.</li> | |||
</t> | </ul> | |||
<t> | <t pn="section-8-4"> | |||
The pseudocode of the example algorithm is shown below. | The pseudocode of the example algorithm is shown below. | |||
</t> | </t> | |||
<figure title="Figure 8: Example algorithm to insert <ELI, EL> pairs in a | <figure align="left" suppress-title="false" pn="figure-8"> | |||
label stack"> | <name slugifiedName="name-example-algorithm-to-insert">Example Algorithm | |||
<artwork> | to Insert <ELI, EL> Pairs in a Label Stack</name> | |||
Initialize the current EL insertion point to the | <sourcecode type="pseudocode" markers="false" pn="section-8-5.1"> | |||
bottom-most label in the stack that is EL-capable | Initialize the current EL insertion point to the | |||
while (local-node can push more <ELI,EL> pairs OR | bottom-most label in the stack that is EL-capable | |||
insertion point is not above label stack) { | while (local-node can push more <ELI,EL> pairs OR | |||
insert an <ELI,EL> pair below current insertion point | insertion point is not above label stack) { | |||
move new insertion point up from current insertion point until | insert an <ELI,EL> pair below current insertion point | |||
((last inserted EL is below the ERLD) AND (ERLD > 2) | move new insertion point up from current insertion point until | |||
AND | ((last inserted EL is below the ERLD) AND (ERLD > 2) | |||
(new insertion point is EL-capable)) | AND | |||
set current insertion point to new insertion point | (new insertion point is EL-capable)) | |||
} | set current insertion point to new insertion point | |||
</artwork> | } | |||
</figure> | </sourcecode> | |||
<t> | </figure> | |||
When this algorithm is applied to the example described in <xref target="usecas | <t pn="section-8-6"> | |||
e"/>, | When this algorithm is applied to the example described in <xref target="usecas | |||
it will result in ELs being inserted in two positions, one after the | e" format="default" sectionFormat="of" derivedContent="Section 3"/>, | |||
it will result in ELs being inserted in two positions; one after the | ||||
label L_N-D and another after L_N-P3. Thus, the resulting label stack | label L_N-D and another after L_N-P3. Thus, the resulting label stack | |||
would be <L_N-P3, ELI, EL, L_A-L1, L_N-D, ELI, EL> | would be <L_N-P3, ELI, EL, L_A-L1, L_N-D, ELI, EL>. | |||
</t> | </t> | |||
</section> | ||||
</section> | <section anchor="deployment" numbered="true" toc="include" removeInRFC="fals | |||
e" pn="section-9"> | ||||
<section anchor="deployment" title="Deployment Considerations"> | <name slugifiedName="name-deployment-considerations">Deployment Considerat | |||
<t> | ions</name> | |||
As long as LSR node dataplane capabilities are limited (number of labels that c | <t pn="section-9-1"> | |||
an be pushed, or number of labels that can be inspected), hop-by-hop load-balanc | As long as LSR node data-plane capabilities are limited (number of labels that | |||
ing of SPRING encapsulated flows will require trade-offs. | can be pushed or number of labels that can be inspected), hop-by-hop load-balanc | |||
</t> | ing of SPRING-encapsulated flows will require trade-offs. | |||
<t> | </t> | |||
The entropy label is still a good and usable solution as it allows load-balanci | <t pn="section-9-2"> | |||
ng without having to perform deep packet inspection on each LSR: it does not see | The entropy label is still a good and usable solution as it allows load-balanci | |||
m reasonable to have an LSR inspecting UDP ports within a GRE tunnel carried ove | ng without having to perform deep packet inspection on each LSR: It does not see | |||
r a 15 label SPRING tunnel. | m reasonable to have an LSR inspecting UDP ports within a GRE tunnel carried ove | |||
</t> | r a 15-label SPRING tunnel. | |||
<t> | </t> | |||
Due to the limited capacity of reading a deep stack of MPLS labels, multiple EL | <t pn="section-9-3"> | |||
I/ELs may be required within the stack which directly impacts the capacity of th | Due to the limited capacity of reading a deep stack of MPLS labels, multiple EL | |||
e head-end to push a deep stack: each ELI/EL inserted requires two additional la | I/ELs may be required within the stack, which directly impacts the capacity of t | |||
bels to be pushed. | he head-end to push a deep stack: each ELI/EL inserted requires two additional l | |||
</t> | abels to be pushed. | |||
<t> | </t> | |||
Placement strategies of ELI/ELs are required to find the best trade-off. Multip | <t pn="section-9-4"> | |||
le criteria could be taken into account and some level of customization (by the | Placement strategies of ELI/ELs are required to find the best trade-off. Multip | |||
user) is required to accommodate different deployments. | le criteria could be taken into account, and some level of customization (by the | |||
user) is required to accommodate different deployments. | ||||
Since analyzing the path of each destination to determine the best ELI/EL place ment may be time consuming for the control plane, we encourage implementations t o find the best trade-off between simplicity, resource consumption, and load-bal ancing efficiency. | Since analyzing the path of each destination to determine the best ELI/EL place ment may be time consuming for the control plane, we encourage implementations t o find the best trade-off between simplicity, resource consumption, and load-bal ancing efficiency. | |||
</t> | </t> | |||
<t> | <t pn="section-9-5"> | |||
In the future, hardware and software capacity may increase dataplane capabiliti | In the future, hardware and software capacity may increase data-plane capabilit | |||
es and may remove some of these limitations, increasing load-balancing capabilit | ies and may remove some of these limitations, increasing load-balancing capabili | |||
y using entropy labels. | ty using entropy labels. | |||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="other-options" title="Options considered"> | <section anchor="other-options" numbered="true" toc="include" removeInRFC="f | |||
<t>Different options that were considered to arrive at the recommended | alse" pn="section-10"> | |||
<name slugifiedName="name-options-considered">Options Considered</name> | ||||
<t pn="section-10-1">Different options that were considered to arrive at t | ||||
he recommended | ||||
solution are documented in this section. | solution are documented in this section. | |||
</t> | </t> | |||
<t> | <t pn="section-10-2"> | |||
These options are detailed here only for historical purposes. | These options are detailed here only for historical purposes. | |||
</t> | </t> | |||
<section title="Single EL at the bottom of the stack"> | <section numbered="true" toc="include" removeInRFC="false" pn="section-10. | |||
<t> | 1"> | |||
<name slugifiedName="name-single-el-at-the-bottom-of-">Single EL at the | ||||
Bottom of the Stack</name> | ||||
<t pn="section-10.1-1"> | ||||
In this option, a single EL is used for the entire label stack. The | In this option, a single EL is used for the entire label stack. The | |||
source LSR S encodes the entropy label at the bottom of the | source LSR S encodes the entropy label at the bottom of the | |||
label stack. In the example described in <xref target="usecase"/>, it will r esult | label stack. In the example described in <xref target="usecase" format="defa ult" sectionFormat="of" derivedContent="Section 3"/>, it will result | |||
in the label stack at LSR S to look like <L_N-P3, L_A-L1, L_N-D, ELI, | in the label stack at LSR S to look like <L_N-P3, L_A-L1, L_N-D, ELI, | |||
EL> <remaining packet header>. Note that the notation in <xref targ et="RFC6790"/> | EL> <remaining packet header>. Note that the notation in <xref targ et="RFC6790" format="default" sectionFormat="of" derivedContent="RFC6790"/> | |||
is used to describe the label stack. An issue with this approach is | is used to describe the label stack. An issue with this approach is | |||
that as the label stack grows due an increase in the number of SIDs, | that as the label stack grows due an increase in the number of SIDs, | |||
the EL goes correspondingly deeper in the label stack. Hence, transit | the EL goes correspondingly deeper in the label stack. Hence, transit | |||
LSRs have to access a larger number of bytes in the packet header | LSRs have to access a larger number of bytes in the packet header | |||
when making forwarding decisions. In the example described in | when making forwarding decisions. In the example described in | |||
<xref target="usecase"/>, if we consider that the LSR P1 has an ERLD of 3, P1 would | <xref target="usecase" format="default" sectionFormat="of" derivedContent="Se ction 3"/>, if we consider that the LSR P1 has an ERLD of 3, P1 would | |||
load-balance traffic poorly on the | load-balance traffic poorly on the | |||
parallel links L3 and L4 since the EL is below the ERLD of P1. | parallel links L3 and L4 since the EL is below the ERLD of P1. | |||
A load-balanced network design using this approach | A load-balanced network design using this approach | |||
must ensure that all intermediate LSRs have the capability to | must ensure that all intermediate LSRs have the capability to | |||
read the maximum label stack depth as required for the | read the maximum label stack depth as required for the | |||
application that uses source routed stacking. | application that uses source-routed stacking. | |||
</t> | </t> | |||
<t> | <t pn="section-10.1-2"> | |||
This option was rejected since there exist a number of hardware | This option was rejected since there exist a number of hardware | |||
implementations which have a low maximum readable label depth. | implementations that have a low maximum readable label depth. | |||
Choosing this option can lead to a loss of load-balancing using EL in | Choosing this option can lead to a loss of load-balancing using EL in | |||
a significant part of the network when that is a critical requirement | a significant part of the network when that is a critical requirement | |||
in a service-provider network. | in a service-provider network. | |||
</t> | </t> | |||
</section> | </section> | |||
<section title="An EL per segment in the stack"> | <section numbered="true" toc="include" removeInRFC="false" pn="section-10. | |||
<t> | 2"> | |||
In this option, each segment/label in the stack can be given its own EL. | <name slugifiedName="name-an-el-per-segment-in-the-st">An EL per Segment | |||
When | in the Stack</name> | |||
load-balancing is required to direct traffic on a segment, the | <t pn="section-10.2-1"> | |||
source LSR pushes an <ELI, EL> before pushing the label associated to t | In this option, each segment/label in the stack can be given its own | |||
his segment . In the | EL. When load-balancing is required to direct traffic on a segment, | |||
example described in <xref target="usecase"/>, the source LSR S encoded label | the source LSR pushes an <ELI, EL> before pushing the label | |||
stack | associated to this segment. In the example described in <xref target="us | |||
would be <L_N-P3, ELI, EL, L_A-L1, L_N-D, ELI, EL> where all the ELs | ecase" format="default" sectionFormat="of" derivedContent="Section 3"/>, the sou | |||
can be the same. Accessing the EL at an intermediate LSR is | rce label stack that is LSR S encoded would | |||
independent of the depth of the label stack and hence independent of | be <L_N-P3, ELI, EL, L_A-L1, L_N-D, ELI, EL>, where all the ELs | |||
the specific application that uses source routed tunnels with label | can be the same. Accessing the EL at an intermediate LSR is | |||
stacking. A drawback is that the depth of the label | independent of the depth of the label stack and hence, independent of | |||
stack grows significantly, almost 3 times as the number of labels in | the specific application that uses source-routed tunnels with label | |||
the label stack. The network design should ensure that source LSRs | stacking. A drawback is that the depth of the label stack grows | |||
have the capability to push such a deep label stack. Also, | significantly, almost 3 times as the number of labels in the label | |||
the bandwidth overhead and potential MTU issues of deep label stacks | stack. The network design should ensure that source LSRs have the | |||
should be considered in the network design. | capability to push such a deep label stack. Also, the bandwidth | |||
</t> | overhead and potential MTU issues of deep label stacks should be | |||
<t> | considered in the network design. | |||
</t> | ||||
<t pn="section-10.2-2"> | ||||
This option was rejected due to the existence of hardware | This option was rejected due to the existence of hardware | |||
implementations that can push a limited number of labels on the label | implementations that can push a limited number of labels on the label | |||
stack. Choosing this option would result in a hardware requirement | stack. Choosing this option would result in a hardware requirement | |||
to push two additional labels per tunnel label. Hence it would | to push two additional labels per tunnel label. Hence, it would | |||
restrict the number of tunnels that can be stacked in a LSP and hence | restrict the number of tunnels that can be stacked in an LSP and hence, | |||
constrain the types of LSPs that can be created. This was considered | constrain the types of LSPs that can be created. This was considered | |||
unacceptable. | unacceptable. | |||
</t> | </t> | |||
</section> | </section> | |||
<section title="A re-usable EL for a stack of tunnels"> | <section numbered="true" toc="include" removeInRFC="false" pn="section-10. | |||
<t> | 3"> | |||
In this option an LSR that terminates a tunnel re-uses the EL of the | <name slugifiedName="name-a-reusable-el-for-a-stack-o">A Reusable EL for | |||
terminated tunnel for the next inner tunnel. It does this by storing | a Stack of Tunnels</name> | |||
the EL from the outer tunnel when that tunnel is terminated and re- | <t pn="section-10.3-1"> | |||
inserting it below the next inner tunnel label during the label swap | In this option, an LSR that terminates a tunnel reuses the EL of the | |||
operation. The LSR that stacks tunnels should insert an EL below the | terminated tunnel for the next inner tunnel. It does this by storing | |||
outermost tunnel. It should not insert ELs for any inner tunnels. | the EL from the outer tunnel when that tunnel is terminated and | |||
Also, the penultimate hop LSR of a segment must not pop the ELI and | reinserting it below the next inner tunnel label during the label-swap | |||
EL even though they are exposed as the top labels since the | operation. The LSR that stacks tunnels should insert an EL below the | |||
terminating LSR of that segment would re-use the EL for the next | outermost tunnel. It should not insert ELs for any inner tunnels. | |||
segment. | Also, the penultimate hop LSR of a segment must not pop the ELI and EL | |||
</t> | even though they are exposed as the top labels since the terminating | |||
<t> | LSR of that segment would reuse the EL for the next segment. | |||
In <xref target="usecase"/> above, the source LSR S encoded label stack w | </t> | |||
ould be | <t pn="section-10.3-2"> | |||
<L_N-P3, ELI, EL, L_A-L1, L_N-D>. At P1, the outgoing label stack | In <xref target="usecase" format="default" sectionFormat="of" derivedCont | |||
would be <L_N-P3, ELI, EL, L_A-L1, L_N-D> after it has load-balanced | ent="Section 3"/>, the source label stack that is LSR S | |||
to one of the links L3 or L4. At P3 the outgoing label stack would | encoded would be <L_N-P3, ELI, EL, L_A-L1, L_N-D>. At P1, the | |||
be <L_N-D, ELI, EL>. At P2, the outgoing label stack would be <L_N- | outgoing label stack would be <L_N-P3, ELI, EL, L_A-L1, L_N-D> | |||
D, | after it has load-balanced to one of the links L3 or L4. At P3, the | |||
ELI, EL> and it would load-balance to one of the nexthop LSRs P4 or | outgoing label stack would be <L_N-D, ELI, EL>. At P2, the | |||
P5. Accessing the EL at an intermediate LSR (e.g., P1) is | outgoing label stack would be <L_N-D, ELI, EL> and it would | |||
independent of the depth of the label stack and hence independent of | load-balance to one of the next-hop LSRs P4 or P5. Accessing the EL at | |||
the specific use-case to which the label stack is applied. | an intermediate LSR (e.g., P1) is independent of the depth of the | |||
</t> | label stack and hence, independent of the specific use case to which | |||
<t> | the label stack is applied. | |||
This option was rejected due to the significant change in label swap | </t> | |||
<t pn="section-10.3-3"> | ||||
This option was rejected due to the significant change in label-swap | ||||
operations that would be required for existing hardware. | operations that would be required for existing hardware. | |||
</t> | </t> | |||
</section> | </section> | |||
<section title="EL at top of stack"> | <section numbered="true" toc="include" removeInRFC="false" pn="section-10. | |||
<t> | 4"> | |||
A slight variant of the re-usable EL option is to keep the EL at the | <name slugifiedName="name-el-at-top-of-stack">EL at Top of Stack</name> | |||
<t pn="section-10.4-1"> | ||||
A slight variant of the reusable EL option is to keep the EL at the | ||||
top of the stack rather than below the tunnel label. In this case, | top of the stack rather than below the tunnel label. In this case, | |||
each LSR that is not terminating a segment should continue to keep | each LSR that is not terminating a segment should continue to keep | |||
the received EL at the top of the stack when forwarding the packet | the received EL at the top of the stack when forwarding the packet | |||
along the segment. An LSR that terminates a segment should use the | along the segment. An LSR that terminates a segment should use the | |||
EL from the terminated segment at the top of the stack when | EL from the terminated segment at the top of the stack when | |||
forwarding onto the next segment. | forwarding onto the next segment. | |||
</t> | </t> | |||
<t> | <t pn="section-10.4-2"> | |||
This option was rejected due to the significant change in label swap | This option was rejected due to the significant change in label swap | |||
operations that would be required for existing hardware. | operations that would be required for existing hardware. | |||
</t> | </t> | |||
</section> | </section> | |||
<section title="ELs at readable label stack depths"> | <section numbered="true" toc="include" removeInRFC="false" pn="section-10. | |||
<t> | 5"> | |||
In this option the source LSR inserts ELs for tunnels in the label | <name slugifiedName="name-els-at-readable-label-stack">ELs at Readable L | |||
stack at depths such that each LSR along the path that must load | abel Stack Depths</name> | |||
balance is able to access at least one EL. Note that the source LSR | <t pn="section-10.5-1"> | |||
may have to insert multiple ELs in the label stack at different | In this option, the source LSR inserts ELs for tunnels in the label | |||
depths for this to work since intermediate LSRs may have differing | stack at depths such that each LSR along the path that must load-balance | |||
capabilities in accessing the depth of a label stack. The label | is able to access at least one EL. Note that the source LSR | |||
stack depth access value of intermediate LSRs must be known to create | may have to insert multiple ELs in the label stack at different depths | |||
such a label stack. How this value is determined is outside the | for this to work since intermediate LSRs may have differing | |||
scope of this document. This value can be advertised using a | capabilities in accessing the depth of a label stack. The label stack | |||
protocol such as an IGP. | depth access value of intermediate LSRs must be known to create such a | |||
</t> | label stack. How this value is determined is outside the scope of | |||
<t> | this document. This value can be advertised using a protocol such as | |||
Applying this method to the example in <xref target="usecase"/> above, | an IGP. | |||
if LSR P1 | </t> | |||
needs to have the EL within a depth of 4, then the source LSR S | <t pn="section-10.5-2"> | |||
encoded label stack would be <L_N-P3, ELI, EL, L_A-L1, L_N-D, ELI, | Applying this method to the example in <xref target="usecase" format=" | |||
EL> where all the ELs would typically have the same value. | default" sectionFormat="of" derivedContent="Section 3"/>, if LSR P1 | |||
</t> | needs to have the EL within a depth of 4, then the source label stack that | |||
<t> | is LSR S encoded would be <L_N-P3, ELI, EL, L_A-L1, L_N-D, ELI, | |||
EL>, where all the ELs would typically have the same value. | ||||
</t> | ||||
<t pn="section-10.5-3"> | ||||
In the case where the ERLD has different values along the path and the | In the case where the ERLD has different values along the path and the | |||
LSR that is inserting <ELI, EL> pairs has no limit on how many pairs | LSR that is inserting <ELI, EL> pairs has no limit on how many pairs | |||
it can insert, and it knows the appropriate positions in the stack | it can insert, and it knows the appropriate positions in the stack | |||
where they should be inserted, this option is the same as the | where they should be inserted, this option is the same as the | |||
recommended solution in <xref target="solution"/>. | recommended solution in <xref target="solution" format="default" sectionF | |||
</t> | ormat="of" derivedContent="Section 7"/>. | |||
<t> | </t> | |||
Note that a refinement of this solution which balances the number of | <t pn="section-10.5-4"> | |||
pushed labels against the desired entropy is the solution described | Note that a refinement of this solution, which balances the number of | |||
in <xref target="solution"/>. | pushed labels against the desired entropy, is the solution described | |||
</t> | in <xref target="solution" format="default" sectionFormat="of" derivedContent | |||
</section> | ="Section 7"/>. | |||
</section> | </t> | |||
</section> | ||||
<section title="Acknowledgements"> | </section> | |||
<t>The authors would like to thank John Drake, Loa Andersson, Curtis | <section toc="include" numbered="true" removeInRFC="false" pn="section-11"> | |||
Villamizar, Greg Mirsky, Markus Jork, Kamran Raza, Carlos Pignataro, Bruno De | <name slugifiedName="name-iana-considerations">IANA Considerations</name> | |||
craene, Chris Bowers, Nobo Akiya, Daniele Ceccarelli and Joe Clarke for | <t pn="section-11-1"> This document has no IANA actions. | |||
their review comments and suggestions. | ||||
</t> | ||||
</section> | ||||
<section title="Contributors"> | ||||
<figure> | ||||
<artwork> | ||||
Xiaohu Xu | ||||
Huawei | ||||
Email: xuxiaohu@huawei.com | ||||
Wim Hendrickx | ||||
Nokia | ||||
Email: wim.henderickx@nokia.com | ||||
Gunter Van De Velde | ||||
Nokia | ||||
Email: gunter.van_de_velde@nokia.com | ||||
Acee Lindem | ||||
Cisco | ||||
Email: acee@cisco.com | ||||
</artwork> | ||||
</figure> | ||||
</section> | ||||
<section title="IANA Considerations" toc="default"> | ||||
<t> This memo includes no request to IANA. Note to RFC Editor: Remove | ||||
this section before publication. | ||||
</t> | </t> | |||
</section> | </section> | |||
<section title="Security Considerations" toc="default"> | <section toc="include" numbered="true" removeInRFC="false" pn="section-12"> | |||
<t>Compared to <xref target="RFC6790"/>, this document introduces the notion of | <name slugifiedName="name-security-considerations">Security Considerations | |||
ERLD, MSD and may require an ingress node to push multiple ELI/EL. | </name> | |||
These changes does not introduce any new security considerations | <t pn="section-12-1">Compared to <xref target="RFC6790" format="default" s | |||
beyond those already listed in <xref target="RFC6790"/>. | ectionFormat="of" derivedContent="RFC6790"/>, this document introduces the notio | |||
n | ||||
of ERLD and MSD, and may require an ingress node to push multiple ELIs/ELs. | ||||
These changes do not introduce any new security considerations beyond those | ||||
already listed in <xref target="RFC6790" format="default" sectionFormat="of" der | ||||
ivedContent="RFC6790"/>. | ||||
</t> | </t> | |||
</section> | </section> | |||
</middle> | </middle> | |||
<back> | <back> | |||
<references title="Normative References"> | <displayreference target="I-D.ietf-idr-bgp-ls-segment-routing-msd" to="MSD-B | |||
&RFC2119; | GP"/> | |||
&RFC6790; | <displayreference target="I-D.ietf-isis-mpls-elc" to="ISIS-ELC"/> | |||
&RFC8174; | <displayreference target="I-D.ietf-ospf-mpls-elc" to="OSPF-ELC"/> | |||
&SR; | <references pn="section-13"> | |||
&SR-MPLS; | <name slugifiedName="name-references">References</name> | |||
</references> | <references pn="section-13.1"> | |||
<references title="Informative References"> | <name slugifiedName="name-normative-references">Normative References</na | |||
&ISIS-ELC; | me> | |||
&OSPF-ELC; | <reference anchor="RFC6790" target="https://www.rfc-editor.org/info/rfc6 | |||
&SR-L2-BUNDLES; | 790" quoteTitle="true" derivedAnchor="RFC6790"> | |||
&RFC7855; | <front> | |||
&ISIS-MSD; | <title>The Use of Entropy Labels in MPLS Forwarding</title> | |||
&OSPF-MSD; | <author initials="K." surname="Kompella" fullname="K. Kompella"> | |||
&BGP-MSD; | <organization showOnFrontPage="true"/> | |||
</author> | ||||
<author initials="J." surname="Drake" fullname="J. Drake"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="S." surname="Amante" fullname="S. Amante"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="W." surname="Henderickx" fullname="W. Henderickx"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="L." surname="Yong" fullname="L. Yong"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date year="2012" month="November"/> | ||||
<abstract> | ||||
<t>Load balancing is a powerful tool for engineering traffic acros | ||||
s a network. This memo suggests ways of improving load balancing across MPLS ne | ||||
tworks using the concept of "entropy labels". It defines the concept, describes | ||||
why entropy labels are useful, enumerates properties of entropy labels that all | ||||
ow maximal benefit, and shows how they can be signaled and used for various appl | ||||
ications. This document updates RFCs 3031, 3107, 3209, and 5036. [STANDARDS-TR | ||||
ACK]</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="6790"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC6790"/> | ||||
</reference> | ||||
<reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2 | ||||
119" quoteTitle="true" derivedAnchor="RFC2119"> | ||||
<front> | ||||
<title>Key words for use in RFCs to Indicate Requirement Levels</tit | ||||
le> | ||||
<author initials="S." surname="Bradner" fullname="S. Bradner"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date year="1997" month="March"/> | ||||
<abstract> | ||||
<t>In many standards track documents several words are used to sig | ||||
nify the requirements in the specification. These words are often capitalized. | ||||
This document defines these words as they should be interpreted in IETF document | ||||
s. This document specifies an Internet Best Current Practices for the Internet | ||||
Community, and requests discussion and suggestions for improvements.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="BCP" value="14"/> | ||||
<seriesInfo name="RFC" value="2119"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC2119"/> | ||||
</reference> | ||||
<reference anchor="RFC8174" target="https://www.rfc-editor.org/info/rfc8 | ||||
174" quoteTitle="true" derivedAnchor="RFC8174"> | ||||
<front> | ||||
<title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</ti | ||||
tle> | ||||
<author initials="B." surname="Leiba" fullname="B. Leiba"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date year="2017" month="May"/> | ||||
<abstract> | ||||
<t>RFC 2119 specifies common key words that may be used in protoco | ||||
l specifications. This document aims to reduce the ambiguity by clarifying tha | ||||
t only UPPERCASE usage of the key words have the defined special meanings.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="BCP" value="14"/> | ||||
<seriesInfo name="RFC" value="8174"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8174"/> | ||||
</reference> | ||||
<reference anchor="RFC8402" target="https://www.rfc-editor.org/info/rfc8 | ||||
402" quoteTitle="true" derivedAnchor="RFC8402"> | ||||
<front> | ||||
<title>Segment Routing Architecture</title> | ||||
<author initials="C." surname="Filsfils" fullname="C. Filsfils" role | ||||
="editor"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="S." surname="Previdi" fullname="S. Previdi" role=" | ||||
editor"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="L." surname="Ginsberg" fullname="L. Ginsberg"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="B." surname="Decraene" fullname="B. Decraene"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="S." surname="Litkowski" fullname="S. Litkowski"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="R." surname="Shakir" fullname="R. Shakir"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date year="2018" month="July"/> | ||||
<abstract> | ||||
<t>Segment Routing (SR) leverages the source routing paradigm. A | ||||
node steers a packet through an ordered list of instructions, called "segments". | ||||
A segment can represent any instruction, topological or service based. A segm | ||||
ent can have a semantic local to an SR node or global within an SR domain. SR p | ||||
rovides a mechanism that allows a flow to be restricted to a specific topologica | ||||
l path, while maintaining per-flow state only at the ingress node(s) to the SR d | ||||
omain.</t> | ||||
<t>SR can be directly applied to the MPLS architecture with no cha | ||||
nge to the forwarding plane. A segment is encoded as an MPLS label. An ordered | ||||
list of segments is encoded as a stack of labels. The segment to process is on | ||||
the top of the stack. Upon completion of a segment, the related label is poppe | ||||
d from the stack.</t> | ||||
<t>SR can be applied to the IPv6 architecture, with a new type of | ||||
routing header. A segment is encoded as an IPv6 address. An ordered list of se | ||||
gments is encoded as an ordered list of IPv6 addresses in the routing header. T | ||||
he active segment is indicated by the Destination Address (DA) of the packet. T | ||||
he next active segment is indicated by a pointer in the new routing header.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="8402"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8402"/> | ||||
</reference> | ||||
<reference anchor="RFC8660" target="https://www.rfc-editor.org/info/rfc8 | ||||
660" quoteTitle="true" derivedAnchor="RFC8660"> | ||||
<front> | ||||
<title>Segment Routing with the MPLS Data Plane</title> | ||||
<author initials="A" surname="Bashandy" fullname="Ahmed Bashandy" ro | ||||
le="editor"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="C" surname="Filsfils" fullname="Clarence" role="ed | ||||
itor"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="S" surname="Previdi" fullname="Stefano Previdi"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="S" surname="Litkowski" fullname="Stephane Litkowsk | ||||
i"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="R" surname="Shakir" fullname="Rob Shakir"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date month="December" year="2019"/> | ||||
</front> | ||||
<seriesInfo name="RFC" value="8660"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8660"/> | ||||
</reference> | ||||
</references> | ||||
<references pn="section-13.2"> | ||||
<name slugifiedName="name-informative-references">Informative References | ||||
</name> | ||||
<reference anchor="I-D.ietf-isis-mpls-elc" quoteTitle="true" target="htt | ||||
ps://tools.ietf.org/html/draft-ietf-isis-mpls-elc-10" derivedAnchor="ISIS-ELC"> | ||||
<front> | ||||
<title>Signaling Entropy Label Capability and Entropy Readable Label | ||||
Depth Using IS-IS</title> | ||||
<author initials="X" surname="Xu" fullname="Xiaohu Xu"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="S" surname="Kini" fullname="Sriganesh Kini"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="P" surname="Psenak" fullname="Peter Psenak"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="C" surname="Filsfils" fullname="Clarence Filsfils" | ||||
> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="S" surname="Litkowski" fullname="Stephane Litkowsk | ||||
i"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="M" surname="Bocci" fullname="Matthew Bocci"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date month="October" day="21" year="2019"/> | ||||
<abstract> | ||||
<t>Multiprotocol Label Switching (MPLS) has defined a mechanism to | ||||
load- balance traffic flows using Entropy Labels (EL). An ingress Label Switch | ||||
ing Router (LSR) cannot insert ELs for packets going into a given Label Switched | ||||
Path (LSP) unless an egress LSR has indicated via signaling that it has the cap | ||||
ability to process ELs, referred to as Entropy Label Capability (ELC), on that t | ||||
unnel. In addition, it would be useful for ingress LSRs to know each LSR's capa | ||||
bility for reading the maximum label stack depth and performing EL-based load- b | ||||
alancing, referred to as Entropy Readable Label Depth (ERLD). This document def | ||||
ines a mechanism to signal these two capabilities using IS-IS. These mechanisms | ||||
are particularly useful, where label advertisements are done via protocols like | ||||
IS-IS.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="Internet-Draft" value="draft-ietf-isis-mpls-elc-10"/ | ||||
> | ||||
<format type="TXT" target="http://www.ietf.org/internet-drafts/draft-i | ||||
etf-isis-mpls-elc-10.txt"/> | ||||
<refcontent>Work in Progress</refcontent> | ||||
</reference> | ||||
<reference anchor="I-D.ietf-ospf-mpls-elc" quoteTitle="true" target="htt | ||||
ps://tools.ietf.org/html/draft-ietf-ospf-mpls-elc-12" derivedAnchor="OSPF-ELC"> | ||||
<front> | ||||
<title>Signaling Entropy Label Capability and Entropy Readable Label | ||||
-stack Depth Using OSPF</title> | ||||
<author initials="X" surname="Xu" fullname="Xiaohu Xu"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="S" surname="Kini" fullname="Sriganesh Kini"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="P" surname="Psenak" fullname="Peter Psenak"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="C" surname="Filsfils" fullname="Clarence Filsfils" | ||||
> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="S" surname="Litkowski" fullname="Stephane Litkowsk | ||||
i"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="M" surname="Bocci" fullname="Matthew Bocci"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date month="October" day="25" year="2019"/> | ||||
<abstract> | ||||
<t>Multiprotocol Label Switching (MPLS) has defined a mechanism to | ||||
load- balance traffic flows using Entropy Labels (EL). An ingress Label Switch | ||||
ing Router (LSR) cannot insert ELs for packets going into a given tunnel unless | ||||
an egress LSR has indicated via signaling that it has the capability to process | ||||
ELs, referred to as Entropy Label Capability (ELC), on that tunnel. In addition | ||||
, it would be useful for ingress LSRs to know each LSR's capability of reading t | ||||
he maximum label stack depth and performing EL-based load-balancing, referred to | ||||
as Entropy Readable Label Depth (ERLD). This document defines a mechanism to s | ||||
ignal these two capabilities using OSPF and OSPFv3. These mechanism is particula | ||||
rly useful in the environment where Segment Routing (SR) is used, where label ad | ||||
vertisements are done via protocols like OSPF and OSPFv3.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="Internet-Draft" value="draft-ietf-ospf-mpls-elc-12"/ | ||||
> | ||||
<format type="TXT" target="http://www.ietf.org/internet-drafts/draft-i | ||||
etf-ospf-mpls-elc-12.txt"/> | ||||
<refcontent>Work in Progress</refcontent> | ||||
</reference> | ||||
<reference anchor="RFC8668" target="https://www.rfc-editor.org/info/rfc8 | ||||
668" quoteTitle="true" derivedAnchor="RFC8668"> | ||||
<front> | ||||
<title>Advertising Layer 2 Bundle Member Link Attributes in IS-IS</t | ||||
itle> | ||||
<author initials="L" surname="Ginsberg" fullname="Les Ginsberg"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="A" surname="Bashandy" fullname="Ahmed Bashandy"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="C" surname="Filsfils" fullname="Clarence Filsfils" | ||||
> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="M" surname="Nanduri" fullname="Mohan Nanduri"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="E" surname="Aries" fullname="Ebben Aries"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date month="December" year="2019"/> | ||||
</front> | ||||
<seriesInfo name="RFC" value="8668"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8668"/> | ||||
</reference> | ||||
<reference anchor="RFC7855" target="https://www.rfc-editor.org/info/rfc7 | ||||
855" quoteTitle="true" derivedAnchor="RFC7855"> | ||||
<front> | ||||
<title>Source Packet Routing in Networking (SPRING) Problem Statemen | ||||
t and Requirements</title> | ||||
<author initials="S." surname="Previdi" fullname="S. Previdi" role=" | ||||
editor"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="C." surname="Filsfils" fullname="C. Filsfils" role | ||||
="editor"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="B." surname="Decraene" fullname="B. Decraene"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="S." surname="Litkowski" fullname="S. Litkowski"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="M." surname="Horneffer" fullname="M. Horneffer"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="R." surname="Shakir" fullname="R. Shakir"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date year="2016" month="May"/> | ||||
<abstract> | ||||
<t>The ability for a node to specify a forwarding path, other than | ||||
the normal shortest path, that a particular packet will traverse, benefits a nu | ||||
mber of network functions. Source-based routing mechanisms have previously been | ||||
specified for network protocols but have not seen widespread adoption. In this | ||||
context, the term "source" means "the point at which the explicit route is impo | ||||
sed"; therefore, it is not limited to the originator of the packet (i.e., the no | ||||
de imposing the explicit route may be the ingress node of an operator's network) | ||||
.</t> | ||||
<t>This document outlines various use cases, with their requiremen | ||||
ts, that need to be taken into account by the Source Packet Routing in Networkin | ||||
g (SPRING) architecture for unicast traffic. Multicast use cases and requiremen | ||||
ts are out of scope for this document.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="7855"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC7855"/> | ||||
</reference> | ||||
<reference anchor="RFC8476" target="https://www.rfc-editor.org/info/rfc8 | ||||
476" quoteTitle="true" derivedAnchor="RFC8476"> | ||||
<front> | ||||
<title>Signaling Maximum SID Depth (MSD) Using OSPF</title> | ||||
<author initials="J." surname="Tantsura" fullname="J. Tantsura"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="U." surname="Chunduri" fullname="U. Chunduri"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="S." surname="Aldrin" fullname="S. Aldrin"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="P." surname="Psenak" fullname="P. Psenak"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date year="2018" month="December"/> | ||||
<abstract> | ||||
<t>This document defines a way for an Open Shortest Path First (OS | ||||
PF) router to advertise multiple types of supported Maximum SID Depths (MSDs) at | ||||
node and/or link granularity. Such advertisements allow entities (e.g., centra | ||||
lized controllers) to determine whether a particular Segment Identifier (SID) st | ||||
ack can be supported in a given network. This document only refers to the Signa | ||||
ling MSD as defined in RFC 8491, but it defines an encoding that can support oth | ||||
er MSD types. Here, the term "OSPF" means both OSPFv2 and OSPFv3.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="8476"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8476"/> | ||||
</reference> | ||||
<reference anchor="RFC8491" target="https://www.rfc-editor.org/info/rfc8 | ||||
491" quoteTitle="true" derivedAnchor="RFC8491"> | ||||
<front> | ||||
<title>Signaling Maximum SID Depth (MSD) Using IS-IS</title> | ||||
<author initials="J." surname="Tantsura" fullname="J. Tantsura"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="U." surname="Chunduri" fullname="U. Chunduri"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="S." surname="Aldrin" fullname="S. Aldrin"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="L." surname="Ginsberg" fullname="L. Ginsberg"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date year="2018" month="November"/> | ||||
<abstract> | ||||
<t>This document defines a way for an Intermediate System to Inter | ||||
mediate System (IS-IS) router to advertise multiple types of supported Maximum S | ||||
ID Depths (MSDs) at node and/or link granularity. Such advertisements allow enti | ||||
ties (e.g., centralized controllers) to determine whether a particular Segment I | ||||
D (SID) stack can be supported in a given network. This document only defines o | ||||
ne type of MSD: Base MPLS Imposition. However, it defines an encoding that can | ||||
support other MSD types. This document focuses on MSD use in a network that is | ||||
Segment Routing (SR) enabled, but MSD may also be useful when SR is not enabled. | ||||
</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="8491"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8491"/> | ||||
</reference> | ||||
<reference anchor="I-D.ietf-idr-bgp-ls-segment-routing-msd" quoteTitle=" | ||||
true" target="https://tools.ietf.org/html/draft-ietf-idr-bgp-ls-segment-routing- | ||||
msd-09" derivedAnchor="MSD-BGP"> | ||||
<front> | ||||
<title>Signaling MSD (Maximum SID Depth) using Border Gateway Protoc | ||||
ol Link-State</title> | ||||
<author initials="J" surname="Tantsura" fullname="Jeff Tantsura"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="U" surname="Chunduri" fullname="Uma Chunduri"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="K" surname="Talaulikar" fullname="Ketan Talaulikar | ||||
"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="G" surname="Mirsky" fullname="Gregory Mirsky"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="N" surname="Triantafillis" fullname="Nikos Trianta | ||||
fillis"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date month="October" day="15" year="2019"/> | ||||
<abstract> | ||||
<t>This document defines a way for a Border Gateway Protocol Link- | ||||
State (BGP-LS) speaker to advertise multiple types of supported Maximum SID Dept | ||||
hs (MSDs) at node and/or link granularity. Such advertisements allow entities ( | ||||
e.g., centralized controllers) to determine whether a particular Segment Identif | ||||
ier (SID) stack can be supported in a given network.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="Internet-Draft" value="draft-ietf-idr-bgp-ls-segment | ||||
-routing-msd-09"/> | ||||
<format type="TXT" target="http://www.ietf.org/internet-drafts/draft-i | ||||
etf-idr-bgp-ls-segment-routing-msd-09.txt"/> | ||||
<refcontent>Work in Progress</refcontent> | ||||
</reference> | ||||
</references> | ||||
</references> | </references> | |||
<section numbered="false" toc="include" removeInRFC="false" pn="section-appe | ||||
ndix.a"> | ||||
<name slugifiedName="name-acknowledgements">Acknowledgements</name> | ||||
<t pn="section-appendix.a-1">The authors would like to thank John Drake, L | ||||
oa Andersson, Curtis | ||||
Villamizar, Greg Mirsky, Markus Jork, Kamran Raza, Carlos Pignataro, Bruno De | ||||
craene, Chris Bowers, Nobo Akiya, Daniele Ceccarelli, and Joe Clarke for | ||||
their review, comments, and suggestions. | ||||
</t> | ||||
</section> | ||||
<section numbered="false" toc="include" removeInRFC="false" pn="section-appe | ||||
ndix.b"> | ||||
<name slugifiedName="name-contributors">Contributors</name> | ||||
<artwork name="" type="" align="left" alt="" pn="section-appendix.b-1"> | ||||
Xiaohu Xu | ||||
Huawei | ||||
Email: xuxiaohu@huawei.com | ||||
</artwork> | ||||
<artwork name="" type="" align="left" alt="" pn="section-appendix.b-2"> | ||||
Wim Hendrickx | ||||
Nokia | ||||
Email: wim.henderickx@nokia.com | ||||
</artwork> | ||||
<artwork name="" type="" align="left" alt="" pn="section-appendix.b-3"> | ||||
Gunter Van de Velde | ||||
Nokia | ||||
Email: gunter.van_de_velde@nokia.com | ||||
</artwork> | ||||
<artwork name="" type="" align="left" alt="" pn="section-appendix.b-4"> | ||||
Acee Lindem | ||||
Cisco | ||||
Email: acee@cisco.com | ||||
</artwork> | ||||
</section> | ||||
<section anchor="authors-addresses" numbered="false" removeInRFC="false" toc | ||||
="include" pn="section-appendix.c"> | ||||
<name slugifiedName="name-authors-addresses">Authors' Addresses</name> | ||||
<author initials="S" surname="Kini" fullname="Sriganesh Kini"> | ||||
<organization showOnFrontPage="true"/> | ||||
<address> | ||||
<postal> | ||||
<street/> | ||||
<city/> | ||||
<region/> | ||||
<code/> | ||||
<country/> | ||||
</postal> | ||||
<email>sriganeshkini@gmail.com</email> | ||||
</address> | ||||
</author> | ||||
<author initials="K" surname="Kompella" fullname="Kireeti Kompella"> | ||||
<organization showOnFrontPage="true">Juniper</organization> | ||||
<address> | ||||
<postal> | ||||
<street/> | ||||
<city/> | ||||
<region/> | ||||
<code/> | ||||
<country/> | ||||
</postal> | ||||
<email>kireeti@juniper.net</email> | ||||
</address> | ||||
</author> | ||||
<author initials="S" surname="Sivabalan" fullname="Siva Sivabalan"> | ||||
<organization showOnFrontPage="true">Cisco</organization> | ||||
<address> | ||||
<postal> | ||||
<street/> | ||||
<city/> | ||||
<region/> | ||||
<code/> | ||||
<country/> | ||||
</postal> | ||||
<email>msiva@cisco.com</email> | ||||
</address> | ||||
</author> | ||||
<author initials="S" surname="Litkowski" fullname="Stephane Litkowski"> | ||||
<organization showOnFrontPage="true">Orange</organization> | ||||
<address> | ||||
<postal> | ||||
<street/> | ||||
<city/> | ||||
<region/> | ||||
<code/> | ||||
<country/> | ||||
</postal> | ||||
<email>slitkows.ietf@gmail.com</email> | ||||
</address> | ||||
</author> | ||||
<author initials="R" surname="Shakir" fullname="Rob Shakir"> | ||||
<organization showOnFrontPage="true">Google</organization> | ||||
<address> | ||||
<postal> | ||||
<street/> | ||||
<city/> | ||||
<region/> | ||||
<code/> | ||||
<country/> | ||||
</postal> | ||||
<email>robjs@google.com</email> | ||||
</address> | ||||
</author> | ||||
<author initials="J" surname="Tantsura" fullname="Jeff Tantsura"> | ||||
<organization showOnFrontPage="true">Apstra, Inc.</organization> | ||||
<address> | ||||
<postal> | ||||
<street/> | ||||
<city/> | ||||
<region/> | ||||
<code/> | ||||
<country/> | ||||
</postal> | ||||
<email>jefftant.ietf@gmail.com</email> | ||||
</address> | ||||
</author> | ||||
</section> | ||||
</back> | </back> | |||
</rfc> | </rfc> | |||
End of changes. 89 change blocks. | ||||
1046 lines changed or deleted | 1930 lines changed or added | |||
This html diff was produced by rfcdiff 1.45. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |