<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE rfc [ <!ENTITY nbsp " "> <!ENTITY zwsp "​"> <!ENTITY nbhy "‑"> <!ENTITY wj "⁠"> ]> <rfc xmlns:xi="http://www.w3.org/2001/XInclude" submissionType="IETF" docName="draft-ietf-mpls-1stnibble-13" number="9790" consensus="true" 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> <titleabbrev="1st nibble">IANAabbrev="First Nibble Following Label Stack">IANA Registry and Processing Recommendations for the First Nibble Following a Label Stack</title> <seriesInfoname="Internet-Draft" value="draft-ietf-mpls-1stnibble-13"/>name="RFC" value="9790"/> <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<city>Sunnyvale</city> <region>CA</region> <code>94089</code> <country>United States ofAmerica</street>America</country> </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><city>Beijing</city> <code>100095</code> <country>China</country> </postal> <email>jie.dong@huawei.com</email> </address> </author> <dateyear="2024"/> <workgroup>MPLS Working Group</workgroup>year="2025" month="May"/> <area>RTG</area> <workgroup>mpls</workgroup> <abstract> <t> This document creates a new IANA registry (called thePost-stack"Post-Stack FirstNibbleNibble" registry) for the first nibble (4-bit field) immediately following an MPLS label stack. Furthermore, this documentsets outpresents somedocumentationrequirements for registering newvalues,values andrequirements that makemaking the processing of MPLS packets easier and more robust. </t> <t>The relationship between the IANAIP Version Numbers (RFC 2780)"Post-Stack First Nibble" registry and thePost-stack First Nibble"IP Version Numbers" registry (RFC 2780) 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)Post-Stack Header (PSH), and an optional embedded packet (in that order). Examples of PSH include existing artifacts such asControl Wordscontrol words <xref target="RFC4385"/>, BIER(Bit-Indexed(Bit Index 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 very few clues regarding thePSH,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 contextassociated usingestablished through the control or management plane with the Label StackElementEntry (LSE) or group of LSEs in the preceding label stack thatcharacterizecharacterizes the type of thePSH, and that anyPSH. Any attempt to rely on the value in any other context is unreliable. Because the PFN value should not be used to deduce the type of PSH byitself,itself and the space of PFN values is limited, there-usereuse of PFNvalues, where that is possible,values isencouraged.</t>encouraged when possible.</t> <t> The semantics and usage of the first nibble are not well documented, nor are the assignments of values. This document 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"Post-Stack FirstNibble registry",Nibble" registry anddocumentdescribe the relationship between it and the IANAIP"IP VersionNumbersNumbers" registry <xref target="RFC2780"/>.</li> <li>Provide a method for tracking usage by requiring more detailed documentation.</li> <li>To stressthe importancethat any MPLS packet not carrying plain IPv4 or IPv6 packets contains aPSH, includingPSH. This also applies to packets of any new version of IP(<xref(see <xref target="sect-2.3"/>).</li> </ul> <t>Based on the<xref target="sect-2.1.1"/> of this document includes an analysis of load-balancingtechniques in <xref target="sect-2.1.1"/>, this document, intechniques; based on this, <xreftarget="sect-2.1.1.1"/>,target="sect-2.1.1.1"/> introduces a requirement that deprecates the use of the heuristic method for identifying the type of packet encapsulated in MPLS and recommends using a dedicated label value for load balancing. The intentof bothis for legacy routers to continue operating as they have, with no new problems introduced as a result of this document. However, new implementations that follow this document 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> <sectionanchor="sect-1.1"anchor="req-lang" numbered="true" toc="default"><name>Conventions and Definitions</name><name>Requirements Language</name> <t> The key words"MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY","<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>", "<bcp14>MAY</bcp14>", and"OPTIONAL""<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as described inBCP 14BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they appear in all capitals, as shownhere.</t>here. </t> </section> <section anchor="definitions" numbered="true" toc="default"> <name>Definitions</name> <dl newline="false" spacing="normal"><dt>MPLS packet:</dt> <dd> <t> one whose Layer 2 header declares<dt>Deprecation:</dt> <dd>Regardless of how thetype to be MPLS. For example, for Ethernetdeprecation is understood in other IETF documents, theEthertypeinterpretation in this document is0x8847that if a practice has been deprecated, that practice should not be included in new implementations or0x8848, and for PPPdeployed in new deployments.</dd> <dt>Embedded Packet:</dt> <dd>A packet that follows immediately after theProtocol field is 0x0281MPLS label stack and an optional PSH. The embedded packet could be an IPv4 or0x0283. </t>IPv6 packet, an Ethernet packet (for Virtual Private LAN Service (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"/>. </dd> <dt>Label Stack:</dt><dd> <t> (of<dd>For an MPLSpacket)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<xref target="RFC3032"format="default"/>). </t> </dd> <dt>Post-stack First Nibble (PFN):</dt> <dd> <t>format="default"/>.</dd> <dt>MPLS Packet:</dt> <dd>A packet whose Layer 2 header declares themost significant four bits oftype to be MPLS. For example, thefirst octet followingEthertype is 0x8847 or 0x8848 for Ethernet, and thelabel stack. </t> </dd>Protocol field is 0x0281 or 0x0283 for PPP.</dd> <dt>MPLS Payload:</dt><dd> <t> all<dd>All data after the label stack, including the PFN, an optional post-stack header, and the embeddedpacket. </t> </dd>packet.</dd> <dt>Post-stack First Nibble (PFN):</dt> <dd>The most significant four bits of the first octet following the label stack.</dd> <dt>Post-Stack Header (PSH):</dt><dd> <t> optional<dd>Optional field of interest to the egress Label Switching Router (LSR) (and possibly to transit LSRs). Examples include a control word <xreftarget="RFC4385"/>,target="RFC4385"/> <xref target="RFC8964"/> or an associated channel <xreftarget="RFC4385"/>,target="RFC4385"/> <xreftarget="RFC5586"/>,target="RFC5586"/> <xref target="RFC9546"/>. The PSHMUST<bcp14>MUST</bcp14> indicate its length, so that a parser knows where the embedded packetstarts. </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>starts.</dd> </dl> </section> <section anchor="abbrev-sec" numbered="true" toc="default"> <name>Abbreviations</name><t>LSR: Label Switching Router</t> <t>LSE: Label<dl spacing="normal" newline="false" indent="7"> <dt>BIER:</dt><dd>Bit Index Explicit Replication</dd> <dt>FAT:</dt><dd>Flow-Aware Transport</dd> <dt>LSE:</dt><dd>Label StackElement</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: MPLSEntry</dd> <dt>LSR:</dt><dd>Label Switching Router</dd> <dt>MNA:</dt><dd>MPLS NetworkAction</t> <t>BIER: Bit-Indexed Explicit Replication</t>Action</dd> <dt>PFN:</dt><dd>Post-stack First Nibble</dd> <dt>PSH:</dt><dd>Post-Stack Header</dd> <dt>PW:</dt><dd>Pseudowire</dd> <dt>SPL:</dt><dd>Special-Purpose Label</dd> </dl> </section> <section anchor="sect-figs" numbered="true" toc="default"> <name>Reference Figures</name> <t><xref target="mpls-packet-fig"/> echoes the format of MPLS packets as defined in <xref target="RFC3032"/> where TC indicates the Traffic Class field <xref target="RFC5462"/> that replaced the EXP (Experimental Use) field, S is theBottom-of-StackBottom of Stack flag, and TTL is the Time to Live field.</t> <figure anchor="mpls-packet-fig"> <name>Example of an MPLS PacketWithwith 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 header | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 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"/><!-- [rfced] We updated this text as shown below. Specifically, we moved the third sentence of the first paragraph to follow the list and updated "A." to read "Example A:". Let us know any concerns. Original: Figure 1 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"/>.Figure 2. The complete MPLS packet thus would consist of [X Y A], or [X Y B], or [X YC].</t> <t>C]. A. The first payload is a bare IP packet, i.e., no PSH. The PFN in this case overlaps with the IP versionnumber.</t> <t>number. 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 tobe.</t> <t>be. 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 ornon-IP.</t>non-IP. Updated: Figure 1 shows an MPLS packet with a Layer 2 header X and a label stack Y ending with Label-n. Figure 2 displays three examples of an MPLS payload: Example A: The first payload is a bare IP packet, i.e., no PSH. The PFN in this case overlaps with the IP version number. Example 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. Example C: This 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. Thus, the complete MPLS packet would consist of [X Y A], [X Y B], or [X Y C]. --> <xref target="mpls-packet-fig"/> shows an MPLS packet with a Layer 2 header X and a label stack Y ending with Label-n. <xref target="examples-fig"/> displays three examples of an MPLS payload:</t> <dl spacing="normal" newline="false"> <dt>Example A:</dt><dd>The first payload is a bare IP packet, i.e., no PSH. The PFN in this case overlaps with the IP version number.</dd> <dt>Example B:</dt><dd>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.</dd> <dt>Example C: </dt><dd>This 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.</dd> </dl> <t>Thus, the complete MPLS packet would consist of [X Y A], [X Y B], or [X Y C].</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 destinationMACMedia Access Control (MAC) address.</li> </ol> <t> Many other packet types are possible; in principle, any Layer 2 embedded packet is permissible. Indeed, at some points in time, packets of the Point-to-Point Protocol, Frame Relay, and Asynchronous Transfer Modeprotocolswere reasonablycommon,common and may become so again. </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. </t> <section anchor="sect-2.1.1" numbered="true" toc="default"> <name>ECMP 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<li>Use the top label alone.</li><li>One can do better by using<li>Use all of the non-SPLs(Special Purpose Labels)<xref target="RFC7274"/> in thestack.</li> <li>One can do evenstack. This is betterby "divining"than using the top label alone.</li> <li>"Divine" the type of embeddedpacket,packet andusinguse fields from the guessed header. The ramifications of using this load-balancing technique are discussed in detail in <xreftarget="sect-2.1.1.1"/>.</li> <li>One can do best by usingtarget="sect-2.1.1.1"/>. This way is better than the two ways above.</li> <li>Use 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>format="default"/>). This is the best way.</li> </ol> <t> Load balancing based on just the top label means that all packets with that top label will go the sameway -- thisway, which 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,However, if the embedded packet is an IP packet, then the combination of (<source IP address>, <dest IP address>, <transport protocol>, <source port>, and <dest port>) from the IP header of the embedded packet forms an excellent basis forload-balancing.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 firstnibble,nibble of an IP header, i.e., the four most significant bits of the first octet,of an IP headercontains the IP version number. That, in turn, indicates where to find the relevant fields forload-balancing.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 ECMP 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 forload-balancingload balancing on that basis.</li> <li>If the PFN is 0x6 (0110b), treat the payload as an IPv6 packet, and find the relevant fields forload-balancingload balancing on that basis.</li> <li>If the PFN is anything else, the MPLS payload is not an IP packet; fall back toload-balancingload balancing using the label stack.</li> </ol> <t> This heuristic has been implemented in many (legacy)routers,routers and performs well in the case of example A in <xreftarget="examples-fig"/>, A.target="examples-fig"/>. However, this heuristic can work very badly for non-IP packet as shown in example B in <xreftarget="examples-fig"/>, B.target="examples-fig"/>. 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 or0x6, and if so0x6. This 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-balancingheuristicheuristic, 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"/>, aDetNetDeterministic Networking (DetNet) control word <xref target="RFC8964" format="default"/>, a Network Service Header (NSH) <xref target="RFC8300"/>, or a BIER header <xref target="RFC8296" format="default"/>) where the PFN is not 0x4 or0x6, to0x6; this explicitlypreventprevents 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<xref target="RFC8469" format="default"/> 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-balancingWhere load balancing of MPLS packets is desired, it is <bcp14>RECOMMENDED</bcp14> that the load-balancing mechanismusesuse 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<bcp14>SHOULD NOT</bcp14> 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 otherPFN,PFN for load-balancing purposes, regardless of what future IP version numbers willbe, for load-balancing purposes.be. This means that the values 0x4 and 0x6 are used to (sometimes incorrectly) identify IPv4 and IPv6 packets, but no otherofPFN values will be used to identify IP packets.</t> <t>This document creates a newPFN Registryregistry for all 16 possiblevalues.</t>values (see <xref target="sect-3"/>).</t> </section> </section> </section> <section anchor="sect-2.1.2" numbered="true" toc="default"> <name>Updatesofto RFC 4928</name><t> The<t>The text in RFC 4928 <xref target="RFC4928"/> concerning the first nibble after the MPLSLabel Stacklabel stack has been updated by thisdocumentdocument, and the heuristic for snooping this nibble has been deprecated.RFC 4928<xref section="3" sectionFormat="of" target="RFC4928"/> isnowupdated as follows:</t> <t>OLDTEXT</t>TEXT:</t> <blockquote><t> It<t>It isREQUIRED,<bcp14>REQUIRED</bcp14>, however, that applicationsdependentdepend 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) ofIP. </t>IP.</t> </blockquote> <t>NEW TEXT:</t> <blockquote><t> Network<t>Network equipmentMUST<bcp14>MUST</bcp14> use a PSH (Post-Stack Header) with a PFN (Post-stack First Nibble) value that is neither 0x4 nor 0x6 in all caseswhenwhere the MPLS payload is neither an IPv6 nor an IPv4packet. </t>packet.</t> </blockquote><!-- <t>[RFC Ed.: Throughout the docuemnt, replace XXXX with the actual RFC number assigned to this document and remove this note.]</t> --> <t> The<t>The following requirement(see(discussed is <xref target="sect-2.1.1.1"/>) replacestheparagraph 4 inSection 3 of RFC 4928<xref section="3" sectionFormat="of" target="RFC4928" format="default"/> as follows:</t> <t>OLD TEXT:</t> <blockquote><t> This<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, andload-splitloadsplit 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 inappropriateload-splitting,loadsplitting, but would also not be able to get the performance benefits.</t> </blockquote> <t>NEW TEXT:</t> <blockquote><t> The<t>The practice of deducing the payload type based on the PFN value is deprecated to avoid inaccurate load balancing. ThisMUST NOT<bcp14>MUST NOT</bcp14> be part of new implementations or deployments.ItThis also means that concerns about load balancing for future IP versions with a version number of 0x0 or 0x1 are no longerrelevant. </t>relevant.</t> </blockquote><t>END</t><t>Furthermore, the following text is appended toSection 1.1 of RFC 4928<xref section="1.1" sectionFormat="of" target="RFC4928"/>:</t> <t>NEW TEXT:</t> <blockquote><t>PSH: Post-Stack Header</t> <t>PFN: Post-stack<dl spacing="normal" newline="false"> <dt>PSH:</dt><dd>Post-Stack Header</dd> <dt>PFN:</dt><dd>Post-stack FirstNibble</t>Nibble</dd> </dl> </blockquote><t>END</t></section> <section anchor="sect-2.2" numbered="true" toc="default"> <name>Why Create a Registry</name> <t>SupportThe framework for MPLS Network Actions (MNAs) is described in <xreftarget="I-D.ietf-mpls-mna-fwk"/>target="RFC9789"/> and is an enhancement to the MPLS architecture. The use ofpost-stack dataPost-Stack Data (PSD) to encode the MNA indicators and ancillary datais described(described insection 3.6<xref section="3.6" sectionFormat="of" target="RFC9789"/>) might place data in thePFN thatPFN, which could conflict with other uses of that nibble. This issue is described insection 3.6.1 of<xreftarget="I-D.ietf-mpls-mna-fwk"/>section="3.6.1" sectionFormat="of" target="RFC9789"/> and is further illustrated by the PFN value of0x00x0, which has two different formats depending on whether the PSH is a pseudowire control word or a DetNet controlword:word; disambiguation requires the context of the service label. </t> <t> With a registry, PSHs become easier to identify andparse;parse. In addition, they do notneeding anyneed a means outside the data plane to interpret themcorrectly;correctly, and their semantics and usage are documented and referencedfromin the registry. </t> </section> <section anchor="sect-2.3" numbered="true" toc="default"> <name>IP Version Numbersversus Post-stackVersus 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 the scenario described in <xref target="RFC4928" format="default"/>. This situation may confuse some as to the relationship between thePost-stack"Post-Stack FirstNibble RegistryNibble" registry and theIP"IP VersionNumbersNumbers" registry. These registries are quite different:</t> <ol spacing="normal" type="1"> <li>TheIP Version Numbers registry'sexplicit purpose of the "IP Version Numbers" registry is to track IP version numbers in an IP header.</li> <li>ThePost-stack First Nibble registry'spurpose of the "Post-Stack First Nibble" registry is to track PSH types.</li> </ol> <t> The only intersection points between the two registriesis forare the values 0x4 and 0x6 (for backward compatibility). </t> </section> <section anchor="sect-2.5" numbered="true" toc="default"> <name>Next Step to More DeterministicLoad-balancingLoad Balancing in MPLS Networks</name> <t>Network evolution is impossible to control, but it develops over a period of time determined by various factors.</t> <t>This document discourages further proliferation of the implementations that could lead to undesired effectsaffectingon data flows. In doing so, it limits the scope of future protocoldevelopments,developments andsothus helps to ensure that future network evolution will be smoother.</t><t>It<t>Obsoleting the use of a PSH for non-IP payloads encapsulated in MPLS would assist with the progress toward a simpler, more coherent system of MPLS dataencapsulation if the use a PSH for non-IP payloads encapsulated in MPLS was obsoleted.encapsulation. However, before that can be done, it is important to collect sufficient evidence that there are no marketed or deployed implementations using the heuristic practice to load-balancing MPLS data flows.</t><t>The<t>Therefore, the nextstep, therefore,steps toward more deterministicload-balancingload balancing in MPLS networksisare togradulallygradually deprecate non-PSH MPLS encapsulations of non-IP data, to cease using heuristicload-balancing,load balancing, and to survey the available and deployed implementations to determine when obsoletion may be achieved.</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 document requestsPer this document, IANAto createhas created a registry group called "Post-Stack FirstNibble Registry"Nibble" that consists of a single registry called the "Post-Stack FirstNibble Registry".Nibble" registry. The initial contents of the registryshould be created asare shown in <xref target="iana-pfn-value-tbl"/>. The assignment policyfor the registryis Standards Action <xref target="RFC8126"/>. It is important tonote,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 oragroup of LSEs in the preceding label stack thatcharacterizecharacterizes the type of the PSH and, consequently, the PFN. </t> <table anchor="iana-pfn-value-tbl" align="center"><name>Post-stack<name>Post-Stack First NibbleValues</name>Registry</name> <thead> <tr> <th align="left">Protocol</th> <th align="left">Value</th> <thalign="center">Description</th>align="left">Description</th> <th align="left">Reference</th> </tr> </thead> <tbody> <tr> <td align="left">DetNet</td> <td align="left">0x0</td> <tdalign="center">DetNetalign="left">DetNet Control Word</td> <tdalign="left">RFC 8964</td>align="left"><xref target="RFC8964"/></td> </tr> <tr> <td align="left">NSH</td> <td align="left">0x0</td> <tdalign="center">NSH (Network Service Header)align="left">NSH Base Header, payload</td> <tdalign="left">RFC 8300</td>align="left"><xref target="RFC8300"/></td> </tr> <tr> <td align="left">PW</td> <td align="left">0x0</td> <tdalign="center">PWalign="left">PW Control Word</td> <tdalign="left">RFC 4385</td>align="left"><xref target="RFC4385"/></td> </tr> <tr> <td align="left">DetNet</td> <td align="left">0x1</td> <tdalign="center">DetNetalign="left">DetNet Associated Channel</td> <tdalign="left">RFC 9546</td>align="left"><xref target="RFC9546"/></td> </tr> <tr> <td align="left">MPLS</td> <td align="left">0x1</td> <tdalign="center">MPLSalign="left">MPLS Generic Associated Channel</td> <tdalign="left">RFC 5586</td>align="left"><xref target="RFC5586"/></td> </tr> <tr> <td align="left">PW</td> <td align="left">0x1</td> <tdalign="center">PWalign="left">PW Associated Channel</td> <tdalign="left">RFC 4385</td>align="left"><xref target="RFC4385"/></td> </tr> <tr> <td align="left">NSH</td> <td align="left">0x2</td> <tdalign="center">NSHalign="left">NSH Base Header, OAM</td> <tdalign="left">RFC 8300</td>align="left"><xref target="RFC8300"/></td> </tr> <tr> <td align="left"/> <td align="left">0x3</td> <tdalign="center">Unassigned</td>align="left">Unassigned</td> <td align="left"/> </tr> <tr> <td align="left"/> <td align="left">0x4</td> <tdalign="center">Reserved, not to be assigned</td>align="left">Reserved</td> <tdalign="left"/>align="left">this document</td> </tr> <tr> <td align="left">BIER</td> <td align="left">0x5</td> <tdalign="center">BIERalign="left">BIER Header</td> <tdalign="left">RFC 8296</td>align="left"><xref target="RFC8296"/></td> </tr> <tr> <td align="left"/> <td align="left">0x6</td> <tdalign="center">Reserved, not to be assigned</td>align="left">Reserved</td> <tdalign="left"/>align="left">this document</td> </tr> <tr> <td align="left"/> <td align="left">0x7 - 0xF</td> <tdalign="center">Unassigned</td>align="left">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 PFNs and specifies changes to the treatment of packets in the data planeof packetsbased on the first nibble of data beyond the MPLS label stack. One intent of this is to reduce or eliminate errors in determining whether or not a packet being transported by MPLS isIP or not.IP. While such errors have primarily causedunbalanced and, thus, inefficient multi-pathing,unbalanced, and thus inefficient, multipathing, they have the potential to cause more severe security problems. </t> <t> For general security considerations involving the MPLS labelstack security considerations,stack, see <xref target="RFC3032"/>. </t> </section> </middle> <back> <references> <name>References</name> <references> <name>Normative References</name> <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml"/> <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml"/> <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3032.xml"/> <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4385.xml"/> <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8200.xml"/> <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4928.xml"/> <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6790.xml"/> <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8469.xml"/> <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8296.xml"/> <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8964.xml"/> <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6391.xml"/> <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.0791.xml"/> <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2780.xml"/> <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5462.xml"/> <!-- draft-ietf-mpls-mna-fwk-15 - companion doc RFC 9789 --> <reference anchor="RFC9789" target="https://www.rfc-editor.org/info/rfc9789"> <front> <title>MPLS Network Action (MNA) Framework</title> <author initials="L." surname="Andersson" fullname="Loa Andersson"> <organization>Huawei Technologies</organization> </author> <author initials="S." surname="Bryant" fullname="Stewart Bryant"> <organization>University of Surrey 5GIC</organization> </author> <author initials="M." surname="Bocci" fullname="Matthew Bocci"> <organization>Nokia</organization> </author> <author initials="T." surname="Li" fullname="Tony Li"> <organization>Juniper Networks</organization> </author> <date month="May" year="2025" /> </front> <seriesInfo name="RFC" value="9789"/> <seriesInfo name="DOI" value="10.17487/RFC9789"/> </reference> </references> <references> <name>Informative References</name> <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4761.xml"/> <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7432.xml"/> <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4446.xml"/> <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4762.xml"/> <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5586.xml"/> <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7274.xml"/> <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8300.xml"/> <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9546.xml"/> <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8126.xml"/> </references> </references> <section anchor="Ack-sec"numbered="true"numbered="false" toc="default"> <name>Acknowledgements</name> <t>The authors express their appreciation and gratitude toDonald<contact fullname="Donald E. Eastlake3rd3rd"/> for the review, insightful questions, and helpful comments. Also, the authors aregatefulgrateful toAmanda Baber<contact fullname="Amanda Baber"/> for helping organize the IANA registry in a clear andconsiseconcise manner.</t><t>Eric Vyncke, John Scudder, Warren Kumari, Murray Kucherawy,<t><contact fullname="Éric Vyncke"/>, <contact fullname="John Scudder"/>, <contact fullname="Warren Kumari"/>, <contact fullname="Murray Kucherawy"/>, andGunter<contact fullname="Gunter Van deVeldeVelde"/> provided helpful comments during IESG review.</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"/> <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5462.xml"/> <xi:include href="https://datatracker.ietf.org/doc/bibxml3/draft-ietf-mpls-mna-fwk.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://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>