Routeur de bordure Thread : multidiffusion IPv6

1. Introduction

608c4c35050eb280.png

Qu'est-ce que Thread ?

Thread est un protocole de réseau maillé sans fil basse consommation basé sur IP qui permet de communiquer de manière sécurisée entre les appareils et le cloud. Les réseaux Thread peuvent s'adapter aux modifications de la topologie pour éviter les défaillances ponctuelles.

Qu'est-ce qu'OpenThread ?

OpenThread, publié par Google, est une implémentation Open Source de Thread®.

Qu'est-ce qu'un routeur de bordure OpenThread ?

Le routeur de bordure OpenThread (OTBR) publié par Google est une implémentation Open Source du routeur de bordure Thread.

Multicast IPv6

Thread définit une série de fonctionnalités pour prendre en charge la diffusion multicast sur un réseau hétérogène (segments de réseau Thread et Wi-Fi/Ethernet) pour les adresses de diffusion multicast dont la portée est plus grande que celle du domaine local.

Un routeur de bordure Thread enregistre son ensemble de données de routeur de backbone (BBR), et le service BBR sélectionné est le routeur de backbone principal (PBBR), qui est responsable de la transmission entrante/sortante multicast.

Un appareil Thread envoie un message CoAP pour enregistrer l'adresse de multidiffusion auprès du PBBR (Multicast Listener Registration, MLR) si l'adresse est plus grande que l'adresse locale du domaine. Le PBBR utilise MLDv2 sur son interface externe pour communiquer avec le LAN/WAN IPv6 plus large sur les groupes multicast IPv6 qu'il doit écouter au nom de son réseau Thread local. De plus, le PBBR ne transfère le trafic multicast vers le réseau Thread que si au moins un appareil Thread est abonné à la destination.

Les appareils finaux Thread minimals peuvent dépendre de leur parent pour agréger l'adresse multicast et effectuer la MLR en leur nom, ou s'enregistrer eux-mêmes si leur parent est de la version Thread 1.1.

Pour en savoir plus, consultez la spécification Thread.

Objectif de cet atelier

Dans cet atelier de programmation, vous allez configurer un routeur de bordure Thread et deux appareils Thread, puis activer et vérifier les fonctionnalités Multicast sur les appareils Thread et les appareils Wi-Fi.

Points abordés

  • Créer un micrologiciel nRF52840 compatible avec le multicast IPv6
  • S'abonner aux adresses de multidiffusion IPv6 sur les appareils Thread

Ce dont vous aurez besoin

  • Un poste de travail Linux, pour créer et flasher un RCP Thread, la CLI OpenThread et tester le multicast IPv6.
  • Un Raspberry Pi pour le routeur de bordure Thread.
  • Deux dongles USB nRF52840 Nordic Semiconductor (un pour le RCP et deux pour les appareils finaux Thread)

2. Configurer OTBR

Le moyen le plus rapide de configurer un OTBR est de suivre le guide de configuration de l'OTBR.

Une fois la configuration de l'OTBR terminée, utilisez ot-ctl pour vérifier que l'OTBR est devenu le routeur de backbone principal en quelques secondes.

> bbr state
Primary
Done
> bbr
BBR Primary:
server16: 0xF800
seqno:    21
delay:    5 secs
timeout:  3600 secs
Done

3. Compiler et flasher des appareils Thread

Créez l'application Thread CLI avec le multicast et flashez les deux cartes DK nRF52840.

Créer le micrologiciel du DK nRF52840

Suivez les instructions pour cloner le projet et créer le micrologiciel nRF52840.

$ cd ~/src/ot-nrf528xx
$ rm -rf build
$ script/build nrf52840 USB_trans -DOT_MLR=ON

Suivez l'atelier de programmation Créer un réseau Thread avec des cartes nRF52840 et OpenThread tel que décrit. Une fois l'image de la CLI flashée sur l'appareil final, suivez la procédure Joindre le deuxième nœud au réseau Thread pour ajouter l'appareil Thread au réseau Thread. Répétez l'opération pour le deuxième appareil final Thread.

4. S'abonner à l'adresse multicast IPv6

S'abonner à ff05::abcd sur l'appareil final nRF52840 1:

> ipmaddr add ff05::abcd
Done

Vérifiez que ff05::abcd est bien abonné:

> ipmaddr
ff05:0:0:0:0:0:0:abcd            <--- ff05::abcd subscribed
ff33:40:fdde:ad00:beef:0:0:1
ff32:40:fdde:ad00:beef:0:0:1
ff02:0:0:0:0:0:0:2
ff03:0:0:0:0:0:0:2
ff02:0:0:0:0:0:0:1
ff03:0:0:0:0:0:0:1
ff03:0:0:0:0:0:0:fc
Done

S'abonner à ff05::abcd sur l'ordinateur portable:

Nous avons besoin d'un script Python subscribe6.py pour nous abonner à une adresse multicast sur l'ordinateur portable.

Copiez le code ci-dessous et enregistrez-le sous le nom subscribe6.py:

import ctypes
import ctypes.util
import socket
import struct
import sys

libc = ctypes.CDLL(ctypes.util.find_library('c'))
ifname, group = sys.argv[1:]
addrinfo = socket.getaddrinfo(group, None)[0]
assert addrinfo[0] == socket.AF_INET6
s = socket.socket(addrinfo[0], socket.SOCK_DGRAM)
group_bin = socket.inet_pton(addrinfo[0], addrinfo[4][0])
interface_index = libc.if_nametoindex(ifname.encode('ascii'))
mreq = group_bin + struct.pack('@I', interface_index)
s.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq)
print("Subscribed %s on interface %s." % (group, ifname))
input('Press ENTER to quit.')

Exécutez subscribe6.py pour abonner ff05::abcd à l'interface réseau Wi-Fi (par exemple, wlan0):

$ sudo python3 subscribe6.py wlan0 ff05::abcd
Subscribed ff05::abcd on interface wlan0.
Press ENTER to quit.

La topologie de réseau finale avec les abonnements multicast est illustrée ci-dessous:

b118448c98b2d583.png

Maintenant que nous avons souscrit l'adresse multicast IPv6 à la fois sur l'appareil final nRF52840 1 sur le réseau Thread et sur l'ordinateur portable sur le réseau Wi-Fi, nous allons vérifier la connectivité bidirectionnelle du multicast IPv6 dans les sections suivantes.

5. Vérifier la multidiffusion IPv6 entrante

Nous devrions maintenant pouvoir atteindre à la fois l'appareil final nRF52840 1 sur le réseau Thread et l'ordinateur portable à l'aide de l'adresse multicast IPv6 ff05::abcd du réseau Wi-Fi.

Ping ff05::abcd sur l'OTBR via l'interface Wi-Fi:

$ ping -6 -b -t 5 -I wlan0 ff05::abcd
PING ff05::abcd(ff05::abcd) from 2401:fa00:41:801:83c1:a67:ae22:5346 wlan0: 56 data bytes
64 bytes from fdb5:8d36:6af9:7669:e43b:8e1b:6f2a:b8fa: icmp_seq=1 ttl=64 time=57.4 ms
64 bytes from 2401:fa00:41:801:8c09:1765:4ba8:48e8: icmp_seq=1 ttl=64 time=84.9 ms (DUP!)
64 bytes from fdb5:8d36:6af9:7669:e43b:8e1b:6f2a:b8fa: icmp_seq=2 ttl=64 time=54.8 ms
64 bytes from 2401:fa00:41:801:8c09:1765:4ba8:48e8: icmp_seq=2 ttl=64 time=319 ms (DUP!)
64 bytes from fdb5:8d36:6af9:7669:e43b:8e1b:6f2a:b8fa: icmp_seq=3 ttl=64 time=57.5 ms
64 bytes from 2401:fa00:41:801:8c09:1765:4ba8:48e8: icmp_seq=3 ttl=64 time=239 ms (DUP!)

# If using MacOS, use this command. The interface is typically not "wlan0" for Mac.
$ ping6 -h 5 -I wlan0 ff05::abcd

Nous pouvons voir que l'OTBR peut recevoir deux réponses ping de l'appareil final nRF52840 1 et de l'ordinateur portable, car ils sont tous deux abonnés à ff05::abcd. Cela montre que l'OTBR peut transférer les paquets multicast de requête Ping IPv6 du réseau Wi-Fi vers le réseau Thread.

6. Vérifier le Multicast IPv6 sortant

Ping ff05::abcd sur l'appareil final nRF52840 2:

> ping ff05::abcd 100 10 1
108 bytes from fdb5:8d36:6af9:7669:e43b:8e1b:6f2a:b8fa: icmp_seq=12 hlim=64 time=297ms
108 bytes from 2401:fa00:41:801:64cb:6305:7c3a:d704: icmp_seq=12 hlim=63 time=432ms
108 bytes from fdb5:8d36:6af9:7669:e43b:8e1b:6f2a:b8fa: icmp_seq=13 hlim=64 time=193ms
108 bytes from 2401:fa00:41:801:64cb:6305:7c3a:d704: icmp_seq=13 hlim=63 time=306ms
108 bytes from fdb5:8d36:6af9:7669:e43b:8e1b:6f2a:b8fa: icmp_seq=14 hlim=64 time=230ms
108 bytes from 2401:fa00:41:801:64cb:6305:7c3a:d704: icmp_seq=14 hlim=63 time=279ms

L'appareil final nRF52840 2 peut recevoir des réponses ping à la fois de l'appareil final nRF52840 1 et de l'ordinateur portable. Cela montre que l'OTBR peut transférer les paquets de multidiffusion de réponse Ping IPv6 du réseau Thread vers le réseau Wi-Fi.

7. Félicitations

Félicitations, vous avez correctement configuré un routeur de bordure Thread et vérifié le multicast IPv6 bidirectionnel.

Pour en savoir plus sur OpenThread, consultez openthread.io.

Documents de référence: