Summer
2009

Wireless Mesh Network Technologies
[xx xxx] Halbkurs (PI)

VL: Monday+Wednesday, 09:00 -11:00, RUD 2x, x.xxx; Lecturer:  Dipl.-Inf. Anatolij Zubow
PR: xx:xx - xx:xx, RUD 2x, x.xxx;
Dipl.-Inf. Mathias Kurth


Computer Science Department
Systems Architecture Group

 IMPORTANT: This is a draft. The final document may differ significantly from the current version.

 

            src:wikimedia.org

 

 

 

 
Voice over IP in Wireless Mesh Networks

Moderne Internet-Anwendungen wie VoIP und Streaming A&V (vgl. YouTube, Skype, ShoutCast, …) stehen mit ihren Anforderungen an das zugrunde liegende Netzwerk im starken Kontrast zu auf TCP aufbauenden Anwendungen, die wir im 2. Praktikum gestreift haben. Beispielsweise kann ein VoIP-Strom durchaus einen moderaten Paketverlust (ohne Kompensation) verkraften, allerdings mindern größere Netzwerk-Verzögerungen abrupt die Zufriedenheit der Benutzer. In diesem Praktikum untersuchen wir, wo die Grenzen des Berlin RoofNet (als ein konkretes WMN) im Bezug auf VoIP-Traffic liegen, und mit welchen Ansätzen man diese Grenzen verschieben kann.


Das Praktikum soll das Verständnis von folgenden Verfahren, Methoden, Protokollen und Werkzeugen vertiefen:

  • RTP (VoIP)
  • Wireless Medium Access in WMNs, IEEE 802.11 & IEEE 802.11e
  • Routing in WMNs, Dynamic Source Routing (DSR)
  • Leistungsbewertung mittels Netzwerksimulatoren auf Paket-Basis
  • Router-Design mit dem Click Modular Router
  • Brn.Sim, Berlin RoofNet

