<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.29 (Ruby 2.6.10) -->
<?rfc {"comments"=>false}="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-pim-deterministic-ecmp-00" category="info" consensus="true" submissionType="IETF" version="3">
  <!-- xml2rfc v2v3 conversion 3.28.1 -->
  <front>
    <title abbrev="PIM Upstream Deterministic ECMP">Deterministic Upstream Neighbor Selection for PIM Joins</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-pim-deterministic-ecmp-00"/>
    <author fullname="Bill Fenner">
      <organization>Arista Networks, Inc.</organization>
      <address>
        <email>fenner@fenron.com</email>
      </address>
    </author>
    <author fullname="Santosh Kumar">
      <organization>Arista Networks, Inc.</organization>
      <address>
        <email>skumar@arista.com</email>
      </address>
    </author>
    <author fullname="Stig Venaas">
      <organization>Cisco Systems, Inc.</organization>
      <address>
        <email>stig@cisco.com</email>
      </address>
    </author>
    <date year="2025" month="May" day="06"/>
    <area>Routing</area>
    <workgroup>Protocols for IP Multicast</workgroup>
    <keyword>ECMP</keyword>
    <keyword>PIM Join</keyword>
    <keyword>Data Center</keyword>
    <abstract>
      <?line 49?>

<t>In densely interconnected networks, a PIM node may have many choices
as to what upstream neighbor to send a JOIN message to, for a given
source and group.  This document describes a mechanism for multiple
nodes (e.g., leaf nodes in a data center) to pick the same upstream
node (e.g., spine node) to avoid redundant traffic flows.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://fenner.github.io/pim-deterministic-ecmp/draft-ietf-pim-deterministic-ecmp.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-pim-deterministic-ecmp/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Protocols for IP Multicast Working Group mailing list (<eref target="mailto:pim@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/pim/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/pim/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/fenner/pim-deterministic-ecmp"/>.</t>
    </note>
  </front>
  <middle>
    <?line 57?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>In a densely interconnected network, there may be many equal-cost
paths to a given source or RP.  RFC7761 is silent on the issue of
how to choose among these, just indicating that RPF_interface(S)
and RPF_interface(RP) have a single answer. If different leaf routers
make different choices, then traffic can flow over extra paths.</t>
      <t>This document introduces two mechanisms: one for two-tier networks
and one for arbitrary multi-tier networks, to allow routers to make the same
decision of which neighbor to use in an ECMP scenario.  This eliminates
undesired redundant traffic flow.</t>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<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 "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

</section>
    <section anchor="hash-algorithm">
      <name>Hash Algorithm</name>
      <t>In this document, the hash algorithm used is Bob Jenkins' one-at-a-time hash.
This is a very high quality, but fast hash function.
<eref target="https://en.wikipedia.org/wiki/Jenkins_hash_function#one_at_a_time">Wikipedia</eref>
has one description of the algorithm.  This hash function is defined on sequences of
octets; it is performed across all of the addresses given in network byte order.</t>
      <t>Pseudocode like <tt>hash( address1, address2, address3 )</tt> conceptually
lays out these addresses adjacent to each other in memory in network
byte order, and performs a single hash operation across all 12 octets.</t>
      <artwork><![CDATA[
+---+---+---+---+---+---+---+---+---+---+---+---+
|    address1   |    address2   |    address3   |
+---+---+---+---+---+---+---+---+---+---+---+---+
]]></artwork>
      <t>Similarly, when there are two IPv6 addresses and a router ID, we
conceptually lay these out identically, simply with larger addresses,
and perform the hash operation across all 36 octets.</t>
      <artwork><![CDATA[
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
|                            address1                           |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
|                            address2                           |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
|   router ID   |
+---+---+---+---+
]]></artwork>
      <t>When the hash involves a color, that 32-bit value in network byte order
takes the place of the 32-bit router ID.</t>
    </section>
    <section anchor="routerid">
      <name>Deterministic Selection by Router-ID</name>
      <t>We use the <xref target="RFC6395"/> Hello Option to allow multiple routers to hash a given (S,G)
join to the same RPF neighbor.  The procedure consists of two phases: first,
we compute <tt>hash( S, G, routerId )</tt> for each eligible RPF neighbor, and select the
highest hash value among this list.  If there are multiple entries with the highest
hash value, we re-hash among this sub-list using <tt>hash( S, G, local-information )</tt>,
and use the highest single resulting hash value.  If multiple hops still hash to
the same value, we simply take the first one in the list.  This results in no
coordination between nodes, since each node may have a different order for the
list.</t>
      <t>The <tt>local-information</tt> is a value local to the router that can be influenced by the
deployment to have the same result between multiple peers - e.g., it could be an
interface name, and the deployment on multiple routers uses the same interface to
connect to the same peer.  It could also be a locally-configured value on each
interface, which results in higher configuration overhead but more deployment
flexibility.</t>
      <figure anchor="RouterIdPseudocode">
        <name>Pseudocode for Deterministic Hashing based on Router ID</name>
        <artwork><![CDATA[
viaMultipathRouterId( source, group, vias )
    bestHash = 0
    bestVias = []
    for via in vias:
        routerId = getRouterId( via )
        curHash = hash( source, group, routerId )
        if curHash > bestHash:
            bestVia = [ via ]
            bestHash = curHash
        else if curHash == bestHash:
            bestVia.append( via )
    bestHash = 0
    if len( bestVia ) == 1:
        return bestVia[0]
    for via in bestVia:
        curHash = hash( source, group, local-information )
        if curHash > bestHash:
            bestVia = via

    return bestVia
]]></artwork>
      </figure>
      <t><cref anchor="_2">pseudocode format TBD</cref></t>
    </section>
    <section anchor="hello-option-to-exchange-color">
      <name>Hello Option to Exchange Color</name>
      <t>We describe a Hello Option to exchange "Color", an abstract notion
of grouping of nodes.  For example, in a 3-tier network, the routers in
the middle tier could be colored by the spine to which they connect in
the top tier. In this way, the color value presented to the leaf routers
by the middle tier is a proxy for the routers in the top tier.</t>
      <t>This Hello option should only be advertised "downwards" towards the
