<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc2629 version 1.5.6 -->

<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [
<!ENTITY RFC2119 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml">
<!ENTITY RFC8174 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml">
<!ENTITY RFC7274 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.7274.xml">
<!ENTITY RFC5036 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.5036.xml">
<!ENTITY RFC5073 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.5073.xml">
<!ENTITY I-D.kompella-mpls-mspl4fa SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml3/reference.I-D.kompella-mpls-mspl4fa.xml">
<!ENTITY RFC4090 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.4090.xml">
<!ENTITY RFC5286 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.5286.xml">
<!ENTITY RFC7490 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.7490.xml">
<!ENTITY RFC7432 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.7432.xml">
<!ENTITY RFC8317 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8317.xml">
<!ENTITY RFC8214 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8214.xml">
<!ENTITY RFC4364 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.4364.xml">
<!ENTITY RFC4761 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.4761.xml">
<!ENTITY RFC4762 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.4762.xml">
<!ENTITY I-D.ietf-mpls-rmr SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml3/reference.I-D.ietf-mpls-rmr.xml">
<!ENTITY RFC3209 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.3209.xml">
<!ENTITY RFC8660 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8660.xml">
<!ENTITY I-D.ietf-idr-next-hop-capability SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml3/reference.I-D.ietf-idr-next-hop-capability.xml">
<!ENTITY RFC5561 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.5561.xml">
]>

<?rfc toc="yes"?>
<?rfc sortrefs="yes"?>
<?rfc symrefs="yes"?>

<rfc ipr="trust200902" docName="draft-kompella-mpls-nffrr-04" category="std">

  <front>
    <title abbrev="NFFRR">No Further Fast Reroute</title>

    <author initials="K." surname="Kompella" fullname="Kireeti Kompella">
      <organization>Juniper Networks</organization>
      <address>
        <postal>
          <street>1133 Innovation Way</street>
          <city>Sunnyvale</city>
          <region>CA</region>
          <code>94089</code>
          <country>United States</country>
        </postal>
        <email>kireeti.kompella@gmail.com</email>
      </address>
    </author>
    <author initials="W." surname="Lin" fullname="Wen Lin">
      <organization>Juniper Networks</organization>
      <address>
        <postal>
          <street>1133 Innovation Way</street>
          <city>Sunnyvale</city>
          <region>CA</region>
          <code>94089</code>
          <country>United States</country>
        </postal>
        <email>wlin@juniper.net</email>
      </address>
    </author>

    <date year="2023" month="October" day="20"/>

    <area>Routing</area>
    <workgroup>MPLS WG</workgroup>
    <keyword>fast reroute, special purpose label</keyword>

    <abstract>


<t>There are several cases where, once Fast Reroute has taken place (for
MPLS protection), a second fast reroute is undesirable, even
detrimental.  This memo gives several examples of this, and proposes a
mechanism to prevent further fast reroutes.</t>



    </abstract>


  </front>

  <middle>


<section anchor="introduction" title="Introduction">

<t>MPLS Fast Reroute (FRR) <xref target="RFC4090"/> <xref target="RFC5286"/> <xref target="RFC7490"/> is a
useful and widely deployed tool for minimizing packet loss in the case
of a link or node failure.  This has not only proven to be very
effective, it is often the reason for using MPLS as a data plane.  FRR
works for a variety of control plane protocols, including LDP,
RSVP-TE, and SPRING.  Furthermore, FRR is often used to protect MPLS
services such as IP VPN and EVPN.</t>

<t>Having said this, there are case where, once FRR has taken place, if
the packet encounters a second failure, a second FRR is not helpful,
perhaps even disruptive.  For example, the packet may loop until TTL
expires.  This can lead to link congestion and further packet loss.
Thus, the attempt to prevent a packet from being dropped may instead
affect many other packets.  Note that the “second” failure may simply
be another manifestation of the same failure; see <xref target="evpn"/>.</t>

<t>This memo proposes a mechanism for preventing further FRR once in
cases where such further protection may be harmful.  Several examples
where this is the case are demonstrated as motivation.  A solution
using special-purpose labels (SPLs) is then offered.  Some mechanisms
for distributing the capability to avoid further fast reroutes are
also discussed, although these may be better placed in other documents
in other Working Groups.</t>

<section anchor="other-approaches" title="Other Approaches">

