<?xml version="1.0" encoding="US-ASCII"?>
<!DOCTYPE rfc SYSTEM "rfc2629.dtd">
<?rfc toc="yes"?>
<?rfc tocompact="yes"?>
<?rfc tocdepth="3"?>
<?rfc tocindent="yes"?>
<?rfc symrefs="yes"?>
<?rfc sortrefs="yes"?>
<?rfc comments="yes"?>
<?rfc inline="yes"?>
<?rfc compact="yes"?>
<?rfc subcompact="no"?>
<rfc category="std" docName="draft-ietf-pim-sr-p2mp-policy-16"
     ipr="trust200902">
  <front>
    <title abbrev="SR P2MP Policy">Segment Routing Point-to-Multipoint
    Policy</title>

    <author fullname="Rishabh Parekh (editor)" initials="R."
            surname="Parekh, Ed.">
      <organization>Arrcus</organization>

      <address>
        <postal>
          <street/>

          <city>San Jose</city>

          <region/>

          <code/>

          <country>US</country>
        </postal>

        <phone/>

        <facsimile/>

        <email>rishabh@arrcus.com</email>

        <uri/>
      </address>
    </author>

    <author fullname="Daniel Voyer (editor)" initials="D."
            surname="Voyer, Ed.">
      <organization>Cisco Systems, Inc.</organization>

      <address>
        <postal>
          <street/>

          <city>Montreal</city>

          <region/>

          <code/>

          <country>CA</country>
        </postal>

        <phone/>

        <facsimile/>

        <email>davoyer@cisco.com</email>

        <uri/>
      </address>
    </author>

    <author fullname="Clarence Filsfils" initials="C." surname="Filsfils">
      <organization>Cisco Systems, Inc.</organization>

      <address>
        <postal>
          <street/>

          <city>Brussels</city>

          <region/>

          <code/>

          <country>BE</country>
        </postal>

        <phone/>

        <facsimile/>

        <email>cfilsfil@cisco.com</email>

        <uri/>
      </address>
    </author>

    <author fullname="Hooman Bidgoli" initials="H." surname="Bidgoli">
      <organization>Nokia</organization>

      <address>
        <postal>
          <street/>

          <city>Ottawa</city>

          <region/>

          <code/>

          <country>CA</country>
        </postal>

        <phone/>

        <facsimile/>

        <email>hooman.bidgoli@nokia.com</email>

        <uri/>
      </address>
    </author>

    <author fullname="Zhaohui Zhang" initials="Z." surname="Zhang">
      <organization>Juniper Networks</organization>

      <address>
        <email>zzhang@juniper.net</email>
      </address>
    </author>

    <date day="08" month="August" year="2025"/>

    <abstract>
      <t>Point-to-Multipoint (P2MP) policy enables creation of P2MP trees for
      efficient multi-point packet delivery in a Segment Routing (SR) domain.
      A SR P2MP Policy consists of Candidate Paths (CP) which define the
      topology of P2MP tree instances of the Candidate Paths. A P2MP tree
      instance is instantiated by a set of Replication segments.</t>

      <t>This document specifies the architecture, signaling, and procedures
      for SR P2MP Policies within Segment Routing over MPLS (SR-MPLS) and
      Segment Routing over IPv6 (SRv6). It defines the P2MP Policy construct,
      the roles of the root and leaf nodes, Candidate Paths and how P2MP trees
      using Replication segments are instantiated and maintained.
      Additionally, it describes the required extensions for a controller to
      support P2MP path computation and provisioning.</t>
    </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
      <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when,
      they appear in all capitals, as shown here.</t>
    </note>
  </front>

  <middle>
    <section title="Introduction">
      <t>A Multi-point service delivery can be realized with P2MP trees in a
      Segment Routing domain <xref target="RFC8402"/>. A P2MP tree spans from
      a Root node to a set of Leaf nodes via intermediate Replication nodes.
      It consists of a Replication segment <xref target="RFC9524"/> at the
      root node, stitched to one or more Replication segments at Leaf nodes
      and intermediate Replication nodes. A Bud node <xref target="RFC9524"/>
      is a node that is both a Replication node and a Leaf node. Any mention
      of "Leaf node(s)" in this document should be considered as referring to
      "Leaf or Bud node(s)".</t>

      <t>A Segment Routing P2MP Policy defines the Root and Leaf nodes of a
      P2MP tree. It has one or more Candidate Paths (CP) with optional
      constraints and/or optimization objectives.</t>

      <t>A controller computes P2MP tree instances of a SR P2MP Policy, from
      the Root to Leaf nodes, of a Candidate Path using the constraints and
      objectives specified in the Candidate Path. Once computed, the
      controller instantiates a P2MP tree instance in the SR domain by
      signaling Replication segments to the Root, Replication and Leaf nodes.
      A Path Computation Element (PCE) <xref target="RFC4655"/> is one example
      of such a controller.</t>

      <t>The Replication segments of a P2MP tree can be instantiated for both
      SR-MPLS <xref target="RFC8660"/> and SRv6 <xref target="RFC8986"/> data
      planes, enabling efficient packet replication within an SR domain.</t>

      <section title="Terminology">
        <t>This section defines terms used frequently in this document. Refer
        to Terminology section of <xref target="RFC9524"/> for definition of
        Replication segment and other terms associated with it.</t>

        <t>SR P2MP Policy: A SR P2MP Policy is a mechanism to construct a P2MP
        tree in a SR domain by specifying a Root and Leaf nodes.</t>

        <t>Candidate Path: A Candidate Path of SR P2MP Policy defines
        topological or resource constraints and optimization objectives that
        are used to construct a P2MP Tree instances.</t>

        <t>P2MP Tree Instance: A P2MP tree instance in a SR domain is
        constructed by stitching Replication segments between Root and Leaf
        nodes of a SR P2MP Policy. A P2MP tree belongs to a Candidate Path and
        its topology is determined by constraints and optimization objective
        of the Candidate Path. This document uses terms P2MP tree instance and
        P2MP tree interchangeably.</t>
      </section>
    </section>

    <section title="SR P2MP Policy">
      <t>An SR P2MP Policy is used to instantiate P2MP trees between a Root
      and Leaf nodes in an SR domain. It is similar to SR Policy <xref
      target="RFC9256"/>. Like SR Policy, SR P2MP Policy has one or more
      Candidate Paths and uses same criteria to select the Active Candidate
      Path. However, SR P2MP Policies and SR Policies are independent and
      distinct entities in a SR domain.</t>

      <section title="SR P2MP Policy Identification">
        <t>A SR P2MP Policy is uniquely identified by the tuple &lt;Root,
        Tree-ID&gt;, where:</t>

        <t><list style="symbols">
            <t>Root: The IP address of the Root node of P2MP trees
            instantiated by the SR P2MP Policy. This is equivalent to the
            Headend of SR Policy identifier tuple.</t>

            <t>Tree-ID: A 32-bit unsigned integer that uniquely identifies the
            P2MP Policy in the context of the Root node. This is equivalent to
            the Color of SR Policy identifier tuple.</t>
          </list></t>

        <t>Note, SR P2MP Policy identification tuple does not have a member
        equivalent to Endpoint of SR Policy identifier tuple since SR P2MP
        Policies result in P2MP trees to a varying set of endpoints (Leaf
        nodes).</t>
      </section>

      <section title="Components of an SR P2MP Policy">
        <t>An SR P2MP Policy consists of the following elements:</t>

        <t><list style="symbols">
            <t>Leaf nodes: A set of nodes that terminate the P2MP trees of the
            P2MP Policy.</t>

            <t>Candidate Paths: A set of possible paths that define
            constraints and optimization objectives of P2MP trees of P2MP
            Policy.</t>
          </list></t>

        <t>An SR P2MP Policy is provisioned on a controller (see Section <xref
        format="counter" target="Controller"/>). The controller computes the
        P2MP tree instances of Candidate Paths of the policy and instantiates
        the necessary Replication segments at the Root, Replication and Leaf
        nodes of the trees. The Root and Tree-ID of the SR P2MP Policy are
        mapped to Replication-ID element of the Replication segment identifier
        <xref target="RFC9524"> </xref>.</t>
      </section>

      <section title="Candidate Paths and P2MP Tree Instances">
        <t>An SR P2MP Policy has one or more CPs. Identification of a CP in
        context of the P2MP Policy is as specified in Section 2.9 of <xref
        target="RFC9256"/>. A CP may include topological and/or resource
        constraints and optimization objectives which influence the
        computation of P2MP tree. The Root node selects the active Candidate
        Path based on the tie breaking rules defined in<xref
        target="RFC9256"/>.</t>

        <t>A Candidate Path has zero or more P2MP tree instances. A P2MP tree
        instance is identified by an Instance-ID. This is an unsigned 16-bit
        number which is unique in context of the SR P2MP Policy of the
        Candidate Path.</t>

        <t>The Replication segments used to instantiate a P2MP tree instance
        are identified by the tuple: &lt;Root, Tree-ID, Instance-ID,
        Node-ID&gt;, where Root, Tree-ID of SR P2MP Policy and Instance-ID of
        the instance map to Replication-ID of Replication segment and Node-ID
        is as defined in <xref target="RFC9524"/>.</t>

        <t>A controller designates an active instance of a CP at the Root node
        of SR P2MP Policy by signalling this state through the protocol used
        to instantiate the Replication segment of the instance.</t>
      </section>

      <section title="Steering traffic into a SR P2MP policy">
        <t>The Tree-SID, as described in <xref target="P2MP_Tree"/>, serves as
        the data plane identifier of a P2MP tree instance. It is instantiated
        in the data plane at the Root node, intermediate Replication nodes,
        and Leaf nodes of the P2MP tree instance. The Tree-SID of the active
        instance of the active Candidate Path SHOULD be used as the Binding
        SID of the SR P2MP Policy.</t>

        <t>The Root node can steer an incoming packet into a SR P2MP Policy in
        one of following methods:</t>

        <t><list style="symbols">
            <t>Local Policy-Based forwarding: The Root node selects the active
            P2MP tree instance of the active Candidate Path of the SR P2MP
            Policy based on local policy. The procedures to map an incoming
            packet to a SR P2MP Policy are out of scope of this document.</t>

            <t>Tree-SID Based forwarding: The Binding SID (Tree-SID) in the
            incoming packet is used to map the packet to the appropriate P2MP
            tree instance.</t>
          </list></t>
      </section>
    </section>

    <section anchor="P2MP_Tree" title="P2MP Tree">
      <t>A P2MP tree within an SR domain establishes a forwarding structure
      that connects a Root node to a set of Leaf nodes via a series of
      intermediate Replication nodes. The tree consists of:</t>

      <t><list style="symbols">
          <t>A Replication segment at the Root node.</t>

          <t>Zero or more Replication segments at intermediate Replication
          nodes.</t>

          <t>Replication segments at the Leaf nodes.</t>
        </list></t>

      <section title="Tree-SID and Replication segments">
        <t>The Replication SID associated with the Replication segment at the
        Root node is referred to as the Tree-SID. The Tree-SID SHOULD also
        serve as the Replication-SID for the Replication segments at
        intermediate Replication nodes and Leaf nodes. However, the
        Replication segments at intermediate Replication nodes and Leaf nodes
        MAY use Replication-SIDs that differ from the Tree-SID.</t>
      </section>

      <section title="Shared Replication segments">
        <t>A Replication segment MAY be shared across different P2MP tree
        instances, for example, in scenarios involving protection mechanisms.
        A shared Replication segment MUST be identified using a Root set to
        zero (0.0.0.0 for IPv4 and :: for IPv6) along with a Replication-ID
        that is unique within the context of the node where the Replication
        segment is instantiated.</t>

        <t>However, a shared Replication segment MUST NOT be associated with
        an SR P2MP tree.</t>
      </section>

      <section title="Leaf Nodes in SR-MPLS">
        <t>A specific service is identified by a service context in a packet.
        A P2MP tree is usually associated with one and only one multi-point
        service. On a Leaf node of such a multi-point service, the transport
        identifier which is the Tree-SID or Replication SID at a Leaf node is
        also associated with the service context because it is not always
        feasible to separate the transport and service context with efficient
        replication in core since a) multi-point services may have differing
        sets of end-points, and b) downstream allocation of service context
        cannot be encoded in packets replicated in the core.</t>

        <t>A P2MP tree can associated with one or more multi-point services on
        the Root and Leaf nodes. In SR-MPLS deployments, if it is known a
        priori that multi-point services mapped to a P2MP tree can be uniquely
        identified within the SR domain, a controller MAY opt not to
        instantiate Replication segments at Leaf nodes. In such cases,
        Replication Nodes upstream of the Leaf nodes effectively implement
        Penultimate-Hop Popping behavior by removing the Tree-SID from the
        packet before forwarding it. A multi-point service context allocated
        from the Domain-wide Common Block (DCB), as specified in <xref
        target="RFC9573"/>, is an example of a globally unique context that
        facilitates this optimization.</t>
      </section>

      <section title="Packet forwarding in P2MP tree">
        <t>When a packet is steered into a P2MP tree instance, the Replication
        segment at the Root node performs packet replication and forwards
        copies to downstream nodes.</t>

        <t><list style="symbols">
            <t>Each replicated packet carries the Replication-SID of the
            Replication segment at the downstream node.</t>

            <t>A downstream node can be either: <list style="symbols">
                <t>A Leaf node, in which case the replication process
                terminates.</t>

                <t>An intermediate Replication node, which further replicates
                the packet through its associated Replication segments until
                it reaches all Leaf nodes.</t>
              </list></t>
          </list></t>
      </section>
    </section>

    <section anchor="Controller"
             title="Using a controller to build a P2MP Tree">
      <t>A controller is provisioned with SR P2MP Policy and its Candidate
      Paths to compute and instantiate P2MP trees in an SR domain. Once
      computed, the controller instantiates the Replication segments that
      compose the P2MP tree in the SR domain nodes using signalling protocols
      such as PCEP, BGP, NetConf, etc. The procedures for provisioning a
      controller and the instantiation of Replication segments in an SR domain
      are outside the scope of this document.</t>

      <section title="SR P2MP Policy Provisioning on a controller">
        <t>An entity (an operator, a network node or a machine) provisions a
        SR P2MP Policy on a controller by specifying the addresses of the
        Root, set of Leaf nodes Candidate Paths. The procedures and mechanisms
        for provisioning a controller are outside the scope of this
        document.</t>

        <t>Candidate Path constraints MAY include link color affinity,
        bandwidth, disjointness (link, node, SRLG), delay bound, link loss,
        flexible algorithm etc., and optimization objectives based on IGP or
        TE metric or link latency. Other constraints and optimization
        objectives MAY be used for P2MP tree computation.</t>

        <t>The Tree SID of a P2MP Tree instance of a Candidate Path of a SR
        P2MP Policy can be either dynamically assigned by the controller or
        statically assigned by entity provisioning the SR P2MP Policy.</t>
      </section>

      <section title="Controller Functions">
        <t>A controller performs the following functions in general:</t>

        <t><list style="symbols">
            <t>Topology Discovery: A controller discovers network topology
            across Interior Gateway Protocol (IGP) areas, levels or Autonomous
            Systems (ASes).</t>

            <t>Capability Exchange: A controller discovers a node's capability
            to participate in SR P2MP tree as well as advertise its capability
            to compute P2MP trees.</t>
          </list></t>
      </section>

      <section title="P2MP Tree Compute">
        <t>A controller computes one or more P2MP tree instances for CPs of a
        SR P2MP Policy. A CP may not have any P2MP tree instance if a
        controller cannot compute a P2MP tree instance for it.</t>

        <t>A controller MUST compute a P2MP tree such that there are no loops
        in the tree at steady state as required by <xref
        target="RFC9524"/>.</t>

        <t>A controller SHOULD modify a P2MP tree instance of a Candidate Path
        on detecting a change in the network topology, if the change affects
        the tree instance, or when a better path can be found based on the new
        network state. In this case, the controller MAY create a new instance
        of a P2MP tree and remove the old instance of the tree from the
        network in order to minimize traffic loss.</t>
      </section>

      <section title="Instantiating P2MP tree on nodes">
        <t>Once a controller computes a P2MP tree instance for a CP of a SR
        P2MP Policy, it needs to instantiate the tree on the relevant network
        nodes via Replication segments. The controller can use various
        mechanisms to program the Replication segments as described below.
        Some examples of these mechanisms are PCEP, BGP and NetConf. The
        mechanism and procedures to signal Replication segments are outside
        the scope of this document.</t>
      </section>

      <section title="Protection">
        <section title="Local Protection">
          <t>A network link, node or path on the instance of a P2MP tree can
          be protected using SR policies computed by a controller. The backup
          SR policies are programmed in data plane in order to minimize
          traffic loss when the protected link/node fails.</t>

          <t>It is also possible to use node local Loop-Free Alternate
          protection and Micro-Loop Prevention mechanisms to protect
          link/nodes of P2MP tree.</t>
        </section>

        <section title="Path Protection">
          <t>A controller can create a disjoint backup tree instance for
          providing end-to-end path protection if the topology permits.</t>
        </section>
      </section>
    </section>

    <section anchor="IANA" title="IANA Considerations">
      <t>This document makes no request of IANA.</t>
    </section>

    <section anchor="Security" title="Security Considerations">
      <t>This document describes how a P2MP tree can be created in an SR
      domain by stitching Replication segments together. Some security
      considerations for Replication segments outlined in <xref
      target="RFC9524"/> are also applicable to this document. Following is a
      brief reminder of the same.</t>

      <t>An SR domain needs protection from outside attackers as described in
      <xref target="RFC8754"/>.</t>

      <t>Failure to protect the SR MPLS domain by correctly provisioning MPLS
      support per interface permits attackers from outside the domain to send
      packets to receivers of the Multi-point services that use the SR P2MP
      trees provisioned within the domain.</t>

      <t>Failure to protect the SRv6 domain with inbound Infrastructure Access
      Control Lists (IACLs) on external interfaces, combined with failure to
      implement BCP 38 <xref target="RFC2827"/> or apply IACLs on nodes
      provisioning SIDs, permits attackers from outside the SR domain to send
      packets to the receivers of Multi-point services that use the SR P2MP
      trees provisioned within the domain.</t>

      <t>Incorrect provisioning of Replication segments by a controller that
      computes SR P2MP tree instance can result in a chain of Replication
      segments forming a loop. In this case, replicated packets can create a
      storm till MPLS TTL (for SR-MPLS) or IPv6 Hop Limit (for SRv6)
      decrements to zero.</t>

      <t>The control plane protocols (like PCEP, BGP, etc.) used to
      instantiate Replication segments of SR P2MP tree instance can leverage
      their own security mechanisms such as encryption, authentication
      filtering etc.</t>

      <t>For SRv6, <xref target="RFC9524"/> describes an exception for
      Parameter Problem Message, code 2 ICMPv6 Error messages. If an attacker
      is able to inject a packet into Multi-point service 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.</t>
    </section>

    <section anchor="Acknowledgements" title="Acknowledgements">
      <t>The authors would like to acknowledge Siva Sivabalan, Mike Koldychev
      and Vishnu Pavan Beeram for their valuable inputs.</t>
    </section>

    <section title="Contributors">
      <t/>

      <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>Kurtis Gillis <vspace blankLines="0"/> Bell Canada <vspace
      blankLines="0"/> Halifax <vspace blankLines="0"/> Canada</t>

      <t>Email: kurtis.gillis@bell.ca</t>

      <t>Arvind Venkateswaran <vspace blankLines="0"/> Cisco Systems, Inc.
      <vspace blankLines="0"/> San Jose <vspace blankLines="0"/> US</t>

      <t>Email: arvvenka@cisco.com</t>

      <t>Zafar Ali <vspace blankLines="0"/> Cisco Systems, Inc. <vspace
      blankLines="0"/> US</t>

      <t>Email: zali@cisco.com</t>

      <t>Swadesh Agrawal <vspace blankLines="0"/> Cisco Systems, Inc. <vspace
      blankLines="0"/> San Jose <vspace blankLines="0"/> US</t>

      <t>Email: swaagraw@cisco.com</t>

      <t>Jayant Kotalwar <vspace blankLines="0"/> Nokia <vspace
      blankLines="0"/> Mountain View <vspace blankLines="0"/> US</t>

      <t>Email: jayant.kotalwar@nokia.com</t>

      <t>Tanmoy Kundu <vspace blankLines="0"/> Nokia <vspace blankLines="0"/>
      Mountain View <vspace blankLines="0"/> US</t>

      <t>Email: tanmoy.kundu@nokia.com</t>

      <t>Andrew Stone <vspace blankLines="0"/> Nokia <vspace blankLines="0"/>
      Ottawa <vspace blankLines="0"/> Canada</t>

      <t>Email: andrew.stone@nokia.com</t>

      <t>Tarek Saad <vspace blankLines="0"/> Juniper Networks <vspace
      blankLines="0"/> Canada</t>

      <t>Email:tsaad@juniper.net</t>

      <t>Kamran Raza <vspace blankLines="0"/> Cisco Systems, Inc. <vspace
      blankLines="0"/> Canada</t>

      <t>Email:skraza@cisco.com</t>

      <t>Anuj Budhiraja <vspace blankLines="0"/> Cisco Systems, Inc. <vspace
      blankLines="0"/> US</t>

      <t>Email:abudhira@cisco.com</t>

      <t>Mankamana Mishra <vspace blankLines="0"/> Cisco Systems, Inc. <vspace
      blankLines="0"/> US</t>

      <t>Email:mankamis@cisco.com</t>
    </section>
  </middle>

  <back>
    <references title="Normative References">
      <?rfc include="reference.RFC.2119"?>

      <?rfc include="reference.RFC.8174"?>

      <?rfc include='reference.RFC.8402'?>

      <?rfc include='reference.RFC.9524'?>

      <?rfc include='reference.RFC.9256'?>
    </references>

    <references title="Informative References">
      <?rfc include='reference.RFC.4655'?>

      <?rfc include='reference.RFC.9573'?>

      <?rfc include='reference.RFC.8660'?>

      <?rfc include='reference.RFC.8986'?>

      <?rfc include='reference.I-D.filsfils-spring-srv6-net-pgm-illustration'?>

      <?rfc include='reference.RFC.8754'?>

      <?rfc include='reference.RFC.2827'?>
    </references>

    <section title="Illustration of SR P2MP Policy and P2MP Tree">
      <t>Consider the following topology:</t>

      <figure title="Figure 1">
        <artwork><![CDATA[                               R3------R6
                  Controller--/         \
                      R1----R2----R5-----R7
                              \         / 
                               +--R4---+  ]]></artwork>
      </figure>

      <t>In these examples, the Node-SID of a node Rn is N-SIDn and
      Adjacency-SID from node Rm to node Rn is A-SIDmn. Interface between Rm
      and Rn is Lmn.</t>

      <t>For SRv6, the reader is expected to be familiar with SRv6 Network
      Programming <xref target="RFC8986"/> to follow the examples. This
      document re-uses SID allocation scheme, reproduced below, from
      Illustrations in SRv6 Network Programming <xref
      target="I-D.filsfils-spring-srv6-net-pgm-illustration"/></t>

      <t><list style="symbols">
          <t>2001:db8::/32 is an IPv6 block allocated by a RIR to the
          operator</t>

          <t>2001:db8:0::/48 is dedicated to the internal address space</t>

          <t>2001:db8:cccc::/48 is dedicated to the internal SRv6 SID
          space</t>

          <t>We assume a location expressed in 64 bits and a function
          expressed in 16 bits</t>

          <t>node k has a classic IPv6 loopback address 2001:db8::k/128 which
          is advertised in the IGP</t>

          <t>node k has 2001:db8:cccc:k::/64 for its local SID space. Its SIDs
          will be explicitly assigned from that block</t>

          <t>node k advertises 2001:db8:cccc:k::/64 in its IGP</t>

          <t>Function :1:: (function 1, for short) represents the End function
          with PSP support</t>

          <t>Function :Cn:: (function Cn, for short) represents the End.X
          function to node n</t>

          <t>Function :C1n: (function C1n for short) represents the End.X
          function to node n with USD</t>
        </list></t>

      <t>Each node k has: <list style="symbols">
          <t>An explicit SID instantiation 2001:db8:cccc:k:1::/128 bound to an
          End function with additional support for PSP</t>

          <t>An explicit SID instantiation 2001:db8:cccc:k:Cj::/128 bound to
          an End.X function to neighbor J with additional support for PSP</t>

          <t>An explicit SID instantiation 2001:db8:cccc:k:C1j::/128 bound to
          an End.X function to neighbor J with additional support for USD</t>
        </list></t>

      <t>Assume a controller is provisioned with following SR P2MP Policy at
      Root R1 with Tree-ID T-ID:</t>

      <figure>
        <artwork><![CDATA[SR P2MP Policy <R1,T-ID>:
 Leaf nodes: {R2, R6, R7}
 Candidate-path 1:
   Optimize: IGP metric
   Tree-SID: T-SID1
]]></artwork>
      </figure>

      <t>The controller is responsible for computing a P2MP tree instance of
      the Candidate Path. In this example, we assume one active instance of
      P2MP tree with Instance-ID I-ID1. Assume the controller instantiates
      P2MP trees by signalling Replication segments i.e. Replication-ID of
      these Replication segments is &lt;Root, Tree-ID, Instance-ID&gt;. All
      Replication segments use the Tree-SID T-SID1 as Replication-SID. For
      SRv6, assume the Replication-SID at node k, bound to an End.Replicate
      function, is 2001:db8:cccc:k:fa::/128.</t>

      <section title="P2MP Tree with non-adjacent Replication Segments">
        <t>Assume the controller computes a P2MP tree instance with Root node
        R1, Intermediate and Leaf node R2, and Leaf nodes R6 and R7. The
        controller instantiates the instance by stitching Replication segments
        at R1, R2, R6 and R7. Replication segment at R1 replicates to R2.
        Replication segment at R2 replicates to R6 and R7. Note nodes R3, R4
        and R5 do not have any Replication segment state for the tree.</t>

        <section title="SR-MPLS">
          <t>The Replication segment state at nodes R1, R2, R6 and R7 is shown
          below.</t>

          <t>Replication segment at R1:</t>

          <figure>
            <artwork><![CDATA[Replication segment <R1,T-ID,I-ID1,R1>:
 Replication-SID: T-SID1
 Replication State:
   R2: <T-SID1->L12>
]]></artwork>
          </figure>

          <t>Replication to R2 steers packet directly to the node on interface
          L12.</t>

          <t>Replication segment at R2:</t>

          <figure>
            <artwork><![CDATA[Replication segment <R1,T-ID,I-ID1,R2>:
 Replication-SID: T-SID1
 Replication State:
   R2: <Leaf>
   R6: <N-SID6, T-SID1>
   R7: <N-SID7, T-SID1>]]></artwork>
          </figure>

          <t>R2 is a Bud node. It performs role of Leaf as well as a transit
          node replicating to R6 and R7. Replication to R6, using N-SID6,
          steers packet via IGP shortest path to that node. Replication to R7,
          using N-SID7, steers packet via IGP shortest path to R7 via either
          R5 or R4 based on ECMP hashing.</t>

          <t>Replication segment at R6:</t>

          <figure>
            <artwork><![CDATA[Replication segment <R1,T-ID,I-ID1,R6>:
 Replication-SID: T-SID1
 Replication State:
   R6: <Leaf>]]></artwork>
          </figure>

          <t>Replication segment at R7:</t>

          <figure>
            <artwork><![CDATA[Replication segment <R1,T-ID,I-ID1,R7>:
 Replication-SID: T-SID1
 Replication State:
   R7: <Leaf>]]></artwork>
          </figure>

          <t>When a packet is steered into the active instance Candidate Path
          1 of SR P2MP Policy at R1:</t>

          <t><list style="symbols">
              <t>Since R1 is directly connected to R2, R1 performs PUSH
              operation with just &lt;T-SID1&gt; label for the replicated copy
              and sends it to R2 on interface L12.</t>

              <t>R2, as Leaf, performs NEXT operation, pops T-SID1 label and
              delivers the payload. For replication to R6, R2 performs a PUSH
              operation of N-SID6, to send &lt;N-SID6,T-SID1&gt; label stack
              to R3. R3 is the penultimate hop for N-SID6; it performs
              penultimate hop popping, which corresponds to the NEXT operation
              and the packet is then sent to R6 with &lt;T-SID1&gt; in the
              label stack. For replication to R7, R2 performs a PUSH operation
              of N-SID7, to send &lt;N-SID7,T-SID1&gt; label stack to R4, one
              of IGP ECMP nexthops towards R7. R4 is the penultimate hop for
              N-SID7; it performs penultimate hop popping, which corresponds
              to the NEXT operation and the packet is then sent to R7 with
              &lt;T-SID1&gt; in the label stack.</t>

              <t>R6, as Leaf, performs NEXT operation, pops T-SID1 label and
              delivers the payload.</t>

              <t>R7, as Leaf, performs NEXT operation, pops T-SID1 label and
              delivers the payload.</t>
            </list></t>
        </section>

        <section title="SRv6">
          <t>For SRv6, the replicated packet from R2 to R7 has to traverse R4
          using a SR-TE policy, Policy27. The policy has one SID in segment
          list: End.X function with USD of R4 to R7 . The Replication segment
          state at nodes R1, R2, R6 and R7 is shown below.</t>

          <figure>
            <artwork><![CDATA[Policy27: <2001:db8:cccc:4:c17::>
]]></artwork>
          </figure>

          <t>Replication segment at R1:</t>

          <figure>
            <artwork><![CDATA[Replication segment <R1,T-ID,I-ID1,R1>:
 Replication-SID: 2001:db8:cccc:1:fa::
 Replication State:
   R2: <2001:db8:cccc:2:fa::->L12>
]]></artwork>
          </figure>

          <t>Replication to R2 steers packet directly to the node on interface
          L12.</t>

          <t>Replication segment at R2:</t>

          <figure>
            <artwork><![CDATA[Replication segment <R1,T-ID,I-ID1,R2>:
 Replication-SID: 2001:db8:cccc:2:fa::
 Replication State:
   R2: <Leaf>
   R6: <2001:db8:cccc:6:fa::>
   R7: <2001:db8:cccc:7:fa:: -> Policy27>]]></artwork>
          </figure>

          <t>R2 is a Bud node. It performs role of Leaf as well as a transit
          node replicating to R6 and R7. Replication to R6, steers packet via
          IGP shortest path to that node. Replication to R7, via SR-TE policy,
          first encapsulates the packet using H.Encaps and then steers the
          outer packet to R4. End.X USD on R4 decapsulates outer header and
          sends the original inner packet to R7.</t>

          <t>Replication segment at R6:</t>

          <figure>
            <artwork><![CDATA[Replication segment <R1,T-ID,I-ID1,R6>:
 Replication-SID: 2001:db8:cccc:6:fa::
 Replication State:
   R6: <Leaf>]]></artwork>
          </figure>

          <t>Replication segment at R7:</t>

          <figure>
            <artwork><![CDATA[Replication segment <R1,T-ID,I-ID1,R7>:
 Replication-SID: 2001:db8:cccc:7:fa::
 Replication State:
   R7: <Leaf>]]></artwork>
          </figure>

          <t>When a packet (A,B2) is steered into the active instance of
          Candidate Path 1 of SR P2MP Policy at R1 using H.Encaps.Replicate
          behavior:</t>

          <t><list style="symbols">
              <t>Since R1 is directly connected to R2, R1 sends replicated
              copy (2001:db8::1, 2001:db8:cccc:2:fa::) (A,B2) to R2 on
              interface L12.</t>

              <t>R2, as Leaf removes outer IPv6 header and delivers the
              payload. R2, as a bud node, also replicates the packet.</t>

              <t><list style="symbols">
                  <t>For replication to R6, R2 sends (2001:db8::1,
                  2001:db8:cccc:6:fa::) (A,B2) to R3. R3 forwards the packet
                  using 2001:db8:cccc:6::/64 packet to R6.</t>

                  <t>For replication to R7 using Policy27, R2 encapsulates and
                  sends (2001:db8::2, 2001:db8:cccc:4:C17::) (2001:db8::1,
                  2001:db8:cccc:7:fa::) (A,B2) to R4. R4 performs End.X USD
                  behavior, decapsulates outer IPv6 header and sends
                  (2001:db8::1, 2001:db8:cccc:7:fa::) (A,B2) to R7.</t>
                </list></t>

              <t>R6, as Leaf, removes outer IPv6 header and delivers the
              payload.</t>

              <t>R7, as Leaf, removes outer IPv6 header and delivers the
              payload.</t>
            </list></t>
        </section>
      </section>

      <section title="P2MP Tree with adjacent Replication Segments">
        <t>Assume the controller computes a P2MP tree with Root node R1,
        Intermediate and Leaf node R2, Intermediate nodes R3 and R5, and Leaf
        nodes R6 and R7. The controller instantiates the P2MP tree instance by
        stitching Replication segments at R1, R2, R3, R5, R6 and R7.
        Replication segment at R1 replicates to R2. Replication segment at R2
        replicates to R3 and R5. Replication segment at R3 replicates to R6.
        Replication segment at R5 replicates to R7. Note node R4 does not have
        any Replication segment state for the tree.</t>

        <section title="SR-MPLS">
          <t>The Replication segment state at nodes R1, R2, R3, R5, R6 and R7
          is shown below.</t>

          <t>Replication segment at R1:</t>

          <figure>
            <artwork><![CDATA[Replication segment <R1,T-ID,I-ID1,R1>:
 Replication-SID: T-SID1
 Replication State:
   R2: <T-SID1->L12>
]]></artwork>
          </figure>

          <t>Replication to R2 steers packet directly to the node on interface
          L12.</t>

          <t>Replication segment at R2:</t>

          <figure>
            <artwork><![CDATA[Replication segment <R1,T-ID,I-ID1,R2>:
 Replication-SID: T-SID1
 Replication State:
   R2: <Leaf>
   R3: <T-SID1->L23>
   R5: <T-SID1->L25>]]></artwork>
          </figure>

          <t>R2 is a Bud node. It performs role of Leaf as well as a transit
          node replicating to R3 and R5. Replication to R3, steers packet
          directly to the node on L23. Replication to R5, steers packet
          directly to the node on L25.</t>

          <t>Replication segment at R3:</t>

          <figure>
            <artwork><![CDATA[Replication segment <R1,T-ID,I-ID1,R3>:
 Replication-SID: T-SID1
 Replication State:
   R6: <T-SID1->L36>
]]></artwork>
          </figure>

          <t>Replication to R6, steers packet directly to the node on L36.</t>

          <t>Replication segment at R5:</t>

          <figure>
            <artwork><![CDATA[Replication segment <R1,T-ID,I-ID1,R5>:
 Replication-SID: T-SID1
 Replication State:
   R7: <T-SID1->L57>
]]></artwork>
          </figure>

          <t>Replication to R7, steers packet directly to the node on L57.</t>

          <t>Replication segment at R6:</t>

          <figure>
            <artwork><![CDATA[Replication segment <R1,T-ID,I-ID1,R6>:
 Replication-SID: T-SID1
 Replication State:
   R6: <Leaf>]]></artwork>
          </figure>

          <t>Replication segment at R7:</t>

          <figure>
            <artwork><![CDATA[Replication segment <R1,T-ID,I-ID1,R7>:
 Replication-SID: T-SID1
 Replication State:
   R7: <Leaf>]]></artwork>
          </figure>

          <t>When a packet is steered into the SR P2MP Policy at R1:</t>

          <t><list style="symbols">
              <t>Since R1 is directly connected to R2, R1 performs PUSH
              operation with just &lt;T-SID1&gt; label for the replicated copy
              and sends it to R2 on interface L12.</t>

              <t>R2, as Leaf, performs NEXT operation, pops T-SID1 label and
              delivers the payload. It also performs PUSH operation on T-SID1
              for replication to R3 and R5. For replication to R6, R2 sends
              &lt;T-SID1&gt; label stack to R3 on interface L23. For
              replication to R5, R2 sends &lt;T-SID1&gt; label stack to R5 on
              interface L25.</t>

              <t>R3 performs NEXT operation on T-SID1 and performs a PUSH
              operation for replication to R6 and sends &lt;T-SID1&gt; label
              stack to R6 on interface L36.</t>

              <t>R5 performs NEXT operation on T-SID1 and performs a PUSH
              operation for replication to R7 and sends &lt;T-SID1&gt; label
              stack to R7 on interface L57.</t>

              <t>R6, as Leaf, performs NEXT operation, pops T-SID1 label and
              delivers the payload.</t>

              <t>R7, as Leaf, performs NEXT operation, pops T-SID1 label and
              delivers the payload.</t>
            </list></t>
        </section>

        <section title="SRv6">
          <t>The Replication segment state at nodes R1, R2, R3, R5, R6 and R7
          is shown below.</t>

          <t>Replication segment at R1:</t>

          <figure>
            <artwork><![CDATA[Replication segment <R1,T-ID,I-ID1,R1>:
 Replication-SID: 2001:db8:cccc:1:fa::
 Replication State:
   R2: <2001:db8:cccc:2:fa::->L12>
]]></artwork>
          </figure>

          <t>Replication to R2 steers packet directly to the node on interface
          L12.</t>

          <t>Replication segment at R2:</t>

          <figure>
            <artwork><![CDATA[Replication segment <R1,T-ID,I-ID1,R2>:
 Replication-SID: 2001:db8:cccc:2:fa::
 Replication State:
   R2: <Leaf>
   R3: <2001:db8:cccc:3:fa::->L23>
   R5: <2001:db8:cccc:5:fa::->L25>]]></artwork>
          </figure>

          <t>R2 is a Bud node. It performs role of Leaf as well as a transit
          node replicating to R3 and R5. Replication to R3, steers packet
          directly to the node on L23. Replication to R5, steers packet
          directly to the node on L25.</t>

          <t>Replication segment at R3:</t>

          <figure>
            <artwork><![CDATA[Replication segment <R1,T-ID,I-ID1,R3>:
 Replication-SID: 2001:db8:cccc:3:fa::
 Replication State:
   R6: <2001:db8:cccc:6:fa::->L36>
]]></artwork>
          </figure>

          <t>Replication to R6, steers packet directly to the node on L36.</t>

          <t>Replication segment at R5:</t>

          <figure>
            <artwork><![CDATA[Replication segment <R1,T-ID,I-ID1,R5>:
 Replication-SID: 2001:db8:cccc:5:fa::
 Replication State:
   R7: <2001:db8:cccc:7:fa::->L57>
]]></artwork>
          </figure>

          <t>Replication to R7, steers packet directly to the node on L57.</t>

          <t>Replication segment at R6:</t>

          <figure>
            <artwork><![CDATA[Replication segment <R1,T-ID,I-ID1,R6>:
 Replication-SID: 2001:db8:cccc:6:fa::
 Replication State:
   R6: <Leaf>]]></artwork>
          </figure>

          <t>Replication segment at R7:</t>

          <figure>
            <artwork><![CDATA[Replication segment <R1,T-ID,I-ID1,R7>:
 Replication-SID: 2001:db8:cccc:7:fa::
 Replication State:
   R7: <Leaf>]]></artwork>
          </figure>

          <t>When a packet (A,B2) is steered into the active instance of
          Candidate Path 1 of SR P2MP Policy at R1 using H.Encaps.Replicate
          behavior:</t>

          <t><list style="symbols">
              <t>Since R1 is directly connected to R2, R1 sends replicated
              copy (2001:db8::1, 2001:db8:cccc:2:fa::) (A,B2) to R2 on
              interface L12.</t>

              <t>R2, as Leaf, removes outer IPv6 header and delivers the
              payload. R2, as a bud node, also replicates the packet. For
              replication to R3, R2 sends (2001:db8::1, 2001:db8:cccc:3:fa::)
              (A,B2) to R3 on interface L23. For replication to R5, R2 sends
              (2001:db8::1, 2001:db8:cccc:5:fa::) (A,B2) to R5 on interface
              L25.</t>

              <t>R3 replicates and sends (2001:db8::1, 2001:db8:cccc:6:fa::)
              (A,B2) to R6 on interface L36.</t>

              <t>R5 replicates and sends (2001:db8::1, 2001:db8:cccc:7:fa::)
              (A,B2) to R7 on interface L57.</t>

              <t>R6, as Leaf, removes outer IPv6 header and delivers the
              payload.</t>

              <t>R7, as Leaf, removes outer IPv6 header and delivers the
              payload.</t>
            </list></t>
        </section>
      </section>
    </section>
  </back>
</rfc>
