<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE rfc [
<!ENTITY nbsp "&#160;">
<!ENTITY zwsp "&#8203;">
<!ENTITY nbhy "&#8209;">
<!ENTITY wj "&#8288;">
]>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" submissionType="IETF" docName="draft-ietf-mpls-1stnibble-11" category="std" ipr="trust200902" obsoletes="" updates="4928" xml:lang="en" symRefs="true" sortRefs="true" tocInclude="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.16.0 -->
  <!-- Generated by id2xml 1.5.0 on 2023-03-09T15:36:48Z -->
	<front>
    <title abbrev="1st nibble">IANA Registry for the First Nibble Following a Label Stack</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-mpls-1stnibble-11"/>
    <author initials="K." surname="Kompella" fullname="Kireeti Kompella">
      <organization>Juniper Networks</organization>
      <address>
        <postal>
          <street>1133 Innovation Way</street>
          <street>Sunnyvale,  94089</street>
          <street>United States of America</street>
        </postal>
        <email>kireeti.ietf@gmail.com</email>
      </address>
    </author>
    <author initials="S." surname="Bryant" fullname="Stewart Bryant">
      <organization>University of Surrey 5GIC</organization>
        <address>
        <email>sb@stewartbryant.com</email>
        </address>
    </author>
    <author initials="M." surname="Bocci" fullname="Matthew Bocci">
      <organization>Nokia</organization>
        <address>
        <email>matthew.bocci@nokia.com</email>
        </address>
    </author>
    <author initials="G." surname="Mirsky" fullname="Greg Mirsky" role="editor">
      <organization>Ericsson</organization>
        <address>
        <email>gregimirsky@gmail.com</email>
        </address>
    </author>
    <author initials="L." surname="Andersson" fullname="Loa Andersson">
      <organization>Huawei Technologies</organization>
        <address>
        <email>loa@pi.nu</email>
        </address>
    </author>
        <author initials="J." surname="Dong" fullname="Jie Dong">
      <organization>Huawei Technologies</organization>
      <address>
        <postal>
          <street>Huawei Campus, No. 156 Beiqing Rd.</street>
          <street>Beijing, 100095</street>
          <street>China</street>
        </postal>
        <email>jie.dong@huawei.com</email>
      </address>
    </author>
    <date year="2024"/>
    <workgroup>MPLS Working Group</workgroup>
    <abstract>
      <t>
   This memo creates a new IANA registry (called the
   Post-stack First Nibble registry) for the first nibble (4-bit field)
   immediately following an MPLS label stack.  The memo offers a
   rationale for such a registry, describes how the registry should be
   managed, and provides some initial entries.  Furthermore, this memo
   sets out some documentation requirements for registering new values.
   Finally, it provides some recommendations that make processing MPLS
   packets easier and more robust.
   </t>
<t>The relationship between the IANA IP Version Numbers (RFC 2780)
and the Post-stack First Nibble registry is described in this document.</t>
<t>This document updates RFC 4928 by deprecating
   the heuristic method for identifying the type of packet encapsulated
   in MPLS.</t>
    </abstract>
  </front>
  <middle>
    <section anchor="sect-1" numbered="true" toc="default">
      <name>Introduction</name>
      <t>
   An MPLS packet consists of a label stack, an optional "post-stack header" (PSH) and an optional embedded packet (in that order).  By
   PSH, we mean existing artifacts such as Control Words <xref target="RFC4385"/>, BIER (Bit-Indexed Explicit Replication) headers <xref target="RFC8296"/>
   and the like, as well as new types of PSH being discussed by the MPLS
   Working Group.  However, in the data plane, there are
   scant clues regarding the PSH, and no clue as to the type of embedded
   packet; this information is communicated via other means, such as the
   routing protocols that signal the labels in the stack.  Nonetheless,
   in order to better handle an MPLS packet in the data plane, it is
   common practice for network equipment to "guess" the type of embedded
   packet.  Such equipment may also need to process the PSH.
  Both of these require parsing the data after the label
   stack. To do this, the "first nibble" (the top four bits of the
   first octet following the label stack) is often used. Although some
   existing network devices may use such a method, it needs to be
   stressed that the correct interpretation of the Post-stack First Nibble
    (PFN) in a PSH can be made only in the context associated
    using the control or management plane with the Label Stack Element (LSE) or group
    of LSEs in the preceding label stack that characterize the type of
    the PSH, and that any attempt to rely on the value in any other
    context is unreliable.</t>
      <t>
   The semantics and usage of the first nibble are not well documented,
   nor are the assignments of values.  This memo serves four purposes:</t>
      <ul spacing="normal">
        <li>To document the values already in use.</li>
        <li>To provide a mechanism to document future assignments
      through the creation of a new IANA "Post-stack First Nibble registry", and document the relationship
      between it and the IANA IP Version Numbers <xref target="RFC2780"/>.</li>
        <li>Provide a method for tracking usage by requiring more detailed
      documentation.</li>
        <li>To stress the importance that any MPLS packet not carrying
      plain IPv4 or IPv6 packets contains a PSH, including any new version of IP (<xref target="sect-2.3"/>).</li>
      </ul>
      
            <t>
   Based on the analysis of load-balancing techniques in <xref target="sect-2.1.1"/>,
   this memo, in <xref target="sect-2.1.1.1"/>, introduces a requirement that deprecates the use of the
   heuristic and recommends using a dedicated label value for load balancing. The intent of both is for
   legacy routers to continue operating as they have, with no new problems
   introduced as a result of this memo.  However, new implementations
   that follow this memo enable a more robust network operation.
   </t>
<t>Furthermore, this document updates <xref target="RFC4928"/>
   by deprecating the heuristic method for identifying the type of packet
   encapsulated in MPLS. This document clearly states that the type of
   encapsulated packet cannot be determined based on the PFN alone.</t>

      <section anchor="sect-1.1" numbered="true" toc="default">
        <name>Conventions and Definitions</name>
        <t>
   The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
   "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
   "OPTIONAL" in this document are to be interpreted as described in
   BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they appear in all
   capitals, as shown here.</t>
   
        <dl newline="false" spacing="normal">
          <dt>MPLS packet:</dt>
          <dd>
            <t>
	one whose Layer 2 header declares the type to be MPLS.
	For Ethernet, that means the Ethertype is 0x8847 or 0x8848.
            </t>
          </dd>
          <dt>Label Stack:</dt>
          <dd>
            <t>
	(of an MPLS packet) all labels (four-octet fields)
	after the Layer 2 header, up to and including the label with the
      Bottom of Stack bit set (<xref target="RFC3032" format="default"/>).
            </t>
          </dd>
          <dt>Post-stack First Nibble (PFN):</dt>
          <dd>
            <t>
	the most significant four bits of the first
	octet following the label stack.
            </t>
          </dd>
          <dt>MPLS Payload:</dt>
          <dd>
            <t>
	all data after the label stack, including the PFN, an
	optional post-stack header, and the embedded packet.
            </t>
          </dd>
          <dt>Post-stack Header (PSH):</dt>
          <dd>
            <t>
	optional field of interest to the egress Label Switching Router (LSR) (and possibly to transit LSRs).  Examples include a control
      word <xref target="RFC4385"/>, <xref target="RFC8964"/> or an associated channel <xref target="RFC4385"/>,
      <xref target="RFC5586"/>, <xref target="RFC9546"/>.  The PSH MUST indicate its length,
      so that a parser knows where the embedded packet starts.
            </t>
          </dd>
          <dt>Embedded Packet:</dt>
          <dd>
            <t>
	an embedded packet follows immediately after the MPLS
Label Stack and an optional PSH.  That could be
	an IPv4 or IPv6 packet, an Ethernet packet (for
      VPLS (<xref target="RFC4761" format="default"/>, <xref target="RFC4762" format="default"/>)
      or EVPN  <xref target="RFC7432" format="default"/>), or some other type
      of Layer 2 frame <xref target="RFC4446" format="default"/>.
            </t>
          </dd>
          <dt>Deprecation:</dt>
          <dd>
          <t>
          regardless of how the deprecation is understood in other IETF documents,
          the interpretation in this document is that if a practice has been deprecated,
          that practice should not be included in new implementations or deployed in new deployments.
          </t>
          </dd>
        </dl>
        </section>

      <section anchor="sect-1.1.1" numbered="true" toc="default">
        <name>Reference Figures</name>
 
        <figure anchor="mpls-packet-fig">
          <name>Example of an MPLS Packet With Label Stack</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
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\
X |                        Layer 2 Header                         | |
  |                                                               | |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+/
                                            TC   S       TTL
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\
Y |             Label-1                   | TC  |0|      TTL      | |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |             Label-2                   | TC  |0|      TTL      | |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |               ...                     | TC  |0|      TTL      | |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |             Label-n                   | TC  |1|      TTL      | |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+/
]]></artwork>
        </figure>
        <figure anchor="examples-fig">
        <name>Examples of an MPLS Packet Payload With and Without Post-Stack Header</name>
          <artwork name="" type="" align="left" alt=""><![CDATA[
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\
A | (PFN) |                   IP packet                           | |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                             data                              | |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                                 ...                                |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                        end of IP packet                       | |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+/


  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\
B | (PFN) |                 non-IP packet                         | |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                             data                              | |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                                 ...                                |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                      end of non-IP packet                     | |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+/


  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\
C | (PFN) |                      PSH                              | |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                              PSH                              | |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                                 ...                                |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                          end of PSH                           | |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                        embedded packet                        | |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+/
]]></artwork>
        </figure>
        <t>
   <xref target="mpls-packet-fig"/> shows an MPLS packet with Layer 2 header X and a label stack
   Y ending with Label-n.  Then, there are three examples of an MPLS
   payload displayed in <xref target="examples-fig"/>.
   The complete MPLS packet thus would consist of [X Y A], or [X Y B], or [X Y C].</t>
        <t>
   A.  The first payload is a bare IP packet, i.e., no PSH.  The PFN in this case overlaps with the IP version number.</t>
        <t>
   B.  The next payload is a bare non-IP packet; again, no PSH.  The PFN
   here is the first nibble of the payload, whatever it happens to be.</t>
        <t>
   C.  The last example is an MPLS Payload that starts with a PSH
   followed by the embedded packet.  Here, the embedded packet could be
   IP or non-IP.</t>
      </section>
  
      <section anchor="abbrev-sec" numbered="true" toc="default">
      <name>Abbreviations</name>
      <t>LSR:     Label Switching Router</t>
      <t>LSE:      Label Stack Element</t>
      <t>PSH:      Post-Stack Header</t>
      <t>PFN:      Post-stack First Nibble</t>
      <t>FAT:       Flow-Aware Transport</t>
      <t>SPL:      Special Purpose Label</t>
      <t>PW:        Pseudowire</t>
      <t>MNA:      MPLS Network Action</t>
      <t>BIER:     Bit-Indexed Explicit Replication</t>
     </section>
    </section>

    <section anchor="sect-2" numbered="true" toc="default">
      <name>Rationale</name>
      <section anchor="sect-2.1" numbered="true" toc="default">
        <name>Why Look at the First Nibble</name>
        <t>
   An MPLS packet can contain one of many types of embedded packets. Three common types are:</t>
        <ol spacing="normal" type="1">
          <li>An IPv4 packet (whose IP header has version number 4).</li>
          <li>An IPv6 packet (whose IP header has version number 6).</li>
          <li>A Layer 2 Ethernet frame (i.e., not including the Preamble or the
       Start frame delimiter), starting with the destination MAC address.</li>
        </ol>
        <t>
 Many other packet types are possible; in principle, any Layer 2 embedded packet is permissible.
 Indeed, in the past, packets of Point-to-Point Protocol, Frame Relay,
 and Asynchronous Transfer Mode protocols were reasonably common.
 </t>
        <t>
   In addition, there may be a PSH ahead of the embedded packet.
   The value of PFN is considered to ensure that the PSH can be correctly parsed.
   If no PSH follows the label stack, then the value of PFN indicates the version number of the IP packet header.
   </t>
   
        <section anchor="sect-2.1.1" numbered="true" toc="default">
          <name>Load Balancing</name>
          <t>
   There are four common ways to load balance an MPLS packet:</t>
          <ol spacing="normal" type="1">
            <li>One can use the top label alone.</li>
            <li>One can do better by using all of the non-SPLs (Special Purpose Labels) <xref target="RFC7274"/> in the stack.</li>
            <li>One can do even better by "divining" the type of embedded packet,
       and using fields from the guessed header. The ramifications of using this load-balancing technique 
       are discussed in detail in <xref target="sect-2.1.1.1"/>.</li>
            <li>One can do best by using either an Entropy Label <xref target="RFC6790" format="default"/> or a
       Flow-Aware Transport (FAT) Pseudowire Label <xref target="RFC6391" format="default"/> (see <xref target="sect-2.1.1.1" format="default"/>).</li>
          </ol>
          <t>
   Load balancing based on just the top label means that all packets
   with that top label will go the same way -- this is far from ideal.
   Load balancing based on the entire label stack (not including SPLs)
   is better, but it may still be uneven.  If, however, the embedded packet
   is an IP packet, then the combination of (&lt;source IP address&gt;, &lt;dest IP address&gt;, &lt;transport protocol&gt;, &lt;source port&gt;, and &lt;dest port&gt;)
   from the IP header of the embedded packet forms an excellent basis
   for load-balancing.  This is what is typically used for load
   balancing IP packets.</t>
          <t>
   An MPLS packet doesn't, however, carry a payload type identifier.
   There is a simple (but risky) heuristic that is commonly used to
   guess the type of the embedded packet.  The first nibble, i.e., the
   four most significant bits of the first octet, of an IP header
   contains the IP version number.  That, in turn, indicates where to find
   the relevant fields for load-balancing. The heuristic goes roughly
   as described in <xref target="sect-2.1.1.1"/>.</t>
   
          <section anchor="sect-2.1.1.1" numbered="true" toc="default">
            <name>Heuristic for Load Balancing</name>
            <ol spacing="normal" type="1">
              <li>If the PFN is 0x4 (0100b), treat the payload as an IPv4 packet,
       and find the relevant fields for load-balancing on that basis.</li>
              <li>If the PFN is 0x6 (0110b), treat the payload as an IPv6 packet,
       and find the relevant fields for load-balancing on that basis.</li>
              <li>If the PFN is anything else, the MPLS payload is not an IP
       packet; fall back to load-balancing using the label stack.</li>
            </ol>
            <t>
   This heuristic has been implemented in many (legacy) routers, and
   performs well in the case of <xref target="examples-fig"/>, A.  However, this heuristic
   can work very badly for <xref target="examples-fig"/>, B.  For example, if payload B is an
   Ethernet frame, then the PFN is the first nibble of the Organizationally Unique Identifier of the
   destination MAC address, which can be 0x4 or 0x6, and if so would lead to the packet being treated as an IPv4 or IPv6 packet such
   that data at the offsets of specific relevant fields would be used as
   input to the load-balancing heuristic resulting in unpredictable load
   balancing. This behavior can happen to other
   types of non-IP payloads as well.</t>
<t>
   That, in turn, led to the idea of inserting a PSH (e.g., a pseudowire
   control word <xref target="RFC4385" format="default"/>, a DetNet control word <xref target="RFC8964" format="default"/>,
   a Network Service Header <xref target="RFC8300"/>, or a BIER
   header <xref target="RFC8296" format="default"/>) where the PFN is not 0x4 or 0x6, to
   explicitly prevent forwarding engines from confusing the MPLS payload
   with an IP packet.  <xref target="RFC8469" format="default"/> recommends the use of a control word
   when the embedded packet is an Ethernet frame.  RFC 8469 was
   published at the request of the operator community and the IEEE Registration Authority Committee
   as a result of operational difficulties with pseudowires that did not
   contain the control word.</t>
   
             <t>
   It is RECOMMENDED that where load-balancing of MPLS
   packets is desired, the load-balancing mechanism uses the value of a dedicated label, for example,
   either an Entropy Label <xref target="RFC6790"/> or a FAT Pseudowire Label <xref target="RFC6391"/>.
   Furthermore, the heuristic of guessing the type of the embedded packet,
   as discussed above, SHOULD NOT be used.</t>
          <t>
   A consequence of the heuristic approach is that while legacy routers may
   look for a PFN of 0x4 <xref target="RFC0791"/> or 0x6 <xref target="RFC8200"/>, no legacy router will
    look for any other PFN, regardless of what future IP version numbers
    will be, for load-balancing purposes. This means that the values 0x4 and
   0x6 are used to (sometimes incorrectly) identify IPv4 and IPv6
   packets, but no other of PFN values will be used to identify IP
   packets.</t>
  <t>This document creates a new PFN Registry for all 16 possible values.</t>
          </section>
        </section>
        
      </section>
  
          <section anchor="sect-2.1.2" numbered="true" toc="default">
  <name>Updates of RFC 4928</name>

     <t>
     Paragraph 3 in Section 3 of RFC 4928 <xref target="RFC4928"/> states that:
     </t>
     <t>OLD TEXT</t>
     <blockquote>
          <t>
    It is REQUIRED, however, that applications dependent upon in-order
   packet delivery restrict the first nibble values to 0x0 and 0x1.
   This will ensure that their traffic flows will not be affected if
   some future routing equipment does similar snooping on some future
   version(s) of IP.
   </t>
     </blockquote>
     <t>END</t>

   <t>
     The text in RFC 4928 <xref target="RFC4928"/> concerning the first nibble after the MPLS
     Label Stack has been updated by this document and
     the heuristic for snooping this nibble has been deprecated.
     RFC 4928 is now updated as follows:</t>
     <t>NEW TEXT:</t>
     <blockquote>
   <t>
     Network equipment MUST use a PSH
     (Post-Stack Header) with a PFN (Post-stack First Nibble) value
     that is neither 0x4 nor 0x6 in all cases when the MPLS payload
     is not an IP packet.
   </t>
     </blockquote>
  <t>END</t>
<!--  <t>[RFC Ed.: Throughout the docuemnt, replace XXXX with the actual RFC number assigned to this document and remove this note.]</t> -->

          <t>
   The recommendation (see <xref target="sect-2.1.1.1"/>) replaces the paragraph 4 in Section 3 of RFC 4928 <xref target="RFC4928" format="default"/> as follows:</t>
   <t>OLD TEXT:</t>
   <blockquote>
      <t>
   This behavior implies that if in the future an IP version is defined with a version number of 0x0 or 0x1,
   then equipment complying with this BCP would be unable to look past one or more MPLS headers,
   and load-split traffic from a single LSP across multiple paths based on a hash of specific fields in the IPv0 or IPv1 headers.
   That is, IP traffic employing these version numbers would be safe from disturbances caused by inappropriate load-splitting,
   but would also not be able to get the performance benefits.</t>
   </blockquote>

<t>NEW TEXT:</t>
<blockquote>
<t>
   The practice of deducing the payload type based on the PFN value
   is deprecated to avoid inaccurate load balancing.  This means that
   older implementations and deployments can continue to
   use that heuristic, while it must not be part of new
   implementations or deployments.  It also means that concerns about
   load balancing for future IP versions with a version number of 0x0
   or 0x1 are no longer relevant.
  </t>
</blockquote>
  <t>END</t>

   <t>Furthermore, the following text is appended to Section 1.1 of RFC 4928 <xref target="RFC4928"/>:</t>
   <t>NEW TEXT:</t>
   <blockquote>
      <t>PSH:      Post-Stack Header</t>
      <t>PFN:      Post-stack First Nibble</t>
   </blockquote>
        <t>END</t>
        </section>
  
      <section anchor="sect-2.2" numbered="true" toc="default">
        <name>Why Create a Registry</name>
        <t>
    Support for MPLS Network Actions (MNAs) is described in
   <xref target="I-D.ietf-mpls-mna-fwk"/> and is an enhancement to the MPLS
   architecture.  The use of post-stack data (PSD) to encode the MNA
   indicators and ancillary data is described in section 3.6 might place
   data in the PFN that could conflict with other uses of that nibble.
   This issue is described in section 3.6.1 of <xref target="I-D.ietf-mpls-mna-fwk"/>
   and is further illustrated by the PFN value of 0x0 which has two
   different formats depending on whether the PSH is a pseudowire
   control word or a DetNet control word: disambiguation requires the
   context of the service label. 
   </t>
   <t>
    With a registry, PSHs become easier to parse; not needing means
   outside the data plane to interpret them correctly; and their
   semantics and usage are documented.
   </t>
      </section>
      <section anchor="sect-2.3" numbered="true" toc="default">
        <name>IP Version Numbers versus Post-stack First Nibble Values</name>
        <t>
   The use of the PFN stemmed from the desire to
   heuristically identify IP packets for load-balancing purposes.  It
   was then discovered that non-IP packets, misidentified as IP when the
   heuristic failed, were being badly load balanced, leading to
   <xref target="RFC4928" format="default"/>.  This situation may confuse some as to the relationship
   between the Post-stack First Nibble Registry and the IP Version Numbers
   registry.  These registries are quite different:</t>
        <ol spacing="normal" type="1">
        <li>The IP Version Numbers registry's explicit purpose is to track IP
       version numbers in an IP header.</li>
          <li>The Post-stack First Nibble registry's purpose is to track PSH types.</li>
        </ol>
        <t>
   The only intersection points between the two registries is for values
   0x4 and 0x6 (for backward compatibility).  There is no need to track
   future IP version number allocations in the Post-stack First Nibble
   registry.</t>
      </section>

      <section anchor="sect-2.5" numbered="true" toc="default">
        <name>Next Step to More Deterministic Load -balancing in an MPLS Network</name>
   <t>
Network evolution is impossible to control, but it develops over a period of time determined by various factors.
This document prevents further proliferation of the implementations that could lead to undesired effects affecting data flow.
At some time in the future, it was planned to obsolete MPLS encapsulations without PSH of non-IP payload. Before that
it is paramount to collect sufficient evidence that there are no marketed or deployed implementations using the heuristic practice
to load-balancing MPLS data flows.
  </t>
        </section>
      
    </section>
    
    <section anchor="sect-3" numbered="true" toc="default">
      <name>IANA Considerations</name>
      
      <section anchor="sect-3.1" numbered="true" toc="default">
        <name>The Post-stack First Nibble Registry</name>
        
        <t>
   This memo requests IANA to create a registry group called "Post-Stack First Nibble Registry"
   that consists of a single registry called "Post-Stack First Nibble Registry".
   The registry should be created as shown in <xref target="iana-pfn-value-tbl"/>.
   The assignment policy for the registry is Standards Action <xref target="RFC8126"/>. It is important to note, that
   the same PFN value can be used in more than one protocol. The correct interpretation of the PFN in a PSH
   can be made only in the context of the LSE or a group of LSEs in the preceding label stack that characterize the type
   of the PSH and, consequently, PFN.
        </t>

        <table anchor="iana-pfn-value-tbl" align="center">
          <name>Post-stack First Nibble Values</name>
          <thead>
            <tr>
              <th align="left">Protocol</th>
              <th align="left">Value</th>
              <th align="center">Description</th>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">DetNet</td>
              <td align="left">0x0</td>
              <td align="center">DetNet Control Word</td>
              <td align="left">RFC 8964</td>
            </tr>
            <tr>
              <td align="left">NSH</td>
              <td align="left">0x0</td>
              <td align="center">NSH (Network Service Header) Base Header, payload</td>
              <td align="left">RFC 8300</td>
            </tr>
            <tr>
              <td align="left">PW</td>
              <td align="left">0x0</td>
              <td align="center">PW Control Word</td>
              <td align="left">RFC 4385</td>
            </tr>
            <tr>
              <td align="left">DetNet</td>
              <td align="left">0x1</td>
              <td align="center">DetNet Associated Channel</td>
              <td align="left">RFC 9546</td>
            </tr>
            <tr>
              <td align="left">MPLS</td>
              <td align="left">0x1</td>
              <td align="center">MPLS Generic Associated Channel</td>
              <td align="left">RFC 5586</td>
            </tr>
            <tr>
              <td align="left">PW</td>
              <td align="left">0x1</td>
              <td align="center">PW Associated Channel</td>
              <td align="left">RFC 4385</td>
            </tr>
            <tr>
              <td align="left">NSH</td>
              <td align="left">0x2</td>
              <td align="center">NSH Base Header, OAM</td>
              <td align="left">RFC 8300</td>
            </tr>
            <tr>
              <td align="left"/>
              <td align="left">0x3</td>
              <td align="center">Unassigned</td>
              <td align="left"/>
            </tr>
            <tr>
              <td align="left"/>
              <td align="left">0x4</td>
              <td align="center">Reserved, not to be assigned</td>
              <td align="left"/>
            </tr>
            <tr>
              <td align="left">BIER</td>
              <td align="left">0x5</td>
              <td align="center">BIER Header</td>
              <td align="left">RFC 8296</td>
            </tr>
            <tr>
              <td align="left"/>
              <td align="left">0x6</td>
              <td align="center">Reserved, not to be assigned</td>
              <td align="left"/>
            </tr>
            <tr>
              <td align="left"/>
              <td align="left">0x7 - 0xF</td>
              <td align="center">Unassigned</td>
              <td align="left"/>
            </tr>
</tbody>
</table>

      </section>
    </section>
 
    <section anchor="sec-sect" numbered="true" toc="default">
    <name>Security Considerations</name>
    <t>
This document creates a new IANA registry for and specifies changes to the treatment in the data plane
of packets based on the first nibble of data beyond the MPLS label stack. One intent of this is to reduce
or eliminate errors in determining whether a packet being transported by MPLS is IP or not.
While such errors have primarily caused unbalanced and, thus, inefficient multi-pathing,
they have the potential to cause more severe security problems.
    </t>
    <t>
     For general MPLS label stack security considerations, see <xref target="RFC3032"/>.
     </t>
    </section>
        
          <section anchor="Ack-sec" numbered="true" toc="default">
      <name>Acknowledgements</name>
      <t>The authors express their appreciation and gratitude to Donald E. Eastlake 3rd for the review, insightful questions, and helpful comments.
      Also, the authors are gateful to Amanda Baber for helping organize the IANA registry in clear and consise manner.</t>
      </section>
      
     </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.3032.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.4385.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8200.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.4928.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6790.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8469.xml"/>
 <!--       <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8300.xml"/>  -->
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8296.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8964.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6391.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.0791.xml"/>
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.2780.xml"/>
        </references>

      <references>
        <name>Informative References</name>
        <!-- <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.4364.xml"/> -->
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.4761.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.7432.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.4446.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.4762.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5586.xml"/>
        <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.7274.xml"/>
        <xi:include href="https://datatracker.ietf.org/doc/bibxml3/draft-ietf-mpls-mna-fwk.xml"/>
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8300.xml"/>
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.9546.xml"/>
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8126.xml"/>
      </references>
    </references>

  </back>

</rfc>
