rfc9009xml2.original.xml | rfc9009.xml | |||
---|---|---|---|---|
<?xml version="1.0" encoding="US-ASCII"?> | <?xml version="1.0" encoding="UTF-8"?> | |||
<!-- This template is for creating an Internet Draft using xml2rfc, | ||||
which is available here: http://xml.resource.org. --> | ||||
<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [ | ||||
<!-- One method to get references from the online citation libraries. | ||||
There has to be one entity for each item to be referenced. | ||||
An alternate method (rfc include) is described in the references. --> | ||||
<!ENTITY RFC2119 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC | <!DOCTYPE rfc SYSTEM "rfc2629-xhtml.ent"> | |||
.2119.xml"> | ||||
<!ENTITY RFC8174 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC | ||||
.8174.xml"> | ||||
<!ENTITY RFC6550 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC | ||||
.6550.xml"> | ||||
<!ENTITY RFC8505 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC | ||||
.8505.xml"> | ||||
]> | ||||
<?xml-stylesheet type='text/xsl' href='rfc2629.xslt' ?> | ||||
<!-- used by XSLT processors --> | ||||
<!-- For a complete list and description of processing instructions (PIs), | ||||
please see http://xml.resource.org/authoring/README.html. --> | ||||
<!-- Below are generally applicable Processing Instructions (PIs) that most I-Ds | ||||
might want to use. | ||||
(Here they are set differently than their defaults in xml2rfc v1.32) --> | ||||
<?rfc strict="yes" ?> | ||||
<!-- give errors regarding ID-nits and DTD validation --> | ||||
<!-- control the table of contents (ToC) --> | ||||
<?rfc toc="yes"?> | ||||
<!-- generate a ToC --> | ||||
<?rfc tocdepth="4"?> | ||||
<!-- the number of levels of subsections in ToC. default: 3 --> | ||||
<!-- control references --> | ||||
<?rfc symrefs="yes"?> | ||||
<!-- use symbolic references tags, i.e, [RFC2119] instead of [1] --> | ||||
<?rfc sortrefs="yes" ?> | ||||
<!-- sort the reference entries alphabetically --> | ||||
<!-- control vertical white space | ||||
(using these PIs as follows is recommended by the RFC Editor) --> | ||||
<?rfc compact="yes" ?> | ||||
<!-- do not start each main section on a new page --> | ||||
<?rfc subcompact="yes" ?> | ||||
<!-- keep one blank line between list items --> | ||||
<!-- end of list of popular I-D processing instructions --> | ||||
<rfc category="std" docName="draft-ietf-roll-efficient-npdao-18" ipr="trust20090 | ||||
2"> | ||||
<!-- category values: std, bcp, info, exp, and historic | ||||
ipr values: full3667, noModification3667, noDerivatives3667 | ||||
you can add the attributes updates="NNNN" and obsoletes="NNNN" | ||||
they will automatically be output with "(if approved)" --> | ||||
<!-- ***** FRONT MATTER ***** --> | <rfc xmlns:xi="http://www.w3.org/2001/XInclude" docName="draft-ietf-roll-efficie nt-npdao-18" number="9009" ipr="trust200902" obsoletes="" updates="" submissionT ype="IETF" category="std" consensus="true" xml:lang="en" tocInclude="true" tocDe pth="4" symRefs="true" sortRefs="true" version="3"> | |||
<front> | <front> | |||
<!-- The abbreviated title is used in the page header - it is only necessary | ||||
if the | ||||
full title is longer than 39 characters --> | ||||
<title abbrev="Efficient Route Invalidation">Efficient Route Invalidation</t itle> | <title abbrev="Efficient Route Invalidation">Efficient Route Invalidation</t itle> | |||
<seriesInfo name="RFC" value="9009"/> | ||||
<author fullname="Rahul Arvind Jadhav" initials="R.A." role="editor" surname ="Jadhav"> | <author fullname="Rahul Arvind Jadhav" initials="R.A." role="editor" surname ="Jadhav"> | |||
<organization>Huawei</organization> | <organization>Huawei</organization> | |||
<address> | <address> | |||
<postal> | <postal> | |||
<street>Kundalahalli Village, Whitefield,</street> | <street>Kundalahalli Village</street> | |||
<extaddr>Whitefield</extaddr> | ||||
<city>Bangalore</city> | <city>Bangalore</city> | |||
<region>Karnataka</region> | <region>Karnataka</region> | |||
<code>560037</code> | <code>560037</code> | |||
<country>India</country> | <country>India</country> | |||
</postal> | </postal> | |||
<phone>+91-080-49160700</phone> | <phone>+91-080-49160700</phone> | |||
<email>rahul.ietf@gmail.com</email> | <email>rahul.ietf@gmail.com</email> | |||
</address> | </address> | |||
</author> | </author> | |||
<author initials="P" surname="Thubert" fullname="Pascal Thubert"> | <author initials="P" surname="Thubert" fullname="Pascal Thubert"> | |||
<organization abbrev="Cisco">Cisco Systems, Inc</organization> | <organization abbrev="Cisco">Cisco Systems, Inc.</organization> | |||
<address> | <address> | |||
<postal> | <postal> | |||
<street>Building D</street> | <extaddr>Building D</extaddr> | |||
<street>45 Allee des Ormes - BP1200 </street> | <street>45 Allee des Ormes - BP1200 </street> | |||
<city>MOUGINS - Sophia Antipolis</city> | <city>MOUGINS - Sophia Antipolis</city> | |||
<code>06254</code> | <code>06254</code> | |||
<country>France</country> | <country>France</country> | |||
</postal> | </postal> | |||
<phone>+33 497 23 26 34</phone> | <phone>+33-497-23-26-34</phone> | |||
<email>pthubert@cisco.com</email> | <email>pthubert@cisco.com</email> | |||
</address> | </address> | |||
</author> | </author> | |||
<author fullname="Rabi Narayan Sahoo" initials="R.N." surname="Sahoo"> | <author fullname="Rabi Narayan Sahoo" initials="R.N." surname="Sahoo"> | |||
<organization>Huawei</organization> | <organization>Huawei</organization> | |||
<address> | <address> | |||
<postal> | <postal> | |||
<street>Kundalahalli Village, Whitefield, </street> | <extaddr>Whitefield</extaddr> | |||
<street>Kundalahalli Village</street> | ||||
<city>Bangalore</city> | <city>Bangalore</city> | |||
<region>Karnataka</region> | <region>Karnataka</region> | |||
<code>560037</code> | <code>560037</code> | |||
<country>India</country> | <country>India</country> | |||
</postal> | </postal> | |||
<phone>+91-080-49160700</phone> | <phone>+91-080-49160700</phone> | |||
<email>rabinarayans@huawei.com</email> | <email>rabinarayans0828@gmail.com</email> | |||
</address> | </address> | |||
</author> | </author> | |||
<author initials="Z" surname="Cao" fullname="Zhen Cao"> | <author initials="Z" surname="Cao" fullname="Zhen Cao"> | |||
<organization>Huawei</organization> | <organization>Huawei</organization> | |||
<address> | <address> | |||
<postal> | <postal> | |||
<street>W Chang'an Ave</street> | <street>W Chang'an Ave</street> | |||
<city>Beijing</city> | <city>Beijing</city> | |||
<country>P.R. China</country> | <country>China</country> | |||
</postal> | </postal> | |||
<email>zhencao.ietf@gmail.com</email> | <email>zhencao.ietf@gmail.com</email> | |||
</address> | </address> | |||
</author> | </author> | |||
<date year="2021" month="April" /> | ||||
<date/> | <keyword>NPDAO</keyword> | |||
<keyword>DCO</keyword> | ||||
<!-- If the month and year are both specified and are the current ones, xml2 | <keyword>no-path</keyword> | |||
rfc will fill | <keyword>route</keyword> | |||
in the current day for you. If only the current year is specified, xml2 | <keyword>cleanup</keyword> | |||
rfc will fill | ||||
in the current day and month for you. If the year is not the current one, i | ||||
t is | ||||
necessary to specify at least a month (xml2rfc assumes day="1" if not speci | ||||
fied for the | ||||
purpose of calculating the expiry date). With drafts it is normally suffici | ||||
ent to | ||||
specify just the year. --> | ||||
<!-- Meta-data Declarations --> | ||||
<area>Routing</area> | ||||
<workgroup>ROLL</workgroup> | ||||
<!-- WG name at the upperleft corner of the doc, | ||||
IETF is fine for individual submissions. | ||||
If this element is not present, the default is "Network Working Group", | ||||
which is used by the RFC Editor as a nod to the history of the IETF. -- | ||||
> | ||||
<keyword>template</keyword> | ||||
<!-- Keywords will be incorporated into HTML output | ||||
files in a meta tag but they have no effect on text or nroff | ||||
output. If you submit your draft to the RFC Editor, the | ||||
keywords will be used for the search engine. --> | ||||
<abstract> | <abstract> | |||
<t> | <t> | |||
This document explains the problems associated with the current use of | This document explains the problems associated with the use of | |||
NPDAO messaging and also discusses the requirements for an optimized | No-Path Destination Advertisement Object (NPDAO) messaging in RFC 6550 a | |||
route invalidation messaging scheme. Further a new proactive route | nd also discusses the requirements for an optimized | |||
invalidation message called as "Destination Cleanup Object" (DCO) is | route invalidation messaging scheme. Further, this document specifies a | |||
specified which fulfills requirements of an optimized route | new proactive route | |||
invalidation message called the "Destination Cleanup Object" (DCO), | ||||
which fulfills requirements for optimized route | ||||
invalidation messaging. | invalidation messaging. | |||
</t> | </t> | |||
</abstract> | </abstract> | |||
</front> | </front> | |||
<middle> | ||||
<middle> | <section numbered="true" toc="default"> | |||
<section title="Introduction"> | <name>Introduction</name> | |||
<t> | <t> | |||
RPL <xref target="RFC6550"/> (Routing Protocol for Low power and | RPL (the Routing Protocol for Low-Power and Lossy Networks) as defin | |||
lossy networks) specifies a proactive distance-vector based routing | ed in | |||
<xref target="RFC6550" format="default"/> | ||||
specifies a proactive distance-vector-based routing | ||||
scheme. RPL has optional messaging in the form of DAO | scheme. RPL has optional messaging in the form of DAO | |||
(Destination Advertisement Object) messages, which the 6LBR (6Lo | (Destination Advertisement Object) messages, which the 6LBR (6LoWPAN | |||
Border Router) and 6LR (6Lo Router) can use to learn a route | Border Router) and 6LR (6LoWPAN Router) can use to learn a route | |||
towards the downstream nodes. In storing mode, DAO messages would | towards the downstream nodes. ("6LoWPAN" stands for "IPv6 over Low-P | |||
ower Wireless Personal Area Network".) In Storing mode, DAO messages would | ||||
result in routing entries being created on all intermediate 6LRs | result in routing entries being created on all intermediate 6LRs | |||
from the node's parent all the way towards the 6LBR. | from a node's parent all the way towards the 6LBR. | |||
</t> | </t> | |||
<t> | ||||
<t> | ||||
RPL allows the use of No-Path DAO (NPDAO) messaging to invalidate a | RPL allows the use of No-Path DAO (NPDAO) messaging to invalidate a | |||
routing path corresponding to the given target, thus releasing | routing path corresponding to the given target, thus releasing | |||
resources utilized on that path. A NPDAO is a DAO message with | resources utilized on that path. An NPDAO is a DAO message with a | |||
route lifetime of zero, originates at the target node and always | route lifetime of zero. It originates at the target node and always | |||
flows upstream towards the 6LBR. This document explains the | flows upstream towards the 6LBR. This document explains the | |||
problems associated with the current use of NPDAO messaging and | problems associated with the use of NPDAO messaging in <xref target= "RFC6550"/> and | |||
also discusses the requirements for an optimized route invalidation | also discusses the requirements for an optimized route invalidation | |||
messaging scheme. Further a new proactive route invalidation | messaging scheme. Further, this document specifies a new proactive r | |||
message called as "Destination Cleanup Object" (DCO) is specified | oute invalidation | |||
which fulfills requirements of an optimized route invalidation | message called the "Destination Cleanup Object" (DCO), | |||
which fulfills requirements for optimized route invalidation | ||||
messaging. | messaging. | |||
</t> | </t> | |||
<t> | ||||
This document only caters to RPL's Storing Mode of Operation | ||||
(MOP). The Non-Storing MOP does not require the use of an NPDAO for | ||||
route | ||||
invalidation, since routing entries are not maintained on 6LRs. | ||||
</t> | ||||
<section numbered="true" toc="default"> | ||||
<name>Requirements Language and 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> | <t> | |||
The document only caters to the RPL's storing mode of operation | ||||
(MOP). The non-storing MOP does not require use of NPDAO for route | ||||
invalidation since routing entries are not maintained on 6LRs. | ||||
</t> | ||||
<section title="Requirements Language and 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> | ||||
This specification requires readers to be familiar with all the | This specification requires readers to be familiar with all the | |||
terms and concepts that are discussed in "RPL: IPv6 Routing | terms and concepts that are discussed in "RPL: IPv6 Routing | |||
Protocol for Low-Power and Lossy Networks" <xref | Protocol for Low-Power and Lossy Networks" <xref target="RFC6550 | |||
target="RFC6550"/>. | "/>. | |||
</t> | </t> | |||
<dl newline="true" spacing="normal"> | ||||
<t> | <dt>Low-Power and Lossy Network (LLN):</dt> | |||
<list style="hanging"> | <dd> | |||
<t hangText="Low Power and Lossy Networks (LLN):"> <vspace / | A network in which both the routers and their | |||
> | interconnects are constrained. LLN routers typically | |||
Network in which both the routers and their | operate with constraints on processing power, memory, | |||
interconnect are constrained. LLN routers typically | and energy (battery power). Their interconnects are | |||
operate with constraints on processing power, memory, | characterized by high loss rates, low data rates, and | |||
and energy (batter power). Their interconnects are | instability. | |||
characterized by high loss rates, low data rates, and | </dd> | |||
instability. | <dt>6LoWPAN Router (6LR):</dt> | |||
</t> | <dd> | |||
<t hangText="6LoWPAN Router (6LR):"> <vspace /> | An intermediate router that is able to send and receive Router | |||
An intermediate router that is able to send and receive | Advertisements (RAs) and Router Solicitations (RSs) as well as | |||
Router | forward and route IPv6 packets. | |||
Advertisements (RAs) and Router Solicitations (RSs) as w | </dd> | |||
ell as | <dt>Directed Acyclic Graph (DAG):</dt> | |||
forward and route IPv6 packets. | <dd> | |||
</t> | A directed graph having the property that all edges are | |||
<t hangText="Directed Acyclic Graph (DAG):"> <vspace /> | oriented in such a way that no cycles exist. | |||
A directed graph having the property that all edges are | </dd> | |||
oriented in such a way that no cycles exist. | <dt>Destination-Oriented DAG (DODAG):</dt> | |||
</t> | <dd> | |||
<t hangText="Destination-Oriented DAG (DODAG):"> <vspace /> | A DAG rooted at a single destination, i.e., at a single | |||
A DAG rooted at a single destination, i.e., at a single | DAG root with no outgoing edges. | |||
DAG root with no outgoing edges. | </dd> | |||
</t> | <dt>6LoWPAN Border Router (6LBR):</dt> | |||
<t hangText="6LoWPAN Border Router (6LBR):"> <vspace /> | <dd> | |||
A border router which is a DODAG root and is the edge | A border router that is a DODAG root and is the edge | |||
node for traffic flowing in and out of the 6LoWPAN | node for traffic flowing in and out of the 6LoWPAN. | |||
network. | </dd> | |||
</t> | <dt>Destination Advertisement Object (DAO):</dt> | |||
<t hangText="Destination Advertisement Object (DAO):"> <vspa | <dd> | |||
ce /> | DAO messaging allows downstream routes to the nodes to | |||
DAO messaging allows downstream routes to the nodes to | be established. | |||
be established. | </dd> | |||
</t> | <dt>DODAG Information Object (DIO):</dt> | |||
<t hangText="DODAG Information Object (DIO):"> <vspace /> | <dd> | |||
DIO messaging allows upstream routes to the 6LBR to be | DIO messaging allows upstream routes to the 6LBR to be | |||
established. DIO messaging is initiated at the DAO | established. DIO messaging is initiated at the DAO | |||
root. | root. | |||
</t> | </dd> | |||
<dt>Common ancestor node:</dt> | ||||
<t hangText="Common Ancestor node"> <vspace /> | <dd> | |||
6LR/6LBR node which is the first common node between | A 6LR/6LBR node that is the first common node between | |||
two paths of a target node. | two paths of a target node. | |||
</t> | </dd> | |||
<dt>No-Path DAO (NPDAO):</dt> | ||||
<t hangText="No-Path DAO (NPDAO):"> <vspace /> | <dd> | |||
A DAO message which has target with lifetime 0 used for | A DAO message that has a target with a lifetime of 0. Used for | |||
the purpose of route invalidation. | the purpose of route invalidation. | |||
</t> | </dd> | |||
<dt>Destination Cleanup Object (DCO):</dt> | ||||
<t hangText="Destination Cleanup Object (DCO):"> <vspace /> | <dd> | |||
A new RPL control message code defined by this | A new RPL control message code defined by this | |||
document. DCO messaging improves proactive route | document. DCO messaging improves proactive route | |||
invalidation in RPL. | invalidation in RPL. | |||
</t> | </dd> | |||
<dt>Regular DAO:</dt> | ||||
<t hangText="Regular DAO:"> <vspace /> | <dd> | |||
A DAO message with non-zero lifetime. Routing | A DAO message with a non-zero lifetime. Routing | |||
adjacencies are created or updated based on this | adjacencies are created or updated based on this | |||
message. | message. | |||
</t> | </dd> | |||
<dt>Target node:</dt> | ||||
<t hangText="Target node:"> <vspace /> | <dd> | |||
The node switching its parent whose routing adjacencies | The node switching its parent whose routing adjacencies | |||
are updated (created/removed). | are updated (created/removed). | |||
</t> | </dd> | |||
</list> | </dl> | |||
</t> | </section> | |||
</section> | <section anchor="current_npdao" numbered="true" toc="default"> | |||
<name>RPL NPDAO Messaging</name> | ||||
<section anchor="current_npdao" title="Current NPDAO messaging"> | <t> | |||
<t> | RPL uses NPDAO messaging in Storing mode so that the node | |||
RPL uses NPDAO messaging in the storing mode so that the node | ||||
changing its routing adjacencies can invalidate the previous | changing its routing adjacencies can invalidate the previous | |||
route. This is needed so that nodes along the previous path can | route. This is needed so that nodes along the previous path can | |||
release any resources (such as the routing entry) they maintain | release any resources (such as the routing entry) they maintain | |||
on behalf of target node. | on behalf of the target node. | |||
</t> | </t> | |||
<t> | ||||
<t> | Throughout this document, we will refer to the topology shown in <xref t | |||
For the rest of this document consider the following topology: | arget="sample_top"/>: | |||
</t> | </t> | |||
<figure anchor="sample_top"> | ||||
<t> <figure align="center" anchor="sample_top" title="Sample | <name>Sample Topology</name> | |||
topology"> <artwork align="center"><![CDATA[ | <artwork align="center" name="" type="" alt=""><![CDATA[ | |||
(6LBR) | (6LBR) | |||
| | | | |||
| | | | |||
| | | | |||
(A) | (A) | |||
/ \ | ||||
/ \ | ||||
/ \ | ||||
(G) (H) | ||||
| | | ||||
| | | ||||
| | | ||||
(B) (C) | ||||
\ ; | ||||
\ ; | ||||
\ ; | ||||
(D) | ||||
/ \ | / \ | |||
/ \ | / \ | |||
/ \ | / \ | |||
(G) (H) | (E) (F)]]></artwork> | |||
| | | </figure> | |||
| | | <t> | |||
| | | Node D is connected via preferred parent B. D has an | |||
(B) (C) | alternate path via C towards the 6LBR. Node A is the common | |||
\ ; | ancestor for D for paths through B-G and C-H. When | |||
\ ; | D switches from B to C, RPL allows sending an NPDAO to B | |||
\ ; | and a regular DAO to C. | |||
(D) | </t> | |||
/ \ | </section> | |||
/ \ | <section numbered="true" toc="default"> | |||
/ \ | <name>Why Is NPDAO Messaging Important?</name> | |||
(E) (F) | ||||
]]></artwork> </figure> </t> | ||||
<t> | ||||
Node (D) is connected via preferred parent (B). (D) has an | ||||
alternate path via (C) towards the 6LBR. Node (A) is the common | ||||
ancestor for (D) for paths through (B)-(G) and (C)-(H). When | ||||
(D) switches from (B) to (C), RPL allows sending NPDAO to (B) | ||||
and regular DAO to (C). | ||||
</t> | ||||
</section> | ||||
<!-- | ||||
<section title="Cases when No-Path DAO may be used"> | ||||
<t> There are following cases in which a node switches its parent | ||||
and may employ No-Path DAO messaging:</t> | ||||
<t>Case I: Current parent becomes unavailable because of transient | ||||
or permanent link or parent node failure.</t> | ||||
<t>Case II: The node finds a better parent node i.e. the metrics of | ||||
another parent is better than its current parent.</t> | ||||
<t>Case III: The node switches to a new parent whom it "thinks" has | ||||
a better metric but does not in reality.</t> | ||||
<t>The usual steps of operation when the node switches the parent | ||||
is that the node sends a No-Path DAO message via its current par | ||||
ent | ||||
to invalidate its current route and subsequently it tries to | ||||
establish a new routing path by sending a new DAO via its new | ||||
parent.</t> | ||||
</section> | ||||
--> | ||||
<section title="Why Is NPDAO Important?"> | <t> | |||
<t> | Resources in LLN nodes are typically constrained. There is limit | |||
Nodes in LLNs may be resource constrained. There is limited | ed | |||
memory available and routing entry records are one of the | memory available, and routing entry records are one of the | |||
primary elements occupying dynamic memory in the nodes. Route | primary elements occupying dynamic memory in the nodes. Route | |||
invalidation helps 6LR nodes to decide which entries could be | invalidation helps 6LR nodes to decide which routing entries can | |||
discarded to better optimize resource utilization. Thus it | be | |||
discarded for better use of the limited resources. Thus, it | ||||
becomes necessary to have an efficient route invalidation | becomes necessary to have an efficient route invalidation | |||
mechanism. Also note that a single parent switch may result in | mechanism. Also note that a single parent switch may result in | |||
a "sub-tree" switching from one parent to another. Thus the | a "subtree" switching from one parent to another. Thus, the | |||
route invalidation needs to be done on behalf of the sub-tree | route invalidation needs to be done on behalf of the subtree | |||
and not the switching node alone. In the above example, when | and not the switching node alone. In the above example, when | |||
Node (D) switches parent, the route updates needs to be done | Node D switches its parent, route updates need to be done | |||
for the routing tables entries of (C),(H),(A),(G), and (B) with | for the routing table entries of C, H, A, G, and B with | |||
destination (D),(E) and (F). Without efficient route | destinations D, E, and F. Without efficient route | |||
invalidation, a 6LR may have to hold a lot of stale route | invalidation, a 6LR may have to hold a lot of stale route | |||
entries. | entries. | |||
</t> | </t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="current_npdao_problems" numbered="true" toc="default"> | ||||
<section anchor="current_npdao_problems" title="Problems with current NPDAO | <name>Problems with the RPL NPDAO Messaging</name> | |||
messaging"> | <section numbered="true" toc="default"> | |||
<section title="Lost NPDAO due to link break to the previous parent"> | <name>Lost NPDAO Due to Link Break to the Previous Parent</name> | |||
<t> | <t> | |||
When a node switches its parent, the NPDAO is to be sent to | When a node switches its parent, the NPDAO is to be sent to | |||
its previous parent and a regular DAO to its new parent. In | its previous parent and a regular DAO to its new parent. In | |||
cases where the node switches its parent because of transient | cases where the node switches its parent because of transient | |||
or permanent parent link/node failure then the NPDAO message is | or permanent parent link/node failure, the NPDAO message may | |||
bound to fail. | not be received by the parent. | |||
</t> | </t> | |||
<!-- | ||||
<t> | ||||
RPL allows use of route lifetime to remove unwanted routes in | ||||
case the routes could not be refreshed. But route lifetimes in | ||||
case of LLNs could be substantially high and thus the route | ||||
entries would be stuck for longer times. | ||||
</t> | ||||
--> | ||||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Invalidate Routes of Dependent Nodes"> | <name>Invalidating Routes of Dependent Nodes</name> | |||
<t> | <t> | |||
RPL does not specify how route invalidation will work for | RPL does not specify how route invalidation will work for | |||
dependent nodes rooted at the switching node, resulting in | dependent nodes in the switching node subDAG, resulting in | |||
stale routing entries of the dependent nodes. The only way for | stale routing entries of the dependent nodes. The only way for a | |||
6LR to invalidate the route entries for dependent nodes would | 6LR to invalidate the route entries for dependent nodes would | |||
be to use route lifetime expiry which could be substantially | be to use route lifetime expiry, which could be substantially | |||
high for LLNs. | high for LLNs. | |||
</t> | </t> | |||
<t> | <t> | |||
In the example topology, when Node (D) switches its parent, | In the example topology, when Node D switches its parent, | |||
Node (D) generates an NPDAO on its behalf. There is no NPDAO | Node D generates an NPDAO on its own behalf. There is no NPDAO | |||
generated by the dependent child nodes (E) and (F), through the | generated by the dependent child Nodes E and F, through the | |||
previous path via (D) to (B) and (G), resulting in stale | previous path via D to B and G, resulting in stale | |||
entries on nodes (B) and (G) for nodes (E) and (F). | entries on Nodes B and G for Nodes E and F. | |||
</t> | </t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Possible route downtime caused by asynchronous operation | <name>Possible Route Downtime Caused by Asynchronous Operation of the NP | |||
of NPDAO and DAO"> | DAO and DAO</name> | |||
<t> | <t> | |||
A switching node may generate both an NPDAO and DAO via two | A switching node may generate both an NPDAO and a DAO via two | |||
different paths at almost the same time. There is a possibility | different paths at almost the same time. It is possible | |||
that an NPDAO generated may invalidate the previous route and | that the NPDAO may invalidate the previous route and | |||
the regular DAO sent via the new path gets lost on the way. | the regular DAO sent via the new path gets lost on the way. | |||
This may result in route downtime impacting downward | This may result in route downtime, impacting downward | |||
traffic for the switching node. | traffic for the switching node. | |||
</t> | </t> | |||
<t> | <t> | |||
In the example topology, consider Node (D) switches from parent | In the example topology, say that Node D switches from parent | |||
(B) to (C). An NPDAO sent via the previous route may invalidate | B to C. An NPDAO sent via the previous route may invalidate | |||
the previous route whereas there is no way to determine whether | the previous route, whereas there is no way to determine whether | |||
the new DAO has successfully updated the route entries on the | the new DAO has successfully updated the route entries on the | |||
new path. | new path. | |||
</t> | </t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="requirements" numbered="true" toc="default"> | ||||
<section title="Requirements for the NPDAO Optimization" anchor="requirement | <name>Requirements for NPDAO Optimization</name> | |||
s"> | <section numbered="true" toc="default"> | |||
<name>Req. #1: Remove Messaging Dependency on the Link to the Previous | ||||
<section title="Req#1: Remove messaging dependency on link to the previo | Parent</name> | |||
us parent"> | <t> | |||
<t> | ||||
When the switching node sends the NPDAO message to the previous | When the switching node sends the NPDAO message to the previous | |||
parent, it is normal that the link to the previous parent is | parent, it is normal that the link to the previous parent is | |||
prone to failure (that's why the node decided to switch). | prone to failure (that's why the node decided to switch). | |||
Therefore, it is required that the route invalidation does not | Therefore, it is required that the route invalidation does not | |||
depend on the previous link which is prone to failure. The | depend on the previous link, which is prone to failure. The | |||
previous link referred here represents the link between the | previous link referred to here represents the link between the | |||
node and its previous parent (from whom the node is now | node and its previous parent (from which the node is now | |||
disassociating). | disassociating). | |||
</t> | </t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Req#2: Dependent nodes route invalidation on parent | <name>Req. #2: Route Invalidation for Dependent Nodes at the Parent Swit | |||
switching"> | ching Node</name> | |||
<t> | <t> | |||
It should be possible to do route invalidation for dependent | It should be possible to do route invalidation for dependent | |||
nodes rooted at the switching node. | nodes rooted at the switching node. | |||
</t> | </t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Req#3: Route invalidation should not impact data traffic | <name>Req. #3: Route Invalidation Should Not Impact Data Traffic</name> | |||
"> | <t> | |||
<t> | ||||
While sending the NPDAO and DAO messages, it is possible that | While sending the NPDAO and DAO messages, it is possible that | |||
the NPDAO successfully invalidates the previous path, while the | the NPDAO successfully invalidates the previous path, while the | |||
newly sent DAO gets lost (new path not set up successfully). | newly sent DAO gets lost (new path not set up successfully). | |||
This will result in downstream unreachability to the node | This will result in downstream unreachability to the node | |||
switching paths. Therefore, it is desirable that the route | switching paths. Therefore, it is desirable that the route | |||
invalidation is synchronized with the DAO to avoid the risk of | invalidation is synchronized with the DAO to avoid the risk of | |||
route downtime. | route downtime. | |||
</t> | </t> | |||
</section> | </section> | |||
</section> | ||||
<!-- Too Confusing section and may not be needed now... If required th | ||||
is can be added in Appendix. | ||||
<section title="Existing Solution"> | ||||
<section title="NPDAO can be generated by the parent node who detects | ||||
link failure to the child"> | ||||
<t>RPL states mechanisms which could be utilized to clear DAO | ||||
states in a sub-DODAG. [RFC6550] Section 11.2.2.3 states "With DAO | ||||
inconsistency loop recovery, a packet can be used to recursively | ||||
explore and clean up the obsolete DAO states along a | ||||
sub-DODAG".</t> | ||||
<t>Thus in the sample topology in Figure 1, when Node (B) detects | ||||
link failure to (D), (B) has an option of generating an NPDAO on | ||||
behalf of Node (D) and its sub-childs, (E) and (F).</t> | ||||
<t>This section explains why generation of an NPDAO in such cases | ||||
may not function as desired. Primarily the DAO state information in | ||||
the form of Path Sequence plays a major role here. Every target is | ||||
associated with a Path Sequence number which relates to the latest | ||||
state of the target. <xref target="RFC6550"/> Section 7.1 explains | ||||
the semantics of Path Sequence number. The target node increments | ||||
the Path Sequence number every time it generates a new DAO. The | ||||
router nodes en-route utilize this Path Sequence number to decide | ||||
the freshness of target information. If a non-target node has to | ||||
generate an NPDAO then it could use following two possibilities | ||||
with Path Sequence number: </t> | ||||
<t>Let the Path Sequence number of old regular DAO that flowed | ||||
through (B) be x. The subsequent regular DAO generated by Node (D) | ||||
will have sequence number x+1.</t> | ||||
<t>i. Node (B) uses the previous Path Sequence number from the | ||||
regular DAO i.e. NPDAO(pathseq=x)</t> | ||||
<t>ii. Node (B) increments the Path Sequence number i.e. | ||||
NPDAO(pathseq=x+1)</t> | ||||
<t>In case i, the NPDAO(pathseq=x) will be dropped by all the | ||||
intermediate nodes since the semantics of Path Sequence number | ||||
dictates that any DAO with an older Path Sequence number be | ||||
dropped.</t> | ||||
<t>In case ii, there is a risk that the NPDAO(pathseq=x+1) | ||||
traverses up the DODAG and invalidates all the routes till the root | ||||
and then the regular DAO(pathseq=x+1) from the target traverses | ||||
upwards. In this case the regular DAO(pathseq=x+1) will be dropped | ||||
from common ancestor node to the root. This will result in route | ||||
downtime.</t> | ||||
<t>Another problem with this scheme is its dependence on the | ||||
upstream neighbor to detect that the downstream neighbor is | ||||
unavailable. There are two possibilities by which such a detection | ||||
might be put to work:</t> | ||||
<t>i. There is P2P traffic from the previous sub-DODAG to any of | ||||
nodes in the sub-tree which has switched the path. In the above | ||||
example, lets consider that Node (G) has P2P traffic for either of | ||||
nodes (D), (E), or (F). In this case, Node (B) will detect | ||||
forwarding error while forwarding the packets from Node (B) to (D). | ||||
But dependence on P2P traffic may not be an optimal way to solve | ||||
this problem considering the reactive approach of the scheme. The | ||||
P2P traffic pattern might be sparse and thus such a detection might | ||||
kick-in too late.</t> | ||||
<t>ii. The other case is where Node (B) explicitly employs some | ||||
mechanism to probe directly attached downstream child nodes. Such | ||||
kind of schemes are seldom used.</t> | ||||
</section> | ||||
<section title="NPDAO can be generated once the link is restored to | ||||
the previous parent"> | ||||
<t>This scheme solves a specific scenario of transient links. The | ||||
child node can detect that the connection to previous parent is | ||||
restored and then transmit an NPDAO to the previous parent to | ||||
invalidate the route. This scheme is stateful, thus requires more | ||||
memory and solves a specific scenario.</t> | ||||
</section> | ||||
</section> | </section> | |||
--> | <section numbered="true" toc="default"> | |||
<section title="Changes to RPL signaling"> | <name>Changes to RPL Signaling</name> | |||
<section title="Change in RPL route invalidation semantics"> | <section numbered="true" toc="default"> | |||
<t> | <name>Change in RPL Route Invalidation Semantics</name> | |||
As described in <xref target="current_npdao"/>, the NPDAO | <t> | |||
As described in <xref target="current_npdao" format="default"/>, | ||||
the NPDAO | ||||
originates at the node changing to a new parent and traverses | originates at the node changing to a new parent and traverses | |||
upstream towards the root. In order to solve the problems as | upstream towards the root. In order to solve the problems | |||
mentioned in <xref target="current_npdao_problems"/>, the | discussed in <xref target="current_npdao_problems" format="defau | |||
lt"/>, this | ||||
document adds a new proactive route invalidation message | document adds a new proactive route invalidation message | |||
called "Destination Cleanup Object" (DCO) that originates at a | called the "Destination Cleanup Object" (DCO), which originates | |||
common ancestor node and flows downstream between the new and | at a | |||
old path. The common ancestor node generates a DCO in response | common ancestor node and flows downstream the | |||
to the change in the next-hop on receiving a regular DAO with | old path. The common ancestor node generates a DCO when removing | |||
updated Path Sequence for the target. | a next hop to a target -- for instance, as a delayed response to | |||
</t> | receiving a regular DAO from another child node with a Path | |||
<t> | Sequence for the target that is the same or newer, in which case | |||
The 6LRs in the path for DCO take action such as route | the DCO transmission is canceled. | |||
</t> | ||||
<t> | ||||
The 6LRs in the path for the DCO take such action as route | ||||
invalidation based on the DCO information and subsequently send | invalidation based on the DCO information and subsequently send | |||
another DCO with the same information downstream to the next | another DCO with the same information downstream to the next | |||
hop. This operation is similar to how the DAOs are handled on | hop(s). This operation is similar to how the DAOs are handled on | |||
intermediate 6LRs in storing MOP in <xref target="RFC6550"/>. | intermediate 6LRs in the Storing MOP <xref target="RFC6550" form | |||
Just like DAO in storing MOP, the DCO is sent using link-local | at="default"/>. | |||
unicast source and destination IPv6 address. Unlike DAO, which | Just like the DAO in the Storing MOP, the DCO is sent using link | |||
-local | ||||
unicast source and destination IPv6 addresses. Unlike the DAO, w | ||||
hich | ||||
always travels upstream, the DCO always travels downstream. | always travels upstream, the DCO always travels downstream. | |||
</t> | </t> | |||
<t> | ||||
<t> | In <xref target="sample_top" format="default"/>, when child Node | |||
In <xref target="sample_top"/>, when node D decides to | D decides to | |||
switch the path from B to C, it sends a regular DAO to node C | switch the path from parent B to parent C, it sends a regular DA | |||
O to Node C | ||||
with reachability information containing the address of D as | with reachability information containing the address of D as | |||
the target and an incremented Path Sequence. Node C will update | the target and an incremented Path Sequence. Node C will update | |||
the routing table based on the reachability information in the | the routing table based on the reachability information in the | |||
DAO and in turn generate another DAO with the same reachability | DAO and will in turn generate another DAO with the same reachabi | |||
information and forward it to H. Node H also follows the same | lity | |||
procedure as Node C and forwards it to node A. When node A | information and forward it to H. Node H recursively follows the | |||
same | ||||
procedure as Node C and forwards it to Node A. When Node A | ||||
receives the regular DAO, it finds that it already has a | receives the regular DAO, it finds that it already has a | |||
routing table entry on behalf of the target address of node D. | routing table entry on behalf of the Target Address of Node D. | |||
It finds however that the next hop information for reaching | It finds, however, that the next-hop information for reaching | |||
node D has changed i.e., node D has decided to change the | Node D has changed, i.e., Node D has decided to change the | |||
paths. In this case, Node A which is the common ancestor node | paths. In this case, Node A, which is the common ancestor node | |||
for node D along the two paths (previous and new), should | for Node D along the two paths (previous and new), can | |||
generate a DCO which traverses downwards in the network. Node A | generate a DCO that traverses the network downwards over the | |||
handles normal DAO forwarding to 6LBR as required by <xref | old path to the target. Node A handles normal DAO forwarding to | |||
target="RFC6550"/>. | the 6LBR as required by <xref target="RFC6550" format="default"/ | |||
</t> | >. | |||
</t> | ||||
</section> | </section> | |||
<section title="Transit Information Option changes" anchor="transit_opt_ | <section anchor="transit_opt_changes" numbered="true" toc="default"> | |||
changes"> | <name>Transit Information Option Changes</name> | |||
<t> | <t> | |||
Every RPL message is divided into base message fields and | Every RPL message is divided into base message fields and | |||
additional Options as described in Section 6 of <xref | additional options, as described in <xref target="RFC6550" secti | |||
target="RFC6550"/>. The base fields apply to the message as a | on="6" sectionFormat="of"/>. The base fields apply to the message as a | |||
whole and options are appended to add message/use-case specific | whole, and options are appended to add message-specific / | |||
use-case-specific | ||||
attributes. As an example, a DAO message may be attributed by | attributes. As an example, a DAO message may be attributed by | |||
one or more "RPL Target" options which specify the reachability | one or more "RPL Target" options that specify that the reachabil | |||
information for the given targets. Similarly, a Transit | ity | |||
information is for the given targets. Similarly, a Transit | ||||
Information option may be associated with a set of RPL Target | Information option may be associated with a set of RPL Target | |||
options. | options. | |||
</t> | </t> | |||
<t> | ||||
<t> | This document specifies a change in the Transit Information opti | |||
This document specifies a change in the Transit Information Opti | on to | |||
on to | ||||
contain the "Invalidate previous route" (I) flag. This 'I' flag signals | contain the "Invalidate previous route" (I) flag. This 'I' flag signals | |||
the common ancestor node to generate a DCO on behalf of the | the common ancestor node to generate a DCO on behalf of the | |||
target node with a RPL Status of 195 indicating that the address | target node with a RPL Status of 195, indicating that the addres s | |||
has moved. The 'I' flag is carried in the Transit Information | has moved. The 'I' flag is carried in the Transit Information | |||
Option which augments the reachability information for a given | option, which augments the reachability information for a given | |||
set of RPL Target(s). Transit Information Option with 'I' flag | set of one or more RPL Targets. A Transit Information option wit | |||
h the 'I' flag | ||||
set should be carried in the DAO message when route | set should be carried in the DAO message when route | |||
invalidation is sought for the corresponding target(s). | invalidation is sought for the corresponding target or targets. | |||
</t> | </t> | |||
<t> | <t> | |||
Value 195 represents 'E' and 'A' bit in RPL Status to be set as | Value 195 represents the 'U' and 'A' bits in RPL Status, to be s | |||
per Figure 3 of <xref target="I-D.ietf-roll-unaware-leaves"/> | et as | |||
with the lower 6 bits with value 3 indicating 'Moved' as per | per Figure 6 of <xref target="RFC9010" format="default"/>, | |||
Table 1 of [RFC8505]. | with the lower 6 bits set to the 6LoWPAN Neighbor Discovery (ND) | |||
</t> | Extended Address Registration Option (EARO) Status value of 3 | |||
<t> <figure align="center" anchor="transit_info_with_i" | indicating 'Moved' as per Table 1 of <xref target="RFC8505"/>. | |||
title="Updated Transit Information Option (New I flag | </t> | |||
added)"> <artwork align="center"><![CDATA[ | <figure anchor="transit_info_with_i"> | |||
0 1 2 3 | <name>Updated Transit Information Option (New 'I' Flag Added | |||
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 | )</name> | |||
<artwork align="center" name="" type="" alt=""><![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 = 0x06 | Option Length |E|I| Flags | Path Control | | | Type = 0x06 | Option Length |E|I| Flags | Path Control | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Path Sequence | Path Lifetime | | | Path Sequence | Path Lifetime | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+]]></artwork> | |||
]]></artwork> </figure> </t> | </figure> | |||
<t> | ||||
I (Invalidate previous route) flag: The 'I' flag is set by the | <dl> | |||
<dt>I (Invalidate previous route) flag:</dt><dd>The 'I' flag is | ||||
set by the | ||||
target node to indicate to the common ancestor node that it | target node to indicate to the common ancestor node that it | |||
wishes to invalidate any previous route between the two paths. | wishes to invalidate any previous route between the two paths. | |||
</t> | </dd> | |||
<t> | </dl> | |||
<xref target="RFC6550"/> allows the parent address to be sent in | <t> | |||
the Transit Information Option depending on the mode of | <xref target="RFC6550" format="default"/> allows the parent addr | |||
operation. In case of storing mode of operation the field is | ess to be sent in | |||
usually not needed. In case of DCO, the parent address field | the Transit Information option, depending on the MOP. | |||
MUST NOT be included. | In the case of the Storing MOP, the field is | |||
</t> | usually not needed. In the case of a DCO, the Parent Address fie | |||
<t> | ld | |||
The common ancestor node SHOULD generate a DCO message in | <bcp14>MUST NOT</bcp14> be included. | |||
response to this 'I' flag when it sees that the routing | </t> | |||
adjacencies have changed for the target. The 'I' flag is | <t> | |||
Upon receiving a DAO message with a Transit Information option t | ||||
hat has the 'I' flag set, | ||||
and as a delayed response removing a routing adjacency to the ta | ||||
rget indicated in the Transit Information option, | ||||
the common ancestor node <bcp14>SHOULD</bcp14> generate a DCO me | ||||
ssage | ||||
to the next hop associated to that adjacency. The 'I' flag is | ||||
intended to give the target node control over its own route | intended to give the target node control over its own route | |||
invalidation, serving as a signal to request DCO generation. | invalidation, serving as a signal to request DCO generation. | |||
</t> | </t> | |||
</section> | </section> | |||
<section title="Destination Cleanup Object (DCO)"> | <section numbered="true" toc="default"> | |||
<t> | <name>Destination Cleanup Object (DCO)</name> | |||
<t> | ||||
A new ICMPv6 RPL control message code is defined by this | A new ICMPv6 RPL control message code is defined by this | |||
specification and is referred to as "Destination Cleanup Object" | specification and is referred to as the "Destination Cleanup Obj ect" | |||
(DCO), which is used for proactive cleanup of state and routing | (DCO), which is used for proactive cleanup of state and routing | |||
information held on behalf of the target node by 6LRs. The DCO | information held on behalf of the target node by 6LRs. The DCO | |||
message always traverses downstream and cleans up route | message always traverses downstream and cleans up route | |||
information and other state information associated with the | information and other state information associated with the | |||
given target. | given target. The format of the DCO message is shown in | |||
</t> | <xref target="dco_obj"/>. | |||
</t> | ||||
<t> <figure align="center" anchor="dco_obj" | <figure anchor="dco_obj"> | |||
title="DCO base object"> | <name>DCO Base Object</name> | |||
<artwork align="center"><![CDATA[ | <artwork align="center" name="" type="" 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 | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| RPLInstanceID |K|D| Flags | RPL Status | DCOSequence | | | RPLInstanceID |K|D| Flags | RPL Status | DCOSequence | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | | | | | |||
+ + | + + | |||
| | | | | | |||
+ DODAGID(optional) + | + DODAGID (optional) + | |||
| | | | | | |||
+ + | + + | |||
| | | | | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Option(s)... | | Option(s)... | |||
+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+]]></artwork> | |||
]]></artwork> </figure> </t> | </figure> | |||
<dl> | ||||
<t> | <dt> RPLInstanceID:</dt><dd>8-bit field indicating the topology i | |||
RPLInstanceID: 8-bit field indicating the topology instance | nstance | |||
associated with the DODAG, as learned from the DIO. | associated with the DODAG, as learned from the DIO. | |||
</t> | </dd> | |||
<t> | <dt> | |||
K: The 'K' flag indicates that the recipient of DCO message is | K:</dt><dd>The 'K' flag indicates that the recipient of a DCO me | |||
ssage is | ||||
expected to send a DCO-ACK back. If the DCO-ACK is not received | expected to send a DCO-ACK back. If the DCO-ACK is not received | |||
even after setting the 'K' flag, an implementation may retry | even after setting the 'K' flag, an implementation may retry | |||
the DCO at a later time. The number of retries are | the DCO at a later time. The number of retries is | |||
implementation and deployment dependent and are expected to be | implementation and deployment dependent and is expected to be | |||
kept similar with those used in DAO retries in <xref | kept similar to the number of DAO retries <xref target="RFC6550" | |||
target="RFC6550"/>. <xref target="dco_retry"/> specifies | format="default"/>. <xref target="dco_retry" format="default"/> specifies | |||
the considerations for DCO retry. A node receiving a DCO | the considerations for DCO retries. A node receiving a DCO | |||
message without the 'K' flag set MAY respond with a DCO-ACK, | message without the 'K' flag set <bcp14>MAY</bcp14> respond with | |||
a DCO-ACK, | ||||
especially to report an error condition. An example error | especially to report an error condition. An example error | |||
condition could be that the node sending the DCO-ACK does not | condition could be that the node sending the DCO-ACK does not | |||
find the routing entry for the indicated target. When the | find the routing entry for the indicated target. When the | |||
sender does not set the 'K' flag it is an indication that the | sender does not set the 'K' flag, it is an indication that the | |||
sender does not expect a response, and the sender SHOULD NOT | sender does not expect a response, and the sender <bcp14>SHOULD | |||
NOT</bcp14> | ||||
retry the DCO. | retry the DCO. | |||
</t> | </dd> | |||
<t> | <dt> | |||
D: The 'D' flag indicates that the DODAGID field is present. | D:</dt><dd>The 'D' flag indicates that the DODAGID field is pres | |||
This flag MUST be set when a local RPLInstanceID is used. | ent. | |||
</t> | This flag <bcp14>MUST</bcp14> be set when a local RPLInstanceID | |||
<t> | is used. | |||
Flags: The 6 bits remaining unused in the Flags field are | </dd> | |||
reserved for future use. These bits MUST be initialized to zero | <dt> | |||
by | Flags:</dt><dd>The 6 bits remaining unused in the Flags field ar | |||
the sender and MUST be ignored by the receiver. | e | |||
</t> | reserved for future use. These bits <bcp14>MUST</bcp14> be initi | |||
<t> | alized to zero by | |||
RPL Status: As defined in <xref target="RFC6550"/> and updated | the sender and <bcp14>MUST</bcp14> be ignored by the receiver. | |||
in <xref target="I-D.ietf-roll-unaware-leaves"/>. The root or | </dd> | |||
<dt> | ||||
RPL Status:</dt><dd>As defined in <xref target="RFC6550" format= | ||||
"default"/> and updated | ||||
in <xref target="RFC9010" format="default"/>. The root or | ||||
common parent that generates a DCO is authoritative for setting | common parent that generates a DCO is authoritative for setting | |||
the status information and the information is unchanged as | the status information, and the information is unchanged as | |||
propagated down the DODAG. This document does not specify a | propagated down the DODAG. This document does not specify a | |||
differentiated action based on the RPL status. | differentiated action based on the RPL Status. | |||
</t> | </dd> | |||
<t> | <dt> | |||
DCOSequence: 8-bit field incremented at each unique DCO message | DCOSequence:</dt><dd>8-bit field incremented at each unique DCO | |||
message | ||||
from a node and echoed in the DCO-ACK message. The initial | from a node and echoed in the DCO-ACK message. The initial | |||
DCOSequence can be chosen randomly by the node. <xref | DCOSequence can be chosen randomly by the node. <xref target="ba | |||
target="base_rules"/> explains the handling of the | se_rules" format="default"/> explains the handling of the | |||
DCOSequence. | DCOSequence. | |||
</t> | </dd> | |||
<t> | <dt> | |||
DODAGID (optional): 128-bit unsigned integer set by a DODAG | DODAGID (optional):</dt><dd>128-bit unsigned integer set by a DO | |||
root that uniquely identifies a DODAG. This field MUST be | DAG | |||
present when the 'D' flag is set and MUST NOT be present if 'D' | root that uniquely identifies a DODAG. This field <bcp14>MUST</b | |||
flag is not set. DODAGID is used when a local RPLInstanceID is | cp14> be | |||
present when the 'D' flag is set and <bcp14>MUST NOT</bcp14> be | ||||
present if the 'D' | ||||
flag is not set. The DODAGID is used when a local RPLInstanceID | ||||
is | ||||
in use, in order to identify the DODAGID that is associated | in use, in order to identify the DODAGID that is associated | |||
with the RPLInstanceID. | with the RPLInstanceID. | |||
</t> | </dd> | |||
</dl> | ||||
<section title="Secure DCO"> | <section numbered="true" toc="default"> | |||
<t> | <name>Secure DCO</name> | |||
A Secure DCO message follows the format in <xref | <t> | |||
target="RFC6550"/> Figure 7, where the base message | A Secure DCO message follows the format shown in <xref target="RFC6550 | |||
format is the DCO message shown in <xref | " format="default"/>, Figure 7, where the base message | |||
target="dco_obj"/>. | format is the DCO message shown in <xref target="dco_obj" format="defa | |||
</t> | ult"/> | |||
</section> | of this document. | |||
</t> | ||||
<section title="DCO Options"> | </section> | |||
<t> | <section numbered="true" toc="default"> | |||
The DCO message MUST carry at least one RPL Target and the | <name>DCO Options</name> | |||
Transit Information Option and MAY carry other valid | <t> | |||
options. This specification allows for the DCO message to | The DCO message <bcp14>MUST</bcp14> carry at least one RPL Target and | |||
carry the following options: | the | |||
<list> | Transit Information option and <bcp14>MAY</bcp14> carry other valid | |||
<t>0x00 Pad1</t> | options. This specification allows for the DCO message to | |||
<t>0x01 PadN</t> | carry the following options: | |||
<t>0x05 RPL Target</t> | </t> | |||
<t>0x06 Transit Information</t> | <dl newline="false" spacing="compact"> | |||
<t>0x09 RPL Target Descriptor</t> | <dt>0x00</dt><dd>Pad1</dd> | |||
</list> | <dt>0x01</dt><dd>PadN</dd> | |||
Section 6.7 of <xref target="RFC6550"/> defines all the | <dt>0x05</dt><dd>RPL Target</dd> | |||
above mentioned options. The DCO carries an RPL Target | <dt>0x06</dt><dd>Transit Information</dd> | |||
Option and an associated Transit Information Option with a | <dt>0x09</dt><dd>RPL Target Descriptor</dd> | |||
lifetime of 0x00000000 to indicate a loss of reachability | </dl> | |||
to that Target. | <t> | |||
</t> | <xref target="RFC6550" section="6.7" sectionFormat="of"/> defines all | |||
</section> | the | |||
<section title="Path Sequence number in the DCO"> | above-mentioned options. The DCO carries a RPL Target | |||
<t> | option and an associated Transit Information option with a | |||
A DCO message may contain a Path Sequence in the Transit | lifetime of 0x00000000 to indicate a loss of reachability | |||
Information Option to identify the freshness of the DCO | to that target. | |||
message. The Path Sequence in the DCO MUST use the same | </t> | |||
Path Sequence number present in the regular DAO message | </section> | |||
when the DCO is generated in response to a DAO message. | <section numbered="true" toc="default"> | |||
Thus if a DCO is received by a 6LR and subsequently a DAO | <name>Path Sequence in the DCO</name> | |||
is received with an old sequence number, then the DAO | <t> | |||
MUST be ignored. When the DCO is generated in response to a | A DCO message includes a Transit Information option for each invalidat | |||
DCO from upstream parent, the Path Sequence MUST be copied | ed path. | |||
from the received DCO. | The value of the Path Sequence counter in the Transit Information opti | |||
</t> | on allows identification of the freshness of the DCO | |||
</section> | message versus the newest known to the 6LRs along the path being remov | |||
ed. | ||||
<section title="Destination Cleanup Option Acknowledgment (DCO-ACK)" | If the DCO is generated by a common parent in response to a DAO messag | |||
> | e, then the Transit Information option in | |||
<t> | the DCO <bcp14>MUST</bcp14> use the value of the Path Sequence as foun | |||
The DCO-ACK message SHOULD be sent as a unicast packet by a | d | |||
DCO recipient in response to a unicast DCO message with 'K' | in the newest Transit Information option that was received for that ta | |||
flag set. If 'K' flag is not set then the receiver of the | rget by the common parent. | |||
DCO message MAY send a DCO-ACK, especially to report an erro | If a 6LR down the path receives a DCO with a Path Sequence that is not | |||
r | newer than | |||
condition. | the Path Sequence as known from a Transit Information option in a DAO | |||
</t> | message, then the 6LR | |||
<t> <figure align="center" anchor="dco_ack" title="DCO-ACK base | <bcp14>MUST NOT</bcp14> remove its current routing state, and it <bcp1 | |||
object"> <artwork align="center"><![CDATA[ | 4>MUST NOT</bcp14> forward the DCO | |||
0 1 2 3 | down a path where it is not newer. If the DCO is newer, the 6LR may | |||
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 | retain a temporary state to ensure that a DAO that is received later | |||
with a Transit Information option with an older sequence number is ign | ||||
ored. A Transit Information option in a DAO message | ||||
that is as new as or newer than that in a DCO wins, meaning that the p | ||||
ath indicated in the DAO is installed and the DAO is propagated. When the DCO is | ||||
propagated upon a | ||||
DCO from an upstream parent, the Path Sequence <bcp14>MUST</bcp14> be | ||||
copied | ||||
from the received DCO. | ||||
</t> | ||||
</section> | ||||
<section numbered="true" toc="default"> | ||||
<name>Destination Cleanup Option Acknowledgment (DCO-ACK)</name> | ||||
<t> | ||||
The DCO-ACK message <bcp14>SHOULD</bcp14> be sent as a unicast packet | ||||
by a | ||||
DCO recipient in response to a unicast DCO message with the 'K' | ||||
flag set. If the 'K' flag is not set, then the receiver of the | ||||
DCO message <bcp14>MAY</bcp14> send a DCO-ACK, especially to report an | ||||
error | ||||
condition. The format of the DCO-ACK message is shown in | ||||
<xref target="dco_ack"/>. | ||||
</t> | ||||
<figure anchor="dco_ack"> | ||||
<name>DCO-ACK Base Object</name> | ||||
<artwork align="center" name="" type="" alt=""><![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 | ||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| RPLInstanceID |D| Flags | DCOSequence | DCO-ACK Status| | | RPLInstanceID |D| Flags | DCOSequence | DCO-ACK Status| | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | | | | | |||
+ + | + + | |||
| | | | | | |||
+ DODAGID(optional) + | + DODAGID (optional) + | |||
| | | | | | |||
+ + | + + | |||
| | | | | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+]]></artwork> | |||
]]></artwork> </figure> </t> | </figure> | |||
<dl> | ||||
<t> | <dt> | |||
RPLInstanceID: 8-bit field indicating the topology instance | RPLInstanceID:</dt><dd>8-bit field indicating the topology instance | |||
associated with the DODAG, as learned from the DIO. | associated with the DODAG, as learned from the DIO. | |||
</t> | </dd> | |||
<t> | <dt> | |||
D: The 'D' flag indicates that the DODAGID field is present. | D:</dt><dd>The 'D' flag indicates that the DODAGID field is present. | |||
This flag MUST be set when a local RPLInstanceID is used. | This flag <bcp14>MUST</bcp14> be set when a local RPLInstanceID is use | |||
</t> | d. | |||
<t> | </dd> | |||
Flags: 7-bit unused field. The field MUST be initialized to | <dt> | |||
zero by the sender and MUST be ignored by the receiver. | Flags:</dt><dd>7-bit unused field. The field <bcp14>MUST</bcp14> be in | |||
</t> | itialized to | |||
<t> | zero by the sender and <bcp14>MUST</bcp14> be ignored by the receiver. | |||
DCOSequence: 8-bit field. The DCOSequence in DCO-ACK is | </dd> | |||
copied from the DCOSequence received in the DCO message. | <dt> | |||
</t> | DCOSequence:</dt><dd>8-bit field. The DCOSequence in the DCO-ACK is | |||
<t> | copied from the DCOSequence received in the DCO message. | |||
DCO-ACK Status: Indicates the completion. A value of 0 is | </dd> | |||
defined as | <dt> | |||
unqualified acceptance in this specification. A value of 1 | DCO-ACK Status:</dt><dd>Indicates completion status. The DCO-ACK Statu | |||
is | s field is defined based on Figure 6 of <xref target="RFC9010" format="default"/ | |||
defined as "No routing-entry for the Target found". The | > defining the RPL Status Format. A StatusValue of 0 along with the 'U' bit set | |||
remaining status values are reserved as rejection codes. | to 0 indicates Success / Unqualified acceptance as per Figure 6 of <xref target= | |||
</t> | "RFC9010" format="default"/>. A StatusValue of 1 with the 'U' bit set to 1 indic | |||
<t> | ates 'No routing entry' as defined in <xref target="rpl_reject_status" format="d | |||
DODAGID (optional): 128-bit unsigned integer set by a DODAG | efault"/> of this document. | |||
root that uniquely identifies a DODAG. This field MUST be | </dd> | |||
present when the 'D' flag is set and MUST NOT be present | <dt> | |||
when 'D' flag is not set. DODAGID is used when a local | DODAGID (optional):</dt><dd>128-bit unsigned integer set by a DODAG | |||
RPLInstanceID is in use, in order to identify the DODAGID | root that uniquely identifies a DODAG. This field <bcp14>MUST</bcp14> | |||
that is associated with the RPLInstanceID. | be | |||
</t> | present when the 'D' flag is set and <bcp14>MUST NOT</bcp14> be presen | |||
</section> | t | |||
when the 'D' flag is not set. The DODAGID is used when a local | ||||
<section title="Secure DCO-ACK"> | RPLInstanceID is in use, in order to identify the DODAGID | |||
<t> | that is associated with the RPLInstanceID. | |||
A Secure DCO-ACK message follows the format in <xref | </dd> | |||
target="RFC6550"/> Figure 7, where the base message | </dl> | |||
format is the DCO-ACK message shown in <xref | ||||
target="dco_ack"/>. | ||||
</t> | ||||
</section> | ||||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="DCO Base Rules" anchor="base_rules"> | <name>Secure DCO-ACK</name> | |||
<t> | <t> | |||
<list style="numbers"> | A Secure DCO-ACK message follows the format shown in <xref target="RFC | |||
<t> | 6550" format="default"/>, Figure 7, where the base message | |||
If a node sends a DCO message with newer or different | format is the DCO-ACK message shown in <xref target="dco_ack" format=" | |||
information than the prior DCO message transmission, it | default"/> of this document. | |||
MUST increment the DCOSequence field by at least one. | </t> | |||
A DCO message transmission that is identical to the | ||||
prior DCO message transmission MAY increment the | ||||
DCOSequence field. The DCOSequence counter follows the | ||||
sequence counter operation as defined in Section 7.2 of | ||||
<xref target="RFC6550"/>. | ||||
</t> | ||||
<t> | ||||
The RPLInstanceID and DODAGID fields of a DCO message | ||||
MUST be the same value as that of the DAO message in | ||||
response to which the DCO is generated on the common | ||||
ancestor node. | ||||
</t> | ||||
<t> | ||||
A node MAY set the 'K' flag in a unicast DCO message to | ||||
solicit a unicast DCO-ACK in response in order to | ||||
confirm the attempt. | ||||
</t> | ||||
<t> | ||||
A node receiving a unicast DCO message with the 'K' | ||||
flag set SHOULD respond with a DCO-ACK. A node | ||||
receiving a DCO message without the 'K' flag set MAY | ||||
respond with a DCO-ACK, especially to report an error | ||||
condition. | ||||
</t> | ||||
<t> | ||||
A node receiving a unicast DCO message MUST verify the | ||||
stored Path Sequence in context to the given target. If | ||||
the stored Path Sequence is more fresh, newer than | ||||
the Path Sequence received in the DCO, then the DCO | ||||
MUST be dropped. | ||||
</t> | ||||
<t> | ||||
A node that sets the 'K' flag in a unicast DCO message | ||||
but does not receive DCO-ACK in response MAY reschedule | ||||
the DCO message transmission for another attempt, up | ||||
until an implementation specific number of retries. | ||||
</t> | ||||
<t> | ||||
A node receiving a unicast DCO message with its own | ||||
address in the RPL Target Option MUST strip-off that | ||||
Target Option. If this Target Option is the only one in | ||||
the DCO message then the DCO message MUST be dropped. | ||||
</t> | ||||
</list> | ||||
</t> | ||||
<t> | ||||
The scope of DCOSequence values is unique to the node which | ||||
generates it. | ||||
</t> | ||||
</section> | </section> | |||
</section> | ||||
<section title="Unsolicited DCO"> | <section anchor="base_rules" numbered="true" toc="default"> | |||
<t> | <name>DCO Base Rules</name> | |||
A 6LR may generate an unsolicited DCO to unilaterally cleanup | <ol spacing="normal" type="1"><li> | |||
If a node sends a DCO message with newer or different | ||||
information than the prior DCO message transmission, it | ||||
<bcp14>MUST</bcp14> increment the DCOSequence field by at least on | ||||
e. | ||||
A DCO message transmission that is identical to the | ||||
prior DCO message transmission <bcp14>MAY</bcp14> increment the | ||||
DCOSequence field. The DCOSequence counter follows the | ||||
sequence counter operation as defined in | ||||
<xref target="RFC6550" section="7.2" sectionFormat="of"/>. | ||||
</li> | ||||
<li> | ||||
The RPLInstanceID and DODAGID fields of a DCO message | ||||
<bcp14>MUST</bcp14> have the same values as those contained in the | ||||
DAO message in | ||||
response to which the DCO is generated on the common | ||||
ancestor node. | ||||
</li> | ||||
<li> | ||||
A node <bcp14>MAY</bcp14> set the 'K' flag in a unicast DCO messag | ||||
e to | ||||
solicit a unicast DCO-ACK in response, in order to | ||||
confirm the attempt. | ||||
</li> | ||||
<li> | ||||
A node receiving a unicast DCO message with the 'K' | ||||
flag set <bcp14>SHOULD</bcp14> respond with a DCO-ACK. A node | ||||
receiving a DCO message without the 'K' flag set <bcp14>MAY</bcp14 | ||||
> | ||||
respond with a DCO-ACK, especially to report an error | ||||
condition. | ||||
</li> | ||||
<li> | ||||
A node receiving a unicast DCO message <bcp14>MUST</bcp14> verify | ||||
the | ||||
stored Path Sequence in context to the given target. If | ||||
the stored Path Sequence is as new as or newer than | ||||
the Path Sequence received in the DCO, then the DCO | ||||
<bcp14>MUST</bcp14> be dropped. | ||||
</li> | ||||
<li> | ||||
A node that sets the 'K' flag in a unicast DCO message | ||||
but does not receive a DCO-ACK in response <bcp14>MAY</bcp14> resc | ||||
hedule | ||||
the DCO message transmission for another attempt, up | ||||
until an implementation-specific number of retries. | ||||
</li> | ||||
<li> | ||||
A node receiving a unicast DCO message with its own | ||||
address in the RPL Target option <bcp14>MUST</bcp14> strip off tha | ||||
t | ||||
Target option. If this Target option is the only one in | ||||
the DCO message, then the DCO message <bcp14>MUST</bcp14> be dropp | ||||
ed. | ||||
</li> | ||||
</ol> | ||||
<t> | ||||
The scope of DCOSequence values is unique to the node that | ||||
generates them. | ||||
</t> | ||||
</section> | ||||
<section numbered="true" toc="default"> | ||||
<name>Unsolicited DCO</name> | ||||
<t> | ||||
A 6LR may generate an unsolicited DCO to unilaterally clean up | ||||
the path on behalf of the target entry. The 6LR has all the | the path on behalf of the target entry. The 6LR has all the | |||
state information, namely, the Target address and the Path | state information, namely, the Target Address and the Path | |||
Sequence, required for generating DCO in its routing table. | Sequence, required for generating a DCO in its routing table. | |||
The conditions why 6LR may generate an unsolicited DCO are | The conditions under which a 6LR may generate an unsolicited DCO | |||
beyond the scope of this document but some possible reasons | are | |||
could be: | beyond the scope of this document, but possible reasons | |||
<list style="numbers"> | could be as follows: | |||
<t> | </t> | |||
On route expiry of an entry, a 6LR may decide to | <ol spacing="normal" type="1"><li> | |||
graciously cleanup the entry by initiating DCO. | On route expiry of an entry, a 6LR may decide to | |||
</t> | graciously clean up the entry by initiating a DCO. | |||
<t> | </li> | |||
6LR needs to entertain higher priority entries in case | <li> | |||
the routing table is full, thus resulting in eviction | A 6LR needs to entertain higher-priority entries in case | |||
of an existing routing entry. In this case the eviction | the routing table is full, thus resulting in eviction | |||
can be handled graciously using DCO. | of an existing routing entry. In this case, the eviction | |||
</t> | can be handled graciously by using a DCO. | |||
</list> | </li> | |||
</t> | </ol> | |||
<t> | <t> | |||
Note that if the 6LR initiates a unilateral path cleanup using | A DCO that is generated asynchronously to a DAO message and is meant t | |||
DCO and if it has the latest state for the target then the DCO | o | |||
would finally reach the target node. Thus the target node would | discard all state along the path regardless of the Path Sequence <bcp1 | |||
be informed of its invalidation. | 4>MUST</bcp14> | |||
</t> | use a Path Sequence value of 240 (see <xref target="RFC6550" section=" | |||
7.2" sectionFormat="of"/>). | ||||
This value allows the DCO to win against any established DAO path but | ||||
to lose against a DAO path that is being installed. | ||||
Note that if an ancestor initiates a unilateral path cleanup on an | ||||
established path using a DCO with a Path Sequence value of 240, the | ||||
DCO will eventually reach the target node, which will thus be informed | ||||
of the path invalidation. | ||||
</t> | ||||
</section> | ||||
<section numbered="true" toc="default"> | ||||
<name>Other Considerations</name> | ||||
<section numbered="true" toc="default"> | ||||
<name>Invalidation of Dependent Nodes</name> | ||||
<t> | ||||
The RPL specification <xref target="RFC6550" format="default"/> does n | ||||
ot provide a | ||||
mechanism for route invalidation for dependent nodes. This | ||||
document allows the invalidation of dependent nodes. Dependent | ||||
nodes will generate their respective DAOs to update their | ||||
paths, and the previous route invalidation for those nodes | ||||
should work in a manner similar to what is described for a switching | ||||
node. The dependent node may set the 'I' flag in the Transit | ||||
Information option as part of a regular DAO so as to | ||||
request invalidation of the previous route from the common | ||||
ancestor node. | ||||
</t> | ||||
<t> | ||||
Dependent nodes do not have any indication regarding whether any | ||||
of their parents have in turn decided to switch their | ||||
parent. Thus, for route invalidation, the dependent nodes may | ||||
choose to always set the 'I' flag in all their DAO messages' | ||||
Transit Information options. Note that setting the 'I' flag is | ||||
not counterproductive even if there is no previous | ||||
route to be invalidated. | ||||
</t> | ||||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Other considerations"> | <name>NPDAO and DCO in the Same Network</name> | |||
<section title="Dependent Nodes invalidation"> | <t> | |||
<t> | The NPDAO mechanism provided in <xref target="RFC6550" format="default | |||
Current RPL <xref target="RFC6550"/> does not provide a | "/> can | |||
mechanism for route invalidation for dependent nodes. This | still be used in the same network where a DCO is used. | |||
document allows the dependent nodes invalidation. Dependent | NPDAO messaging can be used, for example, on route lifetime | |||
nodes will generate their respective DAOs to update their | expiry of the target or when the node simply decides to | |||
paths, and the previous route invalidation for those nodes | gracefully terminate the RPL session on graceful node | |||
should work in the similar manner described for switching | shutdown. Moreover, a deployment can have a mix of nodes | |||
node. The dependent node may set the 'I' flag in the Transit | supporting the DCO and the existing NPDAO mechanism. It is | |||
Information Option as part of regular DAO so as to | also possible that the same node supports both NPDAO | |||
request invalidation of previous route from the common | and DCO signaling for route invalidation. | |||
ancestor node. | </t> | |||
</t> | <t> | |||
<t> | <xref target="RFC6550" section="9.8" sectionFormat="of"/> states, "Whe | |||
Dependent nodes do not have any indication regarding if any | n a | |||
of their parents in turn have decided to switch their | node removes a node from its DAO parent set, it <bcp14>SHOULD</bcp14> | |||
parent. Thus for route invalidation the dependent nodes may | send a No-Path DAO message (Section 6.4.3) to that removed DAO parent | |||
choose to always set the 'I' flag in all its DAO message's | to | |||
Transit Information Option. Note that setting the 'I' flag i | invalidate the existing route." This document introduces | |||
s | an alternative and more optimized way to perform route invalidation, | |||
not counterproductive even if there is no previous | but it also allows existing NPDAO messaging to work. Thus, | |||
route to be invalidated. | an implementation has two choices to make when a route | |||
</t> | invalidation is to be initiated: | |||
</section> | </t> | |||
<section title="NPDAO and DCO in the same network"> | <ol spacing="normal" type="1"><li> | |||
<t> | Use an NPDAO to invalidate the previous route, and | |||
The current NPDAO mechanism in <xref target="RFC6550"/> can | send a regular DAO on the new path. | |||
still be used in the same network where DCO is used. The | </li> | |||
NPDAO messaging can be used, for example, on route lifetime | <li> | |||
expiry of the target or when the node simply decides to | Send a regular DAO on the new path with the 'I' | |||
gracefully terminate the RPL session on graceful node | flag set in the Transit Information option such | |||
shutdown. Moreover, a deployment can have a mix of nodes | that the common ancestor node initiates the DCO | |||
supporting the DCO and the existing NPDAO mechanism. It is | message downstream to invalidate the previous | |||
also possible that the same node supports both the NPDAO | route. | |||
and DCO signaling for route invalidation. | </li> | |||
</t> | </ol> | |||
<t> | <t> | |||
Section 9.8 of <xref target="RFC6550"/> states, "When a | This document recommends using option 2, for the reasons | |||
node removes a node from its DAO parent set, it SHOULD | specified in <xref target="requirements" format="default"/> | |||
send a No-Path DAO message to that removed DAO parent to | of this document. | |||
invalidate the existing router". This document introduces | </t> | |||
an alternative and more optimized way of route invalidation | <t> | |||
but it also allows existing NPDAO messaging to work. Thus | This document assumes that all the 6LRs in the network | |||
an implementation has two choices to make when a route | support this specification. If there are 6LR nodes that do not support | |||
invalidation is to be initiated: | this document that are in the path of the DCO message transmission, then the | |||
</t> | route invalidation for the corresponding targets (targets that are in | |||
<t> | the DCO message) may not work | |||
<list style="numbers"> | or may work partially. Alternatively, a node | |||
<t> | could generate an NPDAO if it does not receive a DCO with | |||
Use NPDAO to invalidate the previous route and | itself as the target within a specified time limit. The specified | |||
send regular DAO on the new path. | time limit is deployment specific and depends upon the | |||
</t> | maximum depth of the network and per-hop average latency. | |||
<t> | Note that sending an NPDAO and a DCO for the same operation | |||
Send regular DAO on the new path with the 'I' | would not result in unwanted side effects because the | |||
flag set in the Transit Information Option such | acceptability of an NPDAO or a DCO depends upon the Path | |||
that the common ancestor node initiates the DCO | Sequence freshness. | |||
message downstream to invalidate the previous | </t> | |||
route. | </section> | |||
</t> | <section anchor="dco_retry" numbered="true" toc="default"> | |||
</list> | <name>Considerations for DCO Retries</name> | |||
</t> | <t> | |||
<t> | A DCO message could be retried by a sender if it sets the | |||
This document recommends using option 2 for reasons | 'K' flag and does not receive a DCO-ACK. The DCO retry time | |||
specified in <xref target="requirements"/> in this | could be dependent on the maximum depth of the network and | |||
document. | average per-hop latency. This could range from 2 seconds to | |||
</t> | 120 seconds, depending on the deployment. If the | |||
<t> | latency limits are not known, an implementation <bcp14>MUST NOT</bcp14 | |||
This document assumes that all the 6LRs in the network | > | |||
support this specification. If there are 6LRs en-route DCO | retry more than once in 3 seconds and <bcp14>MUST NOT</bcp14> retry mo | |||
message path which do not support this document, then the | re | |||
route invalidation for corresponding targets may not work | than three times. | |||
or may work partially i.e., only part of the path | </t> | |||
supporting DCO may be invalidated. Alternatively, a node | <t> | |||
could generate an NPDAO if it does not receive a DCO with | The number of retries could also be set depending on how | |||
itself as target within specified time limit. The specified | critical the route invalidation could be for the deployment | |||
time limit is deployment specific and depends upon the | and the link-layer retry configuration. For networks | |||
maximum depth of the network and per hop average latency. | supporting only Multi-Point to Point (MP2P) and Point-to-Multipoint (P | |||
Note that sending NPDAO and DCO for the same operation | 2MP) flows, such as in Advanced Metering Infrastructure (AMI) and | |||
would not result in unwanted side-effects because the | telemetry applications, the 6LRs may not be very keen to | |||
acceptability of NPDAO or DCO depends upon the Path | invalidate routes, unless they are highly | |||
Sequence freshness. | memory constrained. For home and building automation | |||
</t> | networks that may have substantial P2P traffic, the 6LRs | |||
</section> | might be keen to invalidate efficiently because it may | |||
<section title="Considerations for DCO retry" anchor="dco_retry"> | additionally impact forwarding efficiency. | |||
<t> | </t> | |||
A DCO message could be retried by a sender if it sets the | </section> | |||
'K' flag and does not receive a DCO-ACK. The DCO retry time | <section numbered="true" toc="default"> | |||
could be dependent on the maximum depth of the network and | <name>DCO with Multiple Preferred Parents</name> | |||
average per hop latency. This could range from 2 seconds to | <t> | |||
120 seconds depending on the deployment. In case the | <xref target="RFC6550" format="default"/> allows a node to select mult | |||
latency limits are not known, an implementation MUST NOT | iple | |||
retry more than once in 3 seconds and MUST NOT retry more | preferred parents for route establishment. | |||
than 3 times. | <xref target="RFC6550" section="9.2.1" sectionFormat="of"/> specifies, | |||
</t> | "All DAOs generated | |||
<t> | at the same time for the same target <bcp14>MUST</bcp14> be sent with | |||
The number of retries could also be set depending on how | the | |||
critical the route invalidation could be for the deployment | same Path Sequence in the Transit Information." | |||
and the link layer retry configuration. For networks | Subsequently, when route invalidation has to be initiated, | |||
supporting only MP2P and P2MP flows, such as in AMI and | an NPDAO, which can be initiated with an | |||
telemetry applications, the 6LRs may not be very keen to | updated Path Sequence to all the parent nodes through which | |||
invalidate routes, unless they are highly | the route is to be invalidated, can be used; see <xref target="RFC6550 | |||
memory-constrained. For home and building automation | "/>. | |||
networks which may have substantial P2P traffic, the 6LRs | </t> | |||
might be keen to invalidate efficiently because it may | <t> | |||
additionally impact the forwarding efficiency. | With a DCO, the target node itself does not initiate the | |||
</t> | route invalidation; this is left to the common ancestor | |||
</section> | node. A common ancestor node when it discovers an updated | |||
<section title="DCO with multiple preferred parents"> | DAO from a new next hop, it initiates a DCO. It is recommended | |||
<t> | that an implementation initiate a DCO after a time period (DelayDCO) s | |||
<xref target="RFC6550"/> allows a node to select multiple | uch that | |||
preferred parents for route establishment. Section 9.2.1 | the common ancestor node may receive updated DAOs from all | |||
of <xref target="RFC6550"/> specifies, "All DAOs generated | possible next hops. This will help to reduce DCO control | |||
at the same time for the same Target MUST be sent with the | overhead, i.e., the common ancestor can wait for updated | |||
same Path Sequence in the Transit Information". | DAOs from all possible directions before initiating a DCO | |||
Subsequently when route invalidation has to be initiated, | for route invalidation. After timeout, the DCO needs to be | |||
RPL mentions use of NPDAO which can be initiated with an | generated for all the next hops for which the route | |||
updated Path Sequence to all the parent nodes through which | invalidation needs to be done. | |||
the route is to be invalidated. | </t> | |||
</t> | <t> | |||
<t> | This document recommends using a DelayDCO timer value of | |||
With DCO, the Target node itself does not initiate the | 1 second. This value is inspired by the default DelayDAO timer value | |||
route invalidation and it is left to the common ancestor | of 1 second <xref target="RFC6550" format="default"/>. Here, the hypot | |||
node. A common ancestor node when it discovers an updated | hesis is | |||
DAO from a new next-hop, it initiates a DCO. With multiple | that the DAOs from all possible parent sets would be | |||
preferred parents, this handling does not change. But in | received on the common ancestor within this time period. | |||
this case it is recommended that an implementation | </t> | |||
initiates a DCO after a time period (DelayDCO) such that | <t> | |||
the common ancestor node may receive updated DAOs from all | It is still possible that a DCO is generated before all the | |||
possible next-hops. This will help to reduce DCO control | updated DAOs from all the paths are received. In this case, | |||
overhead i.e., the common ancestor can wait for updated | the ancestor node would start the invalidation procedure | |||
DAOs from all possible directions before initiating a DCO | for paths from which the updated DAO is not received. The | |||
for route invalidation. After timeout, the DCO needs to be | DCO generated in this case would start invalidating the | |||
generated for all the next-hops for whom the route | segments along these paths on which the updated DAOs are | |||
invalidation needs to be done. | not received. But once the DAO reaches these segments, the | |||
</t> | routing state would be updated along these segments; this | |||
<t> | should not lead to any inconsistent routing states. | |||
This document recommends using a DelayDCO timer value of | </t> | |||
1sec. This value is inspired by the default DelayDAO value | <t> | |||
of 1sec in <xref target="RFC6550"/>. Here the hypothesis is | Note that there is no requirement for synchronization | |||
that the DAOs from all possible parent sets would be | between a DCO and DAOs. The DelayDCO timer simply ensures | |||
received on the common ancestor within this time period. | that DCO control overhead can be reduced and is only | |||
</t> | needed when the network contains nodes using multiple | |||
<t> | preferred parents. | |||
It is still possible that a DCO is generated before all the | </t> | |||
updated DAOs from all the paths are received. In this case, | ||||
the ancestor node would start the invalidation procedure | ||||
for paths from which the updated DAO is not received. The | ||||
DCO generated in this case would start invalidating the | ||||
segments along these paths on which the updated DAOs are | ||||
not received. But once the DAO reaches these segments, the | ||||
routing state would be updated along these segments and | ||||
should not lead to any inconsistent routing state. | ||||
</t> | ||||
<t> | ||||
Note that there is no requirement for synchronization | ||||
between DCO and DAOs. The DelayDCO timer simply ensures | ||||
that the DCO control overhead can be reduced and is only | ||||
needed when the network contains nodes using multiple | ||||
preferred parent. | ||||
</t> | ||||
</section> | ||||
</section> | </section> | |||
</section> | ||||
</section> | </section> | |||
<section anchor="IANA" numbered="true" toc="default"> | ||||
<name>IANA Considerations</name> | ||||
<t> | ||||
IANA has allocated codes for the DCO and DCO-ACK | ||||
messages from the "RPL Control Codes" registry. | ||||
</t> | ||||
<table align="center"> | ||||
<name>New Codes for DCO and DCO-ACK Messages</name> | ||||
<thead> | ||||
<tr> | ||||
<th align="center">Code</th> | ||||
<th align="center">Description</th> | ||||
<th align="center">Reference</th> | ||||
</tr> | ||||
</thead> | ||||
<tbody> | ||||
<tr> | ||||
<td align="center">0x07</td> | ||||
<td align="center">Destination Cleanup Object</td> | ||||
<td align="center">This document</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="center">0x08</td> | ||||
<td align="center">Destination Cleanup Object Acknowledgment</td> | ||||
<td align="center">This document</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="center">0x87</td> | ||||
<td align="center">Secure Destination Cleanup Object</td> | ||||
<td align="center">This document</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="center">0x88</td> | ||||
<td align="center">Secure Destination Cleanup Object Acknowledgment< | ||||
/td> | ||||
<td align="center">This document</td> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
<section anchor="Acknowledgments" title="Acknowledgments"> | <t> | |||
IANA has allocated bit 1 from the "Transit Information | ||||
Option Flags" registry for the 'I' flag (Invalidate previous route; | ||||
see <xref target="transit_opt_changes" format="default"/>). | ||||
</t> | ||||
<section numbered="true" toc="default"> | ||||
<name>New Registry for the Destination Cleanup Object (DCO) Flags</name> | ||||
<t> | <t> | |||
Many thanks to Alvaro Retana, Cenk Gundogan, Simon Duquennoy, Georgi | IANA has created a registry for the 8-bit Destination Cleanup | |||
os | Object (DCO) Flags field. The "Destination Cleanup Object | |||
Papadopoulous, Peter Van Der Stok for their review and comments. | (DCO) Flags" registry is located in the "Routing Protocol for | |||
Alvaro Retana helped shape this document's final version with | Low Power and Lossy Networks (RPL)" registry. | |||
critical review comments. | ||||
</t> | </t> | |||
</section> | ||||
<!-- Possibly a 'Contributors' section ... --> | ||||
<section anchor="IANA" title="IANA Considerations"> | ||||
<t> | <t> | |||
IANA is requested to allocate new codes for the DCO and DCO-ACK | New bit numbers may be allocated only by IETF Review | |||
messages from the RPL Control Codes registry. | <xref target="RFC8126"/>. Each | |||
bit is tracked with the following qualities: | ||||
</t> | </t> | |||
<ul spacing="normal"> | ||||
<texttable title=""> | <li>Bit number (counting from bit 0 as the most significant bit)</li> | |||
<ttcol align='center'>Code</ttcol> | <li>Capability description</li> | |||
<ttcol align='center'>Description</ttcol> | <li>Defining RFC</li> | |||
<ttcol align='center'>Reference</ttcol> | </ul> | |||
<c>TBD1</c> | ||||
<c>Destination Cleanup Object</c> | ||||
<c>This document</c> | ||||
<c>TBD2</c> | ||||
<c>Destination Cleanup Object Acknowledgment</c> | ||||
<c>This document</c> | ||||
<c>TBD3</c> | ||||
<c>Secure Destination Cleanup Object</c> | ||||
<c>This document</c> | ||||
<c>TBD4</c> | ||||
<c>Secure Destination Cleanup Object Acknowledgment</c> | ||||
<c>This document</c> | ||||
</texttable> | ||||
<t> | <t> | |||
IANA is requested to allocate bit 1 from the Transit Information | ||||
Option Flags registry for the 'I' flag (<xref target="transit_opt_ch | ||||
anges"/>) | ||||
</t> | ||||
<section title="New Registry for the Destination Cleanup Object (DCO) Fl | ||||
ags"> | ||||
<t> | ||||
IANA is requested to create a registry for the 8-bit Destination | ||||
Cleanup | ||||
Object (DCO) Flags field. This registry should be located in | ||||
existing category of "Routing Protocol for Low Power and Lossy | ||||
Networks (RPL)". | ||||
</t> | ||||
<t> | ||||
New bit numbers may be allocated only by an IETF Review. Each | ||||
bit is tracked with the following qualities: | ||||
</t> | ||||
<t> | ||||
<list style="symbols"> | ||||
<t>Bit number (counting from bit 0 as the most significant b | ||||
it)</t> | ||||
<t>Capability description</t> | ||||
<t>Defining RFC</t> | ||||
</list> | ||||
</t> | ||||
<t> | ||||
The following bits are currently defined: | The following bits are currently defined: | |||
</t> | </t> | |||
<texttable title="DCO Base Flags"> | <table align="center"> | |||
<ttcol align='center'>Bit number</ttcol> | <name>DCO Base Flags</name> | |||
<ttcol align='center'>Description</ttcol> | <thead> | |||
<ttcol align='center'>Reference</ttcol> | <tr> | |||
<c>0</c> | <th align="center">Bit number</th> | |||
<c>DCO-ACK request (K)</c> | <th align="center">Description</th> | |||
<c>This document</c> | <th align="center">Reference</th> | |||
</tr> | ||||
<c>1</c> | </thead> | |||
<c>DODAGID field is present (D)</c> | <tbody> | |||
<c>This document</c> | <tr> | |||
</texttable> | <td align="center">0</td> | |||
</section> | <td align="center">DCO-ACK request (K)</td> | |||
<section title="New Registry for the Destination Cleanup Object Acknowle | <td align="center">This document</td> | |||
dgment (DCO-ACK) Status field"> | </tr> | |||
<t> | <tr> | |||
IANA is requested to create a registry for the 8-bit Destination | <td align="center">1</td> | |||
Cleanup | <td align="center">DODAGID field is present (D)</td> | |||
Object Acknowledgment (DCO-ACK) Status field. This registry | <td align="center">This document</td> | |||
should be located in existing category of "Routing Protocol for | </tr> | |||
Low Power and Lossy Networks (RPL)". | </tbody> | |||
</t> | </table> | |||
<t> | </section> | |||
New Status values may be allocated only by an IETF Review. Each | <section numbered="true" toc="default"> | |||
value is tracked with the following qualities: | <name>New Registry for the Destination Cleanup Object (DCO) Acknowledgme | |||
</t> | nt Flags</name> | |||
<t> | <t> | |||
<list style="symbols"> | IANA has created a registry for the 8-bit | |||
<t>Status Code</t> | ||||
<t>Description</t> | ||||
<t>Defining RFC</t> | ||||
</list> | ||||
</t> | ||||
<t> | ||||
The following values are currently defined: | ||||
</t> | ||||
<texttable title="DCO-ACK Status Codes"> | ||||
<ttcol align='center'>Status Code</ttcol> | ||||
<ttcol align='center'>Description</ttcol> | ||||
<ttcol align='center'>Reference</ttcol> | ||||
<c>0</c> | ||||
<c>Unqualified acceptance</c> | ||||
<c>This document</c> | ||||
<c>1</c> | ||||
<c>No routing-entry for the indicated Target found</c> | ||||
<c>This document</c> | ||||
</texttable> | ||||
</section> | ||||
<section title="New Registry for the Destination Cleanup Object (DCO) | ||||
Acknowledgment Flags"> | ||||
<t> | ||||
IANA is requested to create a registry for the 8-bit | ||||
Destination Cleanup Object (DCO) Acknowledgment Flags field. | Destination Cleanup Object (DCO) Acknowledgment Flags field. | |||
This registry should be located in existing category of | The "Destination Cleanup Object (DCO) Acknowledgment Flags" regi | |||
"Routing Protocol for Low Power and Lossy Networks (RPL)". | stry | |||
</t> | is located in the | |||
<t> | "Routing Protocol for Low Power and Lossy Networks (RPL)" regist | |||
New bit numbers may be allocated only by an IETF Review. Each | ry. | |||
</t> | ||||
<t> | ||||
New bit numbers may be allocated only by IETF Review | ||||
<xref target="RFC8126"/>. Each | ||||
bit is tracked with the following qualities: | bit is tracked with the following qualities: | |||
</t> | </t> | |||
<t> | <ul spacing="normal"> | |||
<list style="symbols"> | <li>Bit number (counting from bit 0 as the most significant bit)</li> | |||
<t>Bit number (counting from bit 0 as the most significant b | <li>Capability description</li> | |||
it)</t> | <li>Defining RFC</li> | |||
<t>Capability description</t> | </ul> | |||
<t>Defining RFC</t> | <t> | |||
</list> | The following bit is currently defined: | |||
</t> | </t> | |||
<t> | <table align="center"> | |||
The following bits are currently defined: | <name>DCO-ACK Base Flag</name> | |||
</t> | <thead> | |||
<texttable title="DCO-ACK Base Flags"> | <tr> | |||
<ttcol align='center'>Bit number</ttcol> | <th align="center">Bit number</th> | |||
<ttcol align='center'>Description</ttcol> | <th align="center">Description</th> | |||
<ttcol align='center'>Reference</ttcol> | <th align="center">Reference</th> | |||
<c>0</c> | </tr> | |||
<c>DODAGID field is present (D)</c> | </thead> | |||
<c>This document</c> | <tbody> | |||
</texttable> | <tr> | |||
</section> | <td align="center">0</td> | |||
</section> | <td align="center">DODAGID field is present (D)</td> | |||
<td align="center">This document</td> | ||||
<section anchor="Security" title="Security Considerations"> | </tr> | |||
</tbody> | ||||
</table> | ||||
</section> | ||||
<section anchor="rpl_reject_status" numbered="true" toc="default"> | ||||
<name>RPL Rejection Status Values</name> | ||||
<t> | <t> | |||
This document adds a new status value to the "RPL Rejection Status" s | ||||
ubregistry initially created per <xref target="RFC9010" sectionFormat="of" secti | ||||
on="12.6"/>. | ||||
</t> | ||||
<table align="center"> | ||||
<name>Rejection Value of the RPL Status</name> | ||||
<thead> | ||||
<tr> | ||||
<th align="center">Value</th> | ||||
<th align="center">Meaning</th> | ||||
<th align="center">Reference</th> | ||||
</tr> | ||||
</thead> | ||||
<tbody> | ||||
<tr> | ||||
<td align="center">1</td> | ||||
<td align="center">No routing entry</td> | ||||
<td align="center">This document</td> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
</section> | ||||
</section> | ||||
<section anchor="Security" numbered="true" toc="default"> | ||||
<name>Security Considerations</name> | ||||
<t> | ||||
This document introduces the ability for a common ancestor node to | This document introduces the ability for a common ancestor node to | |||
invalidate a route on behalf of the target node. The common | invalidate a route on behalf of the target node. The common | |||
ancestor node could be directed to do so by the target node using | ancestor node could be directed to do so by the target node, using | |||
the 'I' flag in DCO's Transit Information Option. However, the commo | the 'I' flag in a DCO's Transit Information option. However, the com | |||
n | mon | |||
ancestor node is in a position to unilaterally initiate the route | ancestor node is in a position to unilaterally initiate the route | |||
invalidation since it possesses all the required state information, | invalidation, since it possesses all the required state information, | |||
namely, the Target address and the corresponding Path Sequence. | namely, the Target Address and the corresponding Path Sequence. | |||
Thus a rogue common ancestor node could initiate such an | Thus, a rogue common ancestor node could initiate such an | |||
invalidation and impact the traffic to the target node. | invalidation and impact the traffic to the target node. | |||
</t> | </t> | |||
<t> The DCO carries a RPL Status value, which is informative. New Status | <t> The DCO carries a RPL Status value, which is informative. New Status | |||
values may be created over time and a node will ignore an unknown | values may be created over time, and a node will ignore an unknown | |||
Status value. This enables RPL Status field to be | Status value. This enables the RPL Status field to be | |||
used as a cover channel. But the channel only works once since the | used as a cover channel. But the channel only works once, since the | |||
message destroys its own medium, that is the existing route that it | message destroys its own medium, i.e., the existing route that it | |||
is removing. | is removing. | |||
</t> | </t> | |||
<t> | <t> | |||
This document also introduces an 'I' flag which is set by the target | This document also introduces an 'I' flag, which is set by the targe | |||
t | ||||
node and used by the ancestor node to initiate a DCO if the | node and used by the ancestor node to initiate a DCO if the | |||
ancestor sees an update in the route adjacency. However, | ancestor sees an update in the routing adjacency. However, | |||
this flag could be spoofed by a malicious 6LR in the path and can | this flag could be spoofed by a malicious 6LR in the path and can | |||
cause invalidation of an existing active path. Note that invalidatio n | cause invalidation of an existing active path. Note that invalidatio n | |||
will happen only if the other conditions such as Path Sequence | will work only if the Path Sequence condition is also met for the | |||
condition is also met. Having said that, such a malicious 6LR may | target for which the invalidation is attempted. Having said that, su | |||
ch a malicious 6LR may | ||||
spoof a DAO on behalf of the (sub) child with the 'I' flag set and | spoof a DAO on behalf of the (sub) child with the 'I' flag set and | |||
can cause route invalidation on behalf of the (sub) child node. | can cause route invalidation on behalf of the (sub) child node. | |||
Note that, using existing mechanisms offered by <xref | Note that by using existing mechanisms offered by <xref target="RFC6 | |||
target="RFC6550"/>, a malicious 6LR might also spoof a DAO with | 550" format="default"/>, a malicious 6LR might also spoof a DAO with a | |||
lifetime of zero or otherwise cause denial of service by dropping | lifetime of zero or otherwise cause denial of service by dropping | |||
traffic entirely, so the new mechanism described in this document | traffic entirely, so the new mechanism described in this document | |||
does not present a substantially increased risk of disruption. | does not present a substantially increased risk of disruption. | |||
</t> | </t> | |||
<t> | <t> | |||
This document assumes that the security mechanisms as defined in | This document assumes that the security mechanisms as defined in | |||
<xref target="RFC6550"/> are followed, which means that the common | <xref target="RFC6550" format="default"/> are followed, which means that the common | |||
ancestor node and all the 6LRs are part of the RPL network because | ancestor node and all the 6LRs are part of the RPL network because | |||
they have the required credentials. A non-secure RPL network needs | they have the required credentials. A non-secure RPL network needs | |||
to take into consideration the risks highlighted in this section as | to take into consideration the risks highlighted in this section as | |||
well as those highlighted in <xref target="RFC6550"/>. | well as those highlighted in <xref target="RFC6550" format="default" | |||
</t> | />. | |||
<t> | </t> | |||
All RPL messages support a secure version of messages which allows | <t> | |||
integrity protection using either a MAC or a signature. Optionally, | All RPL messages support a secure version of messages; this allows | |||
integrity protection using either a Message Authentication Code (MAC | ||||
) or a signature. Optionally, | ||||
secured RPL messages also have encryption protection for | secured RPL messages also have encryption protection for | |||
confidentiality. | confidentiality. | |||
</t> | </t> | |||
<t> | <t> | |||
The document adds new messages (DCO, DCO-ACK) which are | This document adds new messages (DCO and DCO-ACK) that are | |||
syntactically similar to existing RPL messages such as DAO, | syntactically similar to existing RPL messages such as DAO and | |||
DAO-ACK. Secure versions of DCO and DCO-ACK are added similar to | DAO-ACK. Secure versions of DCO and DCO-ACK messages are added in a | |||
other RPL messages (such as DAO, DAO-ACK). | way that is similar to the technique used for other RPL messages (such as DAO an | |||
</t> | d DAO-ACK). | |||
<t> | </t> | |||
RPL supports three security modes as mentioned in Section 10.1 of | <t> | |||
<xref target="RFC6550"/>: | RPL supports three security modes, as mentioned in | |||
<list style="numbers"> | <xref target="RFC6550" section="10.1" sectionFormat="of"/>: | |||
<t> | </t> | |||
Unsecured: In this mode, it is expected that the RPL control | ||||
messages | ||||
are secured by other security mechanisms, such as | ||||
link-layer security. In this mode, the RPL control messages, | ||||
including DCO, DCO-ACK, do not have Security sections. | ||||
Also note that unsecured mode does not imply that all | ||||
messages are sent without any protection. | ||||
</t> | ||||
<t> | ||||
Preinstalled: In this mode, RPL uses secure messages. Thus | ||||
secure versions of DCO, DCO-ACK MUST be used in this mode. | ||||
</t> | ||||
<t> | ||||
Authenticated: In this mode, RPL uses secure messages. Thus | ||||
secure versions of DCO, DCO-ACK MUST be used in this mode. | ||||
</t> | ||||
</list> | ||||
</t> | ||||
</section> | ||||
</middle> | ||||
<back> | ||||
<!-- References split into informative and normative --> | ||||
<!-- There are 2 ways to insert reference entries from the citation librarie | <dl newline="false" spacing="normal"> | |||
s: | <dt>Unsecured:</dt><dd>In this mode, it is expected that the RPL contr | |||
1. define an ENTITY at the top, and use "ampersand character"RFC2629; here | ol messages | |||
(as shown) | are secured by other security mechanisms, such as | |||
2. simply use a PI "less than character"?rfc include="reference.RFC.2119.xm | link-layer security. In this mode, the RPL control messages, | |||
l"?> here | including DCO and DCO-ACK messages, do not have Security sections. | |||
(for I-Ds: include="reference.I-D.narten-iana-considerations-rfc2434bis. | Also note that unsecured mode does not imply that all | |||
xml") | messages are sent without any protection.</dd> | |||
<dt>Preinstalled:</dt><dd>In this mode, RPL uses secure messages. Thus | ||||
, | ||||
secure versions of DCO and DCO-ACK messages <bcp14>MUST</bcp14> be use | ||||
d in this mode.</dd> | ||||
<dt>Authenticated:</dt><dd>In this mode, RPL uses secure messages. Thu | ||||
s, | ||||
secure versions of DCO and DCO-ACK messages <bcp14>MUST</bcp14> be use | ||||
d in this mode.</dd> | ||||
</dl> | ||||
</section> | ||||
</middle> | ||||
<back> | ||||
<references> | ||||
<name>Normative References</name> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.6550.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.2119.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.8174.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.8505.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.8126.xml"/> | ||||
Both are cited textually in the same manner: by using xref elements. | <!-- draft-ietf-roll-unaware-leaves (RFC 9010) --> | |||
If you use the PI option, xml2rfc will, by default, try to find included fi | <reference anchor='RFC9010' target="https://www.rfc-editor.org/info/rfc9010"> | |||
les in the same | <front> | |||
directory as the including file. You can also define the XML_LIBRARY enviro | <title>Routing for RPL (Routing Protocol for Low-Power and Lossy Networks) Leave | |||
nment variable | s</title> | |||
with a value containing a set of directories to search. These can be either | <author initials='P' surname='Thubert' fullname='Pascal Thubert' role="editor"> | |||
in the local | <organization /> | |||
filing system or remote ones accessed by http (http://domain/dir/... ).--> | </author> | |||
<author initials='M' surname='Richardson' fullname='Michael Richardson'> | ||||
<organization /> | ||||
</author> | ||||
<date month='April' year='2021' /> | ||||
</front> | ||||
<seriesInfo name="RFC" value="9010"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC9010"/> | ||||
</reference> | ||||
<references title="Normative References"> | ||||
<!--?rfc include="http://xml.resource.org/public/rfc/bibxml/reference.RF | ||||
C.2119.xml"?--> | ||||
&RFC6550; | ||||
&RFC2119; | ||||
&RFC8174; | ||||
<?rfc include='reference.I-D.ietf-roll-unaware-leaves.xml'?> | ||||
</references> | </references> | |||
<section anchor="app-additional" numbered="true" toc="default"> | ||||
<section anchor="app-additional" title="Example Messaging"> | <name>Example Messaging</name> | |||
<section title="Example DCO Messaging"> | <section numbered="true" toc="default"> | |||
<name>Example DCO Messaging</name> | ||||
<t> | <t> | |||
In <xref target="sample_top"/>, node (D) switches its parent from | In this example, Node D (<xref target="sample_top" format="default"/ | |||
(B) to (C). This example assumes that Node D has already | >) | |||
switches its parent from | ||||
B to C. This example assumes that Node D has already | ||||
established its own route via Node B-G-A-6LBR using pathseq=x. The | established its own route via Node B-G-A-6LBR using pathseq=x. The | |||
example uses DAO and DCO messaging convention and specifies only | example uses DAO and DCO messaging conventions and specifies only | |||
the required parameters to explain the example namely, the | the required parameters to explain the example, namely, the | |||
parameter 'tgt', which stands for Target Option and value of this | parameter 'tgt', which stands for "Target option"; the value of this | |||
parameter specifies the address of the target node. The parameter | parameter specifies the address of the target node. The parameter | |||
'pathseq', which specifies the Path Sequence value carried in the | 'pathseq' specifies the Path Sequence value carried in the | |||
Transit Information Option. The parameter 'I_flag' specifies the | Transit Information option, and the parameter 'I_flag' specifies the | |||
'I' flag in the Transit Information Option. | 'I' flag in the Transit Information option. The | |||
sequence of actions is as follows: | sequence of actions is as follows: | |||
<list style="numbers"> | </t> | |||
<t>Node D switches its parent from node B to node C</t> | <ol spacing="normal" type="1"><li>Node D switches its parent from Node B | |||
to Node C.</li> | ||||
<t>D sends a regular DAO(tgt=D,pathseq=x+1,I_flag=1) in the | <li>D sends a regular DAO(tgt=D,pathseq=x+1,I_flag=1) in the | |||
updated path to C</t> | updated path to C.</li> | |||
<li>C checks for a routing entry on behalf of D; since it cannot | ||||
<t>C checks for a routing entry on behalf of D, since it cannot | find an entry on behalf of D, it creates a new routing entry | |||
find an entry on behalf of D it creates a new routing entry | and forwards the reachability information of the target D | |||
and forwards the reachability information of the target D | to H in a DAO(tgt=D,pathseq=x+1,I_flag=1).</li> | |||
to H in a DAO(tgt=D,pathseq=x+1,I_flag=1).</t> | <li>Similar to C, Node H checks for a routing entry on behalf of | |||
D, cannot find an entry, and hence creates a new routing | ||||
<t>Similar to C, node H checks for a routing entry on behalf of | entry and forwards the reachability information of the | |||
D, cannot find an entry and hence creates a new routing | target D to A in a DAO(tgt=D,pathseq=x+1,I_flag=1).</li> | |||
entry and forwards the reachability information of the | <li> | |||
target D to A in a DAO(tgt=D,pathseq=x+1,I_flag=1).</t> | Node A receives the DAO(tgt=D,pathseq=x+1,I_flag=1) and | |||
checks for a routing entry on behalf of D. It finds a | ||||
<t> | routing entry but checks that the next hop for target D is | |||
Node A receives the DAO(tgt=D,pathseq=x+1,I_flag=1), and | different (i.e., Node G). Node A checks the I_flag and | |||
checks for a routing entry on behalf of D. It finds a | generates the DCO(tgt=D,pathseq=x+1) to the previous next hop for | |||
routing entry but checks that the next hop for target D is | target D, which is G. Subsequently, Node A updates the | |||
different (i.e., Node G). Node A checks the I_flag and | routing entry and forwards the reachability information of | |||
generates DCO(tgt=D,pathseq=x+1) to previous next hop for | target D upstream using the DAO(tgt=D,pathseq=x+1,I_flag=1). | |||
target D which is G. Subsequently, Node A updates the | </li> | |||
routing entry and forwards the reachability information of | <li> | |||
target D upstream DAO(tgt=D,pathseq=x+1,I_flag=1). | Node G receives the DCO(tgt=D,pathseq=x+1). It checks to see if | |||
</t> | the received Path Sequence is later than the stored Path | |||
Sequence. If it is later, Node G invalidates the routing entry | ||||
<t> | of target D and forwards the (un)reachability information | |||
Node G receives the DCO(tgt=D,pathseq=x+1). It checks if | downstream to B in the DCO(tgt=D,pathseq=x+1). | |||
the received path sequence is later than the stored path | </li> | |||
sequence. If it is later, Node G invalidates the routing ent | <li> | |||
ry | Similarly, B processes the DCO(tgt=D,pathseq=x+1) by | |||
of target D and forwards the (un)reachability information | invalidating the routing entry of target D and forwards the | |||
downstream to B in DCO(tgt=D,pathseq=x+1). | (un)reachability information downstream to D. | |||
</t> | </li> | |||
<li> | ||||
<t> | D ignores the DCO(tgt=D,pathseq=x+1), since the target is | |||
Similarly, B processes the DCO(tgt=D,pathseq=x+1) by | itself. | |||
invalidating the routing entry of target D and forwards the | </li> | |||
(un)reachability information downstream to D. | <li> | |||
</t> | The propagation of the DCO will stop at any node where the | |||
node does not have routing information associated with | ||||
<t> | the target. If cached routing information is present and | |||
D ignores the DCO(tgt=D,pathseq=x+1) since the target is | the cached Path Sequence is higher than the value in the | |||
itself. | DCO, then the DCO is dropped. | |||
</t> | </li> | |||
</ol> | ||||
<t> | </section> | |||
The propagation of the DCO will stop at any node where the | <section numbered="true" toc="default"> | |||
node does not have an routing information associated with | <name>Example DCO Messaging with Multiple Preferred Parents</name> | |||
the target. If cached routing information is present and | ||||
the cached Path Sequence is higher than the value in the | ||||
DCO, then the DCO is dropped. | ||||
</t> | ||||
</list> | <t> | |||
</t> | As shown in <xref target="sample_top_mpp" format="default"/>, no | |||
</section> | de (N41) selects multiple | |||
<section title="Example DCO Messaging with multiple preferred parents"> | ||||
<t> <figure align="center" anchor="sample_top_mpp" title="Sample | ||||
topology 2"> <artwork align="center"><![CDATA[ | ||||
(6LBR) | ||||
| | ||||
| | ||||
| | ||||
(N11) | ||||
/ \ | ||||
/ \ | ||||
/ \ | ||||
(N21) (N22) | ||||
/ / \ | ||||
/ / \ | ||||
/ / \ | ||||
(N31) (N32) (N33) | ||||
: | / | ||||
: | / | ||||
: | / | ||||
(N41) | ||||
]]></artwork> </figure> </t> | ||||
<t> | ||||
In <xref target="sample_top_mpp"/>, node (N41) selects multiple | ||||
preferred parents (N32) and (N33). | preferred parents (N32) and (N33). | |||
The sequence of actions is as follows: | The sequence of actions is listed below the figure. | |||
<list style="numbers"> | </t> | |||
<t> | ||||
(N41) sends DAO(tgt=N41,PS=x,I_flag=1) to (N32) and (N33 | ||||
). | ||||
Here I_flag refers to the Invalidation flag and PS refer | ||||
s to | ||||
Path Sequence in Transit Information option. | ||||
</t> | ||||
<t> | ||||
(N32) sends DAO(tgt=N41,PS=x,I_flag=1) to (N22). (N33) a | ||||
lso | ||||
sends DAO(tgt=N41,PS=x,I_flag=1) to (N22). (N22) learns | ||||
multiple routes for the same destination (N41) through | ||||
multiple next-hops. (N22) may receive the DAOs from | ||||
(N32) and (N33) in any order with the I_flag set. The | ||||
implementation should use the DelayDCO timer to wait to | ||||
initiate the DCO. If (N22) receives an updated DAO from | ||||
all the paths then the DCO need not be initiated in | ||||
this case. Thus the route table at N22 should contain | ||||
(Dst,NextHop,PS): { (N41,N32,x), (N41,N33,x) }. | ||||
</t> | ||||
<t> | ||||
(N22) sends DAO(tgt=N41,PS=x,I_flag=1) to (N11). | ||||
</t> | ||||
<t> | ||||
(N11) sends DAO(tgt=N41,PS=x,I_flag=1) to (6LBR). Thus t | ||||
he | ||||
complete path is established. | ||||
</t> | ||||
<t> | ||||
(N41) decides to change preferred parent set from { | ||||
N32, N33 } to { N31, N32 }. | ||||
</t> | ||||
<t> | ||||
(N41) sends DAO(tgt=N41,PS=x+1,I_flag=1) to (N32). (N41) | ||||
sends DAO(tgt=N41,PS=x+1,I_flag=1) to (N31). | ||||
</t> | ||||
<t> | ||||
(N32) sends DAO(tgt=N41,PS=x+1,I_flag=1) to (N22). | ||||
(N22) has multiple routes to destination (N41). It sees | ||||
that a new Path Sequence for Target=N41 is received and | ||||
thus it waits for pre-determined time period (DelayDCO | ||||
time period) to invalidate another route | ||||
{(N41),(N33),x}. After time period, (N22) sends | ||||
DCO(tgt=N41,PS=x+1) to (N33). Also (N22) sends the | ||||
regular DAO(tgt=N41,PS=x+1,I_flag=1) to (N11). | ||||
</t> | ||||
<t> | ||||
(N33) receives DCO(tgt=N41,PS=x+1). The received Path | ||||
Sequence is latest and thus it invalidates the entry | ||||
associated with target (N41). (N33) then sends the | ||||
DCO(tgt=N41,PS=x+1) to (N41). (N41) sees itself as the | ||||
target and drops the DCO. | ||||
</t> | ||||
<t> | ||||
From Step 6 above, (N31) receives the | ||||
DAO(tgt=N41,PS=x+1,I_flag=1). It creates a routing | ||||
entry and sends the DAO(tgt=N41,PS=x+1,I_flag=1) to | ||||
(N21). Similarly (N21) receives the DAO and | ||||
subsequently sends the DAO(tgt=N41,PS=x+1,I_flag=1) to | ||||
(N11). | ||||
</t> | ||||
<t> | ||||
(N11) receives DAO(tgt=N41,PS=x+1,I_flag=1) from (N21). | ||||
It waits for DelayDCO timer since it has multiple | ||||
routes to (N41). (N41) will receive | ||||
DAO(tgt=N41,PS=x+1,I_flag=1) from (N22) from Step 7 | ||||
above. Thus (N11) has received regular | ||||
DAO(tgt=N41,PS=x+1,I_flag=1) from all paths and thus | ||||
does not initiate DCO. | ||||
</t> | ||||
<t> | ||||
(N11) forwards the DAO(tgt=N41,PS=x+1,I_flag=1) to 6LBR | ||||
and the full path is established. | ||||
</t> | ||||
</list></t> | <figure anchor="sample_top_mpp"> | |||
</section> | <name>Sample Topology 2</name> | |||
<artwork align="center" name="" type="" alt=""><![CDATA[ | ||||
(6LBR) | ||||
| | ||||
| | ||||
| | ||||
(N11) | ||||
/ \ | ||||
/ \ | ||||
/ \ | ||||
(N21) (N22) | ||||
/ / \ | ||||
/ / \ | ||||
/ / \ | ||||
(N31) (N32) (N33) | ||||
: | / | ||||
: | / | ||||
: | / | ||||
(N41)]]></artwork> | ||||
</figure> | ||||
<ol spacing="normal" type="1"><li> | ||||
(N41) sends a DAO(tgt=N41,PS=x,I_flag=1) to (N32) and (N33). | ||||
Here, 'I_flag' refers to the Invalidation flag, and 'PS' refers to | ||||
the Path Sequence in the Transit Information option. | ||||
</li> | ||||
<li> | ||||
(N32) sends the DAO(tgt=N41,PS=x,I_flag=1) to (N22). (N33) also | ||||
sends the DAO(tgt=N41,PS=x,I_flag=1) to (N22). (N22) learns | ||||
multiple routes for the same destination (N41) through | ||||
multiple next hops. (N22) may receive the DAOs from | ||||
(N32) and (N33) in any order with the I_flag set. The | ||||
implementation should use the DelayDCO timer to wait to | ||||
initiate the DCO. If (N22) receives an updated DAO from | ||||
all the paths, then the DCO need not be initiated in | ||||
this case. Thus, the routing table at N22 should contain | ||||
(Dst,NextHop,PS): { (N41,N32,x), (N41,N33,x) }. | ||||
</li> | ||||
<li> | ||||
(N22) sends the DAO(tgt=N41,PS=x,I_flag=1) to (N11). | ||||
</li> | ||||
<li> | ||||
(N11) sends the DAO(tgt=N41,PS=x,I_flag=1) to (6LBR). Thus, the | ||||
complete path is established. | ||||
</li> | ||||
<li> | ||||
(N41) decides to change the preferred parent set from | ||||
{ N32, N33 } to { N31, N32 }. | ||||
</li> | ||||
<li> | ||||
(N41) sends the DAO(tgt=N41,PS=x+1,I_flag=1) to (N32). (N41) | ||||
sends the DAO(tgt=N41,PS=x+1,I_flag=1) to (N31). | ||||
</li> | ||||
<li> | ||||
(N32) sends the DAO(tgt=N41,PS=x+1,I_flag=1) to (N22). | ||||
(N22) has multiple routes to destination (N41). It sees | ||||
that a new Path Sequence for Target=N41 is received and | ||||
thus waits for a predetermined time period (the DelayDCO | ||||
time period) to invalidate another route | ||||
{ (N41),(N33),x }. After the time period, (N22) sends the | ||||
DCO(tgt=N41,PS=x+1) to (N33). Also (N22) sends the | ||||
regular DAO(tgt=N41,PS=x+1,I_flag=1) to (N11). | ||||
</li> | ||||
<li> | ||||
(N33) receives the DCO(tgt=N41,PS=x+1). The received Path | ||||
Sequence is the latest and thus invalidates the entry | ||||
associated with the target (N41). (N33) then sends the | ||||
DCO(tgt=N41,PS=x+1) to (N41). (N41) sees itself as the | ||||
target and drops the DCO. | ||||
</li> | ||||
<li> | ||||
From Step 6 above, (N31) receives the | ||||
DAO(tgt=N41,PS=x+1,I_flag=1). It creates a routing | ||||
entry and sends the DAO(tgt=N41,PS=x+1,I_flag=1) to | ||||
(N21). Similarly, (N21) receives the DAO and | ||||
subsequently sends the DAO(tgt=N41,PS=x+1,I_flag=1) to | ||||
(N11). | ||||
</li> | ||||
<li> | ||||
(N11) receives the DAO(tgt=N41,PS=x+1,I_flag=1) from (N21). | ||||
It waits for the DelayDCO timer, since it has multiple | ||||
routes to (N41). (N41) will receive the | ||||
DAO(tgt=N41,PS=x+1,I_flag=1) from (N22) from Step 7 | ||||
above. Thus, (N11) has received the regular | ||||
DAO(tgt=N41,PS=x+1,I_flag=1) from all paths and thus | ||||
does not initiate the DCO. | ||||
</li> | ||||
<li> | ||||
(N11) forwards the DAO(tgt=N41,PS=x+1,I_flag=1) to (6LBR), | ||||
and the full path is established. | ||||
</li> | ||||
</ol> | ||||
</section> | ||||
</section> | </section> | |||
<section anchor="Acknowledgments" numbered="false" toc="default"> | ||||
</back> | <name>Acknowledgments</name> | |||
<t> | ||||
Many thanks to <contact fullname="Alvaro Retana"/>, <contact fullname="Cen | ||||
k Gundogan"/>, <contact fullname="Simon Duquennoy"/>, <contact fullname="Georgio | ||||
s Papadopoulos"/>, and <contact fullname="Peter van der Stok"/> for their review | ||||
and comments. | ||||
<contact fullname="Alvaro Retana"/> helped shape this document's fin | ||||
al version with | ||||
critical review comments. | ||||
</t> | ||||
</section> | ||||
</back> | ||||
</rfc> | </rfc> | |||
End of changes. 115 change blocks. | ||||
1347 lines changed or deleted | 1273 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |