<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
  <!ENTITY I-D.ietf-mpls-mna-fwk SYSTEM
    "https://xml2rfc.tools.ietf.org/public/rfc/bibxml3/reference.I-D.ietf-mpls-mna-fwk.xml"> 
  <!ENTITY I-D.ietf-mpls-mna-requirements SYSTEM 
    "https://xml2rfc.tools.ietf.org/public/rfc/bibxml3/reference.I-D.ietf-mpls-mna-requirements.xml">
  <!ENTITY I-D.ietf-mpls-mna-usecases SYSTEM 
    "https://xml2rfc.tools.ietf.org/public/rfc/bibxml3/reference.I-D.ietf-mpls-mna-usecases.xml">
  <!ENTITY RFC2119 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml">
  <!ENTITY RFC3032 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.3032.xml">
  <!ENTITY RFC3443 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.3443.xml">
  <!ENTITY RFC8126 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8126.xml">
  <!ENTITY RFC7942 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.7942.xml">
  <!ENTITY RFC4385 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.4385.xml">
  <!ENTITY RFC5462 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.5462.xml">
  <!ENTITY RFC5586 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.5586.xml">
  <!ENTITY RFC6291 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.6291.xml">
  <!ENTITY RFC8664 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8664.xml">
  <!ENTITY RFC8174 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml">
  <!ENTITY RFC9017 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.9017.xml">
  <!ENTITY RFC9613 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.9613.xml">
]>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" submissionType="IETF" docName="draft-ietf-mpls-mna-hdr-08" category="std" ipr="trust200902" obsoletes="" updates="" xml:lang="en" sortRefs="false" symRefs="true" tocInclude="true" version="3" consensus="true">
  <!-- xml2rfc v2v3 conversion 3.12.0 -->
  <!-- Generated by id2xml 1.5.0 on 2020-03-06T17:47:05Z -->
    <front>
    <title abbrev="MNA Sub-Stack Solution">MPLS Network Action (MNA) Sub-Stack Solution</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-mpls-mna-hdr-08"/>
    <author fullname="Jaganbabu Rajamanickam" initials="J." role="editor" surname="Rajamanickam">
      <organization>Cisco Systems, Inc.</organization>
      <address>
        <postal>
          <street>Canada</street>
        </postal>
        <email>jrajaman@cisco.com</email>
      </address>
    </author>
    <author fullname="Rakesh Gandhi" initials="R." role="editor" surname="Gandhi">
      <organization>Cisco Systems, Inc.</organization>
      <address>
        <postal>
          <street>Canada</street>
        </postal>
        <email>rgandhi@cisco.com</email>
      </address>
    </author>
    <author fullname="Royi Zigler" initials="R." surname="Zigler">
      <organization>Broadcom</organization>
      <address>
        <email>royi.zigler@broadcom.com</email>
      </address>
    </author>

    <author fullname="Haoyu Song" initials="H." surname="Song">
      <organization>Futurewei Technologies</organization>
      <address>
        <email>haoyu.song@futurewei.com</email>
      </address>
    </author>

    <author fullname="Kireeti Kompella" initials="K." surname="Kompella">
      <organization>Juniper Networks</organization>
      <address>
     <postal>
          <street>United States</street>
        </postal>
        <email>kireeti.ietf@gmail.com</email>
      </address>
    </author>

    <date year="2024"/>
    <workgroup>MPLS Working Group</workgroup>
    <abstract>
      <t>
    This document defines the MPLS Network Action (MNA) sub-stack
    solution for carrying Network Actions and Ancillary Data
    in the label stack. MPLS Network Actions can be used to
    influence packet forwarding decisions, carry additional Operations, Administration, and Maintenance (OAM)
    information in the MPLS packet or perform user-defined
    operations. This solution document specifies In-stack network action and In-stack data (ISD) specific 
    requirements found in "Requirements for MPLS Network Actions". 
    This document follows the architectural framework for the MPLS Network Actions (MNA) technologies specified in "MPLS Network Actions (MNA) Framework".
      </t>
    </abstract>
    </front>
    <middle>
      <section anchor="sect-1" numbered="true" toc="default">
    <name>Introduction</name>
    <t>
      <xref target="RFC3032" format="default"/> defines the
      encoding of the MPLS label stack, the basic structure used
      to define a forwarding path. Forthcoming applications
      require MPLS packets to perform special network actions and
      carry optional Ancillary Data (AD) that can affect the
      packet forwarding decision or trigger Operations, Administration, and Maintenance (OAM) logging, for
      example.  Ancillary Data can be used to carry additional
      information, such as a network slice identifier or an
      entropy value for load-balancing.  Several MNA applications
      are described in <xref target="I-D.ietf-mpls-mna-usecases"
      format="default"/>. User-defined network actions allow new,
      local actions to be defined.
    </t>
    <t>
      Network actions can be encoded with or without Ancillary Data (AD),
      either in the label stack or after the label stack.  
      This solution document specifies In-stack network action and In-stack data (ISD) specific requirements found in 
      <xref target="I-D.ietf-mpls-mna-requirements" format="default"/>.  
      </t>

          <t>
        This document defines the syntax
      and semantics of network actions and ancillary data encoded in an
      MPLS Label Stack.  In-stack actions and ancillary data are contained
      in a Network Action Sub-Stack (NAS), which is recognized by a new
        base Special Purpose Label (bSPL). 
          This document follows the 
      framework specified in <xref target="I-D.ietf-mpls-mna-fwk"
      format="default"/>.
      </t>

    </section>
    <section anchor="sect-2" numbered="true" toc="default">
      <name>Conventions Used in This Document</name>
      <section anchor="sect-2.1" numbered="true" toc="default">
        <name>Requirements Language</name>
        <t>
      The key words "MUST", "MUST NOT", "REQUIRED", "SHALL",
      "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY",
      and "OPTIONAL" in this document are to be interpreted as
      described in <xref target="RFC2119" format="default"/> <xref
      target="RFC8174" format="default"/> when, and only when,
      they appear in all capitals, as shown here.
    </t>
      </section>
    <section anchor="sect-2.2" numbered="true" toc="default">
      <name>Abbreviations</name>

      <t>
    The terminology defined in <xref
    target="I-D.ietf-mpls-mna-fwk" format="default"/> and <xref
    target="I-D.ietf-mpls-mna-requirements" format="default"/> is
    used in this document.
      </t> 

      <table anchor="abbreviations">
    <name>Abbreviations</name>
    <thead>
      <tr>
        <th align='left'>Abbreviation</th>
        <th align='left'>Meaning</th>
        <th align='left'>Reference</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>AD</td>
        <td>Ancillary Data</td>
        <td><xref target="I-D.ietf-mpls-mna-requirements"/></td>
      </tr>
      <tr>
        <td>bSPL</td>
        <td>Base Special Purpose Label</td>
        <td><xref target="RFC9017"/></td>
      </tr>
      <tr>
        <td>BOS</td>
        <td>Bottom Of Stack</td>
        <td><xref target="RFC3032"/></td>
      </tr>
      <tr>
        <td>HBH</td>
        <td>Hop-By-Hop Scope</td>
        <td><xref target="I-D.ietf-mpls-mna-fwk"/></td>
      </tr>
      <tr>
        <td>I2E</td>
        <td>Ingress-To-Egress Scope</td>
        <td><xref target="I-D.ietf-mpls-mna-fwk"/></td>
      </tr>
      <tr>
        <td>IHS</td>
        <td>I2E, HBH, or Select Scope</td>
        <td><xref target="I-D.ietf-mpls-mna-fwk"/>, This document</td>
      </tr>
      <tr>
        <td>ISD</td>
        <td>In-stack Data</td>
        <td><xref target="I-D.ietf-mpls-mna-requirements"/></td>
      </tr>
      <tr>
        <td>LSE</td>
        <td>Label Stack Entry</td>
        <td><xref target="RFC3032"/></td>
      </tr>


      <tr>
        <td>MNA</td>
        <td>MPLS Network Actions</td>
        <td><xref target="I-D.ietf-mpls-mna-fwk"/></td>
      </tr>
      <tr>
        <td>NAI</td>
        <td>Network Action Indicator</td>
        <td><xref target="I-D.ietf-mpls-mna-requirements"/></td>
      </tr>
      <tr>
        <td>NAL</td>
        <td>Network Action Length</td>
        <td>This document</td>
      </tr>
      <tr>
        <td>NAS</td>
        <td>Network Action Sub-Stack</td>
        <td><xref target="I-D.ietf-mpls-mna-fwk"/></td>
      </tr>
      <tr>
        <td>NASI</td>
        <td>Network Action Sub-Stack Indicator</td>
        <td>This document</td>
      </tr>
      <tr>
        <td>NASL</td>
        <td>Network Action Sub-Stack Length</td>
        <td>This document</td>
      </tr>
      <tr>
        <td>OAM</td>
        <td>Operations, Administration, and Maintenance</td>
        <td> <xref target="RFC6291"/></td>
      </tr>

      <tr>
        <td>RLD</td>
        <td>Readable Label Depth </td>
        <td><xref target="I-D.ietf-mpls-mna-fwk"/> </td>
      </tr>

      <tr>
        <td>TC</td>
        <td>Traffic Class</td>
        <td><xref target="RFC5462"/></td>
      </tr>
      <tr>
        <td>TTL</td>
        <td>Time To Live</td>
        <td><xref target="RFC3032"/></td>
      </tr>
    </tbody>
      </table>
    </section>
  </section>

  <section anchor="sect-3" numbered="true" toc="default">
    <name>Overview</name>

    <t>
      The MPLS Network Action Sub-Stack (NAS) is a set of Label Stack
      Entries (LSEs) that appear as part of an MPLS Label Stack and
      serve to encode information about the network actions that
      should be invoked for the packet. Multiple NASes may
      appear in a label stack.
    </t>
    <t>
      This document describes how network actions and their optional ancillary data are encoded as part of an NAS as a stack of LSEs. Mechanisms that allow sharing of ancillary data AD between multiple network actions encoded in the same NAS can be described in other documents and do not rely on any explicit provision in the encodings described in this document.
      
    </t>
  </section>

  <section>
    <name>Label Stack Entry Formats</name>

    <t>
      The NAS uses a variety of different formats of LSEs for
      different purposes. This section describes the syntax of the
      various formats while the overall structure of the NAS and the
      semantics of the various LSEs are described in the sections
      below.
    </t>
    
    <section anchor="LSE-A">
      <name>LSE Format A: The MNA Sub-Stack Indicator</name>

      <t>
    LSE Format A is an LSE as described in <xref
    target="RFC3032"/> and <xref target="RFC5462"/>.
