<?xml version='1.0' encoding='utf-8'?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" version="3" ipr="trust200902" docName="draft-ietf-roll-rnfd-07" number="9866" consensus="true" category="std" obsoletes="" updates="" submissionType="IETF" xml:lang="en" tocInclude="true" sortRefs="true" symRefs="true" prepTime="2025-10-07T16:36:17" indexInclude="true" scripts="Common,Latin" tocDepth="3">
  <link href="https://datatracker.ietf.org/doc/draft-ietf-roll-rnfd-07" rel="prev"/>
  <link href="https://dx.doi.org/10.17487/rfc9866" rel="alternate"/>
  <link href="urn:issn:2070-1721" rel="alternate"/>
  <front>
    <title abbrev="RNFD">Root Node Failure Detector (RNFD): Fast Detection of Border Router Crashes in the Routing Protocol for Low-Power and Lossy Networks (RPL)</title>
    <seriesInfo name="RFC" value="9866" stream="IETF"/>
    <author initials="K." surname="Iwanicki" fullname="Konrad Iwanicki">
      <organization showOnFrontPage="true">University of Warsaw</organization>
      <address>
        <postal>
          <street>Banacha 2</street>
          <city>Warszawa</city>
          <code>02-097</code>
          <country>Poland</country>
        </postal>
        <phone>+48 22 55 44 428</phone>
        <email>iwanicki@mimuw.edu.pl</email>
      </address>
    </author>
    <date month="10" year="2025"/>
    <area>RTG</area>
    <workgroup>roll</workgroup>
    <abstract pn="section-abstract">
      <t indent="0" pn="section-abstract-1">By and large, correct operation of a network running the Routing
      Protocol for Low-Power and Lossy Networks (RPL) requires border routers to be
      up.  In many applications, it is beneficial for the nodes to detect a
      failure of a border router as soon as possible to trigger fallback
      actions.  This document specifies the Root Node Failure Detector (RNFD),
      an extension to RPL that expedites detection of border router crashes by
      having nodes collaboratively monitor the status of a given border
      router.  The extension introduces an additional state at each node, a
      new type of RPL Control Message Option for synchronizing this state
      among different nodes, and the coordination algorithm itself.</t>
    </abstract>
    <boilerplate>
      <section anchor="status-of-memo" numbered="false" removeInRFC="false" toc="exclude" pn="section-boilerplate.1">
        <name slugifiedName="name-status-of-this-memo">Status of This Memo</name>
        <t indent="0" pn="section-boilerplate.1-1">
            This is an Internet Standards Track document.
        </t>
        <t indent="0" pn="section-boilerplate.1-2">
            This document is a product of the Internet Engineering Task Force
            (IETF).  It represents the consensus of the IETF community.  It has
            received public review and has been approved for publication by
            the Internet Engineering Steering Group (IESG).  Further
            information on Internet Standards is available in Section 2 of 
            RFC 7841.
        </t>
        <t indent="0" pn="section-boilerplate.1-3">
            Information about the current status of this document, any
            errata, and how to provide feedback on it may be obtained at
            <eref target="https://www.rfc-editor.org/info/rfc9866" brackets="none"/>.
        </t>
      </section>
      <section anchor="copyright" numbered="false" removeInRFC="false" toc="exclude" pn="section-boilerplate.2">
        <name slugifiedName="name-copyright-notice">Copyright Notice</name>
        <t indent="0" pn="section-boilerplate.2-1">
            Copyright (c) 2025 IETF Trust and the persons identified as the
            document authors. All rights reserved.
        </t>
        <t indent="0" pn="section-boilerplate.2-2">
            This document is subject to BCP 78 and the IETF Trust's Legal
            Provisions Relating to IETF Documents
            (<eref target="https://trustee.ietf.org/license-info" brackets="none"/>) in effect on the date of
            publication of this document. Please review these documents
            carefully, as they describe your rights and restrictions with
            respect to this document. Code Components extracted from this
            document must include Revised BSD License text as described in
            Section 4.e of the Trust Legal Provisions and are provided without
            warranty as described in the Revised BSD License.
        </t>
      </section>
    </boilerplate>
    <toc>
      <section anchor="toc" numbered="false" removeInRFC="false" toc="exclude" pn="section-toc.1">
        <name slugifiedName="name-table-of-contents">Table of Contents</name>
        <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1">
          <li pn="section-toc.1-1.1">
            <t indent="0" pn="section-toc.1-1.1.1"><xref derivedContent="1" format="counter" sectionFormat="of" target="section-1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-introduction">Introduction</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.1.2">
              <li pn="section-toc.1-1.1.2.1">
                <t indent="0" keepWithNext="true" pn="section-toc.1-1.1.2.1.1"><xref derivedContent="1.1" format="counter" sectionFormat="of" target="section-1.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-effects-of-lbr-crashes">Effects of LBR Crashes</xref></t>
              </li>
              <li pn="section-toc.1-1.1.2.2">
                <t indent="0" keepWithNext="true" pn="section-toc.1-1.1.2.2.1"><xref derivedContent="1.2" format="counter" sectionFormat="of" target="section-1.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-design-principles">Design Principles</xref></t>
              </li>
              <li pn="section-toc.1-1.1.2.3">
                <t indent="0" keepWithNext="true" pn="section-toc.1-1.1.2.3.1"><xref derivedContent="1.3" format="counter" sectionFormat="of" target="section-1.3"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-other-solutions">Other Solutions</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.2">
            <t indent="0" pn="section-toc.1-1.2.1"><xref derivedContent="2" format="counter" sectionFormat="of" target="section-2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-terminology">Terminology</xref></t>
          </li>
          <li pn="section-toc.1-1.3">
            <t indent="0" pn="section-toc.1-1.3.1"><xref derivedContent="3" format="counter" sectionFormat="of" target="section-3"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-overview">Overview</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.3.2">
              <li pn="section-toc.1-1.3.2.1">
                <t indent="0" pn="section-toc.1-1.3.2.1.1"><xref derivedContent="3.1" format="counter" sectionFormat="of" target="section-3.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-protocol-state-machine">Protocol State Machine</xref></t>
              </li>
              <li pn="section-toc.1-1.3.2.2">
                <t indent="0" pn="section-toc.1-1.3.2.2.1"><xref derivedContent="3.2" format="counter" sectionFormat="of" target="section-3.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-counters-and-communication">Counters and Communication</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.4">
            <t indent="0" pn="section-toc.1-1.4.1"><xref derivedContent="4" format="counter" sectionFormat="of" target="section-4"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-the-rnfd-option">The RNFD Option</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.4.2">
              <li pn="section-toc.1-1.4.2.1">
                <t indent="0" pn="section-toc.1-1.4.2.1.1"><xref derivedContent="4.1" format="counter" sectionFormat="of" target="section-4.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-general-cfrc-requirements">General CFRC Requirements</xref></t>
              </li>
              <li pn="section-toc.1-1.4.2.2">
                <t indent="0" pn="section-toc.1-1.4.2.2.1"><xref derivedContent="4.2" format="counter" sectionFormat="of" target="section-4.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-format-of-the-option">Format of the Option</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.5">
            <t indent="0" pn="section-toc.1-1.5.1"><xref derivedContent="5" format="counter" sectionFormat="of" target="section-5"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-rpl-router-behavior">RPL Router Behavior</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.5.2">
              <li pn="section-toc.1-1.5.2.1">
                <t indent="0" pn="section-toc.1-1.5.2.1.1"><xref derivedContent="5.1" format="counter" sectionFormat="of" target="section-5.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-joining-a-dodag-version-and">Joining a DODAG Version and Changing the RNFD Role</xref></t>
              </li>
              <li pn="section-toc.1-1.5.2.2">
                <t indent="0" pn="section-toc.1-1.5.2.2.1"><xref derivedContent="5.2" format="counter" sectionFormat="of" target="section-5.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-detecting-and-verifying-pro">Detecting and Verifying Problems with the DODAG Root</xref></t>
              </li>
              <li pn="section-toc.1-1.5.2.3">
                <t indent="0" pn="section-toc.1-1.5.2.3.1"><xref derivedContent="5.3" format="counter" sectionFormat="of" target="section-5.3"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-disseminating-observations-">Disseminating Observations and Reaching Agreement</xref></t>
              </li>
              <li pn="section-toc.1-1.5.2.4">
                <t indent="0" pn="section-toc.1-1.5.2.4.1"><xref derivedContent="5.4" format="counter" sectionFormat="of" target="section-5.4"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-dodag-roots-behavior">DODAG Root's Behavior</xref></t>
              </li>
              <li pn="section-toc.1-1.5.2.5">
                <t indent="0" pn="section-toc.1-1.5.2.5.1"><xref derivedContent="5.5" format="counter" sectionFormat="of" target="section-5.5"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-activating-and-deactivating">Activating and Deactivating the Protocol on Demand</xref></t>
              </li>
              <li pn="section-toc.1-1.5.2.6">
                <t indent="0" pn="section-toc.1-1.5.2.6.1"><xref derivedContent="5.6" format="counter" sectionFormat="of" target="section-5.6"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-processing-cfrcs-of-incompa">Processing CFRCs of Incompatible Lengths</xref></t>
              </li>
              <li pn="section-toc.1-1.5.2.7">
                <t indent="0" pn="section-toc.1-1.5.2.7.1"><xref derivedContent="5.7" format="counter" sectionFormat="of" target="section-5.7"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-summary-of-rnfds-interactio">Summary of RNFD's Interactions with RPL</xref></t>
              </li>
              <li pn="section-toc.1-1.5.2.8">
                <t indent="0" pn="section-toc.1-1.5.2.8.1"><xref derivedContent="5.8" format="counter" sectionFormat="of" target="section-5.8"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-summary-of-rnfds-constants">Summary of RNFD's Constants</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.6">
            <t indent="0" pn="section-toc.1-1.6.1"><xref derivedContent="6" format="counter" sectionFormat="of" target="section-6"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-manageability-consideration">Manageability Considerations</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.6.2">
              <li pn="section-toc.1-1.6.2.1">
                <t indent="0" pn="section-toc.1-1.6.2.1.1"><xref derivedContent="6.1" format="counter" sectionFormat="of" target="section-6.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-role-assignment-and-cfrc-si">Role Assignment and CFRC Size Adjustment</xref></t>
              </li>
              <li pn="section-toc.1-1.6.2.2">
                <t indent="0" pn="section-toc.1-1.6.2.2.1"><xref derivedContent="6.2" format="counter" sectionFormat="of" target="section-6.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-virtual-dodag-roots">Virtual DODAG Roots</xref></t>
              </li>
              <li pn="section-toc.1-1.6.2.3">
                <t indent="0" pn="section-toc.1-1.6.2.3.1"><xref derivedContent="6.3" format="counter" sectionFormat="of" target="section-6.3"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-monitoring">Monitoring</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.7">
            <t indent="0" pn="section-toc.1-1.7.1"><xref derivedContent="7" format="counter" sectionFormat="of" target="section-7"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-security-considerations">Security Considerations</xref></t>
          </li>
          <li pn="section-toc.1-1.8">
            <t indent="0" pn="section-toc.1-1.8.1"><xref derivedContent="8" format="counter" sectionFormat="of" target="section-8"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-iana-considerations">IANA Considerations</xref></t>
          </li>
          <li pn="section-toc.1-1.9">
            <t indent="0" pn="section-toc.1-1.9.1"><xref derivedContent="9" format="counter" sectionFormat="of" target="section-9"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-references">References</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.9.2">
              <li pn="section-toc.1-1.9.2.1">
                <t indent="0" pn="section-toc.1-1.9.2.1.1"><xref derivedContent="9.1" format="counter" sectionFormat="of" target="section-9.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-normative-references">Normative References</xref></t>
              </li>
              <li pn="section-toc.1-1.9.2.2">
                <t indent="0" pn="section-toc.1-1.9.2.2.1"><xref derivedContent="9.2" format="counter" sectionFormat="of" target="section-9.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-informative-references">Informative References</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.10">
            <t indent="0" pn="section-toc.1-1.10.1"><xref derivedContent="" format="none" sectionFormat="of" target="section-appendix.a"/><xref derivedContent="" format="title" sectionFormat="of" target="name-acknowledgements">Acknowledgements</xref></t>
          </li>
          <li pn="section-toc.1-1.11">
            <t indent="0" pn="section-toc.1-1.11.1"><xref derivedContent="" format="none" sectionFormat="of" target="section-appendix.b"/><xref derivedContent="" format="title" sectionFormat="of" target="name-authors-address">Author's Address</xref></t>
          </li>
        </ul>
      </section>
    </toc>
  </front>
  <middle>
    <section anchor="intro" numbered="true" toc="include" removeInRFC="false" pn="section-1">
      <name slugifiedName="name-introduction">Introduction</name>
      <t indent="0" pn="section-1-1">RPL is an IPv6 routing protocol for Low-Power and Lossy Networks
      (LLNs) <xref target="RFC6550" format="default" sectionFormat="of" derivedContent="RFC6550"/>.  Such networks are
      usually constrained in device energy and channel capacity.  They are
      formed largely of nodes that offer little processing power and memory,
      and links that are of variable qualities and support low data rates.
      Therefore, a significant challenge that a routing protocol for LLNs has
      to address is minimizing resource consumption without sacrificing
      reaction time to network changes.</t>
      <t indent="0" pn="section-1-2">One of the main design principles adopted in RPL to minimize node
      resource consumption is delegating much of the responsibility for
      routing to LLN Border Routers (LBRs).  A network is organized into
      Destination-Oriented Directed Acyclic Graphs (DODAGs), each
      corresponding to an LBR and having all its paths terminate at the LBR.
      To this end, every node is dynamically assigned a Rank representing its
      distance to a given LBR, measured in some metric, with the LBR having
      the minimal Rank, which reflects its role as the DODAG root.  The Ranks
      allow each non-LBR node to select from among its neighbors (i.e., nodes
      to which the node has links) those that are closer to the LBR than the
      node itself (i.e., the node's parents in the graph).  The resulting DODAG
      paths, consisting of the node-parent links, are utilized for routing
      packets upward to the LBR and outside the LLN.  They are also used by
      nodes to periodically report their connectivity upward to the LBR, which
      allows for directing packets downward from the LBR to these
      nodes (e.g., by means of source routing <xref target="RFC6554" format="default" sectionFormat="of" derivedContent="RFC6554"/>).  All in all, not only do LBRs
      participate in routing, but they also drive the process of DODAG construction
      and maintenance underlying the protocol.</t>
      <t indent="0" pn="section-1-3">To play this central role, LBRs are expected to be more capable than
      regular LLN nodes.  They are assumed not to be constrained in computing
      power, memory, and energy, which often entails a more involved
      hardware-software architecture and tethered power supply.  However, this
      also makes them prone to failures, especially since
      it is often difficult to ensure a backup power supply for every LBR in large deployments.</t>
      <section anchor="effects-of-lbr-crashes" numbered="true" toc="include" removeInRFC="false" pn="section-1.1">
        <name slugifiedName="name-effects-of-lbr-crashes">Effects of LBR Crashes</name>
        <t indent="0" pn="section-1.1-1">When an LBR crashes, or more generally, fails in a way that
        prevents other nodes in its DODAG from communicating with it, the
        nodes also lose the ability to communicate with other Internet hosts.
        In addition, a significant fraction of DODAG paths interconnecting the
        nodes become invalid, as they pass through the dead LBR.  The others
        also degenerate as a result of DODAG repair attempts, which are bound
        to fail.  In effect, routing inside the DODAG also becomes largely
        impossible.  Consequently, it is desirable that an LBR crash be
        detected by the nodes fast, so that they can leave the broken DODAG
        and join another one or trigger additional application- or
        deployment-dependent fallback mechanisms, thereby minimizing the
        negative impact of the disconnection.</t>
        <t indent="0" pn="section-1.1-2">Since all DODAG paths lead to the corresponding LBR, detecting its
        crash by a node entails dropping all parents and adopting an infinite
        Rank, which reflects the node's inability to reach the dead LBR.
        Depending on the deployment settings, the node can then remain in such
        a state, join a different DODAG, or even become the root of a
        floating DODAG.  In any case, however, achieving this state for all
        nodes is slow, can generate heavy traffic, and is difficult to
        implement correctly <xref target="Iwanicki16" format="default" sectionFormat="of" derivedContent="Iwanicki16"/> <xref target="Paszkowska19" format="default" sectionFormat="of" derivedContent="Paszkowska19"/> <xref target="Ciolkosz19" format="default" sectionFormat="of" derivedContent="Ciolkosz19"/>.</t>
        <t indent="0" pn="section-1.1-3">To start with, tearing down all DODAG paths requires each of the
        dead LBR's neighbors to detect that its link with the LBR is no longer
        up.  Otherwise, any of the neighbors unaware of this fact can keep
        advertising a finite Rank and can thus be other nodes' parent or
        ancestor in the DODAG; such nodes will incorrectly believe they have a
        valid path to the dead LBR. 
Detecting a crash of a link by a node normally happens when the node has observed a sufficient number of forwarding failures over the link.
	Therefore, considering the
        low-data-rate applications of LLNs, the period from the crash to the
        moment of eliminating the last link to the dead LBR from the DODAG may
        be long.  Subsequently, learning by all nodes that none of their links
        can form any path leading to the dead LBR also adds latency, partly
        due to parent changes that the nodes independently perform in attempts
        to repair their broken paths locally.  Since a non-LBR node has only
        local knowledge of the network, potentially inconsistent with that of
        other nodes, such parent changes often produce paths containing loops,
        which have to be broken before all nodes can conclude that no path to
        the dead LBR exists globally.  Even with RPL's dedicated loop
        detection mechanisms <xref target="RFC6553" format="default" sectionFormat="of" derivedContent="RFC6553"/>, this
        also requires traffic and hence time.  Finally, switching a parent or
        discovering a loop can also generate cascaded bursts of control
        traffic, owing to the adaptive Trickle algorithm for exchanging DODAG
        information <xref target="RFC6206" format="default" sectionFormat="of" derivedContent="RFC6206"/>.  Overall, the
        behavior of the network when handling an LBR crash is highly
        suboptimal, thereby not being in line with RPL's goals of minimizing
        resource consumption and reaction latencies.</t>
      </section>
      <section anchor="design-principles" numbered="true" toc="include" removeInRFC="false" pn="section-1.2">
        <name slugifiedName="name-design-principles">Design Principles</name>
        <t indent="0" pn="section-1.2-1">To address this issue, this document proposes an extension to RPL,
        dubbed the "Root Node Failure Detector (RNFD)".  To minimize the time
        and traffic required to handle an LBR crash, the RNFD algorithm adopts
        the following design principles, derived directly from the previous
        observations:</t>
        <ol spacing="normal" type="1" indent="adaptive" start="1" pn="section-1.2-2"><li pn="section-1.2-2.1" derivedCounter="1.">
            <t indent="0" pn="section-1.2-2.1.1">Explicitly coordinating LBR monitoring between nodes instead of
            relying only on the emergent behavior resulting from their
            independent operation.</t>
          </li>
          <li pn="section-1.2-2.2" derivedCounter="2.">
            <t indent="0" pn="section-1.2-2.2.1">Avoiding probing all links to the dead LBR so as to reduce the
            tail latency when eliminating these links from the DODAG.</t>
          </li>
          <li pn="section-1.2-2.3" derivedCounter="3.">
            <t indent="0" pn="section-1.2-2.3.1">Exploiting concurrency by prompting proactive checking for a
            possible LBR crash when some nodes suspect such a failure may have
            taken place, which aims to further reduce the overall latency.</t>
          </li>
          <li pn="section-1.2-2.4" derivedCounter="4.">
            <t indent="0" pn="section-1.2-2.4.1">Minimizing changes to RPL's existing algorithms by operating in
            parallel and largely independently (in the background) and by
            introducing few additional assumptions.</t>
          </li>
        </ol>
        <t indent="0" pn="section-1.2-3">While these principles do improve RPL's performance under a wide
        range of LBR crashes, their probabilistic nature precludes hard
        guarantees for all possible corner cases.  In particular, in some
        scenarios, RNFD's operation may result in false negatives, but these
        situations are peculiar and will eventually be handled by RPL's own
        aforementioned mechanisms.  Likewise, in some scenarios, notably
        involving highly unstable links, false positives may occur, but they
        can be alleviated as well.  In any case, the principles also guarantee
        that RNFD can be deactivated at any time if needed, in which case
        RPL's operation is unaffected.</t>
      </section>
      <section anchor="other-solutions" numbered="true" toc="include" removeInRFC="false" pn="section-1.3">
        <name slugifiedName="name-other-solutions">Other Solutions</name>
        <t indent="0" pn="section-1.3-1">Given the consequences of LBR failures, it is also
        worth considering other solutions to the problem.  More specifically,
        power outages can be alleviated by provisioning redundant power
        sources or emergency batteries.  Likewise, RPL's so-called virtual
        DODAG roots can help tolerate some failures of individual LBRs.</t>
        <t indent="0" pn="section-1.3-2">As mentioned previously, RNFD has been designed to be largely
        independent of those solutions; that is, rather than aiming to be
        their replacement, RNFD can complement them.  In particular, the
        operation of RNFD with different variants of virtual DODAG roots is
        covered in <xref target="mgmnt_virt_dodag_roots" format="default" sectionFormat="of" derivedContent="Section 6.2"/>.</t>
      </section>
    </section>
    <section anchor="terms" numbered="true" toc="include" removeInRFC="false" pn="section-2">
      <name slugifiedName="name-terminology">Terminology</name>
      <t indent="0" pn="section-2-1">
    The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>",
    "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL NOT</bcp14>",
    "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>",
    "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
    "<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be
    interpreted as described in BCP 14 <xref target="RFC2119" format="default" sectionFormat="of" derivedContent="RFC2119"/> <xref target="RFC8174" format="default" sectionFormat="of" derivedContent="RFC8174"/> when, and only when, they appear in all capitals, as
    shown here.
      </t>
      <t indent="0" pn="section-2-2">The terminology used in this document is consistent with and
	incorporates that described in "Terms Used in Routing for Low-Power
	and Lossy Networks" <xref target="RFC7102" format="default" sectionFormat="of" derivedContent="RFC7102"/>, "RPL:
	IPv6 Routing Protocol for Low-Power and Lossy Networks" <xref target="RFC6550" format="default" sectionFormat="of" derivedContent="RFC6550"/>, and "The Routing Protocol for
	Low-Power and Lossy Networks (RPL) Option for Carrying RPL Information
	in Data-Plane Datagrams" <xref target="RFC6553" format="default" sectionFormat="of" derivedContent="RFC6553"/>.
	Other terms used in LLNs can be found in "Terminology for
	Constrained-Node Networks" <xref target="RFC7228" format="default" sectionFormat="of" derivedContent="RFC7228"/>.</t>
      <t indent="0" pn="section-2-3">In particular, the following acronyms appear in the document:</t>
      <dl newline="false" spacing="normal" indent="3" pn="section-2-4">
        <dt pn="section-2-4.1">DIO:</dt>
        <dd pn="section-2-4.2">DODAG Information Object (a RPL message)</dd>
        <dt pn="section-2-4.3">DIS:</dt>
        <dd pn="section-2-4.4">DODAG Information Solicitation (a RPL message)</dd>
        <dt pn="section-2-4.5">DODAG:</dt>
        <dd pn="section-2-4.6">Destination-Oriented Directed Acyclic Graph</dd>
        <dt pn="section-2-4.7">LLN:</dt>
        <dd pn="section-2-4.8">Low-Power and Lossy Network</dd>
        <dt pn="section-2-4.9">LBR:</dt>
        <dd pn="section-2-4.10">LLN Border Router</dd>
      </dl>
      <t indent="0" pn="section-2-5">In addition, the document introduces the following concepts:</t>
      <dl newline="false" spacing="normal" indent="3" pn="section-2-6">
        <dt pn="section-2-6.1">Sentinel:</dt>
        <dd pn="section-2-6.2">One of the two roles that a node can play in RNFD. For a given
        DODAG Version, a Sentinel node is a DODAG root's neighbor that
        monitors the DODAG root's status. There are normally multiple
        Sentinels for a DODAG root. However, being the DODAG root's neighbor
        need not imply being a Sentinel.</dd>
        <dt pn="section-2-6.3">Acceptor:</dt>
        <dd pn="section-2-6.4">The other of the two roles that a node can play in RNFD. For a
        given DODAG Version, an Acceptor node is a node that is not
        a Sentinel.</dd>
        <dt pn="section-2-6.5">Locally Observed DODAG Root's State (LORS):</dt>
        <dd pn="section-2-6.6">A node's local knowledge of the DODAG root's status, specifying in
        particular whether the DODAG root is up.</dd>
        <dt pn="section-2-6.7">Conflict-Free Replicated Counter (CFRC):</dt>
        <dd pn="section-2-6.8">Conceptually represents a dynamic set whose cardinality can be
        estimated. It defines a partial order on its values and supports
        element addition and union. The union operation is order- and
        duplicate-insensitive, that is, idempotent, commutative, and
        associative.</dd>
      </dl>
    </section>
    <section anchor="overview" numbered="true" toc="include" removeInRFC="false" pn="section-3">
      <name slugifiedName="name-overview">Overview</name>
      <t indent="0" pn="section-3-1">As mentioned previously, LBRs are DODAG roots in RPL; hence, a
      crash of an LBR is global in that it affects all nodes in the
      corresponding DODAG.  Therefore, each node running RNFD for a given
      DODAG explicitly tracks the DODAG root's current condition, which is
      referred to as Locally Observed DODAG Root's State (LORS), and
      synchronizes its local knowledge with other nodes.</t>
      <t indent="0" pn="section-3-2">Since monitoring the condition of the DODAG root is performed by
      tracking the status of its links (i.e., whether they are up or down), it
      can only be done by the root's neighbors; other nodes must accept their
      observations.  Consequently, depending on their roles, non-root nodes
      are divided in RNFD into two disjoint groups: Sentinels and Acceptors.
      A Sentinel node is a DODAG root's neighbor that monitors its link with
      the root.  Thus, the DODAG root normally has multiple Sentinels, but being
      its neighbor need not imply being a Sentinel.  An Acceptor node is
      a node that is not a Sentinel.  Acceptors thus mainly collect and
      propagate Sentinels' observations.  More information on Sentinel
      selection can be found in <xref target="mgmnt_roles_and_cfrc_lens" format="default" sectionFormat="of" derivedContent="Section 6.1"/>.</t>
      <section anchor="protocol-state-machine" numbered="true" toc="include" removeInRFC="false" pn="section-3.1">
        <name slugifiedName="name-protocol-state-machine">Protocol State Machine</name>
        <t indent="0" pn="section-3.1-1">The possible values of LORS and transitions between them are
        depicted in <xref target="fig_state_machine" format="default" sectionFormat="of" derivedContent="Figure 1"/>.
        States "UP" and "GLOBALLY DOWN" can be attained by both Sentinels and
        Acceptors; states "SUSPECTED DOWN" and "LOCALLY DOWN" can be attained
        by Sentinels only.</t>
        <figure anchor="fig_state_machine" align="left" suppress-title="false" pn="figure-1">
          <name slugifiedName="name-rnfd-states-and-transitions">RNFD States and Transitions</name>
          <artwork name="" type="" align="left" alt="" pn="section-3.1-2.1">
  +---------------------------------------------------------+
  |                      |---------------------------+   3a |
  |    +-----------------+---------+              3b |      |
  |    | 2b              |         v                 v      v
+-+----+-+   1 +---------+-+     +-----------+     +-+------+-+
|   UP   +----&gt;+ SUSPECTED +----&gt;+  LOCALLY  +----&gt;+ GLOBALLY |
|        +&lt;----+    DOWN   | 2a  |    DOWN   | 3c  |   DOWN   |
+-+----+-+  4a +-----------+     +-+---------+     +-+--------+
  ^    ^                           |                 |
  |    |                        4b |                 |
  |    +---------------------------+               5 |
  +--------------------------------------------------+</artwork>
        </figure>
        <t indent="0" pn="section-3.1-3">To begin with, when any node joins a DODAG Version, the DODAG root
        must appear alive, so the node initializes RNFD with its LORS equal to
        "UP".  For a properly working DODAG root, the node remains in state
        "UP".</t>
        <t indent="0" pn="section-3.1-4">However, when a node acting as a Sentinel starts suspecting that
        the root may have crashed, it changes its LORS to "SUSPECTED DOWN"
        (transition 1 in <xref target="fig_state_machine" format="default" sectionFormat="of" derivedContent="Figure 1"/>).
        The transition from "UP" to "SUSPECTED DOWN" can happen based on the
        node's observations at either the data plane (e.g., link-layer
        triggers about missing hop-by-hop acknowledgments for packets
        forwarded over the node's link to the root) or at the control plane (e.g.,
        a significant growth in the number of Sentinels already
        suspecting the root to be dead).  In state "SUSPECTED DOWN", the
        Sentinel node may verify its suspicion and/or inform other nodes about
        the suspicion.  When this has been done, it changes its LORS to
        "LOCALLY DOWN" (transition 2a).  In some cases, the verification need
        not be performed, and as an optimization, a direct transition from
        "UP" to "LOCALLY DOWN" (transition 2b) can be done instead.</t>
        <t indent="0" pn="section-3.1-5">If a sufficient number of Sentinels have their LORS equal to "LOCALLY
        DOWN", all nodes (Sentinels and Acceptors) consent globally that the
        DODAG root must have crashed and set their LORS to "GLOBALLY DOWN",
        irrespective of the previous value (transitions 3a, 3b, and 3c).
        State "GLOBALLY DOWN" is terminal in that the only transition any node
        can perform from this to another state (transition 5) takes place when
        the node joins a new DODAG Version.  When a node is in state "GLOBALLY
        DOWN", RNFD forces RPL to maintain an infinite Rank and no parent,
        thereby preventing routing packets upward in the DODAG.  In other
        words, this state represents a situation in which all non-root nodes
        agree that the current DODAG Version is unusable; hence, to
        recover, the root has to give a proof of being alive by initiating a
        new DODAG Version.</t>
        <t indent="0" pn="section-3.1-6">In contrast, if a node (either a Sentinel or Acceptor) is in state
        "UP", RNFD does not influence RPL's packet forwarding; a node can
        route packets upward if it has a parent.  The same is true for states
        "SUSPECTED DOWN" and "LOCALLY DOWN", attainable only by Sentinels.
        Finally, while in any of the two states, a Sentinel node may observe
        some activity of the DODAG root and hence decide that its suspicion
        is a mistake.  In such a case, it returns to state "UP" (transitions
        4a and 4b).</t>
      </section>
      <section anchor="counters-and-communication" numbered="true" toc="include" removeInRFC="false" pn="section-3.2">
        <name slugifiedName="name-counters-and-communication">Counters and Communication</name>
        <t indent="0" pn="section-3.2-1">To enable arriving at a global conclusion that the DODAG root has
        crashed (i.e., transiting to state "GLOBALLY DOWN"), all nodes count
        locally and synchronize among each other the number of Sentinels
        considering the root to be dead (i.e., those in state "LOCALLY DOWN").
        This process employs structures referred to as Conflict-Free
        Replicated Counters (CFRCs).  They are stored and modified
        independently by each node and are disseminated throughout the network
        in options added to RPL link-local control messages: DODAG Information
        Objects (DIOs) and DODAG Information Solicitations (DISs).  Upon
        reception of such an option from its neighbor, a node merges the
        received counter with its local one, thereby obtaining a new content
        for its local counter.</t>
        <t indent="0" pn="section-3.2-2">The merging operation is idempotent, commutative, and associative.
        Moreover, all possible counter values are partially ordered.  This
        enables ensuring eventual consistency of the counters across all
        nodes, irrespective of the particular sequence of merges, shape of the
        DODAG, or general network topology.  In effect, as long as the network
        is connected, all nodes will be able to arrive at the same conclusion
        regarding the DODAG root, in particular when no two Sentinels
        have a direct link with each other.</t>
        <t indent="0" pn="section-3.2-3">Each node in RNFD maintains two CFRCs for a DODAG:</t>
        <dl indent="3" newline="false" spacing="normal" pn="section-3.2-4">
          <dt pn="section-3.2-4.1">PositiveCFRC:</dt>
          <dd pn="section-3.2-4.2">Counts Sentinels that consider or have
            previously considered the root node as alive in the current DODAG
            Version.</dd>
          <dt pn="section-3.2-4.3">NegativeCFRC:</dt>
          <dd pn="section-3.2-4.4">Counts Sentinels that consider or have
            previously considered the root node as dead in the current DODAG
            Version.</dd>
        </dl>
        <t indent="0" pn="section-3.2-5">The PositiveCFRC is always greater than or equal to the NegativeCFRC in
        terms of the partial order defined for the counters.  The difference
        between the value of the PositiveCFRC and the value of the NegativeCFRC is
        thus nonnegative and estimates the number of Sentinels that still
        consider the DODAG root node as alive.</t>
      </section>
    </section>
    <section anchor="the-rnfd-option" numbered="true" toc="include" removeInRFC="false" pn="section-4">
      <name slugifiedName="name-the-rnfd-option">The RNFD Option</name>
      <t indent="0" pn="section-4-1">RNFD state synchronization between nodes takes place through the RNFD
      Option.  It is a new type of RPL Control Message Option that is carried
      in link-local RPL control messages, notably DIOs and DISs.  Its main
      task is allowing the receivers to merge their two CFRCs with the
      sender's CFRCs.</t>
      <section anchor="general-cfrc-requirements" numbered="true" toc="include" removeInRFC="false" pn="section-4.1">
        <name slugifiedName="name-general-cfrc-requirements">General CFRC Requirements</name>
        <t indent="0" pn="section-4.1-1">CFRCs in RNFD <bcp14>MUST</bcp14> support the following operations:</t>
        <dl newline="true" spacing="normal" indent="3" pn="section-4.1-2">
          <dt pn="section-4.1-2.1">value(c)</dt>
          <dd pn="section-4.1-2.2">Returns a nonnegative integer value corresponding to the number
          of nodes counted by a given CFRC, c.</dd>
          <dt pn="section-4.1-2.3">zero()</dt>
          <dd pn="section-4.1-2.4">Returns a CFRC that counts no nodes, that is, has its value
          equal to 0.</dd>
          <dt pn="section-4.1-2.5">self()</dt>
          <dd pn="section-4.1-2.6">Returns a CFRC that counts only the node executing the operation.</dd>
          <dt pn="section-4.1-2.7">infinity()</dt>
          <dd pn="section-4.1-2.8">Returns a CFRC that counts all possible nodes and represents a
          special value, infinity.</dd>
          <dt pn="section-4.1-2.9">merge(c1, c2)</dt>
          <dd pn="section-4.1-2.10">Returns a CFRC that is a union of c1 and c2 (i.e., counts all
          nodes that are counted by either c1, c2, or both c1 and c2).</dd>
          <dt pn="section-4.1-2.11">compare(c1, c2)</dt>
          <dd pn="section-4.1-2.12">Returns the result of comparing c1 to c2.</dd>
          <dt pn="section-4.1-2.13">saturated(c)</dt>
          <dd pn="section-4.1-2.14">Returns TRUE if a given CFRC, c, is saturated (i.e., no more new
          nodes should be counted by it); returns FALSE otherwise.</dd>
        </dl>
        <t indent="0" pn="section-4.1-3">The partial ordering of CFRCs implies that the result of compare(c1, c2) can be either:</t>
        <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-4.1-4">
          <li pn="section-4.1-4.1">
            <t indent="0" pn="section-4.1-4.1.1">smaller, if c1 is ordered before c2 (i.e., c2 counts all nodes
            that c1 counts and at least one node that c1 does not count);</t>
          </li>
          <li pn="section-4.1-4.2">
            <t indent="0" pn="section-4.1-4.2.1">greater, if c1 is ordered after c2 (i.e., c1 counts all nodes
            that c2 counts and at least one node that c2 does not count);</t>
          </li>
          <li pn="section-4.1-4.3">
            <t indent="0" pn="section-4.1-4.3.1">equal, if c1 and c2 are the same (i.e., they count the same nodes); or</t>
          </li>
          <li pn="section-4.1-4.4">
            <t indent="0" pn="section-4.1-4.4.1">incomparable, otherwise.</t>
          </li>
        </ul>
        <t indent="0" pn="section-4.1-5">In particular, zero() is smaller than all other values, and infinity() is greater than any other value.</t>
        <t indent="0" pn="section-4.1-6">The properties of merging can be formalized as follows for
        any c1, c2, and c3:</t>
        <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-4.1-7">
          <li pn="section-4.1-7.1">
            <t indent="0" pn="section-4.1-7.1.1">idempotence: c1 = merge(c1, c1);</t>
          </li>
          <li pn="section-4.1-7.2">
            <t indent="0" pn="section-4.1-7.2.1">commutativity: merge(c1, c2) = merge(c2, c1); and</t>
          </li>
          <li pn="section-4.1-7.3">
            <t indent="0" pn="section-4.1-7.3.1">associativity: merge(c1, merge(c2, c3)) = merge(merge(c1, c2), c3).</t>
          </li>
        </ul>
        <t indent="0" pn="section-4.1-8">In particular, merge(c, zero()) always equals c, while merge(c,
        infinity()) always equals infinity().</t>
        <t indent="0" pn="section-4.1-9">There are many algorithmic structures that can provide the
        aforementioned properties of CFRC.  Although in principle RNFD does
        not rely on any specific one, the option adopts so-called linear
        counting <xref target="Whang90" format="default" sectionFormat="of" derivedContent="Whang90"/>.</t>
      </section>
      <section anchor="msg_format" numbered="true" toc="include" removeInRFC="false" pn="section-4.2">
        <name slugifiedName="name-format-of-the-option">Format of the Option</name>
        <t indent="0" pn="section-4.2-1">The format of the RNFD Option conforms to the generic format of RPL Control Message Options (see <xref target="RFC6550" sectionFormat="of" section="6.7.1" format="default" derivedLink="https://rfc-editor.org/rfc/rfc6550#section-6.7.1" derivedContent="RFC6550"/>):</t>
        <figure anchor="fig_opt_format" align="left" suppress-title="false" pn="figure-2">
          <name slugifiedName="name-format-of-the-rnfd-option">Format of the RNFD Option</name>
          <artwork name="" type="" align="left" alt="" pn="section-4.2-2.1">
   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 = 0x0E  | Option Length |                               |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +
  |                                                               |
  +                                                               +
  |               PosCFRC, NegCFRC (Variable Length*)             |
  .                                                               .
  .                                                               .
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+</artwork>
        </figure>
        <t indent="0" pn="section-4.2-3">The "*" denotes that, if present, the fields have equal lengths.</t>
        <dl newline="false" spacing="normal" indent="3" pn="section-4.2-4">
          <dt pn="section-4.2-4.1">Option Type:</dt>
          <dd pn="section-4.2-4.2">0x0E</dd>
          <dt pn="section-4.2-4.3">Option Length:</dt>
          <dd pn="section-4.2-4.4">8-bit unsigned integer. Denotes the length of the option in
          octets, excluding the Option Type and Option Length fields. Its value
          <bcp14>MUST</bcp14> be even. A value of 0 denotes that RNFD is
          disabled in the current DODAG Version.</dd>
          <dt pn="section-4.2-4.5">PosCFRC, NegCFRC:</dt>
          <dd pn="section-4.2-4.6">Two variable-length, octet-aligned bit arrays carrying the
          sender's PositiveCFRC and NegativeCFRC, respectively.</dd>
        </dl>
        <t indent="0" pn="section-4.2-5">The length of the arrays constituting the PosCFRC and NegCFRC
        fields is the same and is derived from Option Length as follows.  The
        value of Option Length is divided by 2 to obtain the number of octets
        each of the two arrays occupies.  The resulting number of octets is
        multiplied by 8, which yields an upper bound on the number of bits in
        each array.  As the actual bit length of each of the arrays, the
        largest prime number less than the upper bound is assumed.  For
        example, if the value of Option Length is 16, then each array occupies
        8 octets, and its actual bit length is 61, as this is the largest
        prime number less than 64.</t>
        <t indent="0" pn="section-4.2-6">Furthermore, for any bit equal to 1 in the NegCFRC, the bit with
        the same index <bcp14>MUST</bcp14> also be equal to 1 in the PosCFRC.
        Any unused bits (i.e., the bits beyond the actual bit length of each
        of the arrays) <bcp14>MUST</bcp14> be equal to 0.  Finally, if PosCFRC
        has all its bits equal to 1, then NegCFRC <bcp14>MUST</bcp14> also
        have all its bits equal to 1.</t>
        <t indent="0" pn="section-4.2-7">The CFRC operations are defined for such bit arrays of a given length as follows:</t>
        <dl newline="true" spacing="normal" indent="3" pn="section-4.2-8">
          <dt pn="section-4.2-8.1">value(c)</dt>
          <dd pn="section-4.2-8.2">Returns the smallest integer value not less than -LT*ln(L0/LT),
          where ln() is the natural logarithm function, L0 is the number of
          bits equal to 0 in the array corresponding to c, and LT is
          the bit length of the array.</dd>
          <dt pn="section-4.2-8.3">zero()</dt>
          <dd pn="section-4.2-8.4">Returns an array with all bits equal to 0.</dd>
          <dt pn="section-4.2-8.5">self()</dt>
          <dd pn="section-4.2-8.6">Returns an array with a single bit, selected uniformly at random, equal to 1.</dd>
          <dt pn="section-4.2-8.7">infinity()</dt>
          <dd pn="section-4.2-8.8">Returns an array with all bits equal to 1.</dd>
          <dt pn="section-4.2-8.9">merge(c1, c2)</dt>
          <dd pn="section-4.2-8.10">Returns a bit array that constitutes a bitwise OR of c1 and c2.
          That is, a bit in the resulting array is equal to 0 only if the same
          bit is equal to 0 in both c1 and c2.</dd>
          <dt pn="section-4.2-8.11">compare(c1, c2)</dt>
          <dd pn="section-4.2-8.12">
            <t indent="0" pn="section-4.2-8.12.1">Returns:</t>
            <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-4.2-8.12.2">
              <li pn="section-4.2-8.12.2.1">
                <t indent="0" pn="section-4.2-8.12.2.1.1">equal, if each bit of c1 is equal to the corresponding bit of
            c2;</t>
              </li>
              <li pn="section-4.2-8.12.2.2">
                <t indent="0" pn="section-4.2-8.12.2.2.1">less, if c1 and c2 are not equal, and for each bit equal to 1 in
            c1, the corresponding bit in c2 is also equal to 1;</t>
              </li>
              <li pn="section-4.2-8.12.2.3">
                <t indent="0" pn="section-4.2-8.12.2.3.1">greater, if c1 and c2 are not equal, and for each bit equal to 1
            in c2, the corresponding bit in c1 is also equal to 1; or</t>
              </li>
              <li pn="section-4.2-8.12.2.4">
                <t indent="0" pn="section-4.2-8.12.2.4.1">incomparable, otherwise.</t>
              </li>
            </ul>
          </dd>
          <dt pn="section-4.2-8.13">saturated(c)</dt>
          <dd pn="section-4.2-8.14">Returns TRUE if more than RNFD_CFRC_SATURATION_THRESHOLD of the
          bits in c are equal to 1; returns FALSE otherwise.</dd>
        </dl>
      </section>
    </section>
    <section anchor="rnfd_behavior" numbered="true" toc="include" removeInRFC="false" pn="section-5">
      <name slugifiedName="name-rpl-router-behavior">RPL Router Behavior</name>
      <t indent="0" pn="section-5-1">Although RNFD operates largely independently of RPL, it does need to
      interact with RPL and the overall protocol stack.  These interactions
      are described next and can be realized, for instance, by means of event
      triggers.</t>
      <section anchor="rnfd_behavior_roles" numbered="true" toc="include" removeInRFC="false" pn="section-5.1">
        <name slugifiedName="name-joining-a-dodag-version-and">Joining a DODAG Version and Changing the RNFD Role</name>
        <t indent="0" pn="section-5.1-1">Whenever RPL is running at a node and joins a DODAG Version, RNFD (if
        active) <bcp14>MUST</bcp14> assume the role of Acceptor for the node.
        Accordingly, it <bcp14>MUST</bcp14> set its LORS to "UP" and its
        PositiveCFRC and NegativeCFRC to zero().</t>
        <t indent="0" pn="section-5.1-2">The role may then change between Acceptor and Sentinel at any time.
        However, while a switch from Sentinel to Acceptor has no
        preconditions, in order for a switch from Acceptor to Sentinel to be possible,
        <em>all</em> of the following conditions <bcp14>MUST</bcp14> hold:</t>
        <ol spacing="normal" type="1" indent="adaptive" start="1" pn="section-5.1-3"><li pn="section-5.1-3.1" derivedCounter="1.">
            <t indent="0" pn="section-5.1-3.1.1">LORS is "UP";</t>
          </li>
          <li pn="section-5.1-3.2" derivedCounter="2.">
            <t indent="0" pn="section-5.1-3.2.1">saturated(PositiveCFRC) is FALSE;</t>
          </li>
          <li pn="section-5.1-3.3" derivedCounter="3.">
            <t indent="0" pn="section-5.1-3.3.1">a neighbor entry for the DODAG root is present in RPL's DODAG parent set; and</t>
          </li>
          <li pn="section-5.1-3.4" derivedCounter="4.">
            <t indent="0" pn="section-5.1-3.4.1">the neighbor is considered reachable via its link-local IPv6 address.</t>
          </li>
        </ol>
        <t indent="0" pn="section-5.1-4">A role change also requires appropriate updates to LORS and CFRCs,
        so that the node is properly accounted for.  More specifically, when
        changing its role from Acceptor to Sentinel, the node
        <bcp14>MUST</bcp14> add itself to its PositiveCFRC as follows.  It
        <bcp14>MUST</bcp14> generate a new CFRC value, selfc = self(), and
        it <bcp14>MUST</bcp14> replace its PositiveCFRC, denoted oldpc, with
        newpc = merge(oldpc, selfc).  In contrast, the effects of a switch
        from Sentinel to Acceptor vary depending on the node's value of LORS
        before the switch:</t>
        <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-5.1-5">
          <li pn="section-5.1-5.1">
            <t indent="0" pn="section-5.1-5.1.1">For "GLOBALLY DOWN", the node <bcp14>MUST NOT</bcp14> modify
            its LORS, PositiveCFRC, and NegativeCFRC.</t>
          </li>
          <li pn="section-5.1-5.2">
            <t indent="0" pn="section-5.1-5.2.1">For "LOCALLY DOWN", the node <bcp14>MUST</bcp14> set its LORS
            to "UP" but <bcp14>MUST NOT</bcp14> modify its PositiveCFRC and
            NegativeCFRC.</t>
          </li>
          <li pn="section-5.1-5.3">
            <t indent="0" pn="section-5.1-5.3.1">For "UP" and "SUSPECTED DOWN", the node <bcp14>MUST</bcp14> set
            its LORS to "UP" and <bcp14>MUST NOT</bcp14> modify its PositiveCFRC,
            but the node <bcp14>MUST</bcp14> add itself to NegativeCFRC, by replacing its 
            NegativeCFRC, denoted oldnc, with newnc = merge(oldnc,
            selfc), where selfc is the counter generated with self() when the
            node last added itself to its PositiveCFRC.</t>
          </li>
        </ul>
      </section>
      <section anchor="rnfd_behavior_detection" numbered="true" toc="include" removeInRFC="false" pn="section-5.2">
        <name slugifiedName="name-detecting-and-verifying-pro">Detecting and Verifying Problems with the DODAG Root</name>
        <t indent="0" pn="section-5.2-1">Only nodes that are Sentinels take an active part in detecting crashes
        of the DODAG root; Acceptors just disseminate their observations,
        reflected in the CFRCs.</t>
        <t indent="0" pn="section-5.2-2">The DODAG root monitoring <bcp14>SHOULD</bcp14> be based on both
        internal inputs, notably the values of CFRCs and LORS, and external
        inputs, such as triggers from RPL and other protocols.  External input
        monitoring <bcp14>SHOULD</bcp14> be performed preferably in a reactive
        fashion, also independently of RPL, and at both the data plane and control
        plane.  In particular, it is <bcp14>RECOMMENDED</bcp14> that RNFD be
        directly notified of events relevant to the routing adjacency
        maintenance mechanisms on which RPL relies, such as Layer 2 (L2) triggers
        <xref target="RFC5184" format="default" sectionFormat="of" derivedContent="RFC5184"/> or the Neighbor
        Unreachability Detection <xref target="RFC4861" format="default" sectionFormat="of" derivedContent="RFC4861"/>
        mechanism.  In addition, depending on the underlying protocol stack,
        there may be other potential sources of such events, for instance,
        neighbor communication overhearing.  In any case, only events
        concerning the DODAG root need to be monitored.  For example, RNFD can
        conclude that there may be problems with the DODAG root if it observes
        a lack of multiple consecutive L2 acknowledgments for packets
        transmitted by the node via the link to the DODAG root.  Internally, in turn,
        it is <bcp14>RECOMMENDED</bcp14> that RNFD take action
        whenever there is a change to its local CFRCs, so that a node can have
        a chance to participate in detecting potential problems even when
        normally it would not exchange packets over the link with the DODAG
        root during some period.  In particular, RNFD <bcp14>SHOULD</bcp14>
        conclude that there may be problems with the DODAG root when the
        fraction value(NegativeCFRC)/value(PositiveCFRC) has grown by at least
        RNFD_SUSPICION_GROWTH_THRESHOLD since the node last set its LORS to
        "UP".</t>
        <t indent="0" pn="section-5.2-3">Whenever, having its LORS set to "UP", RNFD concludes (based on either
external or internal inputs) that there may be problems with the
link with the DODAG root, it <bcp14>MUST</bcp14> set its LORS either to "SUSPECTED
DOWN" or, as an optimization, to "LOCALLY DOWN".</t>
        <t indent="0" pn="section-5.2-4">The "SUSPECTED DOWN" value of LORS is temporary: its aim is to give
        RNFD an additional opportunity to verify whether the link with the
        DODAG root is indeed down.  Depending on the outcome of such
        verification, RNFD <bcp14>MUST</bcp14> set its LORS to either "UP", if
        the link has been confirmed not to be down, or "LOCALLY DOWN",
        otherwise.  The verification can be performed, for example, by
        transmitting RPL DIS or ICMPv6 Echo Request messages to the DODAG
        root's link-local IPv6 address and expecting replies confirming that
        the root is up and reachable through the link.  Care should be taken
        not to overload the DODAG root with traffic due to simultaneous
        probes, for instance, random backoffs can be employed to this end.  It
        is <bcp14>RECOMMENDED</bcp14> that the "SUSPECTED DOWN" value of LORS
        be attained and verification take place if RNFD's conclusion on the
        state of the DODAG root is based only on indirect observations, for
        example, the aforementioned growth of the CFRC values.  In contrast,
        for direct observations, such as missing L2 acknowledgments, the
        verification <bcp14>MAY</bcp14> be skipped, with the node's LORS
        effectively changing from "UP" directly to "LOCALLY DOWN".</t>
        <t indent="0" pn="section-5.2-5">For consistency with RPL, when detecting potential problems with
        the DODAG root, RNFD also must make use of RPL's independent
        knowledge.  More specifically, a node <bcp14>MUST</bcp14> switch its
        LORS from "UP" or "SUSPECTED DOWN" directly to "LOCALLY DOWN" if a
        neighbor entry for the DODAG root is removed from RPL's DODAG parent
        set or the neighbor ceases to be considered reachable via its
        link-local IPv6 address.</t>
        <t indent="0" pn="section-5.2-6">Finally, while having its LORS already equal to "LOCALLY DOWN", a
        node may make an observation confirming that its link with the DODAG
        root is actually up.  In such a case, it <bcp14>SHOULD</bcp14> set its
        LORS back to "UP" but <bcp14>MUST NOT</bcp14> do this before
        conditions 2-4 in <xref target="rnfd_behavior_roles" format="default" sectionFormat="of" derivedContent="Section 5.1"/>, which are necessary for a node
        to change its role from Acceptor to Sentinel, all hold.</t>
        <t indent="0" pn="section-5.2-7">To appropriately account for the node's observations on the state
        of the DODAG root, the aforementioned LORS transitions are accompanied
        by changes to the node's local CFRCs as follows.  Transitions between
        "UP" and "SUSPECTED DOWN" do not affect either of the two CFRCs.  In contrast, during
        a switch from "UP" or "SUSPECTED DOWN" to "LOCALLY DOWN", the
        node <bcp14>MUST</bcp14> add itself to its NegativeCFRC, as explained
        previously.  By symmetry, if there is a transition from "LOCALLY DOWN"
        to "UP", the node <bcp14>MUST</bcp14> add itself to its PositiveCFRC,
        as explained previously.</t>
        <t indent="0" pn="section-5.2-8">Such changes to a node's local CFRCs, if performed repeatedly due
        to incorrect decisions regarding the status of the node's link with
        the DODAG root, may lead to those CFRCs becoming saturated.  An
        implementation should thus try to minimize false-positive transitions
        from "UP" and "SUSPECTED DOWN" to "LOCALLY DOWN".  The exact approach
        depends on the specific solutions employed for assessing the state of
        a link.  For instance, one can utilize additional mechanisms for
        increasing the confidence of individual decisions, such as during the
        aforementioned verification in the "SUSPECTED DOWN" state, or can
        limit the number of transitions per node, possibly in an adaptive
        fashion.</t>
      </section>
      <section anchor="rnfd_behavior_consensus" numbered="true" toc="include" removeInRFC="false" pn="section-5.3">
        <name slugifiedName="name-disseminating-observations-">Disseminating Observations and Reaching Agreement</name>
        <t indent="0" pn="section-5.3-1">Nodes disseminate their observations by exchanging CFRCs in the
        RNFD Options embedded in link-local RPL control messages, notably DIOs
        and DISs.  When processing such a received option, a node (acting as a
        Sentinel or Acceptor) <bcp14>MUST</bcp14> update its PositiveCFRC and
        NegativeCFRC to newpc = merge(oldpc, recvpc) and newnc =
        merge(oldnc, recvnc), respectively. Here, oldpc and oldnc are the values of the
        node's PositiveCFRC and NegativeCFRC before the update, while recvpc
        and recvnc are the received values of option fields PosCFRC and
        NegCFRC, respectively.</t>
        <t indent="0" pn="section-5.3-2">In effect, the node's value of the fraction
        value(NegativeCFRC)/value(PositiveCFRC) may change.  If the fraction
        reaches at least RNFD_CONSENSUS_THRESHOLD (with value(PositiveCFRC)
        being greater than zero), then the node consents on the DODAG root
        being down.  Accordingly, it <bcp14>MUST</bcp14> change its LORS to
        "GLOBALLY DOWN" and set its PositiveCFRC and NegativeCFRC both to
        infinity().</t>
        <t indent="0" pn="section-5.3-3">The "GLOBALLY DOWN" value of LORS is terminal; the node <bcp14>MUST NOT</bcp14> change it and <bcp14>MUST NOT</bcp14> modify its CFRCs
        until it joins a new DODAG Version.  With this value of LORS, RNFD at
        the node <bcp14>MUST</bcp14> also prevent RPL from having any DODAG
        parent and advertising any Rank other than INFINITE_RANK.</t>
        <t indent="0" pn="section-5.3-4">Since the RNFD Option is embedded, among others, in RPL DIO control
        messages, updates to a node's CFRCs may affect the sending schedule of
        these messages, which is driven by the DIO Trickle timer <xref target="RFC6206" format="default" sectionFormat="of" derivedContent="RFC6206"/>.  It is <bcp14>RECOMMENDED</bcp14>
        to use a dedicated Trickle timer for RNFD that is different from RPL's
        original DIO Trickle timer.  In such a setting, whenever the dedicated
        timer fires and no DIO message containing the RNFD Option has been
        sent to the link-local all-RPL-nodes multicast IPv6 address since the
        previous firing, the node sends a DIO message containing the RNFD
        Option to the address.  The minimal and maximal interval sizes of the
        dedicated timer <bcp14>SHOULD NOT</bcp14> be smaller than those of
        RPL's original DIO Trickle timer.  In contrast, in the absence of the
        dedicated Trickle timer for RNFD, an implementation
        <bcp14>SHOULD</bcp14> ensure that the RNFD Option is present in
        multicast DIO messages sufficiently often to quickly propagate changes
        to the node's CFRCs and, notably, as soon as possible after a reset of
        the timer triggered by RNFD.  In the remainder of this document, we
        will refer to the Trickle timer utilized by RNFD (either the
        dedicated one or RPL's original one, depending on the implementation)
        simply as "Trickle timer".  In particular, a node <bcp14>MUST</bcp14>
        reset its Trickle timer when it changes its LORS to "GLOBALLY DOWN",
        so that information about the detected crash of the DODAG root is
        disseminated in the DODAG fast.  Likewise, a node
        <bcp14>SHOULD</bcp14> reset its Trickle timer when any of its local
        CFRCs change significantly.</t>
      </section>
      <section anchor="rnfd_behavior_root" numbered="true" toc="include" removeInRFC="false" pn="section-5.4">
        <name slugifiedName="name-dodag-roots-behavior">DODAG Root's Behavior</name>
        <t indent="0" pn="section-5.4-1">The DODAG root node <bcp14>MUST</bcp14> assume the role of Acceptor
        in RNFD and <bcp14>MUST NOT</bcp14> ever switch this role.  It
        <bcp14>MUST</bcp14> also monitor its LORS and local CFRCs, so that it
        can react to various events.</t>
        <t indent="0" pn="section-5.4-2">To start with, the DODAG root <bcp14>MUST</bcp14> generate a new
        DODAG Version, thereby restarting the protocol, if it changes its LORS
        to "GLOBALLY DOWN", which may happen when the root has restarted after
        a crash or the nodes have falsely detected its crash.  It
        <bcp14>MAY</bcp14> also generate a new DODAG Version if the fraction
        value(NegativeCFRC)/value(PositiveCFRC) approaches
        RNFD_CONSENSUS_THRESHOLD, so as to avoid potential interruptions to
        routing.</t>
        <t indent="0" pn="section-5.4-3">Furthermore, the DODAG root <bcp14>SHOULD</bcp14> either generate a
        new DODAG Version or increase the bit length of its CFRCs if
        saturated(PositiveCFRC) becomes TRUE.  This is a self-regulation
        mechanism that helps adjust the CFRCs to a potentially large number of
        Sentinels (see <xref target="mgmnt_roles_and_cfrc_lens" format="default" sectionFormat="of" derivedContent="Section 6.1"/>).</t>
        <t indent="0" pn="section-5.4-4">In general, issuing a new DODAG Version effectively restarts RNFD.
        Thus, the DODAG root <bcp14>MAY</bcp14> also perform this operation in
        other situations.</t>
      </section>
      <section anchor="rnfd_behavior_deactivation" numbered="true" toc="include" removeInRFC="false" pn="section-5.5">
        <name slugifiedName="name-activating-and-deactivating">Activating and Deactivating the Protocol on Demand</name>
        <t indent="0" pn="section-5.5-1">RNFD can be activated and deactivated on demand, once per DODAG
        Version.  The particular policies for activating and deactivating the
        protocol are outside the scope of this document.  However, the
        activation and deactivation <bcp14>MUST</bcp14> be done at the DODAG
        root node; other nodes <bcp14>MUST</bcp14> comply.</t>
        <t indent="0" pn="section-5.5-2">More specifically, when a non-root node joins a DODAG Version, RNFD
        at the node is initially inactive.  The node <bcp14>MUST NOT</bcp14>
        activate the protocol unless it receives for this DODAG Version a
        valid RNFD Option containing some CFRCs, that is, having its Option
        Length field positive.  In particular, if the option accompanies the
        message that causes the node to join the DODAG Version, the protocol
        <bcp14>MUST</bcp14> be active from the moment of the joining.  RNFD
        then remains active at the node until it is explicitly deactivated or
        the node joins a new DODAG Version.  An explicit deactivation
        <bcp14>MUST</bcp14> take place when the node receives an RNFD Option
        for the DODAG Version with no CFRCs, that is, having its Option Length
        field equal to zero.  When explicitly deactivated, RNFD <bcp14>MUST NOT</bcp14> be reactivated unless the node joins a new DODAG Version.
        In particular, when the first RNFD Option received by the node has its
        Option Length field equal to zero, the protocol <bcp14>MUST</bcp14>
        remain deactivated for the entire time the node belongs to the current
        DODAG Version.</t>
        <t indent="0" pn="section-5.5-3">When RNFD at a node is initially inactive for a DODAG Version, the
        node <bcp14>MUST NOT</bcp14> attach any RNFD Option to the messages it
        sends (in particular, because it may not know the desired CFRC length;
        see <xref target="rnfd_behavior_cfrc_size" format="default" sectionFormat="of" derivedContent="Section 5.6"/>).  When
        the protocol has been explicitly deactivated, the node
        <bcp14>MAY</bcp14> also decide not to attach the option to its
        outgoing messages.  However, it is <bcp14>RECOMMENDED</bcp14> that it
        send a sufficient number of messages with the option to the link-local
        all-RPL-nodes multicast IPv6 address to allow its neighbors to learn
        that RNFD has been deactivated in the current DODAG Version.  In
        particular, it <bcp14>MAY</bcp14> reset its Trickle timer to this end
        but <bcp14>MAY</bcp14> also use some reactive mechanisms. For example, it might
        reply with a unicast DIO or DIS containing the RNFD Option with no
        CFRCs to a message from a neighbor that contains the option with some
        CFRCs, as such a neighbor appears not to have learned about the
        deactivation of RNFD.</t>
      </section>
      <section anchor="rnfd_behavior_cfrc_size" numbered="true" toc="include" removeInRFC="false" pn="section-5.6">
        <name slugifiedName="name-processing-cfrcs-of-incompa">Processing CFRCs of Incompatible Lengths</name>
        <t indent="0" pn="section-5.6-1">The merge() and compare() operations on CFRCs require both
        arguments to be compatible, that is, to have the same bit length.
        However, the processing rules for the RNFD Option (see <xref target="msg_format" format="default" sectionFormat="of" derivedContent="Section 4.2"/>) do not necessitate this.  This
        fact is made use of not only in the mechanisms for activating and
        deactivating the protocol (see <xref target="rnfd_behavior_deactivation" format="default" sectionFormat="of" derivedContent="Section 5.5"/>), but also in
        mechanisms for dynamic adjustments of CFRCs, which aim to enable
        deployment-specific policies (see <xref target="mgmnt_roles_and_cfrc_lens" format="default" sectionFormat="of" derivedContent="Section 6.1"/>).  A node thus
        must be prepared to receive the RNFD Option with fields PosCFRC and
        NegCFRC of a different bit length than the node's own PositiveCFRC and
        NegativeCFRC.  Assuming that it has RNFD active and that fields
        PosCFRC and NegCFRC in the option have a positive length, the node
        <bcp14>MUST</bcp14> react as follows.</t>
        <t indent="0" pn="section-5.6-2">If the bit length of fields PosCFRC and NegCFRC is the same as that
        of the node's local PositiveCFRC and NegativeCFRC, then the node
        <bcp14>MUST</bcp14> perform the merges, as detailed previously (see
        <xref target="rnfd_behavior_consensus" format="default" sectionFormat="of" derivedContent="Section 5.3"/>).</t>
        <t indent="0" pn="section-5.6-3">If the bit length of fields PosCFRC and NegCFRC is smaller than
        that of the node's local PositiveCFRC and NegativeCFRC, then the node
        <bcp14>MUST</bcp14> ignore the option and <bcp14>MAY</bcp14> reset its
        Trickle timer.</t>
        <t indent="0" pn="section-5.6-4">If the bit length of fields PosCFRC and NegCFRC is greater than
        that of the node's local PositiveCFRC and NegativeCFRC, then the node
        <bcp14>MUST</bcp14> extend the bit length of its local CFRCs to be
        equal to that in the option and set the CFRCs as follows:</t>
        <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-5.6-5">
          <li pn="section-5.6-5.1">
            <t indent="0" pn="section-5.6-5.1.1">If the node's LORS is "GLOBALLY DOWN", then both of its local
            CFRCs <bcp14>MUST</bcp14> be set to infinity().</t>
          </li>
          <li pn="section-5.6-5.2">
            <t indent="0" pn="section-5.6-5.2.1">Otherwise, they both <bcp14>MUST</bcp14> be set to zero(), and
            the node <bcp14>MUST</bcp14> account for itself in so initialized
            CFRCs. More specifically, if the node is a Sentinel, then it
            <bcp14>MUST</bcp14> add itself to its PositiveCFRC, as detailed
            previously. In addition, if its LORS is "LOCALLY DOWN", then it
            <bcp14>MUST</bcp14> also add itself to its NegativeCFRC, as
            explained previously. Finally, the node <bcp14>MUST</bcp14>
            perform merges of its local CFRCs and the ones received in the
            option (see <xref target="rnfd_behavior_consensus" format="default" sectionFormat="of" derivedContent="Section 5.3"/>) and <bcp14>MAY</bcp14> reset its Trickle
            timer.</t>
          </li>
        </ul>
        <t indent="0" pn="section-5.6-6">In contrast, if the node is unable to extend its local CFRCs, for
        example, because it lacks resources, then it <bcp14>MUST</bcp14> stop
        participating in RNFD. That is, until it joins a new DODAG Version, it
        <bcp14>MUST NOT</bcp14> send the RNFD Option and <bcp14>MUST</bcp14>
        ignore this option in received messages.</t>
        <t indent="0" pn="section-5.6-7">A DODAG root node can be requested to increase the bit length of
        its CFRCs externally, as part of the management policies (see <xref target="mgmnt_roles_and_cfrc_lens" format="default" sectionFormat="of" derivedContent="Section 6.1"/>).  If it cannot
        fulfill such a request, then it <bcp14>MUST NOT</bcp14> stop
        participating in RNFD and <bcp14>SHOULD</bcp14> return an error to the
        requester instead.  Otherwise, since it is always an Acceptor, the above
        rules require it to extend both CFRCs to the requested length and to
        set them both to either zero() or infinity(), depending on whether its
        LORS is different from or equal to "GLOBALLY DOWN", respectively.  In
        the latter case, given the earlier rules governing the root's behavior
        upon reaching the "GLOBALLY DOWN" state (cf. <xref target="rnfd_behavior_root" format="default" sectionFormat="of" derivedContent="Section 5.4"/>), the root is also
        bound to eventually set its CFRCs to zero() and, in addition, generate
        a new DODAG Version and change its LORS back to "UP".  Therefore,
        these two steps can be optimized into one, meaning that effectively,
        irrespective of its LORS, when increasing the bit length of its CFRCs
        in response to an external request, the root also sets the CFRCs to
        zero().</t>
      </section>
      <section anchor="summary-of-rnfds-interactions-with-rpl" numbered="true" toc="include" removeInRFC="false" pn="section-5.7">
        <name slugifiedName="name-summary-of-rnfds-interactio">Summary of RNFD's Interactions with RPL</name>
        <t indent="0" pn="section-5.7-1">In summary, RNFD interacts with RPL in the following manner:</t>
        <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-5.7-2">
          <li pn="section-5.7-2.1">
            <t indent="0" pn="section-5.7-2.1.1">While having its LORS equal to "GLOBALLY DOWN", RNFD prevents
            RPL from routing packets and advertising upward routes in the
            corresponding DODAG (see <xref target="rnfd_behavior_consensus" format="default" sectionFormat="of" derivedContent="Section 5.3"/>).</t>
          </li>
          <li pn="section-5.7-2.2">
            <t indent="0" pn="section-5.7-2.2.1">In some scenarios, RNFD triggers RPL to issue a new DODAG
            Version (see <xref target="rnfd_behavior_root" format="default" sectionFormat="of" derivedContent="Section 5.4"/>).</t>
          </li>
          <li pn="section-5.7-2.3">
            <t indent="0" pn="section-5.7-2.3.1">Depending on the implementation, RNFD may cause RPL's DIO
            Trickle timer resets (see Sections <xref target="rnfd_behavior_consensus" format="counter" sectionFormat="of" derivedContent="5.3"/>, <xref target="rnfd_behavior_deactivation" format="counter" sectionFormat="of" derivedContent="5.5"/>, and <xref target="rnfd_behavior_cfrc_size" format="counter" sectionFormat="of" derivedContent="5.6"/>).</t>
          </li>
          <li pn="section-5.7-2.4">
            <t indent="0" pn="section-5.7-2.4.1">RNFD monitors events relevant to routing adjacency maintenance
            as well as those affecting RPL's DODAG parent set (see Sections <xref target="rnfd_behavior_roles" format="counter" sectionFormat="of" derivedContent="5.1"/> and <xref target="rnfd_behavior_detection" format="counter" sectionFormat="of" derivedContent="5.2"/>).</t>
          </li>
          <li pn="section-5.7-2.5">
            <t indent="0" pn="section-5.7-2.5.1">Using RNFD entails embedding the RNFD Option into link-local
            RPL control messages (see <xref target="msg_format" format="default" sectionFormat="of" derivedContent="Section 4.2"/>).</t>
          </li>
        </ul>
      </section>
      <section anchor="rnfd_behavior_constants" numbered="true" toc="include" removeInRFC="false" pn="section-5.8">
        <name slugifiedName="name-summary-of-rnfds-constants">Summary of RNFD's Constants</name>
        <t indent="0" pn="section-5.8-1">The following is a summary of RNFD's constants:</t>
        <dl newline="false" spacing="normal" indent="3" pn="section-5.8-2">
          <dt pn="section-5.8-2.1">RNFD_CONSENSUS_THRESHOLD:</dt>
          <dd pn="section-5.8-2.2">A threshold concerning the value of the fraction
          value(NegativeCFRC)/value(PositiveCFRC). If the value at a Sentinel
          or Acceptor node reaches the threshold, then the node's LORS is set
          to "GLOBALLY DOWN", which implies that consensus has been reached on
          the DODAG root node being down (see <xref target="rnfd_behavior_consensus" format="default" sectionFormat="of" derivedContent="Section 5.3"/>). The default
          value of the threshold is 0.51, which indicates that a majority of
          Sentinels must consider the root to be down to reach the
          consensus. In general, when the value is higher, the detection period is longer, but the risk of false positives is lower.
          	  </dd>
          <dt pn="section-5.8-2.3">RNFD_SUSPICION_GROWTH_THRESHOLD:</dt>
          <dd pn="section-5.8-2.4">A threshold concerning the value of the fraction
          value(NegativeCFRC)/value(PositiveCFRC). If the value at a Sentinel
          node grows at least by this threshold since the time the node's LORS
          was last set to "UP", then the node's LORS is set to "SUSPECTED
          DOWN" or "LOCALLY DOWN", which implies that the node starts
          suspecting or assumes a crash of the DODAG root (see <xref target="rnfd_behavior_detection" format="default" sectionFormat="of" derivedContent="Section 5.2"/>).  When the
          value is higher, the duration of detecting true crashes is longer,
          but the risk of increased traffic due to verifying false suspicions
          is lower.  The default value of the threshold is 0.12, which in
          sparse networks (up to 8 neighbors per node) triggers a suspicion at
          a Sentinel node after just one other Sentinel starts considering the
          root as dead, while being gradually more conservative in denser
          networks.</dd>
          <dt pn="section-5.8-2.5">RNFD_CFRC_SATURATION_THRESHOLD:</dt>
          <dd pn="section-5.8-2.6">A threshold concerning the percentage of bits set to 1 in a
          CFRC, c. If the percentage for c is equal to or greater than this
          threshold, then saturated(c) returns TRUE, which hints the DODAG
          root to generate a new DODAG Version or increase the bit length of
          the CFRCs (see <xref target="rnfd_behavior_root" format="default" sectionFormat="of" derivedContent="Section 5.4"/>). The default value of the threshold is 0.63.
          When the value is higher, the probability of bit collisions is
          higher, and the results of function value(c) may thus be more
          erratic.</dd>
        </dl>
        <t indent="0" pn="section-5.8-3">The means of configuring the constants at individual nodes are outside the scope of this document.</t>
      </section>
    </section>
    <section anchor="mgmnt" numbered="true" toc="include" removeInRFC="false" pn="section-6">
      <name slugifiedName="name-manageability-consideration">Manageability Considerations</name>
      <t indent="0" pn="section-6-1">RNFD is largely self-managed, with the exception of protocol
      activation and deactivation, as well as node role assignment and the
      related CFRC size adjustment, for which only the aforementioned
      mechanisms are defined, so as to enable adopting deployment-specific
      policies.  This section discusses the manageability issues.</t>
      <section anchor="mgmnt_roles_and_cfrc_lens" numbered="true" toc="include" removeInRFC="false" pn="section-6.1">
        <name slugifiedName="name-role-assignment-and-cfrc-si">Role Assignment and CFRC Size Adjustment</name>
        <t indent="0" pn="section-6.1-1">One approach to node role and CFRC size selection is to manually
        designate specific nodes as Sentinels in RNFD, assuming that they will
        have chances to satisfy the necessary conditions for attaining this
        role (see <xref target="rnfd_behavior_roles" format="default" sectionFormat="of" derivedContent="Section 5.1"/>), and
        to fix the CFRC bit length to accommodate these nodes.</t>
        <t indent="0" pn="section-6.1-2">Another approach is to automate the selection process. In
        principle, any node satisfying the necessary conditions for becoming
        a Sentinel (see <xref target="rnfd_behavior_roles" format="default" sectionFormat="of" derivedContent="Section 5.1"/>)
        can attain this role.  However, in networks where the DODAG root node
        has many neighbors, this approach may lead to saturated(PositiveCFRC)
        quickly becoming TRUE, which may
        degrade RNFD's performance without additional measures.  This issue can be handled with a
        probabilistic solution: if PositiveCFRC becomes saturated with little
        or no increase in NegativeCFRC, then a new DODAG Version can be issued,
        and a node satisfying the necessary conditions can become a Sentinel in
        this version only with probability 1/2.  This process can be continued
        with the probability being halved in each new DODAG Version until
        PositiveCFRC is no longer quickly saturated.  Another solution is to
        increase, potentially multiple times, the bit length of the CFRCs by
        the DODAG root if PositiveCFRC becomes saturated with little or no
        growth in NegativeCFRC. This does not require issuing a new DODAG
        Version but lengthens the RNFD Option.  In this way, a
        sufficient bit length can be dynamically discovered, or the root can
        conclude that a given bit length is excessive for (some) nodes and
        resort to the previous solution.  Increasing the bit length can be
        done, for instance, by doubling it, respecting the condition that it
        has to be a prime number (see <xref target="msg_format" format="default" sectionFormat="of" derivedContent="Section 4.2"/>).</t>
        <t indent="0" pn="section-6.1-3">In either of the solutions, Sentinel nodes should preferably be
        stable themselves and have stable links to the DODAG root.  Otherwise,
        they may often exhibit LORS transitions between "UP" and "LOCALLY
        DOWN" or switches between Acceptor and Sentinel roles, which gradually
        saturates CFRCs.  As a mitigation, the number of such
        transitions and switches per node <bcp14>MAY</bcp14> be limited; however,
        having Sentinels be stable <bcp14>SHOULD</bcp14> be preferred.</t>
      </section>
      <section anchor="mgmnt_virt_dodag_roots" numbered="true" toc="include" removeInRFC="false" pn="section-6.2">
        <name slugifiedName="name-virtual-dodag-roots">Virtual DODAG Roots</name>
        <t indent="0" pn="section-6.2-1">RPL allows a DODAG to have a so-called "virtual root", that is, a
        collection of nodes coordinating to act as a single root of the DODAG.
        The details of the coordination process are left open in
        <xref target="RFC6550" format="default" sectionFormat="of" derivedContent="RFC6550"/>, but from
        RNFD's perspective, two possible realizations are worth
        consideration:</t>
        <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-6.2-2">
          <li pn="section-6.2-2.1">
            <t indent="0" pn="section-6.2-2.1.1">Just a single (primary) node of the nodes comprising the
            virtual root acts as the actual root of the DODAG. Only when this
            node fails does another (backup) node take over. As a result, at
            any time, at most one of the nodes comprising the virtual root is
            the actual root.</t>
          </li>
          <li pn="section-6.2-2.2">
            <t indent="0" pn="section-6.2-2.2.1">More than one of the nodes comprising the virtual root act as
            actual roots of the DODAG, all advertising the same Rank in the
            DODAG. When some of the nodes fail, the other nodes may or may not
            react in any specific way. In other words, at any time, more than
            one node can be the actual root.</t>
          </li>
        </ul>
        <t indent="0" pn="section-6.2-3">In the first realization, RNFD's operation is largely unaffected.
        The necessary conditions for a node to become a Sentinel (<xref target="rnfd_behavior_roles" format="default" sectionFormat="of" derivedContent="Section 5.1"/>) guarantee that only
        the current primary root node is monitored by the protocol.  This
        <bcp14>SHOULD</bcp14> be taken into account in the policies for node
        role assignment, CFRC size selection, and, possibly, the setting of
        the three thresholds (<xref target="rnfd_behavior_constants" format="default" sectionFormat="of" derivedContent="Section 5.8"/>).  Moreover, when a new primary has been elected,
         a
        new DODAG Version <bcp14>MUST</bcp14> be issued to avoid polluting CFRCs with observations on the previous primary.</t>
        <t indent="0" pn="section-6.2-4">In the second realization, the fact that the virtual root consists
        of multiple nodes is transparent to RNFD.  Therefore, employing RNFD
        in such a setting can be beneficial only if the nodes comprising the
        virtual root may suffer from correlated crashes, for instance, due to
        global power outages.</t>
      </section>
      <section anchor="mgmnt_monitoring" numbered="true" toc="include" removeInRFC="false" pn="section-6.3">
        <name slugifiedName="name-monitoring">Monitoring</name>
        <t indent="0" pn="section-6.3-1">For monitoring the operation of RNFD, its implementation <bcp14>SHOULD</bcp14> provide the following information about a node:</t>
        <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-6.3-2">
          <li pn="section-6.3-2.1">
            <t indent="0" pn="section-6.3-2.1.1">whether the protocol is active, and</t>
          </li>
          <li pn="section-6.3-2.2">
            <t indent="0" pn="section-6.3-2.2.1">whether LORS is "GLOBALLY DOWN".</t>
          </li>
        </ul>
        <t indent="0" pn="section-6.3-3">This information <bcp14>MUST</bcp14> be accompanied by the monitoring parameters defined by RPL <xref target="RFC6550" format="default" sectionFormat="of" derivedContent="RFC6550"/>, including at least the DODAG Version Number and the Rank. To offer even finer-grained visibility into RNFD's
        state at the node, the implementation <bcp14>MAY</bcp14> also
        provide:</t>
        <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-6.3-4">
          <li pn="section-6.3-4.1">
            <t indent="0" pn="section-6.3-4.1.1">the assigned role (i.e., Sentinel or Acceptor),</t>
          </li>
          <li pn="section-6.3-4.2">
            <t indent="0" pn="section-6.3-4.2.1">the exact value of LORS (i.e., "UP", "SUSPECTED DOWN", "LOCALLY
            DOWN", or "GLOBALLY DOWN"),</t>
          </li>
          <li pn="section-6.3-4.3">
            <t indent="0" pn="section-6.3-4.3.1">the two CFRCs (i.e., PositiveCFRC and NegativeCFRC), and</t>
          </li>
          <li pn="section-6.3-4.4">
            <t indent="0" pn="section-6.3-4.4.1">the constants listed in <xref target="rnfd_behavior_constants" format="default" sectionFormat="of" derivedContent="Section 5.8"/>.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="security" numbered="true" toc="include" removeInRFC="false" pn="section-7">
      <name slugifiedName="name-security-considerations">Security Considerations</name>
      <t indent="0" pn="section-7-1">RNFD is an extension to RPL and thus is vulnerable to and
      benefits from the security issues and solutions described in <xref target="RFC6550" format="default" sectionFormat="of" derivedContent="RFC6550"/> and <xref target="RFC7416" format="default" sectionFormat="of" derivedContent="RFC7416"/>.  Its specification in this document does not
      introduce new traffic patterns or new messages, for which specific
      mitigation techniques would be required beyond what can already be
      adopted for RPL.</t>
      <t indent="0" pn="section-7-2">In particular, RNFD depends on information exchanged in the RNFD
      Option.  If the contents of this option were compromised, then failure
      misdetection may occur.  One possibility is that the DODAG root may be
      falsely detected as crashed, which would result in an inability of the
      nodes to route packets, at least until a new DODAG Version is issued by
      the root.  Another possibility is that a crash of the DODAG root may not
      be detected by RNFD, in which case RPL would have to rely on its own
      mechanisms.  Moreover, compromising the contents of the RNFD Option may
      also lead to increased DIO traffic due to Trickle timer resets.
      Consequently, RNFD deployments are <bcp14>RECOMMENDED</bcp14> to use RPL
      security mechanisms if there is a risk that control information might be
      modified or spoofed.</t>
      <t indent="0" pn="section-7-3">In this context, two features of RNFD are worth highlighting.  First,
      unless all neighbors of a DODAG root are compromised, a false positive
      can always be detected by the root based on its local CFRCs.  If the
      frequency of such false positives becomes problematic, RNFD can be
      disabled altogether, for instance, until the problem has been diagnosed.
      This procedure can be largely automated at LBRs.  Second, some types of
      false negatives can also be detected this way.  Those that do pass
      undetected are likely not to have major negative consequences
      on RPL apart from the lack of improvement to its performance upon a
      DODAG root's crash, at least if RPL's other components are not attacked
      as well.</t>
    </section>
    <section anchor="iana-considerations" numbered="true" toc="include" removeInRFC="false" pn="section-8">
      <name slugifiedName="name-iana-considerations">IANA Considerations</name>
      <t indent="0" pn="section-8-1">IANA has allocated the following value
      in the "RPL
      Control Message Options" registry within the <eref target="https://www.iana.org/assignments/rpl" brackets="none">"Routing Protocol for
      Low Power and Lossy Networks (RPL)" registry group</eref>.</t>
      <table anchor="options-iana" align="center" pn="table-1">
        <name/>
        <thead>
          <tr>
            <th align="left" colspan="1" rowspan="1">Value</th>
            <th align="left" colspan="1" rowspan="1">Meaning</th>
            <th align="left" colspan="1" rowspan="1">Reference</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left" colspan="1" rowspan="1">0x0E</td>
            <td align="left" colspan="1" rowspan="1">RNFD Option</td>
            <td align="left" colspan="1" rowspan="1">RFC 9866</td>
          </tr>
        </tbody>
      </table>
    </section>
  </middle>
  <back>
    <references pn="section-9">
      <name slugifiedName="name-references">References</name>
      <references pn="section-9.1">
        <name slugifiedName="name-normative-references">Normative References</name>
        <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119" quoteTitle="true" derivedAnchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t indent="0">In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC6206" target="https://www.rfc-editor.org/info/rfc6206" quoteTitle="true" derivedAnchor="RFC6206">
          <front>
            <title>The Trickle Algorithm</title>
            <author fullname="P. Levis" initials="P." surname="Levis"/>
            <author fullname="T. Clausen" initials="T." surname="Clausen"/>
            <author fullname="J. Hui" initials="J." surname="Hui"/>
            <author fullname="O. Gnawali" initials="O." surname="Gnawali"/>
            <author fullname="J. Ko" initials="J." surname="Ko"/>
            <date month="March" year="2011"/>
            <abstract>
              <t indent="0">The Trickle algorithm allows nodes in a lossy shared medium (e.g., low-power and lossy networks) to exchange information in a highly robust, energy efficient, simple, and scalable manner. Dynamically adjusting transmission windows allows Trickle to spread new information on the scale of link-layer transmission times while sending only a few messages per hour when information does not change. A simple suppression mechanism and transmission point selection allow Trickle's communication rate to scale logarithmically with density. This document describes the Trickle algorithm and considerations in its use. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6206"/>
          <seriesInfo name="DOI" value="10.17487/RFC6206"/>
        </reference>
        <reference anchor="RFC6550" target="https://www.rfc-editor.org/info/rfc6550" quoteTitle="true" derivedAnchor="RFC6550">
          <front>
            <title>RPL: IPv6 Routing Protocol for Low-Power and Lossy Networks</title>
            <author fullname="T. Winter" initials="T." role="editor" surname="Winter"/>
            <author fullname="P. Thubert" initials="P." role="editor" surname="Thubert"/>
            <author fullname="A. Brandt" initials="A." surname="Brandt"/>
            <author fullname="J. Hui" initials="J." surname="Hui"/>
            <author fullname="R. Kelsey" initials="R." surname="Kelsey"/>
            <author fullname="P. Levis" initials="P." surname="Levis"/>
            <author fullname="K. Pister" initials="K." surname="Pister"/>
            <author fullname="R. Struik" initials="R." surname="Struik"/>
            <author fullname="JP. Vasseur" initials="JP." surname="Vasseur"/>
            <author fullname="R. Alexander" initials="R." surname="Alexander"/>
            <date month="March" year="2012"/>
            <abstract>
              <t indent="0">Low-Power and Lossy Networks (LLNs) are a class of network in which both the routers and their interconnect are constrained. LLN routers typically operate with constraints on processing power, memory, and energy (battery power). Their interconnects are characterized by high loss rates, low data rates, and instability. LLNs are comprised of anything from a few dozen to thousands of routers. Supported traffic flows include point-to-point (between devices inside the LLN), point-to-multipoint (from a central control point to a subset of devices inside the LLN), and multipoint-to-point (from devices inside the LLN towards a central control point). This document specifies the IPv6 Routing Protocol for Low-Power and Lossy Networks (RPL), which provides a mechanism whereby multipoint-to-point traffic from devices inside the LLN towards a central control point as well as point-to-multipoint traffic from the central control point to the devices inside the LLN are supported. Support for point-to-point traffic is also available. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6550"/>
          <seriesInfo name="DOI" value="10.17487/RFC6550"/>
        </reference>
        <reference anchor="RFC6553" target="https://www.rfc-editor.org/info/rfc6553" quoteTitle="true" derivedAnchor="RFC6553">
          <front>
            <title>The Routing Protocol for Low-Power and Lossy Networks (RPL) Option for Carrying RPL Information in Data-Plane Datagrams</title>
            <author fullname="J. Hui" initials="J." surname="Hui"/>
            <author fullname="JP. Vasseur" initials="JP." surname="Vasseur"/>
            <date month="March" year="2012"/>
            <abstract>
              <t indent="0">The Routing Protocol for Low-Power and Lossy Networks (RPL) includes routing information in data-plane datagrams to quickly identify inconsistencies in the routing topology. This document describes the RPL Option for use among RPL routers to include such routing information. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6553"/>
          <seriesInfo name="DOI" value="10.17487/RFC6553"/>
        </reference>
        <reference anchor="RFC6554" target="https://www.rfc-editor.org/info/rfc6554" quoteTitle="true" derivedAnchor="RFC6554">
          <front>
            <title>An IPv6 Routing Header for Source Routes with the Routing Protocol for Low-Power and Lossy Networks (RPL)</title>
            <author fullname="J. Hui" initials="J." surname="Hui"/>
            <author fullname="JP. Vasseur" initials="JP." surname="Vasseur"/>
            <author fullname="D. Culler" initials="D." surname="Culler"/>
            <author fullname="V. Manral" initials="V." surname="Manral"/>
            <date month="March" year="2012"/>
            <abstract>
              <t indent="0">In Low-Power and Lossy Networks (LLNs), memory constraints on routers may limit them to maintaining, at most, a few routes. In some configurations, it is necessary to use these memory-constrained routers to deliver datagrams to nodes within the LLN. The Routing Protocol for Low-Power and Lossy Networks (RPL) can be used in some deployments to store most, if not all, routes on one (e.g., the Directed Acyclic Graph (DAG) root) or a few routers and forward the IPv6 datagram using a source routing technique to avoid large routing tables on memory-constrained routers. This document specifies a new IPv6 Routing header type for delivering datagrams within a RPL routing domain. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6554"/>
          <seriesInfo name="DOI" value="10.17487/RFC6554"/>
        </reference>
        <reference anchor="RFC8174" target="https://www.rfc-editor.org/info/rfc8174" quoteTitle="true" derivedAnchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t indent="0">RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
      </references>
      <references pn="section-9.2">
        <name slugifiedName="name-informative-references">Informative References</name>
        <reference anchor="Ciolkosz19" quoteTitle="true" derivedAnchor="Ciolkosz19">
          <front>
            <title>Integration of the RNFD Algorithm for Border Router Failure Detection with the RPL Standard for Routing IPv6 Packets</title>
            <author initials="P." surname="Ciolkosz" fullname="Piotr Ciolkosz">
              <organization showOnFrontPage="true"/>
            </author>
            <date year="2019"/>
          </front>
          <refcontent>Master's Thesis, University of Warsaw</refcontent>
        </reference>
        <reference anchor="Iwanicki16" quoteTitle="true" target="https://doi.org/10.1109/IPSN.2016.7460720" derivedAnchor="Iwanicki16">
          <front>
            <title>RNFD: Routing-Layer Detection of DODAG (Root) Node Failures in Low-Power Wireless Networks</title>
            <author initials="K." surname="Iwanicki" fullname="Konrad Iwanicki">
              <organization showOnFrontPage="true"/>
            </author>
            <date year="2016"/>
          </front>
          <refcontent>2016 15th ACM/IEEE International Conference on Information Processing in Sensor Networks (IPSN), pp. 1-12</refcontent>
          <seriesInfo name="DOI" value="10.1109/IPSN.2016.7460720"/>
        </reference>
        <reference anchor="Paszkowska19" quoteTitle="true" target="https://doi.org/10.1007/978-3-319-91146-5_3" derivedAnchor="Paszkowska19">
          <front>
            <title>Failure Handling in RPL Implementations: An Experimental Qualitative Study</title>
            <author initials="A." surname="Paszkowska" fullname="Agnieszka Paszkowska">
              <organization showOnFrontPage="true"/>
            </author>
            <author initials="K." surname="Iwanicki" fullname="Konrad Iwanicki">
              <organization showOnFrontPage="true"/>
            </author>
            <date year="2019"/>
          </front>
          <refcontent>Mission-Oriented Sensor Networks and Systems: Art and Science, Springer International Publishing, pp. 49-95</refcontent>
          <seriesInfo name="DOI" value="10.1007/978-3-319-91146-5_3"/>
        </reference>
        <reference anchor="RFC4861" target="https://www.rfc-editor.org/info/rfc4861" quoteTitle="true" derivedAnchor="RFC4861">
          <front>
            <title>Neighbor Discovery for IP version 6 (IPv6)</title>
            <author fullname="T. Narten" initials="T." surname="Narten"/>
            <author fullname="E. Nordmark" initials="E." surname="Nordmark"/>
            <author fullname="W. Simpson" initials="W." surname="Simpson"/>
            <author fullname="H. Soliman" initials="H." surname="Soliman"/>
            <date month="September" year="2007"/>
            <abstract>
              <t indent="0">This document specifies the Neighbor Discovery protocol for IP Version 6. IPv6 nodes on the same link use Neighbor Discovery to discover each other's presence, to determine each other's link-layer addresses, to find routers, and to maintain reachability information about the paths to active neighbors. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4861"/>
          <seriesInfo name="DOI" value="10.17487/RFC4861"/>
        </reference>
        <reference anchor="RFC5184" target="https://www.rfc-editor.org/info/rfc5184" quoteTitle="true" derivedAnchor="RFC5184">
          <front>
            <title>Unified Layer 2 (L2) Abstractions for Layer 3 (L3)-Driven Fast Handover</title>
            <author fullname="F. Teraoka" initials="F." surname="Teraoka"/>
            <author fullname="K. Gogo" initials="K." surname="Gogo"/>
            <author fullname="K. Mitsuya" initials="K." surname="Mitsuya"/>
            <author fullname="R. Shibui" initials="R." surname="Shibui"/>
            <author fullname="K. Mitani" initials="K." surname="Mitani"/>
            <date month="May" year="2008"/>
            <abstract>
              <t indent="0">This document proposes unified Layer 2 (L2) abstractions for Layer 3 (L3)-driven fast handovers. For efficient network communication, it is vital for a protocol layer to know or utilize other layers' information, such as the form of L2 triggers. However, each protocol layer is basically designed independently. Since each protocol layer is also implemented independently in current operating systems, it is very hard to exchange control information between protocol layers. This document defines nine kinds of L2 abstractions in the form of "primitives" to achieve fast handovers in the network layer as a means of solving the problem. This mechanism is called "L3-driven fast handovers" because the network layer initiates L2 and L3 handovers by using the primitives. This document is a product of the IP Mobility Optimizations (MobOpts) Research Group. This memo defines an Experimental Protocol for the Internet community.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5184"/>
          <seriesInfo name="DOI" value="10.17487/RFC5184"/>
        </reference>
        <reference anchor="RFC7102" target="https://www.rfc-editor.org/info/rfc7102" quoteTitle="true" derivedAnchor="RFC7102">
          <front>
            <title>Terms Used in Routing for Low-Power and Lossy Networks</title>
            <author fullname="JP. Vasseur" initials="JP." surname="Vasseur"/>
            <date month="January" year="2014"/>
            <abstract>
              <t indent="0">This document provides a glossary of terminology used in routing requirements and solutions for networks referred to as Low-Power and Lossy Networks (LLNs). An LLN is typically composed of many embedded devices with limited power, memory, and processing resources interconnected by a variety of links. There is a wide scope of application areas for LLNs, including industrial monitoring, building automation (e.g., heating, ventilation, air conditioning, lighting, access control, fire), connected home, health care, environmental monitoring, urban sensor networks, energy management, assets tracking, and refrigeration.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7102"/>
          <seriesInfo name="DOI" value="10.17487/RFC7102"/>
        </reference>
        <reference anchor="RFC7228" target="https://www.rfc-editor.org/info/rfc7228" quoteTitle="true" derivedAnchor="RFC7228">
          <front>
            <title>Terminology for Constrained-Node Networks</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <author fullname="M. Ersue" initials="M." surname="Ersue"/>
            <author fullname="A. Keranen" initials="A." surname="Keranen"/>
            <date month="May" year="2014"/>
            <abstract>
              <t indent="0">The Internet Protocol Suite is increasingly used on small devices with severe constraints on power, memory, and processing resources, creating constrained-node networks. This document provides a number of basic terms that have been useful in the standardization work for constrained-node networks.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7228"/>
          <seriesInfo name="DOI" value="10.17487/RFC7228"/>
        </reference>
        <reference anchor="RFC7416" target="https://www.rfc-editor.org/info/rfc7416" quoteTitle="true" derivedAnchor="RFC7416">
          <front>
            <title>A Security Threat Analysis for the Routing Protocol for Low-Power and Lossy Networks (RPLs)</title>
            <author fullname="T. Tsao" initials="T." surname="Tsao"/>
            <author fullname="R. Alexander" initials="R." surname="Alexander"/>
            <author fullname="M. Dohler" initials="M." surname="Dohler"/>
            <author fullname="V. Daza" initials="V." surname="Daza"/>
            <author fullname="A. Lozano" initials="A." surname="Lozano"/>
            <author fullname="M. Richardson" initials="M." role="editor" surname="Richardson"/>
            <date month="January" year="2015"/>
            <abstract>
              <t indent="0">This document presents a security threat analysis for the Routing Protocol for Low-Power and Lossy Networks (RPLs). The development builds upon previous work on routing security and adapts the assessments to the issues and constraints specific to low-power and lossy networks. A systematic approach is used in defining and evaluating the security threats. Applicable countermeasures are application specific and are addressed in relevant applicability statements.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7416"/>
          <seriesInfo name="DOI" value="10.17487/RFC7416"/>
        </reference>
        <reference anchor="Whang90" quoteTitle="true" target="https://doi.org/10.1145/78922.78925" derivedAnchor="Whang90">
          <front>
            <title>A Linear-time Probabilistic Counting Algorithm for Database Applications</title>
            <author initials="K.-Y." surname="Whang" fullname="Kyu-Young Whang">
              <organization showOnFrontPage="true"/>
            </author>
            <author initials="B.T." surname="Vander-Zanden" fullname="Brad T. Vander-Zanden">
              <organization showOnFrontPage="true"/>
            </author>
            <author initials="H.M." surname="Taylor" fullname="Howard M. Taylor">
              <organization showOnFrontPage="true"/>
            </author>
            <date year="1990"/>
          </front>
          <refcontent>ACM Transactions on Database Systems (TODS), vol. 15, no. 2, pp. 208-229</refcontent>
          <seriesInfo name="DOI" value="10.1145/78922.78925"/>
        </reference>
      </references>
    </references>
    <section anchor="acknowledgements" numbered="false" toc="include" removeInRFC="false" pn="section-appendix.a">
      <name slugifiedName="name-acknowledgements">Acknowledgements</name>
      <t indent="0" pn="section-appendix.a-1">The author would like to acknowledge <contact fullname="Piotr       Ciolkosz"/> and <contact fullname="Agnieszka Paszkowska"/>.  Agnieszka
      contributed to deeper understanding and formally proving various aspects
      of RPL's behavior upon an LBR crash.  Piotr developed a
      prototype implementation of RNFD dedicated for RPL to verify earlier
      performance claims.</t>
    </section>
    <section anchor="authors-addresses" numbered="false" removeInRFC="false" toc="include" pn="section-appendix.b">
      <name slugifiedName="name-authors-address">Author's Address</name>
      <author initials="K." surname="Iwanicki" fullname="Konrad Iwanicki">
        <organization showOnFrontPage="true">University of Warsaw</organization>
        <address>
          <postal>
            <street>Banacha 2</street>
            <city>Warszawa</city>
            <code>02-097</code>
            <country>Poland</country>
          </postal>
          <phone>+48 22 55 44 428</phone>
          <email>iwanicki@mimuw.edu.pl</email>
        </address>
      </author>
    </section>
  </back>
</rfc>