Voraussetzungen

  • Brn.Sim incl. Brn.Gui (Trunk, in VMWare Image schon enthalten, sonst hier)
  • Berlin RoofNet (Trunk, in VMWare Image schon enthalten, sonst http://sartrac.informatik.hu-berlin.de/brn)
  • MySQL, Java, Ant
  • Python & Java IDE (Empfehlung: Eclipse oder Netbeans)

Der Brn.Sim Netzwerksimulator

Der Brn.Sim Simulator ist eine Weiterentwicklung von JiST/SWANS (siehe Literatur) und erweitert diesen in den folgenden Punkten:

  • Physical Layer Model vergleichbar zu YANS / ns-3, weitere Fading- und Shadowing-Modelle.

  • Unterstützung von IEEE 802.11abge.

  • Unterstützung von IEEE 802.15.4 (Zigbee) aus dem Sidnet-Projekt.

  • Weitere Routing-Protokolle, bspw. die im BRN eingesetzte Variante des DSR

  • Mobilitätsmodelle aus STRAW und SWANS++.

  • RTP Implementation vergleichbar zu MMSim für OMNet++

  • Integration des Click Modular Routers

  • Deklarative Definition von Simulationen mittels Builder

  • Framework zur Erfassung und Speicherung von Messwerten

  • Framework zur automatisierten und verteilten Ausführung von Simulationen

  • Visualisierung von Messwerten durch die Brn.Gui

Der Simulator ist in mehrere Pakete gegliedert, die Sie im Verzeichnis „~/Projects/brn.sim“ einsehen können. Die Pakete „brn.distsim.*“ und „brn.gui.*“ gehören zum Verteilungs-Framework bzw. zur Visualisierung. Die GUI ist eine Eclipse RCP Anwendung. Eine ausführbare Instanz der GUI finden Sie unter „~/Projects/brn.gui.“ Für uns interessant sind die Pakete „jist.swans“ und „brn.jist.*“, die den Simulator-Kern und die Erweiterungen der Simulationsmodelle enthalten.

Starten von Simulationen, Benutzen der GUI
Starten Sie die Brn.Gui und vergewissern Sie sich, dass unter „Data Source“ der Eintrag „Simulation“ auftaucht, d.h. die GUI soll sich mit einer aktuell laufenden Simulation verbinden. Die Kommunikation zwischen Simulator und GUI erfolgt über RMI. Betätigen Sie den Button „Listen“ in der Toolbar, sodass die GUI auf kommende Simulationen wartet. Öffnen Sie eine Shell im Verzeichnis „brn.sim/brn.jist.“ Zum Übersetzen und Starten des Simulationscodes wird das Tool „Ant“ verwendet, ggf. müssen Sie die Umgebungsvariablen ANT_HOME und JAVA_HOME exportieren. Ein Aufruf „ant -p“ zeigt die verfügbaren Targets an. Starten Sie die in der Datei „SimTcpTest.py“ definierte Simulation mittels „ant run-jpy -Drun.class=res/test/SimTcpTest.py -Drun.args='--local'“. Wechseln Sie zur GUI und warten Sie, bis die Verbindung zwischen GUI und Simulation steht (Zu erkennen an den aktivierten Buttons „Run“ und „Stop“. Starten Sie die Simulation mit dem Button „Run.“ Ist die Simulation beendet, springt das Feld „Time“ von „running“ auf „end.“
Die Simulation definiert ein WMN mit 50 Knoten und dem BRN DSR Routing-Protokoll. Zwischen den Knoten 6 und 45 wird zum Zeitpunkt 100 ein TCP Fluss aufgesetzt. Erkunden Sie die Messwerte. Interessant sind insbesondere die Link-Table („Nodes 1..25/Node 1/Links/Link Table“, Anm.: Es gibt in der Simulation nur eine Link-Table, die von allen Knoten geteilt wird. Durch diesen Trick entfällt die reaktive Route Discovery). Öffnen Sie die Link-Table per Doppelklick und wählen sie unter „Diagram Services“ den Punkt „Simulation Node Placement“, um die Knoten entsprechend ihrer Position anzuordnen. Sie sehen jetzt die 50 Knoten mit entsprechenden ETT Link-Metrik (in us) zum Zeitpunkt des Simulationsendes (Zur ETT Metrik siehe Literatur; Beachten Sie, dass die Link-Table immer eine Momentaufnahme zu einem Zeitpunkt ist!). Öffnen Sie den Forward Graph („Global/Forward Graph“) und positionieren Sie die Knoten wie oben. Sie sehen den Fluss der Datenpakete durch das Netzwerk. Unter „Flow 0/Transport/troughput (avg’d)“ und „Flow 0/Transport/packet delay (avg’d)“ können Sie den Durchsatz und Delay auf Transport Layer einsehen. Das Werkzeug TcpTrace haben wir im vorangegangenen Praktikum kennengelernt. Unter „Flow 0/TcpTrace/Node 6/0.0.0.6…/*“ können Sie die Ausgaben von TcpTrace finden. Die Konfiguration ist unter „Global/Config“ einsehbar.
Machen Sie sich mit der Spezifikation der Simulation in „SimTcpTest.py“ vertraut. Es wird ein Objekt der Klasse SimTcpTest angelegt und die Methode „run“ gerufen, die in der (Java)-Basisklasse „AbstractDriver“ definiert ist. Die Basisklasse stellt die Funktionalität zum Erzeugen und Ausführen von Simulationen bereit. Durch das Argument „--local“ wird die Methode „runLocal“ in der Test-Klasse gerufen, die ein Parameter-Objekt (der Klasse „AbstractParams“) anlegt und mittels „run“ dem Treiber zur Ausführung übergibt. Aktivieren Sie die TimeBar auf Radio-Ebene (handlerRadioTimeBarLevel=ALL in der Methode runLocal) und führen Sie die Simulation erneut mit GUI aus. In der GUI erscheint zusätzlich ein Item „Global/Radio/Packet Timebar“, dass Sie per Doppelklick öffnen können. Es wird die zeitliche Abfolge des Paketaustauschs sichtbar (Siehe dazu auch die zugehörige Wiki-Seite). Mit einem JMX Klienten (jconsole, visualvm, Eclipse Plugin) können Sie auch 'live' in einen Simulationsprozess hineinschauen.
Definitionen von Szenarios mittels Paramtern und Buildern
Im originalen JiST/SWANS werden Simulationen programmatisch zusammengebaut, indem einzelne Komponenten instanziiert und verbunden werden. Alternativ dazu haben wir im Brn.Sim eine deklarative Variante bereitgestellt, mit der Sie schon im vorangegangenen Beispiel in Kontakt gekommen sind. Ausgangspunkt ist der zentrale Simulationstreiber (AbstractDriver), der aus einem Parameter-Objekt das Szenario erzeugt („run“). Das Parameter-Objekt besteht dabei rekursiv aus weiteren Parametern, die jeweils einen fest zugeordneten Builder besitzen. Der Builder erzeugt zum Simulationsbeginn aus den gegebenen Parametern die Instanzen der Simulationskomponenten. Die Parameter können per Bean XML-Serialisierung in eine textuelle Darstellung gebracht werden, die dann beispielsweise in einer Datenbank bis zur Ausführung konserviert werden kann (Hinweis: JavaBeans Persistence setzt Bean-Konforme getter/setter voraus, siehe http://openbook.galileocomputing.de/javainsel8/javainsel_14_012.htm#mj959bf4fd5b6793fae188bfdb4278f659). Die Definition eines Simulationsszenarios besteht in der Regel in der Zusammenstellung eines Parameter-Objekts. Reicht dazu die Darstellbarkeit der Parameter nicht aus, kann auch auf einen abgeleiteten Simulationstreiber bzw. abgeleitete Parameter ausgewichen werden. Sie finden die Builder im Package „brn.sim.builder“.
Erfassung und Speicherung der Simulationsergebnisse
Um Datenerfassung und Simulationsmodelle nicht unnötig zu verflechten, benutzen wir eine zusätzliche Indirektion in Form von Events. Geschieht im Simulationscode etwas bemerkenswertes, dann wird ein bezeichnendes Event ausgelöst: Empfängt beispielsweise der IEEE 802.11 MAC ein Paket, dann wird das „AbstractMac.receiveEvent“ ausgelöst. Zur Auswertung können Handler für die verschiedenen Events installiert werden. Im Package „brn.sim.handler“ finden Sie die bereits existierenden Handler. In den Parametern können sie Handler individuell aktivieren (siehe „AbstractParams.handler*“).
Zur strukturierten Speicherung von Ergebnissen steht der zentrale DataManger zur Verfügung. Dieser unterstützt die Speicherung in Dateien (Ascii oder Binary) oder in einer Datenbank (Binary oder mit Hibernate-Mapping), von der die favorisierte Variante „Binary Database“ ist. Mit dem DataManager können verschiedene DataContributions verwaltet werden. Es existiert eine Unterstützung für Properties, Diagramme (Wertpaare), Parameter und verschiedene Graphen. Aktivieren Sie die Speicherung in der Datenbank in „SimTcpTest.py“ („params.db = True“), und passen Sie ggf. die Zugangsinformationen in den Parametern an. Richten Sie die Simulations-Datenbank ein: Starten Sie den MySQL Datenbankserver und legen Sie einen Simulations-Nutzer an (Bspw. „create user 'distsim'@’localhost’ identified by 'distsim'; grant all on *.* to 'distsim’@’localhost’;“). Erstellen Sie eine Simulations-Datenbank (“ant db-init -Ddb.name=’simulation’”). Starten Sie jetzt die Simulation. Öffnen Sie nach deren Ende die Brn.Gui und wählen Sie als „Data Source“ den Eintrag „Database“. Füllen Sie die Felder „Database“, „Db Host“, „Db User“ und „Db Password“ aus. Die „Job Id“ wird selbstständig von der Datenbank vergeben. Betätigen Sie den Butten „Open Database Browser“ in der Toolbar und navigieren Sie zur Studie „test“ (Falls der MySQL Treiber nicht gefunden wurde, müssen Sie diesen unter „plugins/org.eclipse.birt.report.data.oda.jdbc*/drivers“ ergänzen). Wählen Sie die passende „Job Id“ aus und klicken Sie auf „Listen“, um die Simulationsergebnisse zu öffnen. Die Bedienung ist nun analog zu dem bereits oben Beschriebenen.
Automatisierte Ausführung von Simulationen mittels Brn.Distsim
Die automatisierte Ausführung von Simulationen ist besonders hilfreich, wenn man viele Simulationen mit verschiedenen Parametern ausführen will. Zusätzlich kann man dabei mehrere Prozessoren oder Rechner benutzen, um di e Gesamt-Simulationszeit zu verkürzen. Wir wollen uns in dem folgenden Beispiel auf das erstgenannte Feature beschränken. In diesem Fall wird nur ein einziger Simulationsrechner benutzt, daher können wir das Simulations-Archiv „distsim.zip“ mit allen Quellen im lokalen Dateisystem hinterlegen (Im Falle der Verteilung bräuchten wir zusätzlich einen FTP-Server). Mit dem Aufruf „ant distsim-local-jpy -Ddriver.class=res/test/SimDiversityThroughput.py -Ddriver.version=Single01.4” hinterlegen Sie die Simulationsdefinitionen in der Datenbank. Sie können die generierten Simulationen und den Bearbeitungsstand der Simulation mit dem „Database Browser“ in der Brn.Gui einsehen. Öffnen Sie das Programm „SimDiversityThroughput.py.“ Die Klasse „SimDiversityThroughput“ ist wieder von „AbstractDriver“ abgeleitet und überschreibt die Methode „getSimulationSuite“. Diese Methode generiert in Abhängigkeit der angegebenen Version eine Liste von Parameter-Objekten, die für eine spätere Bearbeitung in der Datenbank hinterlegt werden.
Zum Ausführen der gespeicherten Simulationen steht der Wrapper bereit. Wechseln Sie in das Verzeichnis „brn.distsim.wrapper“ und starten Sie „ant run-jmx -Dbrn.distsim.jmxremote.http.port=8080“. Auf Port 8080 öffnet der Wrapper ein Administrationsinterface. Rufen Sie über dieses die Funktion „startWrapperAll“ mit den Parametern „hostname 1:1“ und den Datenbank-Zugangsdaten auf, wobei für hostname der entsprechende Hostname anzugeben ist. Dadurch wird eine Wrapper-Instanz auf dem lokalen System gestartet, die Simulationen aus der angegebenen Datenbank bearbeitet. Analog kann über „stopWrapperAll“ der Wrapper gestoppt werden. Im „Database Browser“ sollte nun der veränderte Bearbeitungsstatus angezeigt werden. Es stehen weitere Ant Targets zur Maintenance der Datenbank zur Verfügung („ant db-*“), beispielsweise um eine noch aktive Studie komplett als abgebrochen zu markieren. Wollen Sie eine gespeicherte Simulation reproduzieren (beispielsweise weil diese zu einem Fehler führte), dann reicht es, die XML-Konfiguration aus dem „Database Browser“ in eine Datei zu speichern und dem Simulationstreiber per „runFile“ bzw. über die Kommandozeile per „--file“ zu übergeben. Zur Auswertung kann die Methode „AbstractDriver. evalSimulationResults“ überschrieben werden, die über das Ant Target „distsim-eval-jpy“ aufgerufen wird. Ein Beispiel dazu ist auch in „SimDiversityThroughput.py“ zu finden. Beachten Sie, dass in dem Beispiel binär aus der Datenbank gelesen wird („DbBinaryLoader“), geschrieben wird aber mit Hilfe eines dynamischen Hibernate-Mappings („DbSaver“). Die zu ladenden Objekte werden über ihren Namen und Pfad (so wie in der GUI ersichtlich) referenziert. Die Speicherung per Hibernate Mapping hat den Vorteil, dass man die erzeugten Daten einfach in Office-Tools weiterverarbeiten kann (nach entsprechenden Joins). Weitere Einzelheiten zum Distsim-Framework können Sie der entsprechenden Studienarbeit entnehmen.
Integration des Click Modular Router mittels brn.jist.click
In Click ist ein zwei-stufiger Ansatz vergleichbar mit GnuRadio umgesetzt: Die Basisblöcke sind Paket-orientierte Elemente, die in C++ implementiert sind. Diese können mit Hilfe der Click-Sprache in Form von Datenflussgraphen zusammengesetzt werden. Weitere Informationen und Tutorials sind auf der Website des Projekts zu finden. Die Click-Konfiguration des BRN liegt unter „click/configurations/main“ und ist in mehrere Teile gegliedert. Die Konfigurationen für die Simulation und die reale Hardware unterscheiden sich leicht: Die Elemente „ToDevice“, „FromDevice“, etc. sind nur auf realer Hardware verfügbar, in der Simulation weichen wir auf die Elemente „ToSimDevice“, etc. aus. Dazu reicht es, in der Konfiguration die Includes auszutauschen. In der Simulation benutzen wir eine bereits expandierte Konfiguration, in der die nötigen Änderungen schon enthalten sind (siehe dazu „brn.jist.rtp/res/click/meshnode.click“). Der Click Router in Brn.Sim ersetzt den Net und Routing Layer des Simulators. Zusätzlich muss ein angepasster Mac verwendet werden, der die Konvertierung der Pakete in das von Click erwartete Format vornimmt.
Das Paket nsclick kombiniert Click und den Netzwerksimulator ns-2 (siehe Literatur). Analog dazu macht es das Projekt „brn.jist.click“ möglich, einen in Click verfassten Router in Brn.Sim zu simulieren. Übersetzen Sie dazu die Quellen des BRN mit den Optionen „--disable-userlevel --disable-linuxmodule --enable-nsclick --enable-jistclick --enable-gateway --enable-dhcp --enable-analysis“ (in VMWare schon vorbereitet). Betrachten wir zum Einstieg ein Beispiel: Wechseln Sie in das Verzeichnis „brn.jist.rtp“ und führen Sie die Simulation RtpTest mittels „ant run-jpy -Drun.class=res/test/RtpTest.py -Drun.args='--local'“ aus. Der Simulator erwartet, dass die Umgebungsvariable „CLICK_HOME“ auf das BRN-Verzeichnis zeigt (in unserem Fall auf „~/Projects/click/click-core), um den Click Router dynamisch laden zu können. In der Simulation wird ein bidirektionaler RTP Fluss zwischen zwei Knoten aufgesetzt, der mit Hilfe der Berlin RoofNet Software im Click geroutet wird. Die GUI kann den „Forward Graph“ nicht mehr anzeigen, da das Routing komplett in Click geschieht. Es gibt aber eine ClickGui (Parameter „clickGui“), mit der man live in den laufenden Router schauen kann, um beispielsweise die Link Table auszulesen. Zusätzlich kann man im Click Flussgraphen Debug-Elemente einbringen (bspw. Print oder ToDump, siehe dazu die Element-Übersicht auf der Click-Website), um die Vorgänge im Click nachzuvollziehen. Aktivieren Sie in der Simulation die Parameter „dumpNet“, „dumpMac“ und „handlerRadioTimeBar“, um Pcap-Dateien und die RadioTimebar zu generieren (Vorsicht: Die RadioTimebar hält alle gesendeten Pakete im Speicher; sie ist daher nur für 'kleine' Simulationen anwendbar). Versuchen Sie, die Aktivitäten in der RadioTimebar nachzuvollziehen. Der Inhalt der Pakete kann mittels Wireshark aus den Mac-Pcaps entnommen werden. Analysieren Sie die erzeugten Net-Pcap-Dateien im Wireshark („Statistics->RTP“, evtl. vorher als RTP kennzeichnen mittels Kontextmenü und „Decode as“).

Aufgaben

  1. Machen Sie sich mit dem Simulator vertraut: Vollziehen Sie den Abschnitt „Der Brn.Sim Netzwerksimulator“ nach.
     

  2. In diesem Praktikum sollen Sie ermitteln, wie viele gleichzeitige VoIP Gespräche im Berlin RoofNet mit akzeptabler Qualität möglich sind. Eine verbreitete Variante von VoIP ist die Kombination von SIP und RTP (Bspw. bei SipGate im Einsatz). Das Session Initiation Protocol (SIP) dient dabei der Signalisierung des Anrufs. Der Datentransport ist davon losgelöst mittels dem Real-time Transport Protocol (RTP) realisiert. Wir beschränken uns in unserer Betrachtung auf den Datentransport und ignorieren die Signalisierung. In unserem Fall ist eine Sitzung eine bidirektionale Kommunikation zweier Knoten. Beide Teilnehmer nutzen dabei den G.711 Standard ohne Silence Supression und einem Paketisierungsinterval von 20 ms. Als Routing-Protokoll soll das BRN DSR (in der Simulator- und Click-Variante) zum Einsatz kommen. Bedenken Sie, dass das Routing-Protokoll einige Zeit zum Stabilisieren der Routingtabellen braucht. Es soll keine Bitraten-Adaption stattfinden (24 Mbps). Verwenden Sie das BER-basierte Radiomodell und Achten Sie darauf, dass auf MAC Ebene kein RTS/CTS Austausch stattfindet. Verwenden Sie kein Shadowing- oder Fading-Modell. Analysieren Sie die Ausgaben mit dem Werkzeug Wireshark. Entscheiden Sie, welche Größen für Aussagen über die Performance aussagekräftig sind. Ab welchem Punkt ist die Gesprächsqualität nicht mehr akzeptabel?
    Szenarios:

    1. AP Szenario: Ein ausgewählter Knoten (AP) stellt die Verbindung zum Internet her (In unserem Fall terminiert dieser die Verbindungen). Um diesen herum sind Klienten angeordnet, die direkt mit dem AP kommunizieren und jeweils eine Verbindung ins Internet starten.

    2. AP Mixed Workload: Analog zu a), allerdings ist zeitgleich ein TCP Fluss zwischen AP und einer STA aktiv.

    3. Multi-Hop Internet Gateway Szenario: Analog zu a), allerdings bedient der Internet Gateway (AP) auch Klienten, die mehrere Hops entfernt sind.
       

  3. Messen Sie die VoIP-Performance des BRN (mit Routing im Simulator und anschließend mit Click-Routing) in allen Szenarios in Abhängigkeit der Parameter und stellen Sie die Ergebnisse grafisch dar. Welche Probleme im Zusammenhang mit der Leistung von VoIP können Sie in Ihren Ergebnissen ausmachen, und wo liegen deren Ursachen?

Zusatz

Mit dem Berlin RoofNet steht uns ein reales Maschennetzwerk auf IEEE 802.11 Basis zur Verfügung. Sie können Ihre Simulationsergebnisse zusätzlich im Berlin RoofNet validieren. Nehmen Sie dazu Kontakt mit Ihrem Praktikumsleiter auf, der Ihnen einen Zugang bereitstellt.

Abzugeben sind

  • Ein Bericht, der die durchzuführenden Messungen protokolliert und auswertet (HTML oder PDF). Der Versuchsaufbau und die Durchführung soll reproduzierbar beschrieben werden (Topologie, Parameter, etc.).

  • Den finalen Quellcode aus Aufgabe 3 als ein ZIP-Archiv.

Literatur

Niculescu. Performance of VoIP in a 802.11 Wireless Mesh Network. 2006.
Zhang. Wireless mesh networking, 2006.
Brn.Sim. http://sarwiki.informatik.hu-berlin.de/Brn.Sim
JiST/SWANS. http://jist.ece.cornell.edu/ 
SidNet. http://www.ece.northwestern.edu/~ocg474/SIDnet.html 
STRAW. http://www.aqualab.cs.northwestern.edu/projects/STRAW/index.php
SWANS++. http://www.aqualab.cs.northwestern.edu/projects/swans++/
Barr. JiST: An efficient approach to simulation using virtual machines, 2004.
Berlin RoofNet. http://sarwiki.informatik.hu-berlin.de/BerlinRoofNet
Click Modular Router. http://www.read.cs.ucla.edu/click/
Neufeld. Nsclick:: bridging network simulation and deployment, 2002.
Johnson, Maltz. Dynamic source routing in ad hoc wireless networks.
DeCouto. A high-throughput path metric for multi-hop wireless routing, 2005.
Awerbuch. High throughput route selection in multi-rate ad hoc wireless networks, 2003.
MMSim - Simulation of Multimedia Protocols using OMNeT++. http://www.ibr.cs.tu-bs.de/projects/mmsim/ 
RFC 3550: “RTP: A Transport Protocol for Real-Time Applications.” http://www.ietf.org/rfc/rfc3550.txt 
IEEE 802.11e Standard.
Beilke. QoS in JiST/SWANS, 2009.
Matthew Gast. 802.11 Wireless Networks: The Definitive Guide, Second Edition. O'Reilly, 2005.
Walke. IEEE 802 Wireless Systems: Protocols, Multi-Hop Mesh/Relaying, Performance and Spectrum Coexistence. Wiley & Sons, 2006.
Hermann. DistSim - Eine verteilte Umgebung zur Durchführung von parametrisierten Simulationen, 2007.
Müller. Auswahl von Internet-Gateways und VLANs im Berlin RoofNet, 2007.
Jeschke. Softwareentwicklung für drahtlose Maschennetzwerke – Fallbeispiel: BerlinRoofNet, 2007.
 
 Links
MIT
Roof Net (home page)
Berlin (Community)
WLAN Hain
Berlin Roof Net
Project Home Page
PDOS UCLA
Click Modular Router

Legal disclaimer. .  © 2024 Humboldt-Universität zu Berlin, Computer Science Department, Systems Architecture Group.Contact: sar@informatik.hu-berlin.de .