673 lines
25 KiB
Plaintext
673 lines
25 KiB
Plaintext
|
||
[[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.<ref>Seite des [http://www.freifunk-dresden.de Freifunk Dresden]</ref>
|
||
|
||
== 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 <code>openwrt-ar71xx-generic-''ROUTERNAME''-squashfs-''ZUSATZ''.bin</code> zusammen.
|
||
: So ist beispielsweise die Datei <code>openwrt-ar71xx-generic-''tl-wr841n-v8''-squashfs-''factory''.bin</code> 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 <code>openwrt-ar71xx-generic-''tl-wr841n-v8''-squashfs-''sysupgrade''.bin</code> 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.<br />
|
||
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).<br />
|
||
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).
|
||
<font color="red">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.</font>
|
||
|
||
=== 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 =====
|
||
<source lang="bash">
|
||
#!/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
|
||
|
||
</source>
|
||
|
||
===== usr/lib/lua/ddmesh.lua =====
|
||
|
||
<source lang="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
|
||
</source>
|
||
----
|
||
|
||
== 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/ <code>www.freifunk-dresden.de</code>, Homepage von] [[Freifunk Dresden]]
|
||
** [https://dresden.freifunk.net/ <code>dresden.freifunk.net</code>]
|
||
** [http://wiki.freifunk-dresden.de/ <code>wiki.freifunk-dresden.de</code>, Wiki von] [[Freifunk Dresden]]
|
||
** [http://bt.freifunk-dresden.de/ Bugtracker von] [[Freifunk Dresden]]
|
||
* [http://www.ddmesh.de/ <code>www.ddmesh.de</code>] (wie auch <code>www.freifunk-dresden.de</code>)
|
||
** [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.<br/>
|
||
Derzeit enthält es noch keine techischen Informationen (ist aber in Arbeit).
|
||
<font color="red">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.</font>
|
||
|
||
=== WLAN-Einstellungen ===
|
||
|
||
In Syntax der <code>/etc/config/wireless</code> unter OpenWRT:
|
||
<pre>
|
||
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]'
|
||
</pre>
|
||
|
||
Oder manuell, bis zum nächsten Reboot:
|
||
<pre>
|
||
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
|
||
</pre>
|
||
|
||
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.
|
||
<pre>
|
||
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<br />
|
||
</pre>
|
||
|
||
'''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:
|
||
<pre>
|
||
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
|
||
</pre>
|
||
|
||
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'''
|
||
<pre>
|
||
#!/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
|
||
|
||
</pre>
|
||
|
||
'''usr/lib/lua/ddmesh.lua'''
|
||
<pre>
|
||
--[[----------------------------------------------------------------------------------------
|
||
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
|
||
</pre>
|
||
|
||
== IPv4-Meshing mit bmxd ==
|
||
|
||
=== Bauen ===
|
||
|
||
Code, letzte Commits im Feb 2011, gibts [https://github.com/axn/bmxd auf Github].
|
||
|
||
<pre>
|
||
git clone git://github.com/axn/bmxd.git
|
||
cd bmxd
|
||
make -j5
|
||
strip bmxd # Spart Platz
|
||
</pre>
|
||
|
||
=== 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 ===
|
||
|
||
<pre>bmxd dev=adhoc0</pre>
|
||
|
||
Der Routing-Daemon daemonisiert sofort und schreibt ins Syslog. Mit <code>bmxd -c</code> 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:
|
||
:<pre>bmxd -x</pre>
|
||
;Aktuelle Routen
|
||
:<pre>bmxd -cid8</pre>
|
||
;Aktuelle empfangene HNAs (''Host and Network Association'', Subnetze)
|
||
:<pre>bmxd -c --hnas</pre>
|
||
;HNA ankündigen
|
||
:<pre>bmxd -c -a 172.22.99.0/24</pre>
|
||
|
||
|
||
== Einzelnachweise ==
|
||
<references/>
|
||
|
||
[[Kategorie:Projekt]]
|