Router di confine Thread - Multicast IPv6

1. Introduzione

608c4c35050eb280.png

Che cos'è Thread?

Thread è un protocollo di rete mesh wireless a basso consumo basato su IP che consente comunicazioni sicure tra dispositivi e tra dispositivi e cloud. Le reti Thread possono adattarsi alle modifiche della topologia per evitare errori singoli.

Che cos'è OpenThread?

OpenThread rilasciato da Google è un'implementazione open source di Thread®.

Che cos'è un router di confine OpenThread?

Il router di confine OpenThread (OTBR) rilasciato da Google è un'implementazione open source del router di confine Thread.

Multicast IPv6

Thread definisce una serie di funzionalità per supportare il multicast su una rete eterogenea (segmenti di rete Thread e Wi-Fi/Ethernet) per gli indirizzi multicast con un ambito più ampio del dominio locale.

Un router di confine Thread registra il proprio set di dati del router di dorsale (BBR) e il servizio BBR selezionato è il router di dorsale principale (PBBR), responsabile dell'inoltro in entrata/in uscita del multicast.

Un dispositivo Thread invia un messaggio CoAP per registrare l'indirizzo multicast nella PBBR (Multicast Listener Registration, in breve MLR) se l'indirizzo è più grande del realm locale. Il PBBR utilizza MLDv2 sulla sua interfaccia esterna per comunicare alla LAN/WAN IPv6 più grande i gruppi multicast IPv6 che deve ascoltare per conto della sua rete Thread locale. Inoltre, il PBBR inoltra il traffico multicast alla rete Thread solo se la destinazione è sottoscritta da almeno un dispositivo Thread.

Per i dispositivi di endpoint Thread minimal, possono dipendere dal dispositivo principale per aggregare l'indirizzo multicast ed eseguire l'MLR per loro conto oppure registrarsi se il dispositivo principale è Thread 1.1.

Per ulteriori dettagli, consulta la specifica Thread.

Cosa creerai

In questo codelab, configurerai un router di confine Thread e due dispositivi Thread, quindi attiverai e verificherai le funzionalità di multicast sui dispositivi Thread e Wi-Fi.

Cosa imparerai

  • Come compilare il firmware nRF52840 con il supporto di IPv6 Multicast.
  • Come iscriversi agli indirizzi multicast IPv6 sui dispositivi Thread.

Occorrente

  • Una workstation Linux per compilare e eseguire il flashing di un RCP Thread, l'interfaccia a riga di comando OpenThread e testare il multicast IPv6.
  • Un Raspberry Pi per il router di confine Thread.
  • 2 dongle USB Nordic Semiconductor nRF52840 (uno per il RCP e due per i dispositivi di endpoint Thread).

2. Configura OTBR

Il modo più rapido per configurare un OTBR è seguire la guida alla configurazione degli OTBR.

Al termine della configurazione dell'OTBR, utilizza ot-ctl per verificare che l'OTBR sia diventato il router backbone principale entro pochi secondi.

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

3. Creare e eseguire il flashing dei dispositivi Thread

Crea l'applicazione Thread CLI con Multicast e esegui il flashing delle due schede DK nRF52840.

Compilare il firmware del DK nRF52840

Segui le istruzioni per clonare il progetto e compilare il firmware nRF52840.

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

Procedi con il codelab Crea una rete Thread con schede nRF52840 e OpenThread come descritto. Dopo aver eseguito il flashing del dispositivo di destinazione con l'immagine CLI, segui la sezione Aggiungere il secondo nodo alla rete Thread per aggiungere il dispositivo Thread alla rete Thread. Ripeti l'operazione per il secondo dispositivo di endpoint Thread.

4. Abbonati all'indirizzo multicast IPv6

Abbonati a ff05::abcd sul dispositivo di destinazione nRF52840 1:

> ipmaddr add ff05::abcd
Done

Verifica che l'abbonamento a ff05::abcd sia andato a buon fine:

> 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

Abbonati a ff05::abcd sul laptop:

Abbiamo bisogno di uno script Python subscribe6.py per abbonarci a un indirizzo multicast sul laptop.

Copia il codice riportato di seguito e salvalo come 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.')

Esegui subscribe6.py per iscriverti a ff05::abcd sull'interfaccia di rete Wi-Fi (ad es. wlan0):

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

La topologia di rete finale con le iscrizioni multicast è mostrata di seguito:

b118448c98b2d583.png

Ora che abbiamo sottoscritto l'indirizzo multicast IPv6 sia sul dispositivo di destinazione nRF52840 1 nella rete Thread sia sul laptop nella rete Wi-Fi, verificheremo la connettività multicast IPv6 bidirezionale nelle sezioni seguenti.

5. Verifica la modalità multicast IPv6 in entrata

Ora dovremmo essere in grado di raggiungere sia il dispositivo finale nRF52840 1 nella rete Thread sia il laptop utilizzando l'indirizzo multicast IPv6 ff05::abcd dalla rete Wi-Fi.

Esegui un ping a ff05::abcd sull'OTBR tramite l'interfaccia 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

Possiamo vedere che OTBR può ricevere due risposte ping sia dal dispositivo di destinazione nRF52840 1 sia dal laptop perché entrambi sono iscritti a ff05::abcd. Ciò dimostra che l'OTBR può inoltrare i pacchetti multicast di richiesta di ping IPv6 dalla rete Wi-Fi alla rete Thread.

6. Verificare il multicast IPv6 in uscita

Esegui un ping a ff05::abcd sul dispositivo di destinazione 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

Il dispositivo finale nRF52840 2 può ricevere risposte ai ping sia dal dispositivo finale nRF52840 1 sia dal laptop. Ciò dimostra che l'OTBR può inoltrare i pacchetti multicast di risposta ping IPv6 dalla rete Thread alla rete Wi-Fi.

7. Complimenti

Complimenti, hai configurato correttamente un router di confine Thread e verificato il multicast IPv6 bidirezionale.

Per saperne di più su OpenThread, visita il sito openthread.io.

Documenti di riferimento: