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 in un unico punto.

Che cos'è OpenThread?

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

Che cos'è un router di confine OpenThread?

OpenThread Border Router (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 in una rete eterogenea (segmenti di rete Thread e Wi-Fi/Ethernet) per indirizzi multicast con ambito più ampio di quello locale del realm.

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

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

Per i dispositivi finali minimi Thread, questi potrebbero dipendere dal dispositivo principale per aggregare l'indirizzo multicast ed eseguire MLR per loro conto o registrarsi se il dispositivo principale è di Thread 1.1.

Per maggiori 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.

Obiettivi didattici

  • Come creare il firmware nRF52840 con supporto per il multicast IPv6.
  • Come abbonarsi agli indirizzi multicast IPv6 sui dispositivi Thread.

Che cosa ti serve

  • Una workstation Linux per la creazione e il flashing di un RCP Thread, della CLI OpenThread e per il test del multicast IPv6.
  • Un Raspberry Pi per il router di confine Thread.
  • 2 dongle USB Nordic Semiconductor nRF52840 (uno per l'RCP e due per i dispositivi finali Thread).

2. Configura OTBR

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

Una volta completata la configurazione di OTBR, utilizza ot-ctl per verificare che OTBR sia diventato il router backbone principale in pochi secondi.

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

3. Creare e programmare dispositivi Thread

Crea l'applicazione CLI Thread con Multicast e carica il firmware sulle due schede nRF52840 DK.

Crea il firmware nRF52840 DK

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

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

Continua con il codelab Crea una rete Thread con schede nRF52840 e OpenThread come scritto. Dopo aver eseguito il flashing del dispositivo finale con l'immagine CLI, segui la procedura descritta in Aggiungere il secondo nodo alla rete Thread per aggiungere il dispositivo Thread alla rete Thread. Ripeti l'operazione per il secondo dispositivo finale Thread.

4. Iscriviti all'indirizzo multicast IPv6

Iscriviti a ff05::abcd sul dispositivo finale nRF52840 1:

> ipmaddr add ff05::abcd
Done

Verifica che l'abbonamento a ff05::abcd sia stato eseguito correttamente:

> 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 sottoscrivere 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 gli abbonamenti multicast è mostrata di seguito:

b118448c98b2d583.png

Ora che abbiamo eseguito la sottoscrizione dell'indirizzo multicast IPv6 sia sul dispositivo finale nRF52840 nella rete Thread sia sul laptop nella rete Wi-Fi, verificheremo la raggiungibilità multicast IPv6 bidirezionale nelle sezioni seguenti.

5. Verifica il multicast IPv6 in entrata

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

Invia un ping a ff05::abcd su 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 finale nRF52840 1 sia dal laptop perché entrambi hanno eseguito la sottoscrizione a ff05::abcd. Ciò dimostra che OTBR può inoltrare i pacchetti multicast della richiesta ping IPv6 dalla rete Wi-Fi alla rete Thread.

6. Verifica il multicast IPv6 in uscita

Ping ff05::abcd sul dispositivo finale 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

nRF52840 End Device 2 può ricevere risposte ping sia da nRF52840 End Device 1 sia dal laptop. Ciò dimostra che OTBR può inoltrare i pacchetti multicast di risposta ping IPv6 dalla rete Thread alla rete Wi-Fi.

7. Complimenti

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

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

Documenti di riferimento: