RFC 9992

Routing in Fat Trees (RIFT) Key/Value Topology Information Elements Structure and Processing

πŸ“… published June 2026, from ietf

RFC 9992: Routing in Fat Trees (RIFT) Key/Value Topology Information Elements Structure and Processing πŸ¦‹

Written by: J. Head (editor) and T. Przygienda, both at HPE πŸ’Ό Category: Standards Track (it's an official Internet standard, so this one is serious πŸ’…) ISSN: 2070-1721 Date: June 2026 Obsoletes / Updates: nothing is listed in this document's header, so it doesn't replace or update any earlier RFC πŸ™Œ


Abstract ✨

Okay so, the Routing in Fat Trees (RIFT) protocol lets key/value pairs get advertised inside Key-Value Topology Information Elements (KV TIEs) 🧚. And the data in those KV TIEs can be used for literally any imaginable purpose. Iconic. πŸ‘‘

This document spells out how each Key Type works (Well-Known, Organizationally Unique Identifier (OUI), and Experimental) and gives a way to structure the values that go with them. It also defines a Well-Known Key Sub-Type that's used for testing tie-breaking behavior πŸ’–.

Status of This Memo

This is an Internet Standards Track document. 🌈

This document is a product of the Internet Engineering Task Force (IETF). It represents the consensus of the IETF community, and it went through public review before the Internet Engineering Steering Group (IESG) approved it for publication. If you want more on Internet Standards, check out Section 2 of RFC 7841 πŸ“š.

For the current status, any errata, and how to send feedback, go to https://www.rfc-editor.org/info/rfc9992 πŸ”—.

Copyright (c) 2026 IETF Trust and the persons identified as the document authors. All rights reserved. πŸŽ€

This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) as they stand on the publication date. Please read these carefully, because they describe your rights and restrictions for this document. Any Code Components pulled out of this document must include Revised BSD License text, as described in Section 4.e of the Trust Legal Provisions. They're provided without warranty, as described in the Revised BSD License βš–οΈ.

Table of Contents πŸ“

  1.  Introduction
    1.1.  Requirements Language
  2.  Key-Value Structure
    2.1.  Key Sub-Type
    2.2.  Experimental Key Type
    2.3.  Well-Known Key Type
    2.4.  OUI Key Type
  3.  Design Considerations
    3.1.  Tie-Breaking Considerations
      3.1.1.  Southbound KV TIE Tie-Break Sub-Type
    3.2.  Key Target
      3.2.1.  Key Target Processing
  4.  IANA Considerations
    4.1.  RIFT Well-Known Key Sub-Types
      4.1.1.  RIFT Well-Known Key Sub-Types Entries
    4.2.  Expert Review Guidance
  5.  Security Considerations
  6.  References
    6.1.  Normative References
    6.2.  Informative References
  Acknowledgements
  Authors' Addresses

1. Introduction 🌸

RIFT [RFC9692] lets key/value pairs get advertised inside KV TIEs. There are no restrictions on what goes into KV TIEs or what the data is used for. Totally open-ended, bestie 🫢.

For example, it might be really useful to send overlay protocol state from leaf nodes up to the Top-of-Fabric (ToF) nodes. Then you can check the critical state of a fabric-wide service from one ToF node, instead of pulling and reconciling the same info from a bunch of leaf nodes. Less work, more slay πŸ’….

1.1. Requirements Language

Here's the deal with the capital words. 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 read as described in BCP 14 [RFC2119] [RFC8174], but only when they show up in all capitals, exactly like this. πŸ“

2. Key-Value Structure πŸŽ€

This section goes over the generic key structure and what it means. Figure 1 shows the pieces πŸ‘€.

Section 6.1 of [RFC9692] covers how Thrift [THRIFT] is used to define the protocol's packet structure. There are no explicit limits on the Key-Value data or what it's for, but it is RECOMMENDED that a serialized Thrift model also be used to define a KV TIE structure, because it makes interoperability way simpler. [RIFT-AUTO-EVPN] describes this kind of implementation ✨.

      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
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |   Key Type    |               Key Identifier                  |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                      Values (variable)                        |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Figure 1: Generic Key-Value Structure

Here's what each part means 🧩:

Key Type: This is a 1-byte value that identifies the Key Type. Key Type values come from the "RIFTCommonKVTypes" registry defined in [RFC9692].

The valid range is 1 - 255 (2^8-1).

0 is illegal. It MUST NOT be allocated to or used by any implementation. KV TIEs that arrive with this value MUST be discarded and logged at least once. 🚫

Key Identifier: This is a 3-byte value that identifies the specific key and describes the semantics of any values it carries. It SHOULD be unique within the context of the given Key Type ✨.

The valid range is 1 - 16777215 (2^24-1).

0 is illegal. It MUST NOT be allocated to or used by any implementation. KV TIEs that arrive with this value MUST be discarded and logged at least once. 🚫

Values: This is a variable-length value holding the data tied to the Key Identifier. It SHOULD contain 1 or more elements. Whether any contained values exist, their order, whether they can repeat, and so on, is governed by that particular key's specification πŸ’œ.

2.1. Key Sub-Type

The Key Sub-Type is a way to describe the key's semantics in more detail. Figure 2 shows it. The Key Sub-Type MUST be used when the Key Type is Well-Known or Experimental, so you don't run into interoperability issues. For other Key Types it is OPTIONAL 🌷.

      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
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |   Key Type    |  Key Sub-Type |      Key Sub-Identifier       |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                      Values (variable)                        |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Figure 2: Generic Key-Value Structure with Key Sub-Type

Here's the breakdown πŸ”:

Key Sub-Type: This is a 1-byte value that identifies the Key Sub-Type, which describes the key and what it means.

The valid range is 1 - 255 (2^8-1).

0 is illegal. It MUST NOT be allocated to or used by any implementation. KV TIEs that arrive with this value MUST be discarded and logged at least once. 🚫

Key Sub-Identifier: This is a 2-byte value that identifies the specific key and describes the semantics of any values it carries. It SHOULD be unique within the context of the given Key Sub-Type πŸ’….

The valid range is 1 - 65535 (2^16-1).

0 is illegal. It MUST NOT be allocated to or used by any implementation. KV TIEs that arrive with this value MUST be discarded and logged at least once. 🚫

2.2. Experimental Key Type

This section covers the Experimental Key Type πŸ§ͺ.

As Figure 3 shows, the Key Type is set to 1, which marks it as Experimental. The Experimental Key Type MUST support the use of a Key Sub-Type. The Key Sub-Identifier is what identifies the specific key and the semantics of any values it carries ✨.

      0                   1                   2                   3
      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |       1       |  Key Sub-Type |      Key Sub-Identifier       |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                       Experimental Values                     |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Figure 3: Experimental Key Type

2.3. Well-Known Key Type

This section covers the Well-Known Key Type πŸ†.

As Figure 4 shows, the Key Type is set to 2, which marks it as Well-Known. The Well-Known Key Type MUST support the use of a Key Sub-Type. The Key Sub-Identifier is what identifies the specific key and the semantics of any values it carries 🌟.

      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
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |       2       |  Key Sub-Type |      Key Sub-Identifier       |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                      Well-Known Values                        |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Figure 4: Well-Known Key Type

2.4. OUI Key Type

This section covers the OUI (vendor-specific) Key Type. An implementation MAY support it 🏷️.

As Figure 5 shows, the Key Type is set to 3, which marks it as OUI. The Key Identifier MUST use the implementing organization's reserved OUI [OUI] space to indicate the key and the semantics of any values it carries 🏒.

      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
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |       3       |              OUI Key Identifier               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                     Vendor-Specific Values                    |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Figure 5: OUI Key Type

3. Design Considerations 🧠

NOTE: Like [RFC9692], this section uses terms to denote directionality. Specifically, "northbound" means "toward the top of the fabric" and "southbound" means "toward the bottom of the fabric". 🧭

There are no explicit restrictions on how Key-Value elements get used, but it's super important to think these details through πŸ€”. For example, they should not be used to carry topology information that RIFT itself uses to do its distributed computations, because that would likely lead to race conditions in convergence, oscillations, and/or other suboptimal behaviors. Nobody wants that drama πŸ’€.

Deployments might end up with some nodes that support a given KV TIE and others that don't. In that case, nodes that receive KV TIEs they don't recognize (for example, an unknown Key Type) will flood them normally, as specified in Section 6.3.4 of [RFC9692] 🌊.

New Key Types get 3 bytes of key identification space, and new Well-Known Key Sub-Types get 2 bytes. When you decide how that identification space gets used, it's important to think about how much space you actually need, so the registry values get used efficiently. Let's not waste the good stuff πŸ’–βœ¨.

3.1. Tie-Breaking Considerations

okay so, bestie, this is where we talk about KV TIEs getting flooded southbound 🌊✨ mechanisms SHOULD be implemented so we don't end up with network-wide flooding where we can avoid it πŸ™ˆ Key Targets (we'll get to them in Section 3.2) are literally one of those mechanisms πŸ’–

Section 6.8.5.1 of [RFC9692] says only ONE KV TIE gets selected when the same keys come in from multiple northbound neighbors πŸ‘‘ So it is RECOMMENDED that implementations make sure nodes work out their Values inside KV TIEs independently but consistently πŸŽ€ The whole point is to stop multiple ToFs from advertising KV TIEs with identical keys but different Values, because that's a mess 😭 When that happens, the node(s) pick the KV TIE with the highest System ID, and that can cause some unintended chaos πŸ’€ Even a super robust implementation can't fully dodge it, though. Operators should keep in mind it can still happen under failure conditions, like multiple ToFs getting split-brained 🫠

3.1.1. Southbound KV TIE Tie-Break Sub-Type

this section reserves a Key Sub-Type from the "RIFT Well-Known Key Sub-Types" registry 🧚

this Key-Value pair holds info that lets implementations test and verify that tie-breaking works properly for the Southbound Keystore πŸ” All implementations MUST support this Sub-Type. no exceptions bestie πŸ’…

All implementations SHOULD use the Thrift model defined in Section 3.1.1.1. πŸŽ€

   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
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |       2       |      127      |      Key Sub-Identifier       |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |     (System ID,                                               |
  |      Level)                                                   |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

              Figure 6: Southbound Tie-Break Sub-Type

where:

  • System ID: A REQUIRED value indicating the node's unique System ID. πŸ†”
  • Level: A RECOMMENDED value indicating the node's level. πŸ“Ά

3.1.1.1. Thrift Models

this section has the normative Thrift model for testing southbound Key-Value tie-breaking based on System ID πŸ§ͺ Per Section 7 of [RFC9692], all signed values MUST be interpreted as unsigned values. no cap, that's a big one πŸ”₯

include "common.thrift"

namespace py southbound_kv
namespace rs models

const i8            GlobalSystemIdentifierKV  = 127

/** simple type to test correct tie-breaking based on system ID */
struct SystemIdentifierKV {
    1:  required   common.SystemIDType         system_id,
    2:  optional   common.LevelType            level,
}
   Figure 7: RIFT Common Schema for Southbound Key-Value Tie-Break
                             Key Sub-Type

3.2. Key Target

the Key Target is an OPTIONAL 64-bit value that identifies group(s) of node(s) meant to receive a given KV TIE 🎯 Key Targets have a valid range of 0 - 18446744073709551615 (2^64-1) ✨

The Thrift model defined in Section 7.2 of [RFC9692] SHOULD be used for Key Target implementation. 🧡

Figure 8 shows the format πŸ‘€

   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
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                          Key Target                           |
  |                                                               |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |   Key Type    |               Key Identifier                  |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                           Values                              |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

                    Figure 8: Key Target Format

A value of all 0s means every node is meant to receive this KV TIE, and it MUST NOT be used for any other reason 🌈

A value of all 1s means all leaf nodes are meant to receive this KV TIE, and it MUST NOT be used for any other reason πŸƒ

Any other value MUST be derived from the following normative algorithm. Note that while the algorithm is shown as example code written in [Rust], this document does not mandate any particular language for implementation πŸ¦‹

<CODE BEGINS>
/// random seeds used in algorithms to increase entropy
pub const RANDOMSEEDS: [UnsignedSystemID; 3] = [
    67438371571u64,
    37087353685,
    88675895388,
];

/// given a system ID delivers the bits set by the according
/// Bloom Filter in the southbound key value target.
pub (crate) fn target2bits(target: UnsignedSystemID) ->
KeyValueTargetType {
    (0 as usize .. 3)
        .map(|s| {
            let rot = (target ^ RANDOMSEEDS[s]).rotate_left(s as _);
            rot.to_ne_bytes().iter().fold(0,
                            |v: u8, nv| v.rotate_right(4) ^ *nv) % 64
        })
        .fold(0, |v, nv| v | (1 << nv))
}
<CODE ENDS>
               Figure 9: Key Target Standard Algorithm

3.2.1. Key Target Processing

Nodes that support Key Target processing MUST only do it on KV TIEs in the southbound direction 🧭 Key Targets MUST NOT be present on KV TIEs in the northbound direction, and they are ignored and logged at least once πŸ“

Nodes that don't support Key Target processing MUST keep sending KV TIEs to all nodes in the appropriate direction πŸ“€ Also, Key Targets MUST be preserved when KV TIEs are re-originated in the southbound direction πŸ’œ

3.2.1.1. Purging/Rollover

there are a bunch of reasons a node might pick a different KV TIE πŸ”„ For example, the KV TIE is newer because the sequence number went up, the tie-breaking result changed between multiple KV TIEs, or the node lost northbound connectivity to whoever advertised the previously selected KV TIE πŸ˜΅β€πŸ’«

Picture this: Leaf-1, Leaf-2, and Leaf-3 are members of a group represented by Key Target KT1 πŸ§‹ If Leaf-2 gets removed from that group and a newer instance of the KV TIE needs flooding, Leaf-2 has to keep the older KV TIE in the Link State Database (LSDB) until its lifetime expires πŸ«₯ That could lead to suboptimal behavior in the fabric, which is not it πŸ’€

If the new KV TIE being flooded doesn't include the previous Key Target value, then implementations SHOULD flood the newer instance of the KV TIE with a very short lifetime to nodes that belonged to the previous Key Target but not the new Key Target ⏳✨

  1. IANA Considerations

per [RFC8126], IANA created the "RIFT Well-Known Key Sub-Types" registry in the "Routing in Fat Trees (RIFT)" registry group at <https://www.iana.org/assignments/rift> πŸ“‹

IANA has updated the "RIFTCommonKVTypes" registry based on values defined in Section 2 of this document, and this document has been added as a reference πŸŽ€

Experts reviewing requests for new values to either the "RIFTCommonKVTypes" registry or the "RIFT Well-Known Key Sub-Types" registry MUST consider the items in "Expert Review Guidance" Section 4.2 🧐

4.1. RIFT Well-Known Key Sub-Types

IANA created the following registry πŸ—‚οΈ

  • Registry Name: RIFT Well-Known Key Sub-Types
  • Registration Procedures: Expert Review
  • Description: Well-Known Key Sub-Types registry for the RIFT protocol.
  • Reference: RFC 9992

4.1.1. RIFT Well-Known Key Sub-Types Entries

IANA registered the following values in the "RIFT Well-Known Key Sub-Types" registry πŸ’…

+=========+============+============================+===========+
| Value   | Name       | Description                | Reference |
+=========+============+============================+===========+
| 0       | Illegal    | Not allowed.               | RFC 9992  |
+---------+------------+----------------------------+-----------+
| 1-126   | Unassigned                                          |
+---------+------------+----------------------------+-----------+
| 127     | Southbound | Used for testing/verifying | RFC 9992  |
|         | Tie-Break  | Southbound Keystore tie-   |           |
|         | Sub-Type   | breaking behavior.         |           |
+---------+------------+----------------------------+-----------+
| 128-255 | Unassigned                                          |
+---------+-----------------------------------------------------+
         Table 1: RIFT Well-Known Key Sub-Types Entries

4.2. Expert Review Guidance

Experts reviewing requests for values from the "RIFTCommonKVTypes" registry or the "RIFT Well-Known Key Sub-Types" registry are responsible for the following πŸ§‘β€βš–οΈ

  1. Ensuring that the supporting documentation accompanying the request properly defines how Key Identifiers and/or Key Sub-Identifiers are used (e.g., as a boolean, an explicit value, an auto-derived value, etc.).
  2. Ensuring that the supporting documentation provides normative Thrift model(s) (if applicable).
  3. Ensuring that any work originating outside the IETF does not conflict with any work that is already published or in active pursuit of being published.
  4. Security Considerations

this document introduces no new security concerns to RIFT or other specifications referenced in this document, given that KV TIEs are already extensively secured by the RIFT [RFC9692] protocol specification itself πŸ”βœ¨

  1. References

6.1. Normative References

[OUI]      IEEE, "Guidelines for Use of Extended Unique Identifier
           (EUI), Organizationally Unique Identifier (OUI), and
           Company ID (CID)", <https://standards-support.ieee.org/hc/
           en-us/articles/4888705676564-Guidelines-for-Use-of-
           Extended-Unique-Identifier-EUI-Organizationally-Unique-
           Identifier-OUI-and-Company-ID-CID>.

[RFC2119]  Bradner, S., "Key words for use in RFCs to Indicate
           Requirement Levels", BCP 14, RFC 2119,
           DOI 10.17487/RFC2119, March 1997,
           <https://www.rfc-editor.org/info/rfc2119>.

[RFC8126]  Cotton, M., Leiba, B., and T. Narten, "Guidelines for
           Writing an IANA Considerations Section in RFCs", BCP 26,
           RFC 8126, DOI 10.17487/RFC8126, June 2017,
           <https://www.rfc-editor.org/info/rfc8126>.

[RFC8174]  Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC
           2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174,
           May 2017, <https://www.rfc-editor.org/info/rfc8174>.

[RFC9692]  Przygienda, T., Ed., Head, J., Ed., Sharma, A., Thubert,
           P., Rijsman, B., and D. Afanasiev, "RIFT: Routing in Fat
           Trees", RFC 9692, DOI 10.17487/RFC9692, April 2025,
           <https://www.rfc-editor.org/info/rfc9692>.

[Rust]     Rust Foundation, "The Rust Reference",
           <https://doc.rust-lang.org/reference/>.

[THRIFT]   Apache Software Foundation, "Thrift Language
           Implementation and Documentation", commit 66d8976,
           <https://github.com/apache/thrift/tree/0.15.0/doc>.

6.2. Informative References

[RIFT-AUTO-EVPN]
           Head, J., Przygienda, T., and W. Lin, "RIFT Auto-EVPN",
           Work in Progress, Internet-Draft, draft-ietf-rift-auto-
           evpn-06, 8 July 2024,
           <https://datatracker.ietf.org/doc/html/draft-ietf-rift-
           auto-evpn-06>.

Acknowledgements

Thanks to Italo Busi for his very thoughtful review that yielded an improved spec 🫢

Authors' Addresses πŸŽ€

okay so this is where we meet the people behind the spec, bestie 🫢 two HPE folks wrote it, and Jordan is the editor πŸ’…

Jordan Head (editor) πŸ¦‹

Jordan Head (editor)
HPE
1701 East Mossy Oaks Road
Spring, TX 77389
United States of America
Email: jordan.head@hpe.com

Tony Przygienda 🌸

Tony Przygienda
HPE
1701 East Mossy Oaks Road
Spring, TX 77389
United States of America
Email: antoni.przygienda@hpe.com

and that's the whole doc, periodt βœ¨πŸ’–

πŸ“¦ where this page comes from