rfc9008v1.txt | rfc9008.txt | |||
---|---|---|---|---|
skipping to change at line 125 ¶ | skipping to change at line 125 ¶ | |||
13. References | 13. References | |||
13.1. Normative References | 13.1. Normative References | |||
13.2. Informative References | 13.2. Informative References | |||
Acknowledgments | Acknowledgments | |||
Authors' Addresses | Authors' Addresses | |||
1. Introduction | 1. Introduction | |||
RPL (IPv6 Routing Protocol for Low-Power and Lossy Networks) | RPL (IPv6 Routing Protocol for Low-Power and Lossy Networks) | |||
[RFC6550] is a routing protocol for constrained networks. [RFC6553] | [RFC6550] is a routing protocol for constrained networks. [RFC6553] | |||
defines the RPL Option carried within the IPv6 Hop-by-Hop header to | defines the RPL Option carried within the IPv6 Hop-by-Hop Options | |||
carry the RPLInstanceID and quickly identify inconsistencies (loops) | header to carry the RPLInstanceID and quickly identify | |||
in the routing topology. The RPL Option is commonly referred to as | inconsistencies (loops) in the routing topology. The RPL Option is | |||
the RPL Packet Information (RPI), although the RPI is the routing | commonly referred to as the RPL Packet Information (RPI), although | |||
information that is defined in [RFC6550] and transported in the RPL | the RPI is the routing information that is defined in [RFC6550] and | |||
Option. RFC 6554 [RFC6554] defines the "RPL Source Route Header" | transported in the RPL Option. RFC 6554 [RFC6554] defines the "RPL | |||
(RH3), an IPv6 extension header to deliver datagrams within a RPL | Source Route Header" (RH3), an IPv6 extension header to deliver | |||
routing domain, particularly in Non-Storing mode. | datagrams within a RPL routing domain, particularly in Non-Storing | |||
mode. | ||||
These various items are referred to as RPL artifacts, and they are | These various items are referred to as RPL artifacts, and they are | |||
seen on all of the data plane traffic that occurs in RPL-routed | seen on all of the data plane traffic that occurs in RPL-routed | |||
networks; they do not, in general, appear on the RPL control plane at | networks; they do not, in general, appear on the RPL control plane at | |||
all, which is mostly hop-by-hop traffic (one exception being | all, which is mostly hop-by-hop traffic (one exception being | |||
Destination Advertisement Object (DAO) messages in Non-Storing mode). | Destination Advertisement Object (DAO) messages in Non-Storing mode). | |||
It has become clear from attempts to do multi-vendor | It has become clear from attempts to do multi-vendor | |||
interoperability, and from a desire to compress as many of the above | interoperability, and from a desire to compress as many of the above | |||
artifacts as possible, that not all implementers agree when artifacts | artifacts as possible, that not all implementers agree when artifacts | |||
skipping to change at line 207 ¶ | skipping to change at line 208 ¶ | |||
Consumed: A Routing Header is consumed when the Segments Left field | Consumed: A Routing Header is consumed when the Segments Left field | |||
is zero, which indicates that the destination in the IPv6 header | is zero, which indicates that the destination in the IPv6 header | |||
is the final destination of the packet and that the hops in the | is the final destination of the packet and that the hops in the | |||
Routing Header have been traversed. | Routing Header have been traversed. | |||
RPL Leaf: An IPv6 host that is attached to a RPL router and obtains | RPL Leaf: An IPv6 host that is attached to a RPL router and obtains | |||
connectivity through a RPL Destination-Oriented Directed Acyclic | connectivity through a RPL Destination-Oriented Directed Acyclic | |||
Graph (DODAG). As an IPv6 node, a RPL leaf is expected to ignore | Graph (DODAG). As an IPv6 node, a RPL leaf is expected to ignore | |||
a consumed Routing Header, and as an IPv6 host, it is expected to | a consumed Routing Header, and as an IPv6 host, it is expected to | |||
ignore a Hop-by-Hop header. Thus, a RPL leaf can correctly | ignore a Hop-by-Hop Options header. Thus, a RPL leaf can | |||
receive a packet with RPL artifacts. On the other hand, a RPL | correctly receive a packet with RPL artifacts. On the other hand, | |||
leaf is not expected to generate RPL artifacts or to support IP- | a RPL leaf is not expected to generate RPL artifacts or to support | |||
in-IP encapsulation. For simplification, this document uses the | IP-in-IP encapsulation. For simplification, this document uses | |||
standalone term leaf to mean a RPL leaf. | the standalone term leaf to mean a RPL leaf. | |||
RPL Packet Information (RPI): The information defined abstractly in | RPL Packet Information (RPI): The information defined abstractly in | |||
[RFC6550] to be placed in IP packets. The term is commonly used, | [RFC6550] to be placed in IP packets. The term is commonly used, | |||
including in this document, to refer to the RPL Option [RFC6553] | including in this document, to refer to the RPL Option [RFC6553] | |||
that transports that abstract information in an IPv6 Hop-by-Hop | that transports that abstract information in an IPv6 Hop-by-Hop | |||
header. [RFC8138] provides an alternate (more compressed) | Options header. [RFC8138] provides an alternate (more compressed) | |||
formatting for the same abstract information. | formatting for the same abstract information. | |||
RPL-Aware Node (RAN): A device that implements RPL. Please note | RPL-Aware Node (RAN): A device that implements RPL. Please note | |||
that the device can be found inside the LLN or outside LLN. | that the device can be found inside the LLN or outside LLN. | |||
RPL-Aware Leaf (RAL): A RPL-aware node that is also a RPL leaf. | RPL-Aware Leaf (RAL): A RPL-aware node that is also a RPL leaf. | |||
RPL-Unaware Node: A device that does not implement RPL, thus the | RPL-Unaware Node: A device that does not implement RPL, thus the | |||
device is RPL unaware. Please note that the device can be found | device is RPL unaware. Please note that the device can be found | |||
inside the LLN. | inside the LLN. | |||
skipping to change at line 332 ¶ | skipping to change at line 333 ¶ | |||
has been learned through an alternate protocol, for instance, a route | has been learned through an alternate protocol, for instance, a route | |||
to a prefix that is outside the RPL domain but reachable via a 6LR. | to a prefix that is outside the RPL domain but reachable via a 6LR. | |||
Being outside of the RPL domain, a node that is reached via an | Being outside of the RPL domain, a node that is reached via an | |||
external target cannot be guaranteed to ignore the RPL artifacts and | external target cannot be guaranteed to ignore the RPL artifacts and | |||
cannot be expected to process the compression defined in [RFC8138] | cannot be expected to process the compression defined in [RFC8138] | |||
correctly. This means that the RPL artifacts should be contained in | correctly. This means that the RPL artifacts should be contained in | |||
an IP-in-IP encapsulation that is removed by the 6LR, and that any | an IP-in-IP encapsulation that is removed by the 6LR, and that any | |||
remaining compression should be expanded by the 6LR before it | remaining compression should be expanded by the 6LR before it | |||
forwards a packet outside the RPL domain. | forwards a packet outside the RPL domain. | |||
This specification updates [RFC6550] to RECOMMEND that external | This specification updates [RFC6550] to say that advertising external | |||
targets are advertised using Non-Storing mode DAO messaging even in a | targets using Non-Storing mode DAO messaging even in a Storing mode | |||
Storing mode network. This way, external routes are not advertised | network is RECOMMENDED. This way, external routes are not advertised | |||
within the DODAG, and all packets to an external target reach the | within the DODAG, and all packets to an external target reach the | |||
root like normal Non-Storing mode traffic. The Non-Storing mode DAO | root like normal Non-Storing mode traffic. The Non-Storing mode DAO | |||
informs the root of the address of the 6LR that injects the external | informs the root of the address of the 6LR that injects the external | |||
route, and the root uses IP-in-IP encapsulation to that 6LR, which | route, and the root uses IP-in-IP encapsulation to that 6LR, which | |||
terminates the IP-in-IP tunnel and forwards the original packet | terminates the IP-in-IP tunnel and forwards the original packet | |||
outside the RPL domain free of RPL artifacts. | outside the RPL domain free of RPL artifacts. | |||
In the other direction, for traffic coming from an external target | In the other direction, for traffic coming from an external target | |||
into the LLN, the parent (6LR) that injects the traffic always | into the LLN, the parent (6LR) that injects the traffic always | |||
encapsulates to the root. This whole operation is transparent to | encapsulates to the root. This whole operation is transparent to | |||
intermediate routers that only see traffic between the 6LR and the | intermediate routers that only see traffic between the 6LR and the | |||
root, and only the root and the 6LRs that inject external routes in | root, and only the root and the 6LRs that inject external routes in | |||
the network need to be upgraded to add this function to the network. | the network need to be upgraded to add this function to the network. | |||
A RUL is a special case of external target when the target is | A RUL is a special case of external target when the target is | |||
actually a host, and it is known to support a consumed Routing Header | actually a host, and it is known to support a consumed Routing Header | |||
and to ignore a Hop-by-Hop header as prescribed by [RFC8200]. The | and to ignore a Hop-by-Hop Options header as prescribed by [RFC8200]. | |||
target may have been learned through an external routing protocol or | The target may have been learned through an external routing protocol | |||
may have been registered to the 6LR using [RFC8505]. | or may have been registered to the 6LR using [RFC8505]. | |||
In order to enable IP-in-IP all the way to a 6LN, it is beneficial | In order to enable IP-in-IP all the way to a 6LN, it is beneficial | |||
that the 6LN supports decapsulating IP-in-IP, but that is not assumed | that the 6LN supports decapsulating IP-in-IP, but that is not assumed | |||
by [RFC8504]. If the 6LN is a RUL, the root that encapsulates a | by [RFC8504]. If the 6LN is a RUL, the root that encapsulates a | |||
packet SHOULD terminate the tunnel at a parent 6LR unless it is aware | packet SHOULD terminate the tunnel at a parent 6LR unless it is aware | |||
that the RUL supports IP-in-IP decapsulation. | that the RUL supports IP-in-IP decapsulation. | |||
A node that is reachable over an external route is not expected to | A node that is reachable over an external route is not expected to | |||
support [RFC8138]. Whether a decapsulation took place or not and | support [RFC8138]. Whether a decapsulation took place or not and | |||
even when the 6LR is delivering the packet to a RUL, the 6LR that | even when the 6LR is delivering the packet to a RUL, the 6LR that | |||
skipping to change at line 387 ¶ | skipping to change at line 388 ¶ | |||
[RFC6550], Section 6.3.1. | [RFC6550], Section 6.3.1. | |||
In addition, this document reserves MOP value 7 for future expansion. | In addition, this document reserves MOP value 7 for future expansion. | |||
See Sections 11.2 and 11.3. | See Sections 11.2 and 11.3. | |||
4.1.3. Indicating the New RPI in the DODAG Configuration Option Flag | 4.1.3. Indicating the New RPI in the DODAG Configuration Option Flag | |||
In order to avoid a flag day caused by lack of interoperation between | In order to avoid a flag day caused by lack of interoperation between | |||
nodes of the new RPI Option Type (0x23) and old RPI Option Type | nodes of the new RPI Option Type (0x23) and old RPI Option Type | |||
(0x63), this section defines a flag in the DIO Configuration option, | (0x63), this section defines a flag in the DODAG Configuration | |||
to indicate when the new RPI Option Type can be safely used. This | option, to indicate when the new RPI Option Type can be safely used. | |||
means that the flag is going to indicate the value of Option Type | This means that the flag is going to indicate the value of Option | |||
that the network will be using for the RPL Option. Thus, when a node | Type that the network will be using for the RPL Option. Thus, when a | |||
joins to a network, it will know which value to use. With this, RPL- | node joins to a network, it will know which value to use. With this, | |||
capable nodes know if it is safe to use 0x23 when creating a new RPL | RPL-capable nodes know if it is safe to use 0x23 when creating a new | |||
Option. A node that forwards a packet with an RPI MUST NOT modify | RPL Option. A node that forwards a packet with an RPI MUST NOT | |||
the Option Type of the RPL Option. | modify the Option Type of the RPL Option. | |||
This is done using a DODAG Configuration option flag that will signal | This is done using a DODAG Configuration option flag that will signal | |||
"RPI 0x23 enable" and propagate through the network. Section 6.3.1 | "RPI 0x23 enable" and propagate through the network. Section 6.3.1 | |||
of [RFC6550] defines a 3-bit Mode of Operation (MOP) in the DIO Base | of [RFC6550] defines a 3-bit Mode of Operation (MOP) in the DIO Base | |||
Object. The flag is defined only for MOP value between 0 to 6. | Object. The flag is defined only for MOP value between 0 to 6. | |||
For a MOP value of 7, a node MUST use the RPI 0x23 option. | For a MOP value of 7, a node MUST use the RPI 0x23 option. | |||
As stated in [RFC6550], the DODAG Configuration option is present in | As stated in [RFC6550], the DODAG Configuration option is present in | |||
DIO messages. The DODAG Configuration option distributes | DIO messages. The DODAG Configuration option distributes | |||
skipping to change at line 467 ¶ | skipping to change at line 468 ¶ | |||
+===========+=====+=====+=======+=============+===========+ | +===========+=====+=====+=======+=============+===========+ | |||
| 0x63 | 01 | 1 | 00011 | RPL Option | [RFC6553] | | | 0x63 | 01 | 1 | 00011 | RPL Option | [RFC6553] | | |||
+-----------+-----+-----+-------+-------------+-----------+ | +-----------+-----+-----+-------+-------------+-----------+ | |||
Table 2: Option Type in RPL Option | Table 2: Option Type in RPL Option | |||
This document illustrates that it is not always possible to know for | This document illustrates that it is not always possible to know for | |||
sure at the source whether a packet will travel only within the RPL | sure at the source whether a packet will travel only within the RPL | |||
domain or whether it will leave it. | domain or whether it will leave it. | |||
At the time [RFC6553] was published, leaking a Hop-by-Hop header in | At the time [RFC6553] was published, leaking a Hop-by-Hop Options | |||
the outer IPv6 header chain could potentially impact core routers in | header in the outer IPv6 header chain could potentially impact core | |||
the Internet. So at that time, it was decided to encapsulate any | routers in the Internet. So at that time, it was decided to | |||
packet with a RPL Option using IPv6-in-IPv6 in all cases where it was | encapsulate any packet with a RPL Option using IPv6-in-IPv6 in all | |||
unclear whether the packet would remain within the RPL domain. In | cases where it was unclear whether the packet would remain within the | |||
the exception case where a packet would still leak, the Option Type | RPL domain. In the exception case where a packet would still leak, | |||
would ensure that the first router in the Internet that does not | the Option Type would ensure that the first router in the Internet | |||
recognize the option would drop the packet and protect the rest of | that does not recognize the option would drop the packet and protect | |||
the network. | the rest of the network. | |||
Even with [RFC8138], where the IPv6-in-IPv6 header is compressed, | Even with [RFC8138], where the IPv6-in-IPv6 header is compressed, | |||
this approach yields extra bytes in a packet; this means consuming | this approach yields extra bytes in a packet; this means consuming | |||
more energy and more bandwidth, incurring higher chances of loss, and | more energy and more bandwidth, incurring higher chances of loss, and | |||
possibly causing a fragmentation at the 6LoWPAN level. This impacts | possibly causing a fragmentation at the 6LoWPAN level. This impacts | |||
the daily operation of constrained devices for a case that generally | the daily operation of constrained devices for a case that generally | |||
does not happen and would not heavily impact the core anyway. | does not happen and would not heavily impact the core anyway. | |||
While the intention was and remains that the Hop-by-Hop header with a | While the intention was and remains that the Hop-by-Hop Options | |||
RPL Option should be confined within the RPL domain, this | header with a RPL Option should be confined within the RPL domain, | |||
specification modifies this behavior in order to reduce the | this specification modifies this behavior in order to reduce the | |||
dependency on IPv6-in-IPv6 and protect the constrained devices. | dependency on IPv6-in-IPv6 and protect the constrained devices. | |||
Section 4 of [RFC8200] clarifies the behavior of routers in the | Section 4 of [RFC8200] clarifies the behavior of routers in the | |||
Internet as follows: "it is now expected that nodes along a packet's | Internet as follows: "it is now expected that nodes along a packet's | |||
delivery path only examine and process the Hop-by-Hop Options header | delivery path only examine and process the Hop-by-Hop Options header | |||
if explicitly configured to do so." | if explicitly configured to do so." | |||
When unclear about the travel of a packet, it becomes preferable for | When unclear about the travel of a packet, it becomes preferable for | |||
a source not to encapsulate, accepting the fact that the packet may | a source not to encapsulate, accepting the fact that the packet may | |||
leave the RPL domain on its way to its destination. In that event, | leave the RPL domain on its way to its destination. In that event, | |||
the packet should reach its destination and should not be discarded | the packet should reach its destination and should not be discarded | |||
by the first node that does not recognize the RPL Option. However, | by the first node that does not recognize the RPL Option. However, | |||
with the current value of the Option Type, if a node in the Internet | with the current value of the Option Type, if a node in the Internet | |||
is configured to process the Hop-by-Hop header, and if such a node | is configured to process the Hop-by-Hop Options header, and if such a | |||
encounters an Option Type with the first two bits set to 01 and the | node encounters an Option Type with the first two bits set to 01 and | |||
node conforms to [RFC8200], it will drop the packet. Host systems | the node conforms to [RFC8200], it will drop the packet. Host | |||
should do the same, irrespective of the configuration. | systems should do the same, irrespective of the configuration. | |||
Thus, this document updates the Option Type of the RPL Option | Thus, this document updates the Option Type of the RPL Option | |||
[RFC6553], naming it RPI Option Type for simplicity (Table 3): the | [RFC6553], naming it RPI Option Type for simplicity (Table 3): the | |||
two high order bits MUST be set to '00', and the third bit is equal | two high order bits MUST be set to '00', and the third bit is equal | |||
to '1'. The first two bits indicate that the IPv6 node MUST skip | to '1'. The first two bits indicate that the IPv6 node MUST skip | |||
over this option and continue processing the header ([RFC8200], | over this option and continue processing the header ([RFC8200], | |||
Section 4.2) if it doesn't recognize the Option Type, and the third | Section 4.2) if it doesn't recognize the Option Type, and the third | |||
bit continues to be set to indicate that the Option Data may change | bit continues to be set to indicate that the Option Data may change | |||
en route. The rightmost five bits remain at 0x3(00011). This | en route. The rightmost five bits remain at 0x3(00011). This | |||
ensures that a packet that leaves the RPL domain of an LLN (or that | ensures that a packet that leaves the RPL domain of an LLN (or that | |||
skipping to change at line 550 ¶ | skipping to change at line 551 ¶ | |||
header. | header. | |||
When forwarding packets, implementations SHOULD use the same value of | When forwarding packets, implementations SHOULD use the same value of | |||
RPI Type as was received. This is required because the RPI Option | RPI Type as was received. This is required because the RPI Option | |||
Type does not change en route ([RFC8200], Section 4.2). It allows | Type does not change en route ([RFC8200], Section 4.2). It allows | |||
the network to be incrementally upgraded and allows the DODAG root to | the network to be incrementally upgraded and allows the DODAG root to | |||
know which parts of the network have been upgraded. | know which parts of the network have been upgraded. | |||
When originating new packets, implementations should have an option | When originating new packets, implementations should have an option | |||
to determine which value to originate with. This option is | to determine which value to originate with. This option is | |||
controlled by the DIO Configuration option (Section 4.1.3). | controlled by the DODAG Configuration option (Section 4.1.3). | |||
The change of RPI Option Type from 0x63 to 0x23 makes all nodes that | The change of RPI Option Type from 0x63 to 0x23 makes all nodes that | |||
are compliant with Section 4.2 of [RFC8200] tolerant of the RPL | are compliant with Section 4.2 of [RFC8200] tolerant of the RPL | |||
artifacts. There is no longer a need to remove the artifacts when | artifacts. There is no longer a need to remove the artifacts when | |||
sending traffic to the Internet. This change clarifies when to use | sending traffic to the Internet. This change clarifies when to use | |||
IPv6-in-IPv6 headers and how to address them: the Hop-by-Hop Options | IPv6-in-IPv6 headers and how to address them: the Hop-by-Hop Options | |||
header containing the RPI MUST always be added when 6LRs originate | header containing the RPI MUST always be added when 6LRs originate | |||
packets (without IPv6-in-IPv6 headers), and IPv6-in-IPv6 headers MUST | packets (without IPv6-in-IPv6 headers), and IPv6-in-IPv6 headers MUST | |||
always be added when a 6LR finds that it needs to insert a Hop-by-Hop | always be added when a 6LR finds that it needs to insert a Hop-by-Hop | |||
Options header containing the RPL Option. The IPv6-in-IPv6 header is | Options header containing the RPL Option. The IPv6-in-IPv6 header is | |||
skipping to change at line 602 ¶ | skipping to change at line 603 ¶ | |||
Section 7 of [RFC8138] documents how to compress the IPv6-in-IPv6 | Section 7 of [RFC8138] documents how to compress the IPv6-in-IPv6 | |||
header. | header. | |||
There are potential significant advantages to having a single code | There are potential significant advantages to having a single code | |||
path that always processes IPv6-in-IPv6 headers with no conditional | path that always processes IPv6-in-IPv6 headers with no conditional | |||
branches. | branches. | |||
In Storing mode, the scenarios where the flow goes from RAL to RUL | In Storing mode, the scenarios where the flow goes from RAL to RUL | |||
and RUL to RUL include compression of the IPv6-in-IPv6 and RPI | and RUL to RUL include compression of the IPv6-in-IPv6 and RPI | |||
headers. The use of the IPv6-in-IPv6 header is MANDATORY in this | headers. The IPv6-in-IPv6 header MUST be used in this case, and it | |||
case, and it SHOULD be compressed with [RFC8138], Section 7. | SHOULD be compressed as specified in [RFC8138], Section 7. Figure 2 | |||
Figure 2 illustrates the case in Storing mode where the packet is | illustrates the case in Storing mode where the packet is received | |||
received from the Internet, then the root encapsulates the packet to | from the Internet, then the root encapsulates the packet to insert | |||
insert the RPI. In that example, the leaf is not known to support | the RPI. In that example, the leaf is not known to support RFC 8138, | |||
RFC 8138, and the packet is encapsulated to the 6LR that is the | and the packet is encapsulated to the 6LR that is the parent and last | |||
parent and last hop to the final destination. | hop to the final destination. | |||
+-+ ... -+-+ ... +-+- ... -+-+- +-+-+-+ ... +-+-+ ... -+++ ... +-... | +-+ ... -+-+ ... +-+- ... -+-+- +-+-+-+ ... +-+-+ ... -+++ ... +-... | |||
|11110001|SRH-6LoRH| RPI- |IP-in-IP| NH=1 |11110CPP| UDP | UDP | |11110001|SRH-6LoRH| RPI- |IP-in-IP| NH=1 |11110CPP| UDP | UDP | |||
|Page 1 |Type1 S=0| 6LoRH |6LoRH |LOWPAN_IPHC| UDP | hdr |Payld | |Page 1 |Type1 S=0| 6LoRH |6LoRH |LOWPAN_IPHC| UDP | hdr |Payld | |||
+-+ ... -+-+ ... +-+- ... -+-+-.+-+-+-+-+ ... +-+-+ ... -+ ... +-... | +-+ ... -+-+ ... +-+- ... -+-+-.+-+-+-+-+ ... +-+-+ ... -+ ... +-... | |||
<-4bytes-> <- RFC 6282 -> | <-4bytes-> <- RFC 6282 -> | |||
No RPL artifact | No RPL artifact | |||
Figure 2: RPI Inserted by the Root in Storing Mode | Figure 2: RPI Inserted by the Root in Storing Mode | |||
skipping to change at line 758 ¶ | skipping to change at line 759 ¶ | |||
RUL to RAL | RUL to RAL | |||
RUL to RUL | RUL to RUL | |||
This document is consistent with the rule that a header cannot be | This document is consistent with the rule that a header cannot be | |||
inserted or removed on the fly inside an IPv6 packet that is being | inserted or removed on the fly inside an IPv6 packet that is being | |||
routed. This is a fundamental precept of the IPv6 architecture as | routed. This is a fundamental precept of the IPv6 architecture as | |||
outlined in [RFC8200]. | outlined in [RFC8200]. | |||
As the rank information in the RPI artifact is changed at each hop, | As the Rank information in the RPI artifact is changed at each hop, | |||
it will typically be zero when it arrives at the DODAG root. The | it will typically be zero when it arrives at the DODAG root. The | |||
DODAG root MUST force it to zero when passing the packet out to the | DODAG root MUST force it to zero when passing the packet out to the | |||
Internet. The Internet will therefore not see any SenderRank | Internet. The Internet will therefore not see any SenderRank | |||
information. | information. | |||
Despite being legal to leave the RPI artifact in place, an | Despite being legal to leave the RPI artifact in place, an | |||
intermediate router that needs to add an extension header (e.g., RH3 | intermediate router that needs to add an extension header (e.g., RH3 | |||
or RPL Option) MUST still encapsulate the packet in an (additional) | or RPL Option) MUST still encapsulate the packet in an (additional) | |||
outer IP header. The new header is placed after this new outer IP | outer IP header. The new header is placed after this new outer IP | |||
header. | header. | |||
A corollary is that an intermediate router can remove an RH3 or RPL | A corollary is that an intermediate router can remove an RH3 or RPL | |||
Option only if it is placed in an encapsulating IPv6 header that is | Option only if it is placed in an encapsulating IPv6 header that is | |||
addressed _to_ this intermediate router. When doing the above, the | addressed _to_ this intermediate router. When doing the above, the | |||
whole encapsulating header must be removed. (A replacement may be | whole encapsulating header must be removed. (A replacement may be | |||
added.) This sometimes can result in outer IP headers being | added.) | |||
addressed to the next-hop router using a link-local address. | ||||
Both the RPL Option and the RH3 headers may be modified in very | Both the RPL Option and the RH3 headers may be modified in very | |||
specific ways by routers on the path of the packet without the need | specific ways by routers on the path of the packet without the need | |||
to add and remove an encapsulating header. Both headers were | to add and remove an encapsulating header. Both headers were | |||
designed with this modification in mind, and both the RPL RH3 and the | designed with this modification in mind, and both the RPL RH3 and the | |||
RPL Option are marked mutable but recoverable: so an IPsec | RPL Option are marked mutable but recoverable: so an IPsec | |||
Authentication Header (AH) can be applied across these headers, but | Authentication Header (AH) can be applied across these headers, but | |||
it cannot secure the values that mutate. | it cannot secure the values that mutate. | |||
The RPI MUST be present in every single RPL data packet. | The RPI MUST be present in every single RPL data packet. | |||
Prior to [RFC8138], there was significant interest in creating an | Prior to [RFC8138], there was significant interest in creating an | |||
exception to this rule and removing the RPI for Downward flows in | exception to this rule and removing the RPI for Downward flows in | |||
Non-Storing mode. This exception covered a very small number of | Non-Storing mode. This exception covered a very small number of | |||
cases, and caused significant interoperability challenges while | cases, and caused significant interoperability challenges while | |||
adding significant interest in the code and tests. The ability to | adding significant interest in the code and tests. The ability to | |||
compress the RPI down to three bytes or less removes much of the | compress the RPI down to three bytes or less removes much of the | |||
pressure to optimize this any further [ACP]. | pressure to optimize this any further. | |||
Throughout the following subsections, the examples are described in | Throughout the following subsections, the examples are described in | |||
more detail in the first subsections, and more concisely in the later | more detail in the first subsections, and more concisely in the later | |||
ones. | ones. | |||
The use cases are delineated based on the following IPV6 and RPL | The use cases are delineated based on the following IPV6 and RPL | |||
mandates: | mandates: | |||
The RPI has to be in every packet that traverses the LLN. | The RPI has to be in every packet that traverses the LLN. | |||
skipping to change at line 945 ¶ | skipping to change at line 945 ¶ | |||
root to RAL | root to RAL | |||
RUL to root | RUL to root | |||
root to RUL | root to RUL | |||
7.1.1. SM: Example of Flow from RAL to Root | 7.1.1. SM: Example of Flow from RAL to Root | |||
In Storing mode, RPI [RFC6553] is used to send the RPLInstanceID and | In Storing mode, RPI [RFC6553] is used to send the RPLInstanceID and | |||
rank information. | Rank information. | |||
In this case, the flow comprises: | In this case, the flow comprises: | |||
RAL (6LN) --> 6LR_i --> root (6LBR) | RAL (6LN) --> 6LR_i --> root (6LBR) | |||
For example, a communication flow could be: Node F (6LN) --> Node D | For example, a communication flow could be: Node F (6LN) --> Node D | |||
(6LR_i) --> Node B (6LR_i) --> Node A root (6LBR) | (6LR_i) --> Node B (6LR_i) --> Node A root (6LBR) | |||
The RAL (Node F) inserts the RPI, and sends the packet to the 6LR | The RAL (Node F) inserts the RPI, and sends the packet to the 6LR | |||
(Node D), which decrements the rank in the RPI and sends the packet | (Node D), which decrements the Rank in the RPI and sends the packet | |||
up. When the packet arrives at the 6LBR (Node A), the RPI is removed | up. When the packet arrives at the 6LBR (Node A), the RPI is removed | |||
and the packet is processed. | and the packet is processed. | |||
No IPv6-in-IPv6 header is required. | No IPv6-in-IPv6 header is required. | |||
The RPI can be removed by the 6LBR because the packet is addressed to | The RPI can be removed by the 6LBR because the packet is addressed to | |||
the 6LBR. The RAL must know that it is communicating with the 6LBR | the 6LBR. The RAL must know that it is communicating with the 6LBR | |||
to make use of this scenario. The RAL can know the address of the | to make use of this scenario. The RAL can know the address of the | |||
6LBR because it knows the address of the root via the DODAGID in the | 6LBR because it knows the address of the root via the DODAGID in the | |||
DIO messages. | DIO messages. | |||
skipping to change at line 994 ¶ | skipping to change at line 994 ¶ | |||
7.1.2. SM: Example of Flow from Root to RAL | 7.1.2. SM: Example of Flow from Root to RAL | |||
In this case, the flow comprises: | In this case, the flow comprises: | |||
root (6LBR) --> 6LR_i --> RAL (6LN) | root (6LBR) --> 6LR_i --> RAL (6LN) | |||
For example, a communication flow could be: Node A root (6LBR) --> | For example, a communication flow could be: Node A root (6LBR) --> | |||
Node B (6LR_i) --> Node D (6LR_i) --> Node F (6LN) | Node B (6LR_i) --> Node D (6LR_i) --> Node F (6LN) | |||
In this case, the 6LBR inserts RPI and sends the packet down. The | In this case, the 6LBR inserts RPI and sends the packet down. The | |||
6LR increments the rank in the RPI (it examines the RPLInstanceID to | 6LR increments the Rank in the RPI (it examines the RPLInstanceID to | |||
identify the right forwarding table). The packet is processed in the | identify the right forwarding table). The packet is processed in the | |||
RAL, and the RPI is removed. | RAL, and the RPI is removed. | |||
No IPv6-in-IPv6 header is required. | No IPv6-in-IPv6 header is required. | |||
Table 6 summarizes which headers are needed for this use case. | Table 6 summarizes which headers are needed for this use case. | |||
+===================+==========+=======+=========+ | +===================+==========+=======+=========+ | |||
| Header | 6LBR src | 6LR_i | RAL dst | | | Header | 6LBR src | 6LR_i | RAL dst | | |||
+===================+==========+=======+=========+ | +===================+==========+=======+=========+ | |||
skipping to change at line 1038 ¶ | skipping to change at line 1038 ¶ | |||
total number of routers (6LR) that the packet goes through, from the | total number of routers (6LR) that the packet goes through, from the | |||
6LBR (Node A) to the RUL (Node G). | 6LBR (Node A) to the RUL (Node G). | |||
The 6LBR will encapsulate the packet in an IPv6-in-IPv6 header and | The 6LBR will encapsulate the packet in an IPv6-in-IPv6 header and | |||
prepend an RPI. The IPv6-in-IPv6 header is addressed to the 6LR | prepend an RPI. The IPv6-in-IPv6 header is addressed to the 6LR | |||
parent of the RUL (6LR_n). The 6LR parent of the RUL removes the | parent of the RUL (6LR_n). The 6LR parent of the RUL removes the | |||
header and sends the packet to the RUL. | header and sends the packet to the RUL. | |||
Table 7 summarizes which headers are needed for this use case. | Table 7 summarizes which headers are needed for this use case. | |||
+===================+=============+=========+=============+=========+ | +==================+===============+=========+=========+=========+ | |||
| Header | 6LBR src | 6LR_i | 6LR_n | RUL dst | | | Header | 6LBR src | 6LR_i | 6LR_n | RUL dst | | |||
+===================+=============+=========+=============+=========+ | +==================+===============+=========+=========+=========+ | |||
| Added headers | IP6-IP6 RPI | -- | -- | -- | | | Added headers | IP6-IP6 (RPI) | -- | -- | -- | | |||
+===================+-------------+---------+-------------+---------+ | +==================+---------------+---------+---------+---------+ | |||
| Modified headers | -- | RPI | -- | -- | | | Modified headers | -- | RPI | -- | -- | | |||
+===================+-------------+---------+-------------+---------+ | +==================+---------------+---------+---------+---------+ | |||
| Removed headers | -- | -- | IP6-IP6 RPI | -- | | | Removed headers | -- | -- | IP6-IP6 | -- | | |||
+===================+-------------+---------+-------------+---------+ | | | | | (RPI) | | | |||
| Untouched | -- | IP6-IP6 | -- | -- | | +==================+---------------+---------+---------+---------+ | |||
| headers | | | | | | | Untouched | -- | IP6-IP6 | -- | -- | | |||
+===================+-------------+---------+-------------+---------+ | | headers | | | | | | |||
+==================+---------------+---------+---------+---------+ | ||||
Table 7: SM: Summary of the Use of Headers from Root to RUL | Table 7: SM: Summary of the Use of Headers from Root to RUL | |||
IP-in-IP encapsulation may be avoided for root-to-RUL communication. | IP-in-IP encapsulation may be avoided for root-to-RUL communication. | |||
In SM, it can be replaced by a loose RH3 header that indicates the | In SM, it can be replaced by a loose RH3 header that indicates the | |||
RUL. In which case, the packet is routed to the 6LR as a normal SM | RUL. In which case, the packet is routed to the 6LR as a normal SM | |||
operation, then the 6LR forwards to the RUL based on the RH3, and the | operation, then the 6LR forwards to the RUL based on the RH3, and the | |||
RUL ignores both the consumed RH3 and the RPI, as in Non-Storing | RUL ignores both the consumed RH3 and the RPI, as in Non-Storing | |||
mode. | mode. | |||
Table 8 summarizes which headers are needed for this scenario. | Table 8 summarizes which headers are needed for this scenario. | |||
skipping to change at line 1104 ¶ | skipping to change at line 1105 ¶ | |||
6LBR. | 6LBR. | |||
When the packet arrives from the RUL (Node G) to 6LR_1 (Node E), the | When the packet arrives from the RUL (Node G) to 6LR_1 (Node E), the | |||
6LR_1 will encapsulate the packet in an IPv6-in-IPv6 header with an | 6LR_1 will encapsulate the packet in an IPv6-in-IPv6 header with an | |||
RPI. The IPv6-in-IPv6 header is addressed to the root (Node A). The | RPI. The IPv6-in-IPv6 header is addressed to the root (Node A). The | |||
root removes the header and processes the packet. | root removes the header and processes the packet. | |||
Table 9 summarizes which headers are needed for this use case where | Table 9 summarizes which headers are needed for this use case where | |||
the IPv6-in-IPv6 header is addressed to the root (Node A). | the IPv6-in-IPv6 header is addressed to the root (Node A). | |||
+===================+=========+=============+=========+=============+ | +==================+=========+===============+=========+==========+ | |||
| Header | RUL src | 6LR_1 | 6LR_i | 6LBR dst | | | Header | RUL src | 6LR_1 | 6LR_i | 6LBR dst | | |||
+===================+=========+=============+=========+=============+ | +==================+=========+===============+=========+==========+ | |||
| Added headers | -- | IP6-IP6 RPI | -- | -- | | | Added headers | -- | IP6-IP6 (RPI) | -- | -- | | |||
+===================+---------+-------------+---------+-------------+ | +==================+---------+---------------+---------+----------+ | |||
| Modified headers | -- | -- | RPI | -- | | | Modified headers | -- | -- | RPI | -- | | |||
+===================+---------+-------------+---------+-------------+ | +==================+---------+---------------+---------+----------+ | |||
| Removed headers | -- | -- | -- | IP6-IP6 RPI | | | Removed headers | -- | -- | -- | IP6-IP6 | | |||
+===================+---------+-------------+---------+-------------+ | | | | | | (RPI) | | |||
| Untouched | -- | -- | IP6-IP6 | -- | | +==================+---------+---------------+---------+----------+ | |||
| headers | | | | | | | Untouched | -- | -- | IP6-IP6 | -- | | |||
+===================+---------+-------------+---------+-------------+ | | headers | | | | | | |||
+==================+---------+---------------+---------+----------+ | ||||
Table 9: SM: Summary of the Use of Headers from RUL to Root | Table 9: SM: Summary of the Use of Headers from RUL to Root | |||
7.2. SM: Interaction between Leaf and Internet | 7.2. SM: Interaction between Leaf and Internet | |||
This section describes the communication flow in Storing mode (SM) | This section describes the communication flow in Storing mode (SM) | |||
between the following: | between the following: | |||
RAL to Internet | RAL to Internet | |||
skipping to change at line 1153 ¶ | skipping to change at line 1155 ¶ | |||
routers (6LR) that the packet goes through, from the RAL to the 6LBR. | routers (6LR) that the packet goes through, from the RAL to the 6LBR. | |||
RPL information from RFC 6553 may go out to Internet as it will be | RPL information from RFC 6553 may go out to Internet as it will be | |||
ignored by nodes that have not been configured to be RPL aware. No | ignored by nodes that have not been configured to be RPL aware. No | |||
IPv6-in-IPv6 header is required. | IPv6-in-IPv6 header is required. | |||
On the other hand, the RAL may insert the RPI encapsulated in an | On the other hand, the RAL may insert the RPI encapsulated in an | |||
IPv6-in-IPv6 header to the root. Thus, the root removes the RPI and | IPv6-in-IPv6 header to the root. Thus, the root removes the RPI and | |||
sends the packet to the Internet. | sends the packet to the Internet. | |||
| Note: In this use case, it is used a node as a leaf, but this | | Note: In this use case, a leaf node is used, but this use case | |||
| use case can be also applicable to any RPL-aware node type | | can also be applicable to any RPL-aware node type (e.g., 6LR). | |||
| (e.g., 6LR). | ||||
Table 10 summarizes which headers are needed for this use case when | Table 10 summarizes which headers are needed for this use case when | |||
there is no encapsulation. Note that the RPI is modified by 6LBR to | there is no encapsulation. Note that the RPI is modified by 6LBR to | |||
set the SenderRank to zero in the case that it is not already zero. | set the SenderRank to zero in the case that it is not already zero. | |||
Table 11 summarizes which headers are needed when encapsulation to | Table 11 summarizes which headers are needed when encapsulation to | |||
the root takes place. | the root takes place. | |||
+===================+=========+=======+======+===============+ | +===================+=========+=======+======+===============+ | |||
| Header | RAL src | 6LR_i | 6LBR | Internet dst | | | Header | RAL src | 6LR_i | 6LBR | Internet dst | | |||
+===================+=========+=======+======+===============+ | +===================+=========+=======+======+===============+ | |||
skipping to change at line 1178 ¶ | skipping to change at line 1179 ¶ | |||
| Modified headers | -- | RPI | RPI | -- | | | Modified headers | -- | RPI | RPI | -- | | |||
+===================+---------+-------+------+---------------+ | +===================+---------+-------+------+---------------+ | |||
| Removed headers | -- | -- | -- | -- | | | Removed headers | -- | -- | -- | -- | | |||
+===================+---------+-------+------+---------------+ | +===================+---------+-------+------+---------------+ | |||
| Untouched headers | -- | -- | -- | RPI (Ignored) | | | Untouched headers | -- | -- | -- | RPI (Ignored) | | |||
+===================+---------+-------+------+---------------+ | +===================+---------+-------+------+---------------+ | |||
Table 10: SM: Summary of the Use of Headers from RAL to | Table 10: SM: Summary of the Use of Headers from RAL to | |||
Internet with No Encapsulation | Internet with No Encapsulation | |||
+==================+=============+=========+=========+==============+ | +===============+===============+=========+=========+==============+ | |||
| Header | RAL src | 6LR_i | 6LBR | Internet dst | | | Header | RAL src | 6LR_i | 6LBR | Internet dst | | |||
+==================+=============+=========+=========+==============+ | +===============+===============+=========+=========+==============+ | |||
| Added headers | IP6-IP6 RPI | -- | -- | -- | | | Added headers | IP6-IP6 (RPI) | -- | -- | -- | | |||
+==================+-------------+---------+---------+--------------+ | +===============+---------------+---------+---------+--------------+ | |||
| Modified | -- | RPI | -- | -- | | | Modified | -- | RPI | -- | -- | | |||
| headers | | | | | | | headers | | | | | | |||
+==================+-------------+---------+---------+--------------+ | +===============+---------------+---------+---------+--------------+ | |||
| Removed | -- | -- | IP6-IP6 | -- | | | Removed | -- | -- | IP6-IP6 | -- | | |||
| headers | | | RPI | | | | headers | | | (RPI) | | | |||
+==================+-------------+---------+---------+--------------+ | +===============+---------------+---------+---------+--------------+ | |||
| Untouched | -- | IP6-IP6 | -- | -- | | | Untouched | -- | IP6-IP6 | -- | -- | | |||
| headers | | | | | | | headers | | | | | | |||
+==================+-------------+---------+---------+--------------+ | +===============+---------------+---------+---------+--------------+ | |||
Table 11: SM: Summary of the Use of Headers from RAL to Internet with | Table 11: SM: Summary of the Use of Headers from RAL to Internet | |||
Encapsulation to the Root (6LBR) | with Encapsulation to the Root (6LBR) | |||
7.2.2. SM: Example of Flow from Internet to RAL | 7.2.2. SM: Example of Flow from Internet to RAL | |||
In this case, the flow comprises: | In this case, the flow comprises: | |||
Internet --> root (6LBR) --> 6LR_i --> RAL (6LN) | Internet --> root (6LBR) --> 6LR_i --> RAL (6LN) | |||
For example, a communication flow could be: Internet --> Node A root | For example, a communication flow could be: Internet --> Node A root | |||
(6LBR) --> Node B (6LR_1) --> Node D (6LR_n) --> Node F (RAL) | (6LBR) --> Node B (6LR_1) --> Node D (6LR_n) --> Node F (RAL) | |||
When the packet arrives from Internet to 6LBR, the RPI is added in a | When the packet arrives from Internet to 6LBR, the RPI is added in a | |||
outer IPv6-in-IPv6 header (with the IPv6-in-IPv6 destination address | outer IPv6-in-IPv6 header (with the IPv6-in-IPv6 destination address | |||
set to the RAL) and sent to the 6LR, which modifies the rank in the | set to the RAL) and sent to the 6LR, which modifies the Rank in the | |||
RPI. When the packet arrives at the RAL, the packet is decapsulated, | RPI. When the packet arrives at the RAL, the packet is decapsulated, | |||
which removes the RPI before the packet is processed. | which removes the RPI before the packet is processed. | |||
Table 12 summarizes which headers are needed for this use case. | Table 12 summarizes which headers are needed for this use case. | |||
+==================+==============+===============+=======+=========+ | +==================+==============+===============+=======+=========+ | |||
| Header | Internet src | 6LBR | 6LR_i | RAL dst | | | Header | Internet src | 6LBR | 6LR_i | RAL dst | | |||
+==================+==============+===============+=======+=========+ | +==================+==============+===============+=======+=========+ | |||
| Added headers | -- | IP6-IP6 (RPI) | -- | -- | | | Added headers | -- | IP6-IP6 (RPI) | -- | -- | | |||
+==================+--------------+---------------+-------+---------+ | +==================+--------------+---------------+-------+---------+ | |||
skipping to change at line 1241 ¶ | skipping to change at line 1242 ¶ | |||
In this case, the flow comprises: | In this case, the flow comprises: | |||
RUL (IPv6 src node) --> 6LR_1 --> 6LR_i --> root (6LBR) --> Internet | RUL (IPv6 src node) --> 6LR_1 --> 6LR_i --> root (6LBR) --> Internet | |||
For example, a communication flow could be: Node G (RUL) --> Node E | For example, a communication flow could be: Node G (RUL) --> Node E | |||
(6LR_1) --> Node B (6lR_i) --> Node A root (6LBR) --> Internet | (6LR_1) --> Node B (6lR_i) --> Node A root (6LBR) --> Internet | |||
The node 6LR_1 (i=1) will add an IPv6-in-IPv6 (RPI) header addressed | The node 6LR_1 (i=1) will add an IPv6-in-IPv6 (RPI) header addressed | |||
to the root such that the root can remove the RPI before passing | to the root such that the root can remove the RPI before passing | |||
upwards. In the intermediate 6LR, the rank in the RPI is modified. | upwards. In the intermediate 6LR, the Rank in the RPI is modified. | |||
The originating node will ideally leave the IPv6 flow label as zero | The originating node will ideally leave the IPv6 flow label as zero | |||
so that the packet can be better compressed through the LLN. The | so that the packet can be better compressed through the LLN. The | |||
6LBR will set the flow label of the packet to a non-zero value when | 6LBR will set the flow label of the packet to a non-zero value when | |||
sending to the Internet. For details, check [RFC6437]. | sending to the Internet. For details, check [RFC6437]. | |||
Table 13 summarizes which headers are needed for this use case. | Table 13 summarizes which headers are needed for this use case. | |||
+===========+==========+=========+=============+=========+==========+ | +===========+=======+=========+==============+=========+==========+ | |||
| Header | IPv6 | 6LR_1 | 6LR_i | 6LBR | Internet | | | Header | IPv6 | 6LR_1 | 6LR_i | 6LBR | Internet | | |||
| | src | | [i=2,...,n] | | dst | | | | src | | i=(1,..,n-1) | | dst | | |||
| | (RUL) | | | | | | | | (RUL) | | | | | | |||
+===========+==========+=========+=============+=========+==========+ | +===========+=======+=========+==============+=========+==========+ | |||
| Added | -- | IP6-IP6 | -- | -- | -- | | | Added | -- | IP6-IP6 | -- | -- | -- | | |||
| headers | | (RPI) | | | | | | headers | | (RPI) | | | | | |||
+===========+----------+---------+-------------+---------+----------+ | +===========+-------+---------+--------------+---------+----------+ | |||
| Modified | -- | -- | RPI | -- | -- | | | Modified | -- | -- | RPI | -- | -- | | |||
| headers | | | | | | | | headers | | | | | | | |||
+===========+----------+---------+-------------+---------+----------+ | +===========+-------+---------+--------------+---------+----------+ | |||
| Removed | -- | -- | -- | IP6-IP6 | -- | | | Removed | -- | -- | -- | IP6-IP6 | -- | | |||
| headers | | | | (RPI) | | | | headers | | | | (RPI) | | | |||
+===========+----------+---------+-------------+---------+----------+ | +===========+-------+---------+--------------+---------+----------+ | |||
| Untouched | -- | -- | -- | -- | -- | | | Untouched | -- | -- | -- | -- | -- | | |||
| headers | | | | | | | | headers | | | | | | | |||
+===========+----------+---------+-------------+---------+----------+ | +===========+-------+---------+--------------+---------+----------+ | |||
Table 13: SM: Summary of the Use of Headers from RUL to Internet | Table 13: SM: Summary of the Use of Headers from RUL to Internet | |||
7.2.4. SM: Example of Flow from Internet to RUL | 7.2.4. SM: Example of Flow from Internet to RUL | |||
In this case, the flow comprises: | In this case, the flow comprises: | |||
Internet --> root (6LBR) --> 6LR_i --> RUL (IPv6 dst node) | Internet --> root (6LBR) --> 6LR_i --> RUL (IPv6 dst node) | |||
For example, a communication flow could be: Internet --> Node A root | For example, a communication flow could be: Internet --> Node A root | |||
(6LBR) --> Node B (6LR_i) --> Node E (6LR_n) --> Node G (RUL) | (6LBR) --> Node B (6LR_i) --> Node E (6LR_n) --> Node G (RUL) | |||
The 6LBR will have to add an RPI within an IPv6-in-IPv6 header. The | The 6LBR will have to add an RPI within an IPv6-in-IPv6 header. The | |||
IPv6-in-IPv6 header is addressed to the 6LR parent of the RUL. | IPv6-in-IPv6 encapsulating header is addressed to the 6LR parent of | |||
the RUL. | ||||
Further details about this are mentioned in [RFC9010], which | Further details about this are mentioned in [RFC9010], which | |||
specifies RPL routing for a 6LN acting as a plain host and being | specifies RPL routing for a 6LN acting as a plain host and being | |||
unaware of RPL. | unaware of RPL. | |||
The 6LBR may set the flow label on the inner IPv6-in-IPv6 header to | The 6LBR may set the flow label on the inner IPv6-in-IPv6 header to | |||
zero in order to aid in compression [RFC8138] [RFC6437]. | zero in order to aid in compression [RFC8138] [RFC6437]. | |||
Table 14 summarizes which headers are needed for this use case. | Table 14 summarizes which headers are needed for this use case. | |||
+===========+==============+=========+==============+=========+=====+ | +===========+==============+=========+==============+=========+=====+ | |||
| Header | Internet | 6LBR | 6LR_i | 6LR_n | RUL | | | Header | Internet | 6LBR | 6LR_i | 6LR_n | RUL | | |||
| | src | | [i=1,..,n-1] | | dst | | | | src | | i=(1,..,n-1) | | dst | | |||
+===========+==============+=========+==============+=========+=====+ | +===========+==============+=========+==============+=========+=====+ | |||
| Inserted | -- | IP6-IP6 | -- | -- | -- | | | Added | -- | IP6-IP6 | -- | -- | -- | | |||
| headers | | (RPI) | | | | | | headers | | (RPI) | | | | | |||
+===========+--------------+---------+--------------+---------+-----+ | +===========+--------------+---------+--------------+---------+-----+ | |||
| Modified | -- | -- | RPI | -- | -- | | | Modified | -- | -- | RPI | -- | -- | | |||
| headers | | | | | | | | headers | | | | | | | |||
+===========+--------------+---------+--------------+---------+-----+ | +===========+--------------+---------+--------------+---------+-----+ | |||
| Removed | -- | -- | -- | IP6-IP6 | -- | | | Removed | -- | -- | -- | IP6-IP6 | -- | | |||
| headers | | | | (RPI) | | | | headers | | | | (RPI) | | | |||
+===========+--------------+---------+--------------+---------+-----+ | +===========+--------------+---------+--------------+---------+-----+ | |||
| Untouched | -- | -- | -- | -- | -- | | | Untouched | -- | -- | -- | -- | -- | | |||
| headers | | | | | | | | headers | | | | | | | |||
skipping to change at line 1495 ¶ | skipping to change at line 1497 ¶ | |||
router from the RUL source (Node G) to the root (6LBR) (Node A). In | router from the RUL source (Node G) to the root (6LBR) (Node A). In | |||
this case, 1 <= ia <= n, where n is the total number of routers (6LR) | this case, 1 <= ia <= n, where n is the total number of routers (6LR) | |||
that the packet goes through, from the RUL to the root. 6LR_1 applies | that the packet goes through, from the RUL to the root. 6LR_1 applies | |||
when ia=1. | when ia=1. | |||
6LR_id (Node C) represents the intermediate routers from the root | 6LR_id (Node C) represents the intermediate routers from the root | |||
(Node A) to the destination RUL (Node J). In this case, 1 <= id <= | (Node A) to the destination RUL (Node J). In this case, 1 <= id <= | |||
m, where m is the total number of routers (6LR) that the packet goes | m, where m is the total number of routers (6LR) that the packet goes | |||
through, from the root to the destination RUL. | through, from the root to the destination RUL. | |||
The 6LR_1 (Node E) receives the packet from the RUL (Node G) and | The 6LR_1 (Node E) receives the packet from the RUL (Node G) and adds | |||
inserts the RPI (RPI1), encapsulated in an IPv6-in-IPv6 header | the RPI (RPI1) in an IPv6-in-IPv6 encapsulation directed to the root. | |||
directed to the root. The root removes the outer header including | The root removes the outer header including the RPI (RPI1) and | |||
the RPI (RPI1) and inserts a new RPI (RPI2) addressed to the 6LR | inserts a new RPI (RPI2) addressed to the 6LR parent of the RUL. | |||
parent of the RUL. | ||||
Table 18 summarizes which headers are needed for this use case. | Table 18 summarizes which headers are needed for this use case. | |||
+===========+===+=========+========+=========+========+=========+===+ | +===========+===+=========+========+=========+========+=========+===+ | |||
| Header |RUL| 6LR_1 | 6LR_ia | 6LBR | 6LR_id | 6LR_n |RUL| | | Header |RUL| 6LR_1 | 6LR_ia | 6LBR | 6LR_id | 6LR_n |RUL| | |||
| |src| | | | | |dst| | | |src| | | | | |dst| | |||
+===========+===+=========+========+=========+========+=========+===+ | +===========+===+=========+========+=========+========+=========+===+ | |||
| Added | --| IP6-IP6 | -- | IP6-IP6 | -- | -- | --| | | Added | --| IP6-IP6 | -- | IP6-IP6 | -- | -- | --| | |||
| headers | | (RPI1) | | (RPI1) | | | | | | headers | | (RPI1) | | (RPI1) | | | | | |||
+===========+---+---------+--------+---------+--------+---------+---+ | +===========+---+---------+--------+---------+--------+---------+---+ | |||
skipping to change at line 1615 ¶ | skipping to change at line 1616 ¶ | |||
root to RAL | root to RAL | |||
RUL to root | RUL to root | |||
root to RUL | root to RUL | |||
8.1.1. Non-SM: Example of Flow from RAL to Root | 8.1.1. Non-SM: Example of Flow from RAL to Root | |||
In Non-Storing mode, the leaf node uses default routing to send | In Non-Storing mode, the leaf node uses default routing to send | |||
traffic to the root. The RPI must be included since it contains the | traffic to the root. The RPI must be included since it contains the | |||
rank information, which is used to avoid and/or detect loops. | Rank information, which is used to avoid and/or detect loops. | |||
RAL (6LN) --> 6LR_i --> root(6LBR) | RAL (6LN) --> 6LR_i --> root(6LBR) | |||
For example, a communication flow could be: Node F --> Node D --> | For example, a communication flow could be: Node F --> Node D --> | |||
Node B --> Node A (root) | Node B --> Node A (root) | |||
6LR_i represents the intermediate routers from the source to the | 6LR_i represents the intermediate routers from the source to the | |||
destination. In this case, 1 <= i <= n, where n is the total number | destination. In this case, 1 <= i <= n, where n is the total number | |||
of routers (6LR) that the packet goes through, from the source (RAL) | of routers (6LR) that the packet goes through, from the source (RAL) | |||
to the destination (6LBR). | to the destination (6LBR). | |||
skipping to change at line 1900 ¶ | skipping to change at line 1901 ¶ | |||
6LBR, e.g., 6LR_1 (i=1). | 6LBR, e.g., 6LR_1 (i=1). | |||
In this case, the flow label is recommended to be zero in the RUL. | In this case, the flow label is recommended to be zero in the RUL. | |||
As the RUL parent adds RPL headers in the RUL packet, the first 6LR | As the RUL parent adds RPL headers in the RUL packet, the first 6LR | |||
(6LR_1) will add an RPI inside a new IPv6-in-IPv6 header. The IPv6- | (6LR_1) will add an RPI inside a new IPv6-in-IPv6 header. The IPv6- | |||
in-IPv6 header will be addressed to the root. This case is identical | in-IPv6 header will be addressed to the root. This case is identical | |||
to the Storing mode case (see Section 7.2.3). | to the Storing mode case (see Section 7.2.3). | |||
Table 27 summarizes which headers are needed for this use case. | Table 27 summarizes which headers are needed for this use case. | |||
+===========+=========+=========+============+=========+==========+ | +===========+=========+=========+==============+=========+==========+ | |||
| Header | RUL src | 6LR_1 | 6LR_i | 6LBR | Internet | | | Header | RUL | 6LR_1 | 6LR_i | 6LBR | Internet | | |||
| | | | [i=2,..,n] | | dst | | | | src | | i=(1,..,n-1) | | dst | | |||
+===========+=========+=========+============+=========+==========+ | +===========+=========+=========+==============+=========+==========+ | |||
| Added | -- | IP6-IP6 | -- | -- | -- | | | Added | -- | IP6-IP6 | -- | -- | -- | | |||
| headers | | (RPI) | | | | | | headers | | (RPI) | | | | | |||
+===========+---------+---------+------------+---------+----------+ | +===========+---------+---------+--------------+---------+----------+ | |||
| Modified | -- | -- | RPI | -- | -- | | | Modified | -- | -- | RPI | -- | -- | | |||
| headers | | | | | | | | headers | | | | | | | |||
+===========+---------+---------+------------+---------+----------+ | +===========+---------+---------+--------------+---------+----------+ | |||
| Removed | -- | -- | -- | IP6-IP6 | -- | | | Removed | -- | -- | -- | IP6-IP6 | -- | | |||
| headers | | | | (RPI) | | | | headers | | | | (RPI) | | | |||
+===========+---------+---------+------------+---------+----------+ | +===========+---------+---------+--------------+---------+----------+ | |||
| Untouched | -- | -- | -- | -- | -- | | | Untouched | -- | -- | -- | -- | -- | | |||
| headers | | | | | | | | headers | | | | | | | |||
+===========+---------+---------+------------+---------+----------+ | +===========+---------+---------+--------------+---------+----------+ | |||
Table 27: Non-SM: Summary of the Use of Headers from RUL to | Table 27: Non-SM: Summary of the Use of Headers from RUL to Internet | |||
Internet | ||||
8.2.4. Non-SM: Example of Flow from Internet to RUL | 8.2.4. Non-SM: Example of Flow from Internet to RUL | |||
In this case, the flow comprises: | In this case, the flow comprises: | |||
Internet src --> root (6LBR) --> 6LR_i --> RUL (IPv6 dst node) | Internet src --> root (6LBR) --> 6LR_i --> RUL (IPv6 dst node) | |||
For example, a communication flow could be: Internet --> Node A | For example, a communication flow could be: Internet --> Node A | |||
(root) --> Node B --> Node E --> Node G | (root) --> Node B --> Node E --> Node G | |||
skipping to change at line 2047 ¶ | skipping to change at line 2047 ¶ | |||
| headers | | | | | | | | headers | | | | | | | |||
+===========+---------+--------+---------------+---------+---------+ | +===========+---------+--------+---------------+---------+---------+ | |||
Table 29: Non-SM: Summary of the Use of Headers from RAL to RAL with | Table 29: Non-SM: Summary of the Use of Headers from RAL to RAL with | |||
Encapsulation to the Root | Encapsulation to the Root | |||
+===========+======+========+=============+=============+===========+ | +===========+======+========+=============+=============+===========+ | |||
| Header | RAL | 6LR_ia | 6LBR | 6LR_id | RAL dst | | | Header | RAL | 6LR_ia | 6LBR | 6LR_id | RAL dst | | |||
| | src | | | | | | | | src | | | | | | |||
+===========+======+========+=============+=============+===========+ | +===========+======+========+=============+=============+===========+ | |||
| Inserted | RPI1 | -- | IP6-IP6 | -- | -- | | | Added | RPI1 | -- | IP6-IP6 | -- | -- | | |||
| headers | | | (RH3, RPI2) | | | | | headers | | | (RH3, RPI2) | | | | |||
+===========+------+--------+-------------+-------------+-----------+ | +===========+------+--------+-------------+-------------+-----------+ | |||
| Modified | -- | RPI1 | -- | IP6-IP6 | -- | | | Modified | -- | RPI1 | -- | IP6-IP6 | -- | | |||
| headers | | | | (RH3, | | | | headers | | | | (RH3, | | | |||
| | | | | RPI2) | | | | | | | | RPI2) | | | |||
+===========+------+--------+-------------+-------------+-----------+ | +===========+------+--------+-------------+-------------+-----------+ | |||
| Removed | -- | -- | -- | -- | IP6-IP6 | | | Removed | -- | -- | -- | -- | IP6-IP6 | | |||
| headers | | | | | (RH3, | | | headers | | | | | (RH3, | | |||
| | | | | | RPI2) | | | | | | | | RPI2) | | |||
+===========+------+--------+-------------+-------------+-----------+ | +===========+------+--------+-------------+-------------+-----------+ | |||
skipping to change at line 2124 ¶ | skipping to change at line 2124 ¶ | |||
| headers | | | | | | | | | headers | | | | | | | | |||
+===========+---------+--------+---------+---------+---------+-----+ | +===========+---------+--------+---------+---------+---------+-----+ | |||
Table 31: Non-SM: Summary of the Use of Headers from RAL to RUL with | Table 31: Non-SM: Summary of the Use of Headers from RAL to RUL with | |||
Encapsulation to the Root | Encapsulation to the Root | |||
+===========+====+========+=========+=========+=========+===========+ | +===========+====+========+=========+=========+=========+===========+ | |||
| Header |RAL | 6LR_ia | 6LBR | 6LR_id | 6LR_n | RUL dst | | | Header |RAL | 6LR_ia | 6LBR | 6LR_id | 6LR_n | RUL dst | | |||
| |src | | | | | | | | |src | | | | | | | |||
+===========+====+========+=========+=========+=========+===========+ | +===========+====+========+=========+=========+=========+===========+ | |||
| Inserted |RPI1| -- | IP6-IP6 | -- | -- | -- | | | Added |RPI1| -- | IP6-IP6 | -- | -- | -- | | |||
| headers | | | (RH3, | | | | | | headers | | | (RH3, | | | | | |||
| | | | RPI2) | | | | | | | | | RPI2) | | | | | |||
+===========+----+--------+---------+---------+---------+-----------+ | +===========+----+--------+---------+---------+---------+-----------+ | |||
| Modified | -- | RPI1 | -- | IP6-IP6 | -- | -- | | | Modified | -- | RPI1 | -- | IP6-IP6 | -- | -- | | |||
| headers | | | | (RH3, | | | | | headers | | | | (RH3, | | | | |||
| | | | | RPI2) | | | | | | | | | RPI2) | | | | |||
+===========+----+--------+---------+---------+---------+-----------+ | +===========+----+--------+---------+---------+---------+-----------+ | |||
| Removed | -- | -- | -- | -- | IP6-IP6 | -- | | | Removed | -- | -- | -- | -- | IP6-IP6 | -- | | |||
| headers | | | | | (RH3, | | | | headers | | | | | (RH3, | | | |||
| | | | | | RPI2) | | | | | | | | | RPI2) | | | |||
skipping to change at line 2243 ¶ | skipping to change at line 2243 ¶ | |||
9. Operational Considerations of Supporting RULs | 9. Operational Considerations of Supporting RULs | |||
Roughly half of the situations described in this document involve | Roughly half of the situations described in this document involve | |||
leaf ("host") nodes that do not speak RPL. These nodes fall into two | leaf ("host") nodes that do not speak RPL. These nodes fall into two | |||
further categories: ones that drop a packet that have RPI or RH3 | further categories: ones that drop a packet that have RPI or RH3 | |||
headers, and ones that continue to process a packet that has RPI and/ | headers, and ones that continue to process a packet that has RPI and/ | |||
or RH3 headers. | or RH3 headers. | |||
[RFC8200] provides for new rules that suggest that nodes that have | [RFC8200] provides for new rules that suggest that nodes that have | |||
not been configured (explicitly) to examine Hop-by-Hop headers should | not been configured (explicitly) to examine Hop-by-Hop Options | |||
ignore those headers and continue processing the packet. Despite | headers should ignore those headers and continue processing the | |||
this, and despite the switch from 0x63 to 0x23, there may be nodes | packet. Despite this, and despite the switch from 0x63 to 0x23, | |||
that predate RFC 8200 or are simply intolerant. Those nodes will | there may be nodes that predate RFC 8200 or are simply intolerant. | |||
drop packets that continue to have RPL artifacts in them. In | Those nodes will drop packets that continue to have RPL artifacts in | |||
general, such nodes cannot be easily supported in RPL LLNs. | them. In general, such nodes cannot be easily supported in RPL LLNs. | |||
There are some specific cases where it is possible to remove the RPL | There are some specific cases where it is possible to remove the RPL | |||
artifacts prior to forwarding the packet to the leaf host. The | artifacts prior to forwarding the packet to the leaf host. The | |||
critical thing is that the artifacts have been inserted by the RPL | critical thing is that the artifacts have been inserted by the RPL | |||
root inside an IPv6-in-IPv6 header, and that the header has been | root inside an IPv6-in-IPv6 header, and that the header has been | |||
addressed to the 6LR immediately prior to the leaf node. In that | addressed to the 6LR immediately prior to the leaf node. In that | |||
case, in the process of removing the IPv6-in-IPv6 header, the | case, in the process of removing the IPv6-in-IPv6 header, the | |||
artifacts can also be removed. | artifacts can also be removed. | |||
The above case occurs whenever traffic originates from the outside | The above case occurs whenever traffic originates from the outside | |||
skipping to change at line 2290 ¶ | skipping to change at line 2290 ¶ | |||
intolerant leaf nodes, which drop packets with RPL artifacts, cannot | intolerant leaf nodes, which drop packets with RPL artifacts, cannot | |||
be supported. | be supported. | |||
10. Operational Considerations of Introducing 0x23 | 10. Operational Considerations of Introducing 0x23 | |||
This section describes the operational considerations of introducing | This section describes the operational considerations of introducing | |||
the new RPI Option Type of 0x23. | the new RPI Option Type of 0x23. | |||
During bootstrapping, the node receives the DIO with the information | During bootstrapping, the node receives the DIO with the information | |||
of RPI Option Type, indicating the new RPI in the DODAG Configuration | of RPI Option Type, indicating the new RPI in the DODAG Configuration | |||
option flag. The DODAG root is in charge to configure the current | option flag. The DODAG root is in charge of configuring the current | |||
network with the new value, through DIO messages, and determines when | network with the new value, through DIO messages, and determining | |||
all the nodes are set with the new value. The DODAG should change to | when all the nodes have been set with the new value. The DODAG | |||
a new DODAG version. In case of rebooting, the node does not | should change to a new DODAG version. In case of rebooting, the node | |||
remember the RPI Option Type. Thus, the DIO is sent with a flag | does not remember the RPI Option Type. Thus, the DIO is sent with a | |||
indicating the new RPI Option Type. | flag indicating the new RPI Option Type. | |||
The DODAG Configuration option is contained in a RPL DIO message, | The DODAG Configuration option is contained in a RPL DIO message, | |||
which contains a unique Destination Advertisement Trigger Sequence | which contains a unique Destination Advertisement Trigger Sequence | |||
Number (DTSN) counter. The leaf nodes respond to this message with | Number (DTSN) counter. The leaf nodes respond to this message with | |||
DAO messages containing the same DTSN. This is a normal part of RPL | DAO messages containing the same DTSN. This is a normal part of RPL | |||
routing; the RPL root therefore knows when the updated DODAG | routing; the RPL root therefore knows when the updated DODAG | |||
Configuration option has been seen by all nodes. | Configuration option has been seen by all nodes. | |||
Before the migration happens, all the RPL-aware nodes should support | Before the migration happens, all the RPL-aware nodes should support | |||
both values. The migration procedure is triggered when the DIO is | both values. The migration procedure is triggered when the DIO is | |||
skipping to change at line 2389 ¶ | skipping to change at line 2389 ¶ | |||
While a typical LLN may be a very poor origin for attack traffic (as | While a typical LLN may be a very poor origin for attack traffic (as | |||
the networks tend to be very slow, and the nodes often have very low | the networks tend to be very slow, and the nodes often have very low | |||
duty cycles), given enough nodes, LLNs could still have a significant | duty cycles), given enough nodes, LLNs could still have a significant | |||
impact, particularly if the attack is targeting another LLN. | impact, particularly if the attack is targeting another LLN. | |||
Additionally, some uses of RPL involve large-backbone, ISP-scale | Additionally, some uses of RPL involve large-backbone, ISP-scale | |||
equipment [ACP], which may be equipped with multiple 100 Gb/s | equipment [ACP], which may be equipped with multiple 100 Gb/s | |||
interfaces. | interfaces. | |||
Blocking or careful filtering of IPv6-in-IPv6 traffic entering the | Blocking or careful filtering of IPv6-in-IPv6 traffic entering the | |||
LLN as described above will make sure that any attack that is mounted | LLN as described above will make sure that any attack that is mounted | |||
must originate from compromised nodes within the LLN. The use of BCP | must originate from compromised nodes within the LLN. The use of | |||
38 [BCP38] filtering at the RPL root on egress traffic will both | network ingress filtering [BCP38] on egress traffic at the RPL root | |||
alert the operator to the existence of the attack, as well as drop | will alert the operator to the existence of the attack as well as | |||
the attack traffic. As the RPL network is typically numbered from a | drop the attack traffic. As the RPL network is typically numbered | |||
single prefix, which is itself assigned by RPL, BCP38 filtering | from a single prefix, which is itself assigned by RPL, network | |||
involves a single prefix comparison and should be trivial to | ingress filtering [BCP38] involves a single prefix comparison and | |||
automatically configure. | should be trivial to automatically configure. | |||
There are some scenarios where IPv6-in-IPv6 traffic should be allowed | There are some scenarios where IPv6-in-IPv6 traffic should be allowed | |||
to pass through the RPL root, such as the IPv6-in-IPv6 mediated | to pass through the RPL root, such as the IPv6-in-IPv6 mediated | |||
communications between a new pledge and the Join Registrar/ | communications between a new pledge and the Join Registrar/ | |||
Coordinator (JRC) when using [BRSKI] and [ZEROTOUCH-JOIN]. This is | Coordinator (JRC) when using [BRSKI] and [ZEROTOUCH-JOIN]. This is | |||
the case for the RPL root to do careful filtering: it occurs only | the case for the RPL root to do careful filtering: it occurs only | |||
when the Join Coordinator is not co-located inside the RPL root. | when the Join Coordinator is not co-located inside the RPL root. | |||
With the above precautions, an attack using IPv6-in-IPv6 tunnels can | With the above precautions, an attack using IPv6-in-IPv6 tunnels can | |||
only be by a node within the LLN on another node within the LLN. | only be by a node within the LLN on another node within the LLN. | |||
Such an attack could, of course, be done directly. An attack of this | Such an attack could, of course, be done directly. An attack of this | |||
kind is meaningful only if the source addresses are either fake or if | kind is meaningful only if the source addresses are either fake or if | |||
the point is to amplify return traffic. Such an attack could also be | the point is to amplify return traffic. Such an attack could also be | |||
done without the use of IPv6-in-IPv6 headers using forged source | done without the use of IPv6-in-IPv6 headers, by using forged source | |||
addresses. If the attack requires bidirectional communication, then | addresses instead. If the attack requires bidirectional | |||
IPv6-in-IPv6 provides no advantages. | communication, then IPv6-in-IPv6 provides no advantages. | |||
Whenever IPv6-in-IPv6 headers are being proposed, there is a concern | Whenever IPv6-in-IPv6 headers are being proposed, there is a concern | |||
about creating security issues. In the Security Considerations | about creating security issues. In the Security Considerations | |||
section of [RFC2473] (Section 9), it was suggested that tunnel entry | section of [RFC2473] (Section 9), it was suggested that tunnel entry | |||
and exit points can be secured by securing the IPv6 path between | and exit points can be secured by securing the IPv6 path between | |||
them. This recommendation is not practical for RPL networks. | them. This recommendation is not practical for RPL networks. | |||
[RFC5406] goes into some detail on what additional details would be | [RFC5406] provides guidance on what on what additional details are | |||
needed in order to "Use IPsec". Use of Encapsulating Security | nedded in order to "Use IPsec". While the use of Encapsulating | |||
Payload (ESP) would prevent as defined in [RFC8138] (compression must | Security Payload (ESP) would prevent source address forgeries, in | |||
occur before encryption), and [RFC8138] compression is lossy in a way | order to use it with [RFC8138], compression would have to occur | |||
that prevents use of AH. These are minor issues. The major issue is | before encryption, as the [RFC8138] compression is lossy. Once | |||
how to establish trust enough such that Internet Key Exchange | encrypted, there would be no further redundancy to compress. These | |||
Protocol Version 2 (IKEv2) could be used. This would require a | are minor issues. The major issue is how to establish trust enough | |||
system of certificates to be present in every single node, including | such that Internet Key Exchange Protocol Version 2 (IKEv2) could be | |||
any Internet nodes that might need to communicate with the LLN. | used. This would require a system of certificates to be present in | |||
Thus, using IPsec requires a global PKI in the general case. | every single node, including any Internet nodes that might need to | |||
communicate with the LLN. Thus, using IPsec requires a global PKI in | ||||
the general case. | ||||
More significantly, the use of IPsec tunnels to protect the IPv6-in- | More significantly, the use of IPsec tunnels to protect the IPv6-in- | |||
IPv6 headers would, in the general case, scale with the square of the | IPv6 headers would, in the general case, scale with the square of the | |||
number of nodes. This is a lot of resources for a constrained nodes | number of nodes. This is a lot of resources for a constrained nodes | |||
on a constrained network. In the end, the IPsec tunnels would be | on a constrained network. In the end, the IPsec tunnels would be | |||
providing only BCP38-like origin authentication! That is, IPsec | providing only BCP38-like origin authentication! That is, IPsec | |||
provides a transitive guarantee to the tunnel exit point that the | provides a transitive guarantee to the tunnel exit point that the | |||
tunnel entry point did BCP38 on traffic going in. Just doing origin | tunnel entry point did network ingress filtering [BCP38] on traffic | |||
filtering per BCP 38 at the entry and exit of the LLN provides a | going in. Just doing origin filtering per BCP 38 at the entry and | |||
similar level of security without all the scaling and trust problems | exit of the LLN provides a similar level of security without all the | |||
related to IPv6 tunnels as discussed in [RFC2473]. IPsec is not | scaling and trust problems related to IPv6 tunnels as discussed in | |||
recommended. | [RFC2473]. IPsec is not recommended. | |||
An LLN with hostile nodes within it would not be protected against | An LLN with hostile nodes within it would not be protected against | |||
impersonation within the LLN by entry/exit filtering. | impersonation within the LLN by entry/exit filtering. | |||
The RH3 header usage described here can be abused in equivalent ways. | The RH3 header usage described here can be abused in equivalent ways. | |||
An external attacker may form a packet with an RH3 that is not fully | An external attacker may form a packet with an RH3 that is not fully | |||
consumed and encapsulate it to hide the RH3 from intermediate nodes | consumed and encapsulate it to hide the RH3 from intermediate nodes | |||
and disguise the origin of traffic. As such, the attacker's RH3 | and disguise the origin of traffic. As such, the attacker's RH3 | |||
header will not be seen by the network until it reaches the | header will not be seen by the network until it reaches the | |||
destination, which will decapsulate it. As indicated in Section 4.2 | destination, which will decapsulate it. As indicated in Section 4.2 | |||
skipping to change at line 2483 ¶ | skipping to change at line 2485 ¶ | |||
It could also be that not all nodes are reachable in an LLN using the | It could also be that not all nodes are reachable in an LLN using the | |||
default RPLInstanceID, but a change of RPLInstanceID would permit an | default RPLInstanceID, but a change of RPLInstanceID would permit an | |||
attacker to bypass such filtering. Like the RH3, an RPI is to be | attacker to bypass such filtering. Like the RH3, an RPI is to be | |||
inserted by the RPL root on traffic entering the LLN by first | inserted by the RPL root on traffic entering the LLN by first | |||
inserting an IPv6-in-IPv6 header. The attacker's RPI therefore will | inserting an IPv6-in-IPv6 header. The attacker's RPI therefore will | |||
not be seen by the network. Upon reaching the destination node, the | not be seen by the network. Upon reaching the destination node, the | |||
RPI has no further meaning and is just skipped; the presence of a | RPI has no further meaning and is just skipped; the presence of a | |||
second RPI will have no meaning to the end node as the packet has | second RPI will have no meaning to the end node as the packet has | |||
already been identified as being at its final destination. | already been identified as being at its final destination. | |||
For traffic leaving a RUL, if the RUL adds an opaque RPI, then the | For traffic leaving a RUL, if the RUL adds an uninitialized RPI | |||
6LR as a RPL Border Router SHOULD rewrite the RPI to indicate the | (e.g., with a value of zero), then the 6LR as a RPL Border Router | |||
selected Instance and set the flags. This is done in order to avoid | SHOULD rewrite the RPI to indicate the selected Instance and set the | |||
the following scenarios: 1) The leaf is an external router that | flags. This is done in order to avoid the following scenarios: 1) | |||
passes a packet that it did not generate and that carries an | The leaf is an external router that passes a packet that it did not | |||
unrelated RPI, and 2) The leaf is an attacker or presents | generate and that carries an unrelated RPI, and 2) The leaf is an | |||
misconfiguration and tries to inject traffic in a protected Instance. | attacker or presents misconfiguration and tries to inject traffic in | |||
Also, this applies to the case where the leaf is aware of the RPL | a protected Instance. Also, this applies to the case where the leaf | |||
Instance and passes a correct RPI; the 6LR needs a configuration that | is aware of the RPL Instance and passes a correct RPI; the 6LR needs | |||
allows that leaf to inject in that instance. | a configuration that allows that leaf to inject in that instance. | |||
The RH3 and RPIs could be abused by an attacker inside of the network | The RH3 and RPIs could be abused by an attacker inside of the network | |||
to route packets in nonobvious ways, perhaps eluding observation. | to route packets in nonobvious ways, perhaps eluding observation. | |||
This usage appears consistent with a normal operation of [RFC6997] | This usage appears consistent with a normal operation of [RFC6997] | |||
and cannot be restricted at all. This is a feature, not a bug. | and cannot be restricted at all. This is a feature, not a bug. | |||
[RFC7416] deals with many other threats to LLNs not directly related | [RFC7416] deals with many other threats to LLNs not directly related | |||
to the use of IPv6-in-IPv6 headers, and this document does not change | to the use of IPv6-in-IPv6 headers, and this document does not change | |||
that analysis. | that analysis. | |||
skipping to change at line 2527 ¶ | skipping to change at line 2529 ¶ | |||
LLN, IPv6-in-IPv6 can be used to hide inner routing headers, but by | LLN, IPv6-in-IPv6 can be used to hide inner routing headers, but by | |||
construction, the RH3 can typically only address nodes within the | construction, the RH3 can typically only address nodes within the | |||
LLN. That is, an RH3 with a CmprI less than 8 should be considered | LLN. That is, an RH3 with a CmprI less than 8 should be considered | |||
an attack (see Section 3 of [RFC6554]). | an attack (see Section 3 of [RFC6554]). | |||
Nodes outside of the LLN will need to pass IPv6-in-IPv6 traffic | Nodes outside of the LLN will need to pass IPv6-in-IPv6 traffic | |||
through the RPL root to perform this attack. To counter, the RPL | through the RPL root to perform this attack. To counter, the RPL | |||
root SHOULD either restrict ingress of IPv6-in-IPv6 packets (the | root SHOULD either restrict ingress of IPv6-in-IPv6 packets (the | |||
simpler solution), or it SHOULD walk the IP header extension chain | simpler solution), or it SHOULD walk the IP header extension chain | |||
until it can inspect the upper-layer payload as described in | until it can inspect the upper-layer payload as described in | |||
[RFC7045]. In particular, the RPL root SHOULD do [BCP38] processing | [RFC7045]. In particular, the RPL root SHOULD do network ingress | |||
on the source addresses of all IP headers that it examines in both | filtering [BCP38] on the source addresses of all IP headers that it | |||
directions. | examines in both directions. | |||
Note: there are some situations where a prefix will spread across | Note: there are some situations where a prefix will spread across | |||
multiple LLNs via mechanisms such as the one described in [RFC8929]. | multiple LLNs via mechanisms such as the one described in [RFC8929]. | |||
In this case, the BCP38 filtering needs to take this into account, | In this case, the network ingress filtering [BCP38] needs to take | |||
either by exchanging detailed routing information on each LLN or by | this into account, either by exchanging detailed routing information | |||
moving the BCP38 filtering further towards the Internet, so that the | on each LLN or by moving the network ingress filtering [BCP38] | |||
details of the multiple LLNs do not matter. | further towards the Internet, so that the details of the multiple | |||
LLNs do not matter. | ||||
13. References | 13. References | |||
13.1. Normative References | 13.1. Normative References | |||
[BCP38] Ferguson, P. and D. Senie, "Network Ingress Filtering: | [BCP38] Ferguson, P. and D. Senie, "Network Ingress Filtering: | |||
Defeating Denial of Service Attacks which employ IP Source | Defeating Denial of Service Attacks which employ IP Source | |||
Address Spoofing", BCP 38, RFC 2827, May 2000. | Address Spoofing", BCP 38, RFC 2827, May 2000. | |||
<https://rfc-editor.org/info/bcp38> | <https://rfc-editor.org/info/bcp38> | |||
skipping to change at line 2724 ¶ | skipping to change at line 2727 ¶ | |||
dtsecurity-zerotouch-join-04, 8 July 2019, | dtsecurity-zerotouch-join-04, 8 July 2019, | |||
<https://tools.ietf.org/html/draft-ietf-6tisch-dtsecurity- | <https://tools.ietf.org/html/draft-ietf-6tisch-dtsecurity- | |||
zerotouch-join-04>. | zerotouch-join-04>. | |||
Acknowledgments | Acknowledgments | |||
This work is done thanks to the grant given by the StandICT.eu | This work is done thanks to the grant given by the StandICT.eu | |||
project. | project. | |||
A special BIG thanks to C. M. Heard for the help with Section 4. | A special BIG thanks to C. M. Heard for the help with Section 4. | |||
Much of the redaction in that section is based on his comments. | Much of the editing in that section is based on his comments. | |||
Additionally, the authors would like to acknowledge the review, | Additionally, the authors would like to acknowledge the review, | |||
feedback, and comments of the following (in alphabetical order): | feedback, and comments of the following (in alphabetical order): | |||
Dominique Barthel, Robert Cragie, Ralph Droms, Simon Duquennoy, Cenk | Dominique Barthel, Robert Cragie, Ralph Droms, Simon Duquennoy, Cenk | |||
Guendogan, Rahul Jadhav, Benjamin Kaduk, Matthias Kovatsch, Gustavo | Guendogan, Rahul Jadhav, Benjamin Kaduk, Matthias Kovatsch, Gustavo | |||
Mercado, Subramanian Moonesamy, Marcela Orbiscay, Cristian Perez, | Mercado, Subramanian Moonesamy, Marcela Orbiscay, Cristian Perez, | |||
Charlie Perkins, Alvaro Retana, Peter van der Stok, Xavier | Charlie Perkins, Alvaro Retana, Peter van der Stok, Xavier | |||
Vilajosana, Éric Vyncke, and Thomas Watteyne. | Vilajosana, Éric Vyncke, and Thomas Watteyne. | |||
Authors' Addresses | Authors' Addresses | |||
End of changes. 45 change blocks. | ||||
206 lines changed or deleted | 209 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/ |