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 des communications sécurisées entre appareils et entre appareils et le cloud. Les réseaux Thread peuvent s'adapter aux changements de topologie pour éviter les points de défaillance uniques.

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 le multicast sur un réseau hétérogène (segments de réseau Thread et Wi-Fi/Ethernet) pour les adresses multicast dont la portée est supérieure à celle du domaine local.

Un routeur de bordure Thread enregistre son ensemble de données de routeur de backbone (BBR). Le service BBR sélectionné est le routeur de backbone principal (PBBR), qui est responsable du transfert multicast entrant/sortant.

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

Pour les appareils finaux minimaux Thread, ils peuvent dépendre de leur parent pour agréger l'adresse multicast et effectuer le MLR en leur nom, ou s'enregistrer eux-mêmes si leur parent est de Thread 1.1.

Pour en savoir plus, veuillez consulter la spécification Thread.

Ce que vous allez faire

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

  • Comment créer un micrologiciel nRF52840 compatible avec le multicast IPv6.
  • Découvrez comment vous abonner à des adresses de multidiffusion IPv6 sur les appareils Thread.

Prérequis

  • 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.
  • 2 dongles USB Nordic Semiconductor nRF52840 (un pour le RCP et deux pour les appareils finaux Thread).

2. Configurer OTBR

Le moyen le plus rapide de configurer un OTBR consiste à suivre le guide de configuration OTBR.

Une fois la configuration OTBR terminée, utilisez ot-ctl pour vérifier que l'OTBR est devenu le routeur principal du réseau fédérateur 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 Multicast et flashez les deux cartes nRF52840 DK.

Compiler le micrologiciel nRF52840 DK

Suivez les instructions pour cloner le projet et compiler 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 qu'il est écrit. Une fois l'appareil final flashé avec l'image CLI, suivez Rejoindre 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

Abonnez-vous à ff05::abcd sur l'appareil final nRF52840 1 :

> ipmaddr add ff05::abcd
Done

Vérifiez que l'abonnement à ff05::abcd a bien été souscrit :

> 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 s'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 souscrire ff05::abcd sur 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 sur l'appareil final nRF52840 1 dans le réseau Thread et sur l'ordinateur portable dans le réseau Wi-Fi, nous allons vérifier l'accessibilité multicast IPv6 bidirectionnelle dans les sections suivantes.

5. Vérifier la multidiffusion IPv6 entrante

Nous devrions maintenant pouvoir accéder à l'appareil final nRF52840 1 dans le réseau Thread et à l'ordinateur portable à l'aide de l'adresse multicast IPv6 ff05::abcd depuis le réseau Wi-Fi.

Pinguez ff05::abcd sur 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 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 :