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

<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [
<!ENTITY RFC2119 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml">
<!ENTITY RFC6206 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.6206.xml">
<!ENTITY RFC6550 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.6550.xml">
<!ENTITY RFC6553 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.6553.xml">
<!ENTITY RFC6554 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.6554.xml">
<!ENTITY RFC8174 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml">
<!ENTITY RFC4861 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.4861.xml">
<!ENTITY RFC5184 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.5184.xml">
<!ENTITY RFC6202 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.6202.xml">
<!ENTITY RFC7102 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.7102.xml">
<!ENTITY RFC7228 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.7228.xml">
<!ENTITY RFC7416 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.7416.xml">
]>

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

<rfc ipr="trust200902" docName="draft-ietf-roll-rnfd-00" category="std">

  <front>
    <title abbrev="RNFD">RNFD: Fast border router crash detection in RPL</title>

    <author initials="K." surname="Iwanicki" fullname="Konrad Iwanicki">
      <organization>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 year="2022" month="March" day="01"/>

    <area>Internet</area>
    <workgroup>ROLL</workgroup>
    <keyword>Internet-Draft</keyword>

    <abstract>


<t>By and large, a correct operation of a RPL network requires border routers to be up.
In many applications, it is beneficial for the nodes to detect a crash of a border router as soon as possible to trigger fallback actions.
This document describes RNFD, an extension to RPL that expedites border router failure detection, even by an order of magnitude, 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 Options for synchronizing this state among different nodes, and the coordination algorithm itself.</t>



    </abstract>


  </front>

  <middle>


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

<t>RPL is an IPv6 routing protocol for low-power and lossy networks (LLNs) <xref target="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, the main challenge that a routing protocol for LLNs has to address is minimizing resource consumption without sacrificing reaction time to network changes.</t>

<t>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, measured in some metric, to a given LBR, 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 ones that are closer to the LBR than the node itself: 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 in turn for directing packets downward, from the LBR to these nodes, for instance, by means of source routing <xref target="RFC6554"/>.
All in all, not only do LBRs participate in routing but also drive the process of DODAG construction and maintenance underlying the protocol.</t>

<t>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.
This, however, also makes them more prone to failures, especially since in large deployments it is often difficult to ensure a backup power supply for every LBR.</t>

<section anchor="effects-of-lbr-crashes" title="Effects of LBR Crashes">

<t>When an LBR crashes, the nodes in its DODAG 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 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>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 LBR.
Depending on the deployment settings, the node can then remain in such a state, join a different DODAG, or even become itself 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"/> <xref target="Paszkowska19"/> <xref target="Ciolkosz19"/>.</t>

<t>To start with, tearing down all DODAG paths requires each of the 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 LBR.
Detecting a crash of a link by a node normally happens when the node has observed sufficiently many forwarding failures over the link.
Therefore, considering the low-data-rate applications of LLNs, the period from the crash to the moment of eliminating from the DODAG the last link to the LBR may be long.
Subsequently learning by all nodes that none of their links can form any path leading to the 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 LBR exists globally.
Even with RPL’s dedicated loop detection mechanisms <xref target="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="RFC6202"/>.
Overall, the behavior of the network when handling an LBR crash is highly suboptimal, thereby not being in line with RPL’s goal of minimizing resource consumption and reaction latencies.</t>

</section>
<section anchor="design-principles" title="Design Principles">

<t>To address this issue, this document proposes an extension to RPL, dubbed 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>

<t><list style="numbers">
  <t>Explicitly coordinating LBR monitoring between nodes instead of relying only on the emergent behavior resulting from their independent operation.</t>
  <t>Avoiding probing all links to the dead LBR so as to reduce the tail latency when eliminating these links from the DODAG.</t>
  <t>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 critical path.</t>
  <t>Minimizing changes to RPL’s existing algorithms by operating in parallel and largely independently (in the background), and introducing few additional assumptions.</t>
</list></t>

<t>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>
<section anchor="terms" title="Terminology">

<t>The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “NOT RECOMMENDED”, “MAY”, and “OPTIONAL” in this document are to be interpreted as described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they appear in all capitals, as shown here.</t>

<t>The Terminology used in this document is consistent with and incorporates that described in “Terms Used in Routing for Low-Power and Lossy Networks (LLNs)” <xref target="RFC7102"/>, “RPL: IPv6 Routing Protocol for Low-Power and Lossy Networks” <xref target="RFC6550"/>, and “The Routing Protocol for Low-Power and Lossy Networks (RPL) Option for Carrying RPL Information in Data-Plane Datagrams” <xref target="RFC6553"/>.
Other terms in use in LLNs can be found in “Terminology for Constrained-Node Networks” <xref target="RFC7228"/>.</t>

<t>In particular, the following acronyms appear in the document:</t>

<t><list style="hanging">
  <t hangText="DIO">
  DODAG Information Object (a RPL message)</t>
  <t hangText="DIS">
  DODAG Information Solicitation (a RPL message)</t>
  <t hangText="DODAG">
  Destination-Oriented Directed Acyclic Graph</t>
  <t hangText="LLN">
  Low-power and Lossy Network</t>
  <t hangText="LBR">
  LLN Border Router</t>
</list></t>

<t>In addition, the document introduces the following concepts:</t>

<t><list style="hanging">
  <t hangText="Sentinel">
  One of the two roles that a node can play in RNFD. For a given DODAG Version, a Sentinel node is the 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 Sentinel.</t>
  <t hangText="Acceptor">
  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 Sentinel.</t>
  <t hangText="Locally Observed DODAG Root’s State (LORS)">
  A node’s local knowledge of the DODAG root’s status, specifying in particular whether the DODAG root is up.</t>
  <t hangText="Conflict-Free Replicated Counter (CFRC)">
  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.</t>
</list></t>

</section>
<section anchor="overview" title="Overview">

<t>As mentioned previously, LBRs are DODAG roots in RPL, and 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>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 must 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 the DODAG root’s neighbor that monitors its link with the root.
The DODAG root thus normally has multiple Sentinels but being its neighbor need not imply being Sentinel.
An Acceptor node is in turn a node that is not 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"/>.</t>

<section anchor="protocol-state-machine" title="Protocol State Machine">

<t>The possible values of LORS and transitions between them are depicted in <xref target="fig_state_machine"/>.
States “UP” and “GLOBALLY DOWN” can be attained by both Sentinels and Acceptors; states “SUSPECTED DOWN” and “LOCALLY DOWN”—by Sentinels only.</t>

<figure title="RNFD States and Transitions" anchor="fig_state_machine"><artwork><![CDATA[
  +---------------------------------------------------------+
  |                      |---------------------------+   3a |
  |    +-----------------+---------+              3b |      |
  |    | 2b              |         v                 v      v
+-+----+-+   1 +---------+-+     +-----------+     +-+------+-+
|   UP   +---->+ SUSPECTED +---->+  LOCALLY  +---->+ GLOBALLY |
|        +<----+    DOWN   | 2a  |    DOWN   | 3c  |   DOWN   |
+-+----+-+  4a +-----------+     +-+---------+     +-+--------+
  ^    ^                           |                 |
  |    |                        4b |                 |
  |    +---------------------------+               5 |
  +--------------------------------------------------+

]]></artwork></figure>

<t>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>However, when a node—acting as Sentinel—starts suspecting that the root may have crashed, it changes its LORS to “SUSPECTED DOWN” (transition 1 in <xref target="fig_state_machine"/>).
The transition from “UP” to “SUSPECTED DOWN” can happen based on the node’s observations at either the data plane, for instance, link-layer triggers about missing hop-by-hop acknowledgments for packets forwarded over the node’s link to the root, or the control plane, for example, 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>If sufficiently many 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, and hence, to recover, the root has to give a proof of being alive by initiating a new DODAG Version.</t>

<t>In contrast, if a node—either 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 a Sentinel node in states “SUSPECTED DOWN” and “LOCALLY DOWN”.
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" title="Counters and Communication">

<t>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>The merging operation is idempotent, commutative, and associative.
Moreover, all possible counter values are partially ordered.
This enables ensuring eventual consistency of the counters acros all nodes, irrespective of the particular sequence of merges, shape of the DODAG, or general network topology.</t>

<t>Each node in RNFD maintains two CFRCs for a DODAG:</t>

<t><list style="symbols">
  <t>PositiveCFRC, counting Sentinels that have considered or still consider the root node as alive in the current DODAG Version,</t>
  <t>NegativeCFRC, counting Sentinels that have considered or still consider the root node as dead in the current DODAG Version.</t>
</list></t>

<t>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 PositiveCFRC and the value of 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" title="The RNFD Option">

