Batman adv: Unterschied zwischen den Versionen
EGeist (Diskussion | Beiträge) (Die Seite wurde neu angelegt: „Ausgeliehen von [https://muenchen.freifunk.net/wiki/index.php?title=Batman-adv https://muenchen.freifunk.net/wiki/index.php?title=Batman-adv] == Allgemein == ==…“) |
EGeist (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
||
Zeile 1: | Zeile 1: | ||
Ausgeliehen von [https://muenchen.freifunk.net/wiki/index.php?title=Batman-adv https://muenchen.freifunk.net/wiki/index.php?title=Batman-adv] | Ausgeliehen von [https://muenchen.freifunk.net/wiki/index.php?title=Batman-adv https://muenchen.freifunk.net/wiki/index.php?title=Batman-adv] | ||
''Trifft auf kbu.freifunk.net nur bedingt zu.'' | |||
== Allgemein == | == Allgemein == |
Version vom 28. Mai 2011, 20:03 Uhr
Ausgeliehen von https://muenchen.freifunk.net/wiki/index.php?title=Batman-adv
Trifft auf kbu.freifunk.net nur bedingt zu.
Allgemein
Protokollversion
Die Implementation von batman-advanced und die Spezifikation des Protokolls starteten ursprünglich parallel - zu dem Zeitpunkt waren meshing-Protokolle und insbes. Layer 2 meshing-Protokolle ziemliches Neuland. Das bedeutete natürlich dass sich das Protokolldesign erstmal sehr dynamisch entwickelte und die Versionen erstmal nicht notwendigerweise untereinander kompatibel waren.
Nach den 0.2'er batman-dvanced Versionen wurde das Versionsschema auf ein datumsbasiertes Schema umgestellt. Die 0.2'er Versionen haben offenbar eine Protokollversion gesprochen die nicht mit früheren Versionen kompatibel war. Leider sind auch die 0.2'er und die 2010.* Protokollversionen nicht kompatibel. Generell empfiehlt sich auf die neueste für alle beteiligten Geräte verfügbare batman-advanced Version (alle Nodes mit 2010.*, oder alle Nodes mit 0.2.*) zu verwenden.
Interfacekonfiguration
Physikalische interfaces über die das batman-advanced mesh aufgebaut werden sollen müssen folgendermassen konfiguriert werden:
mode: ad-hoc ssid: mesh mtu: 1527 encryption: off
Der ad-hoc mode (oder auch IBSS mode) ist der 802.11 peer-to-peer mode. In diesem werden die Pakete eines Senders von allen Peers/Nodes in dessen Reichweite direkt empfangen, im Gegensatz zum managed mode bei dem Pakete immer über den Access-Point gesendet resp. empfangen werden. In einem mesh-Netz macht also i.A. nur der ad-hoc mode (bzw. nur peer-to-peer modes) Sinn.
Die ssid muss bei allen mesh-Nodes die sich vernetzen sollen gleich sein, Geräte mit unterschiedlichen ssids "sehen" sich nicht. Eine allgemeine Konvention ist an dieser Stelle praktisch - daher wird hier dafür einfach maximalintuitiv mesh benutzt.
Die mtu ist die maximale Framegrösse, die sollte sinnigerweise um den batman-advanced header grösser sein als die mtu des bat0 Interfaces (funktioniert auch mit anderen mtu-Sizes, was allerdings zu Performanceeinbussen führt). Lässt sich die mtu des physikalischen Interfaces nicht vergrössern, wäre es empfehlenswert die mtu des bat0 interfaces auf mtu_des_physikalischen_interfaces - 27 zu setzen (bspw. ath1 hat mtu 1500 -> für bat0 sollte man eine mtu von =< 1473 setzen).
Da der Sinn des Mesh-Netzes ist möglichst viele Nodes möglichst offen zu vernetzen, ist Verschlüsselung hier i.A. kontraproduktiv, daher sollte sie ausgeschaltet werden.
batman-advanced ist ein Kernelmodul. Falls dies nicht bereits automatisch geladen wird (= falls kein bat0 interface vorhanden ist), lässt es sich mit
modprobe batman-adv rmmod batman-adv
laden bzw. wieder entfernen.
Einzige Besonderheit bei der Konfiguration der Interfaces ist dass batman-advanced natürlich mitgeteilt werden muss welche(s) Interface(s) für meshing benutzt werden soll(en), bzw. ggf. welche(s) Interface(s) wieder aus der Liste der zum meshing zu verwendenden Interfaces ausgetragen werden soll(en). Das geht mit dem Userspace-Utility batctl, in den aktuellen (2010.*) Versionen mit der Syntax:
batctl if add ath1 batctl if del ath1
Diese Versionen benutzen zum Hinzufügen oder Entfernen von Interfaces das sysfs:
echo bat0 > /sys/class/net/ath1/batman_adv/mesh_iface echo none > /sys/class/net/ath1/batman_adv/mesh_iface
Um die Version 0.2 herum lautete die Syntax leicht anders (insbesondere: ein einzelnes interface entfernen ist so nicht möglich, man entfernt in dem Fall erstmal alle interfaces und fügt dann die gewünschten wieder hinzu):
batctl if ath1 batctl if none
Möchte man damit ein einzelnes Interface gescriptet entfernen, hier die passende .sh-zeile dazu ($LOGICAL sei der Name des Interface das entfernt werden soll, also z.B. ath1):
batctl if none `batctl interface | sed 's/^\\[.*\\][ ]*\\([^ ]\\+\\)[ ]\\+.*$/\\1/' | grep -v "^$LOGICAL$"`
Diese Versionen benutzen zum Hinzufügen oder Entfernen von Interfaces das procfs:
echo ath1 > /proc/net/batman-adv/interfaces echo > /proc/net/batman-adv/interfaces
Das resultierende mesh Interface heisst bat0. Das kann dann je nach gewünschter Anwendung frei konfiguriert werden. Im Normalfall wohl als dhcp-client (falls man selbst keinen Internet-uplink zur Verfügung stellen will), oder als dhcp-server (falls man Internet-uplink zur Verfügung stellen will), oder static (z.B. falls man das mesh als local-loop zum Internet-Provider nutzen will).
Für den Fall dass man Internet-uplink zur Verfügung stellen will sollte man beachten den dhcp-server unbedingt nonauthoritative zu konfigurieren, damit eine Koexistenz mehrerer dhcp-server im mesh funktioniert.
Utilities
Mit dem batctl Utility lassen sich auch die Peers/Neighbors/Originators anzeigen:
batctl o
Die neuen Versionen benutzen dazu das sysfs:
cat /sys/class/net/bat0/mesh/originators
Bzw. die alten Versionen das procfs:
cat /proc/net/batman-adv/originators
Ausserdem bietet es ein paar weitere nützliche Funktionen wie batman-adv Varianten von ping, traceroute, tcpdump und diverse loggingspezifische Optionen.
Bei der Einrichtung einer Wolke (z.B. beim Ausrichten der Antenne) kann folgendes Script hilfreich sein. Batctl o wird zyklisch ausgeführt und alle erreichbaren Knoten werden angezeigt. Einfach in ein Leeres File auf dem Router kopieren, ausführbar machen (chmod +x $FILENAME) und starten.
#!/bin/sh frequency=$1 count=$2 if [ "q$frequency" == "q" ]; then frequency=1 fi if [ "q$count" == "q" ]; then count=3600 fi for i in `seq $count`; do clear date echo "Iteration $i" batctl o sleep $frequency done
OpenWRT
10.*, Backfire
10.03
OpenWRT 10.03 kommt mit batman-advanced 0.2.1, unterstütz damit also Protokollversion 0.2 out-of-the-box.
Für ein Update auf eine neuere batman-advanced Version empfiehlt sich wohl der Einfachheit halber ein Update auf OpenWRT 10.03.1.
Um das Kernelmodul und das userspace-utility zu installieren:
opkg install kmod-batman-adv-kernelland
Die Konfiguration funktioniert wiegehabt (hier die relevanten Einträge in den configfiles, in diesem Beispiel für meshing über Interface ath1, und dhcp-client im mesh - die Konfiguration kann natürlich genauso über eine KonfigurationsGUI vorgenommen werden):
/etc/config/network:
config 'interface' 'ath1' option 'ifname' 'ath1' option 'proto' 'none' option 'mtu' '1527' config 'interface' 'mesh' option 'ifname' 'bat0' option 'proto' 'dhcp' option 'mtu' '1500'
/etc/config/wireless:
config 'wifi-iface' option 'device' 'wifi1' option 'network' 'ath1' option 'mode' 'adhoc' option 'ssid' 'mesh' option 'encryption' 'none'
/etc/config/batman-adv-kernelland:
config batman-adv-kernelland general option interface ath1
Das war's schon, das Interface bat0 ist das mesh Interface.
10.03.1
OpenWRT 10.03.1 kommt mit batman-advanced 2010.0.0, unterstütz damit also eine neuere Protokollversion als 0.2.
Ein Update quasi auf das nächste major release (oder gar eine neue Protokollversion) ist zwischen minor releases des selben major release eines Betriebssystems eigentlich eher etwas was man nicht tut. In diesem Fall ist's aber wohl gut nachvollziehbar, da batman-adv sich noch sehr stark und relativ schnell entwickelt, so dass das Warten auf das nächste OpenWRT major release bis zum Update auf eine aktuelle batman-adv Version wohl mehr Nach- als Vorteile brächte.
Um das Kernelmodul und das Userspace-Utility zu installieren:
opkg install kmod-batman-adv
Die Konfiguration funktioniert wiegehabt (hier die relevanten Einträge in den configfiles, in diesem Beispiel für meshing über Interface ath1, und dhcp-client im mesh - die Konfiguration kann natürlich genauso über eine KonfigurationsGUI vorgenommen werden):
/etc/config/network:
config 'interface' 'ath1' option 'ifname' 'ath1' option 'proto' 'none' option 'mtu' '1527' config 'interface' 'mesh' option 'ifname' 'bat0' option 'proto' 'dhcp' option 'mtu' '1500'
/etc/config/wireless:
config 'wifi-iface' option 'device' 'wifi1' option 'network' 'ath1' option 'mode' 'adhoc' option 'ssid' 'mesh' option 'encryption' 'none'
/etc/config/batman-adv:
config batman-adv general option interface ath1
Das war's schon, das Interface bat0 ist das mesh Interface.
Debian
Protokollversion
Das Paket batman-adv-dkms (gibt's ab Squeeze) enthält ein B.A.T.M.A.N. Advanced 2010.* Release. Dieses Paket benutzt das DKMS-Framework, d.h. das Kernelmodul wird lokal from source für den jeweils installierten Kernel gebaut.
Das B.A.T.M.A.N. Advanced Utility batctl befindet sich im Paket batctl.
Für den Build des Moduls wird das zum Kernel/linux-image-* passende linux-headers-* Paket benötigt, sowie natürlich die Pakete fürs Builden an sich (gcc, build-essential, etc.), sowie sinnigerweise module-init-tools. Das batman-adv-dkms Paket dependet im Übrigen noch auf das dkms Paket.
Um das Modul beim booten automatisch zu laden, empfiehlt sich im file /etc/modules eine Zeile batman-adv hinzuzufügen.
Interfacekonfiguration
Um beispielsweise ein WLAN-Interface wlan0 mit B.A.T.M.A.N. Advanced zu konfigurieren (mit dhcp-client auf dem mesh interface):
In /etc/network/interfaces:
allow-hotplug wlan0 iface wlan0 inet static address 0 netmask 0 mtu 1527 wireless-mode ad-hoc wireless-essid mesh post-up batctl if add "$LOGICAL" pre-down batctl if del "$LOGICAL" iface bat0 inet dhcp
Der Konfigurations-Typ static besteht auf einer IP-Konfiguration, address und netmask können also nicht weggelassen werden (und auch wenn die hier benutzten Dummy-Werte '0' hier eine Fehlermeldung hervorrufen, funktioniert dieses Interface-Setup - bei manchen Versionen - allerdings dennoch). Der Konfigurations-Typ manual ist auch nicht wirklich eine bessere Alternative, da mit diesem die anderen nötigen Konfigurationsparameter nicht gesetzt werden können, die müsste man dann per pre-up setzen.
Eine Liste von Peers/Neighbors/Originators erhält man mit:
batctl o
Befindet man sich z.B. in einer 'Wolke' von B.A.T.M.A.N. Advanced Nodes mit einem dhcp-server, müsste:
dhclient bat0
funktionieren.