lower levels of the tree.</t>
      <section anchor="color-hello-option-message-format">
        <name>Color Hello Option Message Format</name>
        <t>The PIM Hello Option used to exchange Color values is shown below.</t>
        <figure anchor="ColorHelloOption">
          <name>Color Hello Option</name>
          <artwork><![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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           Type = TBD          |           Length = 4          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                             Color                             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork>
        </figure>
        <t>Type: TBD (see <xref target="iana"/> and <xref target="arista-compatibility"/>)</t>
        <t>Length: In bytes for the value part of the Type/Length/Value encoding.
The Color will be 4 bytes long.</t>
        <t>Color: The color value being advertised by this router.</t>
      </section>
    </section>
    <section anchor="deterministic-selection-by-color">
      <name>Deterministic Selection by Color</name>
      <t>TBD: If not all neighbors advertise color, do we pick from the subset
that do, or we fall back to <xref target="routerid"/>?</t>
      <t>We use the above Hello Option to add an initial round of hashing,
falling back to the algorithm in <xref target="RouterIdPseudocode"/> to break ties.
With this mechanism, the first round is to calculate
<tt>hash( S, G, color )</tt> for each eligible RPF neighbor, and select
the highest hash value among this list.  If there are multiple entries
with the highest hash value, we re-hash among this sub-list
with <tt>viaMultipathRouterId</tt> defined above.</t>
      <figure anchor="ColorPseudocode">
        <name>Pseudocode for Deterministic Hashing based on Color</name>
        <artwork><![CDATA[
viaMultipathColor( source, group, vias )
    bestHash = 0
    bestVias = []
    for via in vias:
        color = getNeighborColor( via )
        curHash = hash( source, group, color )
        if curHash > bestHash:
            bestVia = [ via ]
            bestHash = curHash
        else if curHash == bestHash:
            bestVia.append( via )
    bestHash = 0
    if len( bestVia ) == 1:
        return bestVia[0]
    return viaMultipathRouterId( source, group, bestVia )
]]></artwork>
      </figure>
      <t><cref anchor="_3">pseudocode format TBD</cref></t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>TODO Security</t>
    </section>
    <section anchor="iana">
      <name>IANA Considerations</name>
      <t>IANA is requested to allocate a value from the PIM-Hello Options
registry as shown:</t>
      <table>
        <thead>
          <tr>
            <th align="left">Value</th>
            <th align="left">Length</th>
            <th align="left">Name</th>
            <th align="left">Reference</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">TBD</td>
            <td align="left">4</td>
            <td align="left">Color</td>
            <td align="left">This Document</td>
          </tr>
        </tbody>
      </table>
    </section>
  </middle>
  <back>
    <references anchor="sec-normative-references">
      <name>Normative References</name>
      <reference anchor="RFC6395">
        <front>
          <title>An Interface Identifier (ID) Hello Option for PIM</title>
          <author fullname="S. Gulrajani" initials="S." surname="Gulrajani"/>
          <author fullname="S. Venaas" initials="S." surname="Venaas"/>
          <date month="October" year="2011"/>
          <abstract>
            <t>This document defines a new PIM Hello option to advertise an Interface Identifier that can be used by PIM protocols to uniquely identify an interface of a neighboring router. [STANDARDS-TRACK]</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="6395"/>
        <seriesInfo name="DOI" value="10.17487/RFC6395"/>
      </reference>
      <reference anchor="RFC7761">
        <front>
          <title>Protocol Independent Multicast - Sparse Mode (PIM-SM): Protocol Specification (Revised)</title>
          <author fullname="B. Fenner" initials="B." surname="Fenner"/>
          <author fullname="M. Handley" initials="M." surname="Handley"/>
          <author fullname="H. Holbrook" initials="H." surname="Holbrook"/>
          <author fullname="I. Kouvelas" initials="I." surname="Kouvelas"/>
          <author fullname="R. Parekh" initials="R." surname="Parekh"/>
          <author fullname="Z. Zhang" initials="Z." surname="Zhang"/>
          <author fullname="L. Zheng" initials="L." surname="Zheng"/>
          <date month="March" year="2016"/>
          <abstract>
            <t>This document specifies Protocol Independent Multicast - Sparse Mode (PIM-SM). PIM-SM is a multicast routing protocol that can use the underlying unicast routing information base or a separate multicast-capable routing information base. It builds unidirectional shared trees rooted at a Rendezvous Point (RP) per group, and it optionally creates shortest-path trees per source.</t>
            <t>This document obsoletes RFC 4601 by replacing it, addresses the errata filed against it, removes the optional (*,*,RP), PIM Multicast Border Router features and authentication using IPsec that lack sufficient deployment experience (see Appendix A), and moves the PIM specification to Internet Standard.</t>
          </abstract>
        </front>
        <seriesInfo name="STD" value="83"/>
        <seriesInfo name="RFC" value="7761"/>
        <seriesInfo name="DOI" value="10.17487/RFC7761"/>
      </reference>
      <reference anchor="RFC2119">
        <front>
          <title>Key words for use in RFCs to Indicate Requirement Levels</title>
          <author fullname="S. Bradner" initials="S." surname="Bradner"/>
          <date month="March" year="1997"/>
          <abstract>
            <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
          </abstract>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="2119"/>
        <seriesInfo name="DOI" value="10.17487/RFC2119"/>
      </reference>
      <reference anchor="RFC8174">
        <front>
          <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
          <author fullname="B. Leiba" initials="B." surname="Leiba"/>
          <date month="May" year="2017"/>
          <abstract>
            <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
          </abstract>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="8174"/>
        <seriesInfo name="DOI" value="10.17487/RFC8174"/>
      </reference>
    </references>
    <?line 267?>

<section anchor="arista-compatibility">
      <name>Arista Networks Compatibility</name>
      <t>This non-normative appendix describes the Arista Proprietary
Color option, for the benefit of compatibility with the
deployed base.  A standards-compliant implementation
<bcp14>SHOULD NOT</bcp14> emit or parse these options by default, but <bcp14>MAY</bcp14>
have a configuration option to emit and parse these options
on a given interface for interoperability.</t>
      <t>A pair of PIM Hello options is required for compatibility
with the deployed base of Arista EOS.  Both types are allocated
from the "Private Use" reserved range.  The first option, with
type 65001, only serves to indicate with a "magic number" that
the type 65002 option is indeed the Arista Proprietary Color
option (as opposed to some other Private Use).</t>
      <t>These option formats are shown below.</t>
      <figure>
        <name>Enable Arista Proprietary Hello options</name>
        <artwork><![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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          Type = 65001         |           Length = 4          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                           4028514875                          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork>
      </figure>
      <t>By including this PIM Hello option, with type 65001 and 32-bit
value 4028514875, you indicate that the rest of the PIM Hello
options that you are including are Arista-proprietary.</t>
      <figure>
        <name>Arista Proprietary Color option</name>
        <artwork><![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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          Type = 65002         |           Length = 4          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                             Color                             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork>
      </figure>
      <t>The Arista Proprietary Color option is identical to the
option described in figure <xref target="ColorHelloOption"/>, except for
the Type field.  It is only recognized if the Arista Proprietary
Hello options are enabled by the option above.</t>
      <section anchor="arista-color-hash-algorithm">
        <name>Arista Color Hash Algorithm</name>
        <t>The Arista-compatible hash algorithm stores the color in little-endian
byte order when hashing.</t>
        <artwork><![CDATA[
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
|        address1       |        address2       |  color(little-endian) |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
]]></artwork>
        <t>When all routers in a set of vias are exchanging color information via
the RFC-specified COLOR option, they <bcp14>MUST</bcp14> use the standard hash with
the color in network byte order.
When at least one router in a set of vias is exchanging color information via the Arista Proprietary
Color option, they <bcp14>MUST</bcp14> use the Arista-compatible hash algorithm
to compare colors.</t>
      </section>
    </section>
    <section anchor="cisco-compatibility">
      <name>Cisco Systems Compatibility</name>
      <t>Cisco has, independently of this draft, implemented hashing based on Router-ID as
discussed in <xref target="routerid"/>, except for a few differences listed here.</t>
      <t>The hash algorithm used is the RP hash defined in <xref target="RFC7761"/> section 4.7.2.
Using this hash, the hash value is calculated by doing
hash(router-id, 32, hash(group, 32, source)). In case multiple entries hash
to the same value, the re-hash is using the interface ID announced in the
<xref target="RFC6395"/> Hello Option rather than local information.</t>
      <t>Hashing based on color is not implemented.</t>
    </section>
    <section anchor="sample-hash-values">
      <name>Sample Hash Values</name>
      <t>Hashing with Router-ID:</t>
      <artwork><![CDATA[
hash( 192.0.0.2, 224.1.1.1, 10.0.0.1 ) = 361722995
hash( 192.0.0.2, 224.1.1.1, 10.0.0.2 ) = 4027394415
hash( 192.0.0.2, 224.1.1.1, 10.0.0.3 ) = 670832976
]]></artwork>
      <t>In this case, the neighbor with Router-ID 10.0.0.2 would
be chosen.</t>
      <t>Hashing with Color, Arista-compatible:</t>
      <artwork><![CDATA[
hash( 192.0.0.2, 224.1.1.1, 10 ) = 1271947512
hash( 192.0.0.2, 224.1.1.1, 20 ) = 3140394629
hash( 192.0.0.2, 224.1.1.1, 30 ) = 3675908571
]]></artwork>
      <t>In this case, the neighbor with color 30 would be chosen.</t>
      <t>Hashing with Color, RFC-compatible:</t>
      <artwork><![CDATA[
hash( 192.0.0.2, 224.1.1.1, 10 ) = 3358313248
hash( 192.0.0.2, 224.1.1.1, 20 ) = 2756903791
hash( 192.0.0.2, 224.1.1.1, 30 ) = 2580115048
]]></artwork>
      <t>In this case, the neighbor with color 10 would be chosen.</t>
    </section>
    <section anchor="change-history">
      <name>Change history</name>
      <t>This section is to be removed before publishing as an RFC.</t>
      <section anchor="changes-since-draft-fenner-pim-deterministic-ecmp-00">
        <name>Changes since draft-fenner-pim-deterministic-ecmp-00</name>
        <ul spacing="normal">
          <li>
            <t>Remove the note about coming up with a different term than Color, it feels
like Color will suffice</t>
          </li>
          <li>
            <t>Added memory layout for IPv6 address hashing</t>
          </li>
          <li>
            <t>Added <xref target="cisco-compatibility"/> contributed by Stig about Cisco's deterministic hashing</t>
          </li>
          <li>
            <t>Corrected sample hash values in <xref target="sample-hash-values"/></t>
          </li>
        </ul>
      </section>
      <section anchor="changes-since-draft-fenner-pim-deterministic-ecmp-01">
        <name>Changes since draft-fenner-pim-deterministic-ecmp-01</name>
        <ul spacing="normal">
          <li>
            <t>Accepted as PIM WG work item</t>
          </li>
        </ul>
      </section>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>Thanks to Kalpesh Suthar of Juniper Networks for pointing out that
the sample hash values in draft-fenner-pim-deterministic-ecmp-00 were
calculated incorrectly.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
7KE3AAA=

-->

</rfc>
