diff --git a/Freifunk_Dresden.mw b/Freifunk_Dresden.mw index 31da1a46..8dc95bd5 100644 --- a/Freifunk_Dresden.mw +++ b/Freifunk_Dresden.mw @@ -1,4 +1,3 @@ -{{Broken|Reason=Technische Details depubliziert unter [[Intern:Freifunk Dresden]].|}} [[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] @@ -343,6 +342,312 @@ Jeder Knoten bietet ein JSON-Dokument unter http://10.200.../sysinfo-json.cgi an * [https://github.com/ddmesh/firmware-freifunk-dresden Firmware auf GitHub] * [https://drive.google.com/?ddrp=1#folders/0B1LY99qDqRVPdTBNT2JEMlRkRzQ Flyer / Sticker / Kollaboration für Werbemittel] +== 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 == + +=== Knotennummer reservieren === + +Du solltest deinen Namen bei ''node'' und irgend 2× MD5 bei ''registerkey'' einsetzen. +
+curl http://register.ddmesh.de/bot.php\?node\=Puddingknoten\®isterkey\=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 ==