<t>RNFD state synchronization between nodes takes place through the RNFD Option.
It is a new type of RPL Control Message Options 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" title="General CFRC Requirements">

<t>CFRCs in RNFD MUST support the following operations:</t>

<t><list style="hanging">
  <t hangText="value(c)">
  Returns a non-negative integer value corresponding to the number of nodes counted by a given CFRC, c.</t>
  <t hangText="zero()">
  Returns a CFRC that counts no nodes, that is, has its value equal to 0.</t>
  <t hangText="self()">
  Returns a CFRC that counts only the node executing the operation.</t>
  <t hangText="infinity()">
  Returns a CFRC that counts all possible nodes and represents a special value, infinity.</t>
  <t hangText="merge(c1, c2)">
  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).</t>
  <t hangText="compare(c1, c2)">
  Returns the result of comparing c1 to c2.</t>
  <t hangText="saturated(c)">
  Returns TRUE if a given CFRC, c, is saturated (i.e., no more new nodes should be counted by it), or FALSE otherwise.</t>
</list></t>

<t>The partial ordering of CFRCs implies that the result of compare(c1, c2) can be either:</t>

<t><list style="symbols">
  <t>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>
  <t>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>
  <t>equal, if c1 and c2 are the same (i.e., they count the same nodes);</t>
  <t>incomparable, otherwise.</t>
</list></t>

<t>In particular, zero() is smaller than all other values and infinity() is greater than any other value.</t>

<t>The properties of merging in turn can be formalized as follows for any c1, c2, and c3:</t>

<t><list style="symbols">
  <t>idempotence: c1 = merge(c1, c1);</t>
  <t>commutativity: merge(c1, c2) = merge(c2, c1);</t>
  <t>associativity: merge(c1, merge(c2, c3)) = merge(merge(c1, c2), c3).</t>
</list></t>

<t>In particular, merge(c, zero()) always equals c while merge(c, infinity()) always equals infinity().</t>

<t>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"/>.</t>

</section>
<section anchor="msg_format" title="Format of the Option">

<t>The format of the RNFD Option conforms to the generic format of RPL Control Message Options:</t>

<figure title="Format of the RNFD Option" anchor="fig_opt_format"><artwork><![CDATA[
   0                   1                   2                   3
   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |   Type = TBD1 | Option Length |                               |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +
  |                                                               |
  +                                                               +
  |               PosCFRC, NegCFRC (Variable Length*)             |
  .                                                               .
  .                                                               .
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

The '*' denotes that the fields have equal lengths of at least one
octet each. In effect, together they occupy at least two octets.
]]></artwork></figure>

<t><list style="hanging">
  <t hangText="Option Type">
  TBD1</t>
  <t hangText="Option Length">
  8-bit unsigned integer. Denotes the length of the option in octets excluding the Option Type and Option Length fields. Its value MUST be even. A value of 0 denotes that RNFD is disabled in the current DODAG Version.</t>
  <t hangText="PosCFRC, NegCFRC">
  Two variable-length, octet-aligned bit arrays carrying the sender’s PositiveCFRC and NegativeCFRC, respectively.</t>
</list></t>

<t>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>Furthermore, for any bit equal to 1 in the NegCFRC, the bit with the same index MUST be equal to 1 also in the PosCFRC.
Any unused bits (i.e., the bits beyond the actual bit length of each of the arrays) MUST be equal to 0.
Finally, if PosCFRC has all its bits equal to 1, then NegCFRC MUST also have all its bits equal to 1.</t>

<t>The CFRC operations are defined for such bit arrays of a given length as follows:</t>

<t><list style="hanging">
  <t hangText="value(c)">
  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 <spanx style="verb">c</spanx> and LT is the bit length of the array.</t>
  <t hangText="zero()">
  Returns an array with all bits equal to 0.</t>
  <t hangText="self()">
  Returns an array with a single bit, selected uniformly at random, equal to 1.</t>
  <t hangText="infinity()">
  Returns an array with all bits equal to 1.</t>
  <t hangText="merge(c1, c2)">
  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.</t>
  <t hangText="compare(c1, c2)">
  Returns:</t>
</list></t>

<t><list style="symbols">
  <t>equal if each bit of c1 is equal to the corresponding bit of c2;</t>
  <t>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>
  <t>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;</t>
  <t>incomparable, otherwise.</t>
</list></t>

<t><list style="hanging">
  <t hangText="saturated(c)">
  Returns TRUE, if more than 63% of the bits in c are equal to 1, or FALSE, otherwise.</t>
</list></t>

</section>
</section>
<section anchor="rnfd_behavior" title="RPL Router Behavior">

<t>Although RNFD operates largely independently of RPL, it does need 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" title="Joining a DODAG Version and Changing the RNFD Role">

<t>Whenever RPL running at a node joins a DODAG Version, RNFD—if active—MUST assume for the node the role of Acceptor.
Accordingly, it MUST set its LORS to “UP” and its PositiveCFRC and NegativeCFRC to zero().</t>

<t>The role MAY then change between Acceptor and Sentinel at any time.
However, while a switch from Sentinel to Acceptor has no preconditions, for a switch from Acceptor to Sentinel to be possible, <spanx style="emph">all</spanx> of the following conditions MUST hold:</t>

<t><list style="numbers">
  <t>LORS is “UP”;</t>
  <t>saturated(PositiveCFRC) is FALSE;</t>
  <t>a neighbor entry for the DODAG root is present in RPL’s DODAG parent set;</t>
  <t>the neighbor is considered reachable via its link-local IPv6 address.</t>
</list></t>

<t>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 MUST add itself to its PositiveCFRC as follows.
It MUST generate a new CFRC value, selfc = self(), and MUST 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>

<t><list style="symbols">
  <t>for “GLOBALLY DOWN”, the node MUST NOT modify its LORS, PositiveCFRC, and NegativeCFRC;</t>
  <t>for “LOCALLY DOWN”, the node MUST set its LORS to “UP” but MUST NOT modify its PositiveCFRC and NegativeCFRC;</t>
  <t>for “UP” and “SUSPECTED DOWN”, the node MUST set its LORS to “UP”, MUST NOT modify it PositiveCFRC, but MUST add itself to NegativeCFRC, that is, replace 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>
</list></t>

</section>
<section anchor="rnfd_behavior_detection" title="Detecting and Verifying Problems with the DODAG Root">

<t>Only nodes that are Sentinels take active part in detecting crashes of the DODAG Root; Acceptors just disseminate their observations, reflected in the CFRCs.</t>

<t>The DODAG root monitoring SHOULD 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 SHOULD be performed preferably in a reactive fashion, also independently of RPL, and at both data plane and control plane.
In particular, it is RECOMMENDED that RNFD be directly notified of events relevant to the routing adjacency maintenance mechanisms on which RPL relies, such as Layer 2 triggers <xref target="RFC5184"/> or the Neighbor Unreachability Detection <xref target="RFC4861"/> mechanism.
Only events concerning the DODAG root need be monitored to this end.
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 RECOMMENDED 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 SHOULD 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>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 MUST set its LORS to either “SUSPECTED DOWN” or, as an optimization, to “LOCALLY DOWN”.</t>

<t>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 MUST 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 RECOMMENDED that the “SUSPECTED DOWN” value of LORS is attained and verification takes 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 MAY be skipped, with the node’s LORS effectively changing from “UP” directly to “LOCALLY DOWN”.</t>

<t>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 MUST 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>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 SHOULD set its LORS back to “UP” but MUST NOT do this before the previous conditions 2–4 necessary for a node to change its role from Acceptor to Sentinel all hold.</t>

<t>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.
Changes between “UP” and “SUSPECTED DOWN” do not affect any of the two CFRCs.
During a switch from “UP” or “SUSPECTED DOWN” to “LOCALLY DOWN”, in turn, the node MUST add itself to its NegativeCFRC, as explained previously.
By symmetry, a transition from “LOCALLY DOWN” to “UP” REQUIRES the node to add itself to its PositiveCFRC, again, as explained previously.</t>

</section>
<section anchor="rnfd_behavior_consensus" title="Disseminating Observations and Reaching Agreement">

<t>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 Sentinel or Acceptor—MUST update its PositiveCFRC and NegativeCFRC to respectively newpc = merge(oldpc, recvpc) and newnc = merge(oldnc, recvnc), where 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>In effect, the node’s value of 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 MUST change its LORS to “GLOBALLY DOWN” and set its PositiveCFRC and NegativeCFRC both to infinity().</t>

<t>The “GLOBALLY DOWN” value of LORS is terminal: the node MUST NOT change it and MUST NOT modify its CFRCs until it joins a new DODAG Version.
With this value of LORS, RNFD at the node MUST also prevent RPL from having any DODAG parent and advertising any Rank other than INFINITE_RANK.</t>

<t>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"/>.
It is RECOMMENDED to use for RNFD a dedicated Trickle timer, different from RPL’s DIO Trickle timer.
In such a setting, whenever RNFD’s 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.
In contrast, in the absence of a dedicated Trickle timer for RNFD, an implementation SHOULD ensure that the RNFD Option is present in multicast DIO messages sufficiently often to quickly propagate changes to the node’s CFRCs.
In either case, a node MUST 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 SHOULD reset its Trickle timer when any of its local CFRCs changes significantly.</t>

</section>
<section anchor="rnfd_behavior_root" title="DODAG Root’s Behavior">

<t>The DODAG root node MUST assume the role of Acceptor in RNFD and MUST NOT ever switch this role.
It MUST also monitor its LORS and local CFRCs, so that it can react to various events.</t>

<t>To start with, the DODAG root MUST 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 MAY also generate a new DODAG Version if fraction value(NegativeCFRC)/value(PositiveCFRC) approaches RNFD_CONSENSUS_THRESHOLD, so as to avoid potential interruptions to routing.</t>

<t>Furthermore, the DODAG root SHOULD 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"/>).</t>

<t>In general, issuing a new DODAG Version effectively restarts RNFD.
The DODAG root MAY thus perform this operation also in other situations.</t>

</section>
<section anchor="rnfd_behavior_deactivation" title="Activating and Deactivating the Protocol on Demand">

<t>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 SHOULD be done at the DODAG root node; other nodes MUST comply.</t>

<t>More specifically, when a non-root node joins a DODAG Version, RNFD at the node is initially inactive.
The node MUST NOT 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 SHOULD 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 MUST 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 MUST NOT 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 MUST remain deactivated for the entire time the node belongs to the current DODAG Version.</t>

<t>When RNFD at a node is initially inactive for a DODAG Version, the node MUST NOT 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"/>).
When the protocol has been explicitly deactivated, the node MAY also decide not to attach the option to its outgoing messages.
However, it is RECOMMENDED that it sends sufficiently many 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 MAY reset its Trickle timer to this end but also MAY use some reactive mechanisms, for example, replying 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" title="Processing CFRCs of Incompatible Lengths">

<t>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"/>) 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"/>), but also in mechanisms for dynamic adjustments of CFRCs, which aim to enable deployment-specific policies (see <xref target="mgmnt_roles_and_cfrc_lens"/>).
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 MUST react as follows.</t>

<t>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 MUST perform the merges, as detailed previously (see <xref target="rnfd_behavior_consensus"/>).</t>

<t>If the bit length of fields PosCFRC and NegCFRC is smaller than that of the node’s local PositiveCFRC and NegativeCFRC, then the node MUST ignore the option and MAY reset its Trickle timer.</t>

<t>If the bit length of fields PosCFRC and NegCFRC is greater than that of the node’s local PositiveCFRC and NegativeCFRC, then the node MUST extend the bit length of its local CFRCs to be equal to that in the option and set the CFRCs as follows:</t>

<t><list style="symbols">
  <t>If the node’s LORS is “GLOBALLY DOWN”, then both its local CFRCs MUST be set to infinity().</t>
  <t>Otherwise, they both MUST be set to zero(), and the node MUST account for itself in so initialized CFRCs. More specifically, if the node is Sentinel, then it MUST add itself to its PositiveCFRC, as detailed previously. In addition, if its LORS is “LOCALLY DOWN”, then it MUST also add itself to its NegativeCFRC, again, as explained previously. Finally, the node MUST perform merges of its local CFRCs and the ones received in the option (see <xref target="rnfd_behavior_consensus"/>) and MAY reset its Trickle timer.</t>
</list></t>

<t>In contrast, if the node is unable to extend its local CFRCs, for example, because it lacks resources, then it MUST stop participating in RNFD, that is, until it joins a new DODAG Version, it MUST NOT send the RNFD Option and MUST ignore this option in received messages.</t>

</section>
<section anchor="summary-of-rnfds-interactions-with-rpl" title="Summary of RNFD’s Interactions with RPL">

<t>In summary, RNFD interacts with RPL in the following manner:</t>

