rfc9866xml2.original.xml | rfc9866.xml | |||
---|---|---|---|---|
<?xml version="1.0" encoding="utf-8"?> | <?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" [ | <!DOCTYPE rfc [ | |||
<!ENTITY RFC2119 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refere | <!ENTITY nbsp " "> | |||
nce.RFC.2119.xml"> | <!ENTITY zwsp "​"> | |||
<!ENTITY RFC6206 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refere | <!ENTITY nbhy "‑"> | |||
nce.RFC.6206.xml"> | <!ENTITY wj "⁠"> | |||
<!ENTITY RFC6550 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refere | ||||
nce.RFC.6550.xml"> | ||||
<!ENTITY RFC6553 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refere | ||||
nce.RFC.6553.xml"> | ||||
<!ENTITY RFC6554 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refere | ||||
nce.RFC.6554.xml"> | ||||
<!ENTITY RFC8174 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refere | ||||
nce.RFC.8174.xml"> | ||||
<!ENTITY RFC4861 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refere | ||||
nce.RFC.4861.xml"> | ||||
<!ENTITY RFC5184 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refere | ||||
nce.RFC.5184.xml"> | ||||
<!ENTITY RFC6202 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refere | ||||
nce.RFC.6202.xml"> | ||||
<!ENTITY RFC7102 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refere | ||||
nce.RFC.7102.xml"> | ||||
<!ENTITY RFC7228 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refere | ||||
nce.RFC.7228.xml"> | ||||
<!ENTITY RFC7416 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refere | ||||
nce.RFC.7416.xml"> | ||||
]> | ]> | |||
<?rfc toc="yes"?> | <rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft | |||
<?rfc sortrefs="yes"?> | -ietf-roll-rnfd-07" number="9866" consensus="true" category="std" obsoletes="" u | |||
<?rfc symrefs="yes"?> | pdates="" submissionType="IETF" xml:lang="en" tocInclude="true" sortRefs="true" | |||
symRefs="true" version="3"> | ||||
<rfc ipr="trust200902" docName="draft-ietf-roll-rnfd-07" category="std"> | ||||
<front> | <front> | |||
<title abbrev="RNFD">RNFD: Fast border router crash detection in RPL</title> | <title abbrev="RNFD">Root Node Failure Detector (RNFD): Fast Detection of | |||
Border Router Crashes in the Routing Protocol for Low-Power and Lossy | ||||
Networks (RPL)</title> | ||||
<seriesInfo name="RFC" value="9866"/> | ||||
<author initials="K." surname="Iwanicki" fullname="Konrad Iwanicki"> | <author initials="K." surname="Iwanicki" fullname="Konrad Iwanicki"> | |||
<organization>University of Warsaw</organization> | <organization>University of Warsaw</organization> | |||
<address> | <address> | |||
<postal> | <postal> | |||
<street>Banacha 2</street> | <street>Banacha 2</street> | |||
<city>Warszawa</city> | <city>Warszawa</city> | |||
<code>02-097</code> | <code>02-097</code> | |||
<country>Poland</country> | <country>Poland</country> | |||
</postal> | </postal> | |||
<phone>+48 22 55 44 428</phone> | <phone>+48 22 55 44 428</phone> | |||
<email>iwanicki@mimuw.edu.pl</email> | <email>iwanicki@mimuw.edu.pl</email> | |||
</address> | </address> | |||
</author> | </author> | |||
<date year="2025" month="September"/> | ||||
<date year="2025" month="March" day="08"/> | <area>RTG</area> | |||
<workgroup>roll</workgroup> | ||||
<area>Internet</area> | ||||
<workgroup>ROLL</workgroup> | ||||
<keyword>Internet-Draft</keyword> | ||||
<abstract> | <!-- [rfced Please insert any keywords (beyond those that appear in | |||
the title) for use on https://www.rfc-editor.org/search. --> | ||||
<t>By and large, a correct operation of a network running RPL (the IPv6 routing | <keyword>example</keyword> | |||
protocol for low-power and lossy networks) requires border routers to be up. | ||||
In many applications, it is beneficial for the nodes to detect a failure of a bo | ||||
rder router as soon as possible to trigger fallback actions. | ||||
This document specifies RNFD (the root node failure detector), an extension to R | ||||
PL that expedites border router crash detection 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 Con | ||||
trol Message Options for synchronizing this state among different nodes, and the | ||||
coordination algorithm itself.</t> | ||||
<abstract> | ||||
<t>By and large, correct operation of a network running the Routing | ||||
Protocol for Low-Power and Lossy Networks (RPL) requires border routers to | ||||
be | ||||
up. In many applications, it is beneficial for the nodes to detect a | ||||
failure of a border router as soon as possible to trigger fallback | ||||
actions. This document specifies the Root Node Failure Detector (RNFD), | ||||
an extension to RPL that expedites detection of border router crashes by | ||||
having nodes collaboratively monitor the status of a given border | ||||
router. The extension introduces an additional state at each node, a | ||||
new type of RPL Control Message Option for synchronizing this state | ||||
among different nodes, and the coordination algorithm itself.</t> | ||||
</abstract> | </abstract> | |||
</front> | </front> | |||
<middle> | <middle> | |||
<section anchor="intro" numbered="true" toc="default"> | ||||
<name>Introduction</name> | ||||
<t>RPL is an IPv6 routing protocol for Low-Power and Lossy Networks | ||||
(LLNs) <xref target="RFC6550" format="default"/>. Such networks are | ||||
usually constrained in device energy and channel capacity. They are | ||||
formed largely of nodes that offer little processing power and memory, | ||||
and links that are of variable qualities and support low data rates. | ||||
Therefore, a significant challenge that a routing protocol for LLNs has | ||||
to address is minimizing resource consumption without sacrificing | ||||
reaction time to network changes.</t> | ||||
<section anchor="intro" title="Introduction"> | <t>One of the main design principles adopted in RPL to minimize node | |||
resource consumption is delegating much of the responsibility for | ||||
<t>RPL is an IPv6 routing protocol for low-power and lossy networks (LLNs) <xref | routing to LLN Border Routers (LBRs). A network is organized into | |||
target="RFC6550"/>. | Destination-Oriented Directed Acyclic Graphs (DODAGs), each | |||
Such networks are usually constrained in device energy and channel capacity. | corresponding to an LBR and having all its paths terminate at the LBR. | |||
They are formed largely of nodes that offer little processing power and memory, | To this end, every node is dynamically assigned a Rank representing its | |||
and links that are of variable qualities and support low data rates. | distance to a given LBR, measured in some metric, with the LBR having | |||
Therefore, a significant challenge that a routing protocol for LLNs has to addre | the minimal Rank, which reflects its role as the DODAG root. The Ranks | |||
ss is minimizing resource consumption without sacrificing reaction time to netwo | allow each non-LBR node to select from among its neighbors (i.e., nodes | |||
rk changes.</t> | to which the node has links) those that are closer to the LBR than the | |||
node itself (i.e., the node's parents in the graph). The resulting DODAG | ||||
<t>One of the main design principles adopted in RPL to minimize node resource co | paths, consisting of the node-parent links, are utilized for routing | |||
nsumption is delegating much of the responsibility for routing to LLN border rou | packets upward to the LBR and outside the LLN. They are also used by | |||
ters (LBRs). | nodes to periodically report their connectivity upward to the LBR, which | |||
A network is organized into destination-oriented directed acyclic graphs (DODAGs | allows for directing packets downward from the LBR to these | |||
), each corresponding to an LBR and having all its paths terminate at the LBR. | nodes (e.g., by means of source routing <xref target="RFC6554" | |||
To this end, every node is dynamically assigned a rank representing its distance | format="default"/>). All in all, not only do LBRs | |||
, measured in some metric, to a given LBR, with the LBR having the minimal rank, | participate in routing, but they also drive the process of DODAG construct | |||
which reflects its role as the DODAG root. | ion | |||
The ranks allow each non-LBR node to select from among its neighbors (i.e., node | and maintenance underlying the protocol.</t> | |||
s to which the node has links) those that are closer to the LBR than the node it | <t>To play this central role, LBRs are expected to be more capable than | |||
self: the node’s parents in the graph. | regular LLN nodes. They are assumed not to be constrained in computing | |||
The resulting DODAG paths, consisting of the node-parent links, are utilized for | power, memory, and energy, which often entails a more involved | |||
routing packets upward: to the LBR and outside the LLN. | hardware-software architecture and tethered power supply. However, this | |||
They are also used by nodes to periodically report their connectivity upward to | also makes them prone to failures, especially since | |||
the LBR, which allows in turn for directing packets downward, from the LBR to th | it is often difficult to ensure a backup power supply for every LBR in lar | |||
ese nodes, for instance, by means of source routing <xref target="RFC6554"/>. | ge deployments.</t> | |||
All in all, not only do LBRs participate in routing but also drive the process o | <section anchor="effects-of-lbr-crashes" numbered="true" toc="default"> | |||
f DODAG construction and maintenance underlying the protocol.</t> | <name>Effects of LBR Crashes</name> | |||
<t>When an LBR crashes, or more generally, fails in a way that | ||||
<t>To play this central role, LBRs are expected to be more capable than regular | prevents other nodes in its DODAG from communicating with it, the | |||
LLN nodes. | nodes also lose the ability to communicate with other Internet hosts. | |||
They are assumed not to be constrained in computing power, memory, and energy, w | In addition, a significant fraction of DODAG paths interconnecting the | |||
hich often entails a more involved hardware-software architecture and tethered p | nodes become invalid, as they pass through the dead LBR. The others | |||
ower supply. | also degenerate as a result of DODAG repair attempts, which are bound | |||
This, however, also makes them prone to failures, especially since in large depl | to fail. In effect, routing inside the DODAG also becomes largely | |||
oyments it is often difficult to ensure a backup power supply for every LBR.</t> | impossible. Consequently, it is desirable that an LBR crash be | |||
detected by the nodes fast, so that they can leave the broken DODAG | ||||
<section anchor="effects-of-lbr-crashes" title="Effects of LBR Crashes"> | and join another one or trigger additional application- or | |||
deployment-dependent fallback mechanisms, thereby minimizing the | ||||
<t>When an LBR crashes or, more generally, fails in a way that prevents other no | negative impact of the disconnection.</t> | |||
des in its DODAG from communicating with it, the nodes also lose the ability to | <t>Since all DODAG paths lead to the corresponding LBR, detecting its | |||
communicate with other Internet hosts. | crash by a node entails dropping all parents and adopting an infinite | |||
In addition, a significant fraction of DODAG paths interconnecting the nodes bec | Rank, which reflects the node's inability to reach the dead LBR. | |||
ome invalid, as they pass through the dead LBR. | Depending on the deployment settings, the node can then remain in such | |||
The others also degenerate as a result of DODAG repair attempts, which are bound | a state, join a different DODAG, or even become the root of a | |||
to fail. | floating DODAG. In any case, however, achieving this state for all | |||
In effect, routing inside the DODAG also becomes largely impossible. | nodes is slow, can generate heavy traffic, and is difficult to | |||
Consequently, it is desirable that an LBR crash be detected by the nodes fast, s | implement correctly <xref target="Iwanicki16" format="default"/> <xref | |||
o that they can leave the broken DODAG and join another one or trigger additiona | target="Paszkowska19" format="default"/> <xref target="Ciolkosz19" | |||
l application- or deployment-dependent fallback mechanisms, thereby minimizing t | format="default"/>.</t> | |||
he 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 dead 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 h | ||||
eavy 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 dead LBR’s n | ||||
eighbors 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 fini | ||||
te rank and can thus be other nodes’ parent or ancestor in the DODAG: such nodes | ||||
will incorrectly believe they have a valid path to the dead LBR. | ||||
Detecting a crash of a link by a node normally happens when the node has observe | ||||
d sufficiently many forwarding failures over the link. | ||||
Therefore, considering the low-data-rate applications of LLNs, the period from t | ||||
he crash to the moment of eliminating from the DODAG the last link to the dead L | ||||
BR may be long. | ||||
Subsequently learning by all nodes that none of their links can form any path le | ||||
ading to the dead LBR also adds latency, partly due to parent changes that the n | ||||
odes independently perform in attempts to repair their broken paths locally. | ||||
Since a non-LBR node has only local knowledge of the network, potentially incons | ||||
istent with that of other nodes, such parent changes often produce paths contain | ||||
ing loops, which have to be broken before all nodes can conclude that no path to | ||||
the dead LBR exists globally. | ||||
Even with RPL’s dedicated loop detection mechanisms <xref target="RFC6553"/>, th | ||||
is also requires traffic, and hence time. | ||||
Finally, switching a parent or discovering a loop can also generate cascaded bur | ||||
sts of control traffic, owing to the adaptive Trickle algorithm for exchanging D | ||||
ODAG information <xref target="RFC6202"/>. | ||||
Overall, the behavior of the network when handling an LBR crash is highly subopt | ||||
imal, thereby not being in line with RPL’s goals of minimizing resource consumpt | ||||
ion 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 Roo | ||||
t Node Failure Detector (RNFD). | ||||
To minimize the time and traffic required to handle an LBR crash, the RNFD algor | ||||
ithm 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 onl | ||||
y 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 c | ||||
rash when some nodes suspect such a failure may have taken place, which aims to | ||||
further reduce the overall latency.</t> | ||||
<t>Minimizing changes to RPL’s existing algorithms by operating in parallel an | ||||
d largely independently (in the background), and introducing few additional assu | ||||
mptions.</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 posi | ||||
tives may occur, but they can be alleviated as well. | ||||
In any case, the principles also guarantee that RNFD can be deactivated at any t | ||||
ime, if needed, in which case RPL’s operation is unaffected.</t> | ||||
</section> | ||||
<section anchor="other-solutions" title="Other Solutions"> | ||||
<t>Given the consequences of LBR failures, if possible, it is also worth conside | ||||
ring other solutions to the problem. | ||||
More specifically, power outages can be alleviated by provisioning redundant pow | ||||
er sources or emergency batteries. | ||||
Likewise, RPL’s so-called virtual DODAG roots can help tolerate some failures of | ||||
individual LBRs.</t> | ||||
<t>As mentioned previously, RNFD has been designed to be largely independent of | ||||
those solutions, that is, rather than aiming to be their replacement, it can com | ||||
plement them. | ||||
In particular, the operation of RNFD with different variants of virtual DODAG ro | ||||
ots is covered in <xref target="mgmnt_virt_dodag_roots"/>.</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 d | ||||
ocument are to be interpreted as described in BCP 14 <xref target="RFC2119"/> <x | ||||
ref target="RFC8174"/> when, and only when, they appear in all capitals, as show | ||||
n here.</t> | ||||
<t>The Terminology used in this document is consistent with and incorporates tha | ||||
t 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 Net | ||||
works” <xref target="RFC6550"/>, and “The Routing Protocol for Low-Power and Los | ||||
sy 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 Net | ||||
works” <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 a DODAG root’s neighbor that monitors the DODAG root’s status | ||||
. There are normally multiple Sentinels for a DODAG root. However, being the DOD | ||||
AG 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 Ver | ||||
sion, 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 d | ||||
efines a partial order on its values and supports element addition and union. Th | ||||
e union operation is order- and duplicate-insensitive, that is, idempotent, comm | ||||
utative, 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 can only be done by | ||||
the root’s neighbors; other nodes must accept their observations. | ||||
Consequently, depending on their roles, non-root nodes are divided in RNFD into | ||||
two disjoint groups: Sentinels and Acceptors. | ||||
A Sentinel node is a DODAG root’s neighbor that monitors its link with the root. | ||||
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>To start with, tearing down all DODAG paths requires each of the | |||
dead LBR's neighbors to detect that its link with the LBR is no longer | ||||
up. Otherwise, any of the neighbors unaware of this fact can keep | ||||
advertising a finite Rank and can thus be other nodes' parent or | ||||
ancestor in the DODAG; such nodes will incorrectly believe they have a | ||||
valid path to the dead LBR. Detecting a crash of a link by a node | ||||
normally happens when the node has sufficiently observed 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 the last link to the dead LBR from the DODAG may | ||||
be long. Subsequently, learning by all nodes that none of their links | ||||
can form any path leading to the dead LBR also adds latency, partly | ||||
due to parent changes that the nodes independently perform in attempts | ||||
to repair their broken paths locally. Since a non-LBR node has only | ||||
local knowledge of the network, potentially inconsistent with that of | ||||
other nodes, such parent changes often produce paths containing loops, | ||||
which have to be broken before all nodes can conclude that no path to | ||||
the dead LBR exists globally. Even with RPL's dedicated loop | ||||
detection mechanisms <xref target="RFC6553" format="default"/>, this | ||||
also requires traffic and hence time. Finally, switching a parent or | ||||
discovering a loop can also generate cascaded bursts of control | ||||
traffic, owing to the adaptive Trickle algorithm for exchanging DODAG | ||||
information <xref target="RFC6206" format="default"/>. Overall, the | ||||
behavior of the network when handling an LBR crash is highly | ||||
suboptimal, thereby not being in line with RPL's goals of minimizing | ||||
resource consumption and reaction latencies.</t> | ||||
</section> | ||||
<section anchor="design-principles" numbered="true" toc="default"> | ||||
<name>Design Principles</name> | ||||
<t>To address this issue, this document proposes an extension to RPL, | ||||
dubbed the "Root Node Failure Detector (RNFD)". To minimize the time | ||||
and traffic required to handle an LBR crash, the RNFD algorithm adopts | ||||
the following design principles, derived directly from the previous | ||||
observations:</t> | ||||
<ol spacing="normal" type="1"><li> | ||||
<t>Explicitly coordinating LBR monitoring between nodes instead of | ||||
relying only on the emergent behavior resulting from their | ||||
independent operation.</t> | ||||
</li> | ||||
<li> | ||||
<t>Avoiding probing all links to the dead LBR so as to reduce the | ||||
tail latency when eliminating these links from the DODAG.</t> | ||||
</li> | ||||
<li> | ||||
<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 overall latency.</t> | ||||
</li> | ||||
<li> | ||||
<t>Minimizing changes to RPL's existing algorithms by operating in | ||||
parallel and largely independently (in the background) and by | ||||
introducing few additional assumptions.</t> | ||||
</li> | ||||
</ol> | ||||
<t>While these principles do improve RPL's performance under a wide | ||||
range of LBR crashes, their probabilistic nature precludes hard | ||||
guarantees for all possible corner cases. In particular, in some | ||||
scenarios, RNFD's operation may result in false negatives, but these | ||||
situations are peculiar and will eventually be handled by RPL's own | ||||
aforementioned mechanisms. Likewise, in some scenarios, notably | ||||
involving highly unstable links, false positives may occur, but they | ||||
can be alleviated as well. In any case, the principles also guarantee | ||||
that RNFD can be deactivated at any time if needed, in which case | ||||
RPL's operation is unaffected.</t> | ||||
</section> | ||||
<section anchor="other-solutions" numbered="true" toc="default"> | ||||
<name>Other Solutions</name> | ||||
<t>Given the consequences of LBR failures, it is also | ||||
worth considering other solutions to the problem. More specifically, | ||||
power outages can be alleviated by provisioning redundant power | ||||
sources or emergency batteries. Likewise, RPL's so-called virtual | ||||
DODAG roots can help tolerate some failures of individual LBRs.</t> | ||||
<t>As mentioned previously, RNFD has been designed to be largely | ||||
independent of those solutions; that is, rather than aiming to be | ||||
their replacement, RNFD can complement them. In particular, the | ||||
operation of RNFD with different variants of virtual DODAG roots is | ||||
covered in <xref target="mgmnt_virt_dodag_roots" | ||||
format="default"/>.</t> | ||||
</section> | ||||
</section> | ||||
<section anchor="terms" numbered="true" toc="default"> | ||||
<name>Terminology</name> | ||||
<t> | ||||
The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", | ||||
"<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL NOT</bcp14> | ||||
", | ||||
"<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", | ||||
"<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>", | ||||
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to | ||||
be | ||||
interpreted as described in BCP 14 <xref target="RFC2119"/> <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" <xref target="RFC7102" format="default"/>, "RPL: | ||||
IPv6 Routing Protocol for Low-Power and Lossy Networks" <xref | ||||
target="RFC6550" format="default"/>, and "The Routing Protocol for | ||||
Low-Power and Lossy Networks (RPL) Option for Carrying RPL Information | ||||
in Data-Plane Datagrams" <xref target="RFC6553" format="default"/>. | ||||
Other terms used in LLNs can be found in "Terminology for | ||||
Constrained-Node Networks" <xref target="RFC7228" | ||||
format="default"/>.</t> | ||||
<t>The possible values of LORS and transitions between them are depicted in <xre | <t>In particular, the following acronyms appear in the document:</t> | |||
f target="fig_state_machine"/>. | <dl newline="false" spacing="normal"> | |||
States “UP” and “GLOBALLY DOWN” can be attained by both Sentinels and Acceptors; | <dt>DIO:</dt> | |||
states “SUSPECTED DOWN” and “LOCALLY DOWN” — by Sentinels only.</t> | <dd>DODAG Information Object (a RPL message)</dd> | |||
<dt>DIS:</dt> | ||||
<dd>DODAG Information Solicitation (a RPL message)</dd> | ||||
<dt>DODAG:</dt> | ||||
<dd>Destination-Oriented Directed Acyclic Graph</dd> | ||||
<dt>LLN:</dt> | ||||
<dd>Low-Power and Lossy Network</dd> | ||||
<dt>LBR:</dt> | ||||
<dd>LLN Border Router</dd> | ||||
</dl> | ||||
<t>In addition, the document introduces the following concepts:</t> | ||||
<dl newline="false" spacing="normal"> | ||||
<dt>Sentinel:</dt> | ||||
<dd>One of the two roles that a node can play in RNFD. For a given | ||||
DODAG Version, a Sentinel node is a DODAG root's neighbor that | ||||
monitors the DODAG root's status. There are normally multiple | ||||
Sentinels for a DODAG root. However, being the DODAG root's neighbor | ||||
need not imply being a Sentinel.</dd> | ||||
<dt>Acceptor:</dt> | ||||
<dd>The other of the two roles that a node can play in RNFD. For a | ||||
given DODAG Version, an Acceptor node is a node that is not | ||||
a Sentinel.</dd> | ||||
<dt>Locally Observed DODAG Root's State (LORS):</dt> | ||||
<dd>A node's local knowledge of the DODAG root's status, specifying in | ||||
particular whether the DODAG root is up.</dd> | ||||
<dt>Conflict-Free Replicated Counter (CFRC):</dt> | ||||
<dd>Conceptually represents a dynamic set whose cardinality can be | ||||
estimated. It defines a partial order on its values and supports | ||||
element addition and union. The union operation is order- and | ||||
duplicate-insensitive, that is, idempotent, commutative, and | ||||
associative.</dd> | ||||
</dl> | ||||
</section> | ||||
<section anchor="overview" numbered="true" toc="default"> | ||||
<name>Overview</name> | ||||
<t>As mentioned previously, LBRs are DODAG roots in RPL; hence, a | ||||
crash of an LBR is global in that it affects all nodes in the | ||||
corresponding DODAG. Therefore, each node running RNFD for a given | ||||
DODAG explicitly tracks the DODAG root's current condition, which is | ||||
referred to as Locally Observed DODAG Root's State (LORS), and | ||||
synchronizes its local knowledge with other nodes.</t> | ||||
<t>Since monitoring the condition of the DODAG root is performed by | ||||
tracking the status of its links (i.e., whether they are up or down), it | ||||
can only be done by the root's neighbors; other nodes must accept their | ||||
observations. Consequently, depending on their roles, non-root nodes | ||||
are divided in RNFD into two disjoint groups: Sentinels and Acceptors. | ||||
A Sentinel node is a DODAG root's neighbor that monitors its link with | ||||
the root. Thus, the DODAG root normally has multiple Sentinels, but being | ||||
its neighbor need not imply being a Sentinel. An Acceptor node is | ||||
a node that is not a Sentinel. Acceptors thus mainly collect and | ||||
propagate Sentinels' observations. More information on Sentinel | ||||
selection can be found in <xref target="mgmnt_roles_and_cfrc_lens" | ||||
format="default"/>.</t> | ||||
<figure title="RNFD States and Transitions" anchor="fig_state_machine"><artwork> | <section anchor="protocol-state-machine" numbered="true" toc="default"> | |||
<![CDATA[ | <name>Protocol State Machine</name> | |||
<t>The possible values of LORS and transitions between them are | ||||
depicted in <xref target="fig_state_machine" format="default"/>. | ||||
States "UP" and "GLOBALLY DOWN" can be attained by both Sentinels and | ||||
Acceptors; states "SUSPECTED DOWN" and "LOCALLY DOWN" can be attained | ||||
by Sentinels only.</t> | ||||
<figure anchor="fig_state_machine"> | ||||
<name>RNFD States and Transitions</name> | ||||
<artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
+---------------------------------------------------------+ | +---------------------------------------------------------+ | |||
| |---------------------------+ 3a | | | |---------------------------+ 3a | | |||
| +-----------------+---------+ 3b | | | | +-----------------+---------+ 3b | | | |||
| | 2b | v v v | | | 2b | v v v | |||
+-+----+-+ 1 +---------+-+ +-----------+ +-+------+-+ | +-+----+-+ 1 +---------+-+ +-----------+ +-+------+-+ | |||
| UP +---->+ SUSPECTED +---->+ LOCALLY +---->+ GLOBALLY | | | UP +---->+ SUSPECTED +---->+ LOCALLY +---->+ GLOBALLY | | |||
| +<----+ DOWN | 2a | DOWN | 3c | DOWN | | | +<----+ DOWN | 2a | DOWN | 3c | DOWN | | |||
+-+----+-+ 4a +-----------+ +-+---------+ +-+--------+ | +-+----+-+ 4a +-----------+ +-+---------+ +-+--------+ | |||
^ ^ | | | ^ ^ | | | |||
| | 4b | | | | | 4b | | | |||
| +---------------------------+ 5 | | | +---------------------------+ 5 | | |||
+--------------------------------------------------+ | +--------------------------------------------------+]]></artwork> | |||
</figure> | ||||
]]></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 | ||||
<t>To begin with, when any node joins a DODAG Version, the DODAG root must appea | "UP". For a properly working DODAG root, the node remains in state | |||
r alive, so the node initializes RNFD with its LORS equal to “UP”. | "UP".</t> | |||
For a properly working DODAG root, the node remains in state “UP”.</t> | <t>However, when a node (acting as a Sentinel) starts suspecting that | |||
the root may have crashed, it changes its LORS to "SUSPECTED DOWN" | ||||
<t>However, when a node — acting as Sentinel — starts suspecting that the root m | (transition 1 in <xref target="fig_state_machine" format="default"/>). | |||
ay have crashed, it changes its LORS to “SUSPECTED DOWN” (transition 1 in <xref | The transition from "UP" to "SUSPECTED DOWN" can happen based on the | |||
target="fig_state_machine"/>). | node's observations at either the data plane (for instance, link-layer | |||
The transition from “UP” to “SUSPECTED DOWN” can happen based on the node’s obse | triggers about missing hop-by-hop acknowledgments for packets | |||
rvations at either the data plane, for instance, link-layer triggers about missi | forwarded over the node's link to the root) or at the control plane (for | |||
ng hop-by-hop acknowledgments for packets forwarded over the node’s link to the | example, a significant growth in the number of Sentinels already | |||
root, or the control plane, for example, a significant growth in the number of S | suspecting the root to be dead). In state "SUSPECTED DOWN", the | |||
entinels already suspecting the root to be dead. | Sentinel node may verify its suspicion and/or inform other nodes about | |||
In state “SUSPECTED DOWN”, the Sentinel node may verify its suspicion and/or inf | the suspicion. When this has been done, it changes its LORS to | |||
orm other nodes about the suspicion. | "LOCALLY DOWN" (transition 2a). In some cases, the verification need | |||
When this has been done, it changes its LORS to “LOCALLY DOWN” (transition 2a). | not be performed, and as an optimization, a direct transition from | |||
In some cases, the verification need not be performed and, as an optimization, a | "UP" to "LOCALLY DOWN" (transition 2b) can be done instead.</t> | |||
direct transition from “UP” to “LOCALLY DOWN” (transition 2b) can be done inste | <t>If a sufficient number of Sentinels have their LORS equal to "LOCALLY | |||
ad.</t> | DOWN", all nodes (Sentinels and Acceptors) consent globally that the | |||
DODAG root must have crashed and set their LORS to "GLOBALLY DOWN", | ||||
<t>If sufficiently many Sentinels have their LORS equal to “LOCALLY DOWN”, all n | irrespective of the previous value (transitions 3a, 3b, and 3c). | |||
odes — Sentinels and Acceptors — consent globally that the DODAG root must have | State "GLOBALLY DOWN" is terminal in that the only transition any node | |||
crashed and set their LORS to “GLOBALLY DOWN”, irrespective of the previous valu | can perform from this to another state (transition 5) takes place when | |||
e (transitions 3a, 3b, and 3c). | the node joins a new DODAG Version. When a node is in state "GLOBALLY | |||
State “GLOBALLY DOWN” is terminal in that the only transition any node can perfo | DOWN", RNFD forces RPL to maintain an infinite Rank and no parent, | |||
rm from this to another state (transition 5) takes place when the node joins a n | thereby preventing routing packets upward in the DODAG. In other | |||
ew DODAG version. | words, this state represents a situation in which all non-root nodes | |||
When a node is in state “GLOBALLY DOWN”, RNFD forces RPL to maintain an infinite | agree that the current DODAG Version is unusable; hence, to | |||
rank and no parent, thereby preventing routing packets upward in the DODAG. | recover, the root has to give a proof of being alive by initiating a | |||
In other words, this state represents a situation in which all non-root nodes ag | new DODAG Version.</t> | |||
ree that the current DODAG version is unusable, and hence, to recover, the root | <t>In contrast, if a node (either a Sentinel or Acceptor) is in state | |||
has to give a proof of being alive by initiating a new DODAG Version.</t> | "UP", RNFD does not influence RPL's packet forwarding; a node can | |||
route packets upward if it has a parent. The same is true for states | ||||
<t>In contrast, if a node — either Sentinel or Acceptor — is in state “UP”, RNFD | "SUSPECTED DOWN" and "LOCALLY DOWN", attainable only by Sentinels. | |||
does not influence RPL’s packet forwarding: a node can route packets upward if | Finally, while in any of the two states, a Sentinel node may observe | |||
it has a parent. | some activity of the DODAG root and hence decide that its suspicion | |||
The same is true for states “SUSPECTED DOWN” and “LOCALLY DOWN”, attainable only | is a mistake. In such a case, it returns to state "UP" (transitions | |||
by Sentinels. | 4a and 4b).</t> | |||
Finally, while in any of the two states, a Sentinel node may observe some activi | </section> | |||
ty of the DODAG root, and hence decide that its suspicion is a mistake. | <section anchor="counters-and-communication" numbered="true" toc="default" | |||
In such a case, it returns to state “UP” (transitions 4a and 4b).</t> | > | |||
<name>Counters and Communication</name> | ||||
</section> | <t>To enable arriving at a global conclusion that the DODAG root has | |||
<section anchor="counters-and-communication" title="Counters and Communication"> | crashed (i.e., transiting to state "GLOBALLY DOWN"), all nodes count | |||
locally and synchronize among each other the number of Sentinels | ||||
<t>To enable arriving at a global conclusion that the DODAG root has crashed (i. | considering the root to be dead (i.e., those in state "LOCALLY DOWN"). | |||
e., transiting to state “GLOBALLY DOWN”), all nodes count locally and synchroniz | This process employs structures referred to as Conflict-Free | |||
e among each other the number of Sentinels considering the root to be dead (i.e. | Replicated Counters (CFRCs). They are stored and modified | |||
, those in state “LOCALLY DOWN”). | independently by each node and are disseminated throughout the network | |||
This process employs structures referred to as conflict-free replicated counters | in options added to RPL link-local control messages: DODAG Information | |||
(CFRCs). | Objects (DIOs) and DODAG Information Solicitations (DISs). Upon | |||
They are stored and modified independently by each node and are disseminated thr | reception of such an option from its neighbor, a node merges the | |||
oughout the network in options added to RPL link-local control messages: DODAG I | received counter with its local one, thereby obtaining a new content | |||
nformation Objects (DIOs) and DODAG Information Solicitations (DISs). | for its local counter.</t> | |||
Upon reception of such an option from its neighbor, a node merges the received c | <t>The merging operation is idempotent, commutative, and associative. | |||
ounter with its local one, thereby obtaining a new content for its local counter | Moreover, all possible counter values are partially ordered. This | |||
.</t> | enables ensuring eventual consistency of the counters across all | |||
nodes, irrespective of the particular sequence of merges, shape of the | ||||
<t>The merging operation is idempotent, commutative, and associative. | DODAG, or general network topology. In effect, as long as the network | |||
Moreover, all possible counter values are partially ordered. | is connected, all nodes will be able to arrive at the same conclusion | |||
This enables ensuring eventual consistency of the counters across all nodes, irr | regarding the DODAG root, in particular when no two Sentinels | |||
espective of the particular sequence of merges, shape of the DODAG, or general n | have a direct link with each other.</t> | |||
etwork topology. | <t>Each node in RNFD maintains two CFRCs for a DODAG:</t> | |||
In effect, as long as the network is connected, all nodes will be able to arrive | <dl> | |||
at the same conclusion regarding the DODAG root, in particular, even when no tw | <dt>PositiveCFRC:</dt><dd>Counts Sentinels that consider or have | |||
o Sentinels have a direct link with each other.</t> | previously considered the root node as alive in the current DODAG | |||
Version.</dd> | ||||
<t>Each node in RNFD maintains two CFRCs for a DODAG:</t> | <dt>NegativeCFRC:</dt><dd>Counts Sentinels that consider or have | |||
previously considered the root node as dead in the current DODAG | ||||
<t><list style="symbols"> | Version.</dd> | |||
<t>PositiveCFRC, counting Sentinels that consider or have previously considere | </dl> | |||
d the root node as alive in the current DODAG Version,</t> | <t>The PositiveCFRC is always greater than or equal to the NegativeCFRC | |||
<t>NegativeCFRC, counting Sentinels that consider or have previously considere | in | |||
d the root node as dead in the current DODAG Version.</t> | terms of the partial order defined for the counters. The difference | |||
</list></t> | between the value of the PositiveCFRC and the value of the NegativeCFRC | |||
is | ||||
<t>PositiveCFRC is always greater than or equal to the NegativeCFRC in terms of | thus nonnegative and estimates the number of Sentinels that still | |||
the partial order defined for the counters. | consider the DODAG root node as alive.</t> | |||
The difference between the value of PositiveCFRC and the value of NegativeCFRC i | </section> | |||
s thus nonnegative and estimates the number of Sentinels that still consider the | </section> | |||
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 RP | ||||
L 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 count | ||||
ed 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 c | ||||
ounted 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 coun | ||||
ts 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 count | ||||
s 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 grea | ||||
ter 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()) al | ||||
ways equals infinity().</t> | ||||
<t>There are many algorithmic structures that can provide the aforementioned pro | ||||
perties 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="the-rnfd-option" numbered="true" toc="default"> | |||
<section anchor="msg_format" title="Format of the Option"> | <name>The RNFD Option</name> | |||
<t>RNFD state synchronization between nodes takes place through the RNFD | ||||
Option. It is a new type of RPL Control Message Option that is carried | ||||
in link-local RPL control messages, notably DIOs and DISs. Its main | ||||
task is allowing the receivers to merge their two CFRCs with the | ||||
sender's CFRCs.</t> | ||||
<section anchor="general-cfrc-requirements" numbered="true" toc="default"> | ||||
<name>General CFRC Requirements</name> | ||||
<t>CFRCs in RNFD <bcp14>MUST</bcp14> support the following operations:</ | ||||
t> | ||||
<dl newline="true" spacing="normal"> | ||||
<dt>value(c)</dt> | ||||
<dd>Returns a nonnegative integer value corresponding to the number | ||||
of nodes counted by a given CFRC, c.</dd> | ||||
<dt>zero()</dt> | ||||
<dd>Returns a CFRC that counts no nodes, that is, has its value | ||||
equal to 0.</dd> | ||||
<dt>self()</dt> | ||||
<dd>Returns a CFRC that counts only the node executing the operation.< | ||||
/dd> | ||||
<dt>infinity()</dt> | ||||
<dd>Returns a CFRC that counts all possible nodes and represents a | ||||
special value, infinity.</dd> | ||||
<dt>merge(c1, c2)</dt> | ||||
<dd>Returns a CFRC that is a union of c1 and c2 (i.e., counts all | ||||
nodes that are counted by either c1, c2, or both c1 and c2).</dd> | ||||
<dt>compare(c1, c2)</dt> | ||||
<dd>Returns the result of comparing c1 to c2.</dd> | ||||
<dt>saturated(c)</dt> | ||||
<dd>Returns TRUE if a given CFRC, c, is saturated (i.e., no more new | ||||
nodes should be counted by it); returns FALSE otherwise.</dd> | ||||
</dl> | ||||
<t>The partial ordering of CFRCs implies that the result of compare(c1, | ||||
c2) can be either:</t> | ||||
<ul spacing="normal"> | ||||
<li> | ||||
<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> | ||||
</li> | ||||
<li> | ||||
<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> | ||||
</li> | ||||
<li> | ||||
<t>equal, if c1 and c2 are the same (i.e., they count the same nodes | ||||
); or</t> | ||||
</li> | ||||
<li> | ||||
<t>incomparable, otherwise.</t> | ||||
</li> | ||||
</ul> | ||||
<t>In particular, zero() is smaller than all other values, and infinity( | ||||
) is greater than any other value.</t> | ||||
<t>The properties of merging can be formalized as follows for | ||||
any c1, c2, and c3:</t> | ||||
<ul spacing="normal"> | ||||
<li> | ||||
<t>idempotence: c1 = merge(c1, c1);</t> | ||||
</li> | ||||
<li> | ||||
<t>commutativity: merge(c1, c2) = merge(c2, c1); and</t> | ||||
</li> | ||||
<li> | ||||
<t>associativity: merge(c1, merge(c2, c3)) = merge(merge(c1, c2), c3 | ||||
).</t> | ||||
</li> | ||||
</ul> | ||||
<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" format="default"/>.</t> | ||||
</section> | ||||
<t>The format of the RNFD Option conforms to the generic format of RPL Control M | <section anchor="msg_format" numbered="true" toc="default"> | |||
essage Options:</t> | <name>Format of the Option</name> | |||
<figure title="Format of the RNFD Option" anchor="fig_opt_format"><artwork><![CD | <t>The format of the RNFD Option conforms to the generic format of RPL C | |||
ATA[ | ontrol Message Options (see <xref target="RFC6550" sectionFormat="of" section="6 | |||
.7.1" format="default"/>):</t> | ||||
<figure anchor="fig_opt_format"> | ||||
<name>Format of the RNFD Option</name> | ||||
<artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
0 1 2 3 | 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 | 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 | | | | Type = 0x0E | Option Length | | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | |||
| | | | | | |||
+ + | + + | |||
| PosCFRC, NegCFRC (Variable Length*) | | | PosCFRC, NegCFRC (Variable Length*) | | |||
. . | . . | |||
. . | . . | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+]]></artwork> | |||
</figure> | ||||
The '*' denotes that, if present, the fields have equal lengths. | <t>The "*" denotes that, if present, the fields have equal lengths.</t> | |||
]]></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 t | ||||
he Option Type and Option Length fields. Its value MUST be even. A value of 0 de | ||||
notes 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 PositiveCF | ||||
RC and NegativeCFRC, respectively.</t> | ||||
</list></t> | ||||
<t>The length of the arrays constituting the PosCFRC and NegCFRC fields is the s | ||||
ame and is derived from Option Length as follows. | ||||
The value of Option Length is divided by 2 to obtain the number of octets each o | ||||
f 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 th | ||||
an the upper bound is assumed. | ||||
For example, if the value of Option Length is 16, then each array occupies 8 oct | ||||
ets, and its actual bit length is 61, as this is the largest prime number less t | ||||
han 64.</t> | ||||
<t>Furthermore, for any bit equal to 1 in the NegCFRC, the bit with the same ind | ||||
ex 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 arra | ||||
ys) 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 foll | ||||
ows:</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 cor | ||||
responding 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 RNFD_CFRC_SATURATION_THRESHOLD 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 wi | ||||
th RPL and the overall protocol stack. | ||||
These interactions are described next and can be realized, for instance, by mean | ||||
s of event triggers.</t> | ||||
<section anchor="rnfd_behavior_roles" title="Joining a DODAG Version and Changin | ||||
g 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 sw | ||||
itch from Acceptor to Sentinel to be possible, <spanx style="emph">all</spanx> o | ||||
f 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 th | ||||
e node is properly accounted for. | ||||
More specifically, when changing its role from Acceptor to Sentinel, the node MU | ||||
ST add itself to its PositiveCFRC as follows. | ||||
It MUST generate a new CFRC value, selfc = self(), and MUST replace its Positive | ||||
CFRC, 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 N | ||||
egativeCFRC;</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 i | ||||
ts NegativeCFRC, denoted oldnc, with newnc = merge(oldnc, selfc), where selfc is | ||||
the counter generated with self() when the node last added itself to its Positi | ||||
veCFRC.</t> | ||||
</list></t> | ||||
</section> | ||||
<section anchor="rnfd_behavior_detection" title="Detecting and Verifying Problem | ||||
s with the DODAG Root"> | ||||
<t>Only nodes that are Sentinels take active part in detecting crashes of the DO | ||||
DAG Root; Acceptors just disseminate their observations, reflected in the CFRCs. | ||||
</t> | ||||
<t>The DODAG root monitoring SHOULD be based on both internal inputs, notably th | ||||
e values of CFRCs and LORS, and external inputs, such as triggers from RPL and o | ||||
ther 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 releva | ||||
nt to the routing adjacency maintenance mechanisms on which RPL relies, such as | ||||
Layer 2 triggers <xref target="RFC5184"/> or the Neighbor Unreachability Detecti | ||||
on <xref target="RFC4861"/> mechanism. | ||||
In addition, depending on the underlying protocol stack, there may be other pote | ||||
ntial sources of such events, for instance, neighbor communication overhearing. | ||||
In any case, only events concerning the DODAG root need be monitored. | ||||
For example, RNFD can conclude that there may be problems with the DODAG root if | ||||
it observes a lack of multiple consecutive L2 acknowledgments for packets trans | ||||
mitted 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 d | ||||
etecting potential problems even when normally it would not exchange packets ove | ||||
r the link with the DODAG root during some period. | ||||
In particular, RNFD SHOULD conclude that there may be problems with the DODAG ro | ||||
ot, when the fraction value(NegativeCFRC)/value(PositiveCFRC) has grown by at le | ||||
ast 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 externa | ||||
l or internal inputs — that there may be problems with the link with the DODAG r | ||||
oot, 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 a | ||||
dditional opportunity to verify whether the link with the DODAG root is indeed d | ||||
own. | ||||
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”, otherwis | ||||
e. | ||||
The verification can be performed, for example, by transmitting RPL DIS or ICMPv | ||||
6 Echo Request messages to the DODAG root’s link-local IPv6 address and expectin | ||||
g 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 simultan | ||||
eous probes, for instance, random backoffs can be employed to this end. | ||||
It is RECOMMENDED that the “SUSPECTED DOWN” value of LORS is attained and verifi | ||||
cation 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 CFR | ||||
C values. | ||||
In contrast, for direct observations, such as missing L2 acknowledgments, the ve | ||||
rification MAY be skipped, with the node’s LORS effectively changing from “UP” d | ||||
irectly to “LOCALLY DOWN”.</t> | ||||
<t>For consistency with RPL, when detecting potential problems with the DODAG ro | ||||
ot, RNFD also must make use of RPL’s independent knowledge. | ||||
More specifically, a node MUST switch its LORS from “UP” or “SUSPECTED DOWN” dir | ||||
ectly to “LOCALLY DOWN” if a neighbor entry for the DODAG root is removed from R | ||||
PL’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 ma | ||||
ke 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 Accepto | ||||
r to Sentinel all hold (see <xref target="rnfd_behavior_roles"/>).</t> | ||||
<t>To appropriately account for the node’s observations on the state of the DODA | ||||
G root, the aforementioned LORS transitions are accompanied by changes to the no | ||||
de’s local CFRCs as follows. | ||||
Transitions 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 no | ||||
de MUST add itself to its NegativeCFRC, as explained previously. | ||||
By symmetry, if there is a transition from “LOCALLY DOWN” to “UP”, the node MUST | ||||
add itself to its PositiveCFRC, again, as explained previously.</t> | ||||
<t>Such changes to a node’s local CFRCs, if performed repeatedly due to incorrec | ||||
t decisions regarding the status of the node’s link with the DODAG root, may lea | ||||
d to those CFRCs becoming saturated. | ||||
An implementation should thus try to minimize false-positive transitions from “U | ||||
P” and “SUSPECTED DOWN” to “LOCALLY DOWN”. | ||||
The exact approach depends on the specific solutions employed for assessing the | ||||
state of a link. | ||||
For instance, one can utilize additional mechanisms for increasing the confidenc | ||||
e of individual decisions, such as during the aforementioned verification in the | ||||
“SUSPECTED DOWN” state, or can limit the number of transitions per node, possib | ||||
ly in an adaptive fashion.</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(ol | ||||
dpc, recvpc) and newnc = merge(oldnc, recvnc), where oldpc and oldnc are the val | ||||
ues of the node’s PositiveCFRC and NegativeCFRC before the update, while recvpc | ||||
and recvnc are the received values of option fields PosCFRC and NegCFRC, respect | ||||
ively.</t> | ||||
<t>In effect, the node’s value of fraction value(NegativeCFRC)/value(PositiveCFR | ||||
C) may change. | ||||
If the fraction reaches at least RNFD_CONSENSUS_THRESHOLD (with value(PositiveCF | ||||
RC) being greater than zero), then the node consents on the DODAG root being dow | ||||
n. | ||||
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 an | ||||
d 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, wh | ||||
ich 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 original DIO Trickle timer. | ||||
In such a setting, whenever the dedicated timer fires and no DIO message contain | ||||
ing the RNFD Option has been sent to the link-local all-RPL-nodes multicast IPv6 | ||||
address since the previous firing, the node sends a DIO message containing the | ||||
RNFD Option to the address. | ||||
The minimal and maximal interval sizes of the dedicated timer SHOULD NOT be smal | ||||
ler than those of RPL’s original DIO Trickle timer. | ||||
In contrast, in the absence of the dedicated Trickle timer for RNFD, an implemen | ||||
tation SHOULD ensure that the RNFD Option is present in multicast DIO messages s | ||||
ufficiently often to quickly propagate changes to the node’s CFRCs, and notably | ||||
as soon as possible after a reset of the timer triggered by RNFD. | ||||
In the remainder of this document, we will refer to the Trickle timer utilized b | ||||
y RNFD — either the dedicated one or RPL’s original one, depending on the implem | ||||
entation — simply as “Trickle timer”. | ||||
In particular, 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 i | ||||
s disseminated in the DODAG fast. | ||||
Likewise, a node SHOULD reset its Trickle timer when any of its local CFRCs chan | ||||
ges 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 eve | ||||
r switch this role. | ||||
It MUST also monitor its LORS and local CFRCs, so that it can react to various e | ||||
vents.</t> | ||||
<t>To start with, the DODAG root MUST generate a new DODAG Version, thereby rest | ||||
arting 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 it | ||||
s crash. | ||||
It MAY also generate a new DODAG Version if fraction value(NegativeCFRC)/value(P | ||||
ositiveCFRC) approaches RNFD_CONSENSUS_THRESHOLD, so as to avoid potential inter | ||||
ruptions to routing.</t> | ||||
<t>Furthermore, the DODAG root SHOULD either generate a new DODAG Version or inc | ||||
rease 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 MUST be done at the DODAG root node; ot | ||||
her nodes MUST comply.</t> | ||||
<t>More specifically, when a non-root node joins a DODAG Version, RNFD at the no | ||||
de is initially inactive. | ||||
The node MUST NOT activate the protocol unless it receives for this DODAG Versio | ||||
n a valid RNFD Option containing some CFRCs, that is, having its Option Length f | ||||
ield positive. | ||||
In particular, if the option accompanies the message that causes the node to joi | ||||
n the DODAG Version, the protocol MUST be active from the moment of the joining. | ||||
RNFD then remains active at the node until it is explicitly deactivated or the n | ||||
ode joins a new DODAG Version. | ||||
An explicit deactivation MUST take place when the node receives an RNFD Option f | ||||
or the DODAG Version with no CFRCs, that is, having its Option Length field equa | ||||
l 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 Le | ||||
ngth field equal to zero, the protocol MUST remain deactivated for the entire ti | ||||
me 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 m | ||||
ay 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 opt | ||||
ion to the link-local all-RPL-nodes multicast IPv6 address to allow its neighbor | ||||
s 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 opt | ||||
ion with some CFRCs, as such a neighbor appears not to have learned about the de | ||||
activation of RNFD.</t> | ||||
</section> | ||||
<section anchor="rnfd_behavior_cfrc_size" title="Processing CFRCs of Incompatibl | ||||
e Lengths"> | ||||
<t>The merge() and compare() operations on CFRCs require both arguments to be co | ||||
mpatible, 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 deactivat | ||||
ing the protocol (see <xref target="rnfd_behavior_deactivation"/>), but also in | ||||
mechanisms for dynamic adjustments of CFRCs, which aim to enable deployment-spec | ||||
ific 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 NegativeC | ||||
FRC. | ||||
Assuming that it has RNFD active and that fields PosCFRC and NegCFRC in the opti | ||||
on 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 no | ||||
de’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 n | ||||
ode’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 n | ||||
ode’s local PositiveCFRC and NegativeCFRC, then the node MUST extend the bit len | ||||
gth of its local CFRCs to be equal to that in the option and set the CFRCs as fo | ||||
llows:</t> | ||||
<t><list style="symbols"> | ||||
<t>If the node’s LORS is “GLOBALLY DOWN”, then both its local CFRCs MUST be se | ||||
t to infinity().</t> | ||||
<t>Otherwise, they both MUST be set to zero(), and the node MUST account for i | ||||
tself 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, ag | ||||
ain, 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_cons | ||||
ensus"/>) and MAY reset its Trickle timer.</t> | ||||
</list></t> | ||||
<t>In contrast, if the node is unable to extend its local CFRCs, for example, be | ||||
cause it lacks resources, then it MUST stop participating in RNFD, that is, unti | ||||
l it joins a new DODAG Version, it MUST NOT send the RNFD Option and MUST ignore | ||||
this option in received messages.</t> | ||||
<t>A DODAG root node can be requested to increase the bit length of its CFRCs ex | ||||
ternally, as part of the management policies (see <xref target="mgmnt_roles_and_ | ||||
cfrc_lens"/>). | ||||
If it cannot fulfill such a request, then it is MUST NOT stop participating in R | ||||
FND and SHOULD return an error to the requester instead. | ||||
Otherwise, since it is always Acceptor, the above rules require it to extend bot | ||||
h CFRCs to the requested length and to set them both to either zero() or infinit | ||||
y(), depending on whether its LORS is, respectively, different from or equal to | ||||
“GLOBALLY DOWN”. | ||||
In the latter case, given the earlier rules governing the root’s behavior upon r | ||||
eaching the “GLOBALLY DOWN” state (cf. <xref target="rnfd_behavior_root"/>), the | ||||
root is also bound to eventually set its CFRCs to zero() and, in addition, gene | ||||
rate a new DODAG Version and change its LORS back to “UP”. | ||||
Therefore, these two steps can be optimized into one, meaning that effectively, | ||||
irrespective of its LORS, when increasing the bit length of its CFRCs in respons | ||||
e to an external request, the root also sets the CFRCs to zero().</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 rout | ||||
ing 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 <xre | ||||
f target="rnfd_behavior_root"/>).</t> | ||||
<t>Depending on the implementation, RNFD may cause RPL’s DIO Trickle timer res | ||||
ets (see <xref target="rnfd_behavior_consensus"/>, <xref target="rnfd_behavior_d | ||||
eactivation"/>, and <xref target="rnfd_behavior_cfrc_size"/>).</t> | ||||
<t>RNFD monitors events relevant to routing adjacency maintenance as well as t | ||||
hose 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 me | ||||
ssages (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_CONSENSUS_THRESHOLD'> | ||||
A threshold concerning the value of fraction value(NegativeCFRC)/value(Positiv | ||||
eCFRC). 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_cons | ||||
ensus"/>). The default value of the threshold is 0.51, which indicates that a ma | ||||
jority of Sentinels must consider the root to be down to reach the consensus. In | ||||
general, the higher the value the longer the detection period but the lower the | ||||
risk of false positives.</t> | ||||
<t hangText='RNFD_SUSPICION_GROWTH_THRESHOLD'> | ||||
A threshold concerning the value of fraction value(NegativeCFRC)/value(Positiv | ||||
eCFRC). If the value at a Sentinel node grows at least by this threshold since t | ||||
he time the node’s LORS was last set to “UP”, then the node’s LORS is set to “SU | ||||
SPECTED DOWN” or “LOCALLY DOWN”, which implies that the node starts suspecting o | ||||
r assumes a crash of the DODAG root (see <xref target="rnfd_behavior_detection"/ | ||||
>). The higher the value the longer the duration of detecting true crashes but t | ||||
he lower the risk of increased traffic due to verifying false suspicions. The de | ||||
fault value of the threshold is 0.12, which in sparse networks (up to 8 neighbor | ||||
s per node) triggers a suspicion at a Sentinel node after just one other Sentine | ||||
l starts considering the root as dead, while being gradually more conservative i | ||||
n denser networks.</t> | ||||
<t hangText='RNFD_CFRC_SATURATION_THRESHOLD'> | ||||
A threshold concerning the percentage of bits set to 1 in a CFRC, c. If the pe | ||||
rcentage for c is equal to or greater than this threshold, then saturated(c) ret | ||||
urns TRUE, which hints the DODAG root to generate a new DODAG Version or increas | ||||
e the bit length of the CFRCs (see <xref target="rnfd_behavior_root"/>). The def | ||||
ault value of the threshold is 0.63. The higher the value is, the higher the pro | ||||
bability of bit collisions, and hence the more erratic the results of function v | ||||
alue(c) may be.</t> | ||||
</list></t> | ||||
<t>The means of configuring the constants at individual nodes are outside the sc | <!-- [rfced] Section 4.2: We note that "Type" appears in Figure 2, but that it | |||
ope of this document.</t> | is defined as "Option Type" in the definition list that follows. Are any | |||
updates needed for consistency? | ||||
--> | ||||
</section> | <dl newline="false" spacing="normal"> | |||
</section> | <dt>Option Type:</dt> | |||
<section anchor="mgmnt" title="Manageability Considerations"> | <dd>0x0E</dd> | |||
<dt>Option Length:</dt> | ||||
<dd>8-bit unsigned integer. Denotes the length of the option in | ||||
octets, excluding the Option Type and Option Length fields. Its value | ||||
<bcp14>MUST</bcp14> be even. A value of 0 denotes that RNFD is | ||||
disabled in the current DODAG Version.</dd> | ||||
<dt>PosCFRC, NegCFRC:</dt> | ||||
<dd>Two variable-length, octet-aligned bit arrays carrying the | ||||
sender's PositiveCFRC and NegativeCFRC, respectively.</dd> | ||||
</dl> | ||||
<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 <bcp14>MUST</bcp14> also be equal to 1 in the PosCFRC. | ||||
Any unused bits (i.e., the bits beyond the actual bit length of each | ||||
of the arrays) <bcp14>MUST</bcp14> be equal to 0. Finally, if PosCFRC | ||||
has all its bits equal to 1, then NegCFRC <bcp14>MUST</bcp14> also | ||||
have all its bits equal to 1.</t> | ||||
<t>The CFRC operations are defined for such bit arrays of a given length | ||||
as follows:</t> | ||||
<dl newline="true" spacing="normal"> | ||||
<dt>value(c)</dt> | ||||
<dd>Returns the smallest integer value not less than -LT*ln(L0/LT), | ||||
where ln() is the natural logarithm function, L0 is the number of | ||||
bits equal to 0 in the array corresponding to c, and LT is | ||||
the bit length of the array.</dd> | ||||
<dt>zero()</dt> | ||||
<dd>Returns an array with all bits equal to 0.</dd> | ||||
<dt>self()</dt> | ||||
<dd>Returns an array with a single bit, selected uniformly at random, | ||||
equal to 1.</dd> | ||||
<dt>infinity()</dt> | ||||
<dd>Returns an array with all bits equal to 1.</dd> | ||||
<dt>merge(c1, c2)</dt> | ||||
<dd>Returns a bit array that constitutes a bitwise OR of c1 and c2. | ||||
That is, a bit in the resulting array is equal to 0 only if the same | ||||
bit is equal to 0 in both c1 and c2.</dd> | ||||
<dt>compare(c1, c2)</dt> | ||||
<dd><t>Returns:</t> | ||||
<t>RNFD is largely self-managed, with the exception of protocol activation and d | <ul spacing="normal"> | |||
eactivation, as well as node role assignment and the related CFRC size adjustmen | <li> | |||
t, for which only the aforementioned mechanisms are defined, so as to enable ado | <t>equal, if each bit of c1 is equal to the corresponding bit of | |||
pting deployment-specific policies. | c2;</t> | |||
This section discusses the manageability issues.</t> | </li> | |||
<li> | ||||
<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> | ||||
</li> | ||||
<li> | ||||
<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; or</t> | ||||
</li> | ||||
<li> | ||||
<t>incomparable, otherwise.</t> | ||||
</li> | ||||
</ul> | ||||
</dd> | ||||
<dt>saturated(c)</dt> | ||||
<dd>Returns TRUE if more than RNFD_CFRC_SATURATION_THRESHOLD of the | ||||
bits in c are equal to 1; returns FALSE otherwise.</dd> | ||||
</dl> | ||||
</section> | ||||
</section> | ||||
<section anchor="mgmnt_roles_and_cfrc_lens" title="Role Assignment and CFRC Size | <section anchor="rnfd_behavior" numbered="true" toc="default"> | |||
Adjustment"> | <name>RPL Router Behavior</name> | |||
<t>Although RNFD operates largely independently of RPL, it does need to | ||||
interact with RPL and the overall protocol stack. These interactions | ||||
are described next and can be realized, for instance, by means of event | ||||
triggers.</t> | ||||
<section anchor="rnfd_behavior_roles" numbered="true" toc="default"> | ||||
<name>Joining a DODAG Version and Changing the RNFD Role</name> | ||||
<t>Whenever RPL is running at a node and joins a DODAG Version, RNFD (if | ||||
active) <bcp14>MUST</bcp14> assume the role of Acceptor for the node. | ||||
Accordingly, it <bcp14>MUST</bcp14> set its LORS to "UP" and its | ||||
PositiveCFRC and NegativeCFRC to zero().</t> | ||||
<t>One approach to node role and CFRC size selection is to manually designate sp | <t>The role may then change between Acceptor and Sentinel at any time. | |||
ecific nodes as Sentinels in RNFD, assuming that they will have chances to satis | However, while a switch from Sentinel to Acceptor has no | |||
fy the necessary conditions for attaining this role (see <xref target="rnfd_beha | preconditions, in order for a switch from Acceptor to Sentinel to be pos | |||
vior_roles"/>), and fixing the CFRC bit length to accommodate these nodes.</t> | sible, | |||
<em>all</em> of the following conditions <bcp14>MUST</bcp14> hold:</t> | ||||
<ol spacing="normal" type="1"><li> | ||||
<t>LORS is "UP";</t> | ||||
</li> | ||||
<li> | ||||
<t>saturated(PositiveCFRC) is FALSE;</t> | ||||
</li> | ||||
<li> | ||||
<t>a neighbor entry for the DODAG root is present in RPL's DODAG par | ||||
ent set; and</t> | ||||
</li> | ||||
<li> | ||||
<t>the neighbor is considered reachable via its link-local IPv6 addr | ||||
ess.</t> | ||||
</li> | ||||
</ol> | ||||
<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 | ||||
<bcp14>MUST</bcp14> add itself to its PositiveCFRC as follows. It | ||||
<bcp14>MUST</bcp14> generate a new CFRC value, selfc = self(), and | ||||
it <bcp14>MUST</bcp14> replace its PositiveCFRC, denoted oldpc, with | ||||
newpc = merge(oldpc, selfc). In contrast, the effects of a switch | ||||
from Sentinel to Acceptor vary depending on the node's value of LORS | ||||
before the switch:</t> | ||||
<t>Another approach is to automate the selection process: in principle, any node | <ul spacing="normal"> | |||
satisfying the necessary conditions for becoming Sentinel (see <xref target="rn | <li> | |||
fd_behavior_roles"/>) can attain this role. | <t>For "GLOBALLY DOWN", the node <bcp14>MUST NOT</bcp14> modify | |||
However, in networks where the DODAG root node has many neighbors, this approach | its LORS, PositiveCFRC, and NegativeCFRC.</t> | |||
may lead to saturated(PositiveCFRC) quickly becoming TRUE, which — without addi | </li> | |||
tional measures — may degrade RNFD’s performance. | <li> | |||
This issue can be handled with a probabilistic solution: if PositiveCFRC becomes | <t>For "LOCALLY DOWN", the node <bcp14>MUST</bcp14> set its LORS | |||
saturated with little or no increase in NegativeCFRC, then a new DODAG Version | to "UP" but <bcp14>MUST NOT</bcp14> modify its PositiveCFRC and | |||
can be issued and a node satisfying the necessary conditions can become Sentinel | NegativeCFRC.</t> | |||
in this version only with probability 1/2. | </li> | |||
This process can be continued with the probability being halved in each new DODA | <li> | |||
G Version until PositiveCFRC is no longer quickly saturated. | <t>For "UP" and "SUSPECTED DOWN", the node <bcp14>MUST</bcp14> set | |||
Another solution is to increase, potentially multiple times the bit length of th | its LORS to "UP" and <bcp14>MUST NOT</bcp14> modify its PositiveCFRC | |||
e CFRCs by the DODAG root if PositiveCFRC becomes saturated with little or no gr | , | |||
owth in NegativeCFRC, which does not require issuing a new DODAG Version but len | but it <bcp14>MUST</bcp14> add itself to NegativeCFRC. That is, it < | |||
gthens the RNFD Option. | bcp14>MUST</bcp14> | |||
In this way, again, a sufficient bit length can be dynamically discovered or the | replace its NegativeCFRC, denoted oldnc, with newnc = merge(oldnc, | |||
root can conclude that a given bit length is excessive for (some) nodes and res | selfc), where selfc is the counter generated with self() when the | |||
ort to the previous solution. | node last added itself to its PositiveCFRC.</t> | |||
Increasing the bit length can be done, for instance, by doubling it, respecting | </li> | |||
the condition that it has to be a prime number (see <xref target="msg_format"/>) | </ul> | |||
.</t> | </section> | |||
<section anchor="rnfd_behavior_detection" numbered="true" toc="default"> | ||||
<name>Detecting and Verifying Problems with the DODAG Root</name> | ||||
<t>Only nodes that are Sentinels take an active part in detecting crashe | ||||
s | ||||
of the DODAG root; Acceptors just disseminate their observations, | ||||
reflected in the CFRCs.</t> | ||||
<t>In either of the solutions, Sentinel nodes should preferably be stable themse | <t>The DODAG root monitoring <bcp14>SHOULD</bcp14> be based on both | |||
lves and have stable links to the DODAG root. | internal inputs, notably the values of CFRCs and LORS, and external | |||
Otherwise, they may often exhibit LORS transitions between “UP” and “LOCALLY DOW | inputs, such as triggers from RPL and other protocols. External input | |||
N” or switches between Acceptor and Sentinel roles, which gradually saturates CF | monitoring <bcp14>SHOULD</bcp14> be performed preferably in a reactive | |||
RCs. | fashion, also independently of RPL, and at both the data plane and contr | |||
Although as a mitigation the number of such transitions and switches per node MA | ol | |||
Y be limited, having Sentinels stable SHOULD be preferred.</t> | plane. In particular, it is <bcp14>RECOMMENDED</bcp14> that RNFD be | |||
directly notified of events relevant to the routing adjacency | ||||
maintenance mechanisms on which RPL relies, such as Layer 2 (L2) trigger | ||||
s | ||||
<xref target="RFC5184" format="default"/> or the Neighbor | ||||
Unreachability Detection <xref target="RFC4861" format="default"/> | ||||
mechanism. In addition, depending on the underlying protocol stack, | ||||
there may be other potential sources of such events, for instance, | ||||
neighbor communication overhearing. In any case, only events | ||||
concerning the DODAG root need to be monitored. For example, RNFD can | ||||
conclude that there may be problems with the DODAG root if it observes | ||||
a lack of multiple consecutive L2 acknowledgments for packets | ||||
transmitted by the node via the link to the DODAG root. Internally, in | ||||
turn, | ||||
it is <bcp14>RECOMMENDED</bcp14> that RNFD take action | ||||
whenever there is a change to its local CFRCs, so that a node can have | ||||
a chance to participate in detecting potential problems even when | ||||
normally it would not exchange packets over the link with the DODAG | ||||
root during some period. In particular, RNFD <bcp14>SHOULD</bcp14> | ||||
conclude that there may be problems with the DODAG root when the | ||||
fraction value(NegativeCFRC)/value(PositiveCFRC) has grown by at least | ||||
RNFD_SUSPICION_GROWTH_THRESHOLD since the node last set its LORS to | ||||
"UP".</t> | ||||
</section> | <t>Whenever, having its LORS set to "UP", RNFD concludes (based on either | |||
<section anchor="mgmnt_virt_dodag_roots" title="Virtual DODAG Roots"> | external or internal inputs) that there may be problems with the | |||
link with the DODAG root, it <bcp14>MUST</bcp14> set its LORS either to "SUSPECT | ||||
ED | ||||
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 <bcp14>MUST</bcp14> set its LORS to either "UP", if | ||||
the link has been confirmed not to be down, or "LOCALLY DOWN", | ||||
otherwise. The verification can be performed, for example, by | ||||
transmitting RPL DIS or ICMPv6 Echo Request messages to the DODAG | ||||
root's link-local IPv6 address and expecting replies confirming that | ||||
the root is up and reachable through the link. Care should be taken | ||||
not to overload the DODAG root with traffic due to simultaneous | ||||
probes, for instance, random backoffs can be employed to this end. It | ||||
is <bcp14>RECOMMENDED</bcp14> that the "SUSPECTED DOWN" value of LORS | ||||
be attained and verification take place if RNFD's conclusion on the | ||||
state of the DODAG root is based only on indirect observations, for | ||||
example, the aforementioned growth of the CFRC values. In contrast, | ||||
for direct observations, such as missing L2 acknowledgments, the | ||||
verification <bcp14>MAY</bcp14> be skipped, with the node's LORS | ||||
effectively changing from "UP" directly to "LOCALLY DOWN".</t> | ||||
<t>For consistency with RPL, when detecting potential problems with | ||||
the DODAG root, RNFD also must make use of RPL's independent | ||||
knowledge. More specifically, a node <bcp14>MUST</bcp14> switch its | ||||
LORS from "UP" or "SUSPECTED DOWN" directly to "LOCALLY DOWN" if a | ||||
neighbor entry for the DODAG root is removed from RPL's DODAG parent | ||||
set or the neighbor ceases to be considered reachable via its | ||||
link-local IPv6 address.</t> | ||||
<t>RPL allows a DODAG to have a so-called virtual root, that is, a collection of | <t>Finally, while having its LORS already equal to "LOCALLY DOWN", a | |||
nodes coordinating to act as a single root of the DODAG. | node may make an observation confirming that its link with the DODAG | |||
The details of the coordination process are left open in the specification <xref | root is actually up. In such a case, it <bcp14>SHOULD</bcp14> set its | |||
target="RFC6550"/> but, from RNFD’s perspective, two possible realizations are | LORS back to "UP" but <bcp14>MUST NOT</bcp14> do this before | |||
worth consideration:</t> | conditions 2-4 in <xref | |||
target="rnfd_behavior_roles" format="default"/>, which are necessary for | ||||
a node | ||||
to change its role from Acceptor to Sentinel, all hold.</t> | ||||
<t><list style="symbols"> | <t>To appropriately account for the node's observations on the state | |||
<t>Just a single (primary) node of the nodes comprising the virtual root acts | of the DODAG root, the aforementioned LORS transitions are accompanied | |||
as the actual root of the DODAG. Only when this node fails, does another (backup | by changes to the node's local CFRCs as follows. Transitions between | |||
) node take over. As a result, at any time, at most one of the nodes comprising | "UP" and "SUSPECTED DOWN" do not affect either of the two CFRCs. In con | |||
the virtual root is the actual root.</t> | trast, during | |||
<t>More than one of the nodes comprising the virtual root act as actual roots | a switch from "UP" or "SUSPECTED DOWN" to "LOCALLY DOWN", the | |||
of the DODAG, all advertising the same Rank in the DODAG. When some of the nodes | node <bcp14>MUST</bcp14> add itself to its NegativeCFRC, as explained | |||
fail, the other nodes may or may not react in any specific way. In other words, | previously. By symmetry, if there is a transition from "LOCALLY DOWN" | |||
at any time, more than one node can be the actual root.</t> | to "UP", the node <bcp14>MUST</bcp14> add itself to its PositiveCFRC, | |||
</list></t> | as explained previously.</t> | |||
<t>Such changes to a node's local CFRCs, if performed repeatedly due | ||||
to incorrect decisions regarding the status of the node's link with | ||||
the DODAG root, may lead to those CFRCs becoming saturated. An | ||||
implementation should thus try to minimize false-positive transitions | ||||
from "UP" and "SUSPECTED DOWN" to "LOCALLY DOWN". The exact approach | ||||
depends on the specific solutions employed for assessing the state of | ||||
a link. For instance, one can utilize additional mechanisms for | ||||
increasing the confidence of individual decisions, such as during the | ||||
aforementioned verification in the "SUSPECTED DOWN" state, or can | ||||
limit the number of transitions per node, possibly in an adaptive | ||||
fashion.</t> | ||||
</section> | ||||
<t>In the first realization, RNFD’s operation is largely unaffected. | <section anchor="rnfd_behavior_consensus" numbered="true" toc="default"> | |||
The necessary conditions for a node to become Sentinel (<xref target="rnfd_behav | <name>Disseminating Observations and Reaching Agreement</name> | |||
ior_roles"/>) guarantee that only the current primary root node is monitored by | <t>Nodes disseminate their observations by exchanging CFRCs in the | |||
the protocol. | RNFD Options embedded in link-local RPL control messages, notably DIOs | |||
This SHOULD be taken into account in the policies for node role assignment, CFRC | and DISs. When processing such a received option, a node (acting as a | |||
size selection, and, possibly, the setting of the two thresholds (<xref target= | Sentinel or Acceptor) <bcp14>MUST</bcp14> update its PositiveCFRC and | |||
"rnfd_behavior_constants"/>). | NegativeCFRC to newpc = merge(oldpc, recvpc) and newnc = | |||
Moreover, when a new primary has been elected, to avoid polluting CFRCs with obs | merge(oldnc, recvnc), respectively. Here, oldpc and oldnc are the values | |||
ervations on the previous primary, a new DODAG Version MUST be issued.</t> | 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 the fraction | ||||
value(NegativeCFRC)/value(PositiveCFRC) may change. If the fraction | ||||
reaches at least RNFD_CONSENSUS_THRESHOLD (with value(PositiveCFRC) | ||||
being greater than zero), then the node consents on the DODAG root | ||||
being down. Accordingly, it <bcp14>MUST</bcp14> change its LORS to | ||||
"GLOBALLY DOWN" and set its PositiveCFRC and NegativeCFRC both to | ||||
infinity().</t> | ||||
<t>The "GLOBALLY DOWN" value of LORS is terminal; the node <bcp14>MUST | ||||
NOT</bcp14> change it and <bcp14>MUST NOT</bcp14> modify its CFRCs | ||||
until it joins a new DODAG Version. With this value of LORS, RNFD at | ||||
the node <bcp14>MUST</bcp14> also prevent RPL from having any DODAG | ||||
parent and advertising any Rank other than INFINITE_RANK.</t> | ||||
<t>Since the RNFD Option is embedded, among others, in RPL DIO control | ||||
messages, updates to a node's CFRCs may affect the sending schedule of | ||||
these messages, which is driven by the DIO Trickle timer <xref | ||||
target="RFC6206" format="default"/>. It is <bcp14>RECOMMENDED</bcp14> | ||||
to use a dedicated Trickle timer for RNFD that is different from RPL's | ||||
original DIO Trickle timer. In such a setting, whenever the dedicated | ||||
timer fires and no DIO message containing the RNFD Option has been | ||||
sent to the link-local all-RPL-nodes multicast IPv6 address since the | ||||
previous firing, the node sends a DIO message containing the RNFD | ||||
Option to the address. The minimal and maximal interval sizes of the | ||||
dedicated timer <bcp14>SHOULD NOT</bcp14> be smaller than those of | ||||
RPL's original DIO Trickle timer. In contrast, in the absence of the | ||||
dedicated Trickle timer for RNFD, an implementation | ||||
<bcp14>SHOULD</bcp14> ensure that the RNFD Option is present in | ||||
multicast DIO messages sufficiently often to quickly propagate changes | ||||
to the node's CFRCs and, notably, as soon as possible after a reset of | ||||
the timer triggered by RNFD. In the remainder of this document, we | ||||
will refer to the Trickle timer utilized by RNFD (either the | ||||
dedicated one or RPL's original one, depending on the implementation) | ||||
simply as "Trickle timer". In particular, a node <bcp14>MUST</bcp14> | ||||
reset its Trickle timer when it changes its LORS to "GLOBALLY DOWN", | ||||
so that information about the detected crash of the DODAG root is | ||||
disseminated in the DODAG fast. Likewise, a node | ||||
<bcp14>SHOULD</bcp14> reset its Trickle timer when any of its local | ||||
CFRCs change significantly.</t> | ||||
</section> | ||||
<t>In the second realization, the fact that the virtual root consists of multipl | <section anchor="rnfd_behavior_root" numbered="true" toc="default"> | |||
e nodes is transparent to RNFD. | <name>DODAG Root's Behavior</name> | |||
Therefore, employing RNFD is such a setting can be beneficial only if the nodes | <t>The DODAG root node <bcp14>MUST</bcp14> assume the role of Acceptor | |||
comprising the virtual root may suffer from correlated crashes, for instance, du | in RNFD and <bcp14>MUST NOT</bcp14> ever switch this role. It | |||
e to global power outages.</t> | <bcp14>MUST</bcp14> also monitor its LORS and local CFRCs, so that it | |||
can react to various events.</t> | ||||
<t>To start with, the DODAG root <bcp14>MUST</bcp14> generate a new | ||||
DODAG Version, thereby restarting the protocol, if it changes its LORS | ||||
to "GLOBALLY DOWN", which may happen when the root has restarted after | ||||
a crash or the nodes have falsely detected its crash. It | ||||
<bcp14>MAY</bcp14> also generate a new DODAG Version if the fraction | ||||
value(NegativeCFRC)/value(PositiveCFRC) approaches | ||||
RNFD_CONSENSUS_THRESHOLD, so as to avoid potential interruptions to | ||||
routing.</t> | ||||
<t>Furthermore, the DODAG root <bcp14>SHOULD</bcp14> either generate a | ||||
new DODAG Version or increase the bit length of its CFRCs if | ||||
saturated(PositiveCFRC) becomes TRUE. This is a self-regulation | ||||
mechanism that helps adjust the CFRCs to a potentially large number of | ||||
Sentinels (see <xref target="mgmnt_roles_and_cfrc_lens" | ||||
format="default"/>).</t> | ||||
<t>In general, issuing a new DODAG Version effectively restarts RNFD. | ||||
Thus, the DODAG root <bcp14>MAY</bcp14> also perform this operation in | ||||
other situations.</t> | ||||
</section> | ||||
</section> | <section anchor="rnfd_behavior_deactivation" numbered="true" toc="default" | |||
<section anchor="mgmnt_monitoring" title="Monitoring"> | > | |||
<name>Activating and Deactivating the Protocol on Demand</name> | ||||
<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 <bcp14>MUST</bcp14> be done at the DODAG | ||||
root node; other nodes <bcp14>MUST</bcp14> comply.</t> | ||||
<t>More specifically, when a non-root node joins a DODAG Version, RNFD | ||||
at the node is initially inactive. The node <bcp14>MUST NOT</bcp14> | ||||
activate the protocol unless it receives for this DODAG Version a | ||||
valid RNFD Option containing some CFRCs, that is, having its Option | ||||
Length field positive. In particular, if the option accompanies the | ||||
message that causes the node to join the DODAG Version, the protocol | ||||
<bcp14>MUST</bcp14> be active from the moment of the joining. RNFD | ||||
then remains active at the node until it is explicitly deactivated or | ||||
the node joins a new DODAG Version. An explicit deactivation | ||||
<bcp14>MUST</bcp14> take place when the node receives an RNFD Option | ||||
for the DODAG Version with no CFRCs, that is, having its Option Length | ||||
field equal to zero. When explicitly deactivated, RNFD <bcp14>MUST | ||||
NOT</bcp14> be reactivated unless the node joins a new DODAG Version. | ||||
In particular, when the first RNFD Option received by the node has its | ||||
Option Length field equal to zero, the protocol <bcp14>MUST</bcp14> | ||||
remain deactivated for the entire time the node belongs to the current | ||||
DODAG Version.</t> | ||||
<t>For monitoring the operation of RNFD, its implementation SHOULD provide the f | <t>When RNFD at a node is initially inactive for a DODAG Version, the | |||
ollowing information about a node:</t> | node <bcp14>MUST NOT</bcp14> attach any RNFD Option to the messages it | |||
sends (in particular, because it may not know the desired CFRC length; | ||||
see <xref target="rnfd_behavior_cfrc_size" format="default"/>). When | ||||
the protocol has been explicitly deactivated, the node | ||||
<bcp14>MAY</bcp14> also decide not to attach the option to its | ||||
outgoing messages. However, it is <bcp14>RECOMMENDED</bcp14> that it | ||||
send a sufficient number of messages with the option to the link-local | ||||
all-RPL-nodes multicast IPv6 address to allow its neighbors to learn | ||||
that RNFD has been deactivated in the current DODAG Version. In | ||||
particular, it <bcp14>MAY</bcp14> reset its Trickle timer to this end | ||||
but <bcp14>MAY</bcp14> also use some reactive mechanisms. For example, i | ||||
t <bcp14>MAY</bcp14> | ||||
reply with a unicast DIO or DIS containing the RNFD Option with no | ||||
CFRCs to a message from a neighbor that contains the option with some | ||||
CFRCs, as such a neighbor appears not to have learned about the | ||||
deactivation of RNFD.</t> | ||||
</section> | ||||
<section anchor="rnfd_behavior_cfrc_size" numbered="true" toc="default"> | ||||
<name>Processing CFRCs of Incompatible Lengths</name> | ||||
<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" format="default"/>) do not necessitate this. This | ||||
fact is made use of not only in the mechanisms for activating and | ||||
deactivating the protocol (see <xref | ||||
target="rnfd_behavior_deactivation" format="default"/>), but also in | ||||
mechanisms for dynamic adjustments of CFRCs, which aim to enable | ||||
deployment-specific policies (see <xref | ||||
target="mgmnt_roles_and_cfrc_lens" format="default"/>). A node thus | ||||
must be prepared to receive the RNFD Option with fields PosCFRC and | ||||
NegCFRC of a different bit length than the node's own PositiveCFRC and | ||||
NegativeCFRC. Assuming that it has RNFD active and that fields | ||||
PosCFRC and NegCFRC in the option have a positive length, the node | ||||
<bcp14>MUST</bcp14> react as follows.</t> | ||||
<t>If the bit length of fields PosCFRC and NegCFRC is the same as that | ||||
of the node's local PositiveCFRC and NegativeCFRC, then the node | ||||
<bcp14>MUST</bcp14> perform the merges, as detailed previously (see | ||||
<xref target="rnfd_behavior_consensus" format="default"/>).</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 | ||||
<bcp14>MUST</bcp14> ignore the option and <bcp14>MAY</bcp14> 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 | ||||
<bcp14>MUST</bcp14> extend the bit length of its local CFRCs to be | ||||
equal to that in the option and set the CFRCs as follows:</t> | ||||
<ul spacing="normal"> | ||||
<li> | ||||
<t>If the node's LORS is "GLOBALLY DOWN", then both of its local | ||||
CFRCs <bcp14>MUST</bcp14> be set to infinity().</t> | ||||
</li> | ||||
<li> | ||||
<t>Otherwise, they both <bcp14>MUST</bcp14> be set to zero(), and | ||||
the node <bcp14>MUST</bcp14> account for itself in so initialized | ||||
CFRCs. More specifically, if the node is a Sentinel, then it | ||||
<bcp14>MUST</bcp14> add itself to its PositiveCFRC, as detailed | ||||
previously. In addition, if its LORS is "LOCALLY DOWN", then it | ||||
<bcp14>MUST</bcp14> also add itself to its NegativeCFRC, as | ||||
explained previously. Finally, the node <bcp14>MUST</bcp14> | ||||
perform merges of its local CFRCs and the ones received in the | ||||
option (see <xref target="rnfd_behavior_consensus" | ||||
format="default"/>) and <bcp14>MAY</bcp14> reset its Trickle | ||||
timer.</t> | ||||
</li> | ||||
</ul> | ||||
<t>In contrast, if the node is unable to extend its local CFRCs, for | ||||
example, because it lacks resources, then it <bcp14>MUST</bcp14> stop | ||||
participating in RNFD. That is, until it joins a new DODAG Version, it | ||||
<bcp14>MUST NOT</bcp14> send the RNFD Option and <bcp14>MUST</bcp14> | ||||
ignore this option in received messages.</t> | ||||
<t>A DODAG root node can be requested to increase the bit length of | ||||
its CFRCs externally, as part of the management policies (see <xref | ||||
target="mgmnt_roles_and_cfrc_lens" format="default"/>). If it cannot | ||||
fulfill such a request, then it <bcp14>MUST NOT</bcp14> stop | ||||
participating in RNFD and <bcp14>SHOULD</bcp14> return an error to the | ||||
requester instead. Otherwise, since it is always an Acceptor, the above | ||||
rules require it to extend both CFRCs to the requested length and to | ||||
set them both to either zero() or infinity(), depending on whether its | ||||
LORS is different from or equal to "GLOBALLY DOWN", respectively. In | ||||
the latter case, given the earlier rules governing the root's behavior | ||||
upon reaching the "GLOBALLY DOWN" state (cf. <xref | ||||
target="rnfd_behavior_root" format="default"/>), the root is also | ||||
bound to eventually set its CFRCs to zero() and, in addition, generate | ||||
a new DODAG Version and change its LORS back to "UP". Therefore, | ||||
these two steps can be optimized into one, meaning that effectively, | ||||
irrespective of its LORS, when increasing the bit length of its CFRCs | ||||
in response to an external request, the root also sets the CFRCs to | ||||
zero().</t> | ||||
</section> | ||||
<section anchor="summary-of-rnfds-interactions-with-rpl" numbered="true" t | ||||
oc="default"> | ||||
<name>Summary of RNFD's Interactions with RPL</name> | ||||
<t>In summary, RNFD interacts with RPL in the following manner:</t> | ||||
<ul spacing="normal"> | ||||
<li> | ||||
<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" | ||||
format="default"/>).</t> | ||||
</li> | ||||
<li> | ||||
<t>In some scenarios, RNFD triggers RPL to issue a new DODAG | ||||
Version (see <xref target="rnfd_behavior_root" | ||||
format="default"/>).</t> | ||||
</li> | ||||
<li> | ||||
<t>Depending on the implementation, RNFD may cause RPL's DIO | ||||
Trickle timer resets (see Sections <xref target="rnfd_behavior_conse | ||||
nsus" | ||||
format="counter"/>, <xref target="rnfd_behavior_deactivation" | ||||
format="counter"/>, and <xref target="rnfd_behavior_cfrc_size" | ||||
format="counter"/>).</t> | ||||
</li> | ||||
<li> | ||||
<t>RNFD monitors events relevant to routing adjacency maintenance | ||||
as well as those affecting RPL's DODAG parent set (see Sections <xre | ||||
f | ||||
target="rnfd_behavior_roles" format="counter"/> and <xref | ||||
target="rnfd_behavior_detection" format="counter"/>).</t> | ||||
</li> | ||||
<li> | ||||
<t>Using RNFD entails embedding the RNFD Option into link-local | ||||
RPL control messages (see <xref target="msg_format" | ||||
format="default"/>).</t> | ||||
</li> | ||||
</ul> | ||||
</section> | ||||
<t><list style="symbols"> | <section anchor="rnfd_behavior_constants" numbered="true" toc="default"> | |||
<t>whether the protocol is active,</t> | <name>Summary of RNFD's Constants</name> | |||
<t>whether LORS is “GLOBALLY DOWN”,</t> | <t>The following is a summary of RNFD's constants:</t> | |||
</list></t> | ||||
<t>accompanied by the recommended monitoring parameters provided by RPL itself < | <dl newline="false" spacing="normal"> | |||
xref target="RFC6550"/>, notably the DODAG Version number and the Rank. | <dt>RNFD_CONSENSUS_THRESHOLD:</dt> | |||
To offer even finer-grained visibility into RNFD’s state at the node, the implem | <dd>A threshold concerning the value of the fraction | |||
entation MAY in addition provide:</t> | value(NegativeCFRC)/value(PositiveCFRC). If the value at a Sentinel | |||
or Acceptor node reaches the threshold, then the node's LORS is set | ||||
to "GLOBALLY DOWN", which implies that consensus has been reached on | ||||
the DODAG root node being down (see <xref | ||||
target="rnfd_behavior_consensus" format="default"/>). The default | ||||
value of the threshold is 0.51, which indicates that a majority of | ||||
Sentinels must consider the root to be down to reach the | ||||
consensus. In general, when the value is higher, the detection period | ||||
is longer, but the risk of false positives is lower. | ||||
</dd> | ||||
<dt>RNFD_SUSPICION_GROWTH_THRESHOLD:</dt> | ||||
<dd>A threshold concerning the value of the fraction | ||||
value(NegativeCFRC)/value(PositiveCFRC). If the value at a Sentinel | ||||
node grows at least by this threshold since the time the node's LORS | ||||
was last set to "UP", then the node's LORS is set to "SUSPECTED | ||||
DOWN" or "LOCALLY DOWN", which implies that the node starts | ||||
suspecting or assumes a crash of the DODAG root (see <xref | ||||
target="rnfd_behavior_detection" format="default"/>). When the | ||||
value is higher, the duration of detecting true crashes is longer, | ||||
but the risk of increased traffic due to verifying false suspicions | ||||
is lower. The default value of the threshold is 0.12, which in | ||||
sparse networks (up to 8 neighbors per node) triggers a suspicion at | ||||
a Sentinel node after just one other Sentinel starts considering the | ||||
root as dead, while being gradually more conservative in denser | ||||
networks.</dd> | ||||
<dt>RNFD_CFRC_SATURATION_THRESHOLD:</dt> | ||||
<dd>A threshold concerning the percentage of bits set to 1 in a | ||||
CFRC, c. If the percentage for c is equal to or greater than this | ||||
threshold, then saturated(c) returns TRUE, which hints the DODAG | ||||
root to generate a new DODAG Version or increase the bit length of | ||||
the CFRCs (see <xref target="rnfd_behavior_root" | ||||
format="default"/>). The default value of the threshold is 0.63. | ||||
When the value is higher, the probability of bit collisions is | ||||
higher, and the results of function value(c) may thus be more | ||||
erratic.</dd> | ||||
</dl> | ||||
<t>The means of configuring the constants at individual nodes are outsid | ||||
e the scope of this document.</t> | ||||
</section> | ||||
</section> | ||||
<section anchor="mgmnt" numbered="true" toc="default"> | ||||
<name>Manageability Considerations</name> | ||||
<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 discusses the manageability issues.</t> | ||||
<section anchor="mgmnt_roles_and_cfrc_lens" numbered="true" toc="default"> | ||||
<name>Role Assignment and CFRC Size Adjustment</name> | ||||
<t><list style="symbols"> | <t>One approach to node role and CFRC size selection is to manually | |||
<t>the assigned role (i.e., Sentinel or Acceptor),</t> | designate specific nodes as Sentinels in RNFD, assuming that they will | |||
<t>the exact value of LORS (i.e., “UP”, “SUSPECTED DOWN”, “LOCALLY DOWN”, or | have chances to satisfy the necessary conditions for attaining this | |||
“GLOBALLY DOWN”),</t> | role (see <xref target="rnfd_behavior_roles" format="default"/>), and | |||
<t>the two CFRCs (i.e., PositiveCFRC and NegativeCFRC),</t> | to fix the CFRC bit length to accommodate these nodes.</t> | |||
<t>the constants listed in <xref target="rnfd_behavior_constants"/>.</t> | ||||
</list></t> | ||||
</section> | <t>Another approach is to automate the selection process. In | |||
</section> | principle, any node satisfying the necessary conditions for becoming | |||
<section anchor="security" title="Security Considerations"> | a Sentinel (see <xref target="rnfd_behavior_roles" format="default"/>) | |||
can attain this role. However, in networks where the DODAG root node | ||||
has many neighbors, this approach may lead to saturated(PositiveCFRC) | ||||
quickly becoming TRUE, which may | ||||
degrade RNFD's performance without additional measures. This issue can | ||||
be handled with a | ||||
probabilistic solution: if PositiveCFRC becomes saturated with little | ||||
or no increase in NegativeCFRC, then a new DODAG Version can be issued, | ||||
and a node satisfying the necessary conditions can become a Sentinel in | ||||
this version only with probability 1/2. This process can be continued | ||||
with the probability being halved in each new DODAG Version until | ||||
PositiveCFRC is no longer quickly saturated. Another solution is to | ||||
increase, potentially multiple times, the bit length of the CFRCs by | ||||
the DODAG root if PositiveCFRC becomes saturated with little or no | ||||
growth in NegativeCFRC. This does not require issuing a new DODAG | ||||
Version but lengthens the RNFD Option. In this way, a | ||||
sufficient bit length can be dynamically discovered, or the root can | ||||
conclude that a given bit length is excessive for (some) nodes and | ||||
resort to the previous solution. Increasing the bit length can be | ||||
done, for instance, by doubling it, respecting the condition that it | ||||
has to be a prime number (see <xref target="msg_format" | ||||
format="default"/>).</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. As a mitigation, the number of such | ||||
transitions and switches per node <bcp14>MAY</bcp14> be limited; however | ||||
, | ||||
having Sentinels be stable <bcp14>SHOULD</bcp14> be preferred.</t> | ||||
</section> | ||||
<section anchor="mgmnt_virt_dodag_roots" numbered="true" toc="default"> | ||||
<name>Virtual DODAG Roots</name> | ||||
<t>RNFD is an extension to RPL and is thus both vulnerable to and benefits from | <t>RPL allows a DODAG to have a so-called "virtual root", that is, a | |||
the security issues and solutions described in <xref target="RFC6550"/> and <xre | collection of nodes coordinating to act as a single root of the DODAG. | |||
f target="RFC7416"/>. | The details of the coordination process are left open in | |||
Its specification in this document does not introduce new traffic patterns or ne | <xref target="RFC6550" format="default"/>, but from | |||
w messages, for which specific mitigation techniques would be required beyond wh | RNFD's perspective, two possible realizations are worth | |||
at can already be adopted for RPL.</t> | consideration:</t> | |||
<ul spacing="normal"> | ||||
<li> | ||||
<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> | ||||
</li> | ||||
<li> | ||||
<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> | ||||
</li> | ||||
</ul> | ||||
<t>In particular, RNFD depends on information exchanged in the RNFD Option. | <t>In the first realization, RNFD's operation is largely unaffected. | |||
If the contents of this option were compromised, then failure misdetection may o | The necessary conditions for a node to become a Sentinel (<xref | |||
ccur. | target="rnfd_behavior_roles" format="default"/>) guarantee that only | |||
One possibility is that the DODAG root may be falsely detected as crashed, which | the current primary root node is monitored by the protocol. This | |||
would result in an inability of the nodes to route packets, at least until a ne | <bcp14>SHOULD</bcp14> be taken into account in the policies for node | |||
w DODAG Version is issued by the root. | role assignment, CFRC size selection, and, possibly, the setting of | |||
Another possibility is that a crash of the DODAG root may not be detected by RNF | the three thresholds (<xref target="rnfd_behavior_constants" | |||
D, in which case RPL would have to rely on its own mechanisms. | format="default"/>). Moreover, when a new primary has been elected, | |||
Moreover, compromising the contents of the RNFD Option may also lead to increase | a | |||
d DIO traffic due to Trickle timer resets. | new DODAG Version <bcp14>MUST</bcp14> be issued to avoid polluting CFRCs | |||
Consequently, RNFD deployments are RECOMMENDED to use RPL security mechanisms if | with observations on the previous primary.</t> | |||
there is a risk that control information might be modified or spoofed.</t> | ||||
<t>In this context, RNFD’s two features are worth highlighting. | <t>In the second realization, the fact that the virtual root consists | |||
First, unless all neighbors of a DODAG root are compromised, a false positive ca | of multiple nodes is transparent to RNFD. Therefore, employing RNFD | |||
n always be detected by the root based on its local CFRCs. | in such a setting can be beneficial only if the nodes comprising the | |||
If the frequency of such false positives becomes problematic, RNFD can be disabl | virtual root may suffer from correlated crashes, for instance, due to | |||
ed altogether, for instance, until the problem has been diagnosed. | global power outages.</t> | |||
This procedure can be largely automated at LBRs. | </section> | |||
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 conse | ||||
quences on RPL apart from the lack of improvement to its performance upon a DODA | ||||
G root’s crash, at least if RPL’s other components are not attacked as well.</t> | ||||
</section> | <section anchor="mgmnt_monitoring" numbered="true" toc="default"> | |||
<section anchor="iana-considerations" title="IANA Considerations"> | <name>Monitoring</name> | |||
<t>For monitoring the operation of RNFD, its implementation <bcp14>SHOUL | ||||
D</bcp14> provide the following information about a node:</t> | ||||
<ul spacing="normal"> | ||||
<li> | ||||
<t>whether the protocol is active, and</t> | ||||
</li> | ||||
<li> | ||||
<t>whether LORS is "GLOBALLY DOWN".</t> | ||||
</li> | ||||
</ul> | ||||
<t>To represent the RNFD Option, IANA is requested to allocate the value TBD1 fr | <t>This information <bcp14>MUST</bcp14> be accompanied by the | |||
om the <eref target="https://www.iana.org/assignments/rpl/rpl.xhtml#control-mess | recommended monitoring parameters provided by RPL itself <xref | |||
age-options">“RPL Control Message Options” registry</eref> of the “Routing Proto | target="RFC6550" format="default"/>, notably the DODAG Version number | |||
col for Low Power and Lossy Networks (RPL)” registry group.</t> | and the Rank. To offer even finer-grained visibility into RNFD's | |||
state at the node, the implementation <bcp14>MAY</bcp14> also | ||||
provide:</t> | ||||
<ul spacing="normal"> | ||||
<li> | ||||
<t>the assigned role (i.e., Sentinel or Acceptor),</t> | ||||
</li> | ||||
<li> | ||||
<t>the exact value of LORS (i.e., "UP", "SUSPECTED DOWN", "LOCALLY | ||||
DOWN", or "GLOBALLY DOWN"),</t> | ||||
</li> | ||||
<li> | ||||
<t>the two CFRCs (i.e., PositiveCFRC and NegativeCFRC), and</t> | ||||
</li> | ||||
<li> | ||||
<t>the constants listed in <xref target="rnfd_behavior_constants" | ||||
format="default"/>.</t> | ||||
</li> | ||||
</ul> | ||||
</section> | ||||
</section> | ||||
<section anchor="security" numbered="true" toc="default"> | ||||
<name>Security Considerations</name> | ||||
<t>RNFD is an extension to RPL and thus is vulnerable to and | ||||
benefits from the security issues and solutions described in <xref | ||||
target="RFC6550" format="default"/> and <xref target="RFC7416" | ||||
format="default"/>. 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 DIO traffic due to Trickle timer resets. | ||||
Consequently, RNFD deployments are <bcp14>RECOMMENDED</bcp14> to use RPL | ||||
security mechanisms if there is a risk that control information might be | ||||
modified or spoofed.</t> | ||||
<t>In this context, two features of RNFD are worth highlighting. First, | ||||
unless all neighbors of a DODAG root are compromised, a false positive | ||||
can always be detected by the root based on its local CFRCs. If the | ||||
frequency of such false positives becomes problematic, RNFD can be | ||||
disabled altogether, for instance, until the problem has been diagnosed. | ||||
This procedure can be largely automated at LBRs. Second, some types of | ||||
false negatives can also be detected this way. Those that do pass | ||||
undetected are likely not to have major negative consequences | ||||
on RPL apart from the lack of improvement to its performance upon a | ||||
DODAG root's crash, at least if RPL's other components are not attacked | ||||
as well.</t> | ||||
</section> | ||||
</section> | <section anchor="iana-considerations" numbered="true" toc="default"> | |||
<section anchor="acknowledgements" title="Acknowledgements"> | <name>IANA Considerations</name> | |||
<t>IANA has allocated the following value | ||||
in the "RPL | ||||
Control Message Options" registry within the <eref | ||||
target="https://www.iana.org/assignments/rpl">"Routing Protocol for | ||||
Low Power and Lossy Networks (RPL)" registry group</eref>.</t> | ||||
<t>The authors would like to acknowledge Piotr Ciolkosz and Agnieszka Paszkowska | <table anchor="options-iana"> | |||
. | <name></name> | |||
Agnieszka contributed to deeper understanding and formally proving various aspec | <thead> | |||
ts of RPL’s behavior upon an LBR crash. | <tr> | |||
Piotr in turn developed a prototype implementation of RNFD dedicated for RPL to | <th>Value</th> | |||
verify earlier performance claims.</t> | <th>Meaning</th> | |||
<th>Reference</th> | ||||
</tr> | ||||
</thead> | ||||
<tbody> | ||||
<tr> | ||||
<td>0x0E</td> | ||||
<td>RNFD Option</td> | ||||
<td>RFC 9866</td> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
</section> | </section> | |||
</middle> | </middle> | |||
<back> | <back> | |||
<references> | ||||
<name>References</name> | ||||
<references> | ||||
<name>Normative References</name> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2 | ||||
119.xml"/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6 | ||||
206.xml"/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6 | ||||
550.xml"/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6 | ||||
553.xml"/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6 | ||||
554.xml"/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8 | ||||
174.xml"/> | ||||
</references> | ||||
<references> | ||||
<name>Informative References</name> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4 | ||||
861.xml"/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5 | ||||
184.xml"/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7 | ||||
102.xml"/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7 | ||||
228.xml"/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7 | ||||
416.xml"/> | ||||
<references title='Normative References'> | <reference anchor="Iwanicki16"> | |||
<front> | ||||
&RFC2119; | <title>RNFD: Routing-Layer Detection of DODAG (Root) Node Failures i | |||
&RFC6206; | n Low-Power Wireless Networks</title> | |||
&RFC6550; | <author initials="K." surname="Iwanicki" fullname="Konrad Iwanicki"> | |||
&RFC6553; | <organization/> | |||
&RFC6554; | </author> | |||
&RFC8174; | <date year="2016"/> | |||
</front> | ||||
</references> | <refcontent>2016 15th ACM/IEEE International Conference on Information | |||
Processing in Sensor Networks (IPSN), pp. 1-12</refcontent> | ||||
<seriesInfo name="DOI" value="10.1109/IPSN.2016.7460720"/> | ||||
</reference> | ||||
<references title='Informative References'> | <reference anchor="Ciolkosz19"> | |||
<front> | ||||
<title>Integration of the RNFD Algorithm for Border Router Failure D | ||||
etection with the RPL Standard for Routing IPv6 Packets</title> | ||||
<author initials="P." surname="Ciolkosz" fullname="Piotr Ciolkosz"> | ||||
<organization/> | ||||
</author> | ||||
<date year="2019"/> | ||||
</front> | ||||
<refcontent>Master's Thesis, University of Warsaw</refcontent> | ||||
</reference> | ||||
&RFC4861; | <reference anchor="Paszkowska19"> | |||
&RFC5184; | <front> | |||
&RFC6202; | <title>Failure Handling in RPL Implementations: An Experimental Qual | |||
&RFC7102; | itative Study</title> | |||
&RFC7228; | <author initials="A." surname="Paszkowska" fullname="Agnieszka Paszk | |||
&RFC7416; | owska"> | |||
<reference anchor="Iwanicki16" > | <organization/> | |||
<front> | </author> | |||
<title>RNFD: Routing-layer detection of DODAG (root) node failures in low-po | <author initials="K." surname="Iwanicki" fullname="Konrad Iwanicki"> | |||
wer wireless networks</title> | <organization/> | |||
<author initials="K." surname="Iwanicki" fullname="Konrad Iwanicki"> | </author> | |||
<organization></organization> | <date year="2019"/> | |||
</author> | </front> | |||
<date year="2016"/> | <refcontent>Mission-Oriented Sensor Networks and Systems: Art and Scie | |||
</front> | nce, Springer International Publishing, pp. 49-95</refcontent> | |||
<seriesInfo name="In" value="IPSN 2016: Proceedings of the 15th ACM/IEEE Inter | <seriesInfo name="DOI" value="10.1007/978-3-319-91146-5_3"/> | |||
national Conference on Information Processing in Sensor Networks, IEEE, pp. 1--1 | </reference> | |||
2"/> | ||||
<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 Applicati | ||||
ons</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-Zan | ||||
den"> | ||||
<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> | ||||
<reference anchor="Whang90"> | ||||
<front> | ||||
<title>A Linear-time Probabilistic Counting Algorithm for Database A | ||||
pplications</title> | ||||
<author initials="K.-Y." surname="Whang" fullname="Kyu-Young Whang"> | ||||
<organization/> | ||||
</author> | ||||
<author initials="B.T." surname="Vander-Zanden" fullname="Brad T. Va | ||||
nder-Zanden"> | ||||
<organization/> | ||||
</author> | ||||
<author initials="H.M." surname="Taylor" fullname="Howard M. Taylor" | ||||
> | ||||
<organization/> | ||||
</author> | ||||
<date year="1990"/> | ||||
</front> | ||||
<refcontent>ACM Transactions on Database Systems (TODS), vol. 15, no. | ||||
2, pp. 208-229</refcontent> | ||||
<seriesInfo name="DOI" value="10.1145/78922.78925"/> | ||||
</reference> | ||||
</references> | ||||
</references> | </references> | |||
<section anchor="acknowledgements" numbered="false" toc="default"> | ||||
<name>Acknowledgements</name> | ||||
<t>The author would like to acknowledge <contact fullname="Piotr | ||||
Ciolkosz"/> and <contact fullname="Agnieszka Paszkowska"/>. Agnieszka | ||||
contributed to deeper understanding and formally proving various aspects | ||||
of RPL's behavior upon an LBR crash. Piotr developed a | ||||
prototype implementation of RNFD dedicated for RPL to verify earlier | ||||
performance claims.</t> | ||||
</section> | ||||
</back> | </back> | |||
<!-- ##markdown-source: | ||||
H4sIAGO5zGcAA8V96XPbVpbvd/4VKPmDrQ7JSPKSWHn9ahQvHU3Ly0hOp/pN | ||||
zXhAAqTQAgEOAEpW3H5/+zu/s9wFBGUl3VMvU9OmSOAu5559u5PJZDSvs6Ja | ||||
HiebbjH5fjTqiq7Mj5O987evXx4nr9O2S2Z1k+VN0tSbjv6ZN2l7mWR5l8+7 | ||||
oq6SokrO35/tjdLZrMmvjxO8OMrqeZWuaJysSRfdpMhp8KYuy0lTLbLJwXej | ||||
LO3o16ODo6eTg8eTA5q4WDfHSdds2u7o4OD5wdEobfL0ODmtaNIq70Y3dXO1 | ||||
pDWsaYp3Z2ejq/yWvsr8E5OXmGs0p5GXdXN7nLRdNho9oH/SKvuYlnVFM97m | ||||
7WhdHCf/3tXzcdLWTdfki5Y+3a7w4T9Go3TTXdbN8Sjh/yb6b0L7bI+TP0+T | ||||
05u0KuZXhftBNvrnumrSbPvXuiHY/lwV13nTFt1tUi+SX9KmTW/cEy0tIe+O | ||||
kx/TKp1fpsmR+2VOLxzz47+mN6n/us5owoOjycHz74IvN1WHXb+vS9qv+359 | ||||
yfv+5sn3ydFR8vRp8uRJ8uTo+8Q9kK/SojxOCl34v6yK1eZmmmeb6bocEXbQ | ||||
qMVs0w2BRHb+pqBV52Vyjn+brK2rePMXtJy8XKVVclEvuhs61uQXOsu2v4LV | ||||
vPkGiPIvrb0wnaejHZO+T9t5WiYfLjezvOniCV8U7bxOLm7bLl9tzbLu5JV/ | ||||
meOp6bxejUZV3azSjo4IWzx//eLo8PC5fnx2dPDMPj59euA/PvYfn+jH7w+/ | ||||
o4+jolr0xnvy/bND/fj08Psnfugj/fjdof94dPS9fXxyyHMbTslfSRKT6DmR | ||||
JRHwpExviTo9XRKivXz38uRPyaOmrrv9pCKsSRYEg02Tt6Dasr6ZrOsbeumm | ||||
aPIyb9uEqAhk1u7xPEYJDwZJYS+ghb3e6ez1qEF+b/OmyFuAx1DptKJnT99f | ||||
vCVOQLtL3jf1PM/Bj1qsv7vMk8On3WVy8uLNt6evXr1SWk+xQTr9F3W1yJu8 | ||||
mucJbfjU4E6feaCW5lpipxd5RZSevNXdjROMNU7W62lyOJkcHtnyX747PU4O | ||||
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 | ||||
z80AAA== | ||||
</rfc> | </rfc> | |||
End of changes. 56 change blocks. | ||||
1486 lines changed or deleted | 1224 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. |