B.A.T.M.A.N. advanced

Um das Freifunknetzwerk nicht nur zu nutzen, sondern auch zu erweitern, lernen wir ein Teil davon zu werden. Debian 7.0 kommt bereits mit dem notwendigen batman-adv Kernelmodul. Weiterhin sollten die Pakete batctl, ip, nmap und curl vorhanden sein.

# Kernelmodul laden
modprobe batman-adv


# wlan device in ad-hoc mode schalten
iwconfig wlan0 mode ad-hoc
iwconfig wlan0 essid batman.jena.freifunk.net
batctl if add wlan0

# eine weile warten und andere Teilnehmer des Meshnetzwerks anzeigen
batctl o

# optional kann man andere hosts im batman-adv layer pingen
batctl p fa:1a:67:cb:25:12

# um ins internet zu kommen muss man einen default gateway finden
# alle konten sind von der form 10.17.*.1
ifconfig wlan0 0.0.0.0
ifconfig bat0 10.17.78.1  # besser auf address kollision pruefen!

# finde den schnellsten node
nmap -sP '10.17.*.1'
# nutze den schnellsten als gateway
ip route add default via 10.17.11.1 dev bat0
# akzeptiere den splash screen
curl -d target_url=foo 10.17.11.1/cgi-bin/splash-click.html

Die einzelnen Batman Knoten kann man ueber ihre link-local IPv6 Addresse erreichen:

ssh fe80::fa1a:67ff:fecb:3162%bat0

In order to check the underlying mesh-wide distributed database (hbbp source repository), add the following Lua code to /usr/share/wireshark/init.lua. If you run wireshark as root make sure to comment out the appropriate lines in this file to allow Lua to run.

trivial_proto = Proto("hbbp","Home Brew Broadcast Protocol")
-- create a function to dissect it
function trivial_proto.dissector(buffer,pinfo,tree)
    pinfo.cols.protocol = "HBBP"
    local subtree = tree:add(trivial_proto,buffer(),"HBBP Data")
    
    local i = 0
    local b = buffer():bytes()
    
    while (i<b:len() and b:get_index(i)~=0) do
      i = i + 1
    end
    if i==0 then
       return (nil)
    end
    subtree:add(buffer(0,i),"Task: " .. buffer(0,i):string())   
    if b:get_index(i) == 0 then
       subtree:add(buffer(i+1),"Payload: [Length " .. buffer:len()-i .. "]")   
    end
end
-- load the udp.port table
udp_table = DissectorTable.get("udp.port")
-- register our protocol to handle udp port 4950
udp_table:add(4950,trivial_proto)

Here is screenshot of the dissector in action: