| 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 |