<?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-01" 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="October" day="12"/>

    <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” 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:
H4sIACcaR2MAA8V9e3PbVpbn//wUKKW2IiUkI8mPxMr2Vit+dDQtWx7JSSo7
NeMBSZBCCwTYACiZcXs/+57fedwHCMpKurc2U9OmSOA+zj3v1x2NRoNpNcvL
xUmybuej7waDNm+L7CTZu3zz6sVJ8ipt2mRS1bOsTupq3dI/0zptrpNZ1mbT
Nq/KJC+Ty7fne4N0Mqmz25MELw5m1bRMlzTOrE7n7SjPaPC6KopRXc5no8Oj
wSxt6dfjw+Pj0dHh6Oh4MMhX9UnS1uumPT48fHZ4PEjrLD1JzkqatMzawV1V
3yxoDSua4uL8fHCTbeirmX9i9AJzDaY08qKqNydJ084Ggy/on7ScvU+LqqQZ
N1kzWOUnyX+01XSYNFXd1tm8oU+bJT7852CQrtvrqj4ZJPzfSP9NaJ/NSfLX
cXJ2l5b59CZ3P8hG/1qVdTrb/rWqCbY/lfltVjd5u0mqefJLWjfpnXuioSVk
7UnyQ1qm0+s0OXa/TOmFE378t/Qu9V9XM5rw8Hh0+Ozb4Mt12WLXb6uC9uu+
X13zvr9+/F1yfJw8eZI8fpw8Pv4ucQ9kyzQvTpJcF/7nZb5c342z2Xq8KgaE
HTRqPlm3fSCRnb/OadVZkVzi33rWVGW8+StaTlYs0zK5qubtHR1r8gudZdNd
wXJafw1E+XNjL4yn6WDHpG/TZpoWybvr9SSr23jC53kzrZKrTdNmy61ZVq28
8ucpnhpPq+VgUFb1Mm3piLDFy1fPj4+OnunHp8eHT+3jkyeH/uMj//Gxfvzu
6Fv6OMjLeWe8x989PdKPT46+e+yHPtaP3x75j8fH39nHx0c8t+GU/JUkMYle
ElkSAY+KdEPU6emSEO3FxYvTvyT7dVW1B0lJWJPMCQbrOmtAtUV1N1pVd/TS
XV5nRdY0CVERyKzZ43mMEr7oJYW9gBb2Oqez16EG+b3J6jxrAB5DpbOSnj17
e/WGOAHtLnlbV9MsAz9qsP72OkuOnrTXyenz19+cvXz5Umk9xQbp9J9X5Tyr
s3KaJbThM4M7feaBGpprgZ1eZSVRevJGdzdMMNYwWa3GydGImI8t/8XF2Uly
dDg+Ojp89g2WNcayxt8+fnr47fEhP2R86+gp/fk8r4qbqvlNsMUfDFa5qFM7
BmwDZ5WcFsSY8vZ6mdBKkx+ErV4KW30lJ5O8cAd4R0/Ku2/PkyswMaIuflOP
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
cXLqTbrDCHSaj8P9SoBDDzFmI/QDBMgqsbY6I9nUUDYxIkHJ+wcwyGqCkJha
7nBkvWyZobHF7v0anGzxbgt6Njiyg/PWa+26XBuSPytyaAYRayJWRqw1SOyW
iiHsZb3Y1Q6e8WMMSUl2Im30GJxdPFIdE8jOOCgYhnGn20B1wirXLhVB+dHW
+7lLUsplxu804rCRPZJEJeMuq7WpQNVdxiSXDEBeB08+RvogQ3TKDiicnAd1
uF5Zq9Abl9k0qERDyZiOX0jVmrZ7CdcBq0W6bkgA3kVg83nsf9gC7tFTnjBc
sYMWbV7AorU8UGe3NkFjPD3Sbg65Q4LPrP/pY0K6V1K9tOQcRtP3MLIzM4+M
eBTTtBIxbwNznWMVhPQfPIX617mcRMdQzEXy2IajQEJGTaBQy9+TbFOp3+aB
Z3awPfdhEPbI545sONiiXZN4Mr9YPQcjKh6R1y813/0vKe3yG97BoFlf3o3F
XuKAZwTN24ouOfZ7JxjWbCE0bcc5AZ3QH+3o/N1XRbl/fvjN+bsDzuCgtdAX
B4YaXH4FAVItUq1KXZfapu780D0Vk5SHqx2noOqWY+S/p/8t+fvvbKT48Nyr
vT6RUoeV2pSi6E7e6/aIX0JjmEXB0w41GTDjhGYIRIRgWgRRZ9VyGB9jvwvk
Mws6uter4Q7cfCjKyzP9ERZhcnEZOToC348MoOD2PFNGzKMzYT+P8hqmyIm0
RImPLfaC3OcEYTtPXs6V4DBiZQZ55NqNccCeO4Zdx2i5ZUoDYWUEzqbglBWb
IuY9U6HKninw43FileD+rcCB8E9NfHzfxEc7Jt5t9d/jMWL+xK4gYc2P/ofR
iQmzqfSECjiVeYTiSeBihoGl/YJ/sHLfj1+gp/p7K/9FRr2ZmawtCeMKO+1E
8Tox2zg8KzZopgogWhC5onHna6+kat03D2zadCpdKZrMvRewSas1K7MPrevj
MQHKi1vivr5fHFdySVdqyP5bZQGzSNmT+LDV3js9+BLN5jogkhzhT9LoCalw
vEPL7vf1LTvy+zAuUgjmEjBHsoGIE9YRopamGoEpWDuw9APOk+bq74W2NxK/
dtbGGU6WLYwv71U48bRwWxVYPOPr019F5kn6lAs5uNRubiFsGQFBuec4zBCE
EyXVBguiaLpXaFY3FiQvklaQ56HlA9rRLX7ZvUAvhwNNfAL2MPmKEOwrI5Oo
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
khBAP/9fALNmvky6AAA=

-->

</rfc>

