-
Notifications
You must be signed in to change notification settings - Fork 2k
Testing 6LoWPAN on Ethernet based devices
6LoWPAN was designed to enable IPv6 over IEEE 802.15.4 networks. There are RFCs and drafts in the work for other low power and/or lossy link-layers, but for testing purposes it makes sense to also enable 6LoWPAN traffic on established link-layers as Ethernet. For this purpose wireshark included a ZEP (Zigbee Encapsulation Protocol) dissector which encapsulates IEEE 802.15.4 packets in UDP packets:
. .
+-------------------+
| 6LoWPAN |
+-------------------+
| UDP |
+-------------------+
| IPv4/IPv6 |
+-------------------+
| L2 |
+-------------------+
$ cd examples/gnrc_networking
$ export USEMODULE="gnrc_zep gnrc_nomac"
$ export CFLAGS=-DGNRC_NETIF_NUMOF=2
$ make all term
zep_init <IPv6-over-Ethernet dst>
ping6 <IPv6-over-IEEE-802.15.4 dst>
To use ZEP with RIOT you need to include the gnrc_zep
module and increase the maximum number of interfaces GNRC_NETIF_NUMOF
. The following examples are based on the gnrc_networking example application on Board: native. Be aware that you need to creat one TAP device for each virtual node as described in Virtual riot network before you can run the terminal emulation.
$ cd examples/gnrc_networking
$ export USEMODULE="gnrc_zep gnrc_nomac"
$ export CFLAGS=-DGNRC_NETIF_NUMOF=2
$ make all term
Building application "gnrc_networking" for "native" with MCU "native".
[...]
text data bss dec hex filename
161685 576 140640 302901 49f35 /home/user/RIOT-OS/RIOT/examples/gnrc_networking/bin/native/gnrc_networking.elf
/home/user/RIOT-OS/RIOT/examples/gnrc_networking/bin/native/gnrc_networking.elf tap0
RIOT native uart0 initialized.
RIOT native interrupts/signals initialized.
LED_GREEN_OFF
LED_RED_ON
RIOT native board initialized.
RIOT native hardware initialization complete.
kernel_init(): This is RIOT! (Version: 2014.12-1863-g14144-zep/feat/initial)
kernel_init(): jumping into first task...
UART0 thread started.
uart0_init() [OK]
RIOT network stack example application
All up, running the shell now
Since the ZEP device needs an IPv6 destination to send the encapsulated IEEE 802.15.4 frames to, it can't be initialized automatically. So if you type ifconfig
you will just see your netdev2_tap
interface (we denote the TAP interface's name in front of the RIOT shell prompt here to distinguish between the different nodes)
tap0> ifconfig
ifconfig
Iface 8 HWaddr: 62:c7:30:0d:6a:2c
inet6 addr: ff02::1/128 scope: local [multicast]
inet6 addr: fe80::60c7:30ff:fe0d:6a2c/64 scope: local
inet6 addr: ff02::1:ff0d:6a2c/128 scope: local [multicast]
To initialize the ZEP interface you need to acquire the IPv6 address of the netdev2_tap
interface of the target node (fe80::6450:32ff:fed5:ce81
in our case):
$ PORT=tap1 make term
/home/user/RIOT-OS/RIOT/examples/gnrc_networking/bin/native/gnrc_networking.elf tap1
RIOT native uart0 initialized.
RIOT native interrupts/signals initialized.
LED_GREEN_OFF
LED_RED_ON
RIOT native board initialized.
RIOT native hardware initialization complete.
kernel_init(): This is RIOT! (Version: 2014.12-1863-g14144-zep/feat/initial)
kernel_init(): jumping into first task...
UART0 thread started.
uart0_init() [OK]
RIOT network stack example application
All up, running the shell now
tap1> ifconfig
ifconfig
Iface 8 HWaddr: 66:50:32:d5:ce:81
inet6 addr: ff02::1/128 scope: local [multicast]
inet6 addr: fe80::6450:32ff:fed5:ce81/64 scope: local
inet6 addr: ff02::1:ffd5:ce81/128 scope: local [multicast]
We can use this information to initialize ZEP on both interfaces:
tap0> zep_init fe80::6450:32ff:fed5:ce81
zep_init fe80::6450:32ff:fed5:ce81
tap0> ps
ps
pid | name | state Q | pri | stack ( used) | location
1 | idle | pending Q | 15 | 8192 ( 1100) | 0x80751a0
2 | main | running Q | 7 | 16384 ( 2932) | 0x80711a0
3 | uart0 | bl rx _ | 6 | 8192 ( 928) | 0x808f1c0
4 | pktdump | bl rx _ | 6 | 16384 ( 944) | 0x80844a0
5 | 6lo | bl rx _ | 3 | 8192 ( 944) | 0x80884c0
6 | ipv6 | bl rx _ | 4 | 8192 ( 1120) | 0x8082260
7 | udp | bl rx _ | 5 | 8192 ( 944) | 0x808a6e0
8 | tapnet | bl rx _ | 4 | 8192 ( 1392) | 0x8080240
9 | zep_app | bl rx _ | 2 | 8192 ( 976) | 0x8091660
10 | zep_l2 | bl rx _ | 4 | 8192 ( 960) | 0x808d120
| SUM | | | 98304 (12240)
tap0> ifconfig
ifconfig
Iface 8 HWaddr: 62:c7:30:0d:6a:2c
inet6 addr: ff02::1/128 scope: local [multicast]
inet6 addr: fe80::60c7:30ff:fe0d:6a2c/64 scope: local
inet6 addr: ff02::1:ff0d:6a2c/128 scope: local [multicast]
Iface 10 HWaddr: 70:6e Channel: 17 NID: 0x2300
Long HWaddr: 02:59:6a:45:00:59:70:37
6LO
Source address length: 2
inet6 addr: ff02::1/128 scope: local [multicast]
inet6 addr: fe80::ff:fe00:706e/64 scope: local
inet6 addr: ff02::1:ff00:706e/128 scope: local [multicast]
We see that 2 new threads are started: zep_app
and zep_l2
. zep_app
handles the application layer on top of UDP and provides a virtual network device, which zep_l2
wraps as an interface (Iface 10).
The same needs to be done on the other node:
tap1> zep_init fe80::60c7:30ff:fe0d:6a2c
zep_init fe80::60c7:30ff:fe0d:6a2c
tap1> ifconfig
ifconfig
Iface 8 HWaddr: 66:50:32:d5:ce:81
inet6 addr: ff02::1/128 scope: local [multicast]
inet6 addr: fe80::6450:32ff:fed5:ce81/64 scope: local
inet6 addr: ff02::1:ffd5:ce81/128 scope: local [multicast]
Iface 10 HWaddr: 85:c7 Channel: 17 NID: 0x2300
Long HWaddr: 02:59:6a:45:00:59:85:9e
6LO
Source address length: 2
inet6 addr: ff02::1/128 scope: local [multicast]
inet6 addr: fe80::ff:fe00:85c7/64 scope: local
inet6 addr: ff02::1:ff00:85c7/128 scope: local [multicast]
You should now be able to send packets via 6LoWPAN to the other node:
tap0> ping6 fe80::ff:fe00:85c7
ping6 fe80::ff:fe00:85c7
12 bytes from fe80::ff:fe00:85c7: id=83 seq=1 hop limit=64 time = 0.2795 ms
12 bytes from fe80::ff:fe00:85c7: id=83 seq=2 hop limit=64 time = 0.795 ms
12 bytes from fe80::ff:fe00:85c7: id=83 seq=3 hop limit=64 time = 0.755 ms
--- fe80::ff:fe00:85c7 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 0.034345 s
rtt min/avg/max = 0.755/0.1448/0.2795 ms
tap0> ncache
ncache
IPv6 address if L2 address state type
------------------------------------------------------------------------------
fe80::ff:fe00:85c7 10 85:c7 REACHABLE -
fe80::6450:32ff:fed5:ce81 8 66:50:32:d5:ce:81 REACHABLE -
tap1> ncache
ncache
IPv6 address if L2 address state type
------------------------------------------------------------------------------
fe80::60c7:30ff:fe0d:6a2c 8 62:c7:30:0d:6a:2c REACHABLE -
fe80::ff:fe00:706e 10 70:6e REACHABLE -