| rfc9524xml2.original.xml | rfc9524.xml | |||
|---|---|---|---|---|
| <?xml version="1.0" encoding="US-ASCII"?> | <?xml version="1.0" encoding="UTF-8"?> | |||
| <!DOCTYPE rfc SYSTEM "rfc2629.dtd"> | ||||
| <?rfc toc="yes"?> | <!DOCTYPE rfc [ | |||
| <?rfc tocompact="yes"?> | <!ENTITY nbsp " "> | |||
| <?rfc tocdepth="3"?> | <!ENTITY zwsp "​"> | |||
| <?rfc tocindent="yes"?> | <!ENTITY nbhy "‑"> | |||
| <?rfc symrefs="yes"?> | <!ENTITY wj "⁠"> | |||
| <?rfc sortrefs="yes"?> | ]> | |||
| <?rfc comments="yes"?> | ||||
| <?rfc inline="yes"?> | <rfc category="std" consensus="true" | |||
| <?rfc compact="yes"?> | docName="draft-ietf-spring-sr-replication-segment-19" ipr="trust200902" | |||
| <?rfc subcompact="no"?> | number="9524" obsoletes="" sortRefs="true" submissionType="IETF" | |||
| <rfc category="std" docName="draft-ietf-spring-sr-replication-segment-19" | symRefs="true" tocDepth="3" tocInclude="true" updates="" version="3" | |||
| ipr="trust200902"> | xml:lang="en"> | |||
| <front> | <front> | |||
| <title abbrev="SR Replication Segment">SR Replication segment for | ||||
| Multi-point Service Delivery</title> | ||||
| <author fullname="Daniel Voyer (editor)" initials="D." | <title abbrev="SR Replication Segment">Segment Routing Replication | |||
| surname="Voyer, Ed."> | for Multipoint Service Delivery</title> | |||
| <organization>Bell Canada</organization> | ||||
| <seriesInfo name="RFC" value="9524"/> | ||||
| <author fullname="Daniel Voyer" initials="D." role="editor" | ||||
| surname="Voyer"> | ||||
| <organization>Bell Canada</organization> | ||||
| <address> | <address> | |||
| <postal> | <postal> | |||
| <street/> | ||||
| <city>Montreal</city> | <city>Montreal</city> | |||
| <country>Canada</country> | ||||
| <region/> | ||||
| <code/> | ||||
| <country>CA</country> | ||||
| </postal> | </postal> | |||
| <phone/> | ||||
| <facsimile/> | ||||
| <email>daniel.voyer@bell.ca</email> | <email>daniel.voyer@bell.ca</email> | |||
| <uri/> | ||||
| </address> | </address> | |||
| </author> | </author> | |||
| <author fullname="Clarence Filsfils" initials="C." surname="Filsfils"> | <author fullname="Clarence Filsfils" initials="C." surname="Filsfils"> | |||
| <organization>Cisco Systems, Inc.</organization> | <organization>Cisco Systems, Inc.</organization> | |||
| <address> | <address> | |||
| <postal> | <postal> | |||
| <street/> | ||||
| <city>Brussels</city> | <city>Brussels</city> | |||
| <country>Belgium</country> | ||||
| <region/> | ||||
| <code/> | ||||
| <country>BE</country> | ||||
| </postal> | </postal> | |||
| <phone/> | ||||
| <facsimile/> | ||||
| <email>cfilsfil@cisco.com</email> | <email>cfilsfil@cisco.com</email> | |||
| <uri/> | ||||
| </address> | </address> | |||
| </author> | </author> | |||
| <author fullname="Rishabh Parekh" initials="R." surname="Parekh"> | <author fullname="Rishabh Parekh" initials="R." surname="Parekh"> | |||
| <organization>Cisco Systems, Inc.</organization> | <organization>Cisco Systems, Inc.</organization> | |||
| <address> | <address> | |||
| <postal> | <postal> | |||
| <street/> | ||||
| <city>San Jose</city> | <city>San Jose</city> | |||
| <region>CA</region> | ||||
| <region/> | <country>United States of America</country> | |||
| <code/> | ||||
| <country>US</country> | ||||
| </postal> | </postal> | |||
| <phone/> | ||||
| <facsimile/> | ||||
| <email>riparekh@cisco.com</email> | <email>riparekh@cisco.com</email> | |||
| <uri/> | ||||
| </address> | </address> | |||
| </author> | </author> | |||
| <author fullname="Hooman Bidgoli" initials="H." surname="Bidgoli"> | <author fullname="Hooman Bidgoli" initials="H." surname="Bidgoli"> | |||
| <organization>Nokia</organization> | <organization>Nokia</organization> | |||
| <address> | <address> | |||
| <postal> | <postal> | |||
| <street/> | ||||
| <city>Ottawa</city> | <city>Ottawa</city> | |||
| <country>Canada</country> | ||||
| <region/> | ||||
| <code/> | ||||
| <country>CA</country> | ||||
| </postal> | </postal> | |||
| <phone/> | ||||
| <facsimile/> | ||||
| <email>hooman.bidgoli@nokia.com</email> | <email>hooman.bidgoli@nokia.com</email> | |||
| <uri/> | ||||
| </address> | </address> | |||
| </author> | </author> | |||
| <author fullname="Zhaohui Zhang" initials="Z." surname="Zhang"> | <author fullname="Zhaohui Zhang" initials="Z." surname="Zhang"> | |||
| <organization>Juniper Networks</organization> | <organization>Juniper Networks</organization> | |||
| <address> | <address> | |||
| <email>zzhang@juniper.net</email> | <email>zzhang@juniper.net</email> | |||
| </address> | </address> | |||
| </author> | </author> | |||
| <date day="28" month="August" year="2023"/> | <date month="February" year="2024"/> | |||
| <area>rtg</area> | ||||
| <workgroup>spring</workgroup> | ||||
| <abstract> | <abstract> | |||
| <t>This document describes the Segment Routing Replication segment for | <t>This document describes the Segment Routing Replication segment for | |||
| Multi-point service delivery. A Replication segment allows a packet to | multipoint service delivery. A Replication segment allows a packet to be | |||
| be replicated from a Replication node to Downstream nodes.</t> | replicated from a replication node to downstream nodes.</t> | |||
| </abstract> | </abstract> | |||
| <note title="Requirements Language"> | ||||
| <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 | ||||
| [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as | ||||
| shown here.</t> | ||||
| </note> | ||||
| </front> | </front> | |||
| <middle> | <middle> | |||
| <section title="Introduction"> | <section numbered="true" toc="default"> | |||
| <t>Replication segment is a new type of segment for Segment Routing (SR) | <name>Introduction</name> | |||
| <xref target="RFC8402"/>, which allows a node (henceforth called a | ||||
| Replication node) to replicate packets to a set of other nodes (called | <t>The Replication segment is a new type of segment for Segment Routing | |||
| Downstream nodes) in a Segment Routing Domain. A Replication segment can | (SR) <xref format="default" target="RFC8402"/>, which allows a node | |||
| replicate packets to directly connected nodes or to downstream nodes | (henceforth called a "replication node") to replicate packets to a set | |||
| (without need for state on the transit routers). This document focuses | of other nodes (called "downstream nodes") in an SR domain. | |||
| on specifying behavior of a Replication segment for both Segment Routing | A Replication segment can replicate packets to directly connected nodes | |||
| with Multiprotocol Label Switching (SR-MPLS) <xref target="RFC8660"/> | or to downstream nodes (without the need for state on the transit | |||
| and Segment Routing with IPv6 (SRv6) <xref target="RFC8986"/>. The | routers). This document focuses on specifying the behavior of a | |||
| examples in the Appendix illustrate the behavior of a Replication | Replication segment for both Segment Routing with Multiprotocol Label | |||
| Segment in SR domain. The use of two or more Replication segments | Switching (SR-MPLS) <xref format="default" target="RFC8660"/> and | |||
| stitched together to form a tree using a control plane is left to be | Segment Routing with IPv6 (SRv6) <xref format="default" | |||
| specified in other documents. The management of IP multicast groups, | target="RFC8986"/>. The examples in <xref format="default" | |||
| building IP multicast trees, and performing multicast congestion control | target="Appendix"/> illustrate the behavior of a Replication Segment in | |||
| are out of scope of this document.</t> | an SR domain. The use of two or more Replication segments stitched | |||
| together to form a tree using a control plane is left to be specified in | ||||
| other documents. The management of IP multicast groups, building IP | ||||
| multicast trees, and performing multicast congestion control are out of | ||||
| scope of this document.</t> | ||||
| <section numbered="true" toc="default"> | ||||
| <name>Terminology</name> | ||||
| <section title="Terminology"> | ||||
| <t>This section defines terms introduced and used frequently in this | <t>This section defines terms introduced and used frequently in this | |||
| document. Refer to Terminology sections of <xref target="RFC8402"/>, | document. Refer to the Terminology sections of <xref format="default" | |||
| <xref target="RFC8754"/> and <xref target="RFC8986"/> for other terms | target="RFC8402"/>, <xref format="default" target="RFC8754"/>, and | |||
| used in Segment Routing.</t> | <xref format="default" target="RFC8986"/> for other terms used in | |||
| SR.</t> | ||||
| <t><list style="symbols"> | <dl newline="false" spacing="normal"> | |||
| <t>Replication segment: A segment in SR domain that replicates | <dt>Replication segment:</dt> | |||
| packets. See <xref target="RepSeg"/> for details.</t> | ||||
| <t>Replication node: A node in SR domain which replicates packets | <dd>A segment in an SR domain that replicates packets. See <xref | |||
| based on Replication segment.</t> | format="default" target="RepSeg"/> for details.</dd> | |||
| <t>Downstream nodes: A Replication segment replicates packets to a | <dt>Replication node:</dt> | |||
| set of nodes. These nodes are Downstream nodes.</t> | ||||
| <t>Replication state: State held for a Replication segment at a | <dd>A node in an SR domain that replicates packets based on a | |||
| Replication node. It is conceptually a list of replication | Replication segment.</dd> | |||
| branches to Downstream nodes. The list can be empty.</t> | ||||
| <t>Replication SID: Data plane identifier of a Replication | <dt>Downstream nodes:</dt> | |||
| segment. This is a SR-MPLS label or SRv6 Segment Identifier | ||||
| (SID).</t> | ||||
| <t>SRH: IPv6 Segment Routing Header <xref target="RFC8754"/>.</t> | <dd>A Replication segment replicates packets to a set of nodes. | |||
| These nodes are downstream nodes.</dd> | ||||
| <t>Point-to-Multipoint Service: A service that has one ingress | <dt>Replication state:</dt> | |||
| node and one or more egress nodes. A packet is delivered to all | ||||
| the egress nodes</t> | ||||
| <t>Root node: An ingress node of a P2MP service,</t> | <dd>State held for a Replication segment at a replication node. It | |||
| is conceptually a list of Replication branches to downstream nodes. | ||||
| The list can be empty.</dd> | ||||
| <t>Leaf node: An egress node of a P2MP service.</t> | <dt>Replication-SID:</dt> | |||
| <t>Bud node: A node that is both a Replication node and a Leaf | <dd>Data plane identifier of a Replication segment. This is an | |||
| node.</t> | SR-MPLS label or SRv6 Segment Identifier (SID).</dd> | |||
| </list></t> | ||||
| <dt>SRH:</dt> | ||||
| <dd>IPv6 Segment Routing Header <xref format="default" | ||||
| target="RFC8754"/>.</dd> | ||||
| <dt>Point-to-Multipoint (P2MP) Service:</dt> | ||||
| <dd>A service that has one ingress node and one or more egress | ||||
| nodes. A packet is delivered to all the egress nodes.</dd> | ||||
| <dt>Root node:</dt> | ||||
| <dd>An ingress node of a P2MP service.</dd> | ||||
| <dt>Leaf node:</dt> | ||||
| <dd>An egress node of a P2MP service.</dd> | ||||
| <dt>Bud node:</dt> | ||||
| <dd>A node that is both a replication node and a leaf node.</dd> | ||||
| </dl> | ||||
| <t> | ||||
| 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"/> <xref | ||||
| target="RFC8174"/> when, and only when, they appear in all capitals, as | ||||
| shown here. | ||||
| </t> | ||||
| </section> | </section> | |||
| <section title="Use Cases"> | <section numbered="true" toc="default"> | |||
| <name>Use Cases</name> | ||||
| <t>In the simplest use case, a single Replication segment includes the | <t>In the simplest use case, a single Replication segment includes the | |||
| ingress node of a multi-point service and the egress nodes of the | ingress node of a multipoint service and the egress nodes of the | |||
| service as all the Downstream nodes. This achieves Ingress Replication | service as all the downstream nodes. This achieves Ingress Replication | |||
| <xref target="RFC7988"/> that has been widely used for Multicast VPN | <xref format="default" target="RFC7988"/> that has been widely used | |||
| (MVPN) <xref target="RFC6513"/> and Ethernet VPN (EVPN)<xref | for Multicast VPN (MVPN) <xref format="default" target="RFC6513"/> and | |||
| target="RFC7432"/> bridging of Broadcast, Unknown Unicast, and | Ethernet VPN (EVPN) <xref format="default" target="RFC7432"/> bridging | |||
| Multicast (BUM) traffic. This Replication segment can be either | of Broadcast, Unknown Unicast, and Multicast (BUM) traffic. This Replic | |||
| provisioned locally on ingress and egress nodes, or using dynamic | ation segment on ingress and | |||
| auto-discovery procedures for MVPN and EVPN. Note <xref | egress nodes can either be provisioned locally or using dynamic autodisc | |||
| target="RFC8986">SRv6</xref> has End.DT2M replication behavior for | overy procedures for MVPN and | |||
| EVPN BUM traffic.</t> | EVPN. Note <xref format="default" target="RFC8986">SRv6</xref> has | |||
| End.DT2M replication behavior for EVPN BUM traffic.</t> | ||||
| <t>Replication segments can also be used to form trees by stitching | <t>Replication segments can also be used to form trees by stitching | |||
| Replication segments on a Root node, intermediate Replication nodes | Replication segments on a root node, intermediate replication nodes, | |||
| and Leaf nodes for efficient delivery of MVPN and EVPN BUM | and leaf nodes for efficient delivery of MVPN and EVPN BUM | |||
| traffic.</t> | traffic.</t> | |||
| </section> | </section> | |||
| </section> | </section> | |||
| <section anchor="RepSeg" title="Replication Segment"> | <section anchor="RepSeg" numbered="true" toc="default"> | |||
| <t>In a Segment Routing Domain, a Replication segment is a logical | <name>Replication Segment</name> | |||
| construct which connects a Replication node to a set of Downstream | ||||
| nodes. A Replication segment is a local segment instantiated at a | <t>In an SR domain, a Replication segment is a logical | |||
| Replication node. It can be either provisioned locally on a node or | construct that connects a replication node to a set of downstream nodes. | |||
| programmed by a control plane.</t> | A Replication segment is a local segment instantiated at a Replication | |||
| node. It can be either provisioned locally on a node or programmed by a co | ||||
| ntrol plane. | ||||
| </t> | ||||
| <t>Replication segments can be stitched together to form a tree by | <t>Replication segments can be stitched together to form a tree by | |||
| either local provisioning on nodes or using a control plane. The | either local provisioning on nodes or using a control plane. The | |||
| procedures for doing this are out of scope of this document. One such | procedures for doing this are out of scope of this document. One such | |||
| control plane using a PCE with SR P2MP policy is specified in <xref | control plane using a PCE with the SR P2MP policy is specified in <xref | |||
| target="I-D.ietf-pim-sr-p2mp-policy"/>. However, if local provisioning | format="default" target="I-D.ietf-pim-sr-p2mp-policy"/>. However, if | |||
| is used to stitch Replication segments, then a chain of Replication | local provisioning is used to stitch Replication segments, then a chain | |||
| segments SHOULD NOT form a loop. If a control plane is used to stitch | of Replication segments <bcp14>SHOULD NOT</bcp14> form a loop. If a | |||
| Replication segments, the control plane specification MUST prevent | control plane is used to stitch Replication segments, the control plane | |||
| loops, or to detect and mitigate loops in steady state.</t> | specification <bcp14>MUST</bcp14> prevent loops or detect and mitigate | |||
| loops in steady state.</t> | ||||
| <t>A Replication segment is identified by the tuple <Replication-ID, | <t>A Replication segment is identified by the tuple <Replication-ID, | |||
| Node-ID>, where:</t> | Node-ID>, where:</t> | |||
| <t><list style="symbols"> | <dl newline="false" spacing="normal"> | |||
| <t>Replication-ID: An identifier for a Replication segment that is | <dt>Replication-ID:</dt> | |||
| unique in context of the Replication node.</t> | ||||
| <t>Node-ID: The address of the Replication node that the Replication | <dd>An identifier for a Replication segment that is unique in context | |||
| segment is for. Note that the Root of a multi-point service is also | of the replication node.</dd> | |||
| a Replication node.</t> | ||||
| </list></t> | ||||
| <t>Replication-ID is a variable length field. In simplest case, it can | <dt>Node-ID:</dt> | |||
| be a 32-bit number, but it can be extended or modified as required based | ||||
| on specific use of a Replication segment. This is out of scope for this | <dd>The address of the replication node for the Replication segment. | |||
| document. The length of Replication-ID is specified in the signaling | Note that the root of a multipoint service is also a Replication | |||
| mechanism used for Replication segment. Examples of such signaling and | node.</dd> | |||
| extensions are described in <xref | </dl> | |||
| <t>Replication-ID is a variable-length field. In the simplest case, it | ||||
| can be a 32-bit number, but it can be extended or modified as required | ||||
| based on the specific use of a Replication segment. This is out of scope | ||||
| for this document. The length of the Replication-ID is specified in the | ||||
| signaling mechanism used for the Replication segment. Examples of such | ||||
| signaling and extensions are described in <xref format="default" | ||||
| target="I-D.ietf-pim-sr-p2mp-policy"/>. When the PCE signals a | target="I-D.ietf-pim-sr-p2mp-policy"/>. When the PCE signals a | |||
| Replication segment to its node, the <Replication-ID, Node-ID> | Replication segment to its node, the <Replication-ID, Node-ID> | |||
| tuple identifies the segment.</t> | tuple identifies the segment.</t> | |||
| <t>A Replication segment includes the following elements: <list | <t>A Replication segment includes the following elements:</t> | |||
| style="symbols"> | ||||
| <t>Replication SID: The Segment Identifier of a Replication segment. | ||||
| This is a SR-MPLS label or a SRv6 SID <xref target="RFC8402"/>.</t> | ||||
| <t>Downstream nodes: Set of nodes in Segment Routing domain to which | <dl newline="false" spacing="normal"> | |||
| a packet is replicated by the Replication segment.</t> | <dt>Replication-SID:</dt> | |||
| <t>Replication state: See below.</t> | <dd>The Segment Identifier of a Replication segment. This is an | |||
| </list></t> | SR-MPLS label or an SRv6 SID <xref format="default" | |||
| target="RFC8402"/>.</dd> | ||||
| <t>The Downstream nodes and Replication state of a Replication segment | <dt>Downstream nodes:</dt> | |||
| can change over time, depending on the network state and Leaf nodes of a | ||||
| multi-point service that the segment is part of.</t> | ||||
| <t>Replication SID identifies the Replication segment in the forwarding | <dd>Set of nodes in an SR domain to which a packet is | |||
| plane. At a Replication node, the Replication SID operates on | replicated by the Replication segment.</dd> | |||
| Replication state of the Replication segment.</t> | ||||
| <t>Replication state is a list of replication branches to the Downstream | <dt>Replication state:</dt> | |||
| nodes. In this document, each branch is abstracted to a <Downstream | ||||
| node, Downstream Replication SID> tuple. <Downstream node> | ||||
| represents the reachability from the Replication node to the Downstream | ||||
| node. In its simplest form, this MAY be specified as an interface or | ||||
| next-hop if downstream node is adjacent to the Replication node. The | ||||
| reachability may be specified in terms of Flexible Algorithm path | ||||
| (including the default algorithm) <xref target="RFC9350"/>, or specified | ||||
| by an SR explicit path represented either by a SID-list (of one or more | ||||
| SIDs) or by a Segment Routing Policy <xref target="RFC9256"/>. | ||||
| Downstream Replication SID is the Replication SID of the Replication | ||||
| segment at the Downstream node.</t> | ||||
| <t>A packet is steered into a Replication segment at a Replication node | <dd>See below.</dd> | |||
| </dl> | ||||
| <t>The downstream nodes and Replication state (RS) of a Replication segmen | ||||
| t | ||||
| can change over time, depending on the network state and leaf nodes of a | ||||
| multipoint service that the segment is part of.</t> | ||||
| <t>The Replication-SID identifies the Replication segment in the | ||||
| forwarding plane. At a replication node, the Replication-SID operates on | ||||
| the RS of the Replication segment.</t> | ||||
| <t>RS is a list of Replication branches to the downstream | ||||
| nodes. In this document, each branch is abstracted to a <downstream | ||||
| node, downstream Replication-SID> tuple. <downstream node> | ||||
| represents the reachability from the replication node to the downstream | ||||
| node. In its simplest form, this <bcp14>MAY</bcp14> be specified as an | ||||
| interface or next-hop if the downstream node is adjacent to the | ||||
| replication node. The reachability may be specified in terms of a | ||||
| Flexible Algorithm path (including the default algorithm) <xref | ||||
| format="default" target="RFC9350"/> or specified by an SR-explicit path | ||||
| represented either by a SID list (of one or more SIDs) or by a Segment | ||||
| Routing Policy <xref format="default" target="RFC9256"/>. The downstream | ||||
| Replication-SID is the Replication-SID of the Replication segment at the | ||||
| downstream node.</t> | ||||
| <t>A packet is steered into a Replication segment at a replication node | ||||
| in two ways:</t> | in two ways:</t> | |||
| <t><list style="symbols"> | <ul spacing="normal"> | |||
| <t>When the Active Segment <xref target="RFC8402"/> is a locally | <li>When the active segment <xref format="default" target="RFC8402"/> | |||
| instantiated Replication SID</t> | is a locally instantiated Replication-SID.</li> | |||
| <t>By the Root of a multi-point service based on local configuration | <li>By the root of a multipoint service based on local configuration | |||
| outside the scope of this document.</t> | that is outside the scope of this document.</li> | |||
| </list></t> | </ul> | |||
| <t>In either case, the packet is replicated to each Downstream node in | <t>In either case, the packet is replicated to each downstream node in | |||
| the associated Replication state.</t> | the associated RS.</t> | |||
| <t>If a Downstream node is an egress (Leaf) of the multi-point service, | <t>If a downstream node is an egress (leaf) of the multipoint service, | |||
| no further replication is needed. The Leaf node's Replication segment | no further replication is needed. The leaf node's Replication segment | |||
| has an indicator for Leaf role and it does not have any Replication | has an indicator for the leaf role, and it does not have any RS (i.e., the | |||
| state i.e. the list of Replication branches is empty. The Replication | list of Replication branches is empty). The Replication-SID at a leaf node <bcp | |||
| SID at a Leaf node MAY be used to identify the multi-point service. | 14>MAY</bcp14> be used to identify the multipoint | |||
| Notice that the segment on the Leaf node is still referred to as a | service. Notice that the segment on the leaf node is still referred to | |||
| Replication segment for the purpose of generalization.</t> | as a "Replication segment" for the purpose of generalization.</t> | |||
| <t>A node can be a Bud node, i.e. it is a Replication node and a Leaf | <t>A node can be a bud node (i.e., it is a replication node and a leaf | |||
| node of a multi-point service <xref | node of a multipoint service <xref format="default" | |||
| target="I-D.ietf-pim-sr-p2mp-policy"/>. Replication segment of a Bud | target="I-D.ietf-pim-sr-p2mp-policy"/>). The Replication segment of a | |||
| node has a list of Replication Branches as well as Leaf role | bud node has a list of Replication branches as well as a leaf role | |||
| indicator.</t> | indicator.</t> | |||
| <t>In principle it is possible for different Replication segments to | <t>In principle, it is possible for different Replication segments to | |||
| replicate packets to the same Replication segment on a Downstream node. | replicate packets to the same Replication segment on a downstream node. | |||
| However, such usage is intentionally left out of scope of this | However, such usage is intentionally left out of scope of this | |||
| document.</t> | document.</t> | |||
| <section title="SR-MPLS data plane"> | <section numbered="true" toc="default"> | |||
| <t>When the Active Segment is a Replication SID, the processing | <name>SR-MPLS Data Plane</name> | |||
| results in a POP <xref target="RFC8402"/> operation and lookup of the | ||||
| associated Replication state. For each replication in the Replication | ||||
| state, the operation is a PUSH <xref target="RFC8402"/> of the | ||||
| downstream Replication SID and an optional segment list on to the | ||||
| packet to steer the packet to the Downstream node.</t> | ||||
| <t>The operation performed on incoming Replication SID is NEXT <xref | <t>When the active segment is a Replication-SID, the processing | |||
| target="RFC8402"/> at Leaf/Bud nodes where delivery of payload off | results in a POP <xref format="default" target="RFC8402"/> operation | |||
| tree is per local configuration. For some usages, this may involve | and the lookup of the associated RS. For each | |||
| looking at the next SID for example to get the necessary context.</t> | replication in the RS, the operation is a PUSH <xref | |||
| format="default" target="RFC8402"/> of the downstream Replication-SID | ||||
| and an optional segment list onto the packet to steer the packet to | ||||
| the downstream node.</t> | ||||
| <t>When the Root of a multi-point service steers a packet to a | <t>The operation performed on the incoming Replication-SID is NEXT | |||
| Replication segment, it results in a replication to each Downstream | <xref format="default" target="RFC8402"/> at a leaf or bud node where | |||
| node in the associated replication state. The operation is a PUSH of | delivery of payload off the tree is per local configuration. For some | |||
| the replication SID and an optional segment list on to the packet | usages, this may involve looking at the next SID, for example, to get | |||
| the necessary context.</t> | ||||
| <t>When the root of a multipoint service steers a packet to a | ||||
| Replication segment, it results in a replication to each downstream | ||||
| node in the associated RS. The operation is a PUSH of | ||||
| the Replication-SID and an optional segment list onto the packet, | ||||
| which is forwarded to the downstream node.</t> | which is forwarded to the downstream node.</t> | |||
| <t>The following applies to Replication SID in MPLS encapsulation:</t> | <t>The following applies to a Replication-SID in MPLS | |||
| encapsulation:</t> | ||||
| <t><list style="symbols"> | <ul spacing="normal"> | |||
| <t>SIDs MAY be inserted before the downstream SR-MPLS Replication | <li>SIDs <bcp14>MAY</bcp14> be inserted before the downstream | |||
| SID in order to guide a packet from a non-adjacent SR node to a | SR-MPLS Replication-SID in order to guide a packet from a | |||
| Replication node.</t> | non-adjacent SR node to a replication node.</li> | |||
| <t>A Replication node MAY replicate a packet to a non-adjacent | <li>A replication node <bcp14>MAY</bcp14> replicate a packet to a | |||
| Downstream node using SIDs it inserts in the copy preceding the | non-adjacent downstream node using SIDs it inserts in the copy | |||
| downstream Replication SID. The Downstream node may be a Leaf node | preceding the downstream Replication-SID. The downstream node may be | |||
| of the Replication segment, or another Replication node, or both | a leaf node of the Replication segment, another replication node, or | |||
| in case of Bud node.</t> | both in the case of a bud node.</li> | |||
| <t>A Replication node MAY use an Anycast SID or Border Gateway | <li>A replication node <bcp14>MAY</bcp14> use an Anycast-SID or a | |||
| Protocol (BGP) PeerSet SID in segment list to send a replicated | Border Gateway Protocol (BGP) PeerSet-SID in the segment list to | |||
| packet to one downstream Replication node in an Anycast set if and | send a replicated packet to one downstream replication node in a set o | |||
| only if all nodes in the set have an identical Replication SID and | f | |||
| reach the same set of receivers.</t> | Anycast nodes. This occurs if and only if all nodes in the set have an | |||
| identical Replication-SID and reach the same set of receivers.</li> | ||||
| <t>For some use cases, there MAY be SIDs after the Replication SID | <li>For some use cases, there <bcp14>MAY</bcp14> be SIDs after the | |||
| in the segment list of a packet. These SIDs are used only by the | Replication-SID in the segment list of a packet. These SIDs are used | |||
| Leaf/Bud nodes to forward a packet off the tree independent of the | only by the leaf and bud nodes to forward a packet off the tree | |||
| Replication SID. Coordination regarding the absence or presence | independent of the Replication-SID. Coordination regarding the | |||
| and value of context information for Leaf/Bud nodes is outside the | absence or presence and value of context information for leaf and bud | |||
| scope of this document.</t> | nodes is outside the scope of this document.</li> | |||
| </list></t> | </ul> | |||
| </section> | </section> | |||
| <section anchor="SRv6" title="SRv6 data plane"> | <section anchor="SRv6" numbered="true" toc="default"> | |||
| <t>For SRv6 <xref target="RFC8986"/>, this document specifies | <name>SRv6 Data Plane</name> | |||
| “Endpoint with replication” behavior (End.Replicate for | ||||
| short) to replicate a packet and forward the replicas according to a | ||||
| Replication state.</t> | ||||
| <t>When processing a packet destined to a local Replication SID, the | <t>For SRv6 <xref format="default" target="RFC8986"/>, this document | |||
| packet is replicated according to the associated Replication state to | specifies "Endpoint with replication and/or decapsulate" behavior (End.R | |||
| Downstream nodes and/or locally delivered off tree when this is a | eplicate for | |||
| Leaf/Bud node.For replication, the outer header is re-used, and the | short) to replicate a packet and forward the replicas according to an | |||
| Downstream Replication SID, from Replication state, is written into | RS.</t> | |||
| the outer IPv6 header destination address. If required, an optional | ||||
| segment list may be used on some branches using H.Encaps.Red <xref | ||||
| target="RFC8986"/> (while some other branches may not need that). Note | ||||
| that this H.Encaps.Red is independent of the replication segment | ||||
| – it is just used to steer the replicated packet on a traffic | ||||
| engineered path to a Downstream node. The penultimate segment in | ||||
| encapsulating IPv6 header will execute Ultimate Segment Decapsulation | ||||
| (USD) flavor <xref target="RFC8986"/> of End/End.X behavior and | ||||
| forward the inner (replicated) packet to the Downstream node. If | ||||
| H.Encaps.Red is used to steer a replicated packet to a Downstream | ||||
| node, the operator must ensure the MTU on path to the Downstream node | ||||
| is sufficient to account for additional SRv6 encapsulation. This also | ||||
| applies when the Replication segment is for the Root node, whose | ||||
| upstream node has placed the Replication-SID in the header.</t> | ||||
| <t>A local application on Root, for e.g. MVPN <xref target="RFC6513"/> | <t>When processing a packet destined to a local Replication-SID, the | |||
| or EVPN <xref target="RFC7432"/>, may also apply H.Encaps.Red and then | packet is replicated according to the associated RS to | |||
| steer the resulting traffic into the Replication segment. Again, note | downstream nodes and/or locally delivered off the tree when this is a | |||
| that the H.Encaps.Red is independent of the Replication segment | leaf or bud node. For replication, the outer header is reused, and the | |||
| – it is the action of the application (e.g. MVPN/EVPN service). | downstream Replication-SID, from RS, is written into | |||
| If the service is on a Root node, the two H.Encaps mentioned, one for | the outer IPv6 header Destination Address (DA). If required, an | |||
| the service and other in the previous paragraph for replication to | optional segment list may be used on some branches using H.Encaps.Red | |||
| Downstream node SHOULD be combined for optimization (to avoid extra | <xref format="default" target="RFC8986"/> (while some other branches | |||
| may not need that). Note that this H.Encaps.Red is independent of the | ||||
| Replication segment: it is just used to steer the replicated packet on | ||||
| a traffic-engineered path to a downstream node. The penultimate | ||||
| segment in the encapsulating IPv6 header will execute the Ultimate | ||||
| Segment Decapsulation (USD) flavor <xref format="default" | ||||
| target="RFC8986"/> of End/End.X behavior and forward the inner | ||||
| (replicated) packet to the downstream node. If H.Encaps.Red is used to | ||||
| steer a replicated packet to a downstream node, the operator must | ||||
| ensure the MTU on path to the downstream node is sufficient to account | ||||
| for additional SRv6 encapsulation. This also applies when the | ||||
| Replication segment is for the root node, whose upstream node has | ||||
| placed the Replication-SID in the header.</t> | ||||
| <t>A local application on root (e.g., MVPN <xref format="default" | ||||
| target="RFC6513"/> or EVPN <xref format="default" target="RFC7432"/>) | ||||
| may also apply H.Encaps.Red and then steer the resulting traffic into | ||||
| the Replication segment. Again, note that H.Encaps.Red is independent | ||||
| of the Replication segment: it is the action of the application (e.g. | ||||
| MVPN or EVPN service). If the service is on a root node, then the two | ||||
| H.Encaps mentioned, one for the service and the other in the previous | ||||
| paragraph for replication to the downstream node, | ||||
| <bcp14>SHOULD</bcp14> be combined for optimization (to avoid extra | ||||
| IPv6 encapsulation).</t> | IPv6 encapsulation).</t> | |||
| <t>When processing a packet destined to a local Replication SID, IPv6 | <t>When processing a packet destined to a local Replication-SID, the | |||
| Hop Limit MUST be decremented and MUST be non-zero to replicate the | IPv6 Hop Limit <bcp14>MUST</bcp14> be decremented and | |||
| packet. A Root node that encapsulates a payload can set the IPv6 Hop | <bcp14>MUST</bcp14> be non-zero to replicate the packet. A root node | |||
| Limit based on a local policy. This local policy SHOULD set the IPv6 | that encapsulates a payload can set the IPv6 Hop Limit based on a | |||
| Hop Limit so that a replicated packet can reach the furthest Leaf | local policy. This local policy <bcp14>SHOULD</bcp14> set the IPv6 Hop | |||
| node. A Root node can also have a local policy to set the IPv6 Hop | Limit so that a replicated packet can reach the furthest leaf node. A | |||
| Limit from the payload. In this case, IPv6 Hop Limit may not be | root node can also have a local policy to set the IPv6 Hop Limit from | |||
| sufficient to get the replicated packet to all the Leaf nodes; | the payload. In this case, the IPv6 Hop Limit may not be sufficient to | |||
| non-replication nodes i.e. nodes which forward replicated packets | get the replicated packet to all the leaf nodes. Non-replication nodes | |||
| based on IPv6 locator unicast prefix can decrement IPv6 Hop Limit to | (i.e., nodes that forward replicated packets based on the IPv6 locator | |||
| zero and originate ICMPv6 Error packets to the Root node. This can | unicast prefix) can decrement the IPv6 Hop Limit to zero and originate | |||
| result in a storm of ICMPv6 packets (see <xref target="ICMP"/>) to the | ICMPv6 error packets to the root node. This can result in a storm of | |||
| Root node. To avoid this, a Replication Segment has an optional IPv6 | ICMPv6 packets (see <xref format="default" target="ICMP"/>) to the | |||
| Hop Limit threshold. If this threshold is set, a Replication node MUST | root node. To avoid this, a Replication segment has an optional IPv6 | |||
| discard an incoming packet with local Replication SID if the IPv6 Hop | Hop Limit Threshold. If this threshold is set, a replication node | |||
| Limit in the packet is less than the threshold and log this in a rate | <bcp14>MUST</bcp14> discard an incoming packet with a local | |||
| limited manner. The IPv6 Hop Limit Threshold SHOULD be set so that | Replication-SID if the IPv6 Hop Limit in the packet is less than the | |||
| incoming packet can be replicated to furthest Leaf node.</t> | threshold and log this in a rate-limited manner. The IPv6 Hop Limit | |||
| Threshold <bcp14>SHOULD</bcp14> be set so that an incoming packet can | ||||
| be replicated to the furthest leaf node.</t> | ||||
| <t>For Leaf/Bud nodes local delivery off the tree is per Replication | <t>For leaf and bud nodes, local delivery off the tree is per Replicatio | |||
| SID or next SID (if present in SRH). For some usages, this may involve | n-SID or the next SID (if present in the SRH). For some usages, this may | |||
| getting the necessary context either from the next SID (e.g., MVPN | involve getting the necessary context either from the next SID (e.g., | |||
| with shared tree) or from the replication SID itself (e.g., MVPN with | MVPN with a shared tree) or from the Replication-SID itself (e.g., | |||
| non-shared tree). In both cases, the context association is achieved | MVPN with a non-shared tree). In both cases, the context association | |||
| with signaling and is out of scope of this document.</t> | is achieved with signaling and is out of scope of this document.</t> | |||
| <t>The following applies to Replication SID in SRv6 encapsulation:</t> | <t>The following applies to a Replication-SID in SRv6 | |||
| encapsulation:</t> | ||||
| <t><list style="symbols"> | <ul spacing="normal"> | |||
| <t>There MAY be SIDs preceding the SRv6 Replication SID in order | <li>There <bcp14>MAY</bcp14> be SIDs preceding the SRv6 Replication-SI | |||
| to guide a packet from a non-adjacent SR node to a Replication | D in order to guide a packet from a non-adjacent SR node to a | |||
| node via an explicit path.</t> | replication node via an explicit path.</li> | |||
| <t>A Replication node MAY steer a replicated packet on an explicit | <li>A replication node <bcp14>MAY</bcp14> steer a replicated packet | |||
| path to a non-adjacent Downstream node using SIDs it inserts in | on an explicit path to a non-adjacent downstream node using SIDs it | |||
| the copy preceding the downstream Replication SID. The Downstream | inserts in the copy preceding the downstream Replication-SID. The | |||
| node may be a Leaf node of the Replication segment, or another | downstream node may be a leaf node of the Replication segment, | |||
| Replication node, or both in case of Bud node.</t> | another replication node, or both in the case of a bud node.</li> | |||
| <t>For SRv6, as described in above paragraphs, the insertion of | <li>For SRv6, as described in above paragraphs, the insertion of | |||
| SIDs prior to Replication SID entails a new IPv6 encapsulation | SIDs prior to the Replication-SID entails a new IPv6 encapsulation | |||
| with SRH, but this can be optimized on Root node or for compressed | with the SRH. However, this can be optimized on the root node or for | |||
| SRv6 SIDs.</t> | compressed SRv6 SIDs.</li> | |||
| <t>The locator of Replication SID is sufficient to guide a packet | <li>The locator of the Replication-SID is sufficient to guide a | |||
| on shortest path, for default or Flexible algorithm, between | packet on the shortest path between non-adjacent nodes for default | |||
| non-adjacent nodes.</t> | or Flexible Algorithms.</li> | |||
| <t>A Replication node MAY use an Anycast SID or BGP PeerSet SID in | <li>A replication node <bcp14>MAY</bcp14> use an Anycast-SID or a | |||
| segment list to send a replicated packet to one downstream | BGP PeerSet-SID in the segment list to send a replicated packet to | |||
| Replication node in an Anycast set if and only if all nodes in the | one downstream replication node in an Anycast set. This occurs if | |||
| set have an identical Replication SID and reach the same set of | and only if all nodes in the set have an identical Replication-SID | |||
| receivers.</t> | and reach the same set of receivers.</li> | |||
| <t>There MAY be SIDs after the Replication SID in the SRH of a | <li>There <bcp14>MAY</bcp14> be SIDs after the Replication-SID in | |||
| packet. These SIDs are used to provide additional context for | the SRH of a packet. These SIDs are used to provide additional | |||
| processing a packet locally at the node where the Replication SID | context for processing a packet locally at the node where the | |||
| is the Active Segment. Coordination regarding the absence or | Replication-SID is the active segment. Coordination regarding the | |||
| presence and value of context information for Leaf/Bud nodes is | absence or presence and value of context information for leaf and bud | |||
| outside the scope of this document.</t> | nodes is outside the scope of this document.</li> | |||
| </list></t> | </ul> | |||
| <section title="End.Replicate: Replicate and/or Decapsulate"> | <section numbered="true" toc="default"> | |||
| <t>The "Endpoint with replication and/or decapsulate behavior | <name>End.Replicate: Replicate and/or Decapsulate</name> | |||
| (End.Replicate for short) is variant of End behavior. The | ||||
| pseudo-code in this section follows the convention introduced in | ||||
| <xref target="RFC8986">RFC 8986</xref>.</t> | ||||
| <t>A Replication state conceptually contains the following | <t>The "Endpoint with replication and/or decapsulate" | |||
| (End.Replicate for short) is a variant of End behavior. The | ||||
| pseudocode in this section follows the convention introduced in | ||||
| <xref format="default" target="RFC8986"/>.</t> | ||||
| <t>An RS conceptually contains the following | ||||
| elements:</t> | elements:</t> | |||
| <figure> | <sourcecode name="" type="pseudocode"><![CDATA[ | |||
| <artwork><![CDATA[ | ||||
| Replication state: | Replication state: | |||
| { | { | |||
| Node-Role: {Head, Transit, Leaf, Bud}; | Node-Role: {Head, Transit, Leaf, Bud}; | |||
| IPv6 Hop Limit Threshold; # default is zero | IPv6 Hop Limit Threshold; # default is zero | |||
| # On Leaf, replication list is zero length | # On Leaf, replication list is zero length | |||
| Replication-List: | Replication-List: | |||
| { | { | |||
| Downstream node: <Node-Identifier>; | downstream node: <Node-Identifier>; | |||
| Downstream Replication SID: R-SID; | downstream Replication-SID: R-SID; | |||
| # Segment-List may be empty | # Segment-List may be empty | |||
| Segment-List: [SID-1, .... SID-N]; | Segment-List: [SID-1, .... SID-N]; | |||
| } | } | |||
| } | } | |||
| ]]></sourcecode> | ||||
| ]]></artwork> | ||||
| </figure> | ||||
| <t>Below is the Replicate function on a packet for Replication state | <t>Below is the Replicate function on a packet for Replication state | |||
| (RS).</t> | (RS).</t> | |||
| <figure> | <sourcecode name="" type="pseudocode"><![CDATA[ | |||
| <artwork><![CDATA[S01. Replicate(RS, packet) | S01. Replicate(RS, packet) | |||
| S02. { | S02. { | |||
| S03. For each Replication R in RS.Replication-List { | S03. For each Replication R in RS.Replication-List { | |||
| S04. Make a copy of the packet | S04. Make a copy of the packet | |||
| S05. Set IPv6 DA = RS.R-SID | S05. Set IPv6 DA = RS.R-SID | |||
| S06. If RS.Segment-List is not empty { | S06. If RS.Segment-List is not empty { | |||
| S07. # Head node may optimize below encapsulation and | S07. # Head node may optimize below encapsulation and | |||
| S08. # the encapsulation of packet in a single encapsulation | S08. # the encapsulation of packet in a single encapsulation | |||
| S09. Execute H.Encaps or H.Encaps.Red with RS.Segment-List | S09. Execute H.Encaps or H.Encaps.Red with RS.Segment-List | |||
| on packet copy #RFC 8986 Section 5.1, 5.2 | on packet copy #RFC 8986, Sections 5.1 and 5.2 | |||
| S10. } | S10. } | |||
| S11. Submit the packet to the egress IPv6 FIB lookup and | S11. Submit the packet to the egress IPv6 FIB lookup and | |||
| transmission to the new destination | transmission to the new destination | |||
| S12. } | S12. } | |||
| S13. } | S13. } | |||
| ]]></sourcecode> | ||||
| ]]></artwork> | <t>Notes:</t> | |||
| </figure> | ||||
| <t>Notes:<vspace blankLines="0"/></t> | ||||
| <t><list style="symbols"> | <ul spacing="normal"> | |||
| <t>The IPv6 destination address in the copy of a packet is set | <li>The IPv6 DA in the copy of a packet is set | |||
| from local state and not from SRH</t> | from the local state and not from the SRH.</li> | |||
| </list></t> | </ul> | |||
| <t>When N receives a packet whose IPv6 DA is S and S is a local | <t>When N receives a packet whose IPv6 DA is S and S is a local | |||
| End.Replicate SID, N does:</t> | End.Replicate SID, N does:</t> | |||
| <figure> | <sourcecode name="" type="pseudocode"><![CDATA[ | |||
| <artwork><![CDATA[S01. Lookup FUNCT portion of S to get Replicatio | S01. Lookup FUNCT portion of S to get Replication state (RS) | |||
| n state RS | ||||
| S02. If (IPv6 Hop Limit <= 1) { | S02. If (IPv6 Hop Limit <= 1) { | |||
| S03. Discard the packet | S03. Discard the packet | |||
| S04. # ICMPv6 Time Exceeded is not permitted (ICMPv6 section below) | S04. # ICMPv6 Time Exceeded is not permitted | |||
| (see Section 2.2.3) | ||||
| S05. } | S05. } | |||
| S06. If RS is not found { | S06. If RS is not found { | |||
| S07. Discard the packet | S07. Discard the packet | |||
| S08. } | S08. } | |||
| S09. If (IPv6 Hop Limit < RS.IPv6 Hop Limit Threshold) { | S09. If (IPv6 Hop Limit < RS.IPv6 Hop Limit Threshold) { | |||
| S10. Discard the packet | S10. Discard the packet | |||
| S11. # Rate-limited logging | S11. # Rate-limited logging | |||
| S12. } | S12. } | |||
| S13. Decrement IPv6 Hop Limit by 1 | S13. Decrement IPv6 Hop Limit by 1 | |||
| S14. If (IPv6 NH == SRH and SRH TLVs present) { | S14. If (IPv6 NH == SRH and SRH TLVs present) { | |||
| S15. Process SRH TLVs if allowed by local configuration | S15. Process SRH TLVs if allowed by local configuration | |||
| S16. } | S16. } | |||
| S17. Call Replicate(RS, packet) | S17. Call Replicate(RS, packet) | |||
| S18. If (RS.Node-Role == Leaf OR RS.Node-Role == Bud) { | S18. If (RS.Node-Role == Leaf OR RS.Node-Role == bud) { | |||
| S19. If (IPv6 NH == SRH and Segments Left > 0) { | S19. If (IPv6 NH == SRH and Segments Left > 0) { | |||
| S20. Derive packet processing context(PPC) from Segment List | S20. Derive packet processing context (PPC) from Segment List | |||
| S21. If (Segments Left != 0) { | S21. If (Segments Left != 0) { | |||
| S22. Discard the packet | S22. Discard the packet | |||
| S23. # ICMPv6 Parameter Problem with Code 0 | S23. # ICMPv6 Parameter Problem message with Code 0 | |||
| S24. # (Erroneous header field encountered) | S24. # (Erroneous header field encountered) | |||
| S25. # is not permitted (ICMPv6 section below) | S25. # is not permitted (Section 2.2.3) | |||
| S26. } | S26. } | |||
| S27. } Else { | S27. } Else { | |||
| S28. Derive packet processing context(PPC) | S28. Derive packet processing context (PPC) | |||
| from FUNCT of Replication SID | from FUNCT of Replicatio-SID | |||
| S29. } | S29. } | |||
| S30. Process the next header | S30. Process the next header | |||
| S31. }]]></artwork> | S31. } | |||
| </figure> | ]]></sourcecode> | |||
| <t>The processing of Upper-Layer header of a packet matching | <t>The processing of the Upper-Layer header of a packet matching the | |||
| End.Replicate SID at Leaf/Bud node is as follows:</t> | End.Replicate SID at a leaf or bud node is as follows:</t> | |||
| <figure> | <sourcecode name="" type="pseudocode"><![CDATA[ | |||
| <artwork><![CDATA[S01. If (Upper-Layer header type == 4(IPv4) OR | S01. If (Upper-Layer header type == 4(IPv4) OR | |||
| Upper-Layer header type == 41(IPv6) ) { | Upper-Layer header type == 41(IPv6) ) { | |||
| S02. Remove the outer IPv6 header with all its extension headers | S02. Remove the outer IPv6 header with all its extension headers | |||
| S03. Process the packet in context of PPC | S03. Process the packet in context of PPC | |||
| S04. } Else If (Upper-Layer header type == 143(Ethernet) ) { | S04. } Else If (Upper-Layer header type == 143(Ethernet) ) { | |||
| S05. Remove the outer IPv6 header with all its extension headers | S05. Remove the outer IPv6 header with all its extension headers | |||
| S06. Process the Ethernet Frame in context of PPC | S06. Process the Ethernet Frame in context of PPC | |||
| S07. } Else If (Upper-Layer header type is allowed | S07. } Else If (Upper-Layer header type is allowed | |||
| by local configuration) { | by local configuration) { | |||
| S08. Proceed to process the Upper-Layer header | S08. Proceed to process the Upper-Layer header | |||
| S09. } Else { | S09. } Else { | |||
| S10. Discard the packet | S10. Discard the packet | |||
| S11. # ICMPv6 Parameter Problem with Code 4 | S11. # ICMPv6 Parameter Problem message with Code 4 | |||
| S12. # (SR Upper-layer Header Error) | S12. # (SR Upper-Layer header Error) | |||
| S13. # is not permitted (ICMPv6 section below) | S13. # is not permitted (Section 2.2.3) | |||
| S14. } ]]></artwork> | S14. } | |||
| </figure> | ]]></sourcecode> | |||
| <t>Notes:</t> | ||||
| <t>Notes:<vspace blankLines="0"/></t> | <ul spacing="normal"> | |||
| <li>The behavior above <bcp14>MAY</bcp14> result in a packet with | ||||
| a partially processed segment list in the SRH under some | ||||
| circumstances. For example, a head node may encode a context-SID | ||||
| in an SRH. As per the pseudocode above, a replication node that | ||||
| receives a packet with a local Replication-SID will not process | ||||
| the SRH segment list and will just forward a copy with an | ||||
| unmodified SRH to downstream nodes.</li> | ||||
| <t><list style="symbols"> | <li>The packet processing context is usually a FIB table "T".</li> | |||
| <t>The behavior above MAY result in a packet with partially | </ul> | |||
| processed segment list in SRH under some circumstances. Fox | ||||
| example a head node may encode a context SID in an SRH. As per | ||||
| pseudo-code above, a Replication node that receives a packet | ||||
| with local Replication SID will not process the SRH segment list | ||||
| and just forward a copy with unmodified SRH to Downstream | ||||
| nodes.</t> | ||||
| <t>The packet processing context usually is a FIB table T</t> | <t>If configured to process TLVs, processing the Replication-SID may | |||
| </list></t> | modify the "variable-length data" of TLV types that change en route. | |||
| Therefore, TLVs that change en route are mutable. The remainder of | ||||
| the SRH (Segments Left, Flags, Tag, Segment List, and TLVs that do | ||||
| not change en route) are immutable while processing this SID.</t> | ||||
| <t>Processing the Replication SID may modify, if configured to | <section numbered="true" toc="default"> | |||
| process TLVs, the "variable-length data" of TLV types that change en | <name>Hashed Message Authentication Code (HMAC) SRH TLV</name> | |||
| route. Therefore, TLVs that change en route are mutable. The | ||||
| remainder of the SRH (Segments Left, Flags, Tag, Segment List, and | ||||
| TLVs that do not change en route) are immutable while processing | ||||
| this SID.</t> | ||||
| <section title="Hashed Message Authentication Code (HMAC) SRH TLV"> | <t>If a root node encodes a context-SID in an SRH with an optional | |||
| <t>If a Root node encodes a context SID in SRH with an optional | HMAC SRH TLV <xref format="default" target="RFC8754"/>, it | |||
| HMAC SRH TLV <xref target="RFC8754"/>, it MUST set the 'D' bit as | <bcp14>MUST</bcp14> set the 'D' bit as defined in <xref | |||
| defined in Section 2.1.2 because the Replication SID is not part | section="2.1.2" sectionFormat="of" target="RFC8754"/> because the | |||
| of the segment list in SRH.</t> | Replication-SID is not part of the segment list in the SRH.</t> | |||
| <t>HMAC generation and verification is as specified in RFC 8754. | <t>HMAC generation and verification is as specified in <xref | |||
| Verification of HMAC TLV is determined by local configuration. If | format="default" target="RFC8754"/>. Verification of an HMAC TLV | |||
| verification fails, an implementation of Replication SID MUST NOT | is determined by local configuration. If verification fails, an | |||
| originate an ICMPv6 error message (parameter problem, code 0). The | implementation of a Replication-SID <bcp14>MUST NOT</bcp14> | |||
| failure SHOULD be logged (rate limited) and the packet SHOULD be | originate an ICMPv6 Parameter Problem message with code 0. The | |||
| discarded.</t> | failure <bcp14>SHOULD</bcp14> be logged (rate-limited) and the | |||
| packet <bcp14>SHOULD</bcp14> be discarded.</t> | ||||
| </section> | </section> | |||
| </section> | </section> | |||
| <section title="OAM Operations"> | <section numbered="true" toc="default"> | |||
| <t>RFC 9259 <xref target="RFC9259"/> specifies procedures for OAM | <name>OAM Operations</name> | |||
| operations like ping and traceroute on SRv6 SIDs.</t> | ||||
| <t>It is possible to ping a Replication SID of a Leaf/Bud node, | <t><xref format="default" target="RFC9259"/> specifies procedures | |||
| assuming the source node knows the Replication SID a priori, | for Operations, Administration, and Maintenance (OAM) like ping and | |||
| directly by putting it in the IPv6 destination address without a SRH | traceroute on SRv6 SIDs.</t> | |||
| or in a SRH as the last segment. While it is not possible to ping a | ||||
| Replication SID of a transit node because transit nodes do not | ||||
| process upper layer headers, it is still possible to ping a | ||||
| Replication SID of Leaf/Bud node of a tree via the Replication SID | ||||
| of intermediate transit nodes. The source of ping MUST compute the | ||||
| ICMPv6 Echo Request checksum using the Replication SID of Leaf/Bud | ||||
| as destination address. The source can then send the Echo Request | ||||
| packet to a transit node's Replication SID. The transit nodes | ||||
| replicate the packet by replacing the IPv6 destination address till | ||||
| the packet reaches the Leaf/Bud node which responds with an ICMPv6 | ||||
| Echo Reply. Note that a transit Replication node may replicate Echo | ||||
| Request packets to other Leaf/Bud nodes. These nodes will drop the | ||||
| Echo Request due to incorrect checksum. Procedures to prevent the | ||||
| mis-delivery of Echo Request may be addressed in a future document. | ||||
| Appendix A.2.1 illustrates examples of ping to a Replication | ||||
| SID.</t> | ||||
| <t>Traceroute to a Leaf/Bud node Replication SID is not possible due | <t>Assuming the source node knows the Replication-SID a priori, it | |||
| to restriction prohibiting origination of ICMPv6 Time Exceeded error | is possible to ping a Replication-SID of a leaf or bud node directly b | |||
| message for a Replication SID as described in the section below.</t> | y | |||
| </section> | putting it in the IPv6 DA without an SRH or in an | |||
| SRH as the last segment. While it is not possible to ping a | ||||
| Replication-SID of a transit node because transit nodes do not | ||||
| process Upper-Layer headers, it is still possible to ping a | ||||
| Replication-SID of a leaf or bud node of a tree via the Replication-SI | ||||
| D | ||||
| of intermediate transit nodes. The source of the ping | ||||
| <bcp14>MUST</bcp14> compute the ICMPv6 Echo Request checksum using | ||||
| the Replication-SID of the leaf or bud node as the DA. The | ||||
| source can then send the Echo Request packet to a transit node's | ||||
| Replication-SID. The transit node replicates the packet by replacing | ||||
| the IPv6 DA until the packet reaches the leaf or bud | ||||
| node, which responds with an ICMPv6 Echo Reply. Note that a transit | ||||
| replication node may replicate Echo Request packets to other | ||||
| leaf or bud nodes. These nodes will drop the Echo Request due to an | ||||
| incorrect checksum. Procedures to prevent the misdelivery of an Echo | ||||
| Request may be addressed in a future document. <xref | ||||
| format="default" target="A.2.1"/> illustrates examples of a ping to | ||||
| a Replication-SID.</t> | ||||
| <section anchor="ICMP" title="ICMPv6 Error Messages"> | <t>Traceroute to a leaf or bud node Replication-SID is not possible du | |||
| <t>ICMPv6 RFC <xref target="RFC4443"/> Section 2.4 states an ICMPv6 | e | |||
| error message MUST NOT be originated as a result of receiving a | to restrictions prohibiting the origination of the ICMPv6 Time | |||
| packet destined to an IPv6 multicast address. This is to prevent a | Exceeded error message for a Replication-SID as described in <xref | |||
| storm of ICMPv6 error messages resulting from replicated IPv6 | format="default" target="ICMP"/>.</t> | |||
| packets from overwhelming a source node. There are two exceptions | ||||
| (1) the Packet Too Big message for Path MTU discovery, and (2) | ||||
| Parameter Problem Message, Code 2 reporting an unrecognized IPv6 | ||||
| option. An implementation of Replication segment for SRv6 MUST | ||||
| enforce these same restrictions and exceptions.</t> | ||||
| </section> | </section> | |||
| </section> | ||||
| </section> | ||||
| <section title="Implementation Status"> | <section anchor="ICMP" numbered="true" toc="default"> | |||
| <t>Note to the RFC Editor: Please remove this section and reference to | <name>ICMPv6 Error Messages</name> | |||
| RFC 7942 before publication.</t> | ||||
| <t>This section records the status of known implementations of the | <t><xref section="2.4" sectionFormat="of" target="RFC4443"/> states | |||
| protocol defined by this specification at the time of posting of this | an ICMPv6 error message <bcp14>MUST NOT</bcp14> be originated as a | |||
| Internet-Draft, and is based on a proposal described in <xref | result of receiving a packet destined to an IPv6 multicast address. | |||
| target="RFC7942">RFC 7942</xref>. The description of implementations in | This is to prevent a source node from being overwhelmed by a storm of | |||
| this section is intended to assist the IETF in its decision processes in | ICMPv6 error messages resulting from | |||
| progressing drafts to RFCs. Please note that the listing of any | replicated IPv6 packets. There are | |||
| individual implementation here does not imply endorsement by the IETF. | two exceptions:</t> | |||
| Furthermore, no effort has been spent to verify the information | ||||
| presented here that was supplied by IETF contributors. This is not | ||||
| intended as, and must not be construed to be, a catalog of available | ||||
| implementations or their features. Readers are advised to note that | ||||
| other implementations may exist. According to <xref target="RFC7942">RFC | ||||
| 7942</xref>, "this will allow reviewers and working groups to assign due | ||||
| consideration to documents that have the benefit of running code, which | ||||
| may serve as evidence of valuable experimentation and feedback that have | ||||
| made the implemented protocols more mature. It is up to the individual | ||||
| working groups to use this information as they see fit".</t> | ||||
| <t>There are two known implementations of this draft by Cisco and Nokia. | <ol> | |||
| Interoperability reports for the implementations are not applicable | <li>The Packet Too Big message for Path MTU discovery, and</li> | |||
| since this draft does not specify inter-operable elements of Replication | ||||
| segments.</t> | ||||
| <section title="Cisco implementation"> | <li>The ICMPv6 Parameter Problem message with Code 2 reporting an | |||
| <t>Cisco Implementation uses Replication segments defined in this | unrecognized IPv6 option.</li> | |||
| draft as a basis for PCE to compute and establish P2MP trees in SR | </ol> | |||
| domain to provide multi-point services. The implementation, based on | ||||
| latest version of this draft, is in production and supports all MUST | ||||
| and SHOULD clauses for SR-MPLS Replication segments. The documentation | ||||
| is available at <eref | ||||
| target="https://www.cisco.com/c/en/us/td/docs/routers/asr9000/software/a | ||||
| sr9k-r7-3/segment-routing/configuration/guide/b-segment-routing-cg-asr9000-73x/b | ||||
| -segment-routing-cg-asr9000-71x_chapter_01001.html ">Cisco | ||||
| documentation</eref> and the point of contact is Rishabh Parekh | ||||
| (riparekh@cisco.com).</t> | ||||
| </section> | ||||
| <section title="Nokia implementation"> | <t>An implementation of a Replication segment for SRv6 | |||
| <t>Nokia has implemented replication SID as defined in this draft to | <bcp14>MUST</bcp14> enforce these same restrictions and | |||
| establish P2MP tree in segment routing domain. The implementation | exceptions.</t> | |||
| supports SR-MPLS encapsulation and has all the MUST and SHOULD clause | </section> | |||
| in this draft. The implementation is at general availability maturity | ||||
| and is compliant with the latest version of the draft. The | ||||
| documentation for implementation can be found at <eref | ||||
| target="https://infocenter.nokia.com/public/7750SR207R1A/index.jsp?topic | ||||
| =%2Fcom.sr.multicast%2Fhtml%2Ftreesid.html">Nokia | ||||
| help</eref> and the point of contact is hooman.bidgoli@nokia.com.</t> | ||||
| </section> | </section> | |||
| </section> | </section> | |||
| <section anchor="IANA" title="IANA Considerations"> | <section anchor="IANA" numbered="true" toc="default"> | |||
| <name>IANA Considerations</name> | ||||
| <t>IANA has assigned the following codepoint for End.Replicate behavior | <t>IANA has assigned the following codepoint for End.Replicate behavior | |||
| in the "SRv6 Endpoint Behaviors" registry in the "Segment Routing" | in the "SRv6 Endpoint Behaviors" registry in the "Segment Routing" | |||
| registry group.</t> | registry group.</t> | |||
| <texttable anchor="endpoint_cp_types" | <table align="center" anchor="endpoint_cp_types"> | |||
| title="IETF - SRv6 Endpoint Behaviors"> | <name>SRv6 Endpoint Behavior</name> | |||
| <ttcol align="left">Value</ttcol> | ||||
| <ttcol align="center">Hex</ttcol> | <thead> | |||
| <tr> | ||||
| <th align="left">Value</th> | ||||
| <ttcol align="center">Endpoint behavior</ttcol> | <th align="center">Hex</th> | |||
| <ttcol align="center">Reference</ttcol> | <th align="center">Endpoint Behavior</th> | |||
| <c>75</c> | <th align="center">Reference</th> | |||
| <c>0x004B</c> | <th align="center">Change Controller</th> | |||
| </tr> | ||||
| </thead> | ||||
| <c>End.Replicate</c> | <tbody> | |||
| <tr> | ||||
| <td align="left">75</td> | ||||
| <c>[This.ID]</c> | <td align="center">0x004B</td> | |||
| </texttable> | ||||
| <td align="center">End.Replicate</td> | ||||
| <td align="center">RFC 9524</td> | ||||
| <td align="center">IETF</td> | ||||
| </tr> | ||||
| </tbody> | ||||
| </table> | ||||
| </section> | </section> | |||
| <section anchor="Security" title="Security Considerations"> | <section anchor="Security" numbered="true" toc="default"> | |||
| <name>Security Considerations</name> | ||||
| <t>The SID behaviors defined in this document are deployed within an SR | <t>The SID behaviors defined in this document are deployed within an SR | |||
| domain <xref target="RFC8402"/>. An SR domain needs protection from | domain <xref format="default" target="RFC8402"/>. An SR domain needs | |||
| outside attackers as described in <xref target="RFC8754"/> and following | protection from outside attackers (as described in <xref | |||
| is a brief reminder of the same:</t> | format="default" target="RFC8754"/>). The following is a brief reminder | |||
| of the same:</t> | ||||
| <t><list style="symbols"> | <ul spacing="normal"> | |||
| <t>For SR-MPLS deployments:<list style="symbols"> | <li> | |||
| <t>By disabling MPLS on external interfaces of each edge node or | <t>For SR-MPLS deployments:</t> | |||
| any other technique to filter labeled traffic ingress on these | ||||
| interfaces.</t> | ||||
| </list></t> | ||||
| <t>For SRv6 deployments:<list style="symbols"> | <ul spacing="normal"> | |||
| <t>Allocate all the SIDs from an IPv6 prefix block S/s and | <li>Disable MPLS on external interfaces of each edge node or any | |||
| configure each external interface of each edge node of the | other technique to filter labeled traffic ingress on these | |||
| domain with an inbound infrastructure access list (IACL) that | interfaces.</li> | |||
| drops any incoming packet with a destination address in S/s.</t> | </ul> | |||
| </li> | ||||
| <t>Additionally, an iACL may be applied to all nodes (k) | <li> | |||
| provisioning SIDs as defined in this specification:<list | <t>For SRv6 deployments:</t> | |||
| style="symbols"> | ||||
| <t>Assign all interface addresses from within IPv6 prefix | ||||
| A/a. At node k, all SIDs local to k are assigned from prefix | ||||
| Sk/sk. Configure each internal interface of each SR node k | ||||
| in the SR domain with an inbound IACL that drops any | ||||
| incoming packet with a destination address in Sk/sk if the | ||||
| source address is not in A/a.</t> | ||||
| </list></t> | ||||
| <t>Denying traffic with spoofed source addresses by implementing | <ul spacing="normal"> | |||
| recommendations in BCP 84 <xref target="RFC3704"/>.</t> | <li>Allocate all the SIDs from an IPv6 prefix block S/s and | |||
| configure each external interface of each edge node of the domain | ||||
| with an inbound Infrastructure Access Control List (IACL) that drops | ||||
| any | ||||
| incoming packet with a DA in S/s.</li> | ||||
| <t>Additionally the block S/s from which SIDs are allocated may | <li> | |||
| be a non-globally-routable address such as ULA or the prefix | <t>Additionally, an IACL may be applied to all nodes (k) | |||
| defined in <xref target="I-D.ietf-6man-sids"/>.</t> | provisioning SIDs as defined in this specification:</t> | |||
| </list></t> | ||||
| </list>Failure to protect the SR MPLS domain by correctly provisioning | <ul spacing="normal"> | |||
| MPLS support per interface permits attackers from outside the domain to | <li>Assign all interface addresses from within IPv6 prefix | |||
| send packets that use the replication services provisioned within the | A/a. At node k, all SIDs local to k are assigned from prefix | |||
| Sk/sk. Configure each internal interface of each SR node k in | ||||
| the SR domain with an inbound IACL that drops any incoming | ||||
| packet with a DA in Sk/sk if the source | ||||
| address is not in A/a.</li> | ||||
| </ul> | ||||
| </li> | ||||
| <li>Deny traffic with spoofed source addresses by implementing | ||||
| recommendations in BCP 84 <xref format="default" | ||||
| target="RFC3704"/>.</li> | ||||
| <li>Additionally, the block S/s from which SIDs are allocated may | ||||
| be an address that is not globally routable such as a Unique Local | ||||
| Address (ULA) or the prefix defined in <xref format="default" | ||||
| target="I-D.ietf-6man-sids"/>.</li> | ||||
| </ul> | ||||
| </li> | ||||
| </ul> | ||||
| <t>Failure to protect the SR-MPLS domain by correctly provisioning MPLS | ||||
| support per interface permits attackers from outside the domain to send | ||||
| packets that use the replication services provisioned within the | ||||
| domain.</t> | domain.</t> | |||
| <t>Failure to protect the SRv6 domain with IACLs on external interfaces, | <t>Failure to protect the SRv6 domain with IACLs on external interfaces | |||
| combined with failure to implement BCP 38 <xref target="RFC2827"/>or | combined with failure to implement the recommendations of BCP 38 <xref | |||
| apply IACLs on nodes provisioning SIDs, permits attackers from outside | format="default" target="RFC2827"/> or apply IACLs on nodes provisioning | |||
| the SR domain to send packets that use the replication services | SIDs permits attackers from outside the SR domain to send packets that | |||
| provisioned within the domain.</t> | use the replication services provisioned within the domain.</t> | |||
| <t>Given the definition of the Replication segment in this document, an | <t>Given the definition of the Replication segment in this document, an | |||
| attacker subverting ingress filter above cannot take advantage of a | attacker subverting the ingress filters above cannot take advantage of a | |||
| stack of replication segments to perform amplification attacks nor link | stack of Replication segments to perform amplification attacks nor link | |||
| exhaustion attacks. Replication segment trees always terminate at a Leaf | exhaustion attacks. Replication segment trees always terminate at a leaf | |||
| or Bud node resulting in a decapsulation. This however does allow an | or bud node resulting in a decapsulation. However, this does allow an | |||
| attacker to inject traffic to the receivers within a P2MP service.</t> | attacker to inject traffic to the receivers within a P2MP service.</t> | |||
| <t>This document introduces a SR segment endpoint behavior that | <t>This document introduces an SR segment endpoint behavior that | |||
| replicates and decapsulates an inner payload for both the MPLS and IPv6 | replicates and decapsulates an inner payload for both the MPLS and IPv6 | |||
| data planes. Similar to any MPLS end of stack label, or SRv6 END.D* | data planes. Similar to any MPLS end-of-stack label, or SRv6 END.D* | |||
| behavior, if the protections described above are not implemented an | behavior, if the protections described above are not implemented, an | |||
| attacker can perform an attack via the decapsulating segment (including | attacker can perform an attack via the decapsulating segment (including | |||
| the one described in this document).</t> | the one described in this document).</t> | |||
| <t>Incorrect provisioning of Replication segments can result in a chain | <t>Incorrect provisioning of Replication segments can result in a chain | |||
| of Replication segments forming a loop. This can happen if Replication | of Replication segments forming a loop. This can happen if Replication | |||
| segments are provisioned on SR nodes without using a control plane. In | segments are provisioned on SR nodes without using a control plane. In | |||
| this case, replicated packets can create a storm till MPLS TTL (for | this case, replicated packets can create a storm until MPLS TTL (for | |||
| SR-MPLS) or IPv6 Hop Limit (for SRv6) decrements to zero. A control | SR-MPLS) or IPv6 Hop Limit (for SRv6) decrements to zero. A control | |||
| plane, for example PCE, can be used to prevent loops. The control plane | plane such as PCE can be used to prevent loops. The control plane | |||
| protocols (like PCEP, BGP, etc.) used to instantiate Replication | protocols (like Path Computation Element Communication Protocol (PCEP), | |||
| segments can leverage their own security mechanisms such as encryption, | BGP, etc.) used to instantiate Replication segments can leverage their | |||
| authentication filtering etc.</t> | own security mechanisms such as encryption, authentication filtering, | |||
| etc.</t> | ||||
| <t>For SRv6, <xref target="ICMP"/> describes an exception for Parameter | ||||
| Problem Message, code 2 ICMPv6 Error messages. If an attacker sends a | ||||
| packet destined to Replication SID with source address of a node and | ||||
| with an extension header using unknown option type marked as mandatory, | ||||
| then a large number of ICMPv6 Parameter Problem messages can cause a | ||||
| denial-of-service attack on the source node. Although this specification | ||||
| does not specify any extension headers, any future extension of this | ||||
| document doing so is susceptible to this security concern.</t> | ||||
| <t>If an attacker can forge an IPv6 packet with source address of a | ||||
| node, Replication SID as destination address and an IPv6 Hop Limit such | ||||
| that nodes which forward replicated packets on IPv6 locator unicast | ||||
| prefix, decrement the Hop Limit to zero, then these nodes can cause a | ||||
| storm of ICMPv6 Error packets to overwhelm the source node under attack. | ||||
| The IPv6 Hop Limit Threshold check described in <xref target="SRv6"/> | ||||
| can help mitigate such attacks.</t> | ||||
| </section> | ||||
| <section anchor="Acknowledgements" title="Acknowledgements"> | ||||
| <t>The authors would like to acknowledge Siva Sivabalan, Mike Koldychev, | ||||
| Vishnu Pavan Beeram, Alexander Vainshtein, Bruno Decraene, Thierry | ||||
| Couture, Joel Halpern, Ketan Talaulikar, Darren Dukes and Jingrong Xie | ||||
| for their valuable inputs.</t> | ||||
| </section> | ||||
| <section title="Contributors"> | ||||
| <t>Clayton Hassen <vspace blankLines="0"/> Bell Canada <vspace | ||||
| blankLines="0"/> Vancouver <vspace blankLines="0"/> Canada</t> | ||||
| <t>Email: clayton.hassen@bell.ca</t> | <t>For SRv6, <xref format="default" target="ICMP"/> describes an | |||
| exception for the ICMPv6 Parameter Problem message with Code 2. If an atta | ||||
| cker sends a packet destined to a Replication-SID | ||||
| with the source address of a node and with an extension header using the | ||||
| unknown option type marked as mandatory, then a large number of ICMPv6 | ||||
| Parameter Problem messages can cause a denial-of-service attack on the | ||||
| source node. Although this document does not specify any extension | ||||
| headers, any future extension of this document that does so is | ||||
| susceptible to this security concern.</t> | ||||
| <t>Kurtis Gillis <vspace blankLines="0"/> Bell Canada <vspace | <t>If an attacker can forge an IPv6 packet with:</t> | |||
| blankLines="0"/> Halifax <vspace blankLines="0"/> Canada</t> | ||||
| <t>Email: kurtis.gillis@bell.ca</t> | <ul spacing="normal"> | |||
| <li>the source address of a node,</li> | ||||
| <li>a Replication-SID as the DA, and</li> | ||||
| <li>an IPv6 Hop Limit such that nodes that forward replic | ||||
| ated packets on an IPv6 locator | ||||
| unicast prefix, decrement the Hop Limit to zero,</li> | ||||
| </ul> | ||||
| <t>Arvind Venkateswaran <vspace blankLines="0"/> Cisco Systems, Inc. | <t>then these nodes can | |||
| <vspace blankLines="0"/> San Jose <vspace blankLines="0"/> US</t> | cause a storm of ICMPv6 error packets to overwhelm the source node under | |||
| attack. The IPv6 Hop Limit Threshold check described in <xref | ||||
| format="default" target="SRv6"/> can help mitigate such attacks.</t> | ||||
| </section> | ||||
| </middle> | ||||
| <t>Email: arvvenka@cisco.com</t> | <back> | |||
| <displayreference target="I-D.ietf-pim-sr-p2mp-policy" to="P2MP-POLICY"/> | ||||
| <t>Zafar Ali <vspace blankLines="0"/> Cisco Systems, Inc. <vspace | <displayreference target="I-D.filsfils-spring-srv6-net-pgm-illustration" | |||
| blankLines="0"/> US</t> | to="PGM-ILLUSTRATION"/> | |||
| <t>Email: zali@cisco.com</t> | <displayreference target="I-D.ietf-6man-sids" to="SIDS-SRv6"/> | |||
| <t>Swadesh Agrawal <vspace blankLines="0"/> Cisco Systems, Inc. <vspace | <references> | |||
| blankLines="0"/> San Jose <vspace blankLines="0"/> US</t> | <name>References</name> | |||
| <t>Email: swaagraw@cisco.com</t> | <references> | |||
| <name>Normative References</name> | ||||
| <t>Jayant Kotalwar <vspace blankLines="0"/> Nokia <vspace | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2 | |||
| blankLines="0"/> Mountain View <vspace blankLines="0"/> US</t> | 119.xml" | |||
| xmlns:xi="http://www.w3.org/2001/XInclude"/> | ||||
| <t>Email: jayant.kotalwar@nokia.com</t> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8 | |||
| 174.xml" | ||||
| xmlns:xi="http://www.w3.org/2001/XInclude"/> | ||||
| <t>Tanmoy Kundu <vspace blankLines="0"/> Nokia <vspace blankLines="0"/> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8 | |||
| Mountain View <vspace blankLines="0"/> US</t> | 402.xml" | |||
| xmlns:xi="http://www.w3.org/2001/XInclude"/> | ||||
| <t>Email: tanmoy.kundu@nokia.com</t> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8 | |||
| 986.xml" | ||||
| xmlns:xi="http://www.w3.org/2001/XInclude"/> | ||||
| <t>Andrew Stone <vspace blankLines="0"/> Nokia <vspace blankLines="0"/> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4 | |||
| Ottawa <vspace blankLines="0"/> Canada</t> | 443.xml" | |||
| xmlns:xi="http://www.w3.org/2001/XInclude"/> | ||||
| <t>Email: andrew.stone@nokia.com</t> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9 | |||
| 259.xml" | ||||
| xmlns:xi="http://www.w3.org/2001/XInclude"/> | ||||
| <t>Tarek Saad <vspace blankLines="0"/> Cisco Systems Inc.<vspace | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8 | |||
| blankLines="0"/> Canada</t> | 754.xml" | |||
| xmlns:xi="http://www.w3.org/2001/XInclude"/> | ||||
| </references> | ||||
| <t>Email:tsaad@cisco.com</t> | <references> | |||
| <name>Informative References</name> | ||||
| <t>Kamran Raza <vspace blankLines="0"/> Cisco Systems, Inc. <vspace | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6 | |||
| blankLines="0"/> Canada</t> | 513.xml" | |||
| xmlns:xi="http://www.w3.org/2001/XInclude"/> | ||||
| <t>Email:skraza@cisco.com</t> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7 | |||
| 432.xml" | ||||
| xmlns:xi="http://www.w3.org/2001/XInclude"/> | ||||
| <t>Jingrong Xie <vspace blankLines="0"/> Huawei Technologies <vspace | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7 | |||
| blankLines="0"/> Beijing <vspace blankLines="0"/> China</t> | 988.xml" | |||
| xmlns:xi="http://www.w3.org/2001/XInclude"/> | ||||
| <t>Email:xiejingrong@huawei.com</t> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8 | |||
| </section> | 660.xml" | |||
| </middle> | xmlns:xi="http://www.w3.org/2001/XInclude"/> | |||
| <back> | <reference anchor="I-D.ietf-pim-sr-p2mp-policy"> | |||
| <references title="Normative References"> | <front> | |||
| <?rfc include="reference.RFC.2119"?> | <title>Segment Routing Point-to-Multipoint Policy</title> | |||
| <author fullname="Daniel Voyer" initials="D." role="editor" | ||||
| surname="Voyer"> | ||||
| <organization>Bell Canada</organization> | ||||
| </author> | ||||
| <author fullname="Clarence Filsfils" initials="C." | ||||
| surname="Filsfils"> | ||||
| <organization>Cisco Systems, Inc.</organization> | ||||
| </author> | ||||
| <author fullname="Rishabh Parekh" initials="R." surname="Parekh"> | ||||
| <organization>Cisco Systems, Inc.</organization> | ||||
| </author> | ||||
| <author fullname="Hooman Bidgoli" initials="H." surname="Bidgoli"> | ||||
| <organization>Nokia</organization> | ||||
| </author> | ||||
| <author fullname="Zhaohui (Jeffrey) Zhang" initials="Z. J." | ||||
| surname="Zhang"> | ||||
| <organization>Juniper Networks</organization> | ||||
| </author> | ||||
| <date day="11" month="October" year="2023"/> | ||||
| </front> | ||||
| <seriesInfo name="Internet-Draft" value="draft-ietf-pim-sr-p2mp-policy | ||||
| -07"/> | ||||
| </reference> | ||||
| <?rfc include="reference.RFC.8174"?> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9 | |||
| 350.xml" | ||||
| xmlns:xi="http://www.w3.org/2001/XInclude"/> | ||||
| <?rfc include="reference.RFC.8402"?> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9 | |||
| 256.xml" | ||||
| xmlns:xi="http://www.w3.org/2001/XInclude"/> | ||||
| <?rfc include="reference.RFC.8986"?> | <reference anchor="I-D.filsfils-spring-srv6-net-pgm-illustration"> | |||
| <front> | ||||
| <title>Illustrations for SRv6 Network Programming</title> | ||||
| <author fullname="Clarence Filsfils" initials="C." | ||||
| surname="Filsfils"> | ||||
| <organization>Cisco Systems, Inc.</organization> | ||||
| </author> | ||||
| <author fullname="Pablo Camarillo" initials="P." role="editor" | ||||
| surname="Camarillo"> | ||||
| <organization>Cisco Systems, Inc.</organization> | ||||
| </author> | ||||
| <author fullname="Zhenbin Li" initials="Z." surname="Li"> | ||||
| <organization>Huawei Technologies</organization> | ||||
| </author> | ||||
| <author fullname="Satoru Matsushima" initials="S." | ||||
| surname="Matsushima"> | ||||
| <organization>SoftBank</organization> | ||||
| </author> | ||||
| <author fullname="Bruno Decraene" initials="B." surname="Decraene"> | ||||
| <organization>Orange</organization> | ||||
| </author> | ||||
| <author fullname="Dirk Steinberg" initials="D." | ||||
| surname="Steinberg"> | ||||
| <organization>Lapishills Consulting Limited</organization> | ||||
| </author> | ||||
| <author fullname="David Lebrun" initials="D." surname="Lebrun"> | ||||
| <organization>Google</organization> | ||||
| </author> | ||||
| <author fullname="Robert Raszuk" initials="R." surname="Raszuk"> | ||||
| <organization>Bloomberg LP</organization> | ||||
| </author> | ||||
| <author fullname="John Leddy" initials="J." surname="Leddy"> | ||||
| <organization>Individual Contributor</organization> | ||||
| </author> | ||||
| <date day="30" month="March" year="2021"/> | ||||
| </front> | ||||
| <seriesInfo name="Internet-Draft" | ||||
| value="draft-filsfils-spring-srv6-net-pgm-illustration-04" | ||||
| /> | ||||
| </reference> | ||||
| <?rfc include='reference.RFC.4443'?> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3 | |||
| 704.xml" | ||||
| xmlns:xi="http://www.w3.org/2001/XInclude"/> | ||||
| <?rfc include='reference.RFC.9259'?> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2 | |||
| 827.xml" | ||||
| xmlns:xi="http://www.w3.org/2001/XInclude"/> | ||||
| <?rfc include='reference.RFC.8754'?> | <xi:include href="https://datatracker.ietf.org/doc/bibxml3/reference.I-D | |||
| .ietf-6man-sids.xml" | ||||
| xmlns:xi="http://www.w3.org/2001/XInclude"/> | ||||
| </references> | ||||
| </references> | </references> | |||
| <references title="Informative References"> | <section anchor="Appendix" numbered="true" toc="default"> | |||
| <?rfc include="reference.RFC.6513"?> | <name>Illustration of a Replication Segment</name> | |||
| <?rfc include="reference.RFC.7432"?> | ||||
| <?rfc include="reference.RFC.7988"?> | ||||
| <?rfc include="reference.RFC.7942"?> | ||||
| <?rfc include="reference.RFC.8660"?> | ||||
| <?rfc include='reference.I-D.ietf-pim-sr-p2mp-policy'?> | ||||
| <?rfc include='reference.RFC.9350'?> | ||||
| <?rfc include="reference.RFC.9256"?> | ||||
| <?rfc include='reference.I-D.filsfils-spring-srv6-net-pgm-illustration'?> | ||||
| <?rfc include="reference.RFC.3704"?> | ||||
| <?rfc include="reference.RFC.2827"?> | ||||
| <?rfc include="reference.I-D.ietf-6man-sids"?> | ||||
| </references> | ||||
| <section title="Illustration of a Replication Segment"> | ||||
| <t>This section illustrates an example of a single Replication segment. | <t>This section illustrates an example of a single Replication segment. | |||
| Examples showing Replication segment stitched together to form P2MP tree | Examples showing Replication segments stitched together to form a P2MP | |||
| (based on SR P2MP policy) are in <xref | tree (based on SR P2MP policy) are in <xref format="default" | |||
| target="I-D.ietf-pim-sr-p2mp-policy"/>.</t> | target="I-D.ietf-pim-sr-p2mp-policy"/>.</t> | |||
| <t>Consider the following topology:</t> | <t>Consider the following topology:</t> | |||
| <figure title="Topology for illustration of Replication Segment"> | <figure> | |||
| <artwork><![CDATA[ R3------R6 | <name>Topology for Illustration of a Replication Segment</name> | |||
| <artwork align="left" alt="" name="" type=""><![CDATA[ | ||||
| R3------R6 | ||||
| / \ | / \ | |||
| R1----R2----R5-----R7 | R1----R2----R5-----R7 | |||
| \ / | \ / | |||
| +--R4---+ ]]></artwork> | +--R4---+ | |||
| ]]></artwork> | ||||
| </figure> | </figure> | |||
| <section title="SR-MPLS"> | <section numbered="true" toc="default"> | |||
| <t>In this example, the Node-SID of a node Rn is N-SIDn and | <name>SR-MPLS</name> | |||
| Adjacency-SID from node Rm to node Rn is A-SIDmn. Interface between Rm | ||||
| and Rn is Lmn. The state representation uses "R-SID->Lmn" to | <t>In this example, the Node-SID of a node Rn is N-SIDn and the | |||
| represent a packet replication with outgoing replication SID R-SID | Adj-SID from node Rm to node Rn is A-SIDmn. The interface | |||
| sent on interface Lmn.</t> | between Rm and Rn is Lmn. The state representation uses | |||
| "R-SID->Lmn" to represent a packet replication with outgoing | ||||
| Replication-SID R-SID sent on interface Lmn.</t> | ||||
| <t>Assume a Replication segment identified with R-ID at Replication | <t>Assume a Replication segment identified with R-ID at Replication | |||
| node R1 and downstream nodes R2, R6 and R7. The Replication SID at | node R1 and downstream nodes R2, R6, and R7. The Replication-SID at | |||
| node n is R-SIDn. A packet replicated from R1 to R7 has to traverse | node n is R-SIDn. A packet replicated from R1 to R7 has to traverse | |||
| R4.</t> | R4.</t> | |||
| <t>The Replication segment state at nodes R1, R2, R6 and R7 is shown | <t>The Replication segments at nodes R1, R2, R6, and R7 are shown | |||
| below. Note nodes R3, R4 and R5 do not have state for the Replication | below. Note nodes R3, R4, and R5 do not have a Replication | |||
| segment.</t> | segment.</t> | |||
| <t>Replication segment at R1:</t> | <t>Replication segment at R1:</t> | |||
| <figure> | <sourcecode name="" type="pseudocode">Replication segment | |||
| <artwork><![CDATA[Replication segment <R-ID,R1>: | <R-ID,R1>: Replication-SID: R-SID1 Replication state: R2: | |||
| Replication SID: R-SID1 | <R-SID2->L12> R6: <N-SID6, R-SID6> R7: <N-SID4, | |||
| Replication state: | A-SID47, R-SID7></sourcecode> | |||
| R2: <R-SID2->L12> | ||||
| R6: <N-SID6, R-SID6> | ||||
| R7: <N-SID4, A-SID47, R-SID7> | ||||
| ]]></artwork> | ||||
| </figure> | ||||
| <t>Replication to R2 steers the packet directly to R2 on interface | <t>Replication to R2 steers the packet directly to R2 on interface | |||
| L12. Replication to R6, using N-SID6, steers the packet via shortest | L12. Replication to R6, using N-SID6, steers the packet via the | |||
| path to that node. Replication to R7 is steered via R4, using N-SID4 | shortest path to that node. Replication to R7 is steered via R4, using | |||
| and then adjacency SID A-SID47 to R7.</t> | N-SID4 and then adjacency SID A-SID47 to R7.</t> | |||
| <t>Replication segment at R2:</t> | <t>Replication segment at R2:</t> | |||
| <figure> | <sourcecode name="" type="pseudocode">Replication segment | |||
| <artwork><![CDATA[Replication segment <R-ID,R2>: | <R-ID,R2>: Replication-SID: R-SID2 Replication state: R2: | |||
| Replication SID: R-SID2 | <Leaf></sourcecode> | |||
| Replication state: | ||||
| R2: <Leaf>]]></artwork> | ||||
| </figure> | ||||
| <t>Replication segment at R6:</t> | <t>Replication segment at R6:</t> | |||
| <figure> | <sourcecode name="" type="pseudocode">Replication segment | |||
| <artwork><![CDATA[Replication segment <R-ID,R6>: | <R-ID,R6>: Replication-SID: R-SID6 Replication state: R6: | |||
| Replication SID: R-SID6 | <Leaf></sourcecode> | |||
| Replication state: | ||||
| R6: <Leaf>]]></artwork> | ||||
| </figure> | ||||
| <t>Replication segment at R7:</t> | <t>Replication segment at R7:</t> | |||
| <figure> | <sourcecode name="" type="pseudocode">Replication segment | |||
| <artwork><![CDATA[Replication segment <R-ID,R7>: | <R-ID,R7>: Replication-SID: R-SID7 Replication state: R7: | |||
| Replication SID: R-SID7 | <Leaf></sourcecode> | |||
| Replication state: | ||||
| R7: <Leaf>]]></artwork> | ||||
| </figure> | ||||
| <t>When a packet is steered into the Replication segment at R1:</t> | <t>When a packet is steered into the Replication segment at R1:</t> | |||
| <t><list style="symbols"> | <ul spacing="normal"> | |||
| <t>Since R1 is directly connected to R2, R1 performs PUSH | <li>R1 performs the PUSH operation with just the <R-SID2> | |||
| operation with just <R-SID2> label for the replicated copy | label for the replicated copy and sends it to R2 on interface L12, | |||
| and sends it to R2 on interface L12. R2, as Leaf, performs NEXT | since R1 is directly connected to R2. R2, as leaf, performs the NEXT | |||
| operation, pops R-SID2 label and delivers the payload.</t> | operation, pops the R-SID2 label, and delivers the payload.</li> | |||
| <t>R1 performs PUSH operation with <N-SID6, R-SID6> label | <li>R1 performs the PUSH operation with the <N-SID6, R-SID6> | |||
| stack for the replicated copy to R6 and sends it to R2, the | label stack for the replicated copy to R6 and sends it to R2, which | |||
| nexthop on shortest path to R6. R2 performs CONTINUE operation on | is the nexthop on the shortest path to R6. R2 performs the CONTINUE | |||
| N-SID6 and forwards it to R3. R3 is the penultimate hop for | operation on N-SID6 and forwards it to R3. R3 is the penultimate hop | |||
| N-SID6; it performs penultimate hop popping, which corresponds to | for N-SID6; it performs penultimate hop popping, which corresponds | |||
| the NEXT operation and the packet is then sent to R6 with | to the NEXT operation. The packet is then sent to R6 with | |||
| <R-SID6> in the label stack. R6, as Leaf, performs NEXT | <R-SID6> in the label stack. R6, as leaf, performs the NEXT | |||
| operation, pops R-SID6 label and delivers the payload.</t> | operation, pops the R-SID6 label, and delivers the payload.</li> | |||
| <t>R1 performs PUSH operation with <N-SID4, A-SID47, R-SID7> | <li>R1 performs the PUSH operation with the <N-SID4, A-SID47, | |||
| label stack for the replicated copy to R7 and sends it to R2, the | R-SID7> label stack for the replicated copy to R7 and sends it to | |||
| nexthop on shortest path to R4. R2 is the penultimate hop for | R2, which is the nexthop on the shortest path to R4. R2 is the | |||
| N-SID4; it performs penultimate hop popping, which corresponds to | penultimate hop for N-SID4; it performs penultimate hop popping, | |||
| the NEXT operation and the packet is then sent to R4 with | which corresponds to the NEXT operation. The packet is then sent to | |||
| <A-SID47, R-SID1> in the label stack. R4 performs NEXT | R4 with <A-SID47, R-SID1> in the label stack. R4 performs the | |||
| operation, pops A-SID47, and delivers packet to R7 with | NEXT operation, pops A-SID47, and delivers the packet to R7 with | |||
| <R-SID7> in the label stack. R7, as Leaf, performs NEXT | <R-SID7> in the label stack. R7, as leaf, performs the NEXT | |||
| operation, pops R-SID7 label and delivers the payload.</t> | operation, pops the R-SID7 label, and delivers the payload.</li> | |||
| </list></t> | </ul> | |||
| </section> | </section> | |||
| <section title="SRv6"> | <section numbered="true" toc="default"> | |||
| <t>For SRv6 , we use SID allocation scheme, reproduced below, from | <name>SRv6</name> | |||
| Illustrations for SRv6 Network Programming <xref | ||||
| target="I-D.filsfils-spring-srv6-net-pgm-illustration"/></t> | ||||
| <t><list style="symbols"> | <t>For SRv6, we use the SID allocation scheme, reproduced below, from | |||
| <t>2001:db8::/32 is an IPv6 block allocated by a Regional Internet | "Illustrations for SRv6 Network Programming" <xref format="default" | |||
| Registry (RIR) to the operator</t> | target="I-D.filsfils-spring-srv6-net-pgm-illustration"/>:</t> | |||
| <t>2001:db8:0::/48 is dedicated to the internal address space</t> | <ul spacing="normal"> | |||
| <li>2001:db8::/32 is an IPv6 block allocated by a Regional Internet | ||||
| Registry (RIR) to the operator.</li> | ||||
| <t>2001:db8:cccc::/48 is dedicated to the internal SRv6 SID | <li>2001:db8:0::/48 is dedicated to the internal address space.</li> | |||
| space</t> | ||||
| <t>We assume a location expressed in 64 bits and a function | <li>2001:db8:cccc::/48 is dedicated to the internal SRv6 SID | |||
| expressed in 16 bits</t> | space.</li> | |||
| <t>Node k has a classic IPv6 loopback address 2001:db8::k/128 | <li>We assume a location expressed in 64 bits and a function | |||
| which is advertised in the Interior Gateway Protocol (IGP)</t> | expressed in 16 bits.</li> | |||
| <t>Node k has 2001:db8:cccc:k::/64 for its local SID space. Its | <li>Node k has a classic IPv6 loopback address 2001:db8::k/128, | |||
| SIDs will be explicitly assigned from that block</t> | which is advertised in the Interior Gateway Protocol (IGP).</li> | |||
| <t>Node k advertises 2001:db8:cccc:k::/64 in its IGP</t> | <li>Node k has 2001:db8:cccc:k::/64 for its local SID space. Its | |||
| SIDs will be explicitly assigned from that block.</li> | ||||
| <t>Function :1:: (function 1, for short) represents the End | <li>Node k advertises 2001:db8:cccc:k::/64 in its IGP.</li> | |||
| function with Penultimate Segment Pop of SRH (PSP) <xref | ||||
| target="RFC8986"/> and USD support</t> | ||||
| <t>Function :Cn:: (function Cn, for short) represents the End.X | <li>Function :1:: (function 1, for short) represents the End | |||
| function from to Node n with PSP and USD support</t> | function with the Penultimate Segment Pop (PSP) of the SRH <xref | |||
| </list></t> | format="default" target="RFC8986"/> and USD support.</li> | |||
| <t>Each node k has: <list style="symbols"> | <li>Function :Cn:: (function Cn, for short) represents the End.X | |||
| <t>An explicit SID instantiation 2001:db8:cccc:k:1::/128 bound to | function from to Node n with PSP and USD support.</li> | |||
| an End function with additional support for PSP and USD</t> | </ul> | |||
| <t>An explicit SID instantiation 2001:db8:cccc:k:Cj::/128 bound to | <t>Each node k has:</t> | |||
| an End.X function to neighbor J with additional support for PSP | ||||
| and USD</t> | ||||
| <t>An explicit SID instantiation 2001:db8:cccc:k:Fk::/128 bound to | <ul spacing="normal"> | |||
| an End.Replicate function</t> | <li>An explicit SID instantiation 2001:db8:cccc:k:1::/128 bound to | |||
| </list></t> | an End function with additional support for PSP and USD.</li> | |||
| <li>An explicit SID instantiation 2001:db8:cccc:k:Cj::/128 bound to | ||||
| an End.X function to neighbor J with additional support for PSP and | ||||
| USD.</li> | ||||
| <li>An explicit SID instantiation 2001:db8:cccc:k:Fk::/128 bound to | ||||
| an End.Replicate function.</li> | ||||
| </ul> | ||||
| <t>Assume a Replication segment identified with R-ID at Replication | <t>Assume a Replication segment identified with R-ID at Replication | |||
| node R1 and downstream nodes R2, R6 and R7. The Replication SID at | node R1 and downstream nodes R2, R6, and R7. The Replication-SID at | |||
| node k, bound to an End.Replicate function, is | node k, bound to an End.Replicate function, is | |||
| 2001:db8:cccc:k:Fk::/128. A packet replicated from R1 to R7 has to | 2001:db8:cccc:k:Fk::/128. A packet replicated from R1 to R7 has to | |||
| traverse R4.</t> | traverse R4.</t> | |||
| <t>The Replication segment state at nodes R1, R2, R6 and R7 is shown | <t>The Replication segments at nodes R1, R2, R6, and R7 are shown | |||
| below. Note nodes R3, R4 and R5 do not have state for the Replication | below. Note nodes R3, R4, and R5 do not have a Replication | |||
| segment. The state representation uses "R-SID->Lmn" to represent a | segment. The state representation uses "R-SID->Lmn" to represent a | |||
| packet replication with outgoing replication SID R-SID sent on | packet replication with outgoing Replication-SID R-SID sent on | |||
| interface Lmn. "SL" represents and optional segment list used to steer | interface Lmn. "SL" represents an optional segment list used to steer | |||
| a replicated packet on a specific path to a Downstream node.</t> | a replicated packet on a specific path to a downstream node.</t> | |||
| <t>Replication segment at R1:</t> | <t>Replication segment at R1:</t> | |||
| <figure> | <sourcecode name="" type="pseudocode">Replication segment | |||
| <artwork><![CDATA[Replication segment <R-ID,R1>: | <R-ID,R1>: Replication-SID: 2001:db8:cccc:1:F1::0 Replication | |||
| Replication SID: 2001:db8:cccc:1:F1::0 | state: R2: <2001:db8:cccc:2:F2::0->L12> R6: | |||
| Replication state: | <2001:db8:cccc:6:F6::0> R7: <2001:db8:cccc:4:C7::0>, SL: | |||
| R2: <2001:db8:cccc:2:F2::0->L12> | <2001:db8:cccc:7:F7::0></sourcecode> | |||
| R6: <2001:db8:cccc:6:F6::0> | ||||
| R7: <2001:db8:cccc:4:C7::0>, SL: <2001:db8:cccc:7:F7::0> | ||||
| ]]></artwork> | ||||
| </figure> | ||||
| <t>Replication to R2 steers the packet directly to R2 on interface | <t>Replication to R2 steers the packet directly to R2 on interface | |||
| L12. Replication to R6, using 2001:db8:cccc:6:F6::0, steers the packet | L12. Replication to R6, using 2001:db8:cccc:6:F6::0, steers the packet | |||
| via shortest path to that node. Replication to R7 is steered via R4, | via the shortest path to that node. Replication to R7 is steered via | |||
| using H.Encaps.Red with End.X SID 2001:db8:cccc:4:C7::0 at R4 to | R4, using H.Encaps.Red with End.X SID 2001:db8:cccc:4:C7::0 at R4 to | |||
| R7.</t> | R7.</t> | |||
| <t>Replication segment at R2:</t> | <t>Replication segment at R2:</t> | |||
| <figure> | <sourcecode name="" type="pseudocode">Replication segment | |||
| <artwork><![CDATA[Replication segment <R-ID,R2>: | <R-ID,R2>: Replication-SID: 2001:db8:cccc:2:F2::0 Replication | |||
| Replication SID: 2001:db8:cccc:2:F2::0 | state: R2: <Leaf></sourcecode> | |||
| Replication state: | ||||
| R2: <Leaf>]]></artwork> | ||||
| </figure> | ||||
| <t>Replication segment at R6:</t> | <t>Replication segment at R6:</t> | |||
| <figure> | <sourcecode name="" type="pseudocode">Replication segment | |||
| <artwork><![CDATA[Replication segment <R-ID,R6>: | <R-ID,R6>: Replication-SID: 2001:db8:cccc:6:F6::0 Replication | |||
| Replication SID: 2001:db8:cccc:6:F6::0 | state: R6: <Leaf></sourcecode> | |||
| Replication state: | ||||
| R6: <Leaf>]]></artwork> | ||||
| </figure> | ||||
| <t>Replication segment at R7:</t> | <t>Replication segment at R7:</t> | |||
| <figure> | <sourcecode name="" type="pseudocode">Replication segment | |||
| <artwork><![CDATA[Replication segment <R-ID,R7>: | <R-ID,R7>: Replication-SID: 2001:db8:cccc:7:F7::0 Replication | |||
| Replication SID: 2001:db8:cccc:7:F7::0 | state: R7: <Leaf></sourcecode> | |||
| Replication state: | ||||
| R7: <Leaf>]]></artwork> | ||||
| </figure> | ||||
| <t>When a packet, (A,B2), is steered into the Replication segment at | <t>When a packet, (A,B2), is steered into the Replication segment at | |||
| R1:</t> | R1:</t> | |||
| <t><list style="symbols"> | <ul spacing="normal"> | |||
| <t>Since R1 is directly connected to R2, R1 creates encapsulated | <li>R1 creates an encapsulated replicated copy (2001:db8::1, | |||
| replicated copy (2001:db8::1, 2001:db8:cccc:2:F2::0) (A, B2), and | 2001:db8:cccc:2:F2::0) (A, B2), and sends it to R2 on interface L12, | |||
| sends it to R2 on interface L12. R2, as Leaf, removes outer IPv6 | since R1 is directly connected to R2. R2, as leaf, removes the outer | |||
| header and delivers the payload.</t> | IPv6 header and delivers the payload.</li> | |||
| <t>R1 creates encapsulated replicated copy (2001:db8::1, | <li>R1 creates an encapsulated replicated copy (2001:db8::1, | |||
| 2001:db8:cccc:6:F6::0) (A, B2) then forwards the resulting packet | 2001:db8:cccc:6:F6::0) (A, B2) then forwards the resulting packet on | |||
| on the shortest path to 2001:db8:cccc:6::/64. R2 and R3 forward | the shortest path to 2001:db8:cccc:6::/64. R2 and R3 forward the | |||
| the packet using 2001:db8:cccc:6::/64. R6, as Leaf, removes outer | packet using 2001:db8:cccc:6::/64. R6, as leaf, removes the outer | |||
| IPv6 header and delivers the payload.</t> | IPv6 header and delivers the payload.</li> | |||
| <t>R1 has to steer packet to Downstream node R7 via node R4. It | <li> | |||
| can do this in one of two ways:<list style="symbols"> | <t>R1 has to steer the packet to downstream node R7 via node R4. | |||
| <t>R1 creates encapsulated replicated copy (2001:db8::1, | It can do this in one of two ways:</t> | |||
| 2001:db8:cccc:7:F7::0) (A, B2) and then performs H.Encaps.Red | ||||
| using the SL to create (2001:db8::1, 2001:db8:cccc:4:C7::0) | ||||
| (2001:db8::1, 2001:db8:cccc:7:F7::0) (A, B2) packet. It sends | ||||
| this packet to R2, the nexthop on shortest path to | ||||
| 2001:db8:cccc:4::/64. R2 forwards packet to R4 using | ||||
| 2001:db8:cccc:4::/64. R4 executes End.X function on | ||||
| 2001:db8:cccc:4:C7::0, performs USD action, removes outer IPv6 | ||||
| encapsulation and sends resulting packet (2001:db8::1, | ||||
| 2001:db8:cccc:7:F7::0) (A, B2) to R7. R7, as Leaf, removes | ||||
| outer IPv6 header and delivers the payload.</t> | ||||
| <t>R1 is Root of replication segment. Therefore, it can | <ul spacing="normal"> | |||
| combine above encapsulations to create encapsulated replicated | <li>R1 creates an encapsulated replicated copy (2001:db8::1, | |||
| copy (2001:db8::1, 2001:db8:cccc:4:C7::0) | 2001:db8:cccc:7:F7::0) (A, B2) and then performs H.Encaps.Red | |||
| (2001:db8:cccc:7:F7::0; SL=1) (A, B2) and sends it to R2, the | using the SL to create the (2001:db8::1, 2001:db8:cccc:4:C7::0) | |||
| nexthop on shortest path to 2001:db8:cccc:4::/64. R2 forwards | (2001:db8::1, 2001:db8:cccc:7:F7::0) (A, B2) packet. It sends | |||
| packet to R4 using 2001:db8:cccc:4::/64. R4 executes End.X | this packet to R2, which is the nexthop on the shortest path to | |||
| function on 2001:db8:cccc:4:C7::0, performs PSP action, | 2001:db8:cccc:4::/64. R2 forwards the packet to R4 using | |||
| removes SRH and sends resulting packet (2001:db8::1, | 2001:db8:cccc:4::/64. R4 executes the End.X function on | |||
| 2001:db8:cccc:7:F7::0) (A, B2) to R7. R7, as Leaf, removes | 2001:db8:cccc:4:C7::0, performs a USD action, removes the outer | |||
| outer IPv6 header and delivers the payload.</t> | IPv6 encapsulation, and sends the resulting packet (2001:db8::1, | |||
| </list></t> | 2001:db8:cccc:7:F7::0) (A, B2) to R7. R7, as leaf, removes the | |||
| </list></t> | outer IPv6 header and delivers the payload.</li> | |||
| <section title="Pinging Replication SID"> | <li>R1 is the root of the Replication segment. Therefore, it can | |||
| <t>This section illustrates ping of a Replication SID.</t> | combine above encapsulations to create an encapsulated | |||
| replicated copy (2001:db8::1, 2001:db8:cccc:4:C7::0) | ||||
| (2001:db8:cccc:7:F7::0; SL=1) (A, B2) and sends it to R2, which | ||||
| is the nexthop on the shortest path to 2001:db8:cccc:4::/64. R2 | ||||
| forwards the packet to R4 using 2001:db8:cccc:4::/64. R4 | ||||
| executes the End.X function on 2001:db8:cccc:4:C7::0, performs a | ||||
| PSP action, removes the SRH, and sends the resulting packet | ||||
| (2001:db8::1, 2001:db8:cccc:7:F7::0) (A, B2) to R7. R7, as leaf, | ||||
| removes the outer IPv6 header and delivers the payload.</li> | ||||
| </ul> | ||||
| </li> | ||||
| </ul> | ||||
| <t>Node R1 pings replication SID of node R6 directly by sending the | <section anchor="A.2.1" numbered="true" toc="default"> | |||
| following packet:</t> | <name>Pinging a Replication-SID</name> | |||
| <t><list style="numbers"> | <t>This section illustrates the ping of a Replication-SID.</t> | |||
| <t>R1 to R6: (2001:db8::1, 2001:db8:cccc:6:F6::0; NH=ICMPv6) | ||||
| (ICMPv6 Echo Request)</t> | ||||
| <t>Node R6 as a Leaf processes upper layer ICMPv6 Echo Request | <t>Node R1 pings the Replication-SID of node R6 directly by sending | |||
| and responds with ICMPv6 Echo Reply</t> | the following packet:</t> | |||
| </list></t> | ||||
| <t>Node R1 pings Replication SID of R7 via R4 by sending the | <ol spacing="normal" type="1"> | |||
| following packet with SRH:</t> | <li>R1 to R6: (2001:db8::1, 2001:db8:cccc:6:F6::0; NH=ICMPv6) | |||
| (ICMPv6 Echo Request).</li> | ||||
| <t><list style="numbers"> | <li>Node R6 as a leaf processes the upper-layer ICMPv6 Echo | |||
| <t>R1 to R4: (2001:db8::1, 2001:db8:cccc:4:C7::0) | Request and responds with an ICMPv6 Echo Reply.</li> | |||
| (2001:db8:cccc:7:F7::0; SL=1; NH=ICMPV6) (ICMPv6 Echo | </ol> | |||
| Request)</t> | ||||
| <t>R4 to R7: (2001:db8::1, 2001:db8:cccc:7:F7::0; NH=ICMPv6) | <t>Node R1 pings the Replication-SID of R7 via R4 by sending the | |||
| (ICMPv6 Echo Request)</t> | following packet with the SRH:</t> | |||
| <t>Node R7 as a Leaf processes upper layer ICMPv6 Echo Request | <ol spacing="normal" type="1"> | |||
| and responds with ICMPv6 Echo Reply</t> | <li>R1 to R4: (2001:db8::1, 2001:db8:cccc:4:C7::0) | |||
| </list></t> | (2001:db8:cccc:7:F7::0; SL=1; NH=ICMPV6) (ICMPv6 Echo | |||
| Request).</li> | ||||
| <t>Assume node R4 is a transit Replication node with Replication SID | <li>R4 to R7: (2001:db8::1, 2001:db8:cccc:7:F7::0; NH=ICMPv6) | |||
| 2001:db8:cccc:4:F4::0 replicating to R7. Node R1 pings Replication | (ICMPv6 Echo Request).</li> | |||
| SID of R7 via Replication SID of R4 as follows:</t> | ||||
| <t><list style="numbers"> | <li>Node R7 as a leaf processes the upper-layer ICMPv6 Echo | |||
| <t>R1 to R4: (2001:db8::1, 2001:db8:cccc:4:F4::0; NH=ICMPv6) | Request and responds with an ICMPv6 Echo Reply.</li> | |||
| (ICMPv6 Echo Request)</t> | </ol> | |||
| <t>R4 replicates to R7 by replacing IPv6 destination address | <t>Assume node R4 is a transit replication node with Replication-SID | |||
| with Replication SID of R7 from its Replication state</t> | 2001:db8:cccc:4:F4::0 replicating to R7. Node R1 pings the | |||
| Replication-SID of R7 via the Replication-SID of R4 as follows:</t> | ||||
| <t>R4 to R7: (2001:db8::1, 2001:db8:cccc:7:F7::0; NH=ICMPv6) | <ol spacing="normal" type="1"> | |||
| (ICMPv6 Echo Request)</t> | <li>R1 to R4: (2001:db8::1, 2001:db8:cccc:4:F4::0; NH=ICMPv6) | |||
| (ICMPv6 Echo Request).</li> | ||||
| <t>Node R7 as a Leaf processes upper layer ICMPv6 Echo Request | <li>R4 replicates to R7 by replacing the IPv6 DA | |||
| and responds with ICMPv6 Echo Reply</t> | with the Replication-SID of R7 from its Replication state.</li> | |||
| </list></t> | ||||
| <li>R4 to R7: (2001:db8::1, 2001:db8:cccc:7:F7::0; NH=ICMPv6) | ||||
| (ICMPv6 Echo Request).</li> | ||||
| <li>Node R7 as a leaf processes the upper-layer ICMPv6 Echo | ||||
| Request and responds with an ICMPv6 Echo Reply.</li> | ||||
| </ol> | ||||
| </section> | </section> | |||
| </section> | </section> | |||
| </section> | </section> | |||
| <section anchor="Acknowledgements" numbered="false" toc="default"> | ||||
| <name>Acknowledgements</name> | ||||
| <t>The authors would like to acknowledge <contact | ||||
| fullname="Siva Sivabalan"/>, <contact fullname="Mike Koldychev"/>, | ||||
| <contact fullname="Vishnu Pavan Beeram"/>, <contact | ||||
| fullname="Alexander Vainshtein"/>, <contact | ||||
| fullname="Bruno Decraene"/>, <contact fullname="Thierry Couture"/>, | ||||
| <contact fullname="Joel Halpern"/>, <contact | ||||
| fullname="Ketan Talaulikar"/>, <contact fullname="Darren Dukes"/> | ||||
| and <contact fullname="Jingrong Xie"/> for their valuable inputs.</t> | ||||
| </section> | ||||
| <section numbered="false" toc="default"> | ||||
| <name>Contributors</name> | ||||
| <contact fullname="Clayton Hassen"> | ||||
| <organization>Bell Canada</organization> | ||||
| <address> | ||||
| <postal> | ||||
| <city>Vancouver</city> | ||||
| <country>Canada</country> | ||||
| </postal> | ||||
| <email>clayton.hassen@bell.ca</email> | ||||
| </address> | ||||
| </contact> | ||||
| <contact fullname="Kurtis Gillis"> | ||||
| <organization>Bell Canada</organization> | ||||
| <address> | ||||
| <postal> | ||||
| <city>Halifax</city> | ||||
| <country>Canada</country> | ||||
| </postal> | ||||
| <email>kurtis.gillis@bell.ca</email> | ||||
| </address> | ||||
| </contact> | ||||
| <contact fullname="Arvind Venkateswaran"> | ||||
| <organization>Cisco Systems, Inc.</organization> | ||||
| <address> | ||||
| <postal> | ||||
| <city>San Jose</city> | ||||
| <region>CA</region> | ||||
| <country>United States of America</country> | ||||
| </postal> | ||||
| <email>arvvenka@cisco.com</email> | ||||
| </address> | ||||
| </contact> | ||||
| <contact fullname="Zafar Ali"> | ||||
| <organization>Cisco Systems, Inc.</organization> | ||||
| <address> | ||||
| <postal> | ||||
| <country>United States of America</country> | ||||
| </postal> | ||||
| <email>zali@cisco.com</email> | ||||
| </address> | ||||
| </contact> | ||||
| <contact fullname="Swadesh Agrawal"> | ||||
| <organization>Cisco Systems, Inc.</organization> | ||||
| <address> | ||||
| <postal> | ||||
| <city>San Jose</city> | ||||
| <region>CA</region> | ||||
| <country>United States of America</country> | ||||
| </postal> | ||||
| <email>swaagraw@cisco.com</email> | ||||
| </address> | ||||
| </contact> | ||||
| <contact fullname="Jayant Kotalwar"> | ||||
| <organization>Nokia</organization> | ||||
| <address> | ||||
| <postal> | ||||
| <city>Mountain View</city> | ||||
| <region>CA</region> | ||||
| <country>United States of America</country> | ||||
| </postal> | ||||
| <email>jayant.kotalwar@nokia.com</email> | ||||
| </address> | ||||
| </contact> | ||||
| <contact fullname="Tanmoy Kundu"> | ||||
| <organization>Nokia</organization> | ||||
| <address> | ||||
| <postal> | ||||
| <city>Mountain View</city> | ||||
| <region>CA</region> | ||||
| <country>United States of America</country> | ||||
| </postal> | ||||
| <email>tanmoy.kundu@nokia.com</email> | ||||
| </address> | ||||
| </contact> | ||||
| <contact fullname="Andrew Stone"> | ||||
| <organization>Nokia</organization> | ||||
| <address> | ||||
| <postal> | ||||
| <city>Ottawa</city> | ||||
| <country>Canada</country> | ||||
| </postal> | ||||
| <email>andrew.stone@nokia.com</email> | ||||
| </address> | ||||
| </contact> | ||||
| <contact fullname="Tarek Saad"> | ||||
| <organization>Cisco Systems, Inc.</organization> | ||||
| <address> | ||||
| <postal> | ||||
| <country>Canada</country> | ||||
| </postal> | ||||
| <email>tsaad@cisco.com</email> | ||||
| </address> | ||||
| </contact> | ||||
| <contact fullname="Kamran Raza"> | ||||
| <organization>Cisco Systems, Inc.</organization> | ||||
| <address> | ||||
| <postal> | ||||
| <country>Canada</country> | ||||
| </postal> | ||||
| <email>skraza@cisco.com</email> | ||||
| </address> | ||||
| </contact> | ||||
| <contact fullname="Jingrong Xie"> | ||||
| <organization>Huawei Technologies</organization> | ||||
| <address> | ||||
| <postal> | ||||
| <city>Beijing</city> | ||||
| <country>China</country> | ||||
| </postal> | ||||
| <email>xiejingrong@huawei.com</email> | ||||
| </address> | ||||
| </contact> | ||||
| </section> | ||||
| </back> | </back> | |||
| </rfc> | </rfc> | |||
| End of changes. 223 change blocks. | ||||
| 865 lines changed or deleted | 1092 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. | ||||