802.11s ist ein offener Standard zur drahtlosen Verbindung von Geräten, ohne dafür Infrastruktur aufbauen zu müssen. Er arbeitet am Layer 2 und stellt sicher, dass alle Knoten einander wie auf einem gebridgten Layer-2-Netz sehen können, als ob sie an einen gemeinsamen Switch angesteckt wären. Die Layer 3-Infrastruktur funktioniert darauf aufbauend, z.B. IP-Routing und DHCP-Clients, aber auch komplexere Dienste wie Batman, Bird, OLSR usw.
802.11s funktioniert verlässlich seit OpenWrt 19.07 und später, inklusive Authentifizierung und Verschlüsselung - solange Hardware- bzw. Treiberunterstützung vorhanden ist und wpad-mesh-openssl
(oder ähnliches) installiert ist.
Es scheint (bestätigt in v19.07.4) ein Problem mit der Weiterleitung von ARP zu geben - die Mesh-Funktion funktioniert nur verlässlich von Mesh-Points aus, welche in Funkreichweite des Mesh-Portals (MPP) sind. Näheres hierzu unter https://forum.openwrt.org/t/bug-report-802-11s-mesh-v19-07-4/78524/4
Zunächst ist es nötig das standardmäßig installierte wpad
wie folgt zu entfernen
# opkg remove wpad-mini # opkg remove wpad-basic
Dieses wird nun durch die Abhängigkeit wpad-mesh-openssl
ersetzt:
# opkg install wpad-mesh-openssl
Bearbeite /etc/config/wireless
und versichere dich dass:
radio0
nicht deaktiviert ist,radio0
auf allen Geräten, die am Mesh teilnehmen sollen, kompatibel konfiguriert ist (selber Kanal, selbe Mesh-ID, selbes Passwort)iface
-Eintrag entsprechend folgender Zeilen vorhanden ist:config wifi-iface 'mesh' option network 'mesh' option device 'radio0' option mode 'mesh' option mesh_id 'mein-Meshnetz' # beliebig wählbar, aber identisch auf allen Geräten, die im selben Mesh sein sollen (wie auch das Passwort) option encryption 'psk2/aes' # oder 'none', um keine Verschlüsselung zu verwenden option key 'mein-geheimes-Passwort'
Hinweis: Der Endgerätezugang wird durch eine Bridge zwischen 'ap' und dem 'mesh'-Interface hergestellt.
Um im Mesh ein anderes Routingprotokoll wie z.B. OLSR zu verwenden, deaktiviere das 802.11s-eigene Routingprotokoll mit option mesh_fwding '0'
.
Für eine gesamte Liste an Mesh-Parametern können die folgenden Werte im Quelltext von mac80211.sh eingesehen werden:
Alternativ hilft folgender Befehl:
# iw dev <devname> get mesh_param
um eine Liste von verfügbaren Mesh-Parametern zu erhalten, diese ist jedoch nicht dokumentiert.
Danach noch das WLAN reinitialisieren und testen ob es funktioniert:
# wifi # logread -l 20 -f # iw dev wlan0 station dump
Die 802.11s-Unterstützung hängt vom WLAN-Treiber ab. Die meisten aktuellen Open-Source-Treiber funktionieren.
Deine Hardware unterstützt 802.11s-Mesh, wenn unter den unterstützten Interface-Modi “mesh point” gelistet ist.
iw list | grep "Supported interface modes" -A 9 ... Supported interface modes: * IBSS * managed * AP * AP/VLAN * WDS * monitor * mesh point * P2P-client * P2P-GO ...
Beispiel: ein Router mit ath9k
iw list ... valid interface combinations: * #{ managed, WDS } <= 2048, #{ AP, mesh point } <= 8, #{ P2P-client, P2P-GO } <= 1, #{ IBSS } <= 1, total <= 2048, #channels <= 1, STA/AP BI must match * #{ IBSS, AP, mesh point } <= 1, total <= 1, #channels <= 1, STA/AP BI must match, radar detect widths: { 20 MHz (no HT), 20 MHz } ...
Beispiel: ein USB-Stick mit ath9k_htc
iw list ... valid interface combinations: * #{ managed, P2P-client } <= 2, #{ AP, mesh point, P2P-GO } <= 2, total <= 2, #channels <= 1 ...
iw
ist ein nl80211-basierted Kommandozeilenprogramm zur Konfiguration von WLAN-Hardware. Mehr erfahren...
Erstelle ein neues Interface namens “mesh0”
iw phy phy0 interface add mesh0 type mp mesh_id meinmesh
Stelle sicher, dass das neue Interface auch wirklich existiert
ifconfig -a | grep mesh0 mesh0 Link encap:Ethernet HWaddr 00:18:39:14:48:B5
Schalte das Interface mesh0 aktiv
ifconfig mesh0 up
Weise dem Interface eine IP-Adresse zu, beispielsweise 10.0.0.1
ifconfig mesh0 10.0.0.1
Standardmäßig verwenden Mesh Points den WLAN-Kanal 1 und versuchen automatisch Links zu anderen Meshknoten mit derselben Mesh-ID am selben Kanal herzustellen.
Verwende den iw
-Befehl um Peer-Links oder die Tabelle der erreichbaren Nodes in Deinem Mesh anzuzeigen.
iw dev $MESH_IFACE station dump iw dev $MESH_IFACE mpath dump
Beispiel:
iw dev $MESH_IFACE station dump Station 00:15:6d:84:14:10 (on mesh) inactive time: 1320 ms rx bytes: 352 rx packets: 4 tx bytes: 174 tx packets: 2 signal: -61 dBm tx bitrate: 1.0 MBit/s mesh llid: 32577 mesh plid: 15969 mesh plink: ESTAB Station 00:15:6d:84:14:09 (on mesh) inactive time: 3370 ms rx bytes: 1064 rx packets: 12 tx bytes: 545 tx packets: 7 signal: -53 dBm tx bitrate: 1.0 MBit/s mesh llid: 41036 mesh plid: 24435 mesh plink: ESTAB
Dazu ist möglicherweise das Paket iw-full
nötig!
Verwehre einem Peer das Meshen, basierend auf seiner MAC-Adresse
iw dev $MESH_IFACE station set $MAC_TO_BLOCK plink_action block
Überprüfe wie oben gezeigt mit iw dev $MESH_IFACE station dump
mesh plink: BLOCKED
Peer wieder freigeben:
iw dev $MESH_IFACE station set $MAC_TO_UNBLOCK plink_action open
Laut dieser Quelle bleibt die plink_action
nach Reconnects von Mesh-Links nicht erhalten.