RFC 9631

The IPv6 Compact Routing Header (CRH)

๐Ÿ“… published August 2024, from ietf

RFC 9631: The IPv6 Compact Routing Header (CRH) โœจ

okay bestie, let's get into this one ๐Ÿฆ‹ RFC 9631 is an Experimental doc (so not a Standards Track thing, just a "let's try it and see" situation ๐Ÿงช) from the IETF, published August 2024 as ISSN 2070-1721. The authors are R. Bonica (Juniper Networks), Y. Kamite (NTT Communications Corporation), A. Alston (Alston Networks), D. Henriques (Liquid Telecom), and L. Jalil (Verizon). It's the one that defines the Compact Routing Header, aka CRH, in two flavours: CRH-16 and CRH-32 ๐ŸŒธ Nothing in the title block obsoletes or updates another RFC, so it's a fresh little experiment, no drama ๐Ÿ’…

Abstract

This doc describes an experiment where two brand-new IPv6 Routing headers get implemented and deployed. Together they're the Compact Routing Header (CRH), and separately they're CRH-16 and CRH-32 ๐Ÿ’–

The experiment has a couple of goals. First, prove the CRH can actually be implemented and deployed in a production network. Second, prove that the security concerns described in the doc can be handled with Access Control Lists (ACLs) ๐Ÿ” Lastly, the doc basically begs people to replicate the experiment ๐Ÿ™

Status of This Memo

Okay, this section is the legal-ish fine print, but it's important ๐Ÿง The doc is not an Internet Standards Track spec. It's published for examination, experimental implementation, and evaluation โœจ

It defines an Experimental Protocol for the Internet community. It's an IETF product, reflects IETF community consensus, got public review, and was approved for publication by the IESG. Not everything the IESG approves is a candidate for an Internet Standard though, so check Section 2 of RFC 7841 for the details ๐Ÿ“š

For the current status, errata, or how to give feedback, go to https://www.rfc-editor.org/info/rfc9631 ๐Ÿ”—

Copyright (c) 2024 IETF Trust and the persons identified as the document authors. All rights reserved ๐Ÿ’œ

This doc is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) as they stood on the publication date. Please actually read these, they cover your rights and restrictions ๐Ÿ“œ Any Code Components pulled out of this doc must include Revised BSD License text, as described in Section 4.e of the Trust Legal Provisions, and they come without warranty as described in that license ๐Ÿซถ


Table of Contents

   1.  Introduction
   2.  Requirements Language
   3.  The Compact Routing Header (CRH)
   4.  The CRH Forwarding Information Base (CRH-FIB)
   5.  Processing Rules
     5.1.  Computing Minimum CRH Length
   6.  Mutability
   7.  Applications and CRH SIDs
   8.  Operational Considerations
   9.  Textual Representations
   10. Security Considerations
   11. Experimental Results
   12. IANA Considerations
   13. References
     13.1.  Normative References
     13.2.  Informative References
   Appendix A.  CRH Processing Examples
     A.1.  The CRH SID list contains one entry for each segment in the
           path.
     A.2.  The CRH SID list omits the first entry in the path.
   Acknowledgements
   Contributors
   Authors' Addresses

1. Introduction ๐ŸŒˆ

IPv6 [RFC8200] source nodes use Routing headers to say which path a packet takes to its destination(s) ๐Ÿ—บ๏ธ The IETF has defined several Routing Types (see [IANA-RT]). This doc defines two new ones, which together are the Compact Routing Header (CRH), and individually CRH-16 and CRH-32 โœจ

The CRH lets IPv6 source nodes specify the path a packet takes to its destination. It can be encoded in relatively few bytes, and the goal is to keep it as small as possible for these reasons:

  • Lots of ASIC-based forwarders copy headers from buffer memory to on-chip memory. Bigger headers mean that copy costs more ๐Ÿ’ธ
  • Path MTU Discovery (PMTUD) [RFC8201] isn't totally reliable, so lots of IPv6 hosts avoid sending packets bigger than the IPv6 minimum link MTU (1280 bytes). When packets are small, a big Routing header is a lot of overhead ๐Ÿ˜ฉ