<t><xref target="ALDT"/> has a more elaborate mechanism for preventing loops due to
multiple failures.  This involves marking the nodes redirecting
traffic in a header (either individually, or as node groups), and
dropping the packet at a transit node if its ID is in the header.</t>

</section>
<section anchor="terminology" title="Terminology">

<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 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they appear in all
capitals, as shown here.</t>

</section>
</section>
<section anchor="motivation" title="Motivation">

<t>A few cases are given where “further fast reroute” is harmful.  Some
of the cases are for MPLS services; others for “plain” MPLS forwarding.</t>

<section anchor="evpn-vpnvpls-active-active-multihoming" title="EVPN (VPN/VPLS) Active-active Multihoming">

<t>Consider the following topology for multihoming an Ethernet VPN (EVPN
<xref target="RFC7432"/>) Customer Edge (CE) device for protection against the
failure of a Provider Edge (PE) device or a PE-CE link.  To do so,
there is a backup MPLS path between PE2 and PE3 (denoted by the
starred line).</t>

<figure title="EVPN Multihoming" anchor="evpn"><artwork><![CDATA[
                   P1 ...         ... P3 --- PE2
                  /                         *   \ link1
                 /                         *     \
      CE1 --- PE1                          *      CE2
                 \                         *     /
                  \                         *   / link2
                   P2 ...         ... P4 --- PE3

]]></artwork></figure>

<t>Suppose (known unicast) traffic goes from CE1 to CE2.  With
active-active multihoming, this traffic will be load-balanced between
PE2 (to CE2 via link link1) and PE3 (to CE2 via link2).  If link1 were
to fail, PE2 can still get traffic for CE2 by sending it over the
backup path to PE3 (and similarly for PE3 if link2 fails).</t>

<t>However, suppose CE2 is down.  PE2 will assume link1 is down and send
traffic for CE2 to PE3 over the backup path.  PE3 (which thinks that
link2 is down; note that the single real failure of CE2 being down is
manifested as separate failures to PE2 and PE3) will protect this
“second” failure by sending traffic for CE2 over the backup path to
PE2.  Thus, traffic will ping-pong between PE2 and PE3 until TTL
expires.</t>

<t>Thus, the attempt to protect traffic to CE2 may end up doing more harm
than good, by congesting the backup path between PE2 and PE3 and by
giving PE2 and PE3 useless work to do.</t>

<t>A similar topology can be used in EVPN-Etree <xref target="RFC8317"/>, EVPN-VPWS
<xref target="RFC8214"/>, IP VPN <xref target="RFC4364"/> or VPLS <xref target="RFC4761"/> <xref target="RFC4762"/>.
In all these cases, the same looping behavior would occur for unicast
traffic if CE2 is down.</t>

</section>
<section anchor="rmr-protection" title="RMR Protection">

<figure title="RMR Looping" anchor="rmr"><artwork><![CDATA[
                  R0 . . . R1                 
                .             .               
             R7                 R2            
Anti-     |  .                   .  |         
Clockwise |  .        Ring       .  | Clockwise
          v  .                   .  v         
             R6                 R3            
                .             .               
                  R5 . . . R4                 

]]></artwork></figure>

<t>In Resilient MPLS Rings (RMR), suppose traffic goes from a node, say
R0, to a node, say R4, over a clockwise path.  Protection consists of
switching this traffic onto the anti-clockwise path to R4.  This works
well if a node or link between R0 or R4 is down.  However, if node R4
itself is down, its adjacent neighbor R3, will send the traffic
anti-clockwise to R4; when this traffic reaches R4’s other neighbor
R5, it will return to N3, and so on, until TTL expires.
<xref target="I-D.ietf-mpls-rmr"/> provides more details, and offers some means of
mitigation.  This memo offers a more elegant solution.</t>

</section>
<section anchor="general-mpls-forwarding" title="General MPLS forwarding">

<t>Consider the following topology:</t>

<figure title="General MPLS Forwarding" anchor="genfwd"><artwork><![CDATA[
         N1 --- N2 --- N3 --- N4
                |       |
                |       |
         N5 --- N6 --- N7 --- N8
                |       |
                |       |
                N9 --- N10
]]></artwork></figure>

<t>Say link protection is configured for links N2-N3 and N6-N7.  Link
N2-N3 is protected by a bypass tunnel N2-N6-N7-N3, and link N7-N3 is
protected by a bypass tunnel N7-N6-N2-N3.  (These bypass tunnels may
be set up using RSVP-TE <xref target="RFC3209"/> or via SPRING stacks
<xref target="RFC8660"/>.)  Say furthermore that there is an LSP from N1 to N4
with path N1-N2-N3-N4, which asks for link protection.  If link N2-N3
fails, traffic will take the path N1-N2-N6-N7-N3-N4.</t>

<t>Suppose, however, links N2-N3 and N7-N3 fail simultaneously.  This may
happen if they share fate (e.g., go over a common fiber conduit); it
may also appear to happen if node N3 fails.  Either way, first, the
bypass protecting link N2-N3 kicks in, and traffic is sent to N3 via
N6 and N7.  However, when the traffic hits N7, the bypass for N7-N3
kicks in, and traffic is sent back to N2.  Thus the traffic will loop
between N2 and N7 until TTL expires, in the process congesting links
N2-N6 and N6-N7.</t>

<t>Now consider an LSP: N5-N6-N7-N8.  The link N6-N7 may be protected by
the bypass N6-N2-N3-N7 or by N6-N9-N10-N7, or by load-balancing
between these two bypasses.  If both links N2-N3 and N6-N7 fail, then
traffic that is protected via bypass N6-N2-N3-N7 will ping-pong
between N6 and N2 until TTL expires; traffic protected via bypass
N6-N9-N10-N7 will successfully make it to N8.  If link N6-N7 is
protected by load-balancing across the two bypass paths, then about
half the traffic will loop between N6 and N2, and the rest will make
it to N8.</t>

<t>While the above description is for protection using a bypass tunnel,
the same principle applies to protection using Loop-Free Alternates
<xref target="RFC5286"/> <xref target="RFC7490"/> or any of its variants (such as Topology
Independent LFA).</t>

</section>
</section>
<section anchor="solution" title="Solution">

<t>To address this issue, we suggest the use of a SPL <xref target="RFC7274"/> called
NFFRR (value TBD; suggested: 8).  An alternate would be to use an
extended SPL, whereby a pair of labels indicates that no further fast
route is desired.  However, in the case of SPRING MPLS bypass tunnels
(<xref target="spring"/>) of depth N, this would triple the label stack size.  Using
regular SPLs instead would only double the stack size.</t>


<t>To achieve loop-free fast rerouting for MPLS-based VPN networks, such as L3VPN, EVPN,
VPWS, we can also use a different label for fast-rerouted data packets, separate from
the label used for regular data packets.  This fast reroute label allows the egress
routers to distinguish fast-rerouted data packets from regular data packets, thus
enabling loop-free reroute in response to another link or node failure.
</t>

<t>It's important to note that the fast reroute label also functions as a service label
for a  VPN.  Therefore for egress link protection, a dedicated reroute label would be required
for each multihomed CE.  For example, in the case of EVPN multihoming, each EVPN instance
typically requires a distinct fast reroute label for each multihomed Ethernet Segment
or virtual Ethernet segment. As the number of multihomed Ethernet segments, virtual
Ethernet segments, and EVPN instances increases, so does the number of required fast
reroute labels.
</t>

<t> In comparison, the utilization of dedicated NFFRR to achieve loop-free fast
rerouting offers several advantages:
</t>

<t>1.	Resource Efficiency: By using a dedicated NFFRR label unaffected by label allocation
schemes or the number of multihomed CEs or VPNs,  the number of label consumption is minimized.
The NFFRR approach also reduces the need for additional routes and next-hop resources that would
be otherwise required to forward fast-rerouted data packets based on individual fast reroute label.
</t>

<t>2.	Control Plane Efficiency: The use of a dedicated NFFRR label improves efficiency
in the control plane. There's no need to signal individual fast reroute labels at the egress
and then process them at the ingress. Routers supporting NFFRR recognize that no further
routing is necessary based on the SPL label alone.
</t>

<t>3.	Uniform Approach:  The same NFFRR label and scheme can be used for the different 
VPN services,
such as L3VPN, EVPN, VPWS, etc., to achieve loop free egress link prorection. Furthermore,
the use of the same NFFRR label can be extended beyond MPLS-based
VPNs to other protocols offering bypass or fast reroute mechanisms in various network topologies,
ensuring a uniform approach to achieving loop-free fast rerouting.
</t>


<section anchor="nffrr-for-mpls-forwarding" title="NFFRR for MPLS forwarding">

<t>To illustrate, we’ll first take the example of <xref target="genfwd"/>, with MPLS
paths signaled using RSVP-TE.  This method can be used for paths that
use SPRING stacks, but this will be detailed in a later version.</t>

<figure title="Example Using RSVP-TE LSPs" anchor="rsvp-te"><artwork><![CDATA[
         N1 --- N2 --- N3 --- N4       LSP N1 to N4:  L1->L2->null
                |       |          Bypass for N2-N3:  L3->L4->null
                |       |          Bypass for N7-N3:  L5->L6->null
         N5 --- N6 --- N7 --- N8       LSP N5 to N8:  L7->L8->null
                |       |          Bypass1 for N6-N7: L9->L10->null
                |       |          Bypass2 for N6-N7: L11->L12->null
                N9 --- N10           (via N9-N10-N7)
]]></artwork></figure>

<texttable title="Forwarding from N1 to N4" anchor="tab1">
      <ttcol align='left'>Node</ttcol>
      <ttcol align='left'>Action</ttcol>
      <ttcol align='left'>Next</ttcol>
      <ttcol align='left'>New Pkt</ttcol>
      <ttcol align='left'>Comment</ttcol>
      <c>N1</c>
      <c>push L1</c>
      <c>N2</c>
      <c>[L1] pkt</c>
      <c>ingress</c>
      <c>N2</c>
      <c>L1 -&gt; L2</c>
      <c>N3</c>
      <c>[L2] pkt</c>
      <c>&#160;</c>
      <c>N3</c>
      <c>pop L2</c>
      <c>N4</c>
      <c>pkt</c>
      <c>PHP</c>
      <c>N4</c>
      <c>fwd pkt</c>
      <c>–</c>
      <c>–</c>
      <c>continue</c>
</texttable>

<t>Note 1: “[L1 …]” denotes the label stack on the packet; pkt is the
original packet received at ingress.  “L1 -&gt; L2” means swap label L1
with L2.  “pop L2” means pop the top label L2.  “fwd pkt” means forward
the packet as usual.</t>

<texttable title="Forwarding over the bypass for link N2-N3" anchor="tab2">
      <ttcol align='left'>Node</ttcol>
      <ttcol align='left'>Action</ttcol>
      <ttcol align='left'>Next</ttcol>
      <ttcol align='left'>New Pkt</ttcol>
      <ttcol align='left'>Comment</ttcol>
      <c>N2</c>
      <c>push L3</c>
      <c>N6</c>
      <c>[L3] pkt</c>
      <c>ingress</c>
      <c>N6</c>
      <c>L3 -&gt; L4</c>
      <c>N7</c>
      <c>[L4] pkt</c>
      <c>&#160;</c>
      <c>N7</c>
      <c>pop L4</c>
      <c>N3</c>
      <c>pkt</c>
      <c>PHP</c>
</texttable>

<texttable title="Forwarding over Bypass1 for link N7-N3" anchor="tab3">
      <ttcol align='left'>Node</ttcol>
      <ttcol align='left'>Action</ttcol>
      <ttcol align='left'>Next</ttcol>
      <ttcol align='left'>New Pkt</ttcol>
      <ttcol align='left'>Comment</ttcol>
      <c>N7</c>
      <c>push L5</c>
      <c>N6</c>
      <c>[L5] pkt</c>
      <c>ingress</c>
      <c>N6</c>
      <c>L5 -&gt; L6</c>
      <c>N2</c>
      <c>[L6] pkt</c>
      <c>&#160;</c>
      <c>N2</c>
      <c>pop L6</c>
      <c>N3</c>
      <c>pkt</c>
      <c>PHP</c>
</texttable>