The label value is an IANA-assigned value (TBA) for the MNA bSPL label
from the "Base Special-Purpose MPLS Label Values" registry to
indicate the presence of MNA in the packet and the beginning  an MNA
Sub-Stack in the label stack.

      </t>

      <figure>
        <name>LSE Format A: The MNA Sub-Stack Indicator</name>          
    <artwork name="" type="" align="left" alt=""><![CDATA[
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|      MNA-Label=bSPL (TBA)             | TC  |S|    TTL        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork>
      </figure>

 <ul>
    <li>
      S (1 bit) : The Bottom of Stack <xref target="RFC3032"/>.
      MUST be set to 0 on transmitted packets. If a packet is received with S bit set to 1, then the packet MUST be dropped.
    </li>
  </ul>
    </section>

    <section anchor="LSE-B">
      <name>LSE Format B: The initial opcode</name>
  
      <t>
    LSE Format B is used to encode the first opcode in the NAS,
    plus a number of other fields about the NAS. This LSE cannot carry more than 13 bits of data.
      </t>
      
      <figure>
        <name>LSE Format B: The initial opcode</name>          
    <artwork name="" type="" align="left" alt=""><![CDATA[
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Opcode    |        Data             |R|IHS|S|U|  NASL | NAL |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork>
      </figure>

      <ul>
    <li>
      Opcode (7 bits) : The operation code for this LSE. See
      <xref target="Opcodes"/>.
    </li>
    <li>
         Data (13 bits) : Opcode-specific data. 
    </li>
    <li> 
       R (1 bit) : Reserved bit. This MUST be transmitted as zero and ignored upon receipt. 
    </li>
    <li>
      IHS (2 bits) : The scope of the sub-stack. See <xref
      target="Scope"/>.
    </li>
    <li>
      S (1 bit) : The Bottom of Stack <xref
      target="RFC3032"/>. If NASL value is non-zero, then S bit MUST be 0. 
      If a packet is received with S bit set to 1 and a non-zero NASL value, 
      then the packet MUST be dropped. The encapsulating node MUST ensure that S bit is set to 1 only in the Last LSE.
    </li>
    <li>
      U (1 bit): Unknown Network Action Handling. See <xref
      target="UOH" />.
    </li> 
    <li>
      NASL (4 bits) : The Network Action Sub-Stack Length
      (NASL). The number of additional LSEs in the sub-stack, not
      including the leading Format A LSE and the Format B LSE. 
    </li>
    <li>
      NAL (3 bits): Network Action Length. The number of LSEs of
      additional data, encoded in LSE Format D (<xref
      target="LSE-D"/>) following this LSE. The NAL value MUST be less than or equal to the NASL value in Format B, if not the packet MUST be dropped.
    </li>
      </ul>
      <t>
        NOTE: Format A and B LSEs MUST be present when a Format C or D LSE is to be carried in the NAS. 
      </t>
    </section>

    <section anchor="LSE-C">
      <name>LSE Format C: Subsequent opcodes</name>
      
      <t>
    LSE Format C is used to encode the subsequent opcodes in the
    NAS.
      </t>

      <figure>
        <name>LSE Format C: Subsequent opcodes</name>          
    <artwork name="" type="" align="left" alt=""><![CDATA[
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Opcode    |             Data              |S|U|  Data | NAL |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork>
      </figure>

      <ul>
    <li>Opcode (7 bits) : The operation code for this LSE. See
    <xref target="Opcodes"/>.</li>
    <li>Data (16 bits + 4 bits) : Opcode specific data</li>
    <li>
      S (1 bit) : The Bottom of Stack <xref
      target="RFC3032"/>. If NAL value is non-zero and if S bit is set to 1, then the packet MUST be dropped. If this is not the last LSE in the NAS and if S bit is set to 1 then the packet MUST be dropped. The encapsulating node MUST ensure that S bit is set to 1 only in the Last LSE.

    </li>
    <li>
      U (1 bit): Unknown Network Action Handling. See <xref
      target="UOH" />.
    </li> 
    <li>
      NAL (3 bits): Network Action Length. The number of LSEs of
      additional data, encoded in LSE Format D (<xref
      target="LSE-D"/>) following this LSE. The NAL value MUST be less than or equal to the NASL value in Format B, if not the packet MUST be dropped.
    </li>
      </ul>
    </section>

    <section anchor="LSE-D">
      <name>LSE Format D: Additional Data</name>
      
      <t>
    LSE Format D is used to encode additional data that
    did not fit in the LSE with the preceding opcode.
      </t>
      <figure>
        <name>LSE Format D: Additional Data</name>          
    <artwork name="" type="" align="left" alt=""><![CDATA[
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|1|                   Data                    |S|     Data      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork>
      </figure>

      <ul>
    <li>
      1 (1 bit) : The most significant bit MUST be set. This
      prevents legacy implementations from misinterpreting this
      LSE as containing a special purpose label if the data begins with zeros.
    </li>
    <li>
      S (1 bit) : The Bottom of Stack <xref
      target="RFC3032"/>. If this is not the last LSE for the Network Action based on the NAL value and if S bit is set to 1 then the packet MUST be dropped. If this is not the last LSE in the NAS and if S bit is set to 1 then the packet MUST be dropped. The encapsulating node MUST ensure that the S bit is set to 1 only in the Last LSE.

    </li>
    <li>Data (22 bits + 8 bits) : Opcode specific data</li>
      </ul>
    </section>

  </section>

  <section anchor="sect-3.1" numbered="true" toc="default">
    <name>The MNA Sub-Stack</name>

    <t>
      The MNA Sub-Stack MUST begin with a Format A LSE (<xref
      target="LSE-A"/>). The label field of the LSE contains the MNA bSPL
      (value TBA) to indicate the presence of the MNA Sub-Stack.
    </t> 
    <t>
      The TC and TTL fields of the Format A LSE retain their semantics as 
      defined in <xref target="RFC3032" format="default"/> and 
      <xref target="RFC5462" format="default"/>. The TTL and TC fields in the Format A LSE are copied from the forwarding label at the top of the label stack. 
      

      The penultimate node on the path may copy the TTL
      and TC fields from the preceding LSE to the next LSE on the
      label stack, overwriting the TTL and TC fields of the next LSE,
      as specified in Section 3.5 of <xref target="RFC3443"
      format="default"/>.  If the node performing this copy is not
      aware of MNA, this could overwrite the values in the first LSE
      of the MNA sub-stack.
    </t>

    <t>
      The second LSE in a NAS MUST be a Format B LSE (<xref
      target="LSE-B"/>). This LSE contains an initial opcode plus
      additional fields that describe the NAS.
    </t>

    <t>
      The Format B LSE (<xref target="LSE-B"/>) could optionally carry additional data in 
      Format D (<xref target="LSE-D"/>) LSEs, up to the length encoded
      in the LSE's NAL value. 
    </t>

    <t>
      An NAS MAY contain more Format C (<xref target="LSE-C"/>) and
      Format D (<xref target="LSE-D"/>) LSEs, up to the length encoded
      in the NASL value. All Format D LSEs MUST follow a Format C or B LSE
      and be included in that LSE's NAL value.
    </t>

    <section anchor="Opcodes">
      <name>Opcodes</name>
      <t>
    The opcode is a 7-bit field that indicates the semantics of
    its LSE. Several opcodes are assigned special semantics (<xref
    target="SpecialOpcodes"/>), others act as Network Action
    Indicators and are assigned through IANA (<xref
    target="Allocation"/> and <xref target="IANAOpcodes"/>).
      </t>
    </section>

    <section anchor="Data">
      <name>Data</name>
      <t>
    The data field carries opcode specific data. This is 
    ancillary data for a network action. In the case of opcode 1, data field carries Flag-Based Network Action Indicators without ancillary data.
      </t>
      <t>

    To preserve backward compatibility, if a network action
    encodes data that will change during packet forwarding, then
    that data MUST be in the least significant 4 bits in the data
    field of a Format C LSE (<xref target="LSE-C"/>) or the least
    significant 8 bits of a Format D LSE (<xref
    target="LSE-D"/>). Some legacy implementations may use the
    label field in all LSEs when computing ECMP decisions and
    modifying the label field might disrupt that packet's flow.
      </t>
   <t>
     This is also applicable to opcode 1 Flag-Based Network Action Indicators those need to be changed in flight.

   </t>
    <t>
    If a network action needs to encode more data that might need to change during packet forwarding it will need to use a stack of Format D LSEs (<xref target="LSE-C"/>) (which may be inefficient) or post-stack ancillary  data (which is beyond the scope of this document).
   </t>
    </section>    

    <section anchor="Scope">
      <name>Scope</name>
      <t>
    The IHS field in the Format B LSE indicates the scope of the
    In-stack NAIs encoded in the NAS. Scope defines
    which nodes along the MPLS path should perform the network
    actions found within the NAS.  The specific values of the IHS
    field are as follows:
      </t>
      <table anchor="In-stack-scope-tbl" align="center">
    <name>IHS Scope Values</name>
    <thead>
          <tr>
            <th align="left"> Bits </th>
            <th align="left"> Scope </th>
          </tr>
    </thead>
    <tbody>
          <tr>
            <td align="left">00</td>
            <td align="left">I2E</td>
          </tr>
          <tr>
            <td align="left">01</td>
            <td align="left">HBH</td>
          </tr>
          <tr>
            <td align="left">10</td>
            <td align="left">Select</td>
          </tr>
          <tr>
            <td align="left">11</td>
            <td align="left">Reserved</td>
          </tr>
    </tbody>
      </table>

      <t>
      </t>
      <ul empty="true" spacing="normal">
    <li>
      Ingress To Egress (I2E) - The NAS MUST NOT be processed by any node the except the egress node.
    </li>
    <li>
      Hop-By-Hop (HBH) - All nodes along the path MUST process the NAS.
    </li>
    <li>
      Select - Only specific nodes along the path that brings NAS to top of the stack will perform the action.
    </li>

      </ul>
      <t>
    A single NAS carries only one of the three scopes
    (I2E/HBH/Select). To support multiple scopes for a single
    packet, multiple NASes MAY be included in a single label stack.
      </t>
      <t>
    The egress node is included in the HBH scope. This implies
    that the penultimate node MUST NOT remove a HBH NAS. The
    egress node MAY receive a NAS at the top of the label stack as discussed in <xref target="Allocation "/>.
      </t>
      <t>
     An I2E scope NAS, if present, MUST be encoded after any HBH or Select-scope
    NASes. This makes it easier for the transit nodes to process a
    NAS with HBH or Select scope.
      </t>
    </section>

    <section anchor="UOH">
      <name>Unknown Network Action Handling</name>

      <t>
    The Unknown Network Action Handling (U) field in a Format B LSE
    (<xref target="LSE-B"/>) and Format C LSE (<xref target="LSE-C"/>) is a 1-bit value that defines the action to
    be taken by a node that does not understand an action within
    the NAS. The different types of Unknown Network Action
    Handling actions are defined below. 
      </t>

      <table anchor="UOH-tbl" align="center">
    <name>Unknown Network Action Handling</name>
    <thead>
          <tr>
            <th align="left"> Bit </th>
            <th align="left"> Action </th>
          </tr>
    </thead>
    <tbody>
          <tr>
            <td align="left">0</td>
            <td align="left">Skip to the next NA </td>
          </tr>
          <tr>
            <td align="left">1</td>
            <td align="left">Drop the packet</td>
          </tr>
    </tbody>
      </table>

   <t>
   When a packet with an unknown Network Action is dropped, the node SHOULD maintain a local counter for this event, and MAY send a rate-limited notification to the operator.

   </t>

    </section>

    <section anchor="Ordering">
      <name>Ordering</name>

      <t>
    The network actions encoded in the NAS MUST be processed as if
    they were processed in the order that they appear in the NAS,
    from the top of the NAS to the bottom. NAI encoded as flags (see <xref target="sect-J5.2b" />)
    MUST be processed as if they were processed from the most
    significant bit to the least significant bit. If a label stack 
    contains multiple NASes, then they MUST be processed as if they 
    were processed in the order that they appear in the label stack, 
    subject to the restrictions in <xref target="Placement" />.
      </t>
    </section>

  </section>

  <section anchor="SpecialOpcodes" numbered="true" toc="default">
    <name>Special Opcodes</name>
    <t>
       Below are the special opcodes used to build a basic In-stack MNA solution. In future, additional special opcodes can be defined and their code-points can be assigned from the "Network Action Opcodes" IANA registry.
    </t>
    <section>
      <name>bSPL Protection</name>

      <t>
    Opcode: 0
      </t>
      <t>
    Purpose: Legacy implementations may scan the label stack
    looking for bSPL values. As long as the opcode field is
    non-zero, an LSE cannot be misinterpreted as containing a
    bSPL. Opcode 0 is therefore reserved and is not used.
      </t>
    </section>

    <section anchor="sect-J5.2b" numbered="true" toc="default">
      <name>Flag-Based NAIs without AD</name>
      <t>
    Opcode: 1
      </t>
      <t>
    Purpose: Network actions that do not require Ancillary Data
    do not require an entire LSE. A single flag can be used to
    indicate each of these network actions.
      </t> 
      <t>
    LSE Formats: B, C, D
      </t>
      <t>
    Data: The data field carries Network Action Indicators, which
    should be evaluated from the most significant bit to the least
    significant bit. 
    If this opcode is used with LSE Format B only, then up to 13 flags may be carried.
    If this opcode is used with LSE Format C only, then up to 20 flags may be carried.
    Format D LSEs can be used with format C LSEs to encode more than 20 flags.
    Flags are assigned from the "Network Action Flags
    Without Ancillary Data" registry (<xref
    target="IANAFlags"/>). If flags need to be evaluated in a
    different order, multiple LSEs using this opcode may be used
    to specify the requested order.

      </t>
      <t>
    Scope: This opcode can be used with any scope.
      </t>

    </section>

    <section anchor="sect-J5.2c" numbered="true" toc="default">
      <name>No-Operation Opcode</name>

      <t>
    Opcode: 2
      </t>
      <t>
    Purpose: This opcode is reserved to indicate that this opcode does not perform any Network Action and MUST be skipped. 

 
      </t> 
     <t>
    Scope: Format B.
      </t>

    </section>


    <section anchor="sect-J5.2g" numbered="true" toc="default">
      <name>Extension Opcode</name>

      <t>
    Opcode: 127
      </t>
      <t>
    Purpose: This opcode is reserved to extend the current opcode
    range beyond 127 in future. If this opcode is not supported, then the packet with the opcode 127 MUST be dropped. Use of this opcode is outside the scope of this document.
      </t> 

    </section>

  </section>

  <section anchor="Placement" numbered="true" toc="default">
    <name>NAS placement in the Label Stack</name>

    <t>
      The node adding an NAS to the label stack will need to place a copy
      of the NAS where it can be read by the relevant nodes. Each downstream node
      along the path will have a Readable Label Depth (RLD) <xref target="I-D.ietf-mpls-mna-fwk"/>.
      If the NAS is to be processed by a downstream MNA-capable node, then the entire NAS MUST be placed so that it is within RLD by the time the packet reaches the downstream MNA-capable node and the NAS MUST NOT appear at the top of the stack at any MNA  incapable node on the path. 
    </t>
    <t>
      If the label stack is deep, several copies of the NAS may need
      to be encoded in the label stack.
    </t>

    <t> 
      For a NAS with HBH scope, every node will process the top copy
      of the NAS. 
     </t>



    <t>
      
      For a NAS with Select scope, it is processed by the node that
      brings it to the top of stack and then the NAS is removed from
      the stack. The select-scoped NAS needs to be inserted after the forwarding label 
      and needs to be inserted before the next forwarding label. It could be inserted before 
      or after a HBH NAS.
    </t>

    <t>
      For I2E scope, only one copy of the NAS needs to be added at the
      bottom of the stack.
    </t>

    <t>
   Transit, non-penultimate nodes that pop a forwarding label and expose a copy of a NAS MUST remove it.  
   </t>
   <t>
   A node performing Penultimate Hop Popping (PHP) that pops the forwarding label with only
   the NAS(es) remaining on the stack MUST NOT remove the NAS(es). Instead, it forwards the packet with the NAS(es) at
   the top of stack to the next node.
   </t>
   <t>
   The node that receives the NAS at the top of the label stack MUST remove it.
   </t>

  <section anchor="ActionsWhenPushingLabels" numbered="true" toc="default">
    <name>Actions when Pushing Labels</name>
    <t>
An MNA-capable node may need to push additional labels as well as push new network actions onto a received packet.
    </t> 
    <t>
While pushing additional labels on to the label stack of the receive packet, the MNA-capable node MUST verify that the entire top-most NAS with HBH scope is still within the RLD of the downstream MNA-capable nodes. If required, the MNA-capable node MAY create a copy of the top-most NAS with HBH scope and insert it within the RLD of the downstream MNA-capable nodes on the label stack.
    </t> 
    <t>
When an MNA-capable node needs to push a new NAS with HBH scope on to a received packet that already has an NAS with HBH scope, it SHOULD copy (and merge) the network actions (including their Ancillary Data) from the received top-most NAS with HBH scope in the new NAS with HBH scope. The new NAS MUST be placed within the RLD of the downstream MNA-capable nodes. This behavior can be based on local policy.
    </t> 
    <t>
    The new network actions added MUST NOT conflict with the network actions in the received NAS with HBH scope. The mechanism to resolve such conflicts depend on the network actions and can be based on local policy. The MNA-capable node that pushes entries MUST understand
any network actions which it is pushing which may result in a conflict, and
MUST resolve any conflicts between new and received network actions.  In the
usual case of a conflict of duplicating a network action, the definition of
the network action will generally give guidance on likely resolutions.  
    </t>


  </section>
  </section>

  <section anchor="Signaling" numbered="true" toc="default">
    <name>Node Capability Signaling</name>
      <t> 

      Encapsulating Node is the node that pushes an NAS on to the Label stack.
      </t>
    <t>
     The encapsulating node MUST make sure that the NAS can be processed by the transit and egress nodes.
    </t>

    <ul>
      <li>
      The path computation system needs to know the MSD and RLD that can be imposed at the ingress node of a given SR path <xref target="RFC8664"/>. 
      This ensures that the label stack depth of a computed path does not exceed the maximum number of labels (i.e., MSD) the node is capable of imposing and the maximum number of labels that can be read by the MNA-processing nodes in the path. 
      The MSD needs to include the MNA Sub-Stacks to be added.
      </li>
      <li>
    The node responsible for selecting a path through the MPLS network needs to know and consider the MNA-capabilities and RLD of the transit nodes, and the MNA-capabilities of the end point.
    it supports.
      </li> 
      <li>
    Information about the capabilities of the nodes may be configured, collected through management protocols, or distributed by control protocols (such as advertising by routing protocols). 
      </li> 


      <li>
The mechanisms by which the capabilities of the nodes are known by the node responsible for selecting a path through the MPLS network are  out of scope for this document.
      </li> 
    </ul>

  </section>

  <section anchor="sect-J12.1a" numbered="true" toc="default">
    <name>Processing the Network Action Sub-Stack</name>

    <t>
      This section defines the specific responsibilities for nodes
      along an LSP.
    </t>

    <section>
      <name> Encapsulating Node Responsibilities </name>


      <t>
    The encapsulating node MAY add NASes to the label stack in
    accordance with its policies, the placement restrictions in
    <xref target="Placement"/>, and the limitations learned
    from <xref target="Signaling"/>.
      </t>
      <t>
    The encapsulating node MUST NOT add an NAS to the label stack
    if the egress node does not support MNA.
      </t>
      <t>

If there is an existing label stack, the encapsulating node MUST NOT modify the first 20 bits of any LSE in the label stack when the ECMP technique in the network is using the hashing of the labels on the label stack.

      </t>
      <t>
    If the encapsulating node is also a transit node, then it MUST
    also follow the rules set out in <xref target="Transit-Node-Responsibilities"/>.
      </t>



    </section>

    <section anchor="Transit-Node-Responsibilities" numbered="true" toc="default" >
      <name> Transit Node Responsibilities </name>
      <t>
      Transit Node is the node that process an NAS on to the Label stack but does not push any new NAS.
      </t>
      <t>

      The transit node MUST NOT modify the first 20 bits of any LSE in the label stack when the ECMP technique in the network is using the hashing of the labels on the label stack.

      </t>
      <t>
    A transit node MAY change the Ancillary Data found in the
    least significant 8 bits of an LSE.
      </t>
      <t>
    Transit nodes MUST process the NASes in the label stack,
    according to the rules set out in <xref target="Ordering"/>.
      </t>
      <t>
   A transit node that processes an NAS and does not recognise the value of an opcode MUST follow the rules according to the setting of the  Unknown Action Handling value in the NAS as described in (<xref target="UOH"/>).
      </t>
    </section>

    <section>
      <name> Penultimate Node Responsibilities </name>
      <t>
    In addition to the transit node responsibilities, the
    penultimate node and penultimate SR-MPLS segment node MUST NOT remove the last copy of an HBH or I2E
    NAS when it is exposed after removing the forwarding
    (transport) label. This allows the egress node to process the
    NAS.
      </t>
    </section>

    <section>
      <name> Egress Node Responsibilities </name>
      <t>
    The egress node MUST remove any NAS it receives.
      </t>
    </section>
  </section>

  <section anchor="Allocation" numbered="true" toc="default">
      <name>Network Action Indicator Opcode Definition</name>
     <t> The following information MUST be defined for new Network Action Indicator opcode request in the document that specifies the Network Action.
     </t>


      <t> 
    A request for a new NAI MUST include the following information: 
      </t>

      <ul>
        <li> 
      Format: The definition of the new Network Action MUST
          specify the LSE Formats. The opcode can define Network Action in Format B or C or both B and C. Both Format B and C LSEs MAY optionally carry Format D LSE(s).
    </li>
    <li>
      Scope: The request MUST specify at-least one scope (I2E,
      HBH, Select) for the Network Action. The request MAY specify
      more than one scope. 
    </li>
    <li> 
      Ancillary Data: A request MUST specify the quantity,
      syntax, and semantics of any associated Ancillary Data. The
      Ancillary Data MAY be variable length, but the length MUST
      be computable based on the data present in the NAS.
    </li>
        <li>
      Processing: The request MUST specify the detailed
      procedure for processing the network action.
    </li>
        <li> 
      Interactions: The definition of the new Network Action MUST
          specify its interaction with other currently defined 
          Network Action if there is any.
    </li>
      </ul>

      <t>
    An assignment for an NAI MAY make
    requests from any combination of the "Network Action Opcodes"
    or "Network Action Flags Without Ancillary Data" assignments.
    This decision should optimize for eventual
    encoding efficiency. If the NAI does not require any ancillary
    data, then a flag is preferred as only one bit is used in the
    encoding. 
      </t>
    </section>

  <section anchor="sect-J12" numbered="true" toc="default">
    <name>Backward Compatibility</name>

    <t>
      This section discusses interactions between MNA-capable and
      legacy, non-MNA-capable nodes.
    </t>
    <t>
      An MNA-encapsulating node MUST ensure that the MPLS
      Network Action Sub-Stack indicator is not at the top of the MPLS Label
      Stack when the packet arrives at a non-MNA-capable node. If such
      a packet did arrive at a non-MNA-capable node, it will most
      likely be dropped.
    </t>
    <t>
      Legacy nodes may scan the label stack, potentially looking for a
      label field containing a bSPL. To ensure that the LSE formats
      described herein do not appear to contain a bSPL value, the
      opcode value of 0 has been reserved. By ensuring that there is a
      non-zero value in the high order 7 bits, we are assured that the
      high order 20 bits cannot be misinterpreted as containing a bSPL
      value (0-15).
    </t>
    <t>
      The TC and TTL fields of the Format A LSE are not re-purposed
      for encoding, as the penultimate node on the MPLS packet path
      may propagate TTL from the transport (or forwarding) label to
      the next label on the label stack, overwriting the TTL on the
      next label.  If the penultimate node is a legacy node, it might
      perform this action, potentially corrupting other values stored
      in the TC and TTL fields. To protect against this, we retain the
      TC and TTL fields in the Format A LSE.
    </t>
  </section>

  <section anchor="sect-J10.c" numbered="true" toc="default">
    <name>Implementation Status</name>
  <t>
      [Note to the RFC Editor - remove this section before publication, as
   well as remove the reference to <xref target="RFC7942"/>]
   </t>
  <t>
   This section records the status of known implementations of the
   protocol defined by this specification at the time of posting of this
   Internet-Draft, and is based on a proposal described in <xref target="RFC7942"/>.
   The description of implementations in this section is intended to
   assist the IETF in its decision processes in progressing drafts to
   RFCs.  Please note that the listing of any individual implementation
   here does not imply endorsement by the IETF.  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.
  </t>

  <section anchor="sect-J10.d" numbered="true" toc="default">
    <name>University of Tuebingen Implementation</name>
   <t>
   The solution defined in the document draft-ietf-mpls-mna-hdr-05 has been implemented using P4 pipeline. The implementation code can be found at https://github.com/uni-tue-kn/P4-MNA.
   </t>

  </section>


  </section>

  <section anchor="sect-J11" numbered="true" toc="default">
    <name>Security Considerations</name>
    <t>
      The security considerations in <xref target="RFC3032"
      format="default"/> also apply to this document.
    </t>
    <t> 
      In addition, MNA-creates a new dimension in security
      concerns:
    </t>
      <ul>
    <li>
      The actions of an encapsulating node can affect any or all
      of the nodes along the path. In the most common and benign
      situations, such as a syntactically incorrect packet
      could result in packet loss or corruption.
    </li>
    <li>
      The semantics of a network action are unbounded and may be
      insecure. A network action could be defined that made
      arbitrary changes to the memory of the forwarding router,
      which could then be used by the encapsulating node to
      compromise every MNA-capable router in the network. The IETF
      needs to ensure that only secure network actions are
      defined.
    </li>
    <li>
      The MNA architecture supports locally-defined network
      actions. For such actions, there will be limited oversight
      to ensure that the semantics do not create security
      issues. Implementors and network operators will need to
      ensure that locally-defined network actions do not
      compromise the security of the network.
    </li>
    <li>
      The MNA architecture supports modifying the AD on the intermediate nodes, so the critical network functions should either not rely on the data or should be aware of the risks and use other means to verify the security of the whole network. 
    </li>
    <li>
      The "private Use" opcodes in "Network Action Opcodes" <xref target="IANAOpcodes"/> and "Network Action Flags Without Ancillary Data" <xref target="IANAFlags"/> Registry are subject to the considerations described in <xref target="RFC8126"/>.
    </li>
 
      </ul>
  </section>

  <section anchor="sect-J13" numbered="true" toc="default">
    <name>IANA Considerations</name>

    <section anchor="sect-J13.6" numbered="true" toc="default">
      <name>MNA bSPL Label</name>
      <t>
    This document requests that IANA allocate a value (TBA) for
    the MNA bSPL label from the "Base Special-Purpose MPLS Label
    Values" registry to indicate the presence of an MNA Sub-Stack in
    the label stack. The description of the value should be "MPLS
    Network Actions". The reference should be this document.
      </t> 
    </section>


    <section>
      <name>MPLS Network Actions Parameters</name>
      
      <t>
    This document requests that IANA create a new category
    called "MPLS Network Actions Parameters" within the
    "Multiprotocol Label Switching Architecture (MPLS)" category.  
     The registries described below should belong to
    this new category.
      </t>
    </section>
    
   
    <section anchor="IANAFlags">
      <name>Network Action Flags Without Ancillary Data</name>
      <t>
    This document requests that IANA create a new registry with
    the name "Network Action Flags Without Ancillary
    Data". Registration requests should comply with <xref
    target="Allocation"/>.  The registration procedure for this
    registry is "IETF Review", "Experimental Use" and "Private Use" as defined in <xref target="RFC8126"/>.  The fields in this registry are
    "Bit Position" (integer), "Description" (string), and
    "Reference" (string).
      </t>
      <t>
    Bit Position refers to the position relative to the most
    significant bit in LSE Format B or C Data fields and any
    subsequent Format D LSEs. Bit Position 0 is the most
    significant bit in an LSE Format B or C Data field. Bit Position
    20 is the most significant bit in the first LSE Format D Data
    field. There are 20 bits available in LSE Format C and 30 bits
    available in LSE Format D. There are at most 14 Format D LSEs
    per opcode (due to NASL limit of 15 and Format D requires Format C LSE), so there are at most 20 + 14 * 30 = 440 bit
    positions. The Bit Position is an integer with value 0-469.
      </t> 
      <t>
    The initial assignments for this registry are:
      </t>
      <table anchor="iana-nafif-tbl-1" align="center">
        <name>Network Action Flags Without Ancillary Data Registry</name>
        <thead>
          <tr>
            <th align="left"> Bit Position</th>
            <th align="left"> Description</th>
            <th align="left"> Reference</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">0-14</td>
            <td align="left">IETF Review </td>
            <td align="left">This document</td>
          </tr>
          <tr>
            <td align="left">15-16</td>
            <td align="left">Experimental Use</td>
            <td align="left">This document</td>
          </tr>
          <tr>
            <td align="left">17-19</td>
            <td align="left">Private Use</td>
            <td align="left">This document</td>
          </tr>
          <tr>
            <td align="left">20-469</td>
            <td align="left">IETF Review</td>
            <td align="left">This document</td>
          </tr>
        </tbody>
      </table>
    </section>

    <section anchor="IANAOpcodes" numbered="true" toc="default">
      <name>Network Action Opcodes</name>

      <t>
    This document requests that IANA create a new registry with
    the name "Network Action Opcodes". Registration requests
    should comply with <xref target="Allocation"/>. The
    registration procedure for this registry is "IETF Review", "Experimental Use" and "Private Use" as defined in <xref target="RFC8126"/>. The
    fields are "Opcode" (integer), "Description" (string), and
    "Reference" (string). Opcode is an integer with value 1-126.
      </t>

      <table anchor="iana-is-fioc-reg-tbl" align="center">
        <name> Network Action Opcodes </name>
        <thead>
          <tr>
            <th align="left">Opcode</th>
            <th align="center">Description</th>
            <th align="left">Reference</th>
          </tr>
        </thead>
        <tbody>
           <tr>
            <td align="left">1-110</td>
            <td align="left">IETF Review </td>
            <td align="left">This document</td>
          </tr>
          <tr>
            <td align="left">111-114</td>
            <td align="left">Experimental Use</td>
            <td align="left">This document</td>
          </tr>
          <tr>
            <td align="left">115-126</td>
            <td align="left">Private Use</td>
            <td align="left">This document</td>
          </tr>
        </tbody>
      </table>

<t>
IANA has allocated values for the following Network Action Opcodes from "Network Action Opcodes".
</t>

      <table anchor="iana-is-fioc-reg-tbl-values" align="center">
        <name> Network Action Opcodes </name>
        <thead>
          <tr>
            <th align="left">Opcode</th>
            <th align="center">Description</th>
            <th align="left">Reference</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">0</td>
            <td align="left">Reserved</td>
            <td align="left">This document</td>
          </tr>
          <tr>
            <td align="left">1</td>
            <td align="left">Flag-Based Network Action Indicators without AD</td>
            <td align="left">This document</td>
          </tr>
          <tr>
            <td align="left">2</td>
            <td align="left">No operation Opcode</td>
            <td align="left">This document</td>
          </tr>
          <tr>
            <td align="left">127</td>
            <td align="left">Opcode Range Extension Beyond 127</td>
            <td align="left">This document</td>
          </tr>
        </tbody>
      </table>




    </section>

  </section>

  <section anchor="sect-J14" numbered="true" toc="default">
    <name>Examples</name>

    <section anchor="sect-J7" numbered="true" toc="default">
      <name>Network Action Encoding Examples</name>
      <section anchor="sect-J7.1" numbered="true" toc="default">
        <name>Network Action Flags without AD</name>

        <figure anchor="In-stack-Ext-Hdr-1-a">
          <name>NAS with Network Action Flags</name>
          <artwork name="" type="" align="left" alt=""><![CDATA[
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          Label=MNA bSPL               | TC  |0|    TTL        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Opcode=1   |         Flags           |R|IHS|S|U|NASL=0 |NAL=0|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
          ]]></artwork>
        </figure>
 
        <t>
      This is an example of an NAS with Flag-Based NAIs without
      Ancillary Data.
    </t>
      
        <t>
      Details:
    </t>
        <ul empty="true" spacing="normal">
          <li> Opcode=1: This opcode to indicates that the LSE carries Flag-Based NAIs without AD. </li>
          <li> Data: The data field carries the Flag-Based NAIs. </li>
          <li>
        S: This is the bottom of stack bit. Set if and only if
        this LSE is the bottom of the stack.
      </li>
          <li> U: Action to be taken if one of the NAIs are not recognized by the processing node.</li>
          <li> NASL: The NASL value is set to 0, as there are no additional LSEs. </li>
          <li> NAL: The NAL value is set to 0, as there are no additional AD encoded using Format D. </li>
      </ul>

      <figure anchor="In-stack-Ext-Hdr-1-a-ext">
        <name>Network Action Flags without AD using LSE Format D</name>
        <artwork name="" type="" align="left" alt=""><![CDATA[
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|      Label=MNA bSPL                   | TC  |0|    TTL        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Opcode=2  |        Data=0           |R|IHS|S|U|NASL=2 |NAL=0|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Opcode=1  |        Flag-Based NAIs        |0|U| NAIs  |NAL=1|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|1| Additional Flag-Based NAIs                |S|Flag-Based-NAIs|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
        ]]></artwork>
      </figure>
      <t>
    In this example, the NAS contains a Format B LSE with No-Operation Opcode value 2. The next LSE uses Format C, but
    the Network Action Flag is not in a bit position contained
    within the Format C LSE, so a single Format D LSE has been
    added to the NAS to carry the flag.
      </t>
      <t>
    NAL is set to 1 to indicate that Flag-Based NAIs are also
    encoded in the next LSE.
      </t> 
      <t>
    NASL is set to 2 to indicate that 2 additional LSEs are
    used.
      </t> 
    </section>

    <section anchor="sect-J7.2" numbered="true" toc="default">
      <name>Network Action Opcode with AD </name>

      <figure anchor="In-stack-Ext-Hdr-2a">
        <name>Network action opcode with Ancillary Data</name>
        <artwork name="" type="" align="left" alt=""><![CDATA[
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|      MNA-Label=bSPL (TBA)             | TC  |0|    TTL        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Opcode=8  |      Ancillary Data     |R|IHS|S|U|NASL=0 |NAL=0|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
        ]]></artwork>
      </figure>
      <t>
    In this example, the NAS is carrying only one Network
    Action that requires 13 bits of Ancillary Data. 
      </t>
      <t>
    Details on the Second LSE
      </t>
      <ul empty="true" spacing="normal">
          <li> Opcode=8: A network action allocation is outside of this document.</li>
          <li> Data: The data field contains 13 bits of ancillary data. </li>
      </ul>
   
    </section>

    <section anchor="sect-J7.4.a" numbered="true" toc="default">
      <name>Network Action Opcode with more AD with Format-B</name>
      <t>
    A network action may require more Ancillary Data than can fit
    in a single LSE. In this example, a Format D LSE is added to
    carry additional Ancillary Data.
      </t>

      <figure anchor="In-stack-Ext-Hdr-Format-4-with-more-AD.a">
        <name>Network Action With Additional Ancillary Data</name>
        <artwork name="" type="" align="left" alt=""><![CDATA[
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          Label=MNA bSPL               | TC  |0|    TTL        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Opcode=10  |    Ancillary Data       |R|IHS|0|U|NASL=1 |NAL=1|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|1|            Ancillary Data                 |S|Ancillary Data |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
        ]]></artwork>
      </figure>

      <t>
    In this example, opcode 10 is encoded in Format B and it requires more than one LSE's worth of
    Ancillary Data, so a Format D LSE is added.
      </t>

      <t>
    Details on the second LSE:
      </t>
      <ul empty="true" spacing="normal">
        <li> Opcode=10: An opcode allocation is outside of this document</li>
        <li> Ancillary Data: Ancillary data required to process the Network Action opcode 10</li>
        <li> NAL: Length of additional LSEs used to encode its Ancillary data</li>
      </ul>

      <t> Details on the third LSE: </t>
      <ul empty="true" spacing="normal">
        <li> Ancillary Data: 22 bits of additional Ancillary data.</li>
        <li> Ancillary Data: 8 bits of additional Ancillary Data.</li>
      </ul>
    
    </section>

    <section anchor="sect-J7.4.b" numbered="true" toc="default">
      <name>Network Action Opcode with more AD with Format C</name>
      <t>
    A network action may require more Ancillary Data than can fit
    in a single LSE. In this example, a Format D LSE is added to
    carry additional Ancillary Data.
      </t>

      <figure anchor="In-stack-Ext-Hdr-Format-4-with-more-AD.b">
        <name>Network Action With Additional Ancillary Data</name>
        <artwork name="" type="" align="left" alt=""><![CDATA[
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          Label=MNA bSPL               | TC  |0|    TTL        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Opcode=2   |        Data=0           |R|IHS|0|U|NASL=2 |NAL=0|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Opcode=9   |        Ancillary Data         |0|U|  AD   |NAL=1|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|1|            Ancillary Data                 |S|Ancillary Data |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
        ]]></artwork>
      </figure>

      <t>
    In this example, opcode 9 requires more than one LSE's worth of
    Ancillary Data, so a Format D LSE is added.
      </t>

      <t>
    Details on the third LSE:
      </t>
      <ul empty="true" spacing="normal">
        <li> Opcode=9: An opcode allocation is outside of this document</li>
        <li> Ancillary Data: Most significant bits of Ancillary data</li>
        <li> AD: 4 bits of additional Ancillary Data</li>
      </ul>

      <t> Details on the fourth LSE: </t>
      <ul empty="true" spacing="normal">
        <li> Ancillary Data: 22 bits of additional Ancillary data.</li>
        <li> Ancillary Data: 8 bits of additional Ancillary Data.</li>
      </ul>
    
    </section>

  </section>

  <section anchor="sect-J6.a" numbered="true" toc="default">
    <name>Network Action Processing Order</name>
    <t>
      The semantics of a network action can vary widely and the
      results of processing one network action may affect the
      processing of a subsequent network action. See <xref
      target="Ordering"/>.
    </t>
      
    <section anchor="sect-J6.a1" numbered="true" toc="default">
      <name>Network Action Processing Order</name>
      <figure anchor="In-stack-NA-Ordering-1">
        <name>In-stack NA processing order</name>
        <artwork name="" type="" align="left" alt=""><![CDATA[
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           Label=MNA bSPL              | TC  |S|    TTL        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Opcode=8    |      Ancillary Data     |R|IHS|S|U|NASL=2 |NAL=0|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Opcode=7    |      Ancillary Data7          |S|U|  AD7  |NAL=0|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Opcode=1    |      Flag-Based NAIs          |S|U|  NAI  |NAL=0|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
        ]]></artwork>
      </figure>

      <t>
    In this example, opcode 8 is processed first, then opcode 7,
    and then the network action flags are processed from most
    significant to least significant.
      </t>
      <t>
    In a different case, some Flag-Based NAIs may need to be
    processed before opcode 7 and some Flag-Based NAIs
    may need to be processed after Opcode 7. This can be done
    by causing some NAIs to appear earlier in the NAS.
      </t>

      <figure anchor="In-stack-NA-Ordering-2">
        <name>Interleaving network actions</name>
        <artwork name="" type="" align="left" alt=""><![CDATA[
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|              Label=MNA bSPL           | TC  |S|    TTL        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Opcode=8    |      Ancillary Data     |R|IHS|S|U|NASL=3 |NAL=0|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Opcode=1    |        0x01                   |S|U|  NAI  |NAL=0|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Opcode=7    |      Ancillary Data7          |S|U|  AD7  |NAL=0|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Opcode=1    |        0x02                   |S|U|  NAI  |NAL=0|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

        ]]></artwork>
      </figure>
      <t> 
    In the above example, opcode 8 is processed first, then
    Flag-Based NAI 0x01 is processed, then opcode 7 is processed, and
    finally NAI 0x02 is processed.
      </t>

    </section>
    </section>


   </section>
 </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
    &I-D.ietf-mpls-mna-fwk;
    &I-D.ietf-mpls-mna-requirements;
    &RFC2119;
    &RFC3032;
    &RFC3443;
    &RFC5462;
    &RFC8174;
    &RFC9017;
      </references>
      <references>
        <name>Informative References</name>
    &I-D.ietf-mpls-mna-usecases;
    &RFC6291;
    &RFC7942;
    &RFC8126;
    &RFC8664;
      </references>
    </references>

    <section numbered="false" anchor="acknowledgments" toc="default">
      <name>Acknowledgments</name>
      <t>
      The authors of this document would like to thank the MPLS
      Working Group Open Design Team for the discussions and comments
      on this document. The authors would also like to thank Amanda
      Baber for reviewing the IANA Considerations and providing many
      useful suggestions. The authors would like to thank Loa
      Andersson, Stewart Bryant, Greg Mirsky, Joel M. Halpern and Adrian Farrel for reviewing this 
      document and providing many useful suggestions. The authors would like to thank Fabian Ihle and Michael Menth, 
      both from University of Tuebingen, for implementing the solution defined in this document in P4 pipeline. 
      </t>
    </section>

    <section numbered="false" anchor="contributors" toc="default">
      <name>Contributors</name>
      <t>The following people have substantially contributed to this document:</t>

          <figure anchor="contrib">
     <artwork name="" type="" align="left" alt=""><![CDATA[

Jisu Bhattacharya
Cisco Systems, Inc.
Email: jisu@cisco.com


Bruno Decraene
Orange
Email: bruno.decraene@orange.com


Weiqiang Cheng
China Mobile
Email: chengweiqiang@chinamobile.com


Xiao Min
ZTE Corp.
Email: xiao.min2@zte.com.cn


Luay Jalil
Verizon
Email: luay.jalil@verizon.com


Jie Dong
Huawei Technologies
Huawei Campus, No. 156 Beiqing Rd.
Beijing  100095
China
Email: jie.dong@huawei.com


Tianran Zhou
Huawei Technologies
China
Email: zhoutianran@huawei.com


Bin Wen
Comcast
Email: Bin_Wen@cable.comcast.com


Sami Boutros
Ciena
Email: sboutros@ciena.com


Tony Li 
Juniper Networks 
United States 
Email: tony.li@tony.li 


John Drake 
Juniper Networks 
United States 
Email: jdrake@juniper.net 


    ]]></artwork>
      </figure>

    </section>
  </back>
</rfc>