<t><list style="symbols">
  <t>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"/>).</t>
  <t>In some scenarios, RNFD triggers RPL to issue a new DODAG Version (see <xref target="rnfd_behavior_root"/>).</t>
  <t>Depending on the implementation, RNFD may cause RPL’s DIO Trickle timer resets (see <xref target="rnfd_behavior_consensus"/>, <xref target="rnfd_behavior_deactivation"/>, and <xref target="rnfd_behavior_cfrc_size"/>).</t>
  <t>RNFD monitors events relevant to routing adjacency maintenance as well as those affecting RPL’s DODAG parent set (see <xref target="rnfd_behavior_roles"/> and <xref target="rnfd_behavior_detection"/>).</t>
  <t>Using RNFD entails embedding the RNFD Option into link-local RPL control messages (see <xref target="msg_format"/>).</t>
</list></t>

</section>
<section anchor="rnfd_behavior_constants" title="Summary of RNFD’s Constants">

<t>The following is a summary of RNFD’s constants:</t>

<t><list style="hanging">
  <t hangText="RNFD_SUSPICION_GROWTH_THRESHOLD">
  A threshold concerning the value of 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 suspects or assumes a crash of the DODAG root (see <xref target="rnfd_behavior_detection"/>). The default value of the threshold is 0.12. The higher the value the longer the detection period but the lower risk of increased traffic due suspicion verification.</t>
  <t hangText="RNFD_CONSENSUS_THRESHOLD">
  A threshold concerning the value of 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"/>). The default value of the threshold is 0.51. The higher the value the longer the detection period but the lower the risk of false positives.</t>
</list></t>

<t>The means of configuring the constants at individual nodes are outside the scope of this document.</t>

</section>
</section>
<section anchor="mgmnt" title="Manageability Considerations">

<t>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 outlines some of the possible policies.</t>

<section anchor="mgmnt_roles_and_cfrc_lens" title="Role Assignment and CFRC Size Adjustment">

<t>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"/>), and fixing the CFRC bit length to accommodate these nodes.</t>

<t>Another approach is to automate the selection process: in principle, any node satisfying the necessary conditions for becoming Sentinel (see <xref target="rnfd_behavior_roles"/>) 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—without additional measures—may degrade RNFD’s performance.
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 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, which does not require issuing a new DODAG Version but lengthens the RNFD Option.
In this way, again, 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"/>).</t>

<t>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.
Although as a mitigation the number of such transitions and switches per node MAY be limited, having Sentinels stable SHOULD be preferred.</t>

</section>
<section anchor="mgmnt_virt_dodag_roots" title="Virtual DODAG Roots">

<t>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 the specification <xref target="RFC6550"/> but, from RNFD’s perspective, two possible realizations are worth consideration:</t>

<t><list style="symbols">
  <t>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>
  <t>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>
</list></t>

<t>In the first realization, RNFD’s operation is largely unaffected.
The necessary conditions for a node to become Sentinel (<xref target="rnfd_behavior_roles"/>) guarantee that only the current primary root node is monitored by the protocol.
This SHOULD be taken into account in the policies for node role assignment, CFRC size selection, and, possibly, the setting of the two thresholds (<xref target="rnfd_behavior_constants"/>).
Moreover, when a new primary has been elected, to avoid polluting CFRCs with observations on the previous primary, it is RECOMMENDED to issue a new DODAG Version, especially if the new primary has different neighbors compared to the old one.</t>

<t>In the second realization, the fact that the virtual root consists of multiple nodes is transparent to RNFD.
Therefore, employing RNFD is 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>
<section anchor="security" title="Security Considerations">

<t>RNFD is an extension to RPL and is thus both vulnerable to and benefits from the security issues and solutions described in <xref target="RFC6550"/> and <xref target="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>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 traffic due to DIO Trickle timer resets.
Consequently, RNFD deployments are RECOMMENDED to use RPL security mechanisms if there is a risk that control information might be modified or spoofed.</t>

<t>In this context, RNFD’s two features are worth highlighting.
First, unless a DODAG root’s all neighbors 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 pass undetected, in turn, 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" title="IANA Considerations">

<t>To represent the RNFD Option, IANA is requested to allocate the value TBD1 from the <eref target="https://www.iana.org/assignments/rpl/rpl.xhtml#control-message-options">“RPL Control Message Options” sub-registry</eref> of the “Routing Protocol for Low Power and Lossy Networks (RPL)” registry.</t>

</section>
<section anchor="acknowledgements" title="Acknowledgements">

<t>The authors would like to acknowledge Piotr Ciolkosz and Agnieszka Paszkowska.
Agnieszka contributed to deeper understanding and formally proving various aspects of RPL’s behavior upon an LBR crash.
Piotr in turn developed a prototype implementation of RNFD dedicated for RPL to verify earlier performance claims.</t>

<t><spanx style="emph">TODO</spanx> More likely to follow.</t>

</section>


  </middle>

  <back>

    <references title='Normative References'>

&RFC2119;
&RFC6206;
&RFC6550;
&RFC6553;
&RFC6554;
&RFC8174;


    </references>

    <references title='Informative References'>

&RFC4861;
&RFC5184;
&RFC6202;
&RFC7102;
&RFC7228;
&RFC7416;
<reference anchor="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></organization>
    </author>
    <date year="2016"/>
  </front>
  <seriesInfo name="In" value="IPSN 2016: Proceedings of the 15th ACM/IEEE International Conference on Information Processing in Sensor Networks, IEEE, pp. 1--12"/>
  <seriesInfo name="DOI" value="10.1109/IPSN.2016.7460720"/>
</reference>
<reference anchor="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></organization>
    </author>
    <date year="2019"/>
  </front>
  <seriesInfo name="Master's Thesis," value="University of Warsaw"/>
</reference>
<reference anchor="Paszkowska19" >
  <front>
    <title>Failure Handling in RPL Implementations: An Experimental Qualitative Study</title>
    <author initials="A." surname="Paszkowska" fullname="Agnieszka Paszkowska">
      <organization></organization>
    </author>
    <author initials="K." surname="Iwanicki" fullname="Konrad Iwanicki">
      <organization></organization>
    </author>
    <date year="2019"/>
  </front>
  <seriesInfo name="In" value="Mission-Oriented Sensor Networks and Systems: Art and Science (Habib M. Ammari ed.), Springer International Publishing,  pp. 49--95"/>
  <seriesInfo name="DOI" value="10.1007/978-3-319-91146-5_3"/>
</reference>
<reference anchor="Whang90" >
  <front>
    <title>A Linear-time Probabilistic Counting Algorithm for Database Applications</title>
    <author initials="K.-Y." surname="Whang" fullname="Kyu-Young Whang">
      <organization></organization>
    </author>
    <author initials="B.T." surname="Vander-Zanden" fullname="Brad T. Vander-Zanden">
      <organization></organization>
    </author>
    <author initials="H.M." surname="Taylor" fullname="Howard M. Taylor">
      <organization></organization>
    </author>
    <date year="1990"/>
  </front>
  <seriesInfo name="In" value="ACM Transactions on Database Systems"/>
  <seriesInfo name="DOI" value="10.1145/78922.78925"/>
</reference>


    </references>



  </back>

<!-- ##markdown-source:
H4sIABXsHWIAA8V9e3PbVpbn//wUKKW2IiUkI8mPxMr21ip+dDQtWxrZSSo7
NeMBSZBCBAIcAJTMuD2ffc/vPO4DBGUl3VubqWlTJHAf5573645Go8G0muXl
4iRZt/PRd4NBm7dFdpLsXb159eIkeZU2bTKp6llWJ3W1bumfaZ0218ksa7Np
m1dlkpfJ1eX53iCdTOrs9iTBi4NZNS3TJY0zq9N5O8ozGryuimJUl/PZ6PBw
MEtb+vX48Ph4dPhodHg0GOSr+iRp63XTHh8ePjs8HqR1lp4kZyVNWmbt4K6q
bxa0hhVNcXF+PrjJNvTVzD8xeoG5BlMaeVHVm5OkaWeDwRf0T1rO3qdFVdKM
m6wZrPKT5N/aajpMmqpu62ze0KfNEh/+fTBI1+11VZ8MEv5vpP8mtM/mJPnb
ODm7S8t8epO7H2Sjf6vKOp1t/1rVBNufyvw2q5u83STVPPklrZv0zj3R0BKy
9iT5IS3T6XWaHLtfpvTCCT/+e3qX+q+rGU14SJB79m3w5bpssevLqqD9uu9X
17zvrx9/lxwfJ0+eJI8fJ4+Pv0vcA9kyzYuTJNeF/+9lvlzfjbPZerwqBoOy
qpdpS6sHQK5ePT8+OnqmH58eHz61j0+eHPqPj/zHx/rxu6Nv6eMgL+ed8R5/
9/RIPz45+u6xH/pYP3575D8eH39nHx8f8dwGbvkrSWLsvSKMJdweFemGENej
LJ3Bi4sXp39N9uuqag+SkgCazAkM6zprgNBFdTdaVXf00l1eZ0XWNAkhGDCw
2eN5DEm+6MWSvQBN9jp4stdBFPm9yeo8awAeQ7yzkp49u3z7hoiEdpdc1tU0
y0CqDdbfXmfJ0ZP2Ojl9/vqbs5cvXyoZpNhgWiTPq3Ke1Vk5zRLa8JnBnT7z
QA3NtcBO32YlEUHyRnc3TDDWMFmtxsnRaHR0bMt/cXF2khwdjo+ODp99g2WN
sazxt4+fHn57fMgPGUkfPaU/n+dVcVM1vwu2+IPBKhd1aseAbeCsktOCaDZv
r5cJrTT5QTjOlXCcV3IyyQt3gHf0pLx7eZ68BX2n9Yzf1CNPzi5vnyaX6fQm
ax92ZJdjt+atI7vMq7bu/Lx9YnuviVlm9ZdN8u6afmmGe/RqH+XvxeB6Rn9e
ps3vN9Vdc5N2AWab/5E2WeihYddny1WRLbOyZVjSDk7L5OWHFa2KvyySf12n
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
ghaqKZjSFbSlzGNZJ756+vvbx0daydR0RKPZN+ZaCm+ebOtqtp4Kepl3c0VW
boZ2oCBT+t7XVnk3jmOXoeqTTa/LHF0xtO0NZ0iyej+zLsp3dpeFFatP1KWj
eYgEvu3bN+TKCo7rNNKowde9WFsdF9+MTQNTKvimu8Z52SzrKqslC4kOgRRO
c4RCeqCOiL7zTsKldsKux+zbEX4kJl4eeL7DrmDSTGarRsJfBWmKpoBLr9Wx
e1rNgIwEm4aCXBehoQ8KiAXZW2DRmLWszFuEk9mPfVvZ7ac36TkJKo0mG/VC
uWtdUfnEtCBbk4yuyl03whmOd2FyU8iW3YkE9kxwfnFsiUsEEW43p0m/u76t
dsb4xgMQOt8A2BYbj27qXhS9sKc0ENtzVBv4L4V5WQsq9iG7vD9EvEL0XRLv
bqXJl95wCVtlVVVzVu3NtGUAfGid1gCBN89SuR/Gq61weRcYkbO8X0HpGFpi
choc4pd6yZGTHGmXDtKOz1tplm+y6Zy8s5hd16VOqD8oM5ZrFjfONOo41p1j
QTuJEIymQW8zbgSn1yikhV1J0WXwQgfmhqFRghzUPF2UVeMul2T7YgZS1+FN
ATPXI3ezO//hivbwlmXnUJRN3InX+MiAXfXWKJiaKgKSeScwa9Wo3rUivYfW
ag8F7RPY2slvMml35wyzZfobM2S9VW5qOAvHbiXltSk3Q3QixVq45TjYW2lJ
oJkogccvWa+4JCJCD6b+gLnk1qRFWAZwhTQLIw7uLYFM5hthb4gYqDA9O31z
2hGkXBDn7nnrEvRQXskldzRrWr1DtgBGtUH1vtyA4zb7b3v33Ae0R+g2QdEU
qTL15t/3r9t21Zx8883d3d04T8t0XNWLb7wi2nxTrwr8//jDdbssvlDKHakk
HOndsQfGj/auNDzvaoyAkufVXXLJ+gX3cyQuu0nemIt4n1Z7sJfYkhRap67v
j11KCPWfsPEaVCq8FKgh9rV7NrnMq7ZOnudVcVM1v/N8pwsUmfx+kyaXKf1D
pv5NSjzffct7yslUFvjOsgzuCCBkDUqaWS7r3LrZ8e1T9KWVN6YW3TXUMHVb
EaoE4VgxoCzQbgubZbdZQZbPTLzJbcV3THZqejVCH9QDq4IQ9CzL0rrIIcIC
dJ4WaQ55Mvjq3cWLi6/ETlV6ojclH4B+/r/RordPqrkAAA==

-->

</rfc>

