Batman adv

Aus Freifunk Köln, Bonn und Umgebung
Wechseln zu: Navigation, Suche


Trifft auf kbu.freifunk.net nur bedingt zu.

Baustelle.png Diese Seite ist noch unvollständig. Bitte hilf uns sie zu erweitern.
Wenn Du das Recht hast diese Seite zu ändern,
kannst Du hier klicken. Danke!
Siehe auch: Mithelfen im Wiki


Seite muss überarbeitet werden !

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: (Nicht KBU)

cat /sys/class/net/bat0/mesh/originators

Bzw. die alten Versionen das procfs: (Nicht KBU)

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
# name           : batctl-loop.sh
# Parameter 1 : Zeitintervall in Sekunden (int)
# Parameter 2 : Anzahl der Wiederholungen (int)
# Beispiel: batctl-loop.sh 10 300
##

# var
frequency=$1
count=$2

if [ "q$frequency" == "q" ]; then
	frequency=1 # default
fi

if [ "q$count" == "q" ]; then
	count=3600 # default
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.