Deze pagina is niet meer relevant. Het netwerk draait inmiddels weer met dynamische routering op basis van een eigen protocol. Onderaan deze pagina worden wat emails gequote uit de ontwikkeltijd daarvan. Verdere documentatie staat in de source. Er staat verder (nog) niets op de wiki erover, aan DynamicRouting pagina wordt gewerkt.

Het probleem

In het WirelessLeiden netwerk bleek de dynamische routering via OSPF niet meer goed te functioneren. Er zat een probleem in de quagga ospf implementatie. Als een verbinding voor langere tijd wegviel en deze verbinding op radio en ip niveau weer opkwam, kon ospf deze link niet meer initialiseren. De ene helft van het netwerk kon niet meer met de rest communiceren.

Oplossing

WirelessLeiden is nu overgestapt op statische routering. Hiervoor zijn een aantal scripts geschreven. In eerste instantie:

Static routing generator- en administratie scripts

nieuwe versie scripts - juli 2004

Er zijn door Lodewijk, Roland en Rick een aantal scripts gemaakt waarmee heel snel en simpel de routering kan worden berekend, gecontroleerd en worden aangepast in de nodes. Ook is er een administratie script aanwezig waarmee gekeken kan worden welke nodes online zijn en juiste route configuratie kan worden geladen naar een node.

De statisch routing is een complex geheel en als dat niet goed wordt uitgevoerd dan ontstaan er problemen. Een kleine fout heeft als gevolg dat nodes niet bereikbaar zijn voor gebruikers en de nodes onderling elkaar niet kunnen benaderen. Door gebruik te maken van deze scripts is het veel eenvoudiger om de routes te genereren, controleren en te updaten.

OSPF moet uit

Het is gebleken dat ospfd NIET mag draaien op de nodes, ook niet als zebra draait met de --keep-kernel optie. We hadden een probleem met 'verdwijnende routes' en 'nieuwe routes', dat vermoedelijk veroorzaakt werd door ospfd.

De manpage daarover zegt:

-k, --keep_kernel On startup, don't delete self inserted routes.

Na startup mag 'ie dus blijkbaar doen wat 'ie wil, en routes toevoegen mag zowiezo. Dit heeft de routering een tijdje behoorlijk in de war geschopt. Nu [augustus 2004] staat overal ospfd uit.

Scripts

Onderstaand een korte omschrijving van de scripts.
Makefile - Start het alle benodigde scripts voor de nieuwe routering
README - Heel korte uitleg over gebruik van de routering generator
admin_static.sh - Script om de statische routering te controleren en beheren
genscripts.py - Genereert voor elke node een script met de juiste routering
parseconfs.py - Haalt benodigde gegevens op uit Genesis en converteert deze
static.ml - Script die alle routes berekend voor alle nodes binnen het wireless netwerk
tr.py - Laat de berekende route tussen twee nodes zien

Er lijkt nog een tweede mechanisme te zijn waardoor routes kunnen verdwijnen. In zo'n geval zou static_route.sh opnieuw gedraaid moeten worden op de node. Lodewijk heeft hiervoor een script geschreven [24 aug 2004]. In other/static_routing-lv/ staat nu een stuffroutes.c, dat luistert naar de routing socket. Als daar een bericht over een up-komende interface langs komt draait 'ie /etc/static_route.sh. {met het commentaar:} Geen idee of het werkt trouwens, ik kan hier alleen testen dat 'ie correct ziet dat een interface up komt en dat 'ie het script probeert uit te voeren, maar ik weet niet precies wanneer die berichten verstuurd worden. als die berichten niet "hij-is-up" betekenen maar "hij-komt-up-RSN" kan er nog een korte sleep() voor het uitvoeren van /etc/static_route.sh moeten ofzo.

Benodigde software

Om de scripts te kunnen gebruiken/uitvoeren moeten onderstaande pakketten aanwezig zijn voor de Unix achtige systemen zoals FreeBSD of Linux.

Python (http://www.python.org/)
Ocaml (http://www.ocaml.org/)
SVN (http://subversion.tigris.org/)

Voor de Windows gebruikers moet ook Cygwin worden geïnstalleerd wat je een enigszins unixachtige omgeving geeft (http://cygwin.com/setup.exe)
Uitleg hoe deze pakketten worden geïnstalleerd word niet in deze handleiding uitgelegd.

Voorbereiding SVN

Voordat de gebruikt kunnen worden moet eerst een checkout worden gedaan van een tweetal mappen uit SVN.
Voor de Unixachtig systemen moet dat op de volgende manier.

#svn co http://svn.wirelessleiden.nl/svn/node-config/genesis/nodes
Hier in staan alle node configuratie gegevens zoals welke ip-nummers bij welke wireless kaart horen, locatie, antennes, polarisatie enzovoort. En worden lokaal op de hardeschijf geplaatst.

#svn co http://svn.wirelessleiden.nl/svn/node-config/other/static_routing-lv
In deze SVN map staan de benodigde scripts van en worden door het uitvoeren van deze checkout op de lokale hardeschijf gekopieerd.

Als beide mappen met een checkout op de lokale PC zijn gekopieerd dan moet de file 'Makefile' met een tekst editor worden aangepast aan de lokale situatie. Boven aan in deze file staat het pad naar de nodes directory. Dit pad verwijst naar de plek waar de originele genesis node configuratie files te vinden zijn. Verander het pad naar de lokale situatie.

Voorbeeld :

PATH_TO_GENESIS=/home/wleiden/genesis (Originele situatie)
PATH_TO_GENESIS=/home/eddie/Document/wleiden/genesis/nodes (Veranderd situatie)
Dit pad verwijst naar de plek waar de waar de originele node configuratie files te vinden zijn.

LET OP! Zorg dat de lokale computer direct verbonden is met het internet.
Er wordt een SVN checkout gedaan van de genesis map om de laatste versie van de node configuraties binnen te halen.

Uitvoeren van het script

Voor het commando 'make' uit om het script te starten.

Na een aantal seconden is het script klaar.
In de directory zijn een aantal bestanden aangemaakt waaronder 'nodelist' en 'nodes.
De file 'nodelist' bevat een overzicht van de geschreven config files en 'nodes' de gebruikte ip-nummers per node.
Er is een directory aangemaakt 'output' waarin in per node een script is aangemaakt om de routering aan te passen.

De routering is nu opnieuw berekend!

Hoe lopen de routes?

Het script 'tr.py' laat zien hoe de route tussen twee nodes op het netwerk gaat.
Het script gebruikt de gegevens die eerder zijn berekend. De namen van de twee opgegeven node moet exact zijn anders kunnen de juiste gegevens niet worden gevonden.

Voorbeeld:

# python tr.py CNodeRuben CNodeJVC <ENTER>
CNodeRuben
CNodeCetim3
CNodeMarten
CNodeROCl
CNodeJVC

In het voorbeeld is goed te zien via welke tussen nodes de route van CNodeRuben naar CNodeJVC loopt.

Route administratie

Met het script 'admin_static.sh' kan bekeken worden welke nodes er online- of offline zijn, bekijken welke configuratie revisie op de nodes aanwezig zijn en de routering aanpassen.

Node status

Met de optie 'online' word alle nodes in het netwerk gecontroleerd of ze online of offline zijn.
De uitvoer word op het scherm getoond en weggeschreven in twee bestanden.
Het bestand 'down_and_out' bevat alle nodes die niet bereikbaar zijn en het bestand 'up_and_running' de nodes die wel bereikbaar zijn.
Door achter de optie 'online' de nodenaam in te voeren word alleen van die node gecontroleerd wat de status is.

#./admin_static.sh online <ENTER>
......
of
#./admin_static.sh online ruben <ENTER>
status: ruben on

Configuratie versie

Door de optie 'check' te gebruiken kan bekeken worden welke configuratie versie aanwezig is op de nodes.
Van alle nodes in het netwerk zullen de revisie nummers getoond worden op het scherm.
Het revisie nummer dat wordt getoond is die van SVN. Door achter de optie 'check' de nodenaam in te voeren word alleen van die node het revisie nummer getoond.

#./admin_static.sh check <ENTER>
.....
of
#./admin_static.sh check ruben <ENTER>
ruben SVNREV=2556 2500

Updaten van routering

Het updaten van de routering in een node word gedaan met de optie 'update' gevolgd door de VOLLEDIGE nodenaam.
De configuratie van de node wordt dan voorzien van de laatste SVN versie die lokaal op de PC aanwezig is na het uitvoeren van de route berekening. Deze optie maakt verbinding met de node, kopieert het script 'static.sh' en voert deze uit. De uitvoer van het script word op het scherm getoond.

Er zullen wat foutmeldingen voorbij komen voor al bestaande route. De meldingen zijn niet erg

#./admin_static.sh update CNodeRuben <ENTER>
CNodeRuben got only -l for rel
net inet ip.forwarding l -> l
add net 172.31.255.2: gateway 172.16.1.41

Ook kan de routing van een aantal nodes tegelijk worden geupdate door een begin en eindpunt op te geven.

#./admin_static.sh update CNodeRuben CNnodeJVC<ENTER>

Alle nodes die in de route van van Ruben naar JVC liggen worden voorzien van een route update.

Afhankelijk van de hoeveelheid routes is het scripts na ongeveer 10 seconden klaar met de update!

Docbook

In de sourcetree is een docbook opgenomen (deze handleiding).

#make docs

Maakt een een docs/static.html aan, als toevallig debian gebruikt, ook een docs/static.pdf.

Informatie over de oude versie van statische routering

parse.pl haalt de node informatie uit genesis.

static.pl berekent de statische routes voor alle nodes en genereert voor elke node een static_route.sh script.

cope2nodes.sh kopieert de static_route.sh scripts naar de nodes.

Om de routering in WirelessLeiden aan te passen:

* link aanmaken/veranderen in Genesis

* $ ./parse.pl

* $ ./static.pl

* $ ./cope2nodes.sh

userspace loadbalancer voor Internet proxies

Dit stukje is verplaatst naar de pagina LoadBalancing

Mogelijke verdere verbeteringen in statische routering

multipath static routing:

[Lodewijk, 12 sept 2004] ik heb net een versie van static.ml gecommit die als er voor een bepaalde route meerdere gateways hetzelfde gewicht hebben, die beide gateways zal laten zien. ik wist dat OpenBSD multipath routing kon doen, en ben er van uit gegaan dat FreeBSD dat dan ook wel zou kunnen, maar dat blijkt dus niet zo te zijn.

dus voor het archief: tegen de tijd dat FreeBSD het wel kan, "static -m" geeft in die gevallen alle gateways. een voorbeeld is de route van cetim1 naar rocl, daar geeft 'ie nu als gateways cetim3 en cetim2. dat klopt, beide hebben een hop count van 2. cetim2 -> jasper -> rocl, en cetim3 -> marten -> rocl.

FreeBSD kan het overigens wel met behulp van de geporte OpenBSD packet filter, maar die zit er pas in 5.3 standaard in.

Andere idee-en: Nodig:

gen

nieuwe routing daemon

{30 sept 2004, Lodewijk}

op een groot aantal nodes draait nu al meer dan een week m'n laatste speeltje: een rechtoe-rechtaan ospf workalike, maar dan zonder onnodige dingen.

- 450 regels ocaml vs 45000(!) regels C voor alleen al ospfd. dat is overigens

- geen ethernet multicasts waar de firmware van in de war raakt, maar gewoon

- makkelijk aan te passen. de ospf workalike was in een paar uur omgewerkt

- geen count-to-infinity. het netwerk hier is klein genoeg om ipv een

en

pad?)

- die etx versie doet dat dan weer niet en stuurt alleen een routable adres

waardoor

geldt

http://svn.wirelessleiden.nl/svn/node-config/lvrouted voor de kortste-pad versie, /lvrouted-etx voor de etx versie.

route updates staan nu niet aan, maar beide versies schrijven nu (en al de laatste week) eens per minuut hun tabel naar /tmp/lvrouted.routes, en de etx versie schrijft ook een overzicht van de scores van z'n neighbors naar /tmp/lvrouted.neighbors. ik heb nog geen crashes gezien, de routes zien er goed uit, en als je er een killed dan heeft de rest dat vrij snel door.

anyway, voor de liefhebbers.

{18 oktober 2004, Lodewijk:}

er draait nu een compleet configfile-loze versie (maar nog steeds zonder echte route updates) van m'n routing daemon op alle nodes die voor mij bereikbaar waren:

AJSoft Broekplein CeTIM1 CeTIM3 Cope Dirkx Gandalf Grip Hofwijck Huub IMI Jasper Jorg Jorg2 Kaag LCPL Lebkov LvLn OBLc Plantsoen RV Rabo Robijn Ruben Rudi Rund Rustenborch Thomas UniGor UniGorN proxy2

CeTIM2 is om de een of andere reden niet te ssh'en. daar ga ik morgen wel even langs.

maar als iemand wil experimenteren, de route tabel wordt naar /tmp/lvrouted.routes geschreven, afschieten moet met kill -9, de binary is /tmp/lvrouted.opt, en die daemonized zichzelf (dus na gewoon opstarten kom je gelijk terug op de prompt, maar dan is 'ie dus in de achtergrond verder gegaan). verder *zou* een master het door moeten hebben als een client niet meer associated is, en andersom *zou* een client door moeten hebben als een interface niet meer associated is, maar dat is nog niet goed getest.

alles wat nu in 172.16.0.0/12 zit, exclusief 172.31.255.0/24, wordt automatisch als te propageren adres bestempeld, en alle subnetten kleiner of gelijk aan /28 (tot cetim en lijtweg inderdaad naar /29 zijn, dan wordt het hier ook /29) als interlink genomen. alle beschikbare adressen in zo'n subnet (exclusief netwerk, broadcast en eigen adres) worden als neighbor gezien. niet-bestaande adressen komen niet in de arp tabel, waardoor de daemon daar niet veel tijd aan kwijt is.

{21 oktober 2004, Lodewijk}

de vorige versie van de korste-pad (dus niet etx) versie van m'n route daemon nam teveel geheugen, CPU en netwerk resources om te doen wat het deed, dus staat er nu overal een nieuwe versie. in plaats van een lijst van complete paden naar endpoints te sturen, sturen nodes nu bomen naar elkaar toe. elke node kan dan met een simpele breadth-first traversal van de ontvangen bomen een eigen boom en route tabel maken. de code wordt er een stuk simpeler en sneller door, en zo'n boom is een stuk kleiner dan voor elk blad het complete pad bij te houden.

het draait nu op cetim1 cetim2 cetim3 cope lvln rund thomas cope imi jorg rv rabo lebkov unigor robijn jorg2 jasper rocl broekplein lijtweg1 lijtweg2 rustenborch hofwijck rudi zijloever jvc graficall marten en grip.

de packets die nu worden uitgewisseld zijn 1261 bytes voor 155 routeerbare adressen op 28 nodes. dat is iets meer dan 8 bytes per adres, dus het boom-zijn kost 4 bytes. dat lijkt ongeveer te kloppen, de laatste toegevoegde node had 5 adressen en vergrootte de packets precies 40 bytes. het biedt dus een hele hoop ruimte voordat de 64KB limiet gehaald wordt (= 1500+ nodes ;)

de node die het met de vorige versie het moeilijkst had is cetim3. deze heeft het meeste buren die up zijn en is een soekris. de vorige versie gebruikte constant ongeveer 50% CPU. nu is dat 10% met af en toe een piek naar 15%. die pieken zijn stukken functionaliteit die nu gedaan worden door /usr/sbin/wicontrol, /sbin/ifconfig en /sbin/arp te exec()en en de uitvoer te parsen. dat kan dus eventueel nog gefixed worden.

{note 22 oktober 2004: dit blijkt een bug te zijn. het ding checkt redelijk vaak of er interessante dingen zijn gebeurd zoals

Als een van die drie dingen zo is, gaat 'ie de route tabel berekenen en zooi rondsturen. een van die checks was fout, dus ging 'ie dat altijd doen. met dat gefixed is 'ie ook op cetim3 rustig, met af en toe een piek naar 3% CPU.

Voordeel van een hogere update frequentie is dat veranderingen natuurlijk wel snel propageren. eventueel moet daar nog discussie over komen, de CPU/netwerk belasting versus propagatie tijd.}

De vorige versie had een RSS van iets van 8MB, deze blijft onder de 3MB.

Als je wilt kijken, op de nodes waar het draait zal nu in /tmp een lvrouted.tree-<adres> staan voor elke buur, een lvrouted.mytree met de afgeleide boom en lvrouted.routes met de afgeleide route tabel.

StaticRouting (last edited 2009-09-28 06:29:39 by localhost)