<?xml version="1.0" encoding="utf-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc version 1.6.17 (Ruby 3.1.2) -->


<!DOCTYPE rfc  [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">

<!ENTITY RFC5015 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5015.xml">
<!ENTITY RFC2119 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml">
<!ENTITY RFC7184 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7184.xml">
<!ENTITY I-D.zzhang-pim-pds SYSTEM "https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.zzhang-pim-pds.xml">
]>

<?rfc comments="yes"?>

<rfc ipr="trust200902" docName="draft-zzhang-rift-multicast-02" category="std" consensus="true" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title abbrev="MRIFT">Multicast Routing In Fat Trees</title>

    <author initials="Z." surname="Zhang" fullname="Zhaohui Zhang">
      <organization>Juniper Networks</organization>
      <address>
        <email>zzhang@juniper.net</email>
      </address>
    </author>
    <author initials="P." surname="Thubert" fullname="Pascal Thubert">
      <organization>Cisco Systems</organization>
      <address>
        <email>pthubert@cisco.com</email>
      </address>
    </author>

    <date year="2024" month="July" day="02"/>

    <area>Routing</area>
    <workgroup>RIFT</workgroup>
    <keyword>rift, multicast, bidir</keyword>

    <abstract>


<t>This document specifies multicast procedures with RIFT.  Multicast in
   RIFT is similar to Bidirectional Protocol Independent Multicast (PIM-
   Bidir), with the Rendezvous Point Link (RP-Link) simulated by a
   spanning tree of some Top of Fabric (TOF) nodes and sub-TOF nodes.</t>



    </abstract>

    <note title="Requirements Language">
    <t>
   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.
    </t>
    </note>


  </front>

  <middle>


<section anchor="introduction"><name>Introduction</name>

<t>Because of the simple north-south regular topology in Fat Tree
   networks, the PIM-Bidir <xref target="RFC5015"/> solution is extended for multicast
   in RIFT (referred to as MRIFT in this document).  The following is a
   summary of the changes and adaptations compared to PIM-Bidir.</t>

<t>With PIM-Bidir, PIM joins are sent towards a Rendezvous Point Address
   (RPA), which could be an address not belonging to any router.  The
   RPA does belong to a RP Link (RPL), which could be attached to a
   single router or multiple routers (e.g.  RPL is a LAN).  With MRIFT,
   there is no concept of RPA any more (joins are simply sent
   northbound).  The joins are terminated on some sub-TOF nodes and the
   RPL is simulated by a spanning tree among some TOF and sub-TOF nodes.</t>

<t>Instead of (*,G) trees in PIM-Bidir, MRIFT uses (*,G-Prefix) trees,
   where the G-Prefix could be *, G, or anything in between (e.g.,
   225.1.1.0/24).  For light flows, they could just follow the (*,*)
   tree.  For heavy flows, individual (*,G) trees could be built.  For
   medium flows, some (*,G-prefix) trees could be shared.  All the First
   Hop Routers (FHRs, connecting to sources) and the Last Hop Routers
   (LHRs, connecting to receivers) of a particular (*,G) flow must agree
   on whether a (*,*) or (*,G) or (*,G-prefix) tree is used for the flow</t>

<t>so that they all join the same tree.  This is done via out of band
   control outside the scope of this document.</t>

<t>Because of the rich connections in Fat Trees, a router has to choose
   one of its many north neighbors to send join to.  This is done
   through hashing.  The hashing algorithm should lead to several but
   not too many routers choosing the same north neighbor, so that fewer
   routers are involved in multicast traffic forwarding, yet none of
   those routers are overburdened by replicating to too many downstream
   neighbors.</t>

<t>Instead of PIM messages, RIFT's own TIEs are used, similar to the
   concept in <xref target="I-D.zzhang-pim-pds"/>.  This introduces the concept of
   neighbor-scoped flooding - a multicast TIE is sent only to a chosen
   upstream north neighbor that consumes it and then regenerates a new
   TIE for the next upstream.</t>

<t>When a join reaches a sub-TOF node, the normal join process stops.
   This forms a sub-tree rooted at this sub-TOF node.  Multiple sub-
   trees of the same tree may be joined by a single TOF node, or they
   may have to be connected by a spanning tree serving as the RPL.  For
   example, in the following topology, in normal situations the two sub-
   tree roots for the two pods, say Spine111 and Spine121, may be joined
   by TOF21, but if the TOF21-Spine121 link is down, then TOF22 may be
   used, and if the TOF22-Spine111 link is also down, then Spine111 and
   Spine121 will have to be joined via
   Spine111-TOF21-Spine112-TOF22-Spine121.</t>

<figure><artwork><![CDATA[
   .                +--------+          +--------+          ^ N
   .                |TOF   21|          |TOF   22|          |
   .Level 2         ++-+--+-++          ++-+--+-++        <-*-> E/W
   .                 | |  | |            | |  | |           |
   .             P111/2|  |P121          | |  | |         S v
   .                 ^ ^  ^ ^            | |  | |
   .                 | |  | |            | |  | |
   .  +--------------+ |  +-----------+  | |  | +---------------+
   .  |                |    |         |  | |  |                 |
   . South +-----------------------------+ |  |                 ^
   .  |    |           |    |         |    |  |              All TIEs
   .  0/0  0/0        0/0   +-----------------------------+     |
   .  v    v           v              |    |  |           |     |
   .  |    |           +-+    +<-0/0----------+           |     |
   .  |    |             |    |       |    |              |     |
   .+-+----++ optional +-+----++     ++----+-+           ++-----++
   .|       | E/W link |       |     |       |           |       |
   .|Spin111+----------+Spin112|     |Spin121|           |Spin122|
   .+-+---+-+          ++----+-+     +-+---+-+           ++---+--+
   .  |   |             |   South      |   |              |   |
   .  |   +---0/0--->-----+ 0/0        |   +----------------+ |
   . 0/0                | |  |         |                  | | |
   .  |   +---<-0/0-----+ |  v         |   +--------------+ | |
   .  v   |               |  |         |   |                | |
   .+-+---+-+          +--+--+-+     +-+---+-+          +---+-+-+
   .|       |  (L2L)   |       |     |       |  Level 0 |       |
   .|Leaf111~~~~~~~~~~~~Leaf112|     |Leaf121|          |Leaf122|
   .+-+-----+          +-+---+-+     +--+--+-+          +-+-----+
   .  +                  +    \        /   +              +
   .  Prefix111   Prefix112    \      /   Prefix121    Prefix122
   .                          multi-homed
   .                            Prefix
   .+---------- Pod 1 ---------+     +---------- Pod 2 ---------+
]]></artwork></figure>

</section>
<section anchor="specifications"><name>Specifications</name>

<section anchor="multicast-capability"><name>Multicast Capability</name>

<t>A new optional field is added to the NodeCapabilities to indicate
   that the node is enabled for multicast:</t>

<figure><artwork><![CDATA[
 struct NodeCapabilities {
     ...
     4: optional bool           multicast_enabled;
 }
]]></artwork></figure>

</section>
<section anchor="optional-per-neighbor-flooding-scope"><name>Optional Per-neighbor Flooding Scope</name>

<t>This document introduces an optional per-neighbor flooding scope for
   TIEs:</t>

<figure><artwork><![CDATA[
struct TIEHeader {
   ...
   13: optional common.SystemIDType    flooding_scope_neighbor;
}
]]></artwork></figure>

<t>When a node originates a TIE with a per-neighbor flooding scope, it
   is sent to the specified neighbor only.  When a node receives a TIE
   with per-neighbor flooding scope, it is accepted only if the node is
   the specified neighbor, and it is not reflooded any further.</t>

</section>
<section anchor="multicast-tie"><name>Multicast TIE</name>

<t>Currently the multicast TIEs are only N-TIEs with per-neighbor
   flooding scope except on TOFs and sub-TOFs.  If a multicast TIE is
   received from a node south of sub-TOFs without the per-neighbor
   flooding scope specified, it MUST be discarded.</t>

<figure><artwork><![CDATA[
    /** TIE for multicast */
    struct IPMulticastTIEElement {
        /** Multicast TIEs are for (*, group-prefix) joins.
            The '*' is not encoded in the TIE. */
        1: required common.IPPrefixType        group_prefix;
   
        /** fields used by TOFs and sub-TOFs to
            build spanning tree RPL */
        2: optional common.SystemIDType        chosen_or_highest_parent;
        3: optional list<common.SystemIDType>  sub_tof_children;
    }
   
    /** Type of TIE.
        ...
    */
    enum TIETypeType {
        ...
        TIETypeIPMulticast                          = 11,
        TIETypeMaxValue                             = 12,
    }
   
    /** Single element in a TIE.
        ...
     */
    union TIEElement {
        ...
        /** IP multicast elements. */
        10: optional IPMulticastTIEElement ip_multicast;
    }
]]></artwork></figure>

</section>
<section anchor="building-spanning-tree-among-tofs-and-sub-tofs"><name>Building Spanning Tree among TOFs and sub-TOFs</name>

<t>Note: this is still subject to further discussion/change.  It may be
   replaced by another scheme upon further discussions.</t>

<t>If a sub-TOF node is the root of a sub-tree for a (*, G-prefix) tree,
   it hashes to a TOF neighbor as its parent for the tree, and
   originates a corresponding multicast N-TIE without the per-neighbor
   flooding scope - flooded to all its north TOF neighbors.  The
   chosen_or_highest_parent field is set to the chosen TOF neighbor.</t>

<t>A receiving TOF node originates a corresponding S-TIE without the
   per-neighbor flooding scope.  The chosen_or_highest_parent field is
   set to the highest chosen_or_highest_parent of all received N-TIEs
   and S-TIEs for the tree, identifying the root of all sub-trees from
   that TOF node's point of view.  The sub_tof_children list all of sub-
   TOF nodes that have chosen the root as parent.</t>

<t>If a sub-TOF node that is the root of a sub-tree receives from TOF
   neighbors some S-TIE for the same tree but with different
   chosen_or_highest_parent values, it chooses, from all its TOF
   neighbors that are recorded as a chosen_or_highest_parent, the one
   with the highest system-id and (re)parent to that neighbor if that
   neighbor is not already its parent.</t>

<t>After the above steps, if a TOF node remains as the chosen parent of
   some sub-TOF nodes but its system-id does not match the highest
   chosen_or_highest_parent of all N-TIEs and S-TIEs (i.e. the root),
   the TOF node needs to join towards the root through some intermediate
   sub-TOF and TOF nodes.  If it has a sub-TOF neighbor listed in the
   sub_tof_children of the root, it originates an S-TIE with the per-
   neighbor flooding scope set to the sub-TOF neighbor, i.e. the sub-TOF
   neighbor now becomes the parent of the TOF node (that is a parent of
   some other sub-TOF nodes).</t>

<t>In case the TOF node does not have a neighbor listed in the
   sub_tof_children of the S-TIE for the root, further study is needed.
   It could be that the topology is so partitioned that a spanning tree
   could not be built.</t>

</section>
</section>
<section anchor="security-considerations"><name>Security Considerations</name>

<t>To be provided.</t>

</section>
<section anchor="acknowledgements"><name>Acknowledgements</name>

<t>The authors thank Bruno Rijsman and Antoni Przygenda for their review
   and suggestions.</t>

</section>


  </middle>

  <back>


    <references title="Normative References">
	  &RFC2119;
	  &RFC7184;
      <?rfc include='reference.I-D.ietf-rift-rift'?>
    </references>

    <references title='Informative References'>

&RFC5015;
&I-D.zzhang-pim-pds;


    </references>



  </back>

<!-- ##markdown-source:
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
IAFdwTMpNoccUDerFfzGVRD/A5kt6UUBKAAA

-->

</rfc>