<texttable title="Forwarding from N1 to N4 if link N2-N3 fails" anchor="tab4">
      <ttcol align='left'>Node</ttcol>
      <ttcol align='left'>Action</ttcol>
      <ttcol align='left'>Next</ttcol>
      <ttcol align='left'>New Pkt</ttcol>
      <ttcol align='left'>Comment</ttcol>
      <c>N1</c>
      <c>push L1</c>
      <c>N2</c>
      <c>[L1] pkt</c>
      <c>ingress</c>
      <c>N2</c>
      <c>L1 -&gt; L2</c>
      <c>N3</c>
      <c>[L2] pkt</c>
      <c>N3 X</c>
      <c>N2</c>
      <c>push L3</c>
      <c>N6</c>
      <c>[L3 L2] pkt</c>
      <c>PLR</c>
      <c>N6</c>
      <c>L3 -&gt; L4</c>
      <c>N7</c>
      <c>[L4 L2] pkt</c>
      <c>&#160;</c>
      <c>N7</c>
      <c>pop L4</c>
      <c>N3</c>
      <c>[L2] pkt</c>
      <c>merge</c>
      <c>N3</c>
      <c>pop L2</c>
      <c>N4</c>
      <c>pkt</c>
      <c>PHP</c>
      <c>N4</c>
      <c>fwd pkt</c>
      <c>–</c>
      <c>–</c>
      <c>continue</c>
</texttable>

<t><xref target="tab4"/> is obtained by composing <xref target="tab1"/> and <xref target="tab2"/>.</t>

<t>Note 2: “N3 X” means “next hop N3 unavailable (because link N2-N3
failed)”.</t>

<texttable title="Forwarding from N1 to N4 if links N2-N3 and N7-N3 fail" anchor="tab5">
      <ttcol align='left'>Node</ttcol>
      <ttcol align='left'>Action</ttcol>
      <ttcol align='left'>Next</ttcol>
      <ttcol align='left'>New Pkt</ttcol>
      <ttcol align='left'>Comment</ttcol>
      <c>N1</c>
      <c>push L1</c>
      <c>N2</c>
      <c>[L1] pkt</c>
      <c>ingress</c>
      <c>N2</c>
      <c>L1 -&gt; L2</c>
      <c>N3</c>
      <c>[L2] pkt</c>
      <c>N3 X</c>
      <c>N2</c>
      <c>push L3</c>
      <c>N6</c>
      <c>[L3 L2] pkt</c>
      <c>PLR</c>
      <c>N6</c>
      <c>L3 -&gt; L4</c>
      <c>N7</c>
      <c>[L4 L2] pkt</c>
      <c>&#160;</c>
      <c>N7</c>
      <c>pop L4</c>
      <c>N3</c>
      <c>[L2] pkt</c>
      <c>N3 X’</c>
      <c>N7</c>
      <c>push L5</c>
      <c>N6</c>
      <c>[L5 L2] pkt</c>
      <c>&#160;</c>
      <c>N6</c>
      <c>L5 -&gt; L6</c>
      <c>N2</c>
      <c>[L6 L2] pkt</c>
      <c>PLR</c>
      <c>N2</c>
      <c>pop L6</c>
      <c>N3</c>
      <c>[L2] pkt</c>
      <c>N3 X</c>
      <c>N2</c>
      <c>push L3</c>
      <c>N6</c>
      <c>[L3 L2]</c>
      <c>PLR</c>
      <c>etc</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>loop!</c>
</texttable>

<t><xref target="tab5"/> is obtained by composing <xref target="tab1"/>, <xref target="tab2"/> and <xref target="tab3"/>.</t>

<t>Note 3: “N3 X’” means “next hop N3 unavailable because link N7-N3 is down.</t>

<t>Note 4: While the impact of a loop is pretty bad, the impact of an
ever-growing label stack (not illustrated here) and possible
associated fragmentation on transit nodes may be worse.</t>

</section>
<section anchor="proposal" title="Proposal">

<t>An LSR (typically a PLR) that wishes to prevent further FRRs after the
first one can push an SPL, namely NFFRR, onto the label stack as follows:</t>

<texttable title="Forwarding from N1 to N4 if link N2-N3 fails with NFFRR" anchor="tab6">
      <ttcol align='left'>Node</ttcol>
      <ttcol align='left'>Action</ttcol>
      <ttcol align='left'>Next</ttcol>
      <ttcol align='left'>New Pkt</ttcol>
      <ttcol align='left'>Comment</ttcol>
      <c>N1</c>
      <c>push L1</c>
      <c>N2</c>
      <c>[L1] pkt</c>
      <c>ingress</c>
      <c>N2</c>
      <c>L1 -&gt; L2</c>
      <c>N3</c>
      <c>[L2] pkt</c>
      <c>N3 X</c>
      <c>N2</c>
      <c>push L3, NFFRR</c>
      <c>N6</c>
      <c>[L3 NFFRR L2] pkt</c>
      <c>PLR</c>
      <c>N6</c>
      <c>L3 -&gt; L4</c>
      <c>N7</c>
      <c>[L4 NFFRR L2] pkt</c>
      <c>&#160;</c>
      <c>N7</c>
      <c>pop L4, NFFRR</c>
      <c>N3</c>
      <c>[L2] pkt</c>
      <c>merge</c>
      <c>N3</c>
      <c>pop L2</c>
      <c>N4</c>
      <c>pkt</c>
      <c>PHP</c>
      <c>N4</c>
      <c>fwd pkt</c>
      <c>–</c>
      <c>–</c>
      <c>continue</c>
</texttable>

<t>Note 5: N2 can insert an NFFRR label only if it knows that all LSRs in
the path can process it correctly.  See <xref target="cap"/> for some details on
how this capability is communicated.</t>

<texttable title="Forwarding from N1 to N4 if links N2-N3 and N7-N3 fail
with NFFRR" anchor="tab7">
      <ttcol align='left'>Node</ttcol>
      <ttcol align='left'>Action</ttcol>
      <ttcol align='left'>Next</ttcol>
      <ttcol align='left'>New Pkt</ttcol>
      <ttcol align='left'>Comment</ttcol>
      <c>N1</c>
      <c>push L1</c>
      <c>N2</c>
      <c>[L1] pkt</c>
      <c>ingress</c>
      <c>N2</c>
      <c>L1 -&gt; L2</c>
      <c>N3</c>
      <c>[L2] pkt</c>
      <c>N3 X</c>
      <c>N2</c>
      <c>push L3, NFFRR</c>
      <c>N6</c>
      <c>[L3 NFFRR L2] pkt</c>
      <c>PLR</c>
      <c>N6</c>
      <c>L3 -&gt; L4</c>
      <c>N7</c>
      <c>[L4 NFFRR L2] pkt</c>
      <c>&#160;</c>
      <c>N7</c>
      <c>pop L4</c>
      <c>N3</c>
      <c>[NFFRR L2] pkt</c>
      <c>N3 X</c>
      <c>N7</c>
      <c>check NFFRR</c>
      <c>–</c>
      <c>–</c>
      <c>drop pkt</c>
</texttable>

<t>Note 6: “check NFFRR” means that, before N7 applies FRR (because link
N7-N3 is down), N7 checks the label below the top label (or in this
case, because of PHP, the top label itself).  If this is the NFFRR
label, N7 drops the packet rather than apply FRR.</t>

<section anchor="spring" title="NFFRR and SPRING">

<t>Suppose that, to protect link N2-N3, a bypass tunnel N2-N6-N7-N3 were
instantiated using SPRING MPLS <xref target="RFC8660"/>, in particular, using
adjacency SIDs.  If the corresponding labels for links N6-N7 and N7-N3
were L20 and L21, the bypass would consist of pushing the label stack
[L20 L21] onto the packet and sending the packet to N6.  To indicate
that FRR has already occurred and to drop the packet rather than to
try to protect the packet again, N2 would have to push [L20 NFFRR L21
NFFRR] onto the packet before sending it to N6.  If the packet came
from N1 with label L1, N2 would send a packet with label stack [L20
NFFRR L21 NFFRR L2] to N6.</t>

<t>N6 would see L20, pop it, note the NFFRR label and pop it, then
attempt to send the packet to N7.  If the link N6-N7 is down, N6 drops
the packet.  Otherwise, N7 gets the packet, sees L21, pops it, sees
NFFRR, pops it and tries to send the packet to N3.  If link N7-N3 is
down, N7 drops the packet.  Otherwise, N3 gets the packet with L2,
swaps with with L3 and sends it to N4.</t>

<t>Note that with SPRING MPLS, the NFFRR label needs to be repeated for
each label in the bypass stack.  Hence the request for a “regular”
SPL rather than an extended SPL.</t>

</section>
</section>
<section anchor="nffrr-for-mpls-services" title="NFFRR for MPLS Services">

<t>First, we illustrate known unicast EVPN forwarding:</t>

<texttable>
      <ttcol align='left'>Node</ttcol>
      <ttcol align='left'>Action</ttcol>
      <ttcol align='left'>Next</ttcol>
      <ttcol align='left'>Packet</ttcol>
      <ttcol align='left'>Comment</ttcol>
      <c>PE1</c>
      <c>send to CE2</c>
      <c>PE2</c>
      <c>[T1 S2] pkt</c>
      <c>EVPN</c>
      <c>PE2</c>
      <c>send to CE2</c>
      <c>link1</c>
      <c>pkt</c>
      <c>done!</c>
</texttable>

<t>Note: T1/T2/T3 are the transport labels for PE1/PE3/PE2 to reach
PE2/PE2/PE3 respectively.  S2/S3 are the service labels announced by
PE2/PE3 for CE2.</t>

<t>Then, we show what happens when CE2 is down without NFFRR:</t>

<texttable>
      <ttcol align='left'>Node</ttcol>
      <ttcol align='left'>Action</ttcol>
      <ttcol align='left'>Next</ttcol>
      <ttcol align='left'>Packet</ttcol>
      <ttcol align='left'>Comment</ttcol>
      <c>PE1</c>
      <c>send to CE2</c>
      <c>PE2</c>
      <c>[T1 S2] pkt</c>
      <c>EVPN</c>
      <c>PE2</c>
      <c>send to CE2</c>
      <c>link1</c>
      <c>—</c>
      <c>link1 X</c>
      <c>PE2</c>
      <c>send to CE2</c>
      <c>PE3</c>
      <c>[T3 S3] pkt</c>
      <c>eFRR</c>
      <c>PE3</c>
      <c>send to CE2</c>
      <c>link2</c>
      <c>—</c>
      <c>link2 X</c>
      <c>PE3</c>
      <c>send to CE2</c>
      <c>PE2</c>
      <c>[T2 S2] pkt</c>
      <c>eFRR</c>
      <c>PE2</c>
      <c>send to CE2</c>
      <c>link1</c>
      <c>—</c>
      <c>link1 X</c>
      <c>PE2</c>
      <c>send to CE2</c>
      <c>PE3</c>
      <c>[T3 S3] pkt</c>
      <c>eFRR</c>
      <c>…</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>loop!</c>
</texttable>

<t>Note: link1/link2 X means link1/link2 is down.  eFRR refers to EVPN
multihoming FRR.</t>

<t>In the case of MPLS services such as EVPN <xref target="evpn"/>, the NFFRR label
is inserted below the service label, as shown below:</t>

<texttable>
      <ttcol align='left'>Node</ttcol>
      <ttcol align='left'>Action</ttcol>
      <ttcol align='left'>Next</ttcol>
      <ttcol align='left'>Packet</ttcol>
      <ttcol align='left'>Comment</ttcol>
      <c>PE1</c>
      <c>send to CE2</c>
      <c>PE2</c>
      <c>[T1 S2] pkt</c>
      <c>EVPN</c>
      <c>PE2</c>
      <c>send to CE2</c>
      <c>link1</c>
      <c>—</c>
      <c>link1 X</c>
      <c>PE2</c>
      <c>send to CE2</c>
      <c>PE3</c>
      <c>[T3 S2 NFFRR] pkt</c>
      <c>eFRR</c>
      <c>PE3</c>
      <c>send to CE2</c>
      <c>link2</c>
      <c>—</c>
      <c>link2 X</c>
      <c>PE3</c>
      <c>drop pkt</c>
      <c>—</c>
      <c>—</c>
      <c>check NFFRR</c>
</texttable>

<t>Note: “check NFFRR” is as above.</t>

</section>
<section anchor="nffrr-for-rmr" title="NFFRR for RMR">

<t>As described in <xref target="rmr"/>, packets will loop until TTL expires if the
destination node in an RMR ring (here, R4) fails.  The solution in
this case is that the first node to apply RMR protection (R3) pops the
current RMR transport label being used, sees that the next label is
not NFFRR (so protection is allowed), pushes an NFFRR label and then
the RMR transport label for the reverse direction.</t>

<t>When R5 receives the packet, it sees that the next link is down, pops
the RMR transport label, sees the NFFRR label and drops the packet.
Thus, the loop is avoided.</t>

</section>
</section>
<section anchor="cap" title="Signaling NFFRR Capability">

<section anchor="signaling-nffrr-capability-for-mpls-services-with-bgp" title="Signaling NFFRR Capability for MPLS Services with BGP">

<t>The ideal choice would be an attribute consisting of a bit vector of
node capabilities, one bit of which would be the capability of
processing the NFFRR SPL below the BGP service label.  This would be
used by BGP L2VPN, BGP VPLS, EVPN, E-Tree and E-VPWS.  An alternative
is to use the BGP Capabilities Optional Parameter
<xref target="I-D.ietf-idr-next-hop-capability"/>.  Details to be worked out.</t>

</section>
<section anchor="signaling-nffrr-capability-for-mpls-services-with-targeted-ldp" title="Signaling NFFRR Capability for MPLS Services with Targeted LDP">

<t>One approach to signaling NFFRR capability for MPLS services signaled
with targeted LDP is to introduce a new LDP TLV called the NFFRR
Capability TLV as an Optional Parameter in the Label Mapping Message
<xref target="RFC5036"/>.  This TLV has Type TBD (suggested: 0x0207) and Length 0.</t>

<t>Another approach is to use LDP Capabilities <xref target="RFC5561"/>; this
approach has the advantage that it deals with capabilities on a node
basis rather than on a per label mapping basis.  However, there don’t
appear to be other documents using this approach.</t>

</section>
<section anchor="signaling-nffrr-capability-for-mpls-forwarding" title="Signaling NFFRR Capability for MPLS Forwarding">

<t>The authors suggest signaling a router’s ability to process the NFFRR
SPL using the Link State Router TE Node Capabilities <xref target="RFC5073"/>,
which works for both IS-IS and OSPF.  A new TE Node Capability bit,
the N bit (suggested value 5) indicates that the advertising node is
capable of processing the NFFRR SPL.</t>

</section>
</section>
<section anchor="iana-considerations" title="IANA Considerations">

<t>If this draft is deemed useful, a way to signal that No Further
Fast-route should be performed on a packet will be needed.  There
are two approaches: allocate an SPL for NFFRR: if so, we suggest
the early allocation of label 8 for this. Alternatively, if
<xref target="I-D.kompella-mpls-mspl4fa"/> (or similar) is adopted, allocate a
forwarding action bit saying whether or not to do FRR.</t>

<t>Furthermore, means of signaling the ability to process the NFFRR SPL/bit
should be defined for IS-IS, OSPF, LDP and BGP.</t>

<t>The following update is suggested for the Link State Router TE Node
Capabilities registry:</t>

<texttable>
      <ttcol align='right'>Bit</ttcol>
      <ttcol align='left'>Name</ttcol>
      <ttcol align='left'>Reference</ttcol>
      <c>5</c>
      <c>NFFRR</c>
      <c>This document</c>
</texttable>

<t>The following update is suggested for the TLV Type Name Space of the
Label Distribution Protocol (LDP) Parameters registry:</t>

<texttable>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Name</ttcol>
      <ttcol align='left'>Reference</ttcol>
      <c>0x0207</c>
      <c>NFFRR</c>
      <c>This document</c>
</texttable>

</section>
<section anchor="security-considerations" title="Security Considerations">

<t>A malicious or compromised LSR can insert NFFRR into a label stack,
preventing FRR from occurring.  If so, protection will not kick in for
failures that could have been protected, and there will be unnecessary
packet loss.</t>

<!--
Local Variables:
mode: markdown
coding: utf-8-unix
compile-command: (string-join (list "kdrfc" (buffer-file-name)) " ")
End:
-->

</section>


  </middle>

  <back>

    <references title='Normative References'>

&RFC2119;
&RFC8174;
&RFC7274;
&RFC5036;
&RFC5073;
&I-D.kompella-mpls-mspl4fa;


    </references>

    <references title='Informative References'>

<reference anchor="ALDT" target="https://atlas.informatik.uni-tuebingen.de/~menth/papers/Menth18g.pdf">
  <front>
    <title>Efficient Data Plane Protection for SDN</title>
    <author initials="D." surname="Merling">
      <organization></organization>
    </author>
    <author initials="W." surname="Braun">
      <organization></organization>
    </author>
    <author initials="M." surname="Menth">
      <organization></organization>
    </author>
    <date year="2018" month="June"/>
  </front>
</reference>
&RFC4090;
&RFC5286;
&RFC7490;
&RFC7432;
&RFC8317;
&RFC8214;
&RFC4364;
&RFC4761;
&RFC4762;
&I-D.ietf-mpls-rmr;
&RFC3209;
&RFC8660;
&I-D.ietf-idr-next-hop-capability;
&RFC5561;


    </references>



  </back>
</rfc>

