<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?rfc toc="yes"?>
<?rfc tocompact="yes"?>
<?rfc tocdepth="3"?>
<?rfc tocindent="yes"?>
<?rfc symrefs="yes"?>
<?rfc sortrefs="yes"?>
<?rfc comments="no"?>
<?rfc inline="yes"?>
<?rfc compact="yes"?>
<?rfc subcompact="no"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" category="exp" docName="draft-ietf-lsr-isis-flood-reflection-07" ipr="trust200902" obsoletes="" submissionType="IETF" updates="" xml:lang="en" tocInclude="true" tocDepth="3" symRefs="true" sortRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.9.1 -->
  <front>
    <title abbrev="draft-ietf-lsr-isis-flood-reflection">
            IS-IS Flood Reflection
    </title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-lsr-isis-flood-reflection-05"/>
    <author fullname="Tony Przygienda" initials="A." surname="Przygienda" role="editor">
      <organization>Juniper</organization>
      <address>
        <postal>
          <street>1137 Innovation Way
          </street>
          <city>Sunnyvale</city>
          <region>CA
          </region>
          <code/>
          <country>USA
          </country>
        </postal>
        <phone/>
        <email>prz@juniper.net
        </email>
        <uri/>
      </address>
    </author>
    <author fullname="Chris Bowers" initials="C." surname="Bowers">
      <organization>Juniper</organization>
      <address>
        <postal>
          <street>1137 Innovation Way
          </street>
          <city>Sunnyvale</city>
          <region>CA
          </region>
          <code/>
          <country>USA
          </country>
        </postal>
        <phone/>
        <email>cbowers@juniper.net
        </email>
        <uri/>
      </address>
    </author>
    <author fullname="Yiu Lee" initials="Y" surname="Lee">
      <organization>Comcast</organization>
      <address>
        <postal>
          <street>1800 Bishops Gate Blvd</street>
          <city>Mount Laurel</city>
          <region>NJ</region>
          <code>08054</code>
          <country>US</country>
        </postal>
        <email>Yiu_Lee@comcast.com</email>
      </address>
    </author>
    <author fullname="Alankar Sharma" initials="A" surname="Sharma">
      <organization>Comcast</organization>
      <address>
        <postal>
          <street>1800 Bishops Gate Blvd</street>
          <city>Mount Laurel</city>
          <region>NJ</region>
          <code>08054</code>
          <country>US</country>
        </postal>
        <email>Alankar_Sharma@comcast.com</email>
      </address>
    </author>
    <author fullname="Russ White" initials="R." surname="White">
      <organization>Juniper</organization>
      <address>
        <postal>
          <street>1137 Innovation Way
          </street>
          <city>Sunnyvale</city>
          <region>CA
          </region>
          <code/>
          <country>USA
          </country>
        </postal>
        <phone/>
        <email>russw@juniper.net
        </email>
        <uri/>
      </address>
    </author>
    <date year="2021"/>
    <abstract>
      <t>This document describes a backwards compatible, optional
                IS-IS extension that allows the creation of IS-IS flood reflection
                topologies.  Flood reflection allows
				topologies in which L1 areas provide transit forwarding for L2 using all
                available L1 nodes internally.  It accomplishes this by creating L2 flood reflection
				adjacencies within each L1 area. Those adjacencies are
				used to flood L2 LSPDUs, and they are used in the L2 SPF computation.
				However, they are not used for forwarding within the flood reflection cluster.  This arrangement gives
				the L2 topology significantly better scaling properties.  As additional benefit,
                only those routers directly participating
				in flood reflection have to support the feature.  This allows for the
				incremental deployment of scalable L1 transit areas in an existing network, without
				the necessity of upgrading other routers in the network.
      </t>
    </abstract>
    <note>
      <name>Requirements Language</name>
      <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 format="default" target="RFC2119">RFC 2119</xref>.
      </t>
    </note>
  </front>
  <middle>



    <section toc="default" numbered="true">
      <name>Introduction</name>
        <t> This section introduces the problem space and outlines the solution. Some of the terms
            may be unfamiliar to reader without extensive IS-IS background and in such case
            a glossary  is provided in <xref target="glossary"/>  and can be referenced.
        </t>
      <t>
                Due to the inherent properties of link-state protocols the number of IS-IS
                routers within a flooding domain is limited by processing and flooding
                overhead on each node. While that number
                can be maximized by well written implementations and techniques such as
                exponential back-offs, IS-IS will still reach a saturation point where no further
                routers can be added to a single flooding domain.
                In some L2 backbone deployment scenarios, this limit presents a significant challenge.
      </t>
      <t>
				The traditional approach to increasing the scale of an IS-IS deployement is
				to break it up into multiple L1 flooding domains and a single L2
				backbone. This works well for designs where an L2 backbone connects L1
                access topologies, but it is limiting where a large L2 is supposed to span
                large number of routers. In such scenarios, an alternative approach is to
                consider multiple
				L2 flooding domains connected together via L1 flooding domains.
                In other words, L2 flooding domains are connected by "L1/L2 lanes" through
				the L1 areas to form a single L2 backbone again. Unfortunately, in its
				simplest implementation, this requires the inclusion of most, or all, of
				the transit L1 routers as L1/L2 to allow traffic to flow along optimal
				paths through such transit areas. Consequently, this approach
				fails to reduce the number of L2 routers involved, so it fails to increase the
				scalability of the L2 backbone.
      </t>
      <figure anchor="f1">
        <name>Example Topology of L1 with L2 Borders</name>
        <artwork align="left" alt="" name="" type=""><![CDATA[

+====+  +=======+             +=======+               +======-+  +====+
I R1 I  I  R10  +-------------+  R20  +---------------+  R30  I  I R4 I
I L2 +--+ L1/L2 I             I  L1   I               I L1/L2 +--+ L2 I
I    I  I       +          +--+       I  +------------+       I  I    I
+====+  ++====+=+          |  +===+===+  |            +=+==+=++  +====+
         |    |            |      |      |              |    |
         |    |            |      |      |  +-----------+    |
         |    +-------+    |      |      |  |                |
         |            |    |      |      |  |                |
         |            |    |      |      |  |                |
         |            |    |      |      |  |                |
+====+  ++=====-+     |    |  +===+===+--+  |         +======++  +====+
I R2 I  I  R11  I     |    |  I  R21  I     |         I  R31  I  I R5 I
I L2 +--+ L1/L2 +-------------+  L1   +---------------+ L1/L2 +--+ L2 I
I    I  I       I     |    |  I       I     | +-------+       I  I    I
+====+  ++=====-+     |    |  ++==+==++     | |       +======++  +====+
         |            |    |   |  |  |      | |              |
         | +---------------+   |  |  |      | |              |
         | |          |        |  |  |      | |              |
         | |  +----------------+  |  +-----------------+     |
         | |  |       |           |         | |        |     |
+====+  ++=+==+=+     +-------+===+===+-----+ |       ++=====++  +====+
I R3 I  I  R12  I             I  R22  I       |       +  R32  I  I R6 I
I L2 +--+ L1/L2 I             I  L1   +-------+       I L1/L2 +--+ L2 I
I    I  I       +-------------+       +---------------+       I  I    I
+====+  +=======+             +=======+               +=======+  +====+

    ]]></artwork>
      </figure>
      <t>
                <xref target="f1" format="default"/> is an example of a network where a topologically rich L1 area
                is used to provide transit between six different L2-only routers (R1-R6).  Note that
				the six L2-only routers do not have connectivity to one another over L2 links.
				To take advantage of the abundance of paths in the L1 transit area,
                all the intermediate systems could be placed into both L1 and L2, but this
                essentially combines the separate L2 flooding domains into a single one,
                triggering again maximum L2 scale limitation we try to address in first place.
</t>
      <t> A more effective solution would allow to reduce the number of links and routers exposed
                in L2, while still utilizing
                the full L1 topology when forwarding through the network.
</t>
      <t> <xref target="RFC8099" format="default"/> describes Topology Transparent Zones (TTZ) for OSPF.
			    The TTZ mechanism represents a group of OSPF routers as a full mesh of adjacencies
				between the routers at the edge of the group.  A similar mechanism
                could be applied to IS-IS as well.  However, a full mesh of adjacencies between edge routers
				(or L1/L2 nodes) significantly limits the scale of the topology.
				The topology in <xref target="f1" format="default"/> has 6 L1/L2 nodes.   <xref target="f2" format="default"/> illustrates
				a full mesh of L2 adjacencies between the 6 L1/L2 nodes, resulting in
				(5 * 6)/2 = 15 L2 adjacencies. In a somewhat larger topology containing 20 L1/L2 nodes,
				the number of L2 adjacencies in a full mesh rises to 190.
      </t>
      <figure anchor="f2">
        <name>Example topology represented in L2 with a full mesh of L2 adjacencies between L1/L2 nodes</name>
        <artwork align="left" alt="" name="" type=""><![CDATA[

+----+  +-------+    +-------------------------------+-------+  +----+
| R1 |  |  R10  |    |                               |  R30  |  | R4 |
| L2 +--+ L1/L2 +------------------------------------+ L1/L2 +--+ L2 |
|    |  |       |    |                               |       |  |    |
+----+  ++-+-+--+-+  |                             +-+--+---++  +----+
         | | |    |  |                             |    |   |
         | +----------------------------------------------+ |
         |   |    |  |                             |    | | |
         |   +-----------------------------------+ |    | | |
         |        |  |                           | |    | | |
         |     +----------------------------------------+ | |
         |     |  |  |                           | |      | |
+----+  ++-----+- |  |                           | | -----+-++  +----+
| R2 |  |  R11  | |  |                           | | |  R31  |  | R5 |
| L2 +--+ L1/L2 +------------------------------------+ L1/L2 +--+ L2 |
|    |  |       | |  |                           | | |       |  |    |
+----+  ++------+------------------------------+ | | +----+-++  +----+
         |        |  |                         | | |      | |
         |        |  |                         | | |      | |
         |    +-------------------------------------------+ |
         |    |   |  |                         | | |        |
         |    |   |  |                         +----------+ |
         |    |   |  |                           | |      | |
         |    |   |  |                           +-----+  | |
         |    |   |  |                             |   |  | |
+----+  ++----+-+-+  |                             +-+-+--+-++  +----+
| R3 |  |  R12  |    |      L2 adjacency             |  R32  |  | R6 |
| L2 +--+ L1/L2 +------------------------------------+ L1/L2 +--+ L2 |
|    |  |       |    |                               |       |  |    |
+----+  +-------+----+                               +-------+  +----+

    ]]></artwork>
      </figure>
      <t>
                BGP, as specified in <xref target="RFC4271" format="default"/>, faced a similar scaling problem, which
                has been
                solved in many networks by deploying BGP route reflectors <xref target="RFC4456" format="default"/>.
                We note that BGP route reflectors do not necessarily have to be in the
                forwarding path of the traffic. This incongruity of forwarding and control path for BGP
				route reflectors allows the control plane to scale independently of the forwarding plane.
      </t>
      <t>
                We propose here a similar solution for IS-IS. A simple example of what a flood
                reflector control plane approach would look like
                is shown in <xref target="f3" format="default"/>, where router R21 plays the role of a flood reflector. Each
                L1/L2 ingress/egress router builds a tunnel to the flood reflector, and an L2 adjacency is built
				over each tunnel.  In this solution, we need only 6 L2 adjacencies,
				instead of the 15 needed for a full mesh.  In a somewhat larger topology containing 20 L1/L2 nodes,
				this solution requires only 20 L2 adjacencies, instead of the 190 need for a full mesh.
                Multiple flood reflectors can be used, allowing the network operator to balance between
                resilience, path utilization, and state in the control plane. The resulting
                L2 adjacency scale is R*n, where R is the number of flood reflectors used and n is the number of
				L1/L2 nodes.  This compares quite favorably with n*(n-1)/2 L2 adjacencies
				required in a topologically fully meshed L2 solution.
      </t>
      <figure anchor="f3">
        <name>Example topology represented in L2 with L2 adjacencies from each L1/L2 node to a single flood reflector</name>
        <artwork align="left" alt="" name="" type=""><![CDATA[

+----+  +-------+                                    +-------+  +----+
| R1 |  |  R10  |                                    |  R30  |  | R4 |
| L2 +--+ L1/L2 +--------------+   +-----------------+ L1/L2 +--+ L2 |
|    |  |       |  L2 adj      |   |      L2 adj     |       |  |    |
+----+  +-------+  over        |   |      over       +-------+  +----+
                   tunnel      |   |      tunnel
+----+  +-------+           +--+---+--+              +-------+  +----+
| R2 |  |  R11  |           |   R21   |              |  R31  |  | R5 |
| L2 +--+ L1/L2 +-----------+  L1/L2  +--------------+ L1/L2 +--+ L2 |
|    |  |       |  L2 adj   |  flood  |   L2 adj     |       |  |    |
+----+  +-------+  over     |reflector|   over       +-------+  +----+
                   tunnel   +--+---+--+   tunnel
+----+  +-------+              |   |                 +-------+  +----+
| R3 |  |  R12  +--------------+   +-----------------+  R32  |  | R6 |
| L2 +--+ L1/L2 |  L2 adj                 L2 adj     | L1/L2 +--+ L2 |
|    |  |       |  over                   over       |       |  |    |
+----+  +-------+  tunnel                 tunnel     +-------+  +----+

    ]]></artwork>
      </figure>
      <t>
				As illustrated in <xref target="f3" format="default"/>, when R21 plays the role of flood reflector,
				it provides L2 connectivity among all of the previously disconnected L2 islands by
				reflooding all L2 LSPDUs.  At the same time, R20 and R22 in <xref target="f1"/> remain L1-only routers.
				L1-only routers and L1-only links are not visible in L2.  In this manner, the flood
				reflector allows us provide L2 control plane connectivity in a scalable manner.
      </t>
      <t>
                As described so far, the solution illustrated in  <xref target="f3" format="default"/> relies
				only on currently standardized IS-IS functionality. Without new functionality, however,
                the data traffic will traverse only R21.  This will unnecessarily create a bottleneck
				at R21 since there is still available capacity in the paths crossing the L1-only
				routers R20 and R22 in <xref target="f1"/>.
      </t>
      <t>
                Hence, some new functionality is necessary to allow the L1/L2 edge nodes
				(R10-12 and R30-32 in <xref target="f3" format="default"/>) to recognize that the L2 adjacency to R21
				should not be used for forwarding. The L1/L2 edge nodes
				should forward traffic that
                would normally be forwarded over the L2 adjacency to R21
                over L1 links instead.  This would allow the forwarding within the L1 area
				to use the L1-only nodes and links shown in <xref target="f1" format="default"/> as well.  It allows
				networks to be built that use the entire forwarding capacity of the L1 areas,
				while at the same time introducing control plane scaling benefits provided by L2 flood reflectors.
      </t>
      <t> This document defines all extensions necessary to support flood reflector deployment:
      </t>
      <ul spacing="normal">
        <li>A 'flood reflector adjacency' for all the adjacencies built for the purpose of
                        reflecting flooding information. This allows these 'flood reflectors' to
                        participate in the IS-IS control plane without being used in the forwarding
                        plane. This is a purely local operation on the L1/L2 ingress; it does not
                        require replacing or modifying any routers not involved in the reflection
                        process. Deployment-wise, it is far less tricky to just upgrade the routers
                        involved in flood reflection rather than have a flag day on the whole IS-IS
                        domain.
                    </li>
        <li>An (optional) full mesh of tunnels between the L1/L2 routers, ideally
                        load-balancing across all available L1 links. This harnesses all forwarding
                        paths between the L1/L2 edge nodes without injecting unneeded
                        state into the L2 flooding domain or creating 'choke points' at the 'flood
                        reflectors' themselves. The draft is agnostic as to the tunneling technology
                        used but provides enough information for automatic establishment of such
                        tunnels. The discussion of IS-IS adjacency formation and/or liveness discovery
                        on such tunnels is outside the scope of this draft and is largely
                        choice of the underlying implementation.
                        A solution without tunnels is also possible by applying judicious
                        scoping of reachability information between the levels as described in
                        more details later.
                    </li>
        <li>
                        Some way to support reflector redundancy, and potentially some way to
                        auto-discover and advertise such adjacencies as flood reflector adjacencies.
                        Such advertisements may allow L2 nodes outside the L1
                        to perform optimizations in the future based on this information.
                    </li>
      </ul>
    </section>

      <section anchor="glossary" numbered="true" toc="default">
          <name>Glossary</name>
          <t>
              This section is introduced with the intention of allowing quick reference
              in the more detailed parts of the document to terms used
          </t>
          <dl newline="true" spacing="normal">
              <dt>Flood Reflector:</dt>
              <dd>Node configured to connect L2 only to flood reflector clients and reflect (reflood) IS-IS L2 LSPs amongst them.</dd>
              <dt>Flood Reflector Client:</dt>
              <dd>Node configured to build flood reflector adjacencies and normal L2 nodes.</dd>
              <dt>Flood Reflector Adjacency:</dt>
              <dd>IS-IS L2 adjacency limited by one end being client and the other reflector and agreeing on the same
                  Flood Reflector Cluster ID.</dd>
              <dt>Flood Reflector Cluster:</dt>
              <dd>Collection of clients and flood reflectors configured with the same cluster identifier. Cluster ID
                  value of 0 SHOULD NOT be used since it may be used in the future for special purposes. </dd>
              <dt>
                  Tunnel Deployment:
              </dt>
              <dd>Deployment where flood reflector clients build a partial or full mesh of tunnels in L1  to "shortcut"
                  forwarding of L2 traffic through the cluster.</dd>
              <dt>
                  No Tunnel Deployment:
              </dt>
              <dd>
                  Deployment where flood reflector clients redistribute L2 reachability into L1 to allow
                  forwarding through the cluster without underlying tunnels.
              </dd>
              <dt>
                  Tunnel Endpoint:
              </dt>
              <dd>
                  An endpoint that allows to establish a bi-directional tunnel carrying ISIS control traffic or
                  alternately serves as origin of such tunnel.
              </dd>
              <dt>
                  L1 shortcut:
              </dt>
              <dd>
                  A tunnel between two clients visible in L1 only that is used as a next-hop, i.e. to carry
                  data traffic in tunnel deployment mode.
              </dd>
          </dl>
      </section>

    <section numbered="true" toc="default">
      <name>Further Details</name>
      <t>
                Several considerations should be noted in relation to such a flood reflection mechanism.
      </t>
      <t>
                First, this allows multi-area IS-IS deployments to scale without any major
                modifications in the IS-IS implementation on most of the nodes
                deployed in the network. Unmodified (traditional) L2 routers will
                compute reachability across the transit L1 area using the flood reflector
                adjacencies.
      </t>
      <t>
                Second, the flood reflectors are not required to participate in forwarding
                traffic through the L1 transit area. These flood reflectors can
                be hosted on virtual devices outside the forwarding topology.
</t>
      <t>
                Third, astute readers will realize that flooding reflection may cause the use
                of suboptimal paths. This is similar to the BGP route reflection suboptimal
                routing problem described in <xref target="ID.draft-ietf-idr-bgp-optimal-route-reflection-28" format="default"/>.
                The L2 computation determines the egress L1/L2 and with that can create illusions
                of ECMP where there is none. And in certain scenarios lead to an L1/L2 egress which
                is not globally optimal. This represents a straightforward instance of the trade-off
                between the amount of control plane state and the optimal use of paths through
                the network often encountered when aggregating routing information.
      </t>
      <t>
                One possible solution to this problem is to expose additional topology information into
                the L2 flooding domains. In the example network given, links from router 01 to
                router 02 can be exposed into L2 even when 01 and 02 are participating in flood reflection.
                This information would allow the L2 nodes to build 'shortcuts' when the
                L2 flood reflected part of the topology looks more expensive to cross distance wise.
      </t>
      <t>Another possible variation is for
                an implementation to approximate with the tunnel cost the cost of the
                underlying topology.  </t>
      <t>
                Redundancy can be achieved by building multiple flood reflectors
                in a L1 area.  Multiple flood reflectors
                do not need any synchronization mechanisms amongst themselves, except standard
                IS-IS flooding and database maintenance procedures.
      </t>

    </section>

      <section numbered="true" toc="default">
      <name>Encodings</name>

    <section anchor="sec_flood_reflection_tlv" numbered="true" toc="default">
      <name>Flood Reflection TLV</name>
      <t>
				The Flood Reflection TLV is a new top-level TLV that MAY appear in L2
				IIHs.  The Flood Reflection TLV indicates the flood reflector cluster
				(based on Flood Reflection Cluster ID) that a given router is configured to
				participate in. It also indicates whether the router is configured to
				play the role of either flood reflector or flood reflector client. The Flood Reflection
				Cluster ID and flood reflector roles advertised in the IIHs
				are used to ensure that flood reflector adjacencies are only
				formed between a flood reflector and flood reflector client, and that
				the Flood Reflection Cluster IDs match. The Flood Reflection TLV has the following format:
      </t>
      <artwork align="left" alt="" name="" type=""><![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      |    Length     |C|  RESERVED   |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Flood Reflection Cluster ID                |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Sub-TLVs ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

                ]]></artwork>
      <dl newline="false" spacing="normal">
        <dt>Type:</dt>
        <dd>TBD</dd>
        <dt>Length:</dt>
        <dd>The length, in octets, of the following fields.</dd>
        <dt>C (Client):</dt>
        <dd>
					    This bit is set to indicate that the router acts as a flood reflector client.
						When this bit is NOT set, the router acts as a flood reflector.	On a given router,
						the same value of the C-bit MUST be advertised across all interfaces advertising the Flood
                        Reflection TLV in IIHs.
                    </dd>
        <dt>RESERVED:</dt>
        <dd>
					    This field is reserved for future use.  It MUST be set to 0 when sent
						and MUST be ignored when received.
                    </dd>
        <dt>Flood Reflection Cluster ID:</dt>
        <dd>

            <!-- @todo: do we make it a SHOULD? -->

            Flood Reflection Cluster Identifier. These same 32-bit value MUST be
						assigned to all of the flood reflectors and flood reflector clients in
						the same L1 area. The value MUST be unique across different L1 areas within
						the IGP domain. In case of violation of those rules multiple L1 areas
                        may become a single cluster or a single area may split in flood reflection
             sense and several mechanisms such as auto-discovery
            of tunnels may not work correctly.

            <!-- @todo: do we make it a SHOULD? -->

            On a given router, the same value of the Flood Reflection
						Cluster ID MUST be advertised across all interfaces advertising the Flood
                        Reflection TLV in IIHs. When a router discovers that a node is using
                        multiple Cluster IDs based on its advertised TLVs and IIHs, the node
                        MAY adequately log such violations subject to rate limiting.
                        This implies that a flood reflector MUST NOT participate
                        in more than a single L1 area. In case of Cluster ID value of 0,
                        the TLV containing it MUST be ignored.
                    </dd>
        <dt>Sub-TLVs:</dt>
        <dd> Optional sub-TLVs.  For future extensibility, the
						format of the Flood Reflection TLV allows for the possibility of
						including optional sub-TLVs.  No sub-TLVs of the Flood Reflection TLV
						are defined in this document.
                    </dd>
      </dl>
      <t>
				The Flood Reflection TLV SHOULD NOT appear more than once in an IIH.  A router
				receiving multiple Flood Reflection TLVs in the same IIH MUST use the values in the
				first TLV of the lowest numbered fragment and it SHOULD adequately log such violations subject to rate limiting.
      </t>

    </section>
    <section anchor="sec_flood_reflection_discovery_subtlv" numbered="true" toc="default">
      <name>Flood Reflection Discovery Sub-TLV</name>
      <t>
				Flood Reflection Discovery sub-TLV is advertised as a sub-TLV of the
				IS-IS Router Capability TLV-242, defined in <xref target="RFC7981" format="default"/>.
				The Flood Reflection Discovery sub-TLV is advertised in L1 and L2 LSPs with
				area flooding scope in order to enable the auto-discovery of flood
				reflection capabilities. The Flood Reflection Discovery sub-TLV has
				the following format:
      </t>
      <artwork align="left" alt="" name="" type=""><![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      |    Length     |C|  Reserved   |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Flood Reflection Cluster ID                |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

                ]]></artwork>
      <dl newline="false" spacing="normal">
        <dt>Type:</dt>
        <dd>TBD</dd>
        <dt>Length:</dt>
        <dd>The length, in octets, of the following fields.</dd>
        <dt>C (Client):</dt>
        <dd>
					    This bit is set to indicate that the router acts as a flood reflector client.
						When this bit is NOT set, the router acts as a flood reflector.
                    </dd>
        <dt>RESERVED:</dt>
        <dd>
					    This field is reserved for future use.  It MUST be set to 0 when sent
						and MUST be ignored when received.
                    </dd>
        <dt>Flood Reflection Cluster ID:</dt>
        <dd> The Flood Reflection Cluster Identifier is
						the same as that defined in the Flood Reflection TLV and obeys the same rules.
        </dd>
      </dl>
      <t>
				The Flood Reflection Discovery sub-TLV SHOULD NOT appear more than once in TLV 242.  A router
				receiving multiple Flood Reflection Discovery sub-TLVs in TLV 242 MUST use the values in the
				first sub-TLV of the lowest numbered fragment and it SHOULD adequately log such violations subject to rate limiting.
      </t>
    </section>


      <section anchor="sec_flood_reflection_discovery_tunnel_subtlv" numbered="true" toc="default">
          <name>Flood Reflection Discovery Tunnel Type Sub-Sub-TLV</name>
          <t>
              Flood Reflection Discovery Tunnel Type sub-sub-TLV is advertised optionally as a sub-sub-TLV of the
              Flood Reflection Discovery Sub-TLV, defined in <xref target="sec_flood_reflection_discovery_subtlv"/>.
              It allows the automatic creation of L2 tunnels to be used as
              flood reflector adjacencies and L1 shortcut tunnels. The Flood Reflection Tunnel Type sub-sub-TLV has
              the following format:
          </t>
          <artwork align="left" alt="" name="" type=""><![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      |    Length     | Reserved    |F|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                Tunnel Encapsulation Attribute                 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

                ]]></artwork>
          <dl newline="false" spacing="normal">
              <dt>Type:</dt>
              <dd>TBD</dd>
              <dt>Length:</dt>
              <dd>The length, in octets, of zero or more of the following fields.</dd>
              <dt>Reserved:</dt>
              <dd>
              SHOULD be 0 on transmission and ignored on reception.</dd>
              <dt>F Flag:</dt>
              <dd>
                  When set indicates flood reflection tunnel endpoint, when clear, indicates
                  possible L1 shortcut tunnel endpoint.
              </dd>
              <dt>Tunnel Encapsulation Attribute:</dt>
              <dd>
                  Carries encapsulation type and further attributes necessary for tunnel establishment
                  as defined in <xref target="RFC9012"/>. Protocol type sub-TLV as defined in
                  <xref target="RFC9012"/> MAY be included but MUST when F flag is set include according type
                  that allows carrying of encapsulated IS-IS frames. Such tunnel type MUST provide according
                  mechanisms to carry up to `originatingL2LSPBufferSize` sized IS-IS frames across.
              </dd>
          </dl>
          <t>
              A flood reflector
              receiving Flood Reflection Discovery Tunnel Type sub-sub-TLVs in Flood Reflection Discovery
              sub-TLV with F flag set
              SHOULD use one or more of the specified tunnel endpoints to automatically establish one or more
              tunnels that will serve as flood reflection adjacency(-ies) to the clients advertising the endpoints.
              </t>
          <t>
              A flood reflection client
              receiving multiple Flood Reflection Discovery Tunnel Type sub-sub-TLVs in Flood Reflection Discovery
              sub-TLV with F flag clear from other leaves
              MAY use one or more of the specified tunnel endpoints to automatically establish one or more
              tunnels that will serve as L1 tunnel shortcuts to the clients advertising the endpoints.
          </t>
          <t>
              In case of automatic flood reflection adjacency tunnels and in case IS-IS adjacencies are being formed across
              L1 shortcuts all the aforementioned rules in <xref target="sec_discovery"/> apply as well.
          </t>
          <t>
              Optional address validation procedures
              as defined in <xref target="RFC9012"/> MUST be disregarded.
          </t>
      </section>

    <section numbered="true" toc="default">
      <name>Flood Reflection Adjacency Sub-TLV</name>
      <t>
				The Flood Reflection Adjacency sub-TLV is advertised as a sub-TLV
				of TLVs 22, 23, 25, 141, 222, and 223. Its presence indicates that a
				given adjacency is a flood reflector adjacency.
				It is included in L2 area scope flooded LSPs. Flood Reflection Adjacency
				sub-TLV has the following format:
      </t>
      <artwork align="left" alt="" name="" type=""><![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      |    Length     |C|  Reserved   |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Flood Reflection Cluster ID                |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

                ]]></artwork>
      <dl newline="false" spacing="normal">
        <dt>Type:</dt>
        <dd>TBD</dd>
        <dt>Length:</dt>
        <dd>The length, in octets, of the following fields.</dd>
        <dt>C (Client):</dt>
        <dd>
					    This bit is set to indicate that the router advertising this adjacency
						is a flood reflector client. When this bit is NOT set, the router advertising
						this adjacency is a flood reflector.
                    </dd>
        <dt>RESERVED:</dt>
        <dd>
					    This field is reserved for future use.  It MUST be set to 0 when sent
						and MUST be ignored when received.
                    </dd>
        <dt>Flood Reflection Cluster ID:</dt>
        <dd> The Flood Reflection Cluster Identifier is
						the same as that defined in the Flood Reflection TLV and obeys the same rules.
                    </dd>
      </dl>
      <t>
				The Flood Reflection Adjacency sub-TLV SHOULD NOT appear more than once in a given TLV.  A router
				receiving multiple Flood Reflection Adjacency sub-TLVs in a TLV MUST use the values in the
				first sub-TLV of the lowest numbered fragment and it SHOULD adequately log such violations
          subject to rate limiting.
      </t>
    </section>
    <section anchor="sec_discovery" numbered="true" toc="default">
      <name>Flood Reflection Discovery</name>
      <t>A router participating in flood reflection as client or reflector MUST be configured as an L1/L2 router.
			It SHOULD originate the Flood Reflection Discovery sub-TLV with area flooding scope in L1 and L2.
			Normally, all routers on the edge of the L1 area (those having traditional L2 adjacencies)
			will advertise themselves as route reflector clients. Therefore, a flood reflector client
			will have both traditional L2 adjacencies and flood reflector L2 adjacencies.
      </t>
      <t> A router acting as a flood reflector MUST NOT have any traditional L2 adjacencies except
          with flood reflector clients.  It will
			 be an L1/L2 router only by virtue of having flood reflector L2 adjacencies.  A router
			 desiring to act as a flood reflector SHOULD advertise itself as such using
			 the Flood Reflection Discovery sub-TLV in L1 and L2.
      </t>
      <t>
			A given flood reflector or flood reflector client can only participate in a single cluster,
			as determined by the value of its Flood Reflection Cluster ID and should disregard other
            routers' TLVs for flood reflection purposes if the cluster ID is not matching.
      </t>
      <t>Upon reception of Flood Reflection Discovery sub-TLVs, a router acting as
			flood reflector client SHOULD initiate a tunnel towards each flood reflector with which
			it shares an Flood Reflection Cluster ID using one or more of the tunnel encapsulations
            provided with F flag being set.  The L2 adjacencies formed
			over such tunnels MUST be marked as flood reflector adjacencies.
			If the client or reflector has a direct L2 adjacency with the according remote side
            it SHOULD use it
			instead of instantiating a new tunnel.
          </t>
        <t>In absence of auto-discovery an implementation
            MAY use statically configured tunnels to create flood reflection adjacencies.
      </t>
        <t>
            The IS-IS metrics for all flood reflection adjacencies in a cluster SHOULD be uniform.
        </t>
      <t>Upon reception of Flood Reflection Discover TLVs, a router acting as
			a flood reflector client
          MAY initiate tunnels with L1-only adjacencies towards
			any of the other flood reflector clients with lower router IDs in its cluster using encapsulations with
          F flag clear. These tunnels MAY be used for
			forwarding to improve the load-balancing characteristics of the L1 area.
          If the clients have a direct L2 adjacency
          they SHOULD use it
          instead of instantiating a new tunnel.
      </t>
    </section>
    <section anchor="sec_adj" numbered="true" toc="default">
      <name>Flood Reflection Adjacency Formation</name>
      <t>
			In order to simplify both implementations and network deployments, this draft does not
			allow the formation of complex hierarchies of flood reflectors and clients or allow
            multiple clusters in a single L1 area.

          <!-- @todo: do we make it a SHOULD? -->

          Consequently, all flood reflectors and flood reflector clients in the same L1 area MUST share the same
			Flood Reflector Cluster ID. Deployment of multiple cluster IDs in the same L1 area are outside the scope
            of this document.
        </t>
        <t>
                A flood reflector MUST only form flood reflection adjacencies with flood reflector clients
                with matching Cluster ID.
                A flood reflector MUST NOT form any traditional L2 adjacencies.
        </t>
        <t>
                Flood reflector clients MUST only form flood reflection adjacencies with flood reflectors
                with matching Cluster ID.
        </t>
        <t>
                Flood reflector clients MAY form traditional L2 adjacencies with flood reflector clients
                or nodes not participating in flood reflection. When two clients form traditional L2
                adjacency Cluster ID is disregarded.
      </t>
      <t>
			The Flood Reflector Cluster ID and flood reflector
			roles advertised in the Flood Reflection TLVs in IIHs are used to ensure
			that flood reflection adjacencies that are established meet the above criteria.
      </t>
        <t>
                On change in either flood reflection role or cluster ID on IIH on the local or remote side
            the adjacency has to be
                reset and re-established if possible.
        </t>
      <t>
			Once a flood reflection adjacency is established, the flood reflector and the flood
			reflector client MUST advertise the adjacency by including the Flood Reflection Adjacency
			Sub-TLV in the Extended IS reachability TLV or MT-ISN TLV.</t>
    </section>
      </section>

    <section anchor="sec_route_comp" numbered="true" toc="default">
      <name>Route Computation</name>
      <t>
			To ensure loop-free routing, the route reflection client MUST follow the normal L2 computation
			to determine L2 routes. This is because nodes outside the L1 area will generally
			not be aware that flood reflection is being performed. The flood reflection clients
			need to produce the same result for the L2 route computation as a router not participating in
			flood reflection.
          </t>

        <section  numbered="true" toc="default">
            <name>Tunnel Based Deployment</name>
       <t>
           In tunnel based option the reflection client, after L2 and L1 computation,
           MUST examine all L2 routes and replace all flood reflector
           adjacencies  with
           the correct underlying tunnel next-hop to the egress.
      </t>
        </section>

        <section anchor="no_tunnels"  numbered="true" toc="default">
            <name>No Tunnel Deployment</name>

            <t>In case of deployment without underlying tunnels, the necessary L2 routes are distributed
            into the area, normally as L2->L1 routes.
				Due to the rules in <xref target="sec_adj" format="default"/>
			the computation in the resulting topology
				is relatively simple, the L2 SPF from a flood reflector client
			is guaranteed to reach within a hop the Flood Reflector and in the following hop the L2
			egress to which it has a forwarding tunnel again. All the flood reflector tunnel nexthops in the according
                L2 route can hence be removed and if the L2 route has no other ECMP L2 nexthops, the L2 route MUST
                be suppressed in the RIB by some means to allow the less preferred L2->L1 route to be used
                to forward traffic towards the advertising egress.
                </t>
            <t>
				In the particular case the client has L2 routes
				which are not route reflected, those will be naturally preferred (such routes
                normally
                "hot-potato" route of the L1 area). However
            in the case the L2 route through the flood reflector egress is "shorter" than such present non
                flood reflected L2
            routes, the node SHOULD ensure that such routes are suppressed so the L2->L1 towards the egress
            still takes preference. Observe that operationally this can be resolved in a relatively
            simple way by configuring flood reflector adjacencies to have a high metric, i.e. the flood
            reflector topology becomes "last resort" and the leaves will try to "hot-potato" out the area
             as fast as possible which is normally the desirable behavior.</t>

            <t>In deployment scenarios where tunnels are not used, all L1/L2 edge nodes MUST be ultimately
                flood reflector
                clients except during during transition phase.</t>

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

      <section anchor="sec_prefixes" numbered="true" toc="default">
          <name>Redistribution of Prefixes</name>
          <t>
              When L2 prefixes
              need to be redistributed into L1 by the route reflector clients a client that  does not
              have
              any L2 flood reflector adjacencies MUST NOT redistribute those routes into
              the area in case of application of <xref target="no_tunnels"/>.

              The L2 prefixes advertisements redistributed into L1 with flood reflectors
              SHOULD be normally limited to L2 intra-area routes (as defined in <xref target="RFC7775" format="default"/>),
              if the information exists to distinguish them from other other L2 prefix advertisements.
          </t>
          <t>
              On the other hand, in topologies that make use of flood reflection to hide the structure of L1 areas
              while still providing transit forwarding across them using tunnels, we generally do not need to
              redistribute L1 prefixes advertisements into L2.
          </t>

      </section>

    <section numbered="true" toc="default">
      <name>Special Considerations</name>
      <t>
			In pathological cases setting the overload bit in L1 (but not in L2) can partition
			L1 forwarding, while allowing L2 reachability through flood reflector adjacencies
			to exist. In such a case a node cannot replace a route
			through a flood reflector adjacency with a L1 shortcut and the client can use the
			L2 tunnel to the flood reflector for forwarding while it MUST initiate an alarm
			and declare misconfiguration.
      </t>
      <t>
			A flood reflector with directly L2 attached prefixes should advertise those in L1
			as well since based on preference of L1 routes the clients will not try to use
			the L2 flood reflector adjacency to route the packet towards them. A very, very
			corner case is when the flood reflector is reachable via L2 flood reflector adjacency
			(due to underlying L1 partition) only in which case the client can use the
			L2 tunnel to the flood reflector for forwarding towards those prefixes
			while it MUST initiate an alarm and declare misconfiguration.
      </t>
      <t>A flood reflector SHOULD NOT set the attached bit on its LSPs.
      </t>
      <t>
			Instead of modifying the computation procedures one could imagine a flood
			reflector solution where the Flood Reflector would re-advertise the L2 prefixes with a
			'third-party' next-hop but that would have less desirable convergence properties
			than the solution proposed and force a fork-lift of all L2 routers to make sure
			they disregard such prefixes unless in the same L1 domain as the Flood Reflector.
      </t>
      <t>
			Depending on pseudo-node choice in case of a broadcast domain with
			multiple flood reflectors attached this can lead to a partitioned
			LAN and hence a router discovering such a condition
			MUST initiate an alarm and declare misconfiguration.
      </t>
    </section>
    <section anchor="IANA" toc="default" numbered="true">
      <name>IANA Considerations</name>
      <t>This document requests allocation for the following IS-IS TLVs and
			Sub-TLVs.</t>
      <section numbered="true" toc="default">
        <name>New IS-IS TLV Codepoint</name>
        <t>This document requests the following IS-IS TLV:</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[Value Name                              IIH LSP SNP Purge
----- --------------------------------- --- --- --- -----
TBD1  Flood Reflection                   y   n   n   n

]]></artwork>
        <t>Suggested value for TBD1 is 161.</t>
      </section>

      <section numbered="true" toc="default">
        <name>Sub TLVs for TLV 242</name>
        <t>This document request the following registration in the "sub-TLVs
        for TLV 242" registry.</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[Type  Description
----  -----------
TBD2  Flood Reflection Discovery

]]></artwork>
        <t/>
        <t>Suggested value for TBD2 is 161.</t>
      </section>

        <section numbered="true" toc="default">
            <name>Sub-sub TLVs for Flood Reflection Discovery sub-TLV</name>
            <t>This document request the following registration in the "sub-sub-TLVs
                for Flood Reflection Discovery sub-TLV" registry.</t>
            <artwork name="" type="" align="left" alt=""><![CDATA[Type  Description
----  -----------
TBD3  Flood Reflection Discovery Tunnel Encapsulation Attribute

]]></artwork>
            <t/>
            <t>Suggested value for TBD3 is 161.</t>
        </section>

      <section numbered="true" toc="default">
        <name>Sub TLVs for TLV 22, 23, 25, 141, 222, and 223</name>
        <t>This document requests the following registration in the "sub-TLVs
        for TLV 22, 23, 25, 141, 222, and 223" registry.</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
Type  Description                       22  23  25  141 222 223
----  --------------------------------  --- --- --- --- --- ---
TBD4  Flood Reflector Adjacency          y   y  n   y   y   y

	]]></artwork>
        <t>Suggested value for TBD4 is 161.</t>
      </section>
    </section>
    <section numbered="true" toc="default">
      <name>Security Considerations</name>
      <t>This document introduces tunnels carrying IS-IS control traffic via tunnels.
          In case of statically configured tunnels a deployment SHOULD provide enough security protection to prevent
          malicious attackers from using the tunnel endpoints. For information used to form
          dynamically discovered tunnels, it
          SHOULD be protected by the the deployed IS-IS security mechanism preventing malicious nodes from
          spoofing rogue information on behalf of other members.
      </t>
    </section>
    <section numbered="true" toc="default">
      <name>Acknowledgements</name>
      <t>The authors thank Shraddha Hegde, Peter Psenak, Acee Lindem, Robert Raszuk and Les Ginsberg for
				their thorough review and detailed discussions. Thanks are also extended to
            Michael Richardson for an excellent routing directorate review.
      </t>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Informative References</name>
        <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.4271.xml"/>
        <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.4456.xml"/>
        <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8099.xml"/>
        <reference anchor="ID.draft-ietf-idr-bgp-optimal-route-reflection-28" target="https://www.ietf.org/id/draft-ietf-idr-bgp-optimal-route-reflection-28.txt">
          <front>
            <title>BGP Optimal Route Reflection</title>
            <author initials="R." surname="Raszuk et al.">
              <organization/>
            </author>
            <date month="July" year="2019"/>
          </front>
        </reference>
      </references>
      <references>
        <name>Normative References</name>
        <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml"/>
        <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.7775.xml"/>
        <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.7981.xml"/>
          <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.9012.xml"/>
      </references>
    </references>
  </back>
</rfc>
