contiki-os/contiki — pull request #454 by adamdunkels (2013-11-22 13:20:42+00:00)
Title: RPL feather mode

This pull request introduces a way to dynamically change RPL modes at runtime and introduces a new RPL mode called feather.

Background: RPL has two ways to send data, either up the tree or down the tree. To send data up the tree, nodes need to keep track of one parent each. To send data down the tree, all nodes need to keep track of all nodes below them. Parent routes are built with DIO messages. Child routes are built with DAO messages. Upward routing has great scaling properties since the number of upward routes is constant with network size. Downward routing does not scale as well because the number of routes each node needs to have room for increases linearly with network size. Contiki supports both upward and downward routing.

By default, Contiki nodes are always downward-routable because they send DAO messages to announce their routes. And by default, Contiki nodes are always potential parents for upward routing because they send DIO messages to announce their routing availability. There is a way to, at compile time, turn on leaf mode, which makes nodes unavailable as parents in the mesh.

This patch adds a mechanism for setting RPL mode at run-time and adds a new mode in addition to the mesh and leaf modes: feather mode. A node in feather mode routes packets on behalf of other nodes but does not advertise their own route via DAO messages. Feather nodes can send data to other nodes inside or outside of the network and they can receive multicast messages and unicast messages from immediate neighbors, but they cannot be reached through the mesh.

Feather nodes are very lightweight as they require no routing table space in the network. A network can contain any number of feather nodes without using precious routing table space.

The name *feather* was chosen because of their light weight. Think of a network of feather nodes as a gathering of bird feathers, freely flying around in the breeze.

This patch provides a way to set the RPL mode at runtime, but does not yet allow leaf mode to be set. This will be added as we move forward.

This pull request also adds a few minor improvements that were added as part of the RPL mode switch code and includes mechanisms for sending and cancelling DAO transmissions that are needed when switching to and from feather mode.