<?xml version="1.0" encoding="US-ASCII"?>
<!DOCTYPE rfc SYSTEM "rfc2629.dtd">
<?rfc toc="yes"?>
<?rfc tocompact="yes"?>
<?rfc tocdepth="3"?>
<?rfc tocindent="yes"?>
<?rfc symrefs="yes"?>
<?rfc sortrefs="yes"?>
<?rfc comments="yes"?>
<?rfc inline="yes"?>
<?rfc compact="yes"?>
<?rfc subcompact="no"?>
<rfc category="std" docName="draft-chen-isis-black-hole-avoid-00"
     ipr="trust200902">
  <front>
    <title abbrev="IS-IS Black-Hole Avoiding">Avoiding Traffic Black-Holes for
    Route Aggregation in IS-IS</title>

    <author fullname="Zhe Chen" initials="Z." surname="Chen">
      <organization>Huawei Technologies</organization>

      <address>
        <postal>
          <street>No. 156 Beiqing Rd</street>

          <city>Beijing</city>

          <region/>

          <code>100095</code>

          <country>China</country>
        </postal>

        <phone/>

        <facsimile/>

        <email>chenzhe17@huawei.com</email>

        <uri/>
      </address>
    </author>

    <author fullname="Xiaohu Xu" initials="X." surname="Xu">
      <organization>Huawei Technologies</organization>

      <address>
        <postal>
          <street>No. 156 Beiqing Rd</street>

          <city>Beijing</city>

          <region/>

          <code>100095</code>

          <country>China</country>
        </postal>

        <phone/>

        <facsimile/>

        <email>xuxiaohu@huawei.com</email>

        <uri/>
      </address>
    </author>

    <date day="13" month="March" year="2017"/>

    <abstract>
      <t>When the Intermediate System to Intermediate System (IS-IS) routing
      protocol is adopted by a highly symmetric network such as the Leaf-Spine
      or Fat-Tree network, the Leaf nodes (e.g., Top of Rack switches in
      datacenters) are recommended to be prevented from receiving other
      nodes&rsquo; explicit routes in order to achieve scalability. However,
      such a setup would cause traffic black-holes or suboptimal routing if
      link failure happens in the network. This document extends IS-IS to
      solve this problem.</t>
    </abstract>

    <note title="Requirements Language">
      <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
      "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
      document are to be interpreted as described in <xref
      target="RFC2119">RFC 2119</xref>.</t>
    </note>
  </front>

  <middle>
    <section title="Introduction">
      <t>When running the Intermediate System to Intermediate System (IS-IS)
      routing protocol in a highly symmetric network such as the Leaf-Spine or
      Fat-Tree network, the Leaf nodes (e.g., Top of Rack switches in
      datacenters) are recommended to be prevented from receiving other
      nodes&rsquo; explicit routes in order to achieve scalability, as
      proposed in [IS-IS-SL-Extension], [IS-IS-Overhead-Reduction], [RIFT],
      and [OpenFabric]. In particular, each Leaf node SHOULD simply maintain a
      default (or aggregated) route (e.g., 0.0.0.0/0) in its routing table, of
      which the next hop SHOULD be an Equal Cost Multi Path (ECMP) group
      including all Spines nodes that the Leaf node connects to. However, such
      a setup would cause traffic black-holes or suboptimal routing if link
      failure happens in the network, since the Leaf nodes are not aware of
      any topology information.</t>

      <t>To solve this problem, this document extends IS-IS to advertise
      unreachable prefixes, which are defined as the prefixes that a default
      (or aggregated) route&rsquo;s next hop can no longer reach. When link
      failure happens between a Spine node and a Leaf node, the Spine node
      SHOULD advertise all prefixes attached to the Leaf node (i.e., the
      unreachable prefixes) to every other Leaf node it connects to. On
      receiving the unreachable prefixes, each Leaf node SHOULD add the
      unreachable prefixes to its routing table, thus avoiding traffic
      black-holes and suboptimal routing.</t>
    </section>

    <section title="Problem Description">
      <t>This section illustrates why link failure would cause traffic
      black-hole or suboptimal routing when Leaf nodes only maintain default
      (or aggregated) routes.</t>

      <t><figure>
          <artwork><![CDATA[         +--------+          +--------+          +--------+
         | Spine1 |          | Spine2 |          | Spine3 |
         +-+-+-+-++          +-+-+-+-++          +-+-+-+-++
    +------+ | | |             | | | |             | | | |
    | +------|-|-|-------------+ | | |             | | | X
    | | +----|-|-|---------------|-|-|-------------+ | | X
    | | |    | | |        +------+ | |               | | X
    | | |    | | |        | +------|-|---------------+ | |
    | | |    | | |        | |      | |                 | |
    | | |    | | |        | |      | |                 | |
    | | |    | | |        | |      | |         +-------+ +-----+
    | | |    | | |        | |      | +---------|-------------+ |
    | | |    | | |        | |      +---------+ |             | |
    | | |    | | +--------|-|----------------|-|-----------+ | |
    | | |    | +----------|-|--------------+ | |           | | |
    | | |    +----------+ | |              | | |           | | |
  +-+-+-+-+           +-+-+-+-+          +-+-+-+-+       +-+-+-+-+
  | Leaf1 |           | Leaf2 |          | Leaf3 |       | Leaf4 |
  +-------+           +-------+          +-------+       +-------+
                                                          |     |
                                                         ---   ---
                                                     prefixA   prefixB

                    Figure 1: Topology Example

]]></artwork>
        </figure></t>

      <t>Figure 1 shows a Spine-Leaf topology example where Leaf1 to Leaf4 are
      connected to Spine1 to Spine3, and prefixA and prefixB are attached to
      Leaf4. To achieve scalability, as proposed in [IS-IS-SL-Extension],
      [IS-IS-Overhead-Reduction], [RIFT], and [OpenFabric], Leaf1 to Leaf4
      SHOULD NOT receive explict routes from each other nor the Spine nodes.
      Instead, each of them maintains a default (or aggregated) route (e.g.,
      0.0.0.0/0) in the routing table, of which the next hop is an ECMP group
      including Spine1, Spine2, and Spine3. Flows from one Leaf node to
      another are shared among Spine1, Spine2, and Spine3 based on the well
      known 5-tuple hashing.</t>

      <t>However, such a setup would cause traffic black-hole or suboptimal
      routing when link failure happens in the network. For example, if the
      link between Spine3 and Leaf4 is broken, Leaf1, Leaf2, and Leaf3 could
      not get aware of the failure. As a result, these Leaf nodes will still
      send a portion of traffic destined for prefixA or prefixB toward Spine3,
      which makes the traffic be discarded at Spine3, causing traffic
      black-hole. On the other hand, if there is a higher tier of switches
      interconnecting Spine1, Spine2, and Spine3, the traffic will be steered
      up to the higher-tier switches by Spine3, causing suboptimal
      routing.</t>

      <t>Therefore, this document extends IS-IS to advertise unreachable
      prefixes thus solving this problem. </t>
    </section>

    <section title="IS-IS Extensions">
      <t/>

      <section title="TLV Encoding">
        <t>This document introduces one IS-IS TLV to advertise unreachable
        prefixes, called the IP Unreachability TLV, which SHOULD be carried in
        the IS-IS Link State Packet (LSP). The format of the IP Unreachability
        TLV is shown as follow:</t>

        <t><figure>
            <artwork><![CDATA[+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|             Type (1 octet)          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|            Length (1 octet)         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           Reserved (1 octet)        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|         Prefix Length (1 octet)     |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Prefix (1 or 2 or 3 or 4 octets)  |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|       Sub-TLV Length (1 octet)      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|    Optional Sub-TLVs (variable)     |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                ......               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|         Prefix Length (1 octet)     |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Prefix (1 or 2 or 3 or 4 octets)  |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|       Sub-TLV Length (1 octet)      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|    Optional Sub-TLVs (variable)     |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork>
          </figure></t>

        <t>The fields of this TLV are defined as follows:</t>

        <t><list style="empty">
            <t>Type: TBD.</t>

            <t>Length: Length of the Value field of the TLV.</t>

            <t>Reserved: Bits reserved for future usage.</t>

            <t>Prefix Length: The value can be 0 to 32, indicating the number
            of effective bits in the Prefix field.</t>

            <t>Prefix: Encoding the unreachable prefix in the minimal number
            of octets for the given number of effective bits (i.e., the Prefix
            Length field). The remaining bits of prefix SHOULD be set zero and
            ignored upon receipt.</t>

            <t>Sub-TLV Length: Length of Sub-TLVs.</t>

            <t>Sub-TLVs: Optional Sub-TLVs for future extension.</t>
          </list></t>

        <t>Note that the last four fields can appear repeatedly.</t>
      </section>

      <section title="Unreachable Prefixes Advertisement">
        <t>When link failure happens between a Spine node and a Leaf node, the
        Spine node SHOULD 1) encode all prefixes attached to the Leaf node
        (i.e., the unreachable prefixes) into the IP Unreachability TLV, 2)
        append the IP Unreachability TLV to the IS-IS LSP, and 3) send the LSP
        to every other Leaf node it connects to.</t>

        <t>When a Leaf node receives unreachable prefixes (contained in a LSP)
        advertised by a Spine node, it SHOULD install each of the unreachable
        prefixes into its routing table, of which the next hop SHOULD be set
        an ECMP group including all Spine nodes it connects to except the one
        who advertises the unreachable prefix.</t>

        <t>For example, if the link between Spine3 and Leaf4 in Figure 1 is
        broken, Spine3 SHOULD advertise prefixA and prefixB to Leaf1, Leaf2,
        and Leaf3, by sending them an IS-IS LSP containing the IP
        Unreachability TLV. On receiving the LSP, Leaf1, Leaf2, and Leaf3
        SHOULD install prefixA and prefixB into their routing tables, and the
        next hop of prefixA or prefixB SHOULD be set an ECMP group including
        Spine1 and Spine2. For instance, the routing table of Leaf1 before and
        after the link failure is shown in Figure 2 and Figure 3,
        respectively.</t>

        <t>Note that the mechanism described above could achieve minimal
        signaling latency, which helps to avoid black-hole or suboptimal
        routing rapidly when link failure happens.</t>

        <t><figure>
            <artwork><![CDATA[+-----------+-----+---+----+-----+-------+--------------+
|Destination|Proto|Pre|Cost|Flags|NextHop|Interface     |
+-----------+-----+---+----+-----+-------+--------------+
|0.0.0.0/0  |ISIS |15 |20  |D    |Spine1 |Ethernet0/0/0 |
|           |ISIS |15 |20  |D    |Spine2 |Ethernet0/0/1 |
|           |ISIS |15 |20  |D    |Spine3 |Ethernet0/0/2 |
+-----------+-----+---+----+-----+-------+--------------+

  Figure 2: Routing Table of Leaf1 before link failure

]]></artwork>
          </figure></t>

        <t><figure>
            <artwork><![CDATA[+-----------+-----+---+----+-----+-------+--------------+
|Destination|Proto|Pre|Cost|Flags|NextHop|Interface     |
+-----------+-----+---+----+-----+-------+--------------+
|0.0.0.0/0  |ISIS |15 |20  |D    |Spine1 |Ethernet0/0/0 |
|           |ISIS |15 |20  |D    |Spine2 |Ethernet0/0/1 |
|           |ISIS |15 |20  |D    |Spine3 |Ethernet0/0/2 |
+-----------+-----+---+----+-----+-------+--------------+
|prefixA    |ISIS |15 |20  |D    |Spine1 |Ethernet0/0/0 |
|           |ISIS |15 |20  |D    |Spine2 |Ethernet0/0/1 |
+-----------+-----+---+----+-----+-------+--------------+
|prefixB    |ISIS |15 |20  |D    |Spine1 |Ethernet0/0/0 |
|           |ISIS |15 |20  |D    |Spine2 |Ethernet0/0/1 |
+-----------+-----+---+----+-----+-------+--------------+

  Figure 3: Routing Table of Leaf1 after link failure

]]></artwork>
          </figure></t>

        <t/>
      </section>
    </section>

    <section title="Alternative Solution">
      <t>The unreachable prefixes can alternatively be encoded as a new
      Sub-TLV of the Extended IP Reachability TLV defined in [RFC 5305]. The
      format of the Sub-TLV is shown as follow:</t>

      <t><figure>
          <artwork><![CDATA[+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|             Type (1 octet)          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|            Length (1 octet)         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           Reserved (1 octet)        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|         Prefix Length (1 octet)     |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Prefix (1 or 2 or 3 or 4 octets)  |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|               ......                |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|         Prefix Length (1 octet)     |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Prefix (1 or 2 or 3 or 4 octets)  |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork>
        </figure></t>

      <t>The fields of this Sub-TLV are defined as follows:</t>

      <t><list style="empty">
          <t>Type: TBD.</t>

          <t>Length: Length of the Value field of the Sub-TLV.</t>

          <t>Reserved: Bits reserved for future usage.</t>

          <t>Prefix Length: The value can be 0 to 32, indicating the number of
          effective bits in the Prefix field.</t>

          <t>Prefix: Encoding the unreachable prefix in the minimal number of
          octets for the given number of effective bits (i.e., the Prefix
          Length field). The remaining bits of prefix SHOULD be set zero and
          ignored upon receipt.</t>
        </list></t>

      <t>Note that the last two fields can appear repeatedly.</t>

      <t>When link failure happens between a Spine node and a Leaf node, the
      Spine node SHOULD 1) encode all prefixes attached to the Leaf node
      (i.e., the unreachable prefixes) into the Sub-TLV described above, 2)
      encode the Sub-TLV into the Extended IP Reachability TLV, 3) append the
      Extended IP Reachability TLV to the IS-IS LSP, and 4) send the LSP to
      every other Leaf node it connects to. The Prefix field of the Extended
      IP Reachability TLV SHOULD be set the default (or aggregated) route that
      each of the Leaf nodes already maintains.</t>

      <t>When a Leaf node receives unreachable prefixes (contained in a LSP)
      advertised by a Spine node, it SHOULD install each of the unreachable
      prefixes into its routing table, of which the next hop SHOULD be set an
      ECMP group including all Spine nodes it connects to except the one who
      advertises the unreachable prefix.</t>
    </section>

    <section title="IPv6 Support">
      <t>Will be completed in the next version of the document.</t>
    </section>

    <section anchor="IANA" title="IANA Considerations">
      <t>TBD.</t>
    </section>

    <section anchor="Security" title="Security Considerations">
      <t>TBD.</t>
    </section>

    <section anchor="Acknowledgements" title="Acknowledgements">
      <t>TBD.</t>
    </section>
  </middle>

  <back>
    <references title="References">
      <?rfc include="reference.RFC.2119"?>

      <reference anchor="RFC1195">
        <front>
          <title>Use of OSI IS-IS for Routing in TCP/IP and Dual
          Environments</title>

          <author fullname="Ross Callon" initials="R." surname="Callon">
            <organization>asdasa</organization>
          </author>

          <date day="" month="December" year="1990"/>
        </front>

        <seriesInfo name="RFC 1195" value=""/>
      </reference>

      <reference anchor="IS-IS-SL-Extension">
        <front>
          <title>IS-IS Routing for Spine-Leaf Topology</title>

          <author fullname="Naiming Shen" initials="N." surname="Shen">
            <organization/>
          </author>

          <author fullname="Sanjay Thyamagundalu" initials="S."
                  surname="Thyamagundalu">
            <organization/>

            <address>
              <postal>
                <street/>

                <city/>

                <region/>

                <code/>

                <country/>
              </postal>

              <phone/>

              <facsimile/>

              <email/>

              <uri/>
            </address>
          </author>

          <date day="27" month="October" year="2016"/>
        </front>

        <seriesInfo name="draft-shen-isis-spine-leaf-ext-02 (work in progress)"
                    value=""/>
      </reference>

      <reference anchor="IS-IS-Overhead-Reduction">
        <front>
          <title>Overheads Reduction for IS-IS Enabled Spine-Leaf
          Networks</title>

          <author fullname="Zhe Chen" initials="Z." surname="Chen">
            <organization/>
          </author>

          <author fullname="Xiaohu Xu" initials="X." surname="Xu">
            <organization/>

            <address>
              <postal>
                <street/>

                <city/>

                <region/>

                <code/>

                <country/>
              </postal>

              <phone/>

              <facsimile/>

              <email/>

              <uri/>
            </address>
          </author>

          <date day="6" month="January" year="2017"/>
        </front>

        <seriesInfo name="draft-chen-isis-sl-overheads-reduction-00 (work in progress)"
                    value=""/>
      </reference>

      <reference anchor="RIFT">
        <front>
          <title>RIFT: Routing in Fat Trees</title>

          <author fullname="Tony Przygienda" initials="T."
                  surname="Przygienda">
            <organization/>
          </author>

          <author fullname="John Drake" initials="J." surname="Drake">
            <organization/>

            <address>
              <postal>
                <street/>

                <city/>

                <region/>

                <code/>

                <country/>
              </postal>

              <phone/>

              <facsimile/>

              <email/>

              <uri/>
            </address>
          </author>

          <author fullname="Alia Atlas" initials="A." surname="Atlas">
            <organization/>

            <address>
              <postal>
                <street/>

                <city/>

                <region/>

                <code/>

                <country/>
              </postal>

              <phone/>

              <facsimile/>

              <email/>

              <uri/>
            </address>
          </author>

          <date day="24" month="January" year="2017"/>
        </front>

        <seriesInfo name="draft-przygienda-rift-01 (work in progress)"
                    value=""/>
      </reference>

      <reference anchor="OpenFabric">
        <front>
          <title>OpenFabric</title>

          <author fullname="Russ White" initials="R." surname="White">
            <organization/>
          </author>

          <author fullname="Shawn Zandi" initials="S." surname="Zandi">
            <organization/>

            <address>
              <postal>
                <street/>

                <city/>

                <region/>

                <code/>

                <country/>
              </postal>

              <phone/>

              <facsimile/>

              <email/>

              <uri/>
            </address>
          </author>

          <date day="3" month="March" year="2017"/>
        </front>

        <seriesInfo name="draft-white-openfabric-00 (work in progress)"
                    value=""/>
      </reference>

      <reference anchor="RFC5305">
        <front>
          <title>IS-IS Extensions for Traffic Engineering</title>

          <author fullname="Tony Li" initials="T." surname="Li">
            <organization>a</organization>
          </author>

          <author fullname="Henk Smit" initials="H." surname="Smit">
            <organization/>

            <address>
              <postal>
                <street/>

                <city/>

                <region/>

                <code/>

                <country/>
              </postal>

              <phone/>

              <facsimile/>

              <email/>

              <uri/>
            </address>
          </author>

          <date day="1" month="October" year="2008"/>
        </front>

        <seriesInfo name="RFC 5305" value=""/>
      </reference>
    </references>
  </back>
</rfc>
