<?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-bonica-spring-srv6-plus-06"
     ipr="trust200902">
  <front>
    <title abbrev="SRm6">Segment Routing Mapped To IPv6 (SRm6)</title>

    <author fullname="Ron Bonica" initials="R." surname="Bonica">
      <organization>Juniper Networks</organization>

      <address>
        <postal>
          <street/>

          <city>Herndon</city>

          <code>20171</code>

          <region>Virginia</region>

          <country>USA</country>
        </postal>

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

    <author fullname="Shraddha Hegde" initials="S." surname="Hegde">
      <organization>Juniper Networks</organization>

      <address>
        <postal>
          <street>Embassy Business Park</street>

          <city>Bangalore</city>

          <region>KA</region>

          <code>560093</code>

          <country>India</country>
        </postal>

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

    <author fullname="Yuji Kamite" initials="Y. " surname="Kamite">
      <organization>NTT Communications Corporation</organization>

      <address>
        <postal>
          <street>3-4-1 Shibaura, Minato-ku</street>

          <city>Tokyo</city>

          <code>108-8118</code>

          <country>Japan</country>
        </postal>

        <email>y.kamite@ntt.com</email>
      </address>
    </author>

    <author fullname="Andrew Alston" initials="A." surname="Alston">
      <organization>Liquid Telecom</organization>

      <address>
        <postal>
          <street/>

          <city>Nairobi</city>

          <country>Kenya</country>
        </postal>

        <email>Andrew.Alston@liquidtelecom.com</email>
      </address>
    </author>

    <author fullname="Daniam Henriques" initials="D." surname="Henriques">
      <organization>Liquid Telecom</organization>

      <address>
        <postal>
          <street/>

          <city>Johannesburg</city>

          <country>South Africa</country>
        </postal>

        <email>daniam.henriques@liquidtelecom.com</email>
      </address>
    </author>

    <author fullname="Luay Jalil" initials="L. " surname="Jalil">
      <organization>Verizon</organization>

      <address>
        <postal>
          <street/>

          <city>Richardson</city>

          <region>Texas</region>

          <country>USA</country>
        </postal>

        <email>luay.jalil@one.verizon.com</email>
      </address>
    </author>

    <author fullname="Joel Halpern" initials="J." surname="Halpern">
      <organization>Ericsson</organization>

      <address>
        <postal>
          <street>P. O. Box 6049</street>

          <city>Leesburg</city>

          <region>Virginia</region>

          <code>20178</code>

          <country>USA</country>
        </postal>

        <email>joel.halpern@ericsson.com</email>
      </address>
    </author>

    <author fullname="Jen Linkova" initials="J." surname="Linkova">
      <organization>Google</organization>

      <address>
        <postal>
          <street/>

          <city>Mountain View</city>

          <region>California</region>

          <code>94043</code>

          <country>USA</country>
        </postal>

        <email>furry@google.com</email>
      </address>
    </author>

    <author fullname="Gang Chen" initials="G." surname="Chen">
      <organization>Baidu</organization>

      <address>
        <postal>
          <street>No.10 Xibeiwang East Road Haidian District</street>

          <city>Beijing</city>

          <code>100193</code>

          <country>P.R. China</country>
        </postal>

        <email>phdgang@gmail.com</email>
      </address>
    </author>

    <date day="15" month="October" year="2019"/>

    <area>Routing Area</area>

    <workgroup>SPRING Working Group</workgroup>

    <keyword>Segment Routing</keyword>

    <keyword>IPv6</keyword>

    <abstract>
      <t>This document describes Segment Routing mapped to IPv6 (SRm6). SRm6
      is a Segment Routing (SR) solution that leverages IPv6. It supports a
      wide variety of use-cases while remaining in strict compliance with IPv6
      specifications. SRm6 is optimized for ASIC-based forwarding devices that
      operate at high data rates.</t>
    </abstract>
  </front>

  <middle>
    <section title="Overview">
      <t>Network operators deploy <xref target="RFC8402">Segment Routing (SR)
      </xref> so that they can forward packets through SR paths. An SR path
      provides unidirectional connectivity from its ingress node to its egress
      node. While an SR path can follow the least cost path from ingress to
      egress, it can also follow any other path.</t>

      <t>An SR path contains one or more segments. A segment provides
      unidirectional connectivity from its ingress node to its egress node. It
      includes a topological instruction that controls its behavior.</t>

      <t>The topological instruction is executed on the segment ingress node.
      It determines the segment egress node and the method by which the
      segment ingress node forwards packets to the segment egress node.</t>

      <t>Per-segment service instructions can augment a segment. Per-segment
      service instructions, if present, are executed on the segment egress
      node.</t>

      <t>Likewise, a per-path service instruction can augment a path. The
      per-path service instruction, if present, is executed on the path egress
      node. <xref target="sectRefTopo"> </xref> of this document illustrates
      the relationship between SR paths, segments and instructions.</t>

      <t>A Segment Identifier (SID) identifies each segment. Because there is
      a one-to-one relationship between segments and the topological
      instructions that control them, the SID that identifies a segment also
      identifies the topological instruction that controls it.</t>

      <t>A SID is different from the topological instruction that it
      identifies. While a SID identifies a topological instruction, it does
      not contain the topological instruction that it identifies. Therefore, a
      SID can be encoded in relatively few bits, while the topological
      instruction that it identifies may require many more bits for
      encoding.</t>

      <t>An SR path can be represented by its ingress node as an ordered
      sequence of SIDs. In order to forward a packet through an SR path, the
      SR ingress node encodes the SR path into the packet as an ordered
      sequence of SIDs. It can also augment the packet with service
      instructions.</t>

      <t>Because the SR ingress node is also the first segment ingress node,
      it executes the topological instruction associated with the first
      segment. This causes the packet to be forwarded to the first segment
      egress node. When the first segment egress node receives the packet, it
      executes any per-segment service instructions that augment the first
      segment.</t>

      <t>If the SR path contains exactly one segment, the first segment egress
      node is also the path egress node. In this case, that node executes any
      per-path service instruction that augments the path, and SR forwarding
      is complete.</t>

      <t>If the SR path contains multiple segments, the first segment egress
      node is also the second segment ingress node. In this case, that node
      executes the topological instruction associated with the second segment.
      The above-described procedure continues until the packet arrives at the
      SR egress node.</t>

      <t>In the above-described procedure, only the SR ingress node maintains
      path information. Segment ingress and egress nodes maintain information
      regarding the segments in which they participate, but they do not
      maintain path information.</t>

      <t>The SR architecture, described above, can leverage either an <xref
      target="RFC3031">MPLS</xref> data plane or an <xref
      target="RFC8200">IPv6</xref> data plane. <xref
      target="I-D.ietf-spring-segment-routing-mpls">SR-MPLS</xref> leverages
      MPLS. <xref
      target="I-D.ietf-spring-srv6-network-programming">SRv6</xref> <xref
      target="I-D.ietf-6man-segment-routing-header"/> leverages IPv6.</t>

      <t>This document describes Segment Routing mapped to IPv6 (SRm6). SRm6
      is an SR variant that leverages IPv6. It supports a wide variety of
      use-cases while remaining in strict compliance with IPv6 specifications.
      SRm6 is optimized for ASIC-based forwarding devices that operate at high
      data rates. <xref target="sectDifference"/> of this document highlights
      differences between SRv6 and SRm6.</t>
    </section>

    <section anchor="ReqLang" 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 <xref
      target="RFC2119">BCP 14</xref> <xref target="RFC8174"/> when, and only
      when, they appear in all capitals, as shown here.</t>
    </section>

    <section anchor="sectRefTopo" title="Paths, Segments And Instructions">
      <t>An SRm6 path is determined by the segments that it contains. It can
      be represented by its ingress node as an ordered sequence of SIDs.</t>

      <t>A segment is determined by its ingress node and by the topological
      instruction that controls its behavior. The topological instruction
      determines the segment egress node and the method by which the segment
      ingress node forwards packets to the segment egress node.</t>

      <t>Per-segment service instructions augment, but do not determine,
      segments. A segment ingress node can:</t>

      <t><list style="symbols">
          <t>Send one packet through a segment with one per-segment service
          instruction.</t>

          <t>Send another packet through the same segment with a different
          per-segment service instruction.</t>

          <t>Send another packet through the same segment without any
          per-segment service instructions.</t>
        </list>Likewise, per-path service instructions augment, but do not
      determine, paths.</t>

      <figure align="center" anchor="figRefTopo"
              title="Paths, Segments And Instructions">
        <artwork><![CDATA[  ----      ----      ----      ----      ----      ----
 |Node|----|Node|----|Node|----|Node|----|Node|----|Node|
 | A  |    | B  |    | C  |    | D  |    | E  |    | F  |
  ----      ----      ----      ----      ----      ----
    |                   |         |                   |         
     -------------------|         |-------------------|
        Segment A-C     |---------|    Segment D-F
                        Segment C-D
    |                                                 |
     -------------------------------------------------
                          SRm6 Path 
]]></artwork>
      </figure>

      <t><xref target="figRefTopo"/> depicts an SRm6 path. The path provides
      unidirectional connectivity from its ingress node (i.e., Node A) to its
      egress node (i.e., Node F). It contains Segment A-C, Segment C-D and
      Segment D-F.</t>

      <t>In Segment A-C, Node A is the ingress node, Node B is a transit node,
      and Node C is the egress node. Therefore, the topological instruction
      that controls the segment is executed on Node A, while per-segment
      service instructions that augment the segment (if any exist) are
      executed on Node C.</t>

      <t>In Segment C-D, Node C is the ingress node and Node D is the egress
      node. Therefore, the topological instruction that controls the segment
      is executed on Node C, while per-segment service instructions that
      augment the segment (if any exist) are executed on Node D.</t>

      <t>In Segment D-F, Node D is the ingress node, Node E is a transit node,
      and Node F is the egress node. Therefore, the topological instruction
      that controls the segment is executed on Node D, while per-segment
      service instructions that augment the segment (if any exist) are
      executed on Node F.</t>

      <t>Node F is also the path egress node. Therefore, if a per-path service
      instruction augments the path, it is executed on Node F.</t>

      <t>Segments A-C, C-D and D-F are also contained by other paths that are
      not included in the figure.</t>
    </section>

    <section anchor="sectSegs" title="Segment Types">
      <t>SRm6 supports the following segment types:</t>

      <t><list style="symbols">
          <t>Adjacency.</t>

          <t>Node.</t>

          <t>Binding.</t>
        </list></t>

      <t>Adjacency segments forward packets through a specified link that
      connects the segment ingress node to the segment egress node. Node
      segments forward packets through the least cost path from the segment
      ingress node to the segment egress node. Binding segments facilitate
      recursive application of SRm6. They cause SRm6 paths to be nested in a
      hierarchy.</t>

      <t>Each segment type is described below.</t>

      <section title="Adjacency Segments">
        <t>When a packet is submitted to an adjacency segment, the topological
        instruction associated with that segment operates upon the packet. The
        topological instruction executes on the segment ingress node and
        receives the following parameters:</t>

        <t><list style="symbols">
            <t>An IPv6 address that identifies an interface on the segment
            egress node.</t>

            <t>An interface identifier.</t>
          </list></t>

        <t>The topological instruction behaves as follows:</t>

        <t><list style="symbols">
            <t>If the interface that was received as a parameter is not
            operational, discard the packet and send an <xref
            target="RFC4443">ICMPv6</xref> Destination Unreachable message
            (Code: 5, Source Route Failed) to the packet's source node.</t>

            <t>Overwrite the packet's Destination Address with the IPv6
            address that was received as a parameter.</t>

            <t>Forward the packet through the above-mentioned interface.</t>
          </list>For further processing details, see <xref
        target="I-D.bonica-6man-comp-rtg-hdr"/>.</t>
      </section>

      <section title="Node Segments">
        <t>When a packet is submitted to a node segment, the topological
        instruction associated with that segment operates upon the packet. The
        topological instruction executes on the segment ingress node and
        receives an IPv6 address as a parameter. The IPv6 address identifies
        an interface on the segment egress node.</t>

        <t>The topological instruction behaves as follows:</t>

        <t><list style="symbols">
            <t>If the segment ingress node does not have a viable route to the
            IPv6 address received as a parameter, discard the packet and send
            an ICMPv6 Destination Unreachable message (Code:1 Net Unreachable)
            to the packet's source node.</t>

            <t>Overwrite the packet's Destination Address with the destination
            address that was received as a parameter.</t>

            <t>Forward the packet to the next hop along the least cost path to
            the segment egress node. If there are multiple least cost paths to
            the segment egress node (i.e., Equal Cost Multipath), execute
            procedures so that all packets belonging to a flow are forwarded
            through the same next hop.</t>
          </list>For further processing details, see <xref
        target="I-D.bonica-6man-comp-rtg-hdr"/>.</t>
      </section>

      <section title="Binding Segments">
        <t>When a packet is submitted to a binding segment, the topological
        instruction associated with that segment operates upon the packet. The
        topological instruction executes on the segment ingress node and
        receives the following parameters:</t>

        <t><list style="symbols">
            <t>An IPv6 address.</t>

            <t>A SID list length.</t>

            <t>A SID list.</t>
          </list></t>

        <t>The topological instruction behaves as follows:<list
            style="symbols">
            <t>If the segment ingress node does not have a viable route to the
            IPv6 address received as a parameter, discard the packet and send
            an ICMPv6 Destination Unreachable message (Code:1 Net Unreachable)
            to the packet's source node.</t>

            <t>Prepend a <xref
            target="I-D.bonica-6man-comp-rtg-hdr">Compressed Routing Header
            (CRH) </xref> to the packet. Copy the SID list length, received as
            a parameter, to the CRH Segments Left field. Also copy the SID
            list, received as a parameter, to the CRH SID list.</t>

            <t>Prepend an IPv6 header to the packet. Copy the IPv6 address,
            received as a parameter, to the IPv6 Destination Address.</t>

            <t>Forward the packet to the next hop along the least cost path to
            the IPv6 address received as a parameter. If there are multiple
            least cost paths to the IPv6 address received as a parameter
            (i.e., Equal Cost Multipath), execute procedures so that all
            packets belonging to a flow are forwarded through the same next
            hop.</t>
          </list></t>

        <t>For further processing details, see <xref
        target="I-D.bonica-6man-comp-rtg-hdr"/>.</t>
      </section>
    </section>

    <section anchor="sectSID" title="Segment Identifiers (SID)">
      <t>A Segment Identifier (SID) is an unsigned integer that identifies a
      segment. Because there is a one-to-one relationship between segments and
      the topological instructions that control them, the SID that identifies
      a segment also identifies the topological instruction that controls
      it.</t>

      <t>A SID is different from the topological instruction that it
      identifies. While a SID identifies a topological instruction, it does
      not contain the topological instruction that it identifies. Therefore, a
      SID can be encoded in relatively few bits, while the topological
      instruction that it identifies may require many more bits for
      encoding.</t>

      <t>SIDs have node-local significance. This means that a segment ingress
      node MUST identify each segment that it originates with a unique SID.
      However, a SID that is used by one segment ingress node to identify a
      segment that it originates can be used by another segment ingress node
      to identify another segment. For example, SID S can identify both of the
      following:</t>

      <t><list style="symbols">
          <t>A segment whose ingress is Node A and whose egress is Node Z.</t>

          <t>Another segment whose ingress is Node B and whose egress is also
          node Z.</t>
        </list></t>

      <t>Although SIDs have node-local significance, an SRm6 path can be
      uniquely identified by its ingress node and an ordered sequence of SIDs.
      This is because the topological instruction associated with each segment
      determines the ingress node of the next segment (i.e., the node upon
      which the next SID has significance.)</t>

      <t>SIDs can be assigned in a manner that simplifies network operations.
      See <xref target="sectSRSID"/> and <xref target="SectLRSID"/> for
      details.</t>

      <section anchor="sectRange" title="Range">
        <t>SID values range from 0 to a configurable Maximum SID Value (MSV).
        The values 0 through 15 are reserved for future use. The following are
        valid MSVs:</t>

        <t><list style="symbols">
            <t>65,535 (i.e., 2**16 minus 1).</t>

            <t>4,294,967,295 (i.e., 2**32 minus 1).</t>
          </list>In order to optimize <xref target="sectRtgHdr">packet
        encoding </xref>, network operators can configure all nodes within an
        SRm6 domain to have the smallest feasible MSV. The following
        paragraphs explain how an operator determines the smallest feasible
        MSV.</t>

        <t>Consider an SRm6 domain that contains 5,000 nodes connected to one
        another by point-to-point infrastructure links. The network topology
        is not a full-mesh. In fact, each node supports 200 point-to-point
        infrastructure links or fewer. Given this SRm6 domain, we will
        determine the smallest feasible MSV under the following
        conditions:</t>

        <t><list style="symbols">
            <t>The SRm6 domain contains adjacency segments only.</t>

            <t>The SRm6 domain contains node segments only.</t>

            <t>The SRm6 domain contains both adjacency and node segments.</t>
          </list>If an SRm6 domain contains adjacency segments only, and each
        node creates a adjacency segment to each of its neighbors, each node
        will create 200 segments or fewer and consume 200 SIDs or fewer. This
        is because each node has 200 neighbors or fewer. Because SIDs have
        node-local significance (i.e., they can be reused across nodes), the
        smallest feasible MSV is 65,535.</t>

        <t>Adding nodes to this SRm6 domain will not increase the smallest
        feasible MSV, so long as each node continues to support 65,519
        point-to-point infrastructure links or fewer. If a single node is
        added to the domain and that node supports 65,520 infrastructure
        links, the smallest feasible MSV will increase to 4,294,967,295.</t>

        <t>If an SRm6 domain contains node segments only, and every node
        creates a node segment to every other node, every node will create
        4,999 segments and consume 4,999 SIDs. This is because the domain
        contains 5,000 nodes. Because SIDs have node-local significance (i.e.,
        they can be reused across nodes), the smallest feasible MSV is
        65,535.</t>

        <t>Adding nodes to this SRm6 domain will not increase the smallest
        feasible MSV until the number of nodes exceeds 65,519. When the
        smallest feasible MSV increases, it becomes 4,294,967,295.</t>

        <t>If an SRm6 domain contains both adjacency and node segments, each
        node will create 5,199 segments or fewer and consume 5,199 SIDs or
        fewer. This value is the sum of the following:</t>

        <t><list style="symbols">
            <t>The number of node segments that each node will create, given
            that every node creates a node segment to every other node (i.e.,
            4,999).</t>

            <t>The number of adjacency segments that each node will create,
            given that each node creates a adjacency segment to each of its
            neighbors (i.e., 200 or fewer).</t>
          </list>Because SIDs have node-local significance (i.e., they can be
        reused across nodes), the smallest feasible MSV is 65,535.</t>

        <t>Adding nodes to this SRm6 domain will not increase the smallest
        feasible MSV until the number of nodes plus the maximum number of
        infrastructure links per node exceeds 65,519. When the smallest
        feasible MSV increases, it becomes 4,294,967,295.</t>
      </section>

      <section anchor="sectSRSID"
               title="Assigning SIDs to Adjacency  Segments">
        <t>Network operators can establish conventions by which they assign
        SIDs to adjacency segments. These conventions can simplify network
        operations.</t>

        <t>For example, a network operator can reserved a range of SIDs for
        adjacency segments. It can further divide that range into subranges,
        so that all segments sharing a common egress node are identified by
        SIDs from the same subrange.</t>
      </section>

      <section anchor="SectLRSID" title="Assigning SIDs to Node Segments">
        <t>In order to simplify network operations, all node segments that
        share a common egress node are identified by the same SID. In order to
        maintain this discipline, network wide co-ordination is required.</t>

        <t>For example, assume that an SRm6 domain contains N nodes. Network
        administrators reserve a block of N SIDs and configure one of those
        SIDs on each node. Each node advertises its SID into the control
        plane. When another node receives that advertisement, it creates a
        node segment between itself and the advertising node. It also
        associates the SID that it received in the advertisement with the
        newly created segment. See <xref
        target="I-D.bonica-lsr-crh-isis-extensions"/> for details.</t>
      </section>

      <section anchor="sectSRSID1" title="Assigning SIDs to Binding  Segments">
        <t>Network operators can establish conventions by which they assign
        SIDs to binding segments. These conventions can simplify network
        operations.</t>

        <t>For example, a network operator can reserve a range of SIDs for
        binding segments. It can further divide that range into subranges, so
        that all segments sharing a common egress node are identified by SIDs
        from the same subrange.</t>
      </section>
    </section>

    <section anchor="SectServiceInstructions" title="Service Instructions">
      <t>SRm6 supports the following service instruction types:</t>

      <t><list style="symbols">
          <t>Per-segment.</t>

          <t>Per-path.</t>
        </list>Each is described below.</t>

      <section title="Per-Segment">
        <t>Per-segment service instructions can augment a segment. Per-segment
        service instructions, if present, are executed on the segment egress
        node. Because the path egress node is also a segment egress node, it
        can execute per-segment service instructions.</t>

        <t>The following are examples of per-segment service instructions:</t>

        <t><list style="symbols">
            <t>Expose a packet to a firewall policy.</t>

            <t>Expose a packet to a sampling policy.</t>
          </list>Per-segment Service Instruction Identifiers identify a set of
        service instructions. Per-segment Service Instruction Identifiers are
        allocated and distributed by a controller. They have domain-wide
        significance.</t>
      </section>

      <section title="Per-Path">
        <t>A per-path service instruction can augment a path. The per-path
        service instruction, if present, is executed on the path egress
        node.</t>

        <t>The following are examples of per-path service instructions:</t>

        <t><list style="symbols">
            <t>De-encapsulate a packet and forward its newly exposed payload
            through a specified interface.</t>

            <t>De-encapsulate a packet and forward its newly exposed payload
            using a specified routing table.</t>
          </list>Per-path Service Instruction Identifiers identify per-path
        service instructions. Per-path Service Instruction Identifiers are
        allocated and distributed by the processing node (i.e., the path
        egress node). They have node-local significance. This means that the
        path egress node MUST allocate a unique Per-path Service Instruction
        Identifier for each per-path service instruction that it
        instantiates.</t>
      </section>
    </section>

    <section anchor="sectEncode" title="The IPv6 Data Plane">
      <t>SRm6 ingress nodes generate IPv6 header chains that represent SRm6
      paths. An IPv6 header chain contains an IPv6 header. It can also contain
      one or more extension headers.</t>

      <t>An extension header chain that represents an SRm6 path can contain
      any valid combination of IPv6 extension headers. The following bullet
      points describe how SRm6 leverages IPv6 extension headers:</t>

      <t><list style="symbols">
          <t>If an SRm6 path contains multiple segments, the IPv6 header chain
          that represents it MUST contain a Routing header. The SRm6 path MUST
          be encoded in the Routing header as an ordered sequence of SIDs.</t>

          <t>If an SRm6 path is augmented by a per-path service instruction,
          the IPv6 header chain that represents it MUST contain a Destination
          Options header. The Destination Options header MUST immediately
          precede an upper-layer header and it MUST include a Per-Path Service
          Instruction Identifier.</t>

          <t>If an SRm6 path contains a segment that is augmented by a
          per-segment service instruction, the IPv6 chain that represents it
          MUST contain a Routing header and a Destination Options header. The
          Destination Options header MUST immediately precede a Routing header
          and it MUST include the Per-Segment Service Instruction
          Identifier.</t>
        </list>The following subsections describe how SRm6 uses the Routing
      header and the Destination Options header.</t>

      <section anchor="sectRtgHdr" title="The Routing Header">
        <t>SRm6 defines two new Routing header types. Generically, they are
        called the <xref target="I-D.bonica-6man-comp-rtg-hdr">Compressed
        Routing Header (CRH) </xref>. More specifically, the 16-bit version of
        the CRH is called the CRH-16, while the 32-bit version of the CRH is
        called the CRH-32.</t>

        <t>Both CRH versions contain the following fields:</t>

        <t><list style="symbols">
            <t>Next Header - Identifies the header immediately following the
            CRH.</t>

            <t>Hdr Ext Len - Length of the CRH.</t>

            <t>Routing Type - Identifies the Routing header variant (i.e.,
            CRH-16 or CRH-32).</t>

            <t>Segments Left - The number of segments still to be traversed
            before reaching the path egress node.</t>

            <t>SID List - Represents the SRm6 path as an ordered list of SIDs.
            SIDs are listed in reverse order, with SID[0] representing the
            final segment, SID[1] representing the penultimate segment, and so
            forth. SIDs are listed in reverse order so that Segments Left can
            be used as an index to the SID List. The SID indexed by Segments
            Left is called the current SID.</t>
          </list></t>

        <t>In the CRH-16, each SID list entry is encoded in 16-bits. In the
        CRH-32, each SID list entry is encoded in 32-bits. In networks where
        the <xref target="sectRange">smallest feasible MSV</xref> is greater
        than 65,635, CRH-32 is required. Otherwise, CRH-16 is preferred.</t>

        <t>As per <xref target="RFC8200"/>, when an IPv6 node receives a
        packet, it examines the packet's destination address. If the
        destination address represents an interface belonging to the node, the
        node processes the next header. If the node encounters and recognizes
        the CRH, it processes the CRH as follows:</t>

        <t><list style="symbols">
            <t>If Segments Left equal 0, skip over the CRH and process the
            next header in the packet.</t>

            <t>Decrement Segments Left.</t>

            <t>Search for the current SID in a local table that maps SID's to
            topological instructions. If the current SID cannot be found in
            that table, send an ICMPv6 Parameter Problem message to the
            packet's Source Address and discard the packet.</t>

            <t>Execute the topological instruction found in the table as
            described in <xref target="sectSegs"/>. This causes the packet to
            be forwarded to the segment egress node.</t>
          </list>When the packet arrives at the segment egress node, the
        above-described procedure is repeated. For further processing details,
        see <xref target="I-D.bonica-6man-comp-rtg-hdr"/>.</t>
      </section>

      <section title="The Destination Options Header">
        <t>According to <xref target="RFC8200"/>, the Destination Options
        header contains one or more IPv6 options. It can occur twice within a
        packet, once before a Routing header and once before an upper-layer
        header. The Destination Options header that occurs before a Routing
        header is processed by the first destination that appears in the IPv6
        Destination Address field plus subsequent destinations that are listed
        in the Routing header. The Destination Options header that occurs
        before an upper-layer header is processed by the packet's final
        destination only.</t>

        <t>Therefore, SRm6 defines the following new IPv6 options:</t>

        <t><list style="symbols">
            <t>The <xref target="I-D.bonica-6man-seg-end-opt">SRm6 Per-Segment
            Service Instruction Option </xref></t>

            <t>The <xref target="I-D.bonica-6man-vpn-dest-opt">SRm6 Per-Path
            Service Instruction Option</xref></t>
          </list>The SRm6 Per-Segment Service Instruction Option is encoded in
        a Destination Options header that precedes the CRH. Therefore, it is
        processed by every segment egress node. It includes a Per-Segment
        Service Instruction Identifier and causes segment egress nodes to
        execute per-segment service instructions.</t>

        <t>The SRm6 Per-Path Service Instruction Option is encoded in a
        Destination Options header that precedes the upper-layer header.
        Therefore, it is processed by the path egress node only. It includes a
        Per-Path Service Instruction Identifier and causes the path egress
        node to execute a per-path service instruction.</t>
      </section>
    </section>

    <section title="Control Plane">
      <t><xref target="I-D.bonica-lsr-crh-isis-extensions">IS-IS extensions
      </xref> have been defined for the following purposes:<list
          style="symbols">
          <t>So that SRm6 segment ingress nodes can flood information
          regarding adjacency segments that they originate.</t>

          <t>So that SRm6 segment egress nodes can flood information regarding
          node segments that they terminate.</t>
        </list><xref target="I-D.ssangli-idr-bgp-vpn-srv6-plus">BGP
      extensions</xref> are defined so that SRm6 path egress nodes can
      associate path-terminating service instructions with Network Layer
      Reachability Information (NLRI). Additional <xref
      target="I-D.alston-spring-crh-bgp-signalling">BGP extensions</xref> are
      defined so that SIDs can be mapped to the IPv6 addresses that they
      represent.</t>
    </section>

    <section anchor="sectDifference"
             title="Differences Between SRv6 and SRv6+">
      <section title="Routing Header Size">
        <t>SRv6 defines a Routing header type, called the Segment Routing
        Header (SRH). The SRH contains a field that represents the SRv6 path
        as an ordered sequence of SIDs. Each SID contained by that field is
        128 bits long.</t>

        <t>Likewise, SRm6 defines two Routing Header Types, called CRH-16 and
        CRH-32. Both contain a field that represents the SRv6 path as an
        ordered sequence of SIDs. In the CRH-16, each SID is 16 bits long. In
        the CRH-32, each SID is 32 bits long.</t>

        <texttable align="center" anchor="tabRHSize" style="full"
                   title="Routing Header Size (in Bytes) As A Function Of Routing Header Type and Number Of SIDs">
          <ttcol align="center">SIDs</ttcol>

          <ttcol align="center">SRv6 SRH (128-bit SID)</ttcol>

          <ttcol align="center">SRm6 CRH-16</ttcol>

          <ttcol align="center">SRm6 CRH-32</ttcol>

          <c>1</c>

          <c>24</c>

          <c>8</c>

          <c>8</c>

          <c>2</c>

          <c>40</c>

          <c>8</c>

          <c>16</c>

          <c>3</c>

          <c>56</c>

          <c>16</c>

          <c>16</c>

          <c>4</c>

          <c>72</c>

          <c>16</c>

          <c>24</c>

          <c>5</c>

          <c>88</c>

          <c>16</c>

          <c>24</c>

          <c>6</c>

          <c>104</c>

          <c>16</c>

          <c>32</c>

          <c>7</c>

          <c>120</c>

          <c>24</c>

          <c>32</c>

          <c>8</c>

          <c>136</c>

          <c>24</c>

          <c>40</c>

          <c>9</c>

          <c>152</c>

          <c>24</c>

          <c>40</c>

          <c>10</c>

          <c>168</c>

          <c>24</c>

          <c>N/A</c>

          <c>11</c>

          <c>184</c>

          <c>32</c>

          <c>N/A</c>

          <c>12</c>

          <c>200</c>

          <c>32</c>

          <c>N/A</c>

          <c>13</c>

          <c>216</c>

          <c>32</c>

          <c>N/A</c>

          <c>14</c>

          <c>232</c>

          <c>32</c>

          <c>N/A</c>

          <c>15</c>

          <c>248</c>

          <c>40</c>

          <c>N/A</c>

          <c>16</c>

          <c>264</c>

          <c>40</c>

          <c>N/A</c>

          <c>17</c>

          <c>280</c>

          <c>40</c>

          <c>N/A</c>

          <c>18</c>

          <c>296</c>

          <c>40</c>

          <c>N/A</c>
        </texttable>

        <t/>

        <t><xref target="tabRHSize"> </xref> reflects Routing header size as a
        function of Routing header type and number of SIDs contained by the
        Routing header. Due to their relative immaturity, <xref
        target="I-D.filsfils-spring-net-pgm-extension-srv6-usid"/>, <xref
        target="I-D.li-spring-compressed-srv6-np"/> and <xref
        target="I-D.mirsky-6man-unified-id-sr"/> are omitted from this
        analysis.</t>

        <t>Large Routing headers are undesirable for the following
        reasons:</t>

        <t><list style="symbols">
            <t>Many ASIC-based forwarders copy the entire IPv6 extension
            header chain from buffer memory to on-chip memory. As the size of
            the IPv6 extension header chain increases, so does the cost of
            this copy.</t>

            <t>Because <xref target="RFC8201">Path MTU Discovery
            (PMTUD)</xref> is not entirely reliable, many IPv6 hosts refrain
            from sending packets larger than the IPv6 minimum link MTU (i.e.,
            1280 bytes). When packets are small, the overhead imposed by large
            Routing headers becomes pronounced.</t>
          </list></t>
      </section>

      <section title="Decoupling of Topological and Service Instructions">
        <t>SRm6 decouples topological instructions from service instructions.
        Topological instructions are invoked at the segment ingress node, as a
        result of CRH processing, while service instructions are invoked at
        the segment egress node, as a result of Destination Option processing.
        Therefore, network operators can use SRm6 mechanisms to support
        topological instructions, service instructions, or both.</t>

        <figure align="center" anchor="figEVPNEx"
                title="EVPN Design Alternatives">
          <artwork><![CDATA[        
               ----------           ----------          ----------    
              | Ethernet |         | Ethernet |        | Ethernet |
               ----------           ----------          ----------    
 Service      |  VXLAN   |         |  Dest    |        |   Dest   |
 Instruction   ----------          |          |        |          |
              |   UDP    |         |  Option  |        |  Option  |
               ----------           ----------          ----------
 Topological  |                    |          |        |          |
 Instructions |   CRH    |         |          |        |    CRH   |
               ----------          |          |         ----------
              |   IPv6   |         |   IPv6   |        |   IPv6   |
               ----------           ----------          ----------

               Option 1             Option 2             Option 3    
]]></artwork>
        </figure>

        <t><xref target="figEVPNEx"/> illustrates this point by depicting
        design options available to network operators offering <xref
        target="RFC7432">Ethernet Virtual Private Network </xref> services
        over <xref target="RFC7348">Virtual eXtensible Local Area Network
        (VXLAN) </xref>. In Option 1, the network operator encodes topological
        instructions in the CRH, while encoding service instructions in a
        VXLAN header. In Option 2, the network operator encodes service
        instructions in a Destination Options header, while allowing traffic
        to traverse the least cost path between the ingress and egress
        Provider Edge (PE) routers. In Option 3, the network operator encodes
        topological instructions in the CRH, and encodes service instructions
        in a Destination Options header.</t>
      </section>

      <section title="Authentication">
        <t>The <xref target="RFC4302">IPv6 Authentication Header (AH) </xref>
        can be used to authenticate SRm6 packets. However, AH processing is
        not defined in SRv6.</t>
      </section>

      <section title="Traffic Engineering Capability">
        <t>SRm6 supports traffic engineering solutions that rely exclusively
        upon adjacency segments. For example, consider an SRm6 network whose
        diameter is 12 hops and whose minimum feasible MSV is 65,525. In that
        network, in the worst case, SRm6 overhead is 72 bytes (i.e., a 40-byte
        IPv6 header and a 32-byte CRH-16).</t>

        <t>SRv6 also supports traffic engineering solutions that rely
        exclusively upon adjacency segments (i.e., END.X SIDs). However, SRv6
        overhead may be prohibitive. For example, consider an SRv6 network
        whose diameter is 12 hops. In the worst case, SRv6 overhead is 240
        bytes (i.e., a 40 byte IPv6 header and a 200-byte SRH).</t>
      </section>

      <section title="IP Addressing Architecture">
        <t>In SRv6, an IPv6 address can represent either of the following:</t>

        <t><list style="symbols">
            <t>A network interface</t>

            <t>An instruction instantiated on a node (i.e., an SRv6 SID)</t>
          </list></t>

        <t>In SRm6 an IPv6 address always represents a network interface, as
        per <xref target="RFC4291"/>.</t>
      </section>
    </section>

    <section title="Compliance">
      <t>In order to be compliant with this specification, an SRm6
      implementation MUST:</t>

      <t><list style="symbols">
          <t>Be able to process IPv6 options as described in Section 4.2 of
          <xref target="RFC8200"/>.</t>

          <t>Be able to process the Routing header as described in Section 4.4
          of <xref target="RFC8200"/>.</t>

          <t>Be able to process the Destination Options header as described in
          Section 4.6 of <xref target="RFC8200"/>.</t>

          <t>Support the CRH-16 and the CRH-32</t>
        </list>Additionally, an SRm6 implementation MAY:</t>

      <t><list style="symbols">
          <t>Recognize the Per-Segment Service Instruction Option.</t>

          <t>Recognize the Per-Path Service Instruction Option.</t>
        </list></t>
    </section>

    <section title="Operational Considerations">
      <t/>

      <section title="Ping and Traceroute">
        <t><xref target="RFC2151">Ping and Traceroute </xref> both operate
        correctly in SRm6 (i.e., in the presence of the CRH).</t>
      </section>

      <section title="ICMPv6 Rate Limiting">
        <t>As per <xref target="RFC4443"/>, SRm6 nodes rate limit the ICMPv6
        messages that they emit.</t>
      </section>
    </section>

    <section anchor="IANA" title="IANA Considerations">
      <t>SID values 0-15 are reserved for future use. They may be assigned by
      IANA, based on IETF Consensus.</t>

      <t>IANA is requested to establish a "Registry of SRm6 Reserved SIDs".
      Values 0-15 are reserved for future use.</t>
    </section>

    <section anchor="Security" title="Security Considerations">
      <t>SRm6 domains MUST NOT span security domains. In order to enforce this
      requirement, security domain edge routers MUST do one of the
      following:</t>

      <t><list style="symbols">
          <t>Discard all inbound SRm6 packets whose IPv6 destination address
          represents domain infrastructure.</t>

          <t><xref target="RFC4302">Authenticate </xref> <xref
          target="RFC4303"/> all inbound SRm6 packets whose IPv6 destination
          address represents domain infrastructure.</t>
        </list></t>
    </section>

    <section anchor="Acknowledgements" title="Acknowledgements">
      <t>The authors wish to acknowledge Dr. Vanessa Ameen, Reji Thomas, Parag
      Kaneriya, Rejesh Shetty, Nancy Shaw, and John Scudder.</t>
    </section>
  </middle>

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

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

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

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

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

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

      <?rfc include='reference.I-D.bonica-6man-comp-rtg-hdr'?>

      <?rfc include='reference.I-D.ssangli-idr-bgp-vpn-srv6-plus'?>

      <?rfc include='reference.I-D.bonica-6man-seg-end-opt'?>

      <?rfc include='reference.I-D.bonica-6man-vpn-dest-opt'?>

      <?rfc include='reference.I-D.bonica-lsr-crh-isis-extensions'?>

      <?rfc include='reference.I-D.alston-spring-crh-bgp-signalling'?>
    </references>

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

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

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

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

      <?rfc include='reference.I-D.ietf-spring-segment-routing-mpls'?>

      <?rfc include='reference.I-D.ietf-spring-srv6-network-programming'?>

      <?rfc include='reference.I-D.ietf-6man-segment-routing-header'?>

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

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

      <?rfc include='reference.I-D.li-spring-compressed-srv6-np'?>

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

      <?rfc include='reference.I-D.mirsky-6man-unified-id-sr'?>

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