RPL border router
See tutorial:cooja-border-router instead if you want connect to a network of nodes simulated in Cooja.
This tutorial assumes you have already run tutorials:rpl. We will now set up a node as border router, acting not only as DAG root but also as Internet access point for all nodes in the network.
First, program one or several nodes with hello-world
(which has RPL enabled). Then, go to examples/rpl-border-router
, compile and upload the example to the node you want to use as border router. The Makefile in this examples includes a number of targets that help setting up the border router on the host (e.g. linux) side.
The connection with the border router is achieved using a tool called tunslip6
. In this tutorial, we will use the make target connect-router
. This make target will invoke tunslip6
using some default parameters, including a default serial port name (/dev/ttyUSB0
). If your device has enumerated using a different serial port name (which will almost certainly be the case on Mac OS), you will have to call tunslip6
manually and provide the correct serial port name using the -s
argument. For example, you may need to run:
sudo ../../tools/serial-io/tunslip6 -s /dev/tty.usbmodemL1001111 fd00::1/64
Using the connect-router
target:
$ make TARGET=zoul connect-router
sudo ../../tools/serial-io/tunslip6 fd00::1/64
********SLIP started on ``/dev/ttyUSB0''
opened tun device ``/dev/tun0''
ifconfig tun0 inet `hostname` mtu 1500 up
ifconfig tun0 add fd00::1/64
ifconfig tun0 add fe80::0:0:0:1/64
ifconfig tun0
tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:127.0.1.1 P-t-P:127.0.1.1 Mask:255.255.255.255
inet6 addr: fd00::1/64 Scope:Global
inet6 addr: fe80::1/64 Scope:Link
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:500
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
[INFO: BR ] Waiting for prefix
*** Address:fd00::1 => fd00:0000:0000:0000
[INFO: BR ] Waiting for prefix
[INFO: BR ] Server IPv6 addresses:
[INFO: BR ] fd00::212:4b00:616:fcc
[INFO: BR ] fe80::212:4b00:616:fcc
This runs the program tools/serial-io/tunslip6
, which bridges the Contiki-NG border router to the host (here, Linux) via a tun interface (here, tun0
). The default prefix is fd00::1/64
(can be configured via the make PREFIX
variable). Your host is assigned address fd00::1
. The RPL border router, running on the node, has an auto-configured address which you can find out from the above logs. Let’s try and ping it:
$ ping6 fd00::212:4b00:616:fcc
PING fd00::212:4b00:616:fcc(fd00::212:4b00:616:fcc) 56 data bytes
64 bytes from fd00::212:4b00:616:fcc: icmp_seq=1 ttl=64 time=154 ms
64 bytes from fd00::212:4b00:616:fcc: icmp_seq=2 ttl=64 time=25.7 ms
To access nodes inside the RPL network, we first need to find out their global IPv6 address. To help with this, the RPL border router runs an HTTP server – request the index page with:
$ wget -6 "http://[fd00::212:4b00:616:fcc]/"
--2017-10-12 10:04:55-- http://[fd00::212:4b00:616:fcc]/
Connecting to [fd00::212:4b00:616:fcc]:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: ‘index.html’
[ <=> ] 121 --.-K/s in 0.09s
2017-10-12 10:04:56 (1.34 KB/s) - ‘index.html’ saved [121]
The page contains a list of routes (in storing mode) or links (in non-storing mode), indicating the addresses of all nodes in the network (if no node shows up, give the network some extra seconds and request the HTTP server again):
$ cat index.html
<html><head><title>ContikiRPL</title></head><body>
Neighbors<pre>fe80::212:4b00:616:fc4
</pre>Routes<pre>
</pre>Links<pre>
fd00::212:4b00:616:fc4 (parent: fd00::212:4b00:616:fcc) 1800s
</pre></body></html>
You should now be able to ping any node in the network, e.g.:
$ ping6 fd00::212:4b00:616:fc4
PING fd00::212:4b00:616:fc4(fd00::212:4b00:616:fc4) 56 data bytes
64 bytes from fd00::212:4b00:616:fc4: icmp_seq=1 ttl=63 time=142 ms
64 bytes from fd00::212:4b00:616:fc4: icmp_seq=2 ttl=63 time=38.7 ms
Native Border Router
In the example above, we used the so-called “embedded border router”.
This means the border router (BR) runs on the constrained device, and the host computer runs tunslip6
.
Alternatively, it is possible to run the BR directly on the host computer, and have the constrained device just act as a radio dongle.
To do this, follow these two steps:
Program your node with
slip-radio
instead ofrpl-border-router
.On the host computer, go to
examples/rpl-border-router
Build the example for the native platform
make TARGET=native
Run
sudo ./border-router.native fd00::1/64
. If the USB serial port is not found, specify it via option-s
.
This approach has the advantage of running the BR on an unconstrained device.
The main downside, however, is that it separates the low layers (radio and MAC) from the rest of the stack (NET and up).
In networks with TSCH, this is a problem as we do not have yet a way to communicate schedules to the slip-radio
over the serial interface.
Currently only usable with CSMA or TSCH with 6TiSCH minimal schedule.
Custom Border Router
Note that you do not have to use the rpl-border-router
example to build a border router.
In Contiki-NG, you can simply turn any project into a border router by adding to your Makefile the following module (and as always, make distclean
):
MODULES += os/services/rpl-border-router
Projects with this module can be compiled to either a native border router (use TARGET=native
) or an embedded border router (any other target).
If you take a closer look to examples/rpl-border-router
, it basically uses the border router module, with a Web server on top for servicing the list of routes over HTTP.