<?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.43 (Ruby 3.4.9) -->
<?rfc {"comments" => false}="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-pim-deterministic-ecmp-01" category="info" consensus="true" submissionType="IETF" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.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-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>
    <author fullname="Hooman Bidgoli">
      <organization>Nokia</organization>
      <address>
        <email>hooman.bidgoli@nokia.com</email>
      </address>
    </author>
    <date year="2026" month="November" day="02"/>
    <area>Routing</area>
    <workgroup>Protocols for IP Multicast</workgroup>
    <keyword>ECMP</keyword>
    <keyword>PIM Join</keyword>
    <keyword>Data Center</keyword>
    <abstract>
      <?line 66?>

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

<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.
A suite of related hash functions was originally published in an article in
Dr.  Dobbs' Journal <xref target="Jenkins-DDJ"/>.
The "one at a time" hash used in this document <xref target="Jenkins-Hash"/> is an update
to that journal article that Jenkins later posted on his web site.
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 type="python"><![CDATA[
def viaMultipathRouterId( source, group, vias ):
    bestHash = 0
    bestVias = []
    for via in vias:
        routerId = getRouterId( via )
        curHash = calculateHash( source, group, routerId )
        if curHash > bestHash:
            bestVias = [ via ]
            bestHash = curHash
        elif curHash == bestHash:
            bestVias.append( via )
    if len( bestVias ) == 1:
        return bestVias[ 0 ]
    bestHash = 0
    bestVia = None
    for via in bestVias:
        local_information = getLocalInformation( via )
        curHash = calculateHash( source, group, local_information )
        if curHash > bestHash:
            bestVia = via
            bestHash = curHash

    return bestVia
]]></artwork>
      </figure>
    </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>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.
The eligible RPF neighbors are reduced to those that have advertised
a color using the above Hello option.
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 type="python"><![CDATA[
def viaMultipathColor( source, group, vias ):
    bestHash = 0
    bestVias = []
    for via in vias:
        color = getNeighborColor( via )
        if color is None:
            continue
        curHash = calculateHash( source, group, color )
        if curHash > bestHash:
            bestVias = [ via ]
            bestHash = curHash
        elif curHash == bestHash:
            bestVias.append( via )
    if len( bestVias ) == 1:
        return bestVias[ 0 ]
    return viaMultipathRouterId( source, group, bestVias )
]]></artwork>
      </figure>
    </section>
    <section anchor="comparison-with-rfc6754">
      <name>Comparison with RFC6754</name>
      <t><xref target="RFC6754"/>, "ECMP Redirect", defines a mechanism that allows an upstream
router to give an explicit RPF neighbor to a downstream, and suggest that
the downstream start sending its Join messages to that different upstream.
We compare the mechanism in this document with that one.</t>
      <dl>
        <dt>Operation</dt>
        <dd>
          <t>In ECMP Redirect, the upstream router responds to a Join or notices
traffic flowing and makes a decision that the traffic should be taking
a different path. With this mechanism, each downstream router makes
a consistent decision so no correction is necessary.</t>
        </dd>
        <dt>Message Exchange</dt>
        <dd>
          <t>In ECMP Redirect, an explicit Redirect message is sent, up to one message
for each (S,G) for each peer. With this mechanism, the messages exchanged
are limited to options in the Hello exchange.</t>
        </dd>
        <dt>Dynamic Behavior</dt>
        <dd>
          <t>In ECMP Redirect, traffic flow can be disrupted by the change from one
upstream neighbor to another. With this mechanism, the initial choice is
stable and does not change.</t>
        </dd>
        <dt>Complete Information</dt>
        <dd>
          <t>In ECMP Redirect, each upstream router must have complete information
about what upstream router is appropriate for what stream. With this
mechanism, color information is distributed in Hello messages and does not
require complete knowledge.
# Security Considerations</t>
        </dd>
      </dl>
      <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-combined-references">
      <name>References</name>
      <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="Jenkins-Hash" target="http://www.burtleburtle.net/bob/hash/doobs.html">
          <front>
            <title>One-at-a-Time Hash</title>
            <author initials="B." surname="Jenkins">
              <organization/>
            </author>
            <date year="1997" month="September"/>
          </front>
        </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>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="Jenkins-DDJ">
          <front>
            <title>Hash Functions</title>
            <author initials="B." surname="Jenkins">
              <organization/>
            </author>
            <date year="1997" month="September"/>
          </front>
          <seriesInfo name="Dr. Dobb's Journal" value="vol. 22, no. 9, pp. 107-109"/>
        </reference>
        <reference anchor="RFC6754">
          <front>
            <title>Protocol Independent Multicast Equal-Cost Multipath (ECMP) Redirect</title>
            <author fullname="Y. Cai" initials="Y." surname="Cai"/>
            <author fullname="L. Wei" initials="L." surname="Wei"/>
            <author fullname="H. Ou" initials="H." surname="Ou"/>
            <author fullname="V. Arya" initials="V." surname="Arya"/>
            <author fullname="S. Jethwani" initials="S." surname="Jethwani"/>
            <date month="October" year="2012"/>
            <abstract>
              <t>A Protocol Independent Multicast (PIM) router uses the Reverse Path Forwarding (RPF) procedure to select an upstream interface and router in order to build forwarding state. When there are equal cost multipaths (ECMPs), existing implementations often use hash algorithms to select a path. Such algorithms do not allow the spread of traffic among the ECMPs according to administrative metrics. This usually leads to inefficient or ineffective use of network resources. This document introduces the ECMP Redirect, a mechanism to improve the RPF procedure over ECMPs. It allows ECMP selection to be based on administratively selected metrics, such as data transmission delays, path preferences, and routing metrics. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6754"/>
          <seriesInfo name="DOI" value="10.17487/RFC6754"/>
        </reference>
      </references>
    </references>
    <?line 314?>

<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 anchor="changes-since-draft-ietf-pim-deterministic-ecmp-00">
        <name>Changes since draft-ietf-pim-deterministic-ecmp-00</name>
        <ul spacing="normal">
          <li>
            <t>Fixed typos in hash pseudocode.</t>
          </li>
          <li>
            <t>Use python for pseudocode (it was already almost python)</t>
          </li>
          <li>
            <t>Update references to Jenkins hash</t>
          </li>
          <li>
            <t>Limit the eligible RPF neighbors to those that have advertised
the color hello option</t>
          </li>
          <li>
            <t>Add section comparing with RFC6754</t>
          </li>
          <li>
            <t>Added Hooman as co-author</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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
QZNqxA7QA1HTeNFV/wP8Msh7qEAAAA==

-->

</rfc>
