Kaynağa Gözat

Merge branch 'master' of git+ssh://map.do.freifunk.ruhr/gitit

Gitit 9 yıl önce
ebeveyn
işleme
d8663d8c74

+ 27 - 15
Community/Projekte/Nordstadt-Richtfunk.page

@@ -4,16 +4,20 @@ categories: Projekte Richtfunk
 title: Richtfunk Nordstadt
 ...
 
-(Allgemeine technische Infos zum Thema Richtfunk sind im Ordner [/Technik/Richtfunk/]().)
+(Allgemeine technische Infos zum Thema Richtfunk sind im bzw. gehören in den Ordner [/Technik/Richtfunk/]().)
 
 # Ansprechpartner
 
-Ansprechpartner für das Projekt ist *Name*. 
+Ansprechpartner für das Projekt ist die AG Richtfunk Nordstadt. Deren Kommunikation läuft über die Mailingliste freifunk-do-infra.
 
-# MitmacherInnen
+# Treffen der AG
+
+Das nächste (zweite) Treffen findet am Mittwoch, den 16. Februar 2016 im [WiLa](http://www.wissenschaftsladen-dortmund.de/wegbeschreibung/) statt.
+
+# MitmacherInnen (ggf. mit Kenntnissen / Fähigkeiten)
 
 * LuMo
-* Johannes
+* Johannes (layer 2 und 3)
 * Torben
 * Stephan
 * (trag' Dich hier ein:)
@@ -24,21 +28,29 @@ Werden hier gesammelt: [OpenStreetMap-Karte mit möglichen und realisierten Stan
 
 Achtung, im Moment kann nur Torben diese Karte bearbeiten! Wird sich noch ändern...
 
-# Eingesetzte Hardware
-
-Typ                        Name
--------------------------  ------------------------------------------------
-Ubiquiti PowerBeam AC      FF-DO-XXXXXXX
-
-# Aufbau
-
 # TO-DO
 
-* Kick-off-mail an freifunk-do (Sven - erledigt)
-* Antragstext ins Wiki (Petra) - erledigt: [/Orga/Finanzen/Antraege/Bezirksvertretung-Nord-November-2015]()
+* Konkrete Beschaffung für die erste Richtfunkstrecke vorbereiten. Die Beschaffung soll am 16.2. beschlossen werden. Bitte tragt entsprechende links (Datenblätter, Handbücher, Preislisten, ...) im Ordner [/Technik/Richtfunk/]() ein.
 * Richtfunkstandorte klarmachen (alle NordstädterInnen)
+* Selbstorganisation:-)
+* Das Projekt in Arbeitsbereiche sortieren (zB entlang der layer 0-8:)
+* Begriffsklärungen (damit wir eine gemeinsame Sprache sprechen)
+* Von den Richtfunk-Projekten anderer Communities lernen
+* Jeder sollte aus seiner Sicht das Ziel des Projektes klären, damit man in der AG drüber reden kann
 
 # Zwischenablage
 
 * [Argumente für Dachbesitzer](/Orga/Infomaterial/Argumente%20fuer%20Dachbesitzer)
-* Vom Förderverein Freie Netze: [Vertragsvorlage Gebäudeanbieter](http://download.berlin.freifunk.net/pdf/vertrag/FFN_Vertragsvorlage_Gebaeudeanbieter_MABB.pdf).
+* Vom Förderverein Freie Netze: [Vertragsvorlage Gebäudeanbieter](http://download.berlin.freifunk.net/pdf/vertrag/FFN_Vertragsvorlage_Gebaeudeanbieter_MABB.pdf).
+
+# Realisierte Installationen
+
+(Solche Infos sollten, wenn es soweit ist, wohl besser auf separaten Seiten in einem Unterordner abgelegt werden.)
+
+## Eingesetzte Hardware
+
+Typ                        Name
+-------------------------  ------------------------------------------------
+Ubiquiti PowerBeam AC      FF-DO-XXXXXXX
+
+## Aufbau

+ 23 - 25
Front Page.page

@@ -21,31 +21,6 @@ Dieses Wiki ist der Versuch, die Aktivitäten der Dortmunder Freifunk-Community
 
 Eine [Hilfe](https://url.free.de/gitit/Hilfe)-Seite zu diesem Wiki gibt es ebenfalls über einen Link in der Randspalte.
 
-# Freifunk basics
-
-- [Router aufstellen, Auswahl/Modelle, Bezugsquellen, Software, einrichten, betreuen](Technik/Router/)
-- [Mehr Infos und Hilfe im Netz](Orga/Infomaterial/Infos im Netz)
-
-
-# Ansprechpartner
-
-## Kontakt zur Dortmunder Community
-
- * per Mail: <info@freifunk-dortmund.de>
- * per Telefon: 0231 - 226 112 30 (Anrufbeantworter)
- * Mailingliste: <https://list.free.de/listinfo/freifunk-do>
-
-
-## Teams
-
-Für die einzelnen Teilbereiche sind verschiedene Teams zuständig. [Hier](Orga/Teams/Teams) findest du eine Übersicht und weitere Kontaktmöglichkeiten. 
-
-
-## Projekte
-
-Die Projekte der Dortmunder Freifunk-Community werden [hier](Community/Projekte/) dokumentiert. 
-
-
 ## Inhaltliche Gliederung
 
 Die Seiten dieses Wikis sind nach Themen in Ordnern und Unterordnern einsortiert:
@@ -70,3 +45,26 @@ Community
 :    [Tagesordnungspunkte für das nächste Monatstreffen](Community/TOPs)
 
 Wenn du eine neue Seite anlegst, speichere sie bitte in einem passenden Ordner. Gib für die Seite auch an, zu welchen Kategorien sie gehört. Dadurch wird die Seite aufgelistet, wenn jemand nach dieser Kategorie sucht. Infos zu Kategorien und sonstigem Umgang mit diesem Wiki findest du im Gitit-Wiki auf der Hilfeseite und im dortigen HOWTO-Ordner. Wenn du zu diesem Wiki etwas beitragen möchtest, lies bitte auch [Über dieses Wiki](DiesesWiki/DiesesWiki).
+
+# Ansprechpartner
+
+**Kontakt zur Dortmunder Community:**
+
+ * per Mail: <info@freifunk-dortmund.de>
+ * per Telefon: 0231 - 226 112 30 (Anrufbeantworter)
+ * Mailingliste: <https://list.free.de/listinfo/freifunk-do>
+
+
+**Teams:**
+
+Für die einzelnen Teilbereiche sind verschiedene Teams zuständig. [Hier](Orga/Teams/Teams) findest du eine Übersicht und weitere Kontaktmöglichkeiten. 
+
+**Projekte:**
+
+Die Projekte der Dortmunder Freifunk-Community werden [hier](Community/Projekte/) dokumentiert. 
+
+# Freifunk basics
+
+- [Router aufstellen, Auswahl/Modelle, Bezugsquellen, Software, einrichten, betreuen](Technik/Router/)
+- [Mehr Infos und Hilfe im Netz](Orga/Infomaterial/Infos im Netz)
+

+ 484 - 0
Technik/Routing/Fussgaengerzonenproblem-Anhang-A.page

@@ -0,0 +1,484 @@
+---
+format: DocBook
+title: Anhang: Berechnung des Routingverlaufs einer einfachen IGP-Kopplung zur Veranschaulichung des counting-to-infinity Problems
+...
+
+<article>
+  <articleinfo>
+    <title>Anhang: Berechnung des Routingverlaufs einer einfachen IGP-Kopplung zur Veranschaulichung des counting-to-infinity Problems
+</title>
+  </articleinfo>
+
+<simpara>Dieses Dokument ist ein Anhang des Dokuments <ulink url="Fussgaengerzonenproblem">Fußgängerzonenproblem</ulink>.
+
+<simpara>Im Folgenden wird die Dynamik des Routings in einer IGP-Kopplung als eine Folge von Zustandstabellen veranschaulicht. In diesem Beispiel erfolgt eine Partitionierung der Router { S } und { A B C }, was zum Kreislauf einer von S stammenden Route führt. Wie man beim Vergleich der Zustände T=5 und T=8 sieht, entsteht ein counting-to-infinity Kreislauf, der bei jedem Durchgang die Metrik der Route um 3 erhöht.</simpara>
+
+<table>
+  <tgroup cols="2">
+    <colspec align="left" />
+    <colspec align="left" />
+    <thead>
+ <row>
+        <entry>
+         Notation
+        </entry>
+      </row>
+
+    </thead>
+   <tbody>
+      <row>
+        <entry>
+         T=0, T=1, ...
+        </entry>
+        <entry>
+         Nr. des Routingzyklus. Ein Routingszyklus umfasst den Transport einer Route durch eine IGP-Instanz und ihre Verarbeitung im Router. Das läuft in allen IGPs und Routern parallel ab, sodass zum "Zeitpunkt" T=n+1 im gesamten Diagramm der Folgezustand von T=n erreicht ist.
+        </entry>
+      </row>
+
+      <row>
+        <entry>
+         S
+        </entry>
+        <entry>
+         Quellrouter für den Präfix der betrachteten Route. Der Präfix wird nicht mitnotiert, da er sich nicht ändert.
+        </entry>
+      </row>
+
+     <row>
+        <entry>
+         A, B, C	
+        </entry>
+        <entry>
+         Grenzrouter der betrachteten IGP-Kopplung.
+        </entry>
+      </row>
+
+     <row>
+        <entry>
+         a, b, c, d
+        </entry>
+        <entry>
+         IGP-Instanzen der betrachteten IGP-Kopplung.
+        </entry>
+      </row>
+
+     <row>
+        <entry>
+         1, 2, 3, ...
+        </entry>
+        <entry>
+         Metrikwerte einer einfachen hop count Metrik. Diese Metrik wird global verwendet, d.h. gilt in allen betrachteten IGPs. 
+        </entry>
+      </row>
+
+
+     <row>
+        <entry>
+         A(a) &lt;- S(1)	
+        </entry>
+        <entry>
+         Die Routingtabelle für das IGP a im Router A erhält aus dem IGP a eine Route für den betrachteten Präfix mit next hop S und Metrik 1.
+        </entry>
+     </row>
+     <row>
+        <entry>
+         —————————<br />
+         B = A:2&lt;C:3
+        </entry>
+        <entry>
+         Die zentrale Routingtabelle des Routers B enthält für den betrachteten Präfix eine Route über A mit Metrik 2, sowie eine Route über C mit Metrik 3. Tie-breaker bei gleicher Metrik ist die Router ID. "<" ist das Symbol der so entstehenden totalen Ordnungsrelation auf den Routen der zentralen Tabelle des Routers.
+        </entry>
+     </row>
+
+     <row>
+        <entry>
+         => A:1 -> b
+        </entry>
+        <entry>
+         Die Route zum betrachteten Präfix mit der Metrik 1 wird weiterhin vom Router A mit next hop self ins IGP b redistribuiert. 
+        </entry>
+     </row>
+
+     <row>
+        <entry>
+         => retract A:1 -> b
+        </entry>
+        <entry>
+         Die Route zum betrachteten Präfix mit der Metrik 1 wird vom Router A aus dem IGP b zurückgezogen.
+        </entry>
+     </row>
+     <row>
+        <entry>
+         => new B:3 -> b
+        </entry>
+        <entry>
+         Die Route zum betrachteten Präfix mit der Metrik 1 wird vom Router B mit next hop self ins IGP b exportiert, wohin sie im vorigen Zyklus noch nicht exportiert wurde.
+        </entry>
+     </row>
+     <row>
+        <entry>
+         ... *
+        </entry>
+        <entry>
+         Dieser Eintrag wurde im aktuellen Routingzyklus verändert.
+        </entry>
+     </row>
+    </tbody>
+  </tgroup>
+</table>
+
+<informaltable>
+  <tgroup cols="2">
+    <colspec align="center" />
+    <colspec align="center" />
+   <thead>
+      <row>
+        <entry>
+          Ausgangssituation <br />
+          (T=0)
+        </entry>
+        <entry>
+          A hat die direkte<br /> 
+          Route von S<br />
+          verloren<br />
+          (T=1)
+        </entry>
+        <entry>
+        </entry>
+      </row>
+ </thead>
+ <tbody>
+      <row>
+        <entry>
+          S <br />
+          |a <br />
+          A <br />
+       b / \ c <br />
+         B—C <br />
+          d 
+        </entry>
+        <entry>
+          S<br />
+   &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a <br />
+          A <br />
+       b / \ c<br />
+         B—C<br />
+          d<br />
+        </entry>
+      </row>
+    </tbody>
+  </tgroup>
+</informaltable>
+
+<table frame="all">
+  <tgroup cols="9", align='left'>
+  <thead>   
+     <row>
+        <entry>
+          T=0
+        </entry>
+        <entry>
+          T=1
+        </entry>
+        <entry>
+          T=2
+        </entry>
+        <entry>
+          T=3
+        </entry>
+        <entry>
+          T=4
+        </entry>
+        <entry>
+          T=5
+        </entry>
+        <entry>
+          T=6
+        </entry>
+        <entry>
+          T=7
+        </entry>
+        <entry>
+          T=8
+        </entry>
+      </row>
+    </thead>
+ <tbody>
+      <row>
+        <entry>
+          A(a) &lt;- S:1 <br />
+          A(b) &lt;- <br />
+          A(c) &lt;- <br />
+          —————————  <br />
+          A = S:1
+        </entry>
+        <entry>
+          A(a) &lt;- * <br />
+          A(b) &lt;- <br />
+          A(c) &lt;- <br />
+          —————————  <br />
+          A=      *
+        </entry>
+        <entry>
+          A(a) &lt;- <br />
+          A(b) &lt;- <br />
+          A(c) &lt;- <br />
+          —————————  <br />
+          A =
+        </entry>
+        <entry>
+          A(a) &lt;- <br />
+          A(b) &lt;- B4 * <br />
+          A(c) &lt;- C4 * <br />
+          —————————  <br />
+          A = B:4&lt;C:4 *
+        </entry>
+
+        <entry>
+          A(a) &lt;- <br />
+          A(b) &lt;- *<br />
+          A(c) &lt;- *<br />
+          —————————  <br />
+          A = *
+        </entry>
+        <entry>
+          A(a) &lt;- <br />
+          A(b) &lt;- <br />
+          A(c) &lt;- <br />
+          —————————  <br />
+          A =
+        </entry>
+
+        <entry>
+          A(a) &lt;- <br />
+          A(b) &lt;- B:7 *<br />
+          A(c) &lt;- <br />
+          —————————  <br />
+          A = B:7 *
+        </entry>
+        <entry>
+          A(a) &lt;- <br />
+          A(b) &lt;- *<br />
+          A(c) &lt;- <br />
+          —————————  <br />
+          A = *
+        </entry>
+        <entry>
+          A(a) &lt;- <br />
+          A(b) &lt;- <br />
+          A(c) &lt;- <br />
+          —————————  <br />
+          A =
+        </entry>
+      </row>
+      <row>
+        <entry>
+          =&gt; A:1 -&gt; b <br />
+          =&gt; A:1 -&gt; c
+        </entry>
+        <entry>
+          =&gt; retract A:1 -&gt; b * <br />
+          =&gt; retract A:1 -&gt; c *
+        </entry>
+        <entry>
+        </entry>
+        <entry>
+          =&gt; new A:4 -&gt; c *
+        </entry>
+        <entry>
+          =&gt; retract A:4 -&gt; c *
+        </entry>
+        <entry>
+        </entry>
+        <entry>
+          =&gt; new A:7 -&gt; c *
+        </entry>
+        <entry>
+          =&gt; retract A:7 -&gt; c *
+        </entry>
+        <entry>
+        </entry>
+      </row>
+      <row>
+        <entry>
+        </entry>
+      </row>
+      <row>
+        <entry>
+          B(b) &lt;- A:2<br />
+          B(d) &lt;- C:3<br />
+          —————————  <br />
+          B = A:2&lt;C:3
+        </entry>
+        <entry>
+          B(b) &lt;- A:2<br />
+          B(d) &lt;- C:3<br />
+          —————————  <br />
+          B = A:2&lt;C:3
+        </entry>
+        <entry>
+          B(b) &lt;- *<br />
+          B(d) &lt;- C:3<br />
+          —————————  <br />
+          B = C:3 *
+        </entry>
+        <entry>
+          B(b) &lt;- <br />
+          B(d) &lt;- *<br />
+          —————————  <br />
+          B = 
+        </entry>
+        <entry>
+        B(b) &lt;- <br />
+          B(d) &lt;- <br />
+          —————————  <br />
+          B = 
+        </entry>
+        <entry>
+          B(b) &lt;- <br />
+          B(d) &lt;- C:6 *<br />
+          —————————  <br />
+          B = C:6 *
+        </entry>
+        <entry>
+          B(b) &lt;- <br />
+          B(d) &lt;- *<br />
+          —————————  <br />
+          B = *
+        </entry>
+        <entry>
+          B(b) &lt;- <br />
+          B(d) &lt;- <br />
+          —————————  <br />
+          B = 
+        </entry>
+        <entry>
+          B(b) &lt;- <br />
+          B(d) &lt;- C:9 *<br />
+          —————————  <br />
+          B = C:9 *
+        </entry>
+      </row>
+      
+      
+      <row>
+        <entry>
+          =&gt; B:2 -&gt; d
+        </entry>
+        <entry>
+          =&gt; B:2 -&gt; d
+        </entry>
+        <entry>
+          =&gt; retract B:2 -&gt; d * <br />
+ 	  =&gt; new B:3 -&gt; b
+        </entry>
+        <entry>
+          =&gt; retract B:3 -&gt; b
+        </entry>
+        <entry>
+        </entry>
+        <entry>
+          =&gt; new B:6 -&gt; b
+        </entry>
+        <entry>
+          =&gt; retract B:6 -&gt; b *
+        </entry>
+        <entry>
+        </entry>
+        <entry>
+          =&gt; new B:9 -&gt; b *
+        </entry>
+      </row>
+      <row>
+        <entry>
+        </entry>     
+      </row>
+      <row>
+        <entry>
+          C(c) &lt;- A:2 <br />
+          C(d) &lt;- B:3 <br />
+          —————————  <br />
+          C = A:2&lt;B:3
+        </entry>
+        <entry>
+          C(c) &lt;- A:2 <br />
+          C(d) &lt;- B:3 <br />
+          —————————  <br />
+          C = A:2&lt;B:3
+        </entry>
+        <entry>
+          C(c) &lt;- * <br />
+          C(d) &lt;- B:3 <br />
+          —————————  <br />
+          C = B:3 *
+        </entry>
+        <entry>
+          C(c) &lt;- <br />
+          C(d) &lt;- *<br />
+          —————————  <br />
+          C = 
+        </entry>
+        <entry>
+          C(c) &lt;-A:5 * <br />
+          C(d) &lt;- *<br />
+          —————————  <br />
+          C = A:5
+        </entry>
+        <entry>
+          C(c) &lt;- * <br />
+          C(d) &lt;- <br />
+          —————————  <br />
+          C = *
+        </entry>
+        <entry>
+          C(c) &lt;- <br />
+          C(d) &lt;- <br />
+          —————————  <br />
+          C = 
+        </entry>
+        <entry>
+          C(c) &lt;- A:8 *<br />
+          C(d) &lt;- <br />
+          —————————  <br />
+          C = A:8
+        </entry>
+        <entry>
+          C(c) &lt;- *<br />
+          C(d) &lt;- <br />
+          —————————  <br />
+          C = *
+        </entry>
+      </row>
+      <row>
+        <entry>
+          =&gt; C:2 -&gt; d
+        </entry>
+        <entry>
+          =&gt; C:2 -&gt; d
+        </entry>
+        <entry>
+          =&gt; retract C:2 -&gt; d * <br />
+          =&gt; new C:3 -&gt; c *
+        </entry>
+        <entry>
+          =&gt; retract C:3 -&gt; c
+        </entry>
+        <entry>
+          =&gt; new c:5 -&gt; d *
+        </entry>
+        <entry>
+          =&gt; retract C:5 -&gt; d *
+        </entry>
+        <entry>
+        </entry>
+        <entry>
+          =&gt; new C:8 -&gt; d *
+        </entry>
+        <entry>
+          =&gt; retract C:8 -&gt; d *
+        </entry>
+      </row>
+      
+    </tbody>
+  </tgroup>
+</informaltable>

+ 24 - 0
Technik/Routing/Fussgaengerzonenproblem-Zusammenfassung.page

@@ -0,0 +1,24 @@
+---
+toc: no
+title: Zusammenfassung des Textes zur IGP-Kopplung
+...
+
+Der Beitrag [Gullivers Reisen durch das FF-Routing - oder: Vom Fußgängerzonenproblem zur IGP-Kopplung](Fussgaengerzonenproblem) ist (leider) sehr lang. Deshalb folgt hier eine knappe Zusammenfassung der wesentlichen Ergebnisse der Reise durchs FF-Routistan.
+
+- Ausgangspunkt ist das im Freifunk-Kontext bekannte sog. Fußgängerzonenproblem. Es wird als Entkopplung der Metriken zwischen benachbarten Netzbereichen analysiert.
+
+- Die erste und heute überwiegend praktizierte Lösung für das Fußgängerzonenproblem besteht darin, im kabelbasierten Netzbereich das gleiche IGP zu fahren wie im WLAN adoc Mesh der Fußgängerzone. Dies führt zu Skalierungsproblemen, u.a. durch stark zunehmenden Routingtraffic.
+
+- Die alternative und bisher unterbelichtete Lösung verwendet für beide Netzbereiche unterschiedliche IGPs. Die Routen werden zwischen den IGPs als externe Routen ausgetauscht, unter Beibehaltung der (kompatibel gewählten) Metrikwerte. So hat man weiterhin optimales Routing, aber die Topologieinformationen beider IGPs bleiben voneinander getrennt, wodurch das Routing die Skalierungsprobleme der ersten Lösung vermeidet.
+
+- Die Verallgemeinerung dieses Vorgehens nennen wir  
+  "Kopplung von IGPs = gemeinsame Metrik trotz Entkopplung der Topologien".  
+  Um dieses einfache, geradezu triviale Konzept auszuarbeiten, wird zunächst untersucht, wie IGPs in der Praxis (bei den Großen[tm]) verbunden werden. BGP und vor allem OSPF areas liefern wichtige Ideen, sind aber nicht unmittelbar für IGP-Kopplung im FF verwendbar.
+
+- Als praktische Basis für die Umsetzung einer IGP-Kopplung betrachten wir routing suites. In diesen sind bereits verschiedene IGPs integriert, und mit ihrer Hilfe können Routen zwischen den IGPs innerhalb eines Grenzrouters austauscht werden. Da routing suites Alltag sind, kommt vmtl. niemand mehr auf die Idee, IGP-Kopplung als eigenständigen Begriff zu untersuchen.
+
+- IGP-Kopplung lässt sich am einfachsten als OSPF areas ohne backbone area verstehen (prekäres OSPF;). Durch das Fehlen der backbone area wird das Routing auf der Ebene der IGP-Kopplung aber zum distance-vector Routing. Auch das ergibt optimales Routing, kann aber Probleme machen, die bei link-state Routing nicht auftreten, insb. counting-to-infinity.
+
+- Nach intensiver Auseinandersetzung mit DV und Routingschleifen ergänzen wir die einfache IGP-Kopplung um eine Schleifenverhinderung. Diese benutzt einen zur Menge eingedampften Pfadvektor bei BGP (prekäres BGP;).
+
+- Nach einem Überblick über die Anforderungen zur Umsetzung einer solchen IGP-Kopplung wird eine konkrete Implementierung mit Bird als routing suite und OSPF als (in mehreren Instanzen auftretendes) IGP beschrieben.

Dosya farkı çok büyük olduğundan ihmal edildi
+ 436 - 24
Technik/Routing/Fussgaengerzonenproblem.page


+ 411 - 0
Technik/Routing/IGP-Kopplung/bird.conf

@@ -0,0 +1,411 @@
+log syslog all;
+
+/* Definitionen fuer die Bitarithmetik der Schleifenverhinderungsmechanik */
+
+define OSPF_tag_sourcebits = 5; /* ld(32) */
+define OSPF_tag_pathbits = 32 - OSPF_tag_sourcebits;
+define OSPF_tag_pathvalue_div = 32 ; /* 2 ^ OSPF_tag_sourcebits */
+
+function fn_tag_to_source (int tagbits) {
+	return tagbits - ((tagbits / OSPF_tag_pathvalue_div) * OSPF_tag_pathvalue_div);
+}
+
+function fn_tag_to_path (int tagbits) {
+	return tagbits / OSPF_tag_pathvalue_div;
+}
+
+function fn_power_of_2 (int n) {
+	# awk 'BEGIN { for ( i=0 ; i < 32 ; i++ ) print "\t\t" i ": return " 2^i ";" }'
+	case n {
+		0: return 1;
+		1: return 2;
+		2: return 4;
+		3: return 8;
+		4: return 16;
+		5: return 32;
+		6: return 64;
+		7: return 128;
+		8: return 256;
+		9: return 512;
+		10: return 1024;
+		11: return 2048;
+		12: return 4096;
+		13: return 8192;
+		14: return 16384;
+		15: return 32768;
+		16: return 65536;
+		17: return 131072;
+		18: return 262144;
+		19: return 524288;
+		20: return 1048576;
+		21: return 2097152;
+		22: return 4194304;
+		23: return 8388608;
+		24: return 16777216;
+		25: return 33554432;
+		26: return 67108864;
+		27: return 134217728;
+		28: return 268435456;
+		29: return 536870912;
+		30: return 1073741824;
+		31: return 2147483648;
+		else: return 0;
+		}
+}
+
+function fn_instance_to_tagbit (int inst) {
+	return	fn_power_of_2(OSPF_tag_sourcebits - 1 + inst);
+}
+
+function fn_instancebit_is_set_in_ospf_tag (int inst)
+int instpathbits;
+{
+	instpathbits = fn_tag_to_path(ospf_tag) / fn_power_of_2(inst-1);
+	return	(instpathbits / 2) * 2 != instpathbits;
+}
+
+function fn_reentrybit_is_set_in_ospf_tag() {
+	return	fn_instancebit_is_set_in_ospf_tag(fn_tag_to_source(ospf_tag));
+}
+
+function fn_set_reentrybit_in_ospf_tag() {
+	ospf_tag = ospf_tag + fn_instance_to_tagbit(fn_tag_to_source(ospf_tag));
+}
+
+include "/usr/local/etc/bird.local.conf";
+
+/* Dort muss mindestens Folgendes definiert werden (Beispiel):
+
+router id 91.204.4.242;
+
+function fn_is_local_ospf_instance (int inst) {
+ 	case inst {
+		1: return true;
+		2: return true;
+		else: return false;
+	}
+}
+
+function fn_any_local_instancebit_is_set_in_ospf_tag () {
+	return	fn_instancebit_is_set_in_ospf_tag(1) ||
+		fn_instancebit_is_set_in_ospf_tag(2);
+}
+
+define Unrouted_local = [ 192.168.1.0/24+, 192.168.84.0/24+ ];
+*/
+
+define Babel_WLAN_metric_base = 1000;
+define Babel_WLAN_metric_inactive = 999;
+define OSPF_metric2_max = 16777215;
+define OSPF_preference_local	= 160;	/* > OSPF default = 150 */
+
+define HOT  = 0;
+define BEST = 1;
+define COLD = 2;
+
+##### Definitionen fuer alle bekannten IGP Instanzen:
+
+include "/usr/local/etc/bird.inst.conf";
+
+# Dort muss mindestens Folgendes definiert werden:
+#define potato_ospf1 = BEST; [... et al. ...]
+#function fn_instance_to_potato (int inst) -> int (HOT, ...)
+#function fn_proto_to_instance (string from_proto) -> int (1, 2, ...)
+#function fn_instance_to_bgpospf (int inst) -> string ("bgpXospfX")
+
+/* XXX zwecks Einrechnung der Babel Metrik, gehoert hier aber nicht hin: */
+function fn_a_Babel_WLAN_routes () {
+	return	ifname = "tap9";
+	};
+
+/* Bausteine fuer Filter. Namenskonventionen:
+   f_...	Filter (accept/reject)
+   fn_...	Funktion
+   ..._a_...	true => accept
+   ..._r_...	true => reject
+   ..._am_...	true => accept + modify
+*/
+
+function fn_a_Routed () {
+	return net ~ Routed;
+	};
+
+filter f_a_Routed {
+	if fn_a_Routed()
+	then accept;
+	else reject "Routed";
+	};
+
+function fn_r_Unrouted () {
+	return ! (net ~ Unrouted_global || net ~ Unrouted_local);
+	};
+
+filter f_r_Unrouted {
+	if fn_r_Unrouted()
+	then accept;
+	else reject "Unrouted";
+	};
+
+function fn_a_acceptable_routes () {
+	return fn_r_Unrouted() && fn_a_Routed();
+}
+ 
+/* Einrechnung der Babel Metrik: */
+function fn_include_Babel_WLAN_routes () {
+	case gw {
+		include "/var/run/bird.babeld.conf";
+		else: ospf_metric1 = ospf_metric1 + Babel_WLAN_metric_base + Babel_WLAN_metric_inactive;
+	}
+}
+
+function fn_debug_ospf_route (string str)
+{
+	print	str, " ", net, " ^", scope, " *", source,
+		" !", from, " :", gw, " (", preference, ") ",
+		igp_metric, "/", ospf_metric1, "/", ospf_metric2,
+ 		" [", ospf_tag, "]";
+		# Fuehrt zu:
+		# bird: filters, line 169: Can't operate with values of incompatible types
+		#" [", fn_tag_to_source(ospf_tag), "|", fn_tag_to_path(ospf_tag), "]";
+}
+
+function fn_debug_ospf_route_before (string str)
+{
+	printn str; fn_debug_ospf_route("?");
+}
+
+function fn_debug_ospf_route_after (string str)
+{
+	printn str; fn_debug_ospf_route("!");
+}
+
+function fn_am_local_to_ospf_table () {
+	if ! (proto ~ "ospf*") &&
+	   fn_a_acceptable_routes()
+	then if ifname ~ "lo0"
+	     then return false;	
+	     else { if preference < OSPF_preference_local
+		    then preference = OSPF_preference_local;
+		    return true; }
+	else return false;
+}
+
+function fn_am_local_to_ospf_export () {
+	if ! (proto ~ "*ospf*") &&
+	   fn_a_acceptable_routes()
+	then {	if ifname ~ "lo0"
+	      	then return false;
+	      	else # geroutete loopback Adressen auch per OSPF stubnet!
+		     if ifname ~ "lo*"
+		     then ospf_metric1 = 1;
+		     else ospf_metric1 = 10;
+		ospf_metric2 = 0;
+	       return true; }
+	else return false;
+}
+
+function fn_import_ospf_master (int from_instance) {
+	if ! fn_a_acceptable_routes()
+	then return false;
+	# Schleifenvermeidung: routes mit tags von OSPF-Instanzen,
+	# an denen dieser Router teilnimmt, sind schonmal hier
+	# durchgelaufen, und zwar mit tag = 0, d.h. ohne Uebergang
+	# zwischen OSPF-Instanzen. (Evtl. Ausnahme: Partitionierung
+	# der source Instanz, sodass die urspruengliche route nicht
+	# mit source = 0 hier ankam, sondern nur per Transit.)
+	else if ospf_tag != 0
+	then {
+		if fn_instance_to_potato(from_instance) = HOT
+		   # TBD || fn_instance_to_transit(from_instance) = false
+		then	# kein Transit durch hot potato Instanzen
+			return false;
+		else if	fn_is_local_ospf_instance(fn_tag_to_source(ospf_tag)) ||
+			fn_any_local_instancebit_is_set_in_ospf_tag()
+		then	# re-entry
+			if ! fn_reentrybit_is_set_in_ospf_tag()
+			then	# wg. counting-to-infinity
+				fn_set_reentrybit_in_ospf_tag();
+	     }
+	case from_instance {
+		/* XXX zwecks Einrechnung der Babel Metrik, gehoert hier aber nicht hin: */
+		# metric mittels /var/run/bird.babeld.conf (hoch)setzen:
+		2: fn_include_Babel_WLAN_routes();
+	     	}
+	return true;
+}
+
+
+function fn_import_master_ospf (string from_proto) {
+	return proto = from_proto;
+}
+
+/* Funktioniert nicht als Funktion, aber als Filter,
+   s. protocol pipe master2ospfX in bird.instX.conf.
+   Grumpf:-(bird 1.5.0)
+function fn_export_master_ospf () {
+	if proto ~ "ospf*"
+	then return false;
+	else return fn_am_local_to_ospf_table();
+}
+*/
+
+function fn_am_master_to_bgpospf (int dest_instance)
+int from_instance;
+{
+	if fn_a_acceptable_routes()
+	then {	from_instance = fn_proto_to_instance(proto);
+		if ospf_tag = 0		# (lokale Route, keine Transitroute)
+		then {	# route entstammt einer IGP Instanz, an der dieser
+			# router teilnimmt. Beim Uebergang in eine andere
+			# IGP Instanz muss diese route, die gerade ein
+			# lokales IGP verlaesst, mit dem tag dieser Instanz
+			# versehen werden. Kommt die route dann spaeter
+			# per transit wieder zur Urprungs-Instanz zurueck,
+			# kann sie dank des tags als Rundlauefer erkannt
+			# und entsprechend schleifenbehandelt werden.
+			ospf_tag = from_instance;
+			return true;
+		     }
+		else	if fn_instance_to_potato(from_instance) = HOT
+			   # TBD || fn_instance_to_transit(from_instance) = false
+			then	# kein Transit durch HOT Instanzen wg. Verlust der ursprünglichen Metrik
+				return false;
+			else {	if fn_reentrybit_is_set_in_ospf_tag() &&
+				   fn_instancebit_is_set_in_ospf_tag(dest_instance)
+				then	# kein counting-to-infinity
+					return false;
+				# Transit-IGP, aus dem die Route gerade kommt, in die Route "einkerben"
+				if ! fn_instancebit_is_set_in_ospf_tag(from_instance)
+				then	ospf_tag = ospf_tag + fn_instance_to_tagbit(from_instance);
+				return true;
+			     }
+	     }
+	else return false;
+}
+
+function fn_export_master_bgpospf (string dest_proto)
+int dest_instance;
+{
+	dest_instance = fn_proto_to_instance(dest_proto);
+	printn "master2bgp"; fn_debug_ospf_route_before(dest_proto);
+	if proto ~ "ospf*" &&
+	   proto != dest_proto &&
+	   fn_am_master_to_bgpospf(dest_instance)
+	then {	printn "master2bgp"; fn_debug_ospf_route_after(dest_proto);
+		bgp_local_pref = preference;
+		bgp_path.prepend(ospf_tag);
+		# optimal:
+		# -> E1 mit metric1 = Summe
+		# hot potato ("closest exit"):
+		# -> E1 mit metric1 = 0, # geht nicht: metric2 = Summe
+		# retour: automatisch mit mit metric1 = Summe, metric2 = 0
+		# cold potato ("best exit", RFC4451):
+		# -> E2 mit metric2 = Summe
+		# ?: wie geht retour E2 -> E1, d.h. wie funktioniert
+		# eine Unterscheidung von ursprünglichen E2 routes?
+		# flag im ospf_tag?
+		if # XXX geht nicht: ospf_metric2 = 16777235
+		     ospf_metric2 = OSPF_metric2_max
+		then
+			bgp_med = ospf_metric1;
+		else
+			bgp_med = ospf_metric2 + ospf_metric1;
+		# zZ unbenutzt, erscheint im show all als [ASXi]/[ASXe]
+		if ospf_tag != 0
+		then
+			if fn_reentrybit_is_set_in_ospf_tag()
+			then
+				bgp_origin = 2;
+			else
+				bgp_origin = 1;
+		else
+			bgp_origin = 0;
+		accept;
+	     }
+	else reject;
+}
+
+function fn_import_bgpospf ()
+{
+	preference = bgp_local_pref;
+	return true;
+}
+
+function fn_export_ospf (int dest_instance)
+string proto_bgpospf;
+int potato_ospf;
+{
+	proto_bgpospf = fn_instance_to_bgpospf(dest_instance);
+	potato_ospf = fn_instance_to_potato(dest_instance);
+	printn "export-", dest_instance; fn_debug_ospf_route_before("");
+	if fn_am_local_to_ospf_export()
+	then return true;
+	else if proto = proto_bgpospf
+	then {	ospf_tag = bgp_path.first;
+		# optimal:
+		# -> E1 mit metric1 = Summe
+		# hot potato ("closest exit"):
+		# -> E1 mit metric1 = 0, metric2 = Summe
+		# retour: automatisch mit mit metric1 = Summe, metric2 = 0
+		# cold potato ("best exit", RFC4451):
+		# -> E2 mit metric2 = Summe
+		# ?: wie geht retour E2 -> E1, d.h. wie funktioniert
+		#    eine Unterscheidung von ursprünglichen E2 routes?
+		#    also flag im ospf_tag kodieren?
+		# !: nein, keine E2 routen als E2 durchlassen,
+		#    weil das jede Instanz selbst entscheiden soll,
+		#    also nur bei cold potato auf E2 setzen (lassen)
+		#
+		if potato_ospf = BEST
+			then {
+				# igp_metric = bgp_med;
+				# bgp_med = 0;
+				# scope = SCOPE_ORGANIZATION;
+				ospf_metric1 = bgp_med;
+			     }
+			else if potato_ospf = HOT
+			then {
+				# geht nicht, wird beim Setzen von
+				# von ospf_metric1 genichtet:
+				# ospf_metric2 = bgp_med;
+				ospf_metric1 = 0;
+				# XXX instance mit hot potato
+				# XXX darf kein Transit sein!
+				# XXX => keine tag routes exportieren
+			     }
+			else if potato_ospf = COLD
+			     then ospf_metric2 = bgp_med;
+			printn "export-", dest_instance; fn_debug_ospf_route_after("");
+			return true;
+	     }
+	else return false;
+}
+
+protocol device {
+	scan time 10;
+}
+
+/* wg. BSD: */
+protocol direct {
+}
+
+protocol kernel kernel0 {
+	learn on;
+	scan time 5;
+	import filter f_r_Unrouted;
+	export filter f_r_Unrouted;
+}
+
+/* XXX zwecks Einrechnung der Babel Metrik, gehoert hier aber nicht hin: */
+table fib4table;
+protocol kernel kernel4 {
+	description "babel FIB 4";
+	kernel table 4;
+	table fib4table;
+	learn on;
+	scan time 10;	
+}
+
+##### Definition der IGP Instanzen, an denen dieser Router teilnimmt:
+
+include "/usr/local/etc/bird.inst.local.conf";

+ 77 - 0
Technik/Routing/IGP-Kopplung/bird.inst.conf

@@ -0,0 +1,77 @@
+define Routed = [ 0.0.0.0/0-, 91.204.4.0/22{24,32}, 195.160.168.0/23+ ];
+define Unrouted_global = [ 10.0.0.0/8+, 172.16.0.0/12+ ];
+
+define potato_ospf1 = BEST;
+define potato_ospf2 = HOT;
+
+function fn_instance_to_potato (int inst) {
+ 	case inst {
+		1: return potato_ospf1;
+		2: return potato_ospf2;
+		else: return BEST;
+	}
+}
+
+function fn_proto_to_instance (string from_proto) {
+	if from_proto = "ospf1" then return 1; else
+	if from_proto = "ospf2" then return 2; else
+	if from_proto = "ospf3" then return 3; else
+	if from_proto = "ospf4" then return 4; else
+	if from_proto = "ospf5" then return 5; else
+	if from_proto = "ospf6" then return 6; else
+	if from_proto = "ospf7" then return 7; else
+	if from_proto = "ospf8" then return 8; else
+	if from_proto = "ospf9" then return 9; else
+	if from_proto = "ospf10" then return 10; else
+	if from_proto = "ospf11" then return 11; else
+	if from_proto = "ospf12" then return 12; else
+	if from_proto = "ospf13" then return 13; else
+	if from_proto = "ospf14" then return 14; else
+	if from_proto = "ospf15" then return 15; else
+	if from_proto = "ospf16" then return 16; else
+	if from_proto = "ospf17" then return 17; else
+	if from_proto = "ospf18" then return 18; else
+	if from_proto = "ospf19" then return 19; else
+	if from_proto = "ospf20" then return 20; else
+	if from_proto = "ospf21" then return 21; else
+	if from_proto = "ospf22" then return 22; else
+	if from_proto = "ospf23" then return 23; else
+	if from_proto = "ospf24" then return 24; else
+	if from_proto = "ospf25" then return 25; else
+	if from_proto = "ospf26" then return 26; else
+	if from_proto = "ospf27" then return 27; else
+	return 0;
+}
+
+function fn_instance_to_bgpospf (int inst) {
+ 	case inst {
+		1: return "bgp1ospf1";
+		2: return "bgp2ospf2";
+		3: return "bgp3ospf3";
+		4: return "bgp4ospf4";
+		5: return "bgp5ospf5";
+		6: return "bgp6ospf6";
+		7: return "bgp7ospf7";
+		8: return "bgp8ospf8";
+		9: return "bgp9ospf9";
+		10: return "bgp10ospf10";
+		11: return "bgp11ospf11";
+		12: return "bgp12ospf12";
+		13: return "bgp13ospf13";
+		14: return "bgp14ospf14";
+		15: return "bgp15ospf15";
+		16: return "bgp16ospf16";
+		17: return "bgp17ospf17";
+		18: return "bgp18ospf18";
+		19: return "bgp19ospf19";
+		20: return "bgp20ospf20";
+		21: return "bgp21ospf21";
+		22: return "bgp22ospf22";
+		23: return "bgp23ospf23";
+		24: return "bgp24ospf24";
+		25: return "bgp25ospf25";
+		26: return "bgp26ospf26";
+		27: return "bgp26ospf27";
+		else: return "bgp?ospf?";
+	}
+}

+ 19 - 0
Technik/Routing/IGP-Kopplung/bird.inst.local.conf

@@ -0,0 +1,19 @@
+##### OSPF 1 #####
+
+include "/usr/local/etc/bird.inst1.conf";
+
+##### OSPF 2 #####
+
+include "/usr/local/etc/bird.inst2.conf";
+
+##### OSPF 3 #####
+
+#include "/usr/local/etc/bird.inst3.conf";
+
+##### OSPF 4 #####
+
+#include "/usr/local/etc/bird.inst4.conf";
+
+##### OSPF 5 #####
+
+#include "/usr/local/etc/bird.inst5.conf";

+ 40 - 0
Technik/Routing/IGP-Kopplung/bird.instX.conf

@@ -0,0 +1,40 @@
+##### OSPF X #####
+
+table ospfXtable;
+
+protocol pipe master2ospfX {
+	description "master to OSPF instance X";
+	peer table ospfXtable;
+	import filter { if fn_import_master_ospf("ospfX") then accept; else reject; };
+	# XXX geht nicht als Funktion!?!:-(
+	# export filter { if fn_export_master_ospf() then accept; else reject; };
+	export filter { if proto ~ "ospf*" then reject;
+			else if fn_am_local_to_ospf_table() then accept;
+			else reject; };
+}
+
+protocol bgp master2bgpX {
+	router id 127.0.X.0;
+	local 127.0.X.0 as 31371;
+	neighbor 127.0.X.1 as 31371;
+	next hop keep;
+	export filter {	if fn_export_master_bgpospf("ospfX") then accept; else reject; };
+}
+
+protocol bgp bgpXospfX {
+	router id 127.0.X.1;
+	local 127.0.X.1 as 31371;
+	neighbor 127.0.X.0 as 31371;
+	next hop keep;
+	table ospfXtable;
+	import filter { if fn_import_bgpospf() then accept; else reject; };
+	export none;
+}
+
+protocol ospf ospfX {
+	#debug all;
+	table ospfXtable;
+	import filter { if fn_import_ospf_master(X) then accept; else reject; };
+	export filter { if fn_export_ospf(X) then accept; else reject; };
+	include "/usr/local/etc/bird.instX.local.conf";
+}

+ 11 - 0
Technik/Routing/IGP-Kopplung/bird.instX.local.conf

@@ -0,0 +1,11 @@
+	area 0.0.0.0 {
+		# sonst ist die loopback Adresse nicht erreichbar(!)
+		stubnet	91.204.4.242/32;
+		interface "vlan2900X" {
+			cost 10;
+			priority 128;
+			type broadcast;
+			hello 10; retransmit 5; dead 40;
+			wait 3;
+		};
+	};

+ 21 - 0
Technik/Routing/IGP-Kopplung/bird.local.conf

@@ -0,0 +1,21 @@
+router id 91.204.4.242;
+
+# XXX define ospf_instance_ids = [ 1, 2 ];
+# XXX funktioniert nicht, d.h. ein Test ...
+# XXX inst ~ ospf_instance_ids
+# XXX ... gibt falschen Wert zurueck (bird 1.5.0)
+
+function fn_is_local_ospf_instance (int inst) {
+ 	case inst {
+		1: return true;
+		2: return true;
+		else: return false;
+	}
+}
+
+function fn_any_local_instancebit_is_set_in_ospf_tag () {
+	return	fn_instancebit_is_set_in_ospf_tag(1) ||
+		fn_instancebit_is_set_in_ospf_tag(2);
+}
+
+define Unrouted_local = [ 192.168.1.0/24+, 192.168.84.0/24+ ];

+ 2 - 2
_NOWIKI/gitit.conf

@@ -157,14 +157,14 @@ use-cache: yes
 cache-dir: cache
 # directory where rendered pages will be cached
 
-max-upload-size: 100K
+max-upload-size: 128K
 # specifies an upper limit on the size (in bytes) of files uploaded
 # through the wiki's web interface.
 # To disable uploads, set this to 0K.
 # This will result in the uploads link disappearing 
 # and the _upload url becoming inactive.
 
-max-page-size: 100K
+max-page-size: 128K
 # specifies an upper limit on the size (in bytes) of pages
 
 debug-mode: no

BIN
img/fuzo-3.png