blob: d2951083bed94679b05e73cfdc5495d6eda47c25 [file] [log] [blame] [edit]
Experimental Bits
=================
This section is a work in progress. The ideas aren't fully formed yet and
certainly don't reflect any approved direction for Thread.
`NetworkName` and UTF-8
-----------------------
At its core, `NetworkName` is treated as an opaque 128-bit identifier.
This is at odds with it being treated as a UTF-8 string. Without
certain precautions being taken, various types of attacks are
possible. See [STRINGPREP][RFC3454] for more details. As such, this
document defines specific transforms to use when transforming a
string into a `NetworkName` and vise-versa:
Converting a string into a `NetworkName`:
1. Apply STRINGPREP parts B, C, and D.
2. Unescape any characters in the string.
3. Check the length of the resulting string and reject if the
resulting string is longer than 16 bytes.
4. Zero-fill the string to 16 bytes in length.
Converting a `NetworkName` to a string:
1. Convert the `NetworkName` to a string using the following steps:
a. Treat the string as zero terminated, appending a zero if necessary.
b. Escape control characters up to the first zero.
2. Test for canonicity by converting the string back to a 16-byte
`NetworkName` using the procedure outlined above. If the test
passes, return the string.
3. If the string failed the test, convert the `NetworkName` to a
canonical string using the following steps:
a. Remove all tailing zeros from the `NetworkName`.
b. Escape all non-printable ASCII control characters, including zero.
Character escaping uses the simple URL "percent" escaping.
It is not expected that constrained implementations will perform
these conversions. If a constrained implementation must convert a
network name to a human-readable string, it may always assume that
the canonicity tests fails and fall back to an ASCII string with
escaped characters.
Insecure MAC mode
-----------------
If `NetworkXPANID` is set to the 8-byte non-zero-terminated ASCII string
`"insecure"`, then the `ThreadAdminPassword` is assumed to be a zero-length
string. In this mode:
* Any device may join the network, much like an unsecured WiFi network.
* MAC layer security is to operate only in message authentication mode,
meaning the contents of the packets will not be encrypted.
* Nodes will not respond to administrative requests to change thread
network parameters like the network name.
This mode is primarily useful as a debugging tool. It may be wise to disable
support for such a mode in release builds.
Routing Protocol
----------------
Thread uses RPL for intra-mesh routing. There is always at least
one DODAG, which is the mesh-local DODAG.
NOTE: The DODAG root is unrelated to the `ThreadLeader`.
The mesh-local DODAG uses the prefix `FE40::/10`(Prefix suggestion.
Actual prefix may be different). This prefix MUST NOT be routed
outside of the logical mesh. Routes to other networks may be
advertised using DIO messages or by establishing another RPL instance.
Thread router nodes must support at least two RPL instances. Doing
this will make intra-mesh communications much more robust in the
face of possibly dynamic IPv6 prefixes.
Again, `FE40::/64` is not routable outside of the mesh! It is used
only within the mesh, much like `FE80::/10` is not routable and
only used for link-local communications. The multicast prefix for
mesh-local hosts is `FF03::1`.
## Mesh-local DODAG Root selection ##
TBD
### Mesh-local DODAG Root failure scenario ##
TBD
## RPL Settings ##
* MOP: 0x3
* DODAGPreference: 0