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

<!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-02" 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="2023" month="September" day="18"/>

    <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 goals 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 nonnegative 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, if present, the fields have equal lengths.
]]></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 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 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” registry</eref> of the “Routing Protocol for Low Power and Lossy Networks (RPL)” registry group.</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:
H4sIACu4CGUAA8V9e3PbVpbn//wUKKe2YiUkY8l2EivbW6340dG0bHksp1O9
UzMekLyk0AIBNgBKVtzez77ndx73AYKyk+6tzdS0KRK4j3PP+3Unk8loXi+K
anWcbbvl5PvRqCu60h1n9968evHsOHuRt102q5uFa7Km3nb0z7zJ28ts4To3
74q6yooqe/P67N4on80ad32c4cXRop5X+ZrGWTT5spsUjgZv6rKcNNVyMXlw
NFrkHf169ODo4eTBk8khTVxsmuOsa7Ztd/TgwRN6JG9cfpydVjRp5brRTd1c
rWgNG5ri/OxsdOVu6atFeGLyDHON5jTyqm5uj7O2W4xGX9A/ebV4l5d1RTPe
una0KY6z/+jq+Thr66Zr3LKlT7drfPjP0Sjfdpd1czzK+L+J/pvRPtvj7M/T
7PQmr4r5VeF/kI3+ua6afLH7a90QbH+uimvXtEV3m9XL7Je8afMb/0RLS3Dd
cfZjXuXzyzw78r/M6YVjfvzX/CYPX9cLmvDBEUHuu+jLbdVh16/rkvbrv99c
8r6/fvR9dnSUPX6cPXqUPTr6PvMPuHVelMdZoQv/47pYb2+mbrGdbsoRYQeN
Wsy23RBIZOcvC1q1K7M3+LdZtHWVbv6CluPKdV5lF/Wyu6FjzX6hs2z7K1jP
m6+BKH9s7YXpPB/tmfR13s7zMnt7uZ25pksnfFq08zq7uG07t96ZZdPJK3+c
46npvF6PRlXdrPOOjghbfPPi6dHh4RP9+O3Rg2/t4+PHD8LHh+HjI/34/eF3
9HFUVMveeI++//ZQPz4+/P5RGPpIP353GD4eHX1vHx8d8tyGU/JXlqUk+obI
kgh4Uua3RJ2BLgnRnp0/O/lTdr+p6+4gqwhrsiXBYNu4FlRb1jeTTX1DL90U
jStd22ZERSCz9h7PY5TwxSAp3Ito4V7vdO71qEF+b11TuBbgMVQ6rejZ09cX
r4gT0O6y1009dw78qMX6u0uXHT7uLrOTpy+/OX3+/LnSeo4N0uk/raula1w1
dxlt+NTgTp95oJbmWmGnF64iSs9e6e7GGcYaZ5vNNDucTA6PbPnPzk+Ps8MH
08PDB0++wbKmWNb0u0ffPvju6AE/ZHzr8Fv682lRl1d1+6tgSzgYrHLV5HYM
2AbOKjspiTEV3eU6o5VmPwpbfSNs9YWcTPbMH+ANPSnvvj7LLsDEiLr4TT3y
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
PC+JFU66AAA=

-->

</rfc>

