<?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.27 (Ruby 3.3.6) -->
<?rfc {"comments"=>false}="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-fenner-pim-deterministic-ecmp-01" 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-fenner-pim-deterministic-ecmp-01"/>
    <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="April" day="15"/>
    <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-fenner-pim-deterministic-ecmp.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-fenner-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>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>
    <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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
UcgjtDYAAA==

-->

</rfc>
