-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdraft-ietf-roll-rnfd-03.xml
1090 lines (926 loc) · 78.4 KB
/
draft-ietf-roll-rnfd-03.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc2629 version -->
<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [
<!ENTITY RFC2119 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml">
<!ENTITY RFC6206 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.6206.xml">
<!ENTITY RFC6550 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.6550.xml">
<!ENTITY RFC6553 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.6553.xml">
<!ENTITY RFC6554 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.6554.xml">
<!ENTITY RFC8174 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml">
<!ENTITY RFC4861 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.4861.xml">
<!ENTITY RFC5184 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.5184.xml">
<!ENTITY RFC6202 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.6202.xml">
<!ENTITY RFC7102 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.7102.xml">
<!ENTITY RFC7228 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.7228.xml">
<!ENTITY RFC7416 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.7416.xml">
]>
<?rfc toc="yes"?>
<?rfc sortrefs="yes"?>
<?rfc symrefs="yes"?>
<rfc ipr="trust200902" docName="draft-ietf-roll-rnfd-03" category="std">
<front>
<title abbrev="RNFD">RNFD: Fast border router crash detection in RPL</title>
<author initials="K." surname="Iwanicki" fullname="Konrad Iwanicki">
<organization>University of Warsaw</organization>
<address>
<postal>
<street>Banacha 2</street>
<city>Warszawa</city>
<code>02-097</code>
<country>Poland</country>
</postal>
<phone>+48 22 55 44 428</phone>
<email>[email protected]</email>
</address>
</author>
<date year="2024" month="March" day="20"/>
<area>Internet</area>
<workgroup>ROLL</workgroup>
<keyword>Internet-Draft</keyword>
<abstract>
<t>By and large, a correct operation of a RPL network requires border routers to be up.
In many applications, it is beneficial for the nodes to detect a crash of a border router as soon as possible to trigger fallback actions.
This document describes RNFD, an extension to RPL that expedites border router failure detection, even by an order of magnitude, by having nodes collaboratively monitor the status of a given border router.
The extension introduces an additional state at each node, a new type of RPL Control Message Options for synchronizing this state among different nodes, and the coordination algorithm itself.</t>
</abstract>
</front>
<middle>
<section anchor="intro" title="Introduction">
<t>RPL is an IPv6 routing protocol for low-power and lossy networks (LLNs) <xref target="RFC6550"/>.
Such networks are usually constrained in device energy and channel capacity.
They are formed largely of nodes that offer little processing power and memory, and links that are of variable qualities and support low data rates.
Therefore, a significant challenge that a routing protocol for LLNs has to address is minimizing resource consumption without sacrificing reaction time to network changes.</t>
<t>One of the main design principles adopted in RPL to minimize node resource consumption is delegating much of the responsibility for routing to LLN border routers (LBRs).
A network is organized into destination-oriented directed acyclic graphs (DODAGs), each corresponding to an LBR and having all its paths terminate at the LBR.
To this end, every node is dynamically assigned a rank representing its distance, measured in some metric, to a given LBR, with the LBR having the minimal rank, which reflects its role as the DODAG root.
The ranks allow each non-LBR node to select from among its neighbors (i.e., nodes to which the node has links) those ones that are closer to the LBR than the node itself: the node’s parents in the graph.
The resulting DODAG paths, consisting of the node-parent links, are utilized for routing packets upward: to the LBR and outside the LLN.
They are also used by nodes to periodically report their connectivity upward to the LBR, which allows in turn for directing packets downward, from the LBR to these nodes, for instance, by means of source routing <xref target="RFC6554"/>.
All in all, not only do LBRs participate in routing but also drive the process of DODAG construction and maintenance underlying the protocol.</t>
<t>To play this central role, LBRs are expected to be more capable than regular LLN nodes.
They are assumed not to be constrained in computing power, memory, and energy, which often entails a more involved hardware-software architecture and tethered power supply.
This, however, also makes them prone to failures, especially since in large deployments it is often difficult to ensure a backup power supply for every LBR.</t>
<section anchor="effects-of-lbr-crashes" title="Effects of LBR Crashes">
<t>When an LBR crashes, the nodes in its DODAG lose the ability to communicate with other Internet hosts.
In addition, a significant fraction of DODAG paths interconnecting the nodes become invalid, as they pass through the dead LBR.
The others also degenerate as a result of DODAG repair attempts, which are bound to fail.
In effect, routing inside the DODAG also becomes largely impossible.
Consequently, it is desirable that an LBR crash be detected by the nodes fast, so that they can leave the broken DODAG and join another one or trigger additional application- or deployment-dependent fallback mechanisms, thereby minimizing the negative impact of the disconnection.</t>
<t>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 heavy traffic, and is difficult to implement correctly <xref target="Iwanicki16"/> <xref target="Paszkowska19"/> <xref target="Ciolkosz19"/>.</t>
<t>To start with, tearing down all DODAG paths requires each of the dead LBR’s neighbors to detect that its link with the LBR is no longer up.
Otherwise, any of the neighbors unaware of this fact can keep advertising a finite rank and can thus be other nodes’ parent or ancestor in the DODAG: such nodes will incorrectly believe they have a valid path to the dead LBR.
Detecting a crash of a link by a node normally happens when the node has observed sufficiently many forwarding failures over the link.
Therefore, considering the low-data-rate applications of LLNs, the period from the crash to the moment of eliminating from the DODAG the last link to the dead LBR 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"/>, this also requires traffic, and hence time.
Finally, switching a parent or discovering a loop can also generate cascaded bursts of control traffic, owing to the adaptive Trickle algorithm for exchanging DODAG information <xref target="RFC6202"/>.
Overall, the behavior of the network when handling an LBR crash is highly suboptimal, thereby not being in line with RPL’s goals of minimizing resource consumption and reaction latencies.</t>
</section>
<section anchor="design-principles" title="Design Principles">
<t>To address this issue, this document proposes an extension to RPL, dubbed Root Node Failure Detector (RNFD).
To minimize the time and traffic required to handle an LBR crash, the RNFD algorithm adopts the following design principles, derived directly from the previous observations:</t>
<t><list style="numbers">
<t>Explicitly coordinating LBR monitoring between nodes instead of relying only on the emergent behavior resulting from their independent operation.</t>
<t>Avoiding probing all links to the dead LBR so as to reduce the tail latency when eliminating these links from the DODAG.</t>
<t>Exploiting concurrency by prompting proactive checking for a possible LBR crash when some nodes suspect such a failure may have taken place, which aims to further reduce the overall latency.</t>
<t>Minimizing changes to RPL’s existing algorithms by operating in parallel and largely independently (in the background), and introducing few additional assumptions.</t>
</list></t>
<t>While these principles do improve RPL’s performance under a wide range of LBR crashes, their probabilistic nature precludes hard guarantees for all possible corner cases.
In particular, in some scenarios, RNFD’s operation may result in false negatives, but these situations are peculiar and will eventually be handled by RPL’s own aforementioned mechanisms.
Likewise, in some scenarios, notably involving highly unstable links, false positives may occur, but they can be alleviated as well.
In any case, the principles also guarantee that RNFD can be deactivated at any time, if needed, in which case RPL’s operation is unaffected.</t>
</section>
<section anchor="other-solutions" title="Other Solutions">
<t>Given the consequences of LBR failures, if possible, 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 tolerating 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 complement them.
In particular, the operation of RNFD with different variants of virtual DODAG roots 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 document are to be interpreted as described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they appear in all capitals, as shown here.</t>
<t>The Terminology used in this document is consistent with and incorporates that described in “Terms Used in Routing for Low-Power and Lossy Networks (LLNs)” <xref target="RFC7102"/>, “RPL: IPv6 Routing Protocol for Low-Power and Lossy Networks” <xref target="RFC6550"/>, and “The Routing Protocol for Low-Power and Lossy Networks (RPL) Option for Carrying RPL Information in Data-Plane Datagrams” <xref target="RFC6553"/>.
Other terms in use in LLNs can be found in “Terminology for Constrained-Node Networks” <xref target="RFC7228"/>.</t>
<t>In particular, the following acronyms appear in the document:</t>
<t><list style="hanging">
<t hangText='DIO'>
DODAG Information Object (a RPL message)</t>
<t hangText='DIS'>
DODAG Information Solicitation (a RPL message)</t>
<t hangText='DODAG'>
Destination-Oriented Directed Acyclic Graph</t>
<t hangText='LLN'>
Low-power and Lossy Network</t>
<t hangText='LBR'>
LLN Border Router</t>
</list></t>
<t>In addition, the document introduces the following concepts:</t>
<t><list style="hanging">
<t hangText='Sentinel'>
One of the two roles that a node can play in RNFD. For a given DODAG Version, a Sentinel node is 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 Sentinel.</t>
<t hangText='Acceptor'>
The other of the two roles that a node can play in RNFD. For a given DODAG Version, an Acceptor node is a node that is not Sentinel.</t>
<t hangText='Locally Observed DODAG Root’s State (LORS)'>
A node’s local knowledge of the DODAG root’s status, specifying in particular whether the DODAG root is up.</t>
<t hangText='Conflict-Free Replicated Counter (CFRC)'>
Conceptually represents a dynamic set whose cardinality can be estimated. It defines a partial order on its values and supports element addition and union. The union operation is order- and duplicate-insensitive, that is, idempotent, commutative, and associative.</t>
</list></t>
</section>
<section anchor="overview" title="Overview">
<t>As mentioned previously, LBRs are DODAG roots in RPL, and hence a crash of an LBR is global in that it affects all nodes in the corresponding DODAG.
Therefore, each node running RNFD for a given DODAG explicitly tracks the DODAG root’s current condition, which is referred to as Locally Observed DODAG Root’s State (LORS), and synchronizes its local knowledge with other nodes.</t>
<t>Since monitoring the condition of the DODAG root is performed by tracking the status of its links (i.e., whether they are up or down), it must be done by the root’s neighbors; other nodes must accept their observations.
Consequently, depending on their roles, non-root nodes are divided in RNFD into two disjoint groups: Sentinels and Acceptors.
A Sentinel node is the DODAG root’s neighbor that monitors its link with the root.
The DODAG root thus normally has multiple Sentinels but being its neighbor need not imply being Sentinel.
An Acceptor node is in turn a node that is not Sentinel.
Acceptors thus mainly collect and propagate Sentinels’ observations.
More information on Sentinel selection can be found in <xref target="mgmnt_roles_and_cfrc_lens"/>.</t>
<section anchor="protocol-state-machine" title="Protocol State Machine">
<t>The possible values of LORS and transitions between them are depicted in <xref target="fig_state_machine"/>.
States “UP” and “GLOBALLY DOWN” can be attained by both Sentinels and Acceptors; states “SUSPECTED DOWN” and “LOCALLY DOWN” — by Sentinels only.</t>
<figure title="RNFD States and Transitions" anchor="fig_state_machine"><artwork><![CDATA[
+---------------------------------------------------------+
| |---------------------------+ 3a |
| +-----------------+---------+ 3b | |
| | 2b | v v v
+-+----+-+ 1 +---------+-+ +-----------+ +-+------+-+
| UP +---->+ SUSPECTED +---->+ LOCALLY +---->+ GLOBALLY |
| +<----+ DOWN | 2a | DOWN | 3c | DOWN |
+-+----+-+ 4a +-----------+ +-+---------+ +-+--------+
^ ^ | |
| | 4b | |
| +---------------------------+ 5 |
+--------------------------------------------------+
]]></artwork></figure>
<t>To begin with, when any node joins a DODAG Version, the DODAG root must appear alive, so the node initializes RNFD with its LORS equal to “UP”.
For a properly working DODAG root, the node remains in state “UP”.</t>
<t>However, when a node — acting as Sentinel — starts suspecting that the root may have crashed, it changes its LORS to “SUSPECTED DOWN” (transition 1 in <xref target="fig_state_machine"/>).
The transition from “UP” to “SUSPECTED DOWN” can happen based on the node’s observations at either the data plane, for instance, link-layer triggers about missing hop-by-hop acknowledgments for packets forwarded over the node’s link to the root, or the control plane, for example, a significant growth in the number of Sentinels already suspecting the root to be dead.
In state “SUSPECTED DOWN”, the Sentinel node may verify its suspicion and/or inform other nodes about the suspicion.
When this has been done, it changes its LORS to “LOCALLY DOWN” (transition 2a).
In some cases, the verification need not be performed and, as an optimization, a direct transition from “UP” to “LOCALLY DOWN” (transition 2b) can be done instead.</t>
<t>If sufficiently many Sentinels have their LORS equal to “LOCALLY DOWN”, all nodes — Sentinels and Acceptors — consent globally that the DODAG root must have crashed and set their LORS to “GLOBALLY DOWN”, irrespective of the previous value (transitions 3a, 3b, and 3c).
State “GLOBALLY DOWN” is terminal in that the only transition any node can perform from this to another state (transition 5) takes place when the node joins a new DODAG version.
When a node is in state “GLOBALLY DOWN”, RNFD forces RPL to maintain an infinite rank and no parent, thereby preventing routing packets upward in the DODAG.
In other words, this state represents a situation in which all non-root nodes agree that the current DODAG version is unusable, and hence, to recover, the root has to give a proof of being alive by initiating a new DODAG Version.</t>
<t>In contrast, if a node — either Sentinel or Acceptor — is in state “UP”, RNFD does not influence RPL’s packet forwarding: a node can route packets upward if it has a parent.
The same is true for states “SUSPECTED DOWN” and “LOCALLY DOWN”, attainable only by Sentinels.
Finally, while in any of the two states, a Sentinel node may observe some activity of the DODAG root, and hence decide that its suspicion is a mistake.
In such a case, it returns to state “UP” (transitions 4a and 4b).</t>
</section>
<section anchor="counters-and-communication" title="Counters and Communication">
<t>To enable arriving at a global conclusion that the DODAG root has crashed (i.e., transiting to state “GLOBALLY DOWN”), all nodes count locally and synchronize among each other the number of Sentinels considering the root to be dead (i.e., those in state “LOCALLY DOWN”).
This process employs structures referred to as conflict-free replicated counters (CFRCs).
They are stored and modified independently by each node and are disseminated throughout the network in options added to RPL link-local control messages: DODAG Information Objects (DIOs) and DODAG Information Solicitations (DISs).
Upon reception of such an option from its neighbor, a node merges the received counter with its local one, thereby obtaining a new content for its local counter.</t>
<t>The merging operation is idempotent, commutative, and associative.
Moreover, all possible counter values are partially ordered.
This enables ensuring eventual consistency of the counters across all nodes, irrespective of the particular sequence of merges, shape of the DODAG, or general network topology.</t>
<t>Each node in RNFD maintains two CFRCs for a DODAG:</t>
<t><list style="symbols">
<t>PositiveCFRC, counting Sentinels that consider or have previously considered the root node as alive in the current DODAG Version,</t>
<t>NegativeCFRC, counting Sentinels that consider or have previously considered the root node as dead in the current DODAG Version.</t>
</list></t>
<t>PositiveCFRC is always greater than or equal to the NegativeCFRC in terms of the partial order defined for the counters.
The difference between the value of PositiveCFRC and the value of NegativeCFRC is thus nonnegative and estimates the number of Sentinels that still consider the DODAG root node as alive.</t>
</section>
</section>
<section anchor="the-rnfd-option" title="The RNFD Option">
<t>RNFD state synchronization between nodes takes place through the RNFD Option.
It is a new type of RPL Control Message Options that is carried in link-local RPL control messages, notably DIOs and DISs.
Its main task is allowing the receivers to merge their two CFRCs with the sender’s CFRCs.</t>
<section anchor="general-cfrc-requirements" title="General CFRC Requirements">
<t>CFRCs in RNFD MUST support the following operations:</t>
<t><list style="hanging">
<t hangText='value(c)'>
Returns a nonnegative integer value corresponding to the number of nodes counted by a given CFRC, c.</t>
<t hangText='zero()'>
Returns a CFRC that counts no nodes, that is, has its value equal to 0.</t>
<t hangText='self()'>
Returns a CFRC that counts only the node executing the operation.</t>
<t hangText='infinity()'>
Returns a CFRC that counts all possible nodes and represents a special value, infinity.</t>
<t hangText='merge(c1, c2)'>
Returns a CFRC that is a union of c1 and c2 (i.e., counts all nodes that are counted by either c1, c2, or both c1 and c2).</t>
<t hangText='compare(c1, c2)'>
Returns the result of comparing c1 to c2.</t>
<t hangText='saturated(c)'>
Returns TRUE if a given CFRC, c, is saturated (i.e., no more new nodes should be counted by it) or FALSE otherwise.</t>
</list></t>
<t>The partial ordering of CFRCs implies that the result of compare(c1, c2) can be either:</t>
<t><list style="symbols">
<t>smaller, if c1 is ordered before c2 (i.e., c2 counts all nodes that c1 counts and at least one node that c1 does not count);</t>
<t>greater, if c1 is ordered after c2 (i.e., c1 counts all nodes that c2 counts and at least one node that c2 does not count);</t>
<t>equal, if c1 and c2 are the same (i.e., they count the same nodes);</t>
<t>incomparable, otherwise.</t>
</list></t>
<t>In particular, zero() is smaller than all other values and infinity() is greater than any other value.</t>
<t>The properties of merging in turn can be formalized as follows for any c1, c2, and c3:</t>
<t><list style="symbols">
<t>idempotence: c1 = merge(c1, c1);</t>
<t>commutativity: merge(c1, c2) = merge(c2, c1);</t>
<t>associativity: merge(c1, merge(c2, c3)) = merge(merge(c1, c2), c3).</t>
</list></t>
<t>In particular, merge(c, zero()) always equals c while merge(c, infinity()) always equals infinity().</t>
<t>There are many algorithmic structures that can provide the aforementioned properties of CFRC.
Although in principle RNFD does not rely on any specific one, the option adopts so-called linear counting <xref target="Whang90"/>.</t>
</section>
<section anchor="msg_format" title="Format of the Option">
<t>The format of the RNFD Option conforms to the generic format of RPL Control Message Options:</t>
<figure title="Format of the RNFD Option" anchor="fig_opt_format"><artwork><![CDATA[
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type = TBD1 | Option Length | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +
| |
+ +
| PosCFRC, NegCFRC (Variable Length*) |
. .
. .
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
The '*' denotes that, if present, the fields have equal lengths.
]]></artwork></figure>
<t><list style="hanging">
<t hangText='Option Type'>
TBD1</t>
<t hangText='Option Length'>
8-bit unsigned integer. Denotes the length of the option in octets excluding the Option Type and Option Length fields. Its value MUST be even. A value of 0 denotes that RNFD is disabled in the current DODAG Version.</t>
<t hangText='PosCFRC, NegCFRC'>
Two variable-length, octet-aligned bit arrays carrying the sender’s PositiveCFRC and NegativeCFRC, respectively.</t>
</list></t>
<t>The length of the arrays constituting the PosCFRC and NegCFRC fields is the same and is derived from Option Length as follows.
The value of Option Length is divided by 2 to obtain the number of octets each of the two arrays occupies.
The resulting number of octets is multiplied by 8 which yields an upper bound on the number of bits in each array.
As the actual bit length of each of the arrays, the largest prime number less than the upper bound is assumed.
For example, if the value of Option Length is 16, then each array occupies 8 octets, and its actual bit length is 61, as this is the largest prime number less than 64.</t>
<t>Furthermore, for any bit equal to 1 in the NegCFRC, the bit with the same index MUST be equal to 1 also in the PosCFRC.
Any unused bits (i.e., the bits beyond the actual bit length of each of the arrays) MUST be equal to 0.
Finally, if PosCFRC has all its bits equal to 1, then NegCFRC MUST also have all its bits equal to 1.</t>
<t>The CFRC operations are defined for such bit arrays of a given length as follows:</t>
<t><list style="hanging">
<t hangText='value(c)'>
Returns the smallest integer value not less than -LT*ln(L0/LT), where ln() is the natural logarithm function, L0 is the number of bits equal to 0 in the array corresponding to <spanx style="verb">c</spanx> and LT is the bit length of the array.</t>
<t hangText='zero()'>
Returns an array with all bits equal to 0.</t>
<t hangText='self()'>
Returns an array with a single bit, selected uniformly at random, equal to 1.</t>
<t hangText='infinity()'>
Returns an array with all bits equal to 1.</t>
<t hangText='merge(c1, c2)'>
Returns a bit array that constitutes a bitwise OR of c1 and c2, that is, a bit in the resulting array is equal to 0 only if the same bit is equal to 0 in both c1 and c2.</t>
<t hangText='compare(c1, c2)'>
Returns:</t>
</list></t>
<t><list style="symbols">
<t>equal if each bit of c1 is equal to the corresponding bit of c2;</t>
<t>less if c1 and c2 are not equal and, for each bit equal to 1 in c1, the corresponding bit in c2 is also equal to 1;</t>
<t>greater if c1 and c2 are not equal and, for each bit equal to 1 in c2, the corresponding bit in c1 is also equal to 1;</t>
<t>incomparable, otherwise.</t>
</list></t>
<t><list style="hanging">
<t hangText='saturated(c)'>
Returns TRUE, if more than 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 with RPL and the overall protocol stack.
These interactions are described next and can be realized, for instance, by means of event triggers.</t>
<section anchor="rnfd_behavior_roles" title="Joining a DODAG Version and Changing the RNFD Role">
<t>Whenever RPL running at a node joins a DODAG Version, RNFD — if active — MUST assume for the node the role of Acceptor.
Accordingly, it MUST set its LORS to “UP” and its PositiveCFRC and NegativeCFRC to zero().</t>
<t>The role MAY then change between Acceptor and Sentinel at any time.
However, while a switch from Sentinel to Acceptor has no preconditions, for a switch from Acceptor to Sentinel to be possible, <spanx style="emph">all</spanx> of the following conditions MUST hold:</t>
<t><list style="numbers">
<t>LORS is “UP”;</t>
<t>saturated(PositiveCFRC) is FALSE;</t>
<t>a neighbor entry for the DODAG root is present in RPL’s DODAG parent set;</t>
<t>the neighbor is considered reachable via its link-local IPv6 address.</t>
</list></t>
<t>A role change also REQUIRES appropriate updates to LORS and CFRCs, so that the node is properly accounted for.
More specifically, when changing its role from Acceptor to Sentinel, the node MUST add itself to its PositiveCFRC as follows.
It MUST generate a new CFRC value, selfc = self(), and MUST replace its PositiveCFRC, denoted oldpc, with newpc = merge(oldpc, selfc).
In contrast, the effects of a switch from Sentinel to Acceptor vary depending on the node’s value of LORS before the switch:</t>
<t><list style="symbols">
<t>for “GLOBALLY DOWN”, the node MUST NOT modify its LORS, PositiveCFRC, and NegativeCFRC;</t>
<t>for “LOCALLY DOWN”, the node MUST set its LORS to “UP” but MUST NOT modify its PositiveCFRC and NegativeCFRC;</t>
<t>for “UP” and “SUSPECTED DOWN”, the node MUST set its LORS to “UP”, MUST NOT modify it PositiveCFRC, but MUST add itself to NegativeCFRC, that is, replace its NegativeCFRC, denoted oldnc, with newnc = merge(oldnc, selfc), where selfc is the counter generated with self() when the node last added itself to its PositiveCFRC.</t>
</list></t>
</section>
<section anchor="rnfd_behavior_detection" title="Detecting and Verifying Problems with the DODAG Root">
<t>Only nodes that are Sentinels take active part in detecting crashes of the DODAG Root; Acceptors just disseminate their observations, reflected in the CFRCs.</t>
<t>The DODAG root monitoring SHOULD be based on both internal inputs, notably the values of CFRCs and LORS, and external inputs, such as triggers from RPL and other protocols.
External input monitoring SHOULD be performed preferably in a reactive fashion, also independently of RPL, and at both data plane and control plane.
In particular, it is RECOMMENDED that RNFD be directly notified of events relevant to the routing adjacency maintenance mechanisms on which RPL relies, such as Layer 2 triggers <xref target="RFC5184"/> or the Neighbor Unreachability Detection <xref target="RFC4861"/> mechanism.
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 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 RECOMMENDED that RNFD take action whenever there is a change to its local CFRCs, so that a node can have a chance to participate in detecting potential problems even when normally it would not exchange packets over the link with the DODAG root during some period.
In particular, RNFD SHOULD conclude that there may be problems with the DODAG root, when the fraction value(NegativeCFRC)/value(PositiveCFRC) has grown by at least RNFD_SUSPICION_GROWTH_THRESHOLD since the node last set its LORS to “UP”.</t>
<t>Whenever having its LORS set to “UP” RNFD concludes — based on either external or internal inputs — that there may be problems with the link with the DODAG root, it MUST set its LORS to either “SUSPECTED DOWN” or, as an optimization, to “LOCALLY DOWN”.</t>
<t>The “SUSPECTED DOWN” value of LORS is temporary: its aim is to give RNFD an additional opportunity to verify whether the link with the DODAG root is indeed down.
Depending on the outcome of such verification, RNFD MUST set its LORS to either “UP”, if the link has been confirmed not to be down, or “LOCALLY DOWN”, otherwise.
The verification can be performed, for example, by transmitting RPL DIS or ICMPv6 Echo Request messages to the DODAG root’s link-local IPv6 address and expecting replies confirming that the root is up and reachable through the link.
Care SHOULD be taken not to overload the DODAG root with traffic due to simultaneous probes, for instance, random backoffs can be employed to this end.
It is RECOMMENDED that the “SUSPECTED DOWN” value of LORS is attained and verification takes place if RNFD’s conclusion on the state of the DODAG root is based only on indirect observations, for example, the aforementioned growth of the CFRC values.
In contrast, for direct observations, such as missing L2 acknowledgments, the verification MAY be skipped, with the node’s LORS effectively changing from “UP” directly to “LOCALLY DOWN”.</t>
<t>For consistency with RPL, when detecting potential problems with the DODAG root, RNFD also MUST make use of RPL’s independent knowledge.
More specifically, a node MUST switch its LORS from “UP” or “SUSPECTED DOWN” directly to “LOCALLY DOWN” if a neighbor entry for the DODAG root is removed from RPL’s DODAG parent set or the neighbor ceases to be considered reachable via its link-local IPv6 address.</t>
<t>Finally, while having its LORS already equal to “LOCALLY DOWN”, a node may make an observation confirming that its link with the DODAG root is actually up.
In such a case, it SHOULD set its LORS back to “UP” but MUST NOT do this before the previous conditions 2–4 necessary for a node to change its role from Acceptor to Sentinel all hold (see <xref target="rnfd_behavior_roles"/>).</t>
<t>To appropriately account for the node’s observations on the state of the DODAG root, the aforementioned LORS transitions are accompanied by changes to the node’s local CFRCs as follows.
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 node MUST add itself to its NegativeCFRC, as explained previously.
By symmetry, a transition from “LOCALLY DOWN” to “UP” REQUIRES the node to add itself to its PositiveCFRC, again, as explained previously.</t>
<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>
<section anchor="rnfd_behavior_consensus" title="Disseminating Observations and Reaching Agreement">
<t>Nodes disseminate their observations by exchanging CFRCs in the RNFD Options embedded in link-local RPL control messages, notably DIOs and DISs.
When processing such a received option, a node — acting as Sentinel or Acceptor — MUST update its PositiveCFRC and NegativeCFRC to respectively newpc = merge(oldpc, recvpc) and newnc = merge(oldnc, recvnc), where oldpc and oldnc are the values of the node’s PositiveCFRC and NegativeCFRC before the update, while recvpc and recvnc are the received values of option fields PosCFRC and NegCFRC, respectively.</t>
<t>In effect, the node’s value of fraction value(NegativeCFRC)/value(PositiveCFRC) may change.
If the fraction reaches at least RNFD_CONSENSUS_THRESHOLD (with value(PositiveCFRC) being greater than zero), then the node consents on the DODAG root being down.
Accordingly, it MUST change its LORS to “GLOBALLY DOWN” and set its PositiveCFRC and NegativeCFRC both to infinity().</t>
<t>The “GLOBALLY DOWN” value of LORS is terminal: the node MUST NOT change it and MUST NOT modify its CFRCs until it joins a new DODAG Version.
With this value of LORS, RNFD at the node MUST also prevent RPL from having any DODAG parent and advertising any Rank other than INFINITE_RANK.</t>
<t>Since the RNFD Option is embedded, among others, in RPL DIO control messages, updates to a node’s CFRCs may affect the sending schedule of these messages, which is driven by the DIO Trickle timer <xref target="RFC6206"/>.
It is RECOMMENDED to use for RNFD a dedicated Trickle timer, different from RPL’s 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.
In contrast, in the absence of the dedicated Trickle timer for RNFD, an implementation SHOULD ensure that the RNFD Option is present in multicast DIO messages sufficiently often to quickly propagate changes to the node’s CFRCs, 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 MUST reset its Trickle timer when it changes its LORS to “GLOBALLY DOWN”, so that information about the detected crash of the DODAG root is disseminated in the DODAG fast.
Likewise, a node SHOULD reset its Trickle timer when any of its local CFRCs changes significantly.</t>
</section>
<section anchor="rnfd_behavior_root" title="DODAG Root’s Behavior">
<t>The DODAG root node MUST assume the role of Acceptor in RNFD and MUST NOT ever switch this role.
It MUST also monitor its LORS and local CFRCs, so that it can react to various events.</t>
<t>To start with, the DODAG root MUST generate a new DODAG Version, thereby restarting the protocol, if it changes its LORS to “GLOBALLY DOWN”, which may happen when the root has restarted after a crash or the nodes have falsely detected its crash.
It MAY also generate a new DODAG Version if fraction value(NegativeCFRC)/value(PositiveCFRC) approaches RNFD_CONSENSUS_THRESHOLD, so as to avoid potential interruptions to routing.</t>
<t>Furthermore, the DODAG root SHOULD either generate a new DODAG Version or increase the bit length of its CFRCs if saturated(PositiveCFRC) becomes TRUE.
This is a self-regulation mechanism that helps adjust the CFRCs to a potentially large number of Sentinels (see <xref target="mgmnt_roles_and_cfrc_lens"/>).</t>
<t>In general, issuing a new DODAG Version effectively restarts RNFD.
The DODAG root MAY thus perform this operation also in other situations.</t>
</section>
<section anchor="rnfd_behavior_deactivation" title="Activating and Deactivating the Protocol on Demand">
<t>RNFD can be activated and deactivated on demand, once per DODAG Version.
The particular policies for activating and deactivating the protocol are outside the scope of this document.
However, the activation and deactivation SHOULD be done at the DODAG root node; other nodes MUST comply.</t>
<t>More specifically, when a non-root node joins a DODAG Version, RNFD at the node is initially inactive.
The node MUST NOT activate the protocol unless it receives for this DODAG Version a valid RNFD Option containing some CFRCs, that is, having its Option Length field positive.
In particular, if the option accompanies the message that causes the node to join the DODAG Version, the protocol MUST be active from the moment of the joining.
RNFD then remains active at the node until it is explicitly deactivated or the node joins a new DODAG Version.
An explicit deactivation MUST take place when the node receives an RNFD Option for the DODAG Version with no CFRCs, that is, having its Option Length field equal to zero.
When explicitly deactivated, RNFD MUST NOT be reactivated unless the node joins a new DODAG Version.
In particular, when the first RNFD Option received by the node has its Option Length field equal to zero, the protocol MUST remain deactivated for the entire time the node belongs to the current DODAG Version.</t>
<t>When RNFD at a node is initially inactive for a DODAG Version, the node MUST NOT attach any RNFD Option to the messages it sends (in particular, because it may not know the desired CFRC length — see <xref target="rnfd_behavior_cfrc_size"/>).
When the protocol has been explicitly deactivated, the node MAY also decide not to attach the option to its outgoing messages.
However, it is RECOMMENDED that it sends sufficiently many messages with the option to the link-local all-RPL-nodes multicast IPv6 address to allow its neighbors to learn that RNFD has been deactivated in the current DODAG version.
In particular, it MAY reset its Trickle timer to this end but also MAY use some reactive mechanisms, for example, replying with a unicast DIO or DIS containing the RNFD Option with no CFRCs to a message from a neighbor that contains the option with some CFRCs, as such a neighbor appears not to have learned about the deactivation of RNFD.</t>
</section>
<section anchor="rnfd_behavior_cfrc_size" title="Processing CFRCs of Incompatible Lengths">
<t>The merge() and compare() operations on CFRCs require both arguments to be compatible, that is, to have the same bit length.
However, the processing rules for the RNFD Option (see <xref target="msg_format"/>) do not necessitate this.
This fact is made use of not only in the mechanisms for activating and deactivating the protocol (see <xref target="rnfd_behavior_deactivation"/>), but also in mechanisms for dynamic adjustments of CFRCs, which aim to enable deployment-specific policies (see <xref target="mgmnt_roles_and_cfrc_lens"/>).
A node thus MUST be prepared to receive the RNFD Option with fields PosCFRC and NegCFRC of a different bit length than the node’s own PositiveCFRC and NegativeCFRC.
Assuming that it has RNFD active and that fields PosCFRC and NegCFRC in the option have a positive length, the node MUST react as follows.</t>
<t>If the bit length of fields PosCFRC and NegCFRC is the same as that of the node’s local PositiveCFRC and NegativeCFRC, then the node MUST perform the merges, as detailed previously (see <xref target="rnfd_behavior_consensus"/>).</t>
<t>If the bit length of fields PosCFRC and NegCFRC is smaller than that of the node’s local PositiveCFRC and NegativeCFRC, then the node MUST ignore the option and MAY reset its Trickle timer.</t>
<t>If the bit length of fields PosCFRC and NegCFRC is greater than that of the node’s local PositiveCFRC and NegativeCFRC, then the node MUST extend the bit length of its local CFRCs to be equal to that in the option and set the CFRCs as follows:</t>
<t><list style="symbols">
<t>If the node’s LORS is “GLOBALLY DOWN”, then both its local CFRCs MUST be set to infinity().</t>
<t>Otherwise, they both MUST be set to zero(), and the node MUST account for itself in so initialized CFRCs. More specifically, if the node is Sentinel, then it MUST add itself to its PositiveCFRC, as detailed previously. In addition, if its LORS is “LOCALLY DOWN”, then it MUST also add itself to its NegativeCFRC, again, as explained previously. Finally, the node MUST perform merges of its local CFRCs and the ones received in the option (see <xref target="rnfd_behavior_consensus"/>) and MAY reset its Trickle timer.</t>
</list></t>
<t>In contrast, if the node is unable to extend its local CFRCs, for example, because it lacks resources, then it MUST stop participating in RNFD, that is, until it joins a new DODAG Version, it MUST NOT send the RNFD Option and MUST ignore this option in received messages.</t>
<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"/>).
If it cannot fulfill such a request, then it is MUST NOT stop participating in RFND and SHOULD return an error to the requester instead.
Otherwise, since it is always 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, respectively, different from or equal to “GLOBALLY DOWN”.
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"/>), 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" title="Summary of RNFD’s Interactions with RPL">
<t>In summary, RNFD interacts with RPL in the following manner:</t>
<t><list style="symbols">
<t>While having its LORS equal to “GLOBALLY DOWN”, RNFD prevents RPL from routing packets and advertising upward routes in the corresponding DODAG (see <xref target="rnfd_behavior_consensus"/>).</t>
<t>In some scenarios, RNFD triggers RPL to issue a new DODAG Version (see <xref target="rnfd_behavior_root"/>).</t>
<t>Depending on the implementation, RNFD may cause RPL’s DIO Trickle timer resets (see <xref target="rnfd_behavior_consensus"/>, <xref target="rnfd_behavior_deactivation"/>, and <xref target="rnfd_behavior_cfrc_size"/>).</t>
<t>RNFD monitors events relevant to routing adjacency maintenance as well as those affecting RPL’s DODAG parent set (see <xref target="rnfd_behavior_roles"/> and <xref target="rnfd_behavior_detection"/>).</t>
<t>Using RNFD entails embedding the RNFD Option into link-local RPL control messages (see <xref target="msg_format"/>).</t>
</list></t>
</section>
<section anchor="rnfd_behavior_constants" title="Summary of RNFD’s Constants">
<t>The following is a summary of RNFD’s constants:</t>
<t><list style="hanging">
<t hangText='RNFD_CONSENSUS_THRESHOLD'>
A threshold concerning the value of fraction value(NegativeCFRC)/value(PositiveCFRC). If the value at a Sentinel or Acceptor node reaches the threshold, then the node’s LORS is set to “GLOBALLY DOWN”, which implies that consensus has been reached on the DODAG root node being down (see <xref target="rnfd_behavior_consensus"/>). The default value of the threshold is 0.51, which indicates that a majority 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(PositiveCFRC). If the value at a Sentinel node grows at least by this threshold since the time the node’s LORS was last set to “UP”, then the node’s LORS is set to “SUSPECTED DOWN” or “LOCALLY DOWN”, which implies that the node suspects or assumes a crash of the DODAG root (see <xref target="rnfd_behavior_detection"/>). The default value of the threshold is 0.12. The higher the value the longer the detection period but the lower risk of increased traffic due to suspicion verification.</t>
<t hangText='RNFD_CFRC_SATURATION_THRESHOLD'>
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"/>). The default value of the threshold is 0.63. The higher the value is, the higher the probability of bit collisions, and hence the more erratic the results of function value(c) may be.</t>
</list></t>
<t>The means of configuring the constants at individual nodes are outside the scope of this document.</t>
</section>
</section>
<section anchor="mgmnt" title="Manageability Considerations">
<t>RNFD is largely self-managed, with the exception of protocol activation and deactivation, as well as node role assignment and the related CFRC size adjustment, for which only the aforementioned mechanisms are defined, so as to enable adopting deployment-specific policies.
This section outlines some of the possible policies.</t>
<section anchor="mgmnt_roles_and_cfrc_lens" title="Role Assignment and CFRC Size Adjustment">
<t>One approach to node role and CFRC size selection is to manually designate specific nodes as Sentinels in RNFD, assuming that they will have chances to satisfy the necessary conditions for attaining this role (see <xref target="rnfd_behavior_roles"/>), and fixing the CFRC bit length to accommodate these nodes.</t>
<t>Another approach is to automate the selection process: in principle, any node satisfying the necessary conditions for becoming Sentinel (see <xref target="rnfd_behavior_roles"/>) can attain this role.
However, in networks where the DODAG root node has many neighbors, this approach may lead to saturated(PositiveCFRC) quickly becoming TRUE, which — without additional measures — may degrade RNFD’s performance.
This issue can be handled with a probabilistic solution: if PositiveCFRC becomes saturated with little or no increase in NegativeCFRC, then a new DODAG Version can be issued and a node satisfying the necessary conditions can become Sentinel in this version only with probability 1/2.
This process can be continued with the probability being halved in each new DODAG Version until PositiveCFRC is no longer quickly saturated.
Another solution is to increase, potentially multiple times the bit length of the CFRCs by the DODAG root if PositiveCFRC becomes saturated with little or no growth in NegativeCFRC, which does not require issuing a new DODAG Version but lengthens the RNFD Option.
In this way, again, a sufficient bit length can be dynamically discovered or the root can conclude that a given bit length is excessive for (some) nodes and resort to the previous solution.
Increasing the bit length can be done, for instance, by doubling it, respecting the condition that it has to be a prime number (see <xref target="msg_format"/>).</t>
<t>In either of the solutions, Sentinel nodes SHOULD preferably be stable themselves and have stable links to the DODAG root.
Otherwise, they may often exhibit LORS transitions between “UP” and “LOCALLY DOWN” or switches between Acceptor and Sentinel roles, which gradually saturates CFRCs.
Although as a mitigation the number of such transitions and switches per node MAY be limited, having Sentinels stable SHOULD be preferred.</t>
</section>
<section anchor="mgmnt_virt_dodag_roots" title="Virtual DODAG Roots">
<t>RPL allows a DODAG to have a so-called virtual root, that is, a collection of nodes coordinating to act as a single root of the DODAG.
The details of the coordination process are left open in the specification <xref target="RFC6550"/> but, from RNFD’s perspective, two possible realizations are worth consideration:</t>
<t><list style="symbols">
<t>Just a single (primary) node of the nodes comprising the virtual root acts as the actual root of the DODAG. Only when this node fails, does another (backup) node take over. As a result, at any time, at most one of the nodes comprising the virtual root is the actual root.</t>
<t>More than one of the nodes comprising the virtual root act as actual roots of the DODAG, all advertising the same Rank in the DODAG. When some of the nodes fail, the other nodes may or may not react in any specific way. In other words, at any time, more than one node can be the actual root.</t>
</list></t>
<t>In the first realization, RNFD’s operation is largely unaffected.
The necessary conditions for a node to become Sentinel (<xref target="rnfd_behavior_roles"/>) guarantee that only the current primary root node is monitored by the protocol.
This SHOULD be taken into account in the policies for node role assignment, CFRC size selection, and, possibly, the setting of the two thresholds (<xref target="rnfd_behavior_constants"/>).
Moreover, when a new primary has been elected, to avoid polluting CFRCs with observations on the previous primary, it is RECOMMENDED to issue a new DODAG Version, especially if the new primary has different neighbors compared to the old one.</t>
<t>In the second realization, the fact that the virtual root consists of multiple nodes is transparent to RNFD.
Therefore, employing RNFD is such a setting can be beneficial only if the nodes comprising the virtual root may suffer from correlated crashes, for instance, due to global power outages.</t>
</section>
</section>
<section anchor="security" title="Security Considerations">
<t>RNFD is an extension to RPL and is thus both vulnerable to and benefits from the security issues and solutions described in <xref target="RFC6550"/> and <xref target="RFC7416"/>.
Its specification in this document does not introduce new traffic patterns or new messages, for which specific mitigation techniques would be required beyond what can already be adopted for RPL.</t>
<t>In particular, RNFD depends on information exchanged in the RNFD Option.
If the contents of this option were compromised, then failure misdetection may occur.
One possibility is that the DODAG root may be falsely detected as crashed, which would result in an inability of the nodes to route packets, at least until a new DODAG Version is issued by the root.
Another possibility is that a crash of the DODAG root may not be detected by RNFD, in which case RPL would have to rely on its own mechanisms.
Moreover, compromising the contents of the RNFD Option may also lead to increased DIO traffic due to Trickle timer resets.
Consequently, RNFD deployments are RECOMMENDED to use RPL security mechanisms if there is a risk that control information might be modified or spoofed.</t>
<t>In this context, RNFD’s two features are worth highlighting.
First, unless all neighbors of a DODAG root are compromised, a false positive can always be detected by the root based on its local CFRCs.
If the frequency of such false positives becomes problematic, RNFD can be disabled altogether, for instance, until the problem has been diagnosed.
This procedure can be largely automated at LBRs.
Second, some types of false negatives can also be detected this way.
Those that pass undetected, in turn, are likely not to have major negative consequences on RPL apart from the lack of improvement to its performance upon a DODAG root’s crash, at least if RPL’s other components are not attacked as well.</t>
</section>
<section anchor="iana-considerations" title="IANA Considerations">
<t>To represent the RNFD Option, IANA is requested to allocate the value TBD1 from the <eref target="https://www.iana.org/assignments/rpl/rpl.xhtml#control-message-options">“RPL Control Message Options” registry</eref> of the “Routing Protocol for Low Power and Lossy Networks (RPL)” registry group.</t>
</section>
<section anchor="acknowledgements" title="Acknowledgements">
<t>The authors would like to acknowledge Piotr Ciolkosz and Agnieszka Paszkowska.
Agnieszka contributed to deeper understanding and formally proving various aspects of RPL’s behavior upon an LBR crash.
Piotr in turn developed a prototype implementation of RNFD dedicated for RPL to verify earlier performance claims.</t>
<t><spanx style="emph">TODO</spanx> More likely to follow.</t>
</section>
</middle>
<back>
<references title='Normative References'>
&RFC2119;
&RFC6206;
&RFC6550;
&RFC6553;
&RFC6554;
&RFC8174;
</references>
<references title='Informative References'>
&RFC4861;
&RFC5184;
&RFC6202;
&RFC7102;
&RFC7228;
&RFC7416;
<reference anchor="Iwanicki16" >
<front>
<title>RNFD: Routing-layer detection of DODAG (root) node failures in low-power wireless networks</title>
<author initials="K." surname="Iwanicki" fullname="Konrad Iwanicki">
<organization></organization>
</author>
<date year="2016"/>
</front>
<seriesInfo name="In" value="IPSN 2016: Proceedings of the 15th ACM/IEEE International Conference on Information Processing in Sensor Networks, IEEE, pp. 1--12"/>
<seriesInfo name="DOI" value="10.1109/IPSN.2016.7460720"/>
</reference>
<reference anchor="Ciolkosz19" >
<front>
<title>Integration of the RNFD Algorithm for Border Router Failure Detection with the RPL Standard for Routing IPv6 Packets</title>
<author initials="P." surname="Ciolkosz" fullname="Piotr Ciolkosz">
<organization></organization>
</author>
<date year="2019"/>
</front>
<seriesInfo name="Master's Thesis," value="University of Warsaw"/>
</reference>
<reference anchor="Paszkowska19" >
<front>
<title>Failure Handling in RPL Implementations: An Experimental Qualitative Study</title>
<author initials="A." surname="Paszkowska" fullname="Agnieszka Paszkowska">
<organization></organization>
</author>
<author initials="K." surname="Iwanicki" fullname="Konrad Iwanicki">
<organization></organization>
</author>
<date year="2019"/>
</front>
<seriesInfo name="In" value="Mission-Oriented Sensor Networks and Systems: Art and Science (Habib M. Ammari ed.), Springer International Publishing, pp. 49--95"/>
<seriesInfo name="DOI" value="10.1007/978-3-319-91146-5_3"/>
</reference>
<reference anchor="Whang90" >
<front>
<title>A Linear-time Probabilistic Counting Algorithm for Database Applications</title>
<author initials="K.-Y." surname="Whang" fullname="Kyu-Young Whang">
<organization></organization>
</author>
<author initials="B.T." surname="Vander-Zanden" fullname="Brad T. Vander-Zanden">
<organization></organization>
</author>
<author initials="H.M." surname="Taylor" fullname="Howard M. Taylor">
<organization></organization>
</author>
<date year="1990"/>
</front>
<seriesInfo name="In" value="ACM Transactions on Database Systems"/>
<seriesInfo name="DOI" value="10.1145/78922.78925"/>
</reference>
</references>
</back>
<!-- ##markdown-source:
H4sIAJq1+mUAA8V96XPbVpbvd/4VKPmDrYRkLHlJrLx+NYqXjqblZSS7U/2m
ZjwgAVJogQAHACUrbr+//Z3fWe4CgrKS9NTL1LQpErjLuWff7mQyGc3rrKiW
R8mmW0x+GI26oivzo2Tv7M2rF0fJq7TtklndZHmTNPWmo3/mTdpeJFne5fOu
qKukqJKzd6d7o3Q2a/KrowQvjrJ6XqUrGidr0kU3KXIavKnLctJUi2zy8NEo
Szv69fDh4WP6a3L4cDQq1s1R0jWbtjt8+PDZw8NR2uTpUXJS0aRV3o2u6+Zy
SWtY0xRvT09Hl/kNfZX5JyYvMNdoTiMv6+bmKGm7bDS6R/+kVfYxLeuKZrzJ
29G6OEr+vavn46Stm67JFy19ulnhw3+MRummu6ibo1HC/03034T22R4lf5km
J9dpVcwvC/eDbPQvddWk2favdUOw/VAVV3nTFt1NUi+SX9KmTa/dEy0tIe+O
kp/SKp1fpMmh+2VOLxzx47+m16n/us5owoeHk4fPvg++3FQddv2uLmm/7vv1
Be/728c/JIeHyZMnyePHyePDHxL3QL5Ki/IoKXTh/7IqVpvraZ5tputyRNhB
oxazTTcEEtn564JWnZfJGf5tsrau4s2f03LycpVWyXm96K7pWJNf6Czb/gpW
8+ZbIMq/tPbCdJ6Odkz6Lm3naZm8v9jM8qaLJ3xetPM6Ob9pu3y1Ncu6k1f+
ZY6npvN6NRpVdbNKOzoibPHs1fPDg4Nn+vHp4cOn9vHJk4f+4yP/8bF+/OHg
e/o4KqpFb7zHPzw90I9PDn547Ic+1I/fH/iPh4c/2MfHBzy34ZT8lSQxiZ4R
WRIBT8r0hqjT0yUh2ou3L47/nDxo6rrbTyrCmmRBMNg0eQuqLevrybq+ppeu
iyYv87ZNiIpAZu0ez2OUcG+QFPYCWtjrnc5ejxrk9zZvirwFeAyVTip69uTd
+RviBLS75F1Tz/Mc/KjF+ruLPDl40l0kx89ff3fy8uVLpfUUG6TTf15Xi7zJ
q3me0IZPDO70mQdqaa4ldnqeV0TpyRvd3TjBWONkvZ4mB5PJwaEt/8Xbk6Pk
4OH04ODhs++wrCmWNf3+8dOH3xOLwiPGtw6e0p/Pi7q8rNtfBVv8wWCVyya1
Y8A2cFbJcUmMqeguVgmtNPlJ2OqZsNVXcjLJC3eA1/SkvPvuNDkHEyPq4jf1
yJOTd1dPiRLml3l3tyN7N3Vr3jqyd0XdNb2ft09s7zVJhLy53xLp0S/teI9e
HWJvezG4ntGfRLO/XtbX7WXaB5ht/mfaZKmHhl2frNZlvsqrjmFJOziukpef
1rQq/rJM/m2TlkXHtEYg2mQ3MRiGoXA8DZayBYfjZUV7/vUyHXjof4oEXheE
q3U1eUu/Eu5kfYxNCC7G0AgITSdfzAvG/Qc/p7NilryeJserVdoUSZ5N98fJ
+bohUBJqxUTzbjMri/aCfhonTAKPn00mz55s0cDDh99/9+z7HyaPJo8Onk2e
HRw8fjp58vHR9rH+cpFWy2cP4xM9Tk6LKk+bSUdHBXKc0Rpp3q6YE9mSqMIp
x/TwIu3SWdrmyfF6XRZzOfK7nOdfppO/TWUZ26dws5n8jeZbxr/3h/hp+n6a
/BVyp5n8H/xTbY30E05z11P98X6e0mm8T2/Kutka6Of6GoTce2AHZhDnS943
adWmzBRaMDoHKMWIbfb1+Ml33//w7PBwiv99EhzZwbNnpGpNJpMknZHeQYOO
Rj/dMDaVabPMx0lKmkTTEAtKaqIzx8NSpkeVD0mT//emgBiJVMM26epklieb
9XR0UiUkwGnk4CzHSdElBb2UV/mimBeEjDh3sDgIJ35d5BdWwWomzxzrn2lL
ahstiv5d10Q2szLHi6SlLIHsi7QsZ8QSEwXYdPT+guYkhXQDnkETtHNSaGg2
sGTab5XknzoiN2yUxsE2u4u0o2/XJIm6/iZNhHpJO07yq7xKZgBjIo/Sslcp
8RHiSARS+uUivQLCyzbnpAinNCizrfImWdX0pAKClNVu08q+lwWPG86O3eTB
ggvSzupsQ7IOk6cZLVioHOPkCbZBOiXPi6Ot8uuku1nnGB8bfQ7tri6T1yQr
02WevF0LkuFY2ptqftHQ0n7FyjsAUQel9S6TrFiw7O1kU2PGIexgXtOCC2E3
SeoovOjavFxMBflWRZaVOZTzE90AP/35Hu/ny2iExRW8J5ZxjQq8dVOT3l4L
3nj9hdGXcOHGKTDJg9PTN+1+8vmzKm5fvkxH5xuAwrFUOsNNS/KDToC0XFAD
cawMoifLrwriq4SmzVKIgzTbqiIdd56uU2jlfA43PAaUjlzJp2QBqMgMJKoB
pIREFHFFrN6UEr/uVb4iY0XAR6LvUl/EyDTUFbHzFBj+3yzoilxEQbtZr8l0
AQhA2GlCuJQzqtOR0IL4sNuCMJDoLKUzovWXZU7SQEcfhihgRqjKhEi41EAl
pFNYFVWxEjSgr+pNM88ZYpvV2ikqNFxCPKrBhPKg0F/C/J/GM9YBSC6x1tHb
KjftiFRzQB0rTiC15gXJfdpqVq87ORImy9qWIgxjeDUgdtJmlynvb4Uz11no
8TU9WEAQkaqCHRsYaGjafJ+dPTj96azdn46O3eppcDIxSKL/ystihkUyTbB9
Upv4zgpwUPqQzm/mxP8S0gbXFzQga+QtCWcmS+a0WFOmayB8pyn5iJVj0LGB
dJJ12tH7tKoVJmPKxpboaTr1WsgzrzLmRc2NgAeQuCGhQygAJE9bwBeLInSp
wMTXNHsuohhzZAVM5TkhzypPW+JxDPm2pgNc5cRfyWDGGpUv0dRjr6Ni2bpk
PlCcE7EhTERPXZBpSPMtSoJKy3MR18nBwvGwmCmwUoS94aUWOyfsVvZVTTAB
74qWQJwEQmLR1CvlRhiyyovlBZ0ggbmY5tOxFyoyv8kZxnAmtX36rm5hPOQB
2c2JlRASQKboxuinyr8unOzIfXEfpwNOyFYVvuXT1r3k7aZkCMsu+RzHjLBQ
huh7RU6MNJFxZHFj4VAdISuQLcTWtaj8JGihSRyFSwXq0FNtAUjhu9M3Aa9K
y7YmpkfDzW48eKBP15liCWEFOAu9WzRYZgUhdwV6kdmCyexg+aRk85um4pUK
AYRrzerrCu+P5dgcaHm0NjcpgpdJhVI8pFUSKlYsD5XUDQbG2R+Dsx+DSiBt
Spw6sd2KdpLVmIEPh7TOYg2yoYdsgBlxLIZH1sB6wIKUQXvTWeSCSifm1sSo
SPZidckGemB5YyhvnJQ4GxHkmsxxoco5nWgDUiCMH8uKcBRQL5hFiM5EQiBn
6cLqDPCtyZcbEirMlxg44Tm2xO7oXexV3u9JsHm9WiuuQNKMIzEjcs1Or17Q
hhKYU0VJS5OVFNVVXV7lYENNBpfNpDXfTdrMLwqoPlCCWOjnHcROpkINsqm8
EbVrnFzQd1dYAIN6lV4ypeUrgKtiYjaXBLGulkBSMBaSkJzzabFYJSa7Luub
ldAY65CyaighxZwIDAORSsRLSqD+bdbRchivhDUyyyTV417ykoQz+BEdN1Dx
OTTOvB2NfrnIK2PFc/lyHGiptCqwG8EQ8Ar+LVWpQgsh4K82FbTeXBhkDQA5
PyXBpO1aVpFNYeuL60WT9pw4wv+BfI0RpeKdLGqWz8Gn6dxITyAiE9Z6Q++1
+ERIvxQOmOVkxojYoL94Za3SQb4EZrB0ASII6/JLIM6QEk9IO7I51l3rqJ9g
PiMLK7PD5J3lDNuxozaiaWNJMhpPKatunfJUrEyln45IN23JzKAzL2/McoCK
0BiJdNEZgQhEJRfu5kGzSNsOrl55h6FCQE7KPFWynzX1JZ24ros28vcazKSS
YwOaQjlX+yLQsQPbZoJHPJZO6GMO+7Dz9sgqh+pTtCtBpiYHc/OaFa+XtRZa
FcEhnXcmGjJ4KuXM64pw95yJA5pBiBslDlaZc6xYMKtWc0VlpYLsBjYBZJqR
f9bU67XpHSbVABJWxfgHGB0LWneXD0v3QCySquKpomFRHqPgCwYTS8FKfzIQ
kpDvMGFAenxsHYizyVljhHYC/S4Vy2SsBxfYJgygcSLEXzkqYQkuOmFdd2Jt
Lco69YJayLMCqrR5yMaI+eVXPYsIzAUAU/5AX5NAHPNyHUldELoRHJoUHEv4
MBA6ZGCFebvMBCeK+PzZe3+/fKE/Qycaf+GdkJCEkD20KJLg4DwEuzyFF4jF
7xbKODOej8awTU/nfqhRecuciQgoBCUl1v9oP1VNHJGdTnACvAWeXxcAIEBp
mo4bdVOl12roMDQXQHpA7TLP14RyBPGuYHuJjsejnFhkjAsbcD7lrwz9+4q1
OHJI6bZjhcIzniNBGTmq64IVBw/uWV7S8ebCJS7AINKEOSpDzMgrRGCjqshj
wbDx1MXxBYi1C2IZJKaIZPJAoYQ+Ws9I54TAbTfAiILZnrhQCLugOGES576v
r3LxF2CmyO5jzZIUE+MpsJJhIk6EsQfuGJZ7ZPEJgYkS6JUz2Y1ueFUzWtIL
BB+2QHg19qzgFM+GeCHvvgcq2gqgy9gBS3zmeDsYV1OxRnYTUBHjWVU7G7Fo
1DzGwcPmZpTiUwHnUwMqmpJFDPFryBfSFuYkRqALQjXcsOqhqKImqZMPTs47
Lk6vEHx4VjAYlYDC1VgoygJVkCg/rlmhnhq7jq0YPnNoqfxYclnV12WeLXNP
JGxw0orrDiYaow8wle0GrFpJj50MIQWMBcF7exN9aS3OIl0hYnvERgG6sq7X
TqIz3otaqTuaMXIFp4NDoNfn5SbL7agGSYT0XFpvmyzLeibgeAlGzIsnm/4+
ZHrGqlLGiwgCWF5gOmX/0ZcvY2EVfLaOf0Vs9YKd4vA7TEevCFdL6A8tzTi/
EEL1HIIl65UQSyrzY2c8uOPcc4QaM2gVm6YVdXGufjM3b30dIGCapWsW4+/J
Zr6EnRv5ufNPfCjeJiyCwJXs9PDhIZj5W1oa2zSspeSwr+umhyHCSy4scBKp
RASnC+K10Kc3M8hv4kJe+YDxMMs12kIv5+GpLGsCAvsxv+L8AcSds0forGD3
DjTsF+LSeedcOiyfzLXEB1mQKZProTonLeEpKYLi1Ox7Z0mV2cxmdBxnEN1v
QExx7IxA9AC+3X32jDiPEWDGzii2WeTgDINYcWIY5hEExz5258+QVSHRcxY1
TF+Wr33nFTQuGJbmDIINYvxy3ZAKUW+M62twazQ6mCK6RQy66NgpaY5U0eHM
T8yskg4/p3M3TkUsgeiNjqvJxSJl3qJKFekUpF5XnUch75WwNRVNyO+8758O
8nCaHF/VRabuwpmph+qt7NE7WK5yRmY1DHY6H+PBgq+hGBH7X0aLRQpN/khA
Uhf8KFjOpml4HMJgWs1qbW5MoCDR3PwiJ2UJO4MG4EMEnip4AezVEui1G9id
namS5t+HwBJOmDJTL1N4JNTmKVa8x8WmYcYb7LUWmrXt0hYeT5PXnoicsKmV
0phBCkwVw1rsTU9AqJM4Fvy3pQ/UsDQI5dMDVXJgayBNpsr2VctUDzvDJL+O
DJjWyBgE+8tFwYYVTiNwwmasmDa0L12wSkLvAyGgXcO4a7Azs6ZDw5mQax1F
AOnkAWKiA5YgLbsZkuWGtkkWbt46jdodH6loFZKPSBsX01m8OvCQjJ2Xsp3n
Fam7Nc0KmqW1+hgWjlMtWnqcrLLW21v0PLxBsvW26DaqIEE3JdTYlEUqznrW
F2FJdBI3mOXKNdjkFPCwog1xCU5Gw+RZIMmmo9PiMheVeGDVxJLJur1R9wtO
TPn3Bi4xwEFdg7J+gk7B6+fd1XOiDbcTMXJnLLSJ27CAJcK8zsuyZ9sIR/JO
dxZ+dhQi3JkD6ngZM/srGbDjccBWaT8LAmhOgpK3JoSCGQwu7igK1vzZQZBn
KinYVEjO63LDoB+N/sxOZjFm1REwz52vxjuNaFZDEvMS8A5INnYXkTYsOlJr
UxjnAmaS2TUdvYaKwy6ohfhCx+pCqjddulSlJwao8KCrAuJJJGRGFAEPjjqf
WF62bH8KEwbjgv7YsJD0yCAwausJZqaRr4oGOBb4xmX+i7xc08pLYw6MQd4s
WIArFFdFhnfhayTwHhN6OFQ00YPd8alCEZ1BlIgEcw7JAS4jmgccXg6IY7UH
6QMt6IKNEihQ4O5LHUkYACnK4KBYCZ+TaJDO4oVPcIuumZ+GUWheMWsp3sTn
EFkletkQ1OCCBVMWx+jnz6vlquo+4smPWZ2ly4/8GNvOo3vJe46w1GW9JNv7
HuIt7ZcRu8ouiaSQcNgme68/nL/fG8u/yZu3/Pns5b99ODl7+QKfz38+Pj11
H+yJ85/ffjh94T/5N5+/ff365ZsX8jJ9m/S+en38tz1h5ntv370/efvm+HRP
jNpQaQK3Eoizm5BOWmneQt4MgJ+ev0sOHoueiTw39iFo8hp9hnCUqViDkD+Z
ncB0TRt1s8NVXXREaOxpbC/A9KBWTgVWIRQ53LC1WD6V2JYRYUWMfl1zOFNQ
K1r8HgZukw86pOVBceyS7Nx3Lqp6ytHgN3E0eE92imQ72BF7RHNHEl+2gd5F
0dBbRtwLI8t6NNj4bx6IVNV3p/saeOenn6dNwyocJ0AFpkEhmR+Td2VKujo+
Lpt0FSzlEdsMQoUMJ3qDoI9/OLKr/GvBzlqDph0TT+2DCBNWrHvbRW4iE8oA
nXpVOJ03dXVD03uMYQ1Rj5703Bcnb0dHSqThDt/O/g5F7IEkm6wkKWEfz58P
Pk/iArqy/LH9Fp7He0GE1iVYvbAI7bFGaP+MmN1oRICiV06j1ILoxOiRn87w
yOmbOINvFDv0wy2HaRoxrKDQ5mRNEFDOORKblzR2EBmnOTlyZPFJ7wjlCBOI
gHjiNHnF2q5EZgVQf0VGnoQWbGgXFk4DDhn4+WQONTP6sdn7rSanTBN2NzG/
cZ6tFewJYuZuLtXhwuBu8rN5UcXs3BrfrQN6BNuncIne6OM2MkTaHFCrG4KV
i2L8MyFWJTZDADKJPou448UFCzoVZw9hsLrxZMQz2dc5e4kfnL49O9+nJR+b
f3yH72cA5mNVTG68QaDUBxatgjd8k5WsNa0MObKE393kVUPa3Fku/j9aIWfh
0XsPnr86e45lPRdc3FgYWJIDsHPNIoBLnqaDAjBnh2TKvn1lK6CyFUaeJidg
24sCUfVUlkrb1MwoCZ5dpeUmzmUhQ0hVAaMh/nVTwQjlU+aPsRrJY074wWyj
O5uQNQyHARTjQD0hLXAlvrSxBOgka1R4NxlC9bzgL6AGkB4A18tVQebS53u1
fvxyiyrlwrqR5lGJv8I7pUIncWU+c3GNCZtk33qSamAyiCmYKhzGddRGDpy/
LtkraTYVa6SsMS22UD33bgZkAV4OELsY2ohFVMbTRKcvEDgg5UvdJiT/7479
AgyfWpZLNkifEIKoqYa+1YsauEDUNFBc2SIdLFMtVQ0IYp/2ok+zs1CGyxoJ
6EmC7Zs1uwpJxdlnzXW1QU0MuDuxaY009hhY+2O4enkjZY6i2nDo+OmHOrNe
UAzKc80eJXiQeW8yLBbHyr5qQzhqzkkCC8yKFtGwLuGamfYoYMw4AuNvLbKb
tuTDbs4cS4jtOJDP4gmOguM0QRCkHRIXsFvVHdndXRQcD7BqS0S5lWU7AMjq
EE9kn1vJqUUAEZyQ6RK46xZ5v3dwryVXwmskdeWBKVlK+LaveJkRwsf6EdVJ
80Uz/1gS21I75J7XIIV8XiPwWOWiXjuviLJRGMVEXebZZOYHC9e8hJxwwdiS
r4t5Z5bQolh+5ADmx5WMzkmSHeveex/e7Yla++fTtz+RFfM3OtBf3uw5I7jr
JNmECGBGuL4LvX6UECkNeP7h/N3L5+9fvtCBePDTt8+DsZEaSuP5oWCDEDz+
r/sP5UDfTn7vf9/S2/9IBv/7x22v0e+P0uQf9vb2Ar6Nng3+ezSzCd3b/0gO
Z7253aerrXXpN1ejb2WSb3mGg2AN3+qc4arsm2/dIyNM8uGdPfe/v038edg3
iZ2G+8ad/T9GbpHf/i83A05NdpTqLtw3j+byjX0Rrf9xettqh77Byf0nvvvP
4ePrwdF944G+47/Hs9teuw3VeiedPOHXfgdyfhsh+Oej5N4WYUpZxZ+44itR
CgX9vPfEvveFYyuzfFlUGvu/ljwmzQaFNPCav9N1e1JTRJUYbqTeQUFqax+q
RhCelDkW3N4ZA4bNDChHmjKUArCP6UhUbPBRJMrBe3Lpo16YLsjtkJQOZt6S
VCFDjJzNILuRhycoYNC4e+s5Lr7m5Afn1Bd5r2Fd2aC59cVBnYkzSp3ybiPY
Qp9hPfCslQhwFwfdF+kXPMsxDeanQ6OyU4/TAhLUdGQWtFETIZQ3nM5fOGWf
E7/XcAb00yYhkrUeUNOW6N0ZUrRXheSfX9TryexmQv8QHE3vkvw6DGVJm5p6
gFVZwoGZLkGMX05SCxgsNBosLP+Uws/XT3IjxeQayKP73axmYsQFkqRs8jS7
iQ9Tz1E8XQg7sdtQcaYHXcGvWL0BAiDku7jh48bYpAmLufEdg5Hj/KH+JrBj
vdGenkqWIDu1vAu1rvLd+BTLuhCbDtN92QScuRzikIXzMjVdwytCszxQbNNK
kv1QeoIAb/FragmFEnfcjYm3rGe277z9UHI1vgjHz2IgQcUf2IWm1JHK2uMH
0WTjwLIBze7QHfg39v4DWzSBwJNzn2uFVC1mRt6Fi8EyYmWGzortqVxCh2pD
uOgsa1chYFpSA8Yk08WKeTTfV3VpS0kqXKq+t+vYmV2JwWWAdsyZ3ROaYaIx
0ELKMDQLUfA7PKQn+xyZbCUy2UspMmaPgh+B05UwfMXbNFSW26E9jJ3pCK+V
lV8g/Tnl5Mg4C5ABUllGjc8xACy1wmA4eT3KzWIikP2yp30cJtlFHgkXpPOh
JkGp2EBaNhbBYtakFm0EEIlGbdqUA0jOVB9LCJsjB2PPdbQ4Bqa0SDbk3izU
KmF5CQVWpKSmhfkj+KsdAbbJfJIzU4tFKNaUwTueRRzJGTj4veiJSD2nrM7F
wqFjKTlWZtFaBneQRHYUusS40mXrSGAV81YtV0ZkWpuuxDpsNpLzeHfVfqwG
A8cwmQpCPT/I07nmIHRRhQmDMGdlqm1nJgc+xe0g7DO1coUtj0DoiMnyeeFM
w0gKsKtvhUqYy1yYsqQFSKyU4NLkMC4ZDfwpxFyC9FtM9Xi2r8ac+tqEvz13
6eH0MCttucAlbZpCin7gtlS3kGRZSf7LAOfDKRnPUweGrUQCcIPEvR9yYO4c
Yelqff+M1tdIgqhTPYaEdT/xsCel3erYf+hROEKTfa3WtEKMfIV0YHAAFGFw
iLPnepqbe3MBUm+8e3NuIGf/ZrsfVE8gJ1RFxKrOSMKyQRwmUxByelcaOwjZ
1dK2uZRfodKRU+pNL3D1YSKGWVnLMlkleKdoZOzlMgVJAxXt7kAI6sVO3rb7
vILbox/86Dl2+WFdIz8aHEP9YoLAtjARL6GLZWwMgSPU4vzBAJy8pGD0er5s
ghUdY/L1zNIIhdthh5z6Dm3KvaIjaYQQc7GLK3Tn3t1HC8dLrXUlUZaIrNbc
y8jfEPczsqHgLEbCwXsplgPNtVI1gpVYWoePS84dE3HIhNhWGzhmd2gQ3jtv
mQucSsfwJYOK9P3Y2c/asyQclg6XunrNoTmC2EuHjObnM0ncMndkFA8DLkej
0SR5p+kh+HUsewidZxogMbrFEliF8n5t91ueeZIWmmhV2pljOhKtZlzSGt5o
is3/zBqYsdy2BIJdCAXJDrlOiaWQapB2lq8AI8VUVYwVrprH53BqeLouoCGB
jsxVshuqiMi0NIV5HjrjVLOk8aLFWQW1+zVeRmt+1MrViXA1l8Zd2p2cmUFM
T5WlB3RPjESHqiGQ95b6KMHp0Yj/ELbtJYQQb5yPGOqlYe1RMBqJ1k7Danes
STc37hxiUlyYAVfFm33O6vOpwEaFixKTxNTi8KWFtpeCExqPDXifVD0wzaoV
4SnNubtbiAx0Q+HvVdr/WQmZj+1MMkzZth6N5HUjYs4fsVruODDs+CJCw4wQ
D+YI0p2p9pFGeICEj6Xxve2y4hgxAqkv/lsLDSmN0i5+zZv6QTwdb0aJdQMl
nLR9ZYEuxgZlxEX3PEU9pBFRcPO1EcU6MhMm/5TPN87mDxNS1fK4+dp4kWhQ
i4CzlUNDQkoOZcljM2rAc/nkH8wPCCKHuyZiBNa45CKZH0hlyqHpOsE6gqIG
rjH20FeFXyZiQcD+dDcYdEgkStFrA6sRhLVCPXmOEwsOuBLxEKBHsiWUlhiD
3p99eCm2R3T6Y65fsld8KbXUhYJYNWuWdJ8yk9JTt5ei28cGXh2fnr8UdRHZ
bSryI76plc9KD6TmFWEBRn9Hbucu2MxAYynXIqoETaDgE7CoMBYkVQvBeRzu
OBJ6z36oOKuxzFHIAt+HDyHRQ87K4qf3f6TpVY4MTJ8uuF2en/1g1+yHd5n9
cGh2pjGbW5GP88DMXHNaNxJCWdF3P/EKeBRkXQHMYgOH59ZL9BG+wBgiUNd0
P9qPGAdBXN9TKQe5Q3HLtp1/3vCD/cTc40KVJU124GCei6EhisgV8Wmr/FI1
HyS0KhExJB4xejidcp4fAUh/SgLCPuDte1WT++1FhO+fP3TPe02093zw5KN9
/2o0IP+2DVl9xkC8b2oKHzBxazWM3WMeuv1H/S8CV83UkW48lmKOZA5vUwmC
pZUks2qZbi+HOT4d0C3K7tH4Y8k+XJdB3PNHNLkUImB6S6515oPZJFpS4dNf
S24e5fXFz5+1y5SLj75iO8h0Ms2f+3xv1S4/iomkaZuL6LlAA2HTsW5WLhGY
9W9anH/jFnXkKAraJEnycCC4dDDw3eHAd49kgAP68VHyOHmSPE2+T35Inv2W
70YSL/tD/6dhr/fQxv6UvP/pxQH9rdA6zasliaWdgbQgdPbVeb4yxi1h2jv/
x+v4g2MMrYMUdhGUpJuzHvDgr9aiRyD0zf7WOqZ/cB3Tf9IYfxw/mKLuf3Of
rB6ibeUckoMvKpXmghZ5mWk0QLTAkmFDCvJApJNIX0nWwpyvdtEsgpyKj0BS
pP8Rkrrv5ATo2x8ms6JD0YRktKt6PE1euGXnuiSbRBkR/DfzDr7Q/BNKU0z9
DCZl4RIThewXeW+m+7JmDz2FNKtpcuxNuocR6DRnh1vvAIfuYsxG6AcIkFVi
baImsqmxbGJCgpL3D2CQ1QQhMbfs4sh62TJDY7Pdezg4HeP9FvRscOQPF53X
2nW5NiR/VuTQLCPWRKwYXgvm2EMVQ9jLerGrHTzjxxiSkhBF2ughOLs4p3om
kJ1xUPYO4063gUKadaENV4Jaua33C5fIVMiMP2gs4kb2SBKVjLu80f4YdX8Z
s0KyBHkdPPkUKYYM0Tn7onByHtThemWtQm9cq9GibBL1jTp+KSWW2rkoXAes
FmkgIyF6F58tFrH/YQu4B095wnDFDlq0eQGLlp1Bnd3aBI3x9EC7kxQOCb6y
/qePCeleSandivMcTd/DyM7MPDDiUUzTstmiC8x1jmAQ0n/yFOpf57ohHUMx
FwlmNxwfEjJqA4Va/p7lN7X6be54Zvvbcz8MIiDFwpENh2C0ARhP5her52BE
xSPy+qVpwfBLSrv8hncwaGaYd2OxwzjgGUEzwrJPjsPeCYY1Wwht13NOQCf0
Rzs5ff9NWT04ffjd6ft9zvGgtdAX+4YaXCkIAVIvUy2h3lTadvH0oXsqJikP
VztOQdUtx8h/zf9LMvzf20jx4blXB30ilQ4r1Stl2Z980O0Rv4RGR8uSpx1r
wmDOSc8QiIjGdAivZvVqHB/jsAvkKws6uNWr4Q7cu2SZl+f6IyzC5O1Z5OgI
fD8ygILb80wZsYjOhP08ymuYImdStxcfW+wFuc0JwnaevFwowWHE2gzyyLUb
44A9dwi7jtFyy5QGwsoInGvBCS02Rcx75kKVA1Pgx0NXmujfChwIf2jiw9sm
Ptgx8W6r/xaPEfMndgUx/UJ/+Qh+8vH8+P2Hs2MUp318//PZy/Of356+MBIy
OTeXzmcBEzNnUTw/vM+wvbQ19k9Wtv75Hq4P+Ghl7EjINwuUFSnhaWE/qSiq
JxYdB3HFPM1VN0S3Ldf8wLnhrZLbtchsu3QuzVba3L0XcFArVKvyT53rUTMD
NYjH4rbudhx9ctlaauP+a21htUgPlCiy9ZBwKvIZWir2QCQpxl+kpxny6HiH
Vhzgy2N2JAfyuJx1sEi0vh5/ibRhFSLq4KsBmpKVB8ta4FRr7mSw1EZe4vbO
uzg9yhKO8eWt+iieFmas8oxnfH38NxGJknvlIhIueYI7ZlvuQFC4PA1TDOFj
SbVZiOih7hWa1Y0FwYxsFySIaAWC9i6MX3Yv0MvhQLM8KFr+hpDsGyOVqDRM
RxaAXdRlJj0iGGSF5Gj/iPYMnl5DwLEMZer6EW0UUp9Tj46EN+7kejUTYshp
8cp963OnPVPo1H5EQwOJeetwRRsG6bjPFxvEV0XqKgQ0TMPVltr/A3VccnZ6
ZMyjtI72HEmoTU0aIcJNm3UmEa7aJ7qz6zjq6+ZymlzGaTo35/QCiDhQ4X3t
UMYqD3hFO08vyFgVKsgy106sHsDdwG45Ucz3XfbYnc7PafgB48yTPyWiNogi
ze9o9fTWBGM1J8m4KLP1XBuy0rDruXM/6i88tuQZ+twjbCb3bRDvgPpkat5s
lahYVqizHPiU1P/OYp6HZUENtNvKNYuBihJozsy4cSxi3Nt2nyn8aCP30o7i
gQeZDgpPhqa9lQm5+VydxGDq6e1Tjwfm7e3TLS5GtNg+9zX4AZrEjwRoUgVo
UkVoUjk0MVVcEFJ1Y8uuMATOZBhB1l4CIjcCkxSY3eThugS5JmoEyL9ybq4W
UaMzQxBu9XVlW4LO9Y2CiwgKZi/iFoTD08vcpBlc8NLx25agfUvi9DHM+GOQ
mPp35JsG+UAaIA6TtcfWEdE7dSxG/L6XvOpr2rQxABpvWS44q8GF3OCAZNL1
pgsC285cd155Cb4IyXB6wKfeq5IO1PrMcKZ1U3wkLGMqD632ZfT+8GJ9OvKa
07O0hwn3EFVALwiqkpcsRvaQXqbRL96xT24XTSrMKt/u/8KSK2iaEDjXkH5m
DZgIapLtZQoX0snK/ArZ6C6XXbxXafZ3IiSkAIUtf4OWZLXlnbJChbaBAWxP
Off+0MOYy+dx98+XL5Yo/8bE54dKRaa0yvQXwPBLuDuIXnIz9/rGbnHioCtx
rLhqvpY14tODtu5yvlWJJowJfPoqq5P58zCJkVXlC+k02Wsuw7aewpqL3aXV
Xz/9JOdwrWHXlmPK9Z+Je85FG1rv4Bai2HBKqyaKQtEt0ZIVYUYrROQ8cyQc
ELKeHt5aFcEJlqui63WaZX2H3VlBbUTY21zvYREvj4Q1b8ddx6kY2VSBl01z
5oHqTcpZRcPqqUVBrq+2s8RLc2t/GDbG9jzQY4UDKrdPZRbv6jjhWOMcADZU
P+liDEhRh8rBM8kk746zdqX75BZhS72T8JnfefRjL5hcV2XxWIUCcv87+S7W
n6Hmo0pFLvewuDzbvJD2J89h7f757O0v738OjF7pXR1LwiHpPw2sMm2d7x7h
0gXVTwT5dfdSFOGkgyaPOCbPxBoxfH7+LiDbdU67TTadfCv9m1NKB0pStupA
VBZuDRCrkVxMsUJTGFxvx37lYpUUPhFf+vNF15/UnFO1qbT3sNb7hK0SdqJl
IZ0/0biPTn6gRzFJCO4ibJwyrNIZh4ldO8DFip+6v3gVrn4IEemiiRu7YxHs
J+lrtoHDhCMiYa2QOh6cXO7VYc1uPA+zTjMvTs4xy8nz1zDRXs4vak5dgwPX
8um2edr9ncad6h5WtsWJ2XlrO9wuy+N2Fa6Z5IX2+Papg9Ln9jlrck7vkM58
CiswnLJOs/55yhlrv0dt/NoW4PukSqDMB6SwffWAuF25nV69WLjmOZKRnmun
bbl0w3IZt5h4dyfkdqXU2H10jGEeZbGwnnZBRYBipORkDrZAME4hSRhoDiZ3
O0WaaoQcA7kfWqmnE3iDte1Zk/7mh94EphdZ+eG2gB0oeINHhyDeXhbrNVDY
Easam1Jhxsar3KPkzHhf5+ZUvyHe84r1GJ/sbR5AFRm3ysNBRqmNQkn2MgPA
bQfcgEkU3PtRS2Hf7WLQL5GGpqPY5I6X+O3VA9x395a10uguXiA6/dqFYof9
QKbHepUwR+VicB/F73AI9eqA+mLRCkJ31xX6qiCGPmSQx8Qt9rPdvyIGg0T0
0H9xPVgLpKwo4vTc7H/Qt5Apywj8Iq7WMPD2HU4mjwmqKIBJ9YCsk0VtKt/X
HVUc/4HPMHnQ5jnZEkN+4S/70jE+8LV5r1nk2u2XIt/OeQa5iMjBoEyKbxOZ
cxCi0gB60B01mDnQbONMgIFeFzsdMgA/RIU01+nXl6lt/mKjvaBDP9hOUhtA
QKfXf81NGLtn0pZb8ogc8MUPU1zO196scP0SM4WtYt6YwJ3KaE5U75mvv+Kq
pNGXNP0tS5H704ITSgfOR5KBnD+A5D6iW5nvue667XMNXstn1xAsGpdr43vz
hCiwUzsFrfu7L1BcJojCdz2wgWHece4WU0RXihoFc2UF2GEXdIzmJqsTa7Ia
oa7Hi0FUG5A20NFIxs47ITYE8kQWeFqy7EjfotRpG8wE2lZvj4soL1Xd6FWk
viB5GCqL3h8V6saBE0NUnjkxVTcus8jMSpaCbqLuuLw4VwtugNYjQa7ury0o
6aUdEB24j4WA3vWi+SHI11qOP7bQibiYKt9uXX1M5lV07jms8W3UR4HO7CxP
pR/8MYqEufFY36UopeftBvGzN+xNvN3lx9n8vrm7q/VwETorZclpf1n2x2pY
uIw7uFFQRZMr3JOENicRd3TM6FcXM7OSaMvdAnFhathw3IFWdLWeSxHjoMcZ
D1Te5cyviS8Sv7t0du/mDNjC7esLBK3syfQKWZOaG5jdzeLg56ezuknJ6RpI
adtKkAvuPxoKjvxmPwRYnPDdKTowRL4M1q7ytueeeP72zfnLN0RwgV/iAbPP
ofGlfD1K0UeAdV+TjJwQ0V4MjmMFypIMIRbzYLw3UFx2dGNwPRu+jnjsImZh
Eue6bw054EmQtgxHPQEN/cwt0cfdeiEhIWnkpCO/aqDLgsvU/EVEVdGLiZmN
0PX1AxgN2iyB+QALGLsDklSVSPuWC5mC23HogTN0YbAKbdyb+ubVyZuT9y8/
nh2/+Yvrn9djRZwdo8xorKXeciXYWAPAYDsDTCkIyDotQIADXFUVq9MUU2ZP
hKTZpjRdsc2DwVxbQb6JrzKfKma2GzQQqG/c5RhPUQUwYHPz3YZyQzpDObhb
JBpoHLSPDiycuimW3LJja+ZQ+dd7qcaRRzaYSZa64HtJtCsGxtPthpeu9A/D
+YE4AK8qcCAfSKOf0Eon1lSw7GhKovjI7+K9j862oLXwgh3Ktax2pHddl7vW
RK20uHuFJtiRHFSdIQZHfIJ2NtxjdVgV02v8nAOlh65BfoKHQLCRNm5QI/fe
0A7+e4N13ARd/YZtDdVi5eRE8g7dOC3FXXxJXu4y1WWPGvTROwHQaxYQE+GC
YFJmvWqDftiETbncLsABNFtTDDx3F6iOG/YLiYGud9b10JqrbrYCRr1T4B5a
0muR9rsXrWBvy0EfuikEFGCT8bLZmbKrKVI/EcDiFmFTRd9+yV3w59qobtvs
UZuGsLsMXwQY9tzXxSve3bp8tRZ7YRa3paCtFSsArH+GPVB3pbBx8/kvWyHh
QDBIllU3kFjlyogjacUcSa1XRjG85pNP5BpOvXDc+1X4Au2B8JE26ucwLjvS
cVHFptWI3sB1c/E+hvJdtvvPcRMJAj/GMf5jscuxhu7uhDwiSKTDG3dUc6Ef
1ytFp3Hlma4jb3gPPUfK2PqD3Wo45+5NFGge/613T9TA9rD436ztmX2oLfaG
dLmxv2YnxdU8gYeSwz/Nxorma4to91PoeydlzFe4ya178jajXp8ZpUx7NYn2
visxze79REap9uPggCacExO5+Da+AkywEZdfoLEKp1+4jApRQsJ70uTS2KFW
COoLu6X9qtZmajOOMd9PtaORU+R8VsRqleP3CFqyEzeuJbGQpm9+YqUH2uzL
XUGjvORYblyxFJkXdgWLq7OxSD8N9YKEDD2znR9j73CKTHijS3CfCxppB/e7
1PCCrzj9GLF7tsF7ii42GvQ7WXNTGrvBJ1521l+2S1DgSyCDW6vbeW0dUgIh
GWRqssrh9tMb3esS1sBuu28SCD1u0ixWCm4kAQfflSqYxj3Gbk2c7WUlau9M
9ltIVoxALzZCDPgxgDaVJKd3ZqC26p0t2h5O2n2VvUpX0+042q5MPujb4Nzs
A4Vt7pqh7bybqHbOu3IlXcw0S60u3rTWokT9kXxZqz+WqCOp27iVylgakd0P
5m+kxF9/l0TpqaB156+Ibe3F8Cyc/Va0YSP0CPGDpOZbrLzjyg0Q4x8vm9M3
hrrzuTPUDPrw+o8tgGiuXv1bT83FSGDKq79oeLdh0BooKCnrDhaKe3eBRw8/
fOZF0ahnwpbq/CxhAo31D/nqdoaQRO8EDk/R4An23+jtf26yWY67SJ36v6vi
kuFm5JzeQszRfRcRMvcIvOu4eK66GTKynBVTdGqmPShioJLsTPlWF+lli5AG
QomqH7d8myE7SVQms0I/EAFimdeSPcEy7xc7KgdUZ43uQhq/NVOFtKueBuR1
owGH0LADcfplDdS1zQaMfUc6lIPGdvdRBzEXHagjiP5WAxorR3wp6pHGX/NF
tYlPzwquzvI4N1jAe7WDQArRDHaZHkGOAUcSJbRML2xa7Xbo8ivD28WjcD4y