.. | ||
main.c | ||
Makefile | ||
Makefile.ci | ||
README.md | ||
setup_taps.sh | ||
tapology.txt |
Auto-configuration for nested subnets on a tree topology
This example demonstrates IPv6 subnet auto-configuration for networks on a tree topology.
This allows to connect multiple links with individual subnets and route between them. Each link can have an arbitrary number of hosts and routers. Routers can have multiple interfaces to connect different downlinks.
If you can ensure there is only a single router on each link, you can
skip the coordination protocol and save some resources by enabling
the gnrc_ipv6_auto_subnets_simple
module.
Routers can still have multiple downstream interfaces but there can be only a single router in each subnet.
Setup on native
To simulate such a network on native
a setup_taps.sh
script is provided that
will create TAP interfaces and bridges.
Each bridge will be it's own subnet and native
instances will act as routers
to route between them.
The setup script will also start radvd
to advertise a large prefix that allows
for sub-division by RIOT.
The interfaces that should be created are specified in the tapology.txt
file.
Each router will have (at least) two interfaces that should be on different bridges.
To start the first router, run
make term PORT="tap_a0 tap_b1"
This will route between the tap_a0
interface on br0
and the tap_b1
interface on br1
.
Start more native
instances to simulate a cascading tree network:
make term PORT="tap_b0 tap_c1"
make term PORT="tap_c0 tap_d1"
…
It is also possible to connect non-routing leaf nodes with a single interface:
make flash term LEAF=1 PORT=tap_b2
Setup on hardware
On physical hardware the setup will be the same.
Routing nodes need at least two interfaces between which they can route.
For a simple setup, you can use ethos
or slipdev
to turn any UART into
a network interface. (If you need to use DHCPv6 IA_PD for obtaining a prefix,
use slipdev_l2addr
instead of plain slipdev
)
Obtaining the prefix
Via router advertisements
Usually routers are configured to advertise a /64 prefix that can not be divided further when using SLAAC. If you can configure your router to advertise a larger prefix instead, this will be the easiest solution.
Via DHCPv6
If you can't change the configuration of your router, but your router supports DHCPv6 IA_PD, you can use this to request a larger prefix.
This requires a gateway node that uses the gnrc_dhcpv6_client_simple_pd
module instead of gnrc_ipv6_auto_subnets
.
Make sure to set the CONFIG_GNRC_DHCPV6_CLIENT_6LBR_UPSTREAM
option to the
ID of the upstream interface on the gateway device, e.g.
CFLAGS += -DCONFIG_GNRC_DHCPV6_CLIENT_6LBR_UPSTREAM=6
As with GNRC the interface ID is based on the PID of the interface thread, this can change if you add modules / threads and is a common source of errors. If the configuration is set wrong, you will not get a prefix for the downstream interface(s).