Multihop Network

Hi all!

I am quite new in this brave new world of IOT. Sorry if the question then is maybe trivial.

I am looking for a solution for sending a packet from a node to an other through an other node using a wireless radio connection. For this I’am using iot-lab platform (, working strictly with M3 cortex based nodes.

These nodes of course will not be in direct range, and that is why i need a multihop network.

Then my question is how to build up a network in between different IOT nodes and finally being able to send packets.

I already tried searching in google and in the documentation, and the best link I arrived is the following :

from the following conversation:

I understand that desvirt creates a virtual network for me, but i cannot arrive to understand how to deploy that into a real set of nodes, since it looks more as a simulation than to a real deployment.

If any one can give me a better clue about how to solve this problem it would be great.

Thank you very much!


Hi Santiago, desvirt is solely meant to provide virtual networks for the native platform (which allows you to run RIOT as a process on a Linux or OSX machine). For the IoT-Lab testbed you need a routing protocol or static routes to be able to use multihop networking. The gnrc_networking example (you can find it in the examples/ directory) provides the RPL routing protocol already for you, which can be configured using the rpl command. For static routes you need at least the fib module, which allows you to configure the routes with the fibroute command.

Hope this was helpful, Martine

Hey Santiago,

I am quite new in this brave new world of IOT. Sorry if the question then is maybe trivial.

All questions regarding IoT and RIOT are welcome on this mailing list (:

You are right, desvirt is suitable for creating virtualized networks and is a great tool to test your application in a controlled environment. If you want to deploy your app on real hardware though, desvirt will not help you here.

If you want to communicate over multiple hops, then you need to configure routes so that your nodes know in which direction incoming traffic must flow. These routes can be configured either statically by using the fibroute command from within the RIOT shell, or by using a routing protocol that configures the routes dynamically.

Let’s try both ways:

Pre: You can start an experiment from the IoT-Lab website or directly from the command line via a Makefile that we provide in RIOTBASE/dist/testbed-support/Makefile.iotlab. From within the gnrc_networking example folder in RIOT you can call:

IOTLAB_USER=user_name IOTLAB_PHY_NODES=1-10 IOTLAB_EXP_NAME=multihop_test IOTLAB_DURATION=30 BOARD=iotlab-m3 make iotlab-exp -I ../../dist/testbed-support

user_name must be replaced by your login account for the IoT-Lab Testbed. With IOTLAB_PHY_NODES you can specify the nodes you want to use for your experiment. You can also choose single nodes that are further apart like this: IOTLAB_PHY_NODES=1-3+7-10+15 IOTLAB_DURATION=30 <-- this is the duration of the experiment in minutes

Assuming the experiment started successfully, you can then communicate with the nodes directly from the command line like this: IOTLAB_USER=user_name BOARD=iotlab-m3 make iotlab-term -I ../../dist/testbed-support

This command may prompt you for a password if your SSH key that you uploaded to the IoT-Lab testbed for SSH usage is password protected.

Once you are connected, the serial aggregator of the iot-lab testbed will be started and you have a console from where you can control every node.

For the following I assume you have an experiment with nodes 1 + 5 + 10 and the gnrc_networking example flashed on every node.

Static routing:

  1. configure a global IPv6 address for every node like this: m3-1;ifconfig 7 add dead:beef::1 (or any other ipv6 address you desire) m3-5;ifconfig 7 add dead:beef::5 m3-10;ifconfig 7 add dead:beef::10
  2. configure static routes: m3-1;fibroute add dead:beef::5 via fe80::x_5 m3-1;fibroute add dead:beef::10 via fe80::x_5 m3-5;fibroute add :: via fe80::x_1 m3-5;fibroute add dead:beef::10 via fe80::x_10 m3-10;fibroute add :: via fe80::x_5

you have to look up the link local addresses (fe80::x_1,5,10) via the m3-x;ifconfig command. Now you can start e.g. a udp server on all nodes with this single command udp start server 8888.

To communicate e.g. from node m1 over node m5 to node m10 you can then do: m3-1;udp send dead:beef::10 8888 hello. Et voilà, multi hop communication with static routes.

To save most of the preconfiguration needed for multi-hop communication, you can use a routing protocol. Currently, you can only use RPL, but we also have an AODVV2 implementation, which is mostly done porting to the new network stack (AFAIK, correct me if I’m wrong).

Starting from a running experiment with the same preconditions as above (just execute reboot to bring the nodes back to the initial state):

  1. configure a global IPv6 address for the root node of RPL m3-1;ifconfig 7 add dead:beef::1
  2. initialize RPL on interface 7 for all nodes rpl init 7
  3. start a RPL DODAG with m3-1 as root node and an instance id of 1 m3-1;rpl root 1 dead:beef::1

Within a couple of seconds, all nodes should have correctly configured routes and you should be able to ping or send udp packets from one node to any other node that participates in the RPL dodag. You can check the RPL state of a node by issueing the rpl command, e.g. m3-1;rpl.

Let me know if you have further questions (:

Best, Cenk

Sweet! Thanks very much for the valuable information! I will start to work with that!


Thank you very much Martine!! Santiago

Hi Cenk,

Thanks a lot for your information, it’s very helpful.

I tried to follow the process using rpl for routing and udp to send messages but I don’t manage to send messages via multihop. I can send a message to the udp server with single hop but as soon as multihop is necessary to reach the udp server, the message is not received. When I check the rpl dodag, everything is fine, nodes have the right parent in the parent list… Do you have any idea what’s could be wrong ?

Thanks for your help !

Caroline QUEVA Research Engineer at CEA-LIST DRT/LIST/DACLE/LIALP Laboratoire Infrastructures et Ateliers pour le Logiciel sur Puces

Commissariat à l’énergie atomique et aux énergies alternatives MINATEC Campus | 17 rue des Martyrs | 38054 Grenoble Cedex 9

Hey Caroline,

Thanks a lot for your information, it’s very helpful.

You’re welcome! I am happy to help.

There was a bug in the RPL implementation some days ago that resulted in wrong entries in the FIB table. However, this should be fixed in the current master branch of RIOT. In case you haven’t tried it already: could you rebase/update your branch?

If this doesn’t fix the multi-hop communication problem, then I would be interested in the output of your fib table. You can dump the fib entries by issueing the command fibroutes in your RIOT shell. (To reduce noise on the mailing list, you can send the dump directly to me)

Let me know if you have further questions/feedback.

Best, Cenk

Hello Caroline,

I hope you don’t mind that I put this particular email back on the mailing list, because this might be of interest to others, too.

While it is possible to do some extra tinkering on the gnrc_networking example in order to receive the udp payload in the application’s thread, I rather would suggest to look into the posix sockets that are now merged into master. An example usage can be found here [1].

You have to adjust the Makefile of the example in [1] the following way:

  • replace gnrc_ipv6_default with gnrc_ipv6_router_default
  • add a new line USEMODULE += gnrc_rpl

This should suffice to get rpl into this new example. (Martine, correct me if I am wrong).

Best, Cenk


Hello Caroline,


Hey Cenk, Martine and everyone,

Thanks all for your help,

I tried to follow Cenk’s advice and use posix sockets to create communication between my nodes. I managed to print the results received by the server as expected, this is nice. :slight_smile: But I still have a bug. I send a message to the udp server (root node of my DODAG) every 0.1 second, but only the 28 first messages are received, after that no more message is received. Do you know why ?

Martine, thanks for your help, I didn’t try to use ‘conn’ for the moment because I was looking for a stable API.


Caroline QUEVA Research Engineer at CEA-LIST DRT/LIST/DACLE/LIALP Laboratoire Infrastructures et Ateliers pour le Logiciel sur Puces

Commissariat à l’énergie atomique et aux énergies alternatives MINATEC Campus | 17 rue des Martyrs | 38054 Grenoble Cedex 9