This doc describes an experiment with these purposes:

  • Demonstrate that the CRH can be implemented and deployed
  • Demonstrate that the security considerations in this doc can be handled with ACLs
  • Encourage replication of the experiment

2. Requirements Language ๐ŸŽ€

The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here.

3. The Compact Routing Header (CRH) ๐Ÿ’…

Both CRH versions (CRH-16 and CRH-32) have these fields:

  • Next Header, as defined in [RFC8200]
  • Hdr Ext Len, as defined in [RFC8200]
  • Routing Type, as defined in [RFC8200] (CRH-16 value is 5, and CRH-32 value is 6.)
  • Segments Left, as defined in [RFC8200]
  • type-specific data, as described in [RFC8200]

In the CRH, the type-specific data field holds a list of CRH Segment Identifiers (CRH SIDs). Each CRH SID points at an entry in the CRH Forwarding Information Base (CRH-FIB) (Section 4). Each CRH-FIB entry identifies an interface on the path the packet takes to its destination ๐Ÿ›ฃ๏ธ

CRH SIDs are listed in reverse order, so the first CRH SID in the list is the final interface on the path ๐Ÿ”„ Because of that reversed order, the Segments Left field can be used as an index into the CRH SID list. In this doc, the "current CRH SID" is the CRH SID list entry that Segments Left references ๐ŸŽฏ

The first CRH SID in the path gets left out of the list unless there's a reason to keep it. Appendix A has an example ๐Ÿ‘€

In CRH-16 (Figure 1), each CRH SID is 16 bits. In CRH-32 (Figure 2), each CRH SID is 32 bits ๐Ÿ”ข

In every case, the CRH MUST end on a 64-bit boundary. So the type-specific data field MUST be padded with zeros if the CRH wouldn't otherwise end on a 64-bit boundary ๐Ÿงธ

      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
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |  Next Header  |  Hdr Ext Len  | Routing Type  | Segments Left |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |             SID[0]            |          SID[1]               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-|
     |                          .........
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-

<center>Figure 1: CRH-16</center>

      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
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |  Next Header  |  Hdr Ext Len  | Routing Type  | Segments Left |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     +                             SID[0]                            +
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     +                             SID[1]                            +
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                          .........
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-

<center>Figure 2: CRH-32</center>

4. The CRH Forwarding Information Base (CRH-FIB) ๐Ÿ—‚๏ธ

Each CRH SID identifies a CRH-FIB entry.

Each CRH-FIB entry contains:

  • An IPv6 address
  • A topological function
  • Arguments for the topological function (optional)

The IPv6 address can be a Global Unicast Address (GUA), a Link-Local Unicast (LLU) address, or a Unique Local Address (ULA). When the IPv6 address is the final address in a path, it can also be a multicast address ๐Ÿ“ก

The topological function says how the processing node forwards the packet to the interface the IPv6 address identifies. Some examples:

  • Forward the packet through the least-cost path to the interface identified by the IPv6 address (i.e., loose source routing).
  • Forward the packet through a specified interface to the interface identified by the IPv6 address (i.e., strict source routing).

Some topological functions need parameters. For example, a topological function might need a parameter that names the interface the packet gets forwarded through ๐Ÿงญ

The CRH-FIB can be populated by:

  • An operator, using a Command Line Interface (CLI)
  • A controller, using the Path Computation Element Communication Protocol (PCEP) [RFC5440] or the Network Configuration Protocol (NETCONF) [RFC6241]
  • A distributed routing protocol, such as those defined in [ISO10589-Second-Edition], [RFC5340], and [RFC4271]

The mechanisms above aren't defined here and are out of scope for this doc ๐Ÿ™…โ€โ™€๏ธ

5. Processing Rules ๐Ÿง 

The following rules describe CRH processing:

  • If Hdr Ext Len indicates that the CRH is larger than the implementation can process, discard the packet and send an ICMPv6 [RFC4443] Parameter Problem, Code 0, message to the Source Address, pointing to the Hdr Ext Len field.
  • Compute L, the minimum CRH length (Section 5.1).
  • If L is greater than Hdr Ext Len, discard the packet and send an ICMPv6 Parameter Problem, Code 6, message to the Source Address, pointing to the Segments Left field.
  • Decrement Segments Left.
  • Search for the current CRH SID in the CRH-FIB. In this doc, the "current CRH SID" is the CRH SID list entry that Segments Left references.
  • If the search doesn't return a CRH-FIB entry, discard the packet and send an ICMPv6 Parameter Problem, Code 0, message to the Source Address, pointing to the current SID.
  • If Segments Left is greater than 0 and the CRH-FIB entry contains a multicast address, discard the packet and send an ICMPv6 Parameter Problem, Code 0, message to the Source Address, pointing to the current SID. (This prevents packet storms ๐ŸŒช๏ธ๐Ÿšซ)
  • Copy the IPv6 address from the CRH-FIB entry to the Destination Address field in the IPv6 header.
  • Submit the packet, its topological function, and its parameters to the IPv6 module.
NOTE: By default, the IPv6 module determines the next hop and forwards the packet. However, the topological function may elicit another behavior. For example, the IPv6 module may forward the packet through a specified interface.

Part 1 of 3 done, bestie! Say the word and I'll pick up with Section 5.1 and onward ๐Ÿ’–

5.1. Computing Minimum CRH Length

Okay so this algorithm takes two inputs bestie: the Routing Type (CRH-16 or CRH-32) and Segments Left ๐Ÿงฎโœจ It spits out L, the minimum CRH length, measured in 8-octet units. The first 8 octets don't count ๐Ÿ’…

  • Routing Type (i.e., CRH-16 or CRH-32)
  • Segments Left
switch(Routing Type) {
    case CRH-16:
        if (Segments Left <= 2)
            return(0)
        sidsBeyondFirstWord = Segments Left - 2;
        sidPerWord = 4;
    case CRH-32:
        if (Segments Left <= 1)
            return(0)
        sidsBeyondFirstWord = Segments Left - 1;
        sidsPerWord = 2;
    case default:
        return(0xFF);
    }

words = sidsBeyondFirstWord div sidsPerWord;
if (sidsBeyondFirstWord mod sidsPerWord)
    words++;

return(words)

6. Mutability ๐Ÿฆ‹

In the CRH, Segments Left is the only mutable field ๐Ÿ”„ Everything else is immutable, so hands off ๐Ÿ™…โ€โ™€๏ธ๐Ÿ”’

7. Applications and CRH SIDs ๐ŸŒ

A CRH holds one or more CRH SIDs ๐Ÿ’Œ Each CRH SID gets processed by exactly one CRH-configured router whose one address matches the packet Destination Address.

So a CRH SID doesn't have to mean something across the whole domain โœจ Applications can pick either domain-wide or node-local significance for their CRH SIDs. Your call, bestie ๐Ÿ’…

8. Operational Considerations ๐Ÿ› ๏ธ

PING and Traceroute [RFC2151] both work correctly with the CRH ๐Ÿ™Œ TCPDUMP and Wireshark have also been extended to support it ๐Ÿฆˆ

PING and Traceroute report 16-bit CRH SIDs for CRH-16 and 32-bit CRH SIDs for CRH-32. It is recommended that the experimental versions of PING use the textual representations described in Section 9 ๐ŸŽ€

9. Textual Representations ๐ŸŒธ

A 16-bit CRH SID can be represented by four lowercase hexadecimal digits. Leading zeros SHOULD be omitted ๐Ÿ“ However, the all-zeros CRH SID MUST be represented by a single 0. Here are some examples:

  • beef
  • eef
  • 0

A 16-bit CRH SID can also be represented in dotted-decimal notation. Examples:

  • 192.0
  • 192.51

A 32-bit CRH SID can be represented by four lowercase hexadecimal digits, a colon (:), and another four lowercase hexadecimal digits. Leading zeros MUST be omitted ๐Ÿ™ˆ Examples:

  • dead:beef
  • ead:eef
  • :beef
  • beef:
  • :

A 32-bit CRH SID can also be represented in dotted-decimal notation. Examples:

  • 192.0.2.1
  • 192.0.2.2
  • 192.0.2.3

10. Security Considerations ๐Ÿšจ

Okay bestie, this section is serious, so read it with your whole brain ๐Ÿง ๐Ÿ”ฅ

In this document, one node trusts another only if both nodes are operated by the same party ๐Ÿค A node figures out whether it trusts another node by looking at its IP address. In many networks, operators number their nodes using a small number of prefixes, which makes it easier to identify trusted nodes ๐Ÿ‘€

A node can run into security vulnerabilities when it processes a Routing header that came from an untrusted node [RFC5095] ๐Ÿ’€ So nodes MUST deploy ACLs that discard packets containing the CRH when both of these are true:

  • The Source Address does not identify an interface on a trusted node.
  • The Destination Address identifies an interface on the local node.

Those ACLs do not protect the node from attack packets with a forged (i.e., spoofed) Source Address ๐Ÿ˜ฑ To lower that risk, nodes MAY also discard packets containing the CRH when all of these are true:

  • The Source Address identifies an interface on a trusted node.
  • The Destination Address identifies an interface on the local node.
  • The packet does not pass an Enhanced Feasible-Path Unicast Reverse Path Forwarding (EFP-uRPF) [RFC8704] check.

The EFP-uRPF check eliminates some, but not all, packets with forged Source Addresses. Therefore, a network operator that deploys CRH MUST implement ACLs on each of its edge nodes. That ACL discards packets whose Source Address identifies an interface on a trusted node ๐Ÿ›ก๏ธ

The CRH is compatible with end-to-end IPv6 Authentication Header (AH) [RFC4302] processing. This is because the source node calculates the Integrity Check Value (ICV) over the packet as it arrives at the destination node ๐Ÿ”

11. Experimental Results ๐Ÿงช

Parties participating in this experiment should publish their experimental results within one year of the publication of this document ๐Ÿ“… The results should address the following:

  • Effort required to deploy
    • Was deployment incremental or network-wide?
    • Was there a need to synchronize configurations at each node, or could nodes be configured independently?
    • Did the deployment require a hardware upgrade?
    • Did the CRH SIDs have domain-wide or node-local significance?
  • Effort required to secure
  • Performance impact
  • Effectiveness of risk mitigation with ACLs
  • Cost of risk mitigation with ACLs
  • Mechanism used to populate the CRH-FIB
  • Scale of deployment
  • Interoperability
    • Did you deploy two interoperable implementations?
    • Did you experience interoperability problems?
    • Did implementations generally implement the same topological functions with identical arguments?
    • Were topological function semantics identical on each implementation?
  • Effectiveness and sufficiency of Operations, Administration, and Maintenance (OAM) mechanisms
    • Did PING work?
    • Did Traceroute work?
    • Did Wireshark work?
    • Did TCPDUMP work?

12. IANA Considerations ๐Ÿ“‹

IANA has registered the following in the "Routing Types" subregistry within the "Internet Protocol Version 6 (IPv6) Parameters" registry ๐Ÿ—‚๏ธ

                +=======+=============+===========+
                | Value | Description | Reference |
                +=======+=============+===========+
                | 5     | CRH-16      | RFC 9631  |
                +-------+-------------+-----------+
                | 6     | CRH-32      | RFC 9631  |
                +-------+-------------+-----------+

                              Table 1

13. References ๐Ÿ“š

13.1. Normative References

13.2. Informative References

Appendix A. CRH Processing Examples ๐Ÿงš

This appendix shows CRH processing in these scenarios:

  • The CRH SID list contains one entry for each segment in the path (Appendix A.1).
  • The CRH SID list omits the first entry in the path (Appendix A.2).

Figure 3 gives the reference topology used in all the examples ๐Ÿ—บ๏ธ and Table 2 describes two entries that appear in each node's CRH-FIB ๐Ÿ’–

 -----------                 -----------                 -----------
|Node: S    |               |Node: I1   |               |Node: I2   |
|Loopback:  |---------------|Loopback:  |---------------|Loopback:  |
|2001:db8::a|               |2001:db8::1|               |2001:db8::2|
 -----------                 -----------                 -----------
     |                                                       |
     |                      -----------                      |
     |                     |Node: D    |                     |
      ---------------------|Loopback:  |---------------------
                           |2001:db8::b|
                            -----------

                    Figure 3: Reference Topology
            +=====+==============+===================+
            | SID | IPv6 Address | Forwarding Method |
            +=====+==============+===================+
            | 2   | 2001:db8::2  | Least-cost path   |
            +-----+--------------+-------------------+
            | 11  | 2001:db8::b  | Least-cost path   |
            +-----+--------------+-------------------+

                        Table 2: Node SIDs

A.1. The CRH SID list contains one entry for each segment in the path. ๐Ÿฆ‹

okay so in this one, Node S sends a packet to Node D through I2, and I2 shows up in the CRH segment list ๐Ÿ’…

      +-----------------------------------+-------------------+
      | Source Address = 2001:db8::a      | Segments Left = 1 |
      +-----------------------------------+-------------------+
      | Destination Address = 2001:db8::2 | SID[0] = 11       |
      +-----------------------------------+-------------------+
      |                                   | SID[1] = 2        |
      +-----------------------------------+-------------------+

๐ŸŒธ Table 3: Packet Travels from S to I2

      +-----------------------------------+-------------------+
      | Source Address = 2001:db8::a      | Segments Left = 0 |
      +-----------------------------------+-------------------+
      | Destination Address = 2001:db8::b | SID[0] = 11       |
      +-----------------------------------+-------------------+
      |                                   | SID[1] = 2        |
      +-----------------------------------+-------------------+

๐Ÿ“ Table 4: Packet Travels from I2 to D

A.2. The CRH SID list omits the first entry in the path. ๐Ÿงš

and here's the twist: Node S sends a packet to Node D through I2 again, but this time I2 is NOT in the CRH segment list ๐Ÿ™ˆ main character energy for the other route, honestly

      +-----------------------------------+-------------------+
      | Source Address = 2001:db8::a      | Segments Left = 1 |
      +-----------------------------------+-------------------+
      | Destination Address = 2001:db8::2 | SID[0] = 11       |
      +-----------------------------------+-------------------+

๐ŸŽ€ Table 5: Packet Travels from S to I2

      +-----------------------------------+-------------------+
      | Source Address = 2001:db8::a      | Segments Left = 0 |
      +-----------------------------------+-------------------+
      | Destination Address = 2001:db8::b | SID[0] = 11       |
      +-----------------------------------+-------------------+

๐Ÿ’œ Table 6: Packet Travels from I2 to D

Acknowledgements โœจ

bestie, huge thank yous to Dr. Vanessa Ameen, Dale Carder, Brian Carpenter, Adrian Farrel, Fernando Gont, Joel Halpern, Naveen Kottapalli, Tony Li, Xing Li, Gerald Schmidt, Nancy Shaw, Mark Smith, Ketan Talaulikar, Reji Thomas, and Chandra Venkatraman for helping make this document happen ๐Ÿซถ you all are literally iconic ๐Ÿ‘‘

Contributors ๐ŸŒˆ

Gang Chen Baidu No.10 Xibeiwang East Road Haidian District Beijing 100193 China Email: phdgang@gmail.com

Yifeng Zhou ByteDance Building 1, AVIC Plaza 43 N 3rd Ring W Rd Haidian District Beijing 100000 China Email: yifeng.zhou@bytedance.com

Gyan Mishra Verizon Silver Spring, MD United States of America Email: hayabusagsm@gmail.com

Authors' Addresses ๐Ÿ’–

Ron Bonica Juniper Networks 2251 Corporate Park Drive Herndon, VA 20171 United States of America Email: rbonica@juniper.net

Yuji Kamite NTT Communications Corporation 3-4-1 Shibaura, Minato-ku, Tokyo 108-8118 Japan Email: y.kamite@ntt.com

Andrew Alston Alston Networks Nairobi Kenya Email: aa@alstonnetworks.net

Daniam Henriques Liquid Telecom Johannesburg South Africa Email: daniam.henriques@liquidtelecom.com

Luay Jalil Verizon Richardson, TX United States of America Email: luay.jalil@one.verizon.com


That's the whole doc, babe ๐ŸŽ‰ the people who made the Internet's CRH stuff work are all listed above, so go give them some love ๐Ÿ’…โœจ

๐Ÿ“ฆ where this page comes from