<?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-01" category="std" ipr="trust200902" obsoletes="" updates="RFC 4928, RFC 8469" xml:lang="en" symRefs="true" sortRefs="false" 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-01"/>
    <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</organization>
        <address>
        <email>loa@pi.nu</email>
        </address>
    </author>
    <date year="2023"/>
    <workgroup>MPLS Working Group</workgroup>
    <abstract>
      <t>
   The goal of this memo is to create a new IANA registry (called the
   MPLS 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 makes processing MPLS
   packets easier and more robust.</t>
      <t>
   There is an important caveat on the use of this registry versus the
   IP version number registry.</t>
      <t>
   This memo, if published, would update <xref target="RFC4928" format="default"/> and <xref target="RFC8469" format="default"/>.</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, BIER headers
   and the like, as well as new types of PSH being discussed in the MPLS
   Open Design Team meetings.  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 post-stack
   header.  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 MPLS first nibble
    (MFN) in a PSH can be made only in the context of the 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 is not well documented,
   nor are the assignments of values.  This memo serves three purposes:</t>
      <ul spacing="normal">
        <li>To document the assignments already made.</li>
        <li>To provide for the clear documentation of future assignments
      through the creation of an "MPLS First Nibble registry".</li>
        <li>Provide a method to tracking usage by requiring more consistent
      documentation.</li>
        <li>To reiterate the importance that any MPLS packet not carrying
      plain IPv4 or IPv6 packets MUST contain a PSH.</li>
      </ul>
      <t>
   There have been suggestions during discussions at the MPLS Open
   Design Team meetings that this document may serve as a registry for
   the PSH "headers of headers" types; however, this change needs WG
   consensus.</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
   BCP14 <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>LSR:</dt>
          <dd>
            <t>
	label switching router.
            </t>
            <t/>
          </dd>
          <dt>MPLS packet:</dt>
          <dd>
            <t>
	one whose Layer 2 header declares the type to be MPLS.
            </t>
            <t>
	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)
            </t>
            <t>
	after the Layer 2 header, up to and including the label with the
      BoS bit set (<xref target="RFC3032" format="default"/>).
            </t>
          </dd>
          <dt>MPLS First Nibble (MFN):</dt>
          <dd>
            <t>
	the most significant four bits of the first
            </t>
            <t>
	octet following the label stack.
            </t>
          </dd>
          <dt>MPLS Payload:</dt>
          <dd>
            <t>
	all data after the label stack, including the MFN, an
            </t>
            <t>
	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
            </t>
            <t>
	LSR (and possibly to transit LSRs).  Examples include a control
      word or an associated channel.  The PSH MUST indicate its length,
      so that a parser knows where the embedded packet starts.
            </t>
          </dd>
          <dt>Embedded Packet:</dt>
          <dd>
            <t>
	All octets beyond the PSH (if any).  This could be
            </t>
            <t>
	an IPv4 or IPv6 packet (e.g., for traffic engineering of IP
      packets, or for a Layer 3 VPN <xref target="RFC4364" format="default"/>), 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>
        </dl>
        <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">
          <artwork name="" type="" align="left" alt=""><![CDATA[
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\
A | (MFN) |                   IP packet                           | |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                             data                              | |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                                 ...                                |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                        end of IP packet                       | |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+/


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


  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\
C | (MFN) |                      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.  The full 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 MFN
   (MPLS First Nibble) 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 MFN
   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>
    <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 many types of embedded packet.  The most
   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, and in principle, any Layer 2
   embedded packet is permissible; indeed, in the past, PPP, Frame Relay
   and ATM packets were reasonably common.</t>
        <t>
   In addition, there may be a post-stack header ahead of the embedded
   packet, and this needs be to parsed.  The MPLS First Nibble is
   currently used for both of these purposes.</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 the (non-SPL) labels in the stack.</li>
            <li>One can do even better by "divining" the type of embedded packet,
       and using fields from the guessed header.</li>
            <li>One can do best by using either an Entropy Label <xref target="RFC6790" format="default"/> or a
       FAT Pseudowire Label <xref target="RFC6391" format="default"/>; see <xref target="sect-2.1.3" 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 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 dangerous) 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.  This in turn indicates where to find
   the relevant fields for load balancing.  The heuristic goes roughly
   as follows:</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 MFN 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 MFN is 0x6 (0101b), treat the payload as an IPv6 packet,
       and find the relevant fields for load balancing on that basis.</li>
              <li>If the MFN 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 MFN is the first nibble of the OUI of the
   destination MAC address, which can be 0x4 or 0x6, and if so would
   lead to very bad load balancing.  This behavior can happen to other
   types of non-IP payload as well.</t>
            <t>
   This 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"/> or a BIER
   header <xref target="RFC8296" format="default"/>) where the MPLS First Nibble 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 RAC
   as a result of operational difficulties with pseudowires that did not
   contain the control word.</t>
            <t>
   This memo introduces a requirement and a recommendation, the first
   building on the above; the second deprecating the use of the
   heuristic in <xref target="sect-2.1.1.1" format="default"/>.  The intent of both of these is that
   legacy routers continue to operate as they have, with no new problems
   introduced as a result of this memo.  However, new implementations
   SHOULD follow these recommendations for more robust operation.</t>
          </section>
        </section>
        <section anchor="sect-2.1.2" numbered="true" toc="default">
          <name>Requirement</name>
          <t>
   Going forward, network equipment MUST use a post-stack header with an
   MPLS First Nibble value that is not 0x4 or 0x6 in all cases when the
   MPLS payload is not an IP packet.  Effectively, <xref target="examples-fig"/>, B is
   disallowed.  [Ed. note: AGREED???]</t>
          <t>This replaces the following text from <xref target="RFC4928" format="default"/>, section 3, paragraph 3:</t>
          <t>
   "It is REQUIRED, however, that applications depend 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>
          <t>This also replaces the following text from <xref target="RFC8469" format="default"/>, section 4, paragraph 1:</t>
          <t>
   "This document updates [RFC4448] to state that both the ingress provider edge (PE) and the egress PE SHOULD support
   the Ethernet PW CW and that, if supported, the CW MUST be used."
   </t>
        </section>
        <section anchor="sect-2.1.3" numbered="true" toc="default">
          <name>Recommendation</name>
          <t>
   It is RECOMMENDED that, going forward, if good load balancing of MPLS
   packets is desired, either an Entropy Label or a FAT Pseudowire Label
   SHOULD be used; furthermore, going forward, the heuristic in
   <xref target="sect-2.1.1.1" format="default"/> MUST NOT be used.  [AGREED???]</t>
          <t>
   A consequence of Recommendation 2 is that, while legacy routers may
   look for a MPLS First Nibble of 0x4 <xref target="RFC0791"/> or 0x6 <xref target="RFC8200"/>, no router will look for a
   MPLS First Nibble of 0x7 (or whatever the next IP version number 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 First Nibble values will be used to identify IP
   packets.</t>
          <t>
   This obviates the need for paragraph 4, section 3 in <xref target="RFC4928" format="default"/>:</t>
          <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 loadsplit 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 loadsplitting,
   but would also not be able to get the performance benefits."</t>
          <t>
   This also expands the MFN Registry to all 16 possible values, not
   just 0x0 and 0x1.</t>
        </section>
        <section anchor="sect-2.1.4" numbered="true" toc="default">
          <name>Parsing the Post-stack Header</name>
          <t>
   Given the above recommendations on the use of a post-stack header and
   future non-use of the heuristic (<xref target="sect-2.1.1.1" format="default"/>) via the use of
   Entropy or FAT Pseudowire Labels, the main reason for creating a
   First Nibble registry is to document the types of post-stack headers
   that may follow a label stack, and to simplify their parsing.</t>
        </section>
      </section>
      <section anchor="sect-2.2" numbered="true" toc="default">
        <name>Why Create a Registry</name>
        <t>
   The MPLS WG is currently engaged in updating the MPLS architecture;
   part of this work may involve the use of post-stack headers.  That might be more challenging
   if post-stack header values are allocated on an ad hoc
   basis, and their parsing and semantics is ill-specified.  Consider
   that the MPLS First Nibble value of 0x0 has two different formats,
   depending on whether the post-stack header is a pseudowire control
   word or a DetNet control word; disambiguation requires the context of
   the service label.  This was a considered decision; documenting this
   would be helpful to future implementors.</t>
        <t>
   With a registy, post-stack headers become easier to parse;
   not needing means outside the data plane to interpret
   them correctly; and their semantics and usage are documented.  (Thank
   you, IANA!)</t>
      </section>
      <section anchor="sect-2.3" numbered="true" toc="default">
        <name>Caveat</name>
        <t>
   The use of the MPLS First Nibble 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 relationship
   between the MPLS 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 MPLS First Nibble registry's purpose is to track post-stack
       header 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 MPLS First Nibble
   registry.</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>MPLS First Nibble Registry</name>
        <t>
   This memo recommends the creation of an IANA registry called "The MPLS First Nibble Registry" with the following values:
   <!--
   draft-kbbma-mpls-1stnibble-04.txt(544): Warning: Unexpected title: expected
   'Figure ...', found 'Table 1: MPLS First Nibble Values'.  This looks like a
   figure that has been entered as a texttable.  The generated XML will need
   adjustment.
   -->
        </t>
 
       <table anchor="first-nibbleallocation-tbl" align="center">
          <name>MPLS First Nibble Values</name>
          <thead>
            <tr>
              <th align="left">Value</th>
              <th align="center">Description</th>
              <th align="left">Reference</th>
              <th align="left">Allocation Policy</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">0x0</td>
              <td align="center">PW Control Word</td>
              <td align="left">RFC&nbsp;4385</td>
              <td align="left"/>
            </tr>
             <tr>
              <td align="left">0x0</td>
              <td align="center">DetNet Control Word</td>
              <td align="left">RFC&nbsp;8964</td>
              <td align="left"/>
            </tr>
            <tr>
              <td align="left">0x0</td>
              <td align="center">NSH Base Header, Payload</td>
              <td align="left">RFC&nbsp;8300</td>
              <td align="left"/>
            </tr>
            <tr>
              <td align="left">0x1</td>
              <td align="left">PW Assoc Channel </td>
              <td align="left">RFC&nbsp;4385</td>
              <td align="left"/>
            </tr>
            <tr>
              <td align="left">0x1</td>
              <td align="center">DetNet Assoc Channel</td>
              <td align="left">draft-ietf-detnet-mpls-oam</td>
              <td align="left"/>
            </tr>
            <tr>
              <td align="left">0x2</td>
              <td align="center">NSH Base Header, OAM</td>
              <td align="left">RFC&nbsp;8300</td>
              <td align="left"/>
            </tr>
            <tr>
              <td align="left">0x3</td>
              <td align="center">Unallocated            </td>
              <td align="left"/>
              <td align="left">Standards Action</td>
            </tr>
            <tr>
              <td align="left">0x4</td>
              <td align="center">IPv4 header</td>
              <td align="left">RFC&nbsp;791</td>
              <td align="left"/>
            </tr>
             <tr>
              <td align="left">0x5</td>
              <td align="center">BIER header</td>
              <td align="left">RFC&nbsp;8296</td>
              <td align="left"/>
            </tr>
             <tr>
              <td align="left">0x6</td>
              <td align="center">IPv6 header</td>
              <td align="left">RFC&nbsp;8200</td>
              <td align="left"/>
            </tr>
             <tr>
              <td align="left">0x7 - 0xE</td>
              <td align="center">Unallocated</td>
              <td align="left"/>
              <td align="left">Standards Action</td>
            </tr>
               <tr>
              <td align="left">0xF</td>
              <td align="center">Reserved for expansion</td>
              <td align="left">This document</td>
              <td align="left"/>
            </tr>
          </tbody>
        </table>

        <section anchor="sect-3.1.1" numbered="true" toc="default">
          <name>Allocation Policy</name>
          <t>
   All new values registered here MUST use the Standards Action policy
   <xref target="RFC8126" format="default"/>.</t>
        </section>
      </section>
    </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.8126.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"/>
        </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"/>
      </references>
    </references>
  </back>
</rfc>
