<?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.23 (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-00" category="info" consensus="true" submissionType="IETF" version="3">
  <!-- xml2rfc v2v3 conversion 3.27.0 -->
  <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-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>
    <date year="2025" month="March" day="02"/>
    <area>Routing</area>
    <workgroup>Protocols for IP Multicast</workgroup>
    <keyword>ECMP</keyword>
    <keyword>PIM Join</keyword>
    <keyword>Data Center</keyword>
    <abstract>
      <?line 44?>

<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 52?>

<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 Jenkin's 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>
    </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"<cref anchor="_1">Should we come up with a different name for this?  It has nothing to
do with SR-TE color, for example.  However, RFC5512's definition of
Color is just as abstract as this.
"MultiTier ID"?</cref>, 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="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 246?>

<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="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 ) = 3391492512
hash( 192.0.0.2, 224.1.1.1, 10.0.0.2 ) = 3391493567
hash( 192.0.0.2, 224.1.1.1, 10.0.0.3 ) = 3391498574
]]></artwork>
      <t>In this case, the neighbor with Router-ID 10.0.0.3 would
be chosen.</t>
      <t>Hashing with Color, Arista-compatible:</t>
      <artwork><![CDATA[
hash( 192.0.0.2, 224.1.1.1, 10 ) = 3391495569
hash( 192.0.0.2, 224.1.1.1, 20 ) = 797801633
hash( 192.0.0.2, 224.1.1.1, 30 ) = 2218733534
]]></artwork>
      <t>In this case, the neighbor with color 10 would be chosen.</t>
      <t>Hashing with Color, RFC-compatible:</t>
      <artwork><![CDATA[
hash( 192.0.0.2, 224.1.1.1, 10 ) = 4240030715
hash( 192.0.0.2, 224.1.1.1, 20 ) = 4240032301
hash( 192.0.0.2, 224.1.1.1, 30 ) = 4240042647
]]></artwork>
      <t>In this case, the neighbor with color 30 would be chosen.</t>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledge.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
svtKHHpye+ik1R7u4wz9P25lW9dCZWM1gf8Ila33g88FaW/ZXNTeEcvrkZ++
3meq+4oizDe+euBa+KirbtbV19dtatnoNKcIL4pSFwt0FLqbAWNdpsp0kExi
8y+iOP4cUGmmYnITzR5fNg69dEV58qDEU76yv3GRXymhBFTR0kW+zZPMYydX
OmDHSPZQdIfwlYprt8H8pYqiFL3jfnewRfe7D8sL3l6/uuHFZ+az0mCyivGH
d1z4uivfz1/6uqvW3/i7svXahXDDz2oXw378tr34S+LfRyZ3efyatEJ9hVq3
VgH/cPTlApTNxfUPKcgWZ1ldDlCXn0759Nlex6Y6MDDTUO4dvzg+LVMCt6L5
Oy9Fl6KAvM5sHAyrm8ptX2RwwvLXvPxtpb8GXBKavvD0KzLfD9UvC/5rhi+o
s0EvM78byz2jM+4VO1fiKgg1WVHqsTmWN/VD4c7GVeG9R/3uOv7127Lf3+j2
6F9b9tZ5sEdVrBwMHvU2HvU3e/37rOnX1gw2t7bvs2ZQW7Ozub3hBCxuEAJF
X+0j3ZTfR2vuqCJzST15QTcXU0DduHtDB3uuJbak4vuppCbk5ubWoztn993s
7UfbO+u9rcHgzskDN7nf7+1sDwabg3vu35kd5Los72vu2jX5z1dteaO/sb4+
WN/ubd5ny252f7Deu8+eefZGf2tj+0v2PLhtz1SlBx/i5BKJZ8LfWEfIdYWU
Dh+3xipCzXbtOxWqnImE9F/QDF/dATAAAA==

-->

</rfc>
