[[Datei:1406FreifunkDresden-Logo.svg‎|rechts]] [[Freifunk Dresden]] ist das Projekt in Dresden zu [[wikipedia:de:Freifunk]]. Das Freifunk-Netz Dresden ist ein von Freiwilligen betriebenes freies WLAN-Netzwerk. Ziel ist es, Dresden flächendeckend mit [[Freifunk]] zu versorgen.Seite des [http://www.freifunk-dresden.de Freifunk Dresden] == Entstehung == [[Freifunk Dresden]] wurde ursprünglich unter dem Namen ''ddmesh'' von [[Stephan Enderlein]] gestartet und existiert bereits seit einigen Jahren. Seit 2014 sind durchgängig mehr als 50 Knoten in Dresden erreichbar und auch Geschäfte in Dresden nehmen die Vorteile von Freifunk für sich und ihre Kunden wahr. == Mitmachen == Um Teil des Freifunk-Netzwerkes zu werden, braucht man sowohl einen handelsüblichen Router als auch die passende Freifunk-Firmware-Version dazu. === Firmware === Seit {{#formatdate:2014-12-03}} steht die [http://download.ddmesh.de/firmware/2.1.5/ Firmware 2.1.5] zur Verfügung. Die Firmware-Dateien sind nach den unterstützten Geräten benannt. Der Name einer Firmware-Datei setzt sich als openwrt-ar71xx-generic-''ROUTERNAME''-squashfs-''ZUSATZ''.bin zusammen. : So ist beispielsweise die Datei openwrt-ar71xx-generic-''tl-wr841n-v8''-squashfs-''factory''.bin für einen Router :* des Modells ''TL-WR841N'' :* in der ''V''ersion ''8'' (der Hardware) :*: siehe Etikett auf der Unterseite des Gerätes. :* ''Factory'' bedeutet, dass diese Firmware-Datei für die Erstinstallation der Freifunk-Firmware auf einem Gerät verwendet werden muss, auf dem sich bisher noch eine andere Firmware befindet, meist die Original-Firmware des Herstellers. : Beim Dateinamen openwrt-ar71xx-generic-''tl-wr841n-v8''-squashfs-''sysupgrade''.bin bedeutet der Zusatz ''Sysupgrade'' hingegen, dass diese Datei zum Updaten eines bereits für den Dresdner Freifunk im Einsatz befindlichen Routers ist. Ausführliche Erklärungen zur Konfiguration der Firmware werden im [[freifunk-dresden:Hauptseite | Wiki]] (wiki.freifunk-dresden.de) gepflegt. === Router === Wie der [http://download.ddmesh.de/firmware/2.1.5/ar71xx/ Firmware-Liste] zu entnehmen ist, gibt es eine Vielzahl an Freifunk-kompatiblen Routern. Allerdings erfreuen sich bestimmte Modelle in Dresden meist insbesondere wegen der günstigen Anschaffungskosten besonderer Beliebtheit: {| class="wikitable sortable zebra toptextcells" |- ! Geräte-Name ! Hersteller ! Preis (€) ! RAM (MB) ! ROM (MB) ! class="unsortable" | Beschreibung |- | TL-WR841N | TP-Link | style="text-align:right" | 16-20 | style="text-align:right" | 32 | style="text-align:right" | 4 | Im Unterschied zum Modell mit der Endung ''ND'' mit nicht abnehmbaren Antennen ausgestattet. |- | TL-WR841ND | TP-Link | style="text-align:right" | 20-29 | style="text-align:right" | 32 | style="text-align:right" | 4 | ''D'' steht für ''detachable'', der Router besitzt also abnehmbare Antennen. |- | TL-WDR3600 | TP-Link | style="text-align:right" | 40- | style="text-align:right" | 128 | style="text-align:right" | 8 | mehr Speicher, USB Anschlüsse, auch 5 GHz, 2 abnehmbare Antennen |- | TL-WDR4300 | TP-Link | style="text-align:right" | 45- | style="text-align:right" | 128 | style="text-align:right" | 8 | mehr Speicher, USB Anschlüsse, auch 5 GHz, 3 abnehmbare Antennen |- | Nanostation M2 loco | Ubiquiti | style="text-align:right" | 40- | style="text-align:right" | 32 | style="text-align:right" | 8 | 2,4 GHz Richtfunk, Outdoor, 60° Öffnungswinkel, Power over Ethernet + Injector |- |} == Standorte == Das Netz von Freifunk Dresden erstreckt sich nicht nur über Dresden selbst, sondern ist mittlerweile vereinzelt u. a. in * Coswig, * Freital, * Meißen, * Radeberg und * Radebeul zu finden. Detaillierte Standortinformationen sind auf der [http://www.freifunk-dresden.de/topology/google-maps.html Freifunk-Karte] einsehbar. Neben den festen Standorten gibt es Freifunk auch auf [[Freifunk Dresden/Veranstaltung | Veranstaltung]]en, wie z. B. Weihnachtsmärkten. == Original-Firmware == Die Firmware basiert auf [[w:de:OpenWrt|OpenWrt]] mit BMX (Alternativentwicklung basierend auf batmand) und einer custom Weboberfläche.
Das Routingprotokoll batman-adv wird hier nicht verwendet und wurde parallel zu BMX mit einem komplett anderen Ziel entwickelt. Nutzung der Original-Firmware hat folgende Vorteile: * Konsistente Konfiguration mit fast allen anderen Teilnehmern * Anschluß ans Backbone-VPN (vtun) * Offenes WLAN, welches über das Backbone ins Internet kommt (alternativ durch zusätzliche Pakete ein eigener VPN-Dienst konfigurierbar) * Webserver der die Knotenmetadaten ausliefert (automatische Knotenregistrierung) === Freie Software und Peering === Die Software ist frei und kann durch die Quellen von OpenWRT und die Sourcen zu Änderungen von der Freifunk-Seite eingesehen werden. Konfiguration und Scripte sind in den Images zu finden oder auf [https://github.com/ddmesh/firmware-freifunk-dresden GitHub] (Licensen beachten).
Die Dokumentation zum Bau eigner Firmware Images und Alternativ-Knoten sind im Aufbau. Da zu [[w:de:Freier Software|Freie Software]] für viele von uns auch der freie und möglichst barrierefreiem Zugang zu weiteren Informationen zählt, wollen wir diesen Umstand ändern - auch um Freifunk noch besser machen zu können. Im Widerspruch dazu steht das berechtigte Interesse der bisherigen Freifunk-Teilnehmer auf einen Störungsfreien Betrieb und infolgedessen Imageschaden bei den normalen Benutzern, der durch Experimente mit alternativer Firmware gefährdet sein könnte - das Marketing für Freie Software sowie für Freifunk selbst sind leider schwierig. Ideen dazu werden [[Diskussion:Freifunk Dresden|diskutiert]], um die jetzigen Betreibenden in Blick auf offenem Zugang zu Informationen zu überzeugen. == Technische Informationen == Bitte konsultiert zuerst das [http://wiki.freifunk-dresden.de/ Wiki Freifunk Dresden] und [http://wiki.freifunk-dresden.de/index.php/Knoten_Spezifikation Knoten Spezifikationen] für aktuelle Informationen, Derzeit enthält es noch keine techischen Informationen (ist aber in Arbeit). Die Informationen hier in diesem Wiki sind derzeit veraltet und sind nicht mehr kompatibel mit dem Freifunk Dresden Netz. Sie sollten daher nicht mehr verwendet werden, da es damit zu IP Konflikten kommt. === WLAN-Einstellungen === Die detailierten Einstellungen werden [[Intern:Freifunk Dresden|derzeit intern]] beschrieben. === Adressvergabe === ==== IP-Adressberechnungs mit Shell- und Lua Script ==== Die Berechnung kann sich in künftigen Versionen ändern, derzeit wird u.a. eine Aufteilung des Netzwerkes in "original"-FFF und "custom" erwogen. Deshalb ist Vorsicht geboten was die Aktualität des Inhaltes angeht - bitte überprüfen bevor ihr peert. Die Scripte deren Algorithmus formalisiert werden soll: ===== usr/bin/ddmesh-ipcalc.sh ===== #!/bin/sh if [ "$1" = "" ] then echo "" echo "ddmesh-ipcalc.sh (lua) Stephan Enderlein (c) 2013 V1.7" echo "" echo "Calculates all the addresses for the ddmesh freifunk node" echo "usage: ddmesh-ipcalc.sh [-n node] | [ip]" echo "" exit 1 fi if [ "$1" = "-n" ]; then node=`echo "$2" | sed 's/[\$\`\(\)]/0/g'` lua -lddmesh -e "ipcalc.print($node)" else ip=`echo "$1" | sed 's/[\$\`\(\)]/0/g'` lua -lddmesh -e "print(iplookup(\"$ip\"))" fi ===== usr/lib/lua/ddmesh.lua ===== --[[---------------------------------------------------------------------------------------- ddmesh.lua library for different freifunk functions version: 6 -------------------------------------------------------------------------------------------]] ----------------- ipcalc --------------- ipcalc={} ipcalc.data={} ipcalc.data.max=2048 function split(str, delim, maxNb) -- Eliminate bad cases... if string.find(str, delim) == nil then return { str } end if maxNb == nil or maxNb < 1 then maxNb = 0 -- No limit end local result = {} local pat = "(.-)" .. delim .. "()" local nb = 0 local lastPos for part, pos in string.gfind(str, pat) do nb = nb + 1 result[nb] = part lastPos = pos if nb == maxNb then break end end -- Handle the last field if nb ~= maxNb then result[nb + 1] = string.sub(str, lastPos) end return result end function ipcalc.rCalcIp(ip) if ip==nil or ip=="" then return -1 end a = split(ip, "[.]") if #a ~= 4 then return -1 end if a[1]==nil or a[1]=="" or tonumber(a[1]) ~= 10 then return -1 end if a[2]==nil or a[2]=="" or tonumber(a[2]) ~= 200 and tonumber(a[2]) ~= 201 then return -1 end if a[3]==nil or a[3]=="" or tonumber(a[3]) < 0 or tonumber(a[3]) > 255 then return -1 end if a[4]==nil or a[4]=="" or tonumber(a[4]) < 0 or tonumber(a[4]) > 255 then return -1 end middle = a[3] if a[2]=="201" then middle = middle + 256 end minor = math.floor(a[4]/64) --x>>6 node = middle*4+minor --x<<2 if node < 0 or node > ipcalc.data.max then return -1 end return node end function ipcalc.calc(node) --node has to be a number n \in N_0, 0 <= n <= 2048 if node==nil or node=="" then return -1 end node=tonumber(node) if node==nil or node=="" then return -1 end if node < 0 or node > ipcalc.data.max then return -1 end local domain = "freifunk-dresden.de" --Ternary Operator in use -- major network for nodes n < 1024: 200, for nodes > 1023: 201 local major = node >= 1024 and 201 or 200 --a[2] -- etc. local middle = node >= 1024 and math.floor((node-1024) / 4) or math.floor(node / 4) --a[3] local minor = (node % 4) * 64 local meshnet = "10" local nodeip = meshnet .. "." .. major .. "." .. middle .. "." .. minor + 1 local meshnetmask = "255.0.0.0" local meshpre = 15 local meshbroadcast = "10.255.255.255" local meshnetwork = "10.200.0.0" local dhcpstart = meshnet .. "." .. major .. "." .. middle .. "." .. minor + 2 local dhcpend = meshnet .. "." .. major .. "." .. middle .. "." .. minor + 63 local dhcpoffset = 1 --used by config/dhcp local dhcplimit = 62 --used by config/dhcp local dhcprangepre = 26 local dhcprangemask = "255.255.255.192" local dhcpnetmask = "255.255.255.255" local dhcpbroadcast = "10.255.255.255" -- needed, else dnsmasq will not start local dhcpnetwork = meshnet .. "." .. major .. "." .. middle .. "." .. minor local hna = meshnet .. "." .. major .. "." .. middle .. "." .. minor .. "/" .. dhcprangepre local mesh6pre = "48" local mesh6net = "fd11:11ae:7466::" -- client range local mesh6nodenet= "fd11:11ae:7466:" .. string.format("%x", node) .. "::" local mesh6ip = mesh6nodenet .. "1" local mesh6nodepre= "64" -- preparing variabled to be expoted ipcalc.data.node = node ipcalc.data.domain = domain ipcalc.data.hostname = "r" .. node ipcalc.data.ip = nodeip ipcalc.data.network = meshnetwork ipcalc.data.netpre = meshpre ipcalc.data.netmask = meshnetmask ipcalc.data.broadcast = meshbroadcast ipcalc.data.dhcpstart = dhcpstart ipcalc.data.dhcpend = dhcpend ipcalc.data.dhcpoffset = dhcpoffset ipcalc.data.dhcplimit = dhcplimit ipcalc.data.dhcprangepre = dhcprangepre ipcalc.data.dhcprangemask = dhcprangemask ipcalc.data.dhcpnetwork = dhcpnetwork ipcalc.data.dhcpbroadcast = dhcpbroadcast ipcalc.data.dhcpnetmask = dhcpnetmask ipcalc.data.clienthna = hna ipcalc.data.mesh6ip = mesh6ip ipcalc.data.mesh6net = mesh6net ipcalc.data.mesh6pre = mesh6pre ipcalc.data.mesh6nodenet = mesh6nodenet ipcalc.data.mesh6nodepre = mesh6nodepre end function ipcalc.print(node) if node==nil or node=="" then print("ERROR"); return -1 end node=tonumber(node) if node==nil then print("ERROR"); return -1 end if node < 0 or node > ipcalc.data.max then return -1 end ipcalc.calc(node) for k,v in pairs(ipcalc.data) do print("export _ddmesh_"..k.."="..v) end end --not needed for ip address calculation function iplookup(ip) if ip==nil then return -1 end n=ipcalc.rCalcIp(ip) if n == -1 then return -1 end ipcalc.calc(n) return ipcalc.data.hostname end --not needed for ip address calculation function lookup(node) if node==nil then return -1 end if string.sub(node,1,1) == "r" then n=tonumber(string.sub(node,2)) else n=tonumber(node) end if n==nil then return -1 end if n < 0 or n > ipcalc.data.max then return -1 end ipcalc.calc(n) return ipcalc.data.ip end ---- == Metadaten == === Freifunk-API === Es existiert eine Inter-Community-API analog zur SpaceAPI. Beispiel: [http://cholin.spline.de/freifunk/api-viewer/ Freifunk API Viewer] [https://github.com/freifunk/directory.api.freifunk.net/blob/master/directory.json Directory.json], [http://info.ddmesh.de/info/freifunk.json Dresden] === Knotenmetadaten === Jeder Knoten bietet ein JSON-Dokument unter http://10.200.../sysinfo-json.cgi an. Es enthält Versionsstände, Geokoordinaten, Kontaktinfo, Auslastung und alle Routen. == Wiki == * [[:Kategorie:Freifunk Dresden]] == Siehe auch == * [[wikipedia:de:Freifunk]] * [https://wiki.freifunk.net/Freifunk_Dresden freifunk:Freifunk Dresden] * Planung zu [[Datenspuren 2014/Freifunk Dresden | Freifunk bei den Datenspuren 2014]] * [[Freifunk Dresden]] bei den [[Datenspuren]] ** [[Datenspuren 2013]]: [https://datenspuren.de/2013/fahrplan/events/5175.html Vortrag ''ddmesh''] (by [[user:W01f|vv01f]]), [http://ftp.c3d2.de/datenspuren/2013/5175_ddmesh_hq.mp4 Video] ** [[Datenspuren 2014]]: [http://datenspuren.de/2014/fahrplan.html#13k Vortrag ''Sachstand Freifunk Dresden''] (by [[user:Emploi|Emploi]]) == Weblinks == * [https://www.freifunk-dresden.de/ www.freifunk-dresden.de, Homepage von] [[Freifunk Dresden]] ** [https://dresden.freifunk.net/ dresden.freifunk.net] ** [http://wiki.freifunk-dresden.de/ wiki.freifunk-dresden.de, Wiki von] [[Freifunk Dresden]] ** [http://bt.freifunk-dresden.de/ Bugtracker von] [[Freifunk Dresden]] * [http://www.ddmesh.de/ www.ddmesh.de] (wie auch www.freifunk-dresden.de) ** [http://download.ddmesh.de/firmware/ Firmware] *** [http://download.ddmesh.de/firmware/latest/ar71xx/changelog.txt changelog der aktuellen Version der Firmware] ** [http://www.ddmesh.de/hotspots.html Hotspot-Liste] * [https://github.com/ddmesh/firmware-freifunk-dresden Firmware auf GitHub] * [https://drive.google.com/?ddrp=1#folders/0B1LY99qDqRVPdTBNT2JEMlRkRzQ Flyer / Sticker / Kollaboration für Werbemittel] == Veraltete Technische Informationen == Bitte konsultiert zuerst das [http://wiki.freifunk-dresden.de/ Wiki Freifunk Dresden] und [http://wiki.freifunk-dresden.de/index.php/Knoten_Spezifikation Knoten Spezifikationen] für aktuelle Informationen, da diese immer aktueller sind.
Derzeit enthält es noch keine techischen Informationen (ist aber in Arbeit). Die Informationen hier in diesem Wiki sind derzeit veraltet und sind nicht mehr kompatibel mit dem Freifunk Dresden Netz. Sie sollten daher nicht mehr verwendet werden, da es damit zu IP Konflikten kommt. === WLAN-Einstellungen === In Syntax der /etc/config/wireless unter OpenWRT:
config wifi-device 'radio0'
	option type 'mac80211'
	option hwmode '11ng'
	option macaddr 'a0:f3:c1:84:a3:e2'
	# Je Nach Verbindungsqualität auch HT40-
	option htmode 'HT20'
	list ht_capab 'LDPC'
	list ht_capab 'SHORT-GI-20'
	list ht_capab 'SHORT-GI-40'
	list ht_capab 'TX-STBC'
	list ht_capab 'RX-STBC1'
	list ht_capab 'DSSS_CCK-40'
	option channel '13'
	option country 'DE'

config wifi-iface
        option device 'radio0'
        option encryption 'none'
        option network 'mesh'
        # WLAN-Modus:
        option mode 'adhoc'
        # Zellen-Id, muss gleich sein:
        option bssid '64:64:6d:65:73:68'
        # Name zum Wiedererkennen:
        option ssid 'Freifunk Dresden [adhoc]'
Oder manuell, bis zum nächsten Reboot:
iw phy phy0 interface add adhoc0 type ibss
iw dev adhoc0 ibss join "Freifunk Dresden [adhoc]" HT20 fixed-freq 64:64:6d:65:73:68
Viele WLAN-Treiber unter Linux lassen mehrere Interfaces pro Adapter zu. Du kannst Adhoc also auch mit AccessPoints konfigurieren. Allerdings sollte der Channel übereinstimmen. === Adressvergabe === Die Berechnung erfolgt über ein Script ''ddmesh-ipcalc.sh''. Die Berechnung hier in diesem Wiki ist veraltet. === Knotennummer reservieren === ''registerkey'' ist ein eindeutiger Registrierungskey, mit dem der Knoten im Freifunk Netz registriert wird. Dieser wird derzeit aus den MAC Adressen der Netzwerkkarten im Router und dem ssh-fingerprint generiert. Die Keylänge ist dabei zu erfüllen.
curl http://register.ddmesh.de/bot.php\?registerkey\=d4:1d:8c:d9:8f:00:b2:04:e9:80:09:98:ec:f8:42:7e:d4:1d:8c:d9:8f:00:b2:04:e9:80:09:98:ec:f8:42:7e         

OK:141
'''TODO:''' Aktuell einen Monat lang gültig, wie wird die Erreichbarkeit gecheckt? === Adressen berechnen === Auf der Original-Firmware gibts ein Skript für die Knotennummer. Bis jemand die Berechnung formalisiert, müssen wir darauf zurückgreifen:
 TP-LINK TL-WR841N/ND v8 @ r150:~# ddmesh-ipcalc.sh -n 141
export _ddmesh_dhcplimit=62
export _ddmesh_netmask=255.0.0.0
export _ddmesh_ip=10.200.35.65
export _ddmesh_dhcpoffset=1
export _ddmesh_mesh6net=fd11:11ae:7466::
export _ddmesh_hostname=r141
export _ddmesh_node=141
export _ddmesh_dhcpstart=10.200.35.66
export _ddmesh_dhcpnetwork=10.200.35.64
export _ddmesh_broadcast=10.255.255.255
export _ddmesh_network=10.200.0.0
export _ddmesh_mesh6nodenet=fd11:11ae:7466:8d::
export _ddmesh_max=2048
export _ddmesh_mesh6nodepre=64
export _ddmesh_domain=freifunk-dresden.de
export _ddmesh_mesh6pre=48
export _ddmesh_mesh6ip=fd11:11ae:7466:8d::1
export _ddmesh_clienthna=10.200.35.64/26
export _ddmesh_netpre=15
export _ddmesh_dhcpnetmask=255.255.255.255
export _ddmesh_dhcpbroadcast=10.255.255.255
export _ddmesh_dhcprangemask=255.255.255.192
export _ddmesh_dhcprangepre=26
export _ddmesh_dhcpend=10.200.35.127
Für die Knotennummer 141 generiert es ein Netzzuweisung von '''10.200.35.64/26'''. Die erste nutzbare Adresse wird als '''10.200.35.65/8''' auf das Adhoc-Interface konfiguriert. Dann sollte auch die Broadcast-Adresse '''10.255.255.255''' stimmen. ==== IP-Adressberechnungs mit Shell- und Lua Script ==== Die Scripte deren Algorithmus formalisiert werden soll: '''usr/bin/ddmesh-ipcalc.sh'''
#!/bin/sh

if [ "$1" = "" ]
then
	echo ""
        echo "ddmesh-ipcalc.sh (lua) Stephan Enderlein (c) 2013 V1.7"
	echo ""
        echo "Calculates all the addresses for the ddmesh freifunk node"
	echo "usage: ddmesh-ipcalc.sh [-n node] | [ip]"
	echo ""
        exit 1
fi

if [ "$1" = "-n" ]; then
	node=`echo "$2" | sed 's/[\$\`\(\)]/0/g'`
	lua -lddmesh -e "ipcalc.print($node)"
else
	ip=`echo "$1" | sed 's/[\$\`\(\)]/0/g'`
	lua -lddmesh -e "print(iplookup(\"$ip\"))"
fi

'''usr/lib/lua/ddmesh.lua'''
--[[----------------------------------------------------------------------------------------
ddmesh.lua
library for different freifunk functions
version: 6
-------------------------------------------------------------------------------------------]]

----------------- ipcalc ---------------
ipcalc={}
ipcalc.data={}
ipcalc.data.max=2048

function split(str, delim, maxNb)
    -- Eliminate bad cases...
    if string.find(str, delim) == nil then
        return { str }
    end
    if maxNb == nil or maxNb < 1 then
        maxNb = 0    -- No limit
    end
    local result = {}
    local pat = "(.-)" .. delim .. "()"
    local nb = 0
    local lastPos
    for part, pos in string.gfind(str, pat) do
        nb = nb + 1
        result[nb] = part
        lastPos = pos
        if nb == maxNb then break end
    end
    -- Handle the last field
    if nb ~= maxNb then
        result[nb + 1] = string.sub(str, lastPos)
    end
    return result
end

function ipcalc.rCalcIp(ip)
    if ip==nil or ip=="" then return -1 end
    a = split(ip, "[.]")
    if #a ~= 4 then return -1 end
    if a[1]==nil or a[1]=="" or tonumber(a[1]) ~= 10 then return -1 end
    if a[2]==nil or a[2]=="" or tonumber(a[2]) ~= 200 and tonumber(a[2]) ~= 201 then return -1 end
    if a[3]==nil or a[3]=="" or tonumber(a[3]) < 0 or tonumber(a[3]) > 255 then return -1 end
    if a[4]==nil or a[4]=="" or tonumber(a[4]) < 0 or tonumber(a[4]) > 255 then return -1 end

    middle = a[3]
    if a[2]=="201" then middle = middle + 256 end
    minor = math.floor(a[4]/64) --x>>6 
    node = middle*4+minor	--x<<2
    if node < 0 or node > ipcalc.data.max then return -1 end
    return node
end

function ipcalc.calc(node)
    if node==nil or node=="" then return -1 end
    node=tonumber(node)
    if node==nil or node=="" then return -1 end
    if node < 0 or node > ipcalc.data.max then return -1 end

    local domain	= "freifunk-dresden.de"

    local major   = node >= 1024 and 201 or 200                     --a[2]
    local middle  = node >= 1024 and math.floor((node-1024) / 4) or math.floor(node / 4)  --a[3]
    local minor   = (node % 4) * 64 

    local meshnet	= "10"
    local nodeip  	= meshnet .. "." .. major .. "." .. middle .. "." .. minor + 1 
    local meshnetmask	= "255.0.0.0"
    local meshpre 	= 15
    local meshbroadcast = "10.255.255.255"
    local meshnetwork   = "10.200.0.0"

    local dhcpstart     = meshnet .. "." .. major .. "." .. middle .. "." .. minor + 2
    local dhcpend       = meshnet .. "." .. major .. "." .. middle .. "." .. minor + 63 
    local dhcpoffset    = 1	--used by config/dhcp 
    local dhcplimit     = 62	--used by config/dhcp
    local dhcprangepre  = 26
    local dhcprangemask = "255.255.255.192"
    local dhcpnetmask   = "255.255.255.255"
    local dhcpbroadcast = "10.255.255.255" -- needed, else dnsmasq will not start
    local dhcpnetwork   = meshnet .. "." .. major .. "." .. middle .. "." .. minor

    local hna = meshnet .. "." .. major .. "." .. middle .. "." .. minor .. "/" .. dhcprangepre
    local mesh6pre	= "48"
    local mesh6net	= "fd11:11ae:7466::"
    -- client range
    local mesh6nodenet= "fd11:11ae:7466:" .. string.format("%x", node) .. "::"
    local mesh6ip	= mesh6nodenet .. "1" 
    local mesh6nodepre= "64"

    ipcalc.data.node               = node
    ipcalc.data.domain             = domain 
    ipcalc.data.hostname           = "r" .. node
    ipcalc.data.ip                 = nodeip 
    ipcalc.data.network            = meshnetwork 
    ipcalc.data.netpre             = meshpre
    ipcalc.data.netmask            = meshnetmask 
    ipcalc.data.broadcast          = meshbroadcast 
    ipcalc.data.dhcpstart          = dhcpstart
    ipcalc.data.dhcpend            = dhcpend
    ipcalc.data.dhcpoffset	   = dhcpoffset
    ipcalc.data.dhcplimit      	   = dhcplimit
    ipcalc.data.dhcprangepre       = dhcprangepre 
    ipcalc.data.dhcprangemask      = dhcprangemask 
    ipcalc.data.dhcpnetwork        = dhcpnetwork 
    ipcalc.data.dhcpbroadcast      = dhcpbroadcast 
    ipcalc.data.dhcpnetmask        = dhcpnetmask 
    ipcalc.data.clienthna          = hna 
    ipcalc.data.mesh6ip		   = mesh6ip
    ipcalc.data.mesh6net	   = mesh6net
    ipcalc.data.mesh6pre	   = mesh6pre
    ipcalc.data.mesh6nodenet	   = mesh6nodenet
    ipcalc.data.mesh6nodepre	   = mesh6nodepre
end

function ipcalc.print(node)

    if node==nil or node=="" then print("ERROR"); return -1 end
    node=tonumber(node)
    if node==nil then print("ERROR"); return -1 end
    if node < 0 or node > ipcalc.data.max then return -1 end
    ipcalc.calc(node)

    for k,v in pairs(ipcalc.data)
    do
        print("export _ddmesh_"..k.."="..v)
    end
end

function iplookup(ip)
	if ip==nil then return -1 end
	n=ipcalc.rCalcIp(ip)
	if n == -1 then return -1 end
	ipcalc.calc(n)
	return ipcalc.data.hostname
end

function lookup(node)
	if node==nil then return -1 end
	if string.sub(node,1,1) == "r" then 
		n=tonumber(string.sub(node,2)) 
	else 
		n=tonumber(node)
	end
	if n==nil then return -1 end
	if n < 0 or n > ipcalc.data.max then return -1 end
	ipcalc.calc(n)
	return ipcalc.data.ip
end
== IPv4-Meshing mit bmxd == === Bauen === Code, letzte Commits im Feb 2011, gibts [https://github.com/axn/bmxd auf Github].
git clone git://github.com/axn/bmxd.git
cd bmxd
make -j5
strip bmxd  # Spart Platz
=== Voraussetzungen === * Lies die [http://man7.org/linux/man-pages/man8/ip-rule.8.html ip-rule Manpage] um die Abarbeitung von Regeln mit mehreren Routing-Tabellen zu verstehen. * Vergewisser dich ob der Broadcast-Adresse deines Adhoc-Interfaces. Mit ''ip addr add'' stimmte manchmal was nicht. === Starten ===
bmxd dev=adhoc0
Der Routing-Daemon daemonisiert sofort und schreibt ins Syslog. Mit bmxd -c kann man sich nun zu ihm verbinden und Informationen entlocken (siehe [[#Nützliches]]). Geht alles glatt, legt er seine Routen in den Tabellen 64 & 65 ab. Das bedeuetet, dass ein einfacher ''ip r''-Aufruf keine Meshadressen anzeigt. Erst ''ip route show table all'' bringt sie zum Vorschein. Diese Routing Tabellen werden bevorzugt, da bmxd entsprechende ''ip rule''-Regeln mit höherer Präferenz als der default-Tabelle anlegt. === Nützliches === ;Ausführliche Hilfe: :
bmxd -x
;Aktuelle Routen :
bmxd -cid8
;Aktuelle empfangene HNAs (''Host and Network Association'', Subnetze) :
bmxd -c --hnas
;HNA ankündigen :
bmxd -c -a 172.22.99.0/24
== Einzelnachweise == [[Kategorie:Projekt]]