Tutorial zum NS-3-Netzwerksimulator. Kapitel 3

Tutorial zum NS-3-Netzwerksimulator. Kapitel 3
Kapitel 1,2

3 Erste Schritte
3.1 Übersicht
3.2 Voraussetzungen
3.2.1 Herunterladen der NS-3-Version als Quellarchiv
3.3 Herunterladen von ns-3 mit Git
3.3.1 NS-3 mit Bake laden
3.4 Montage ns-3
3.4.1 Erstellen mit build.py
3.4.2 Bauen mit Bake
3.4.3 Erstellen mit Waf
3.5 Testen von ns-3
3.6 Ausführen des Skripts
3.6.1 Befehlszeilenargumente
3.6.2 Debuggen
3.6.3 Arbeitsverzeichnis

Kapitel 3

Anfangen

Dieses Kapitel soll den Leser darauf vorbereiten, mit einem Computer zu beginnen, auf dem NS-3 möglicherweise noch nie installiert wurde. Es behandelt unterstützte Plattformen, Voraussetzungen, wie Sie NS-3 erhalten, wie Sie NS-3 erstellen und wie Sie Ihren Build testen und einfache Programme ausführen.

3.1 Übersicht

Der NS-3-Simulator ist als System kollaborativer Softwarebibliotheken aufgebaut. Bei der Assemblierung wird der Code von Anwenderprogrammen mit diesen Bibliotheken verknüpft. Zum Schreiben benutzerdefinierter Programme werden die Programmiersprachen C++ oder Python verwendet.

Ns-3 wird als Quellcode verteilt, was bedeutet, dass das Zielsystem über eine Softwareentwicklungsumgebung verfügen muss, um zuerst die Bibliotheken und dann das Benutzerprogramm zu erstellen. Im Prinzip könnte ns-3 als vorgefertigte Bibliotheken für ein bestimmtes System verteilt werden, und in Zukunft könnten sie auch auf diese Weise verteilt werden. Aber heutzutage erledigen viele Benutzer ihre Arbeit tatsächlich, indem sie ns-3 selbst bearbeiten, daher ist es nützlich, den Quellcode zum Erstellen der Bibliotheken zu haben. Wenn jemand die Arbeit übernehmen möchte, fertige Bibliotheken und Pakete für Betriebssysteme zu erstellen, wenden Sie sich bitte an die Mailingliste NS-Entwickler.

Als Nächstes sehen wir uns drei Möglichkeiten zum Herunterladen und Erstellen von NS-3 an. Die erste besteht darin, die offizielle Version von der Hauptseite herunterzuladen und zu erstellen. Die zweite besteht in der Auswahl und Zusammenstellung von Kopien der Entwicklungsversionen der NS-3-Basisinstallation. Die dritte besteht darin, zusätzliche Build-Tools zu verwenden, um mehr Erweiterungen für NS-3 zu laden. Wir gehen jedes einzelne durch, da die Werkzeuge leicht unterschiedlich sind.

Erfahrene Linux-Benutzer fragen sich vielleicht, warum NS-3 nicht wie die meisten anderen Bibliotheken, die einen Paketmanager verwenden, als Paket bereitgestellt wird? Obwohl es Binärpakete für verschiedene Linux-Distributionen (z. B. Debian) gibt, bearbeiten die meisten Benutzer am Ende die Bibliotheken und müssen ns-3 selbst neu erstellen. Daher ist es praktisch, den Quellcode zur Verfügung zu haben. Aus diesem Grund konzentrieren wir uns auf die Installation aus dem Quellcode.

Für die meisten Anwendungen sind NS-3-Rechte erforderlich Wurzel nicht benötigt werden, empfiehlt es sich, ein unprivilegiertes Benutzerkonto zu verwenden.

3.2 Voraussetzungen

Der gesamte Satz verfügbarer NS-3-Bibliotheken weist eine Reihe von Abhängigkeiten von Bibliotheken Dritter auf, aber zum größten Teil kann NS-3 mit Unterstützung für mehrere gängige (häufig standardmäßig installierte) Komponenten erstellt und verwendet werden: einen C++-Compiler, Python, ein Quellcode-Editor (z. B. vim, Emacs oder Eclipse) und, wenn Entwicklungsrepositorys verwendet werden, Git-Versionskontrollsysteme. Die meisten Erstbenutzer müssen sich keine Sorgen machen, wenn ihre Konfiguration meldet, dass einige erweiterte NS-3-Funktionen fehlen, aber für diejenigen, die eine vollständige Installation wünschen, stellt das Projekt ein Wiki bereit, das Seiten mit vielen nützlichen Tipps und Tricks enthält. Eine dieser Seiten ist die Installationsseite mit Installationsanweisungen für verschiedene Systeme, verfügbar unter: https://www.nsnam.org/wiki/Installation.

Im Abschnitt „Voraussetzungen“ dieses Wikis wird erklärt, welche Pakete zur Unterstützung gängiger NS-3-Optionen erforderlich sind, und es werden auch die Befehle bereitgestellt, mit denen sie auf gängigen Linux- oder macOS-Varianten installiert werden können.

Sie können diese Gelegenheit nutzen, um die NS-3-Wiki-Seite oder die Hauptwebsite zu erkunden: https://www.nsnam.org, weil es dort viele Informationen gibt. Ab der neuesten Version von ns-3 (ns-3.29) sind die folgenden Tools zum Ausführen von ns-3 erforderlich:

Toolpaket/Version

  • C++-Compiler
    clang++ oder g++ (g++ Version 4.9 oder höher)
  • Python
    Python2-Version >= 2.7.10 oder Python3-Version >=3.4
  • Git
    jede aktuelle Version (um auf ns-3 auf GitLab.com zuzugreifen)
  • Teer
    jede aktuelle Version (zum Entpacken der NS-3-Version)
  • bunzip2
    jede aktuelle Version (zum Entpacken der NS-3-Version)

Geben Sie Folgendes ein, um die Standardversion von Python zu überprüfen: python -V. Geben Sie Folgendes ein, um die G++-Version zu überprüfen: g++ -v. Sollten Tools fehlen oder zu alt sein, lesen Sie bitte die Installationsanleitung auf der NS-3-Wiki-Seite.

Von nun an gehen wir davon aus, dass der Leser Linux, MacOS oder einen Linux-Emulator ausführt und mindestens über die oben genannten Tools verfügt.

3.2.1 Herunterladen der NS-3-Version als Quellarchiv

Dies ist die Vorgehensweise für einen neuen Benutzer, der die neuesten Release- und Paketversionen von ns-3 herunterladen und damit experimentieren möchte. NS-3-Releases werden als komprimierte Quellarchive veröffentlicht, manchmal auch „ Tarball. Tarball ist ein spezielles Software-Archivformat, bei dem mehrere Dateien zusammengefügt werden. Das Archiv ist normalerweise komprimiert. NS-3-Bootvorgang über Tarball ist ganz einfach: Sie müssen lediglich eine Version auswählen, herunterladen und entpacken.

Nehmen wir an, dass Sie als Benutzer ns-3 in einem lokalen Verzeichnis namens erstellen möchten Arbeitsplatz. Sie können eine Arbeitskopie der Veröffentlichung erhalten, indem Sie Folgendes in die Linux-Konsole eingeben (natürlich durch die entsprechenden Versionsnummern ersetzen):

$ cd 
$ mkdir workspace 
$ cd workspace 
$ wget https://www.nsnam.org/release/ns-allinone-3.29.tar.bz2 
$ tar xjf ns-allinone-3.29.tar.bz2 

Achten Sie auf das oben verwendete Dienstprogramm wget, ein Befehlszeilentool zum Herunterladen von Objekten aus dem Internet. Wenn Sie es nicht installiert haben, können Sie hierfür Ihren Browser verwenden.

Wenn Sie diese Schritte befolgen, gelangen Sie zum Verzeichnis ns-allinone-3.29. Dort sollten Sie mehrere Dateien und Verzeichnisse sehen

$ cd ns-allinone-3.29
$ ls
bake constants.py ns-3.29 README
build.py netanim-3.108 pybindgen-0.17.0.post58+ngcf00cc0 util.py

Sie sind nun bereit, die NS-3-Basisdistribution zu erstellen und können mit dem Abschnitt zum Erstellen von NS-3 fortfahren.

3.3 Herunterladen von ns-3 mit Git

Der NS-3-Code ist in den Git-Repositories auf GitLab.com unter verfügbar https://gitlab.com/nsnam/. Gruppe nsname vereint die verschiedenen Repositories, die von einem Open-Source-Projekt verwendet werden.

Der einfachste Weg, Git-Repositorys zu verwenden, besteht darin, die Umgebung zu forken oder zu klonen ns-3-Allinon. Hierbei handelt es sich um eine Reihe von Skripten, die das Laden und Zusammenstellen der am häufigsten verwendeten NS-3-Subsysteme verwalten. Wenn Sie neu bei Git sind, sind Ihnen die Begriffe „Fork“ und „Klon“ möglicherweise unbekannt. Wenn ja, empfehlen wir Ihnen, das Repository auf GitLab.com einfach wie folgt zu klonen (Ihre eigene Kopie zu erstellen):

$ cd 
$ mkdir workspace 
$ cd workspace 
$ git clone https://gitlab.com/nsnam/ns-3-allinone.git 
$ cd ns-3-allinone 

Zu diesem Zeitpunkt die Ansicht Ihres Verzeichnisses ns-3-Allinon etwas anders als das oben beschriebene Release-Archivverzeichnis. Es sollte ungefähr so ​​aussehen:

$ ls
build.py constants.py download.py README util.py

Bitte beachten Sie, dass es ein Skript gibt download.py, wodurch zusätzlich NS-3 und der zugehörige Quellcode extrahiert werden. Hier haben Sie die Wahl: Laden Sie entweder den neuesten NS-3-Entwicklungs-Snapshot herunter:

$ python download.py

oder bevorzugen Sie die NS-3-Version mit der Flagge -n um die Veröffentlichungsnummer anzugeben:

$ python download.py -n ns-3.29

Nach diesem Schritt zum Verzeichnis ns-3-Allinon Zusätzliche Repositorys werden heruntergeladen ns-3, backen, pybindgen и netanim.

Beachten
Auf einer Maschine mit sauberem Ubuntu 16.04 musste ich den Befehl wie folgt ändern: $ sudo python3 download.py -n ns-3.29 (im Folgenden Anmerkungen des Übersetzers).

3.3.1 NS-3 mit Bake laden

Die beiden oben genannten Methoden (Quellarchiv oder Repository ns-3-Allinon über Git) sind nützlich, um die einfachste NS-3-Installation mit mehreren Addons zu erhalten(pybindgen um Python-Bindungen zu generieren und netanim für Netzwerkanimationen). Das dritte standardmäßig in ns-3-allinone bereitgestellte Repository heißt backen.

Backen ist ein Tool zum koordinierten Erstellen von Software aus mehreren Repositories, das für das NS-3-Projekt entwickelt wurde. Backen kann verwendet werden, um Entwicklungsversionen von NS-3 zu erhalten sowie Erweiterungen der Basisversion der NS-3-Distribution, wie z. B. die Umgebung, herunterzuladen und zu erstellen Direkte Codeausführung, CradleNetwork Simulationswiege, die Möglichkeit, neue Python-Bindungen und verschiedene NS-3-„Apps“ zu erstellen.

Beachten
CradleNetwork Simulation Cradle ist ein Framework, mit dem Sie echte TCP/IP-Netzwerkstacks in einem Netzwerksimulator verwenden können.

Wenn Sie erwarten, dass Ihre NS-3-Installation über erweiterte oder zusätzliche Funktionen verfügt, können Sie diesem Installationspfad folgen.

In den neuesten NS-3-Versionen Backen wurde zur Tar-Version hinzugefügt. Die Version enthält eine Konfigurationsdatei, die es Ihnen ermöglicht, die zum Zeitpunkt der Veröffentlichung aktuellen Softwareversionen herunterzuladen. Das ist zum Beispiel die Version Backen, das mit der Version ns-3.29 verteilt wird, kann zum Abrufen von Komponenten für diese Version von ns-3 oder früher verwendet werden, kann jedoch nicht zum Abrufen von Komponenten für spätere Versionen verwendet werden (wenn die Paketbeschreibungsdatei Bakeconf.xml Nicht aktualisiert).

Sie können auch die neueste Kopie erhalten backenindem Sie den folgenden Befehl in Ihre Linux-Konsole eingeben (vorausgesetzt, Sie haben Git installiert):

$ cd 
$ mkdir workspace 
$ cd workspace 
$ git clone https://gitlab.com/nsnam/bake.git

Wenn Sie den Git-Befehl ausführen, sollten Sie etwa Folgendes sehen:

Cloning into 'bake'...
remote: Enumerating objects: 2086, done. 
remote: Counting objects: 100% (2086/2086), done. 
remote: Compressing objects: 100% (649/649), done. 
remote: Total 2086 (delta 1404), reused 2078 (delta 1399) 
Receiving objects: 100% (2086/2086), 2.68 MiB | 3.82 MiB/s, done. 
Resolving deltas: 100% (1404/1404), done.

Nachdem der Befehl abgeschlossen ist klonen Sie sollten ein Verzeichnis mit dem Namen haben backen, dessen Inhalt etwa so aussehen sollte:

$ cd bake
$ ls
bake bakeconf.xml bake.py doc examples generate-binary.py test TODO

Beachten Sie, dass Sie mehrere Python-Skripte geladen haben, ein Python-Modul namens backen und eine XML-Konfigurationsdatei. Der nächste Schritt besteht darin, diese Skripte zu verwenden, um die NS-3-Distribution Ihrer Wahl herunterzuladen und zu erstellen. Es stehen mehrere Anpassungsziele zur Verfügung:

  1. ns-3.29: Modul, das der Veröffentlichung entspricht; Es werden Komponenten heruntergeladen, die der Veröffentlichung im Tarball ähneln.

  2. ns-3-dev: ein ähnliches Modul, aber unter Verwendung von Code aus dem Entwicklungsbaum;

  3. ns-allinon-3.29: Ein Modul, das weitere zusätzliche Funktionen wie Click-Routing und Network Simulation Cradle, Openflow für ns-3, enthält.

  4. ns-3-Allinon: ähnlich der Release-Version des Moduls allinone, aber für Entwicklungscode.

Beachten
Klicken Sie auf Kostenlos erhalten und dann auf Installieren. — modulare Softwarearchitektur zur Erstellung von Routern.

Openflow ist ein Protokoll zur Verwaltung des Verarbeitungsprozesses von Daten, die von Routern und Switches über ein Datennetzwerk übertragen werden, und implementiert softwaredefinierte Netzwerktechnologie.

Den aktuellen Entwicklungs-Snapshot (keine Veröffentlichung) von ns-3 finden Sie unter:https://gitlab.com/nsnam/ns-3-dev.git.

Die Entwickler versuchen, diese Repositorys in einem konsistenten Betriebszustand zu halten, sie befinden sich jedoch im Entwicklungsbereich und enthalten unveröffentlichten Code. Wenn Sie also nicht vorhaben, neue Funktionen zu verwenden, wählen Sie die offizielle Version.

Sie können die neueste Version des Codes finden, indem Sie die Liste der Repositorys durchsuchen oder die Webseite „ns-3 Releases“ aufrufen:https://www.nsnam.org/releases/ und klicken Sie auf den Link zur neuesten Version. In diesem Beispiel fahren wir mit ns-3.29 fort.

Um nun die benötigten NS-3-Komponenten zu erhalten, verwenden wir das Tool Backen. Lassen Sie uns ein paar einleitende Worte zur Arbeit sagen Backen.

Bake funktioniert, indem es Paketquellen in ein Verzeichnis lädt Quelle und Installieren der Bibliotheken im Build-Verzeichnis. Backen kann durch Verweis auf die Binärdatei ausgeführt werden, aber wenn Sie es ausführen möchten Backen nicht aus dem Verzeichnis, in dem es heruntergeladen wurde, ist es ratsam, den Pfad zu hinzuzufügen backen zu Ihrem Pfad (Umgebungsvariable PATH), zum Beispiel wie folgt (Beispiel für Linux-Bash-Shell). Gehen Sie in das Verzeichnis „bake“ und legen Sie dann die folgenden Umgebungsvariablen fest:

$ export BAKE_HOME=`pwd` 
$ export PATH=$PATH:$BAKE_HOME:$BAKE_HOME/build/bin 
$ export PYTHONPATH=$PYTHONPATH:$BAKE_HOME:$BAKE_HOME/build/lib

Dadurch wird das Programm platziert backen.py zum Shell-Pfad und ermöglicht anderen Programmen, die von ihm erstellten ausführbaren Dateien und Bibliotheken zu finden backen. In einigen Anwendungsfällen backen, ist die oben beschriebene PATH- und PYTHONPATH-Einstellung nicht erforderlich, aber ein vollständiger Build von ns-3-allinone (mit zusätzlichen Paketen) erfordert sie normalerweise.

Gehen Sie in Ihr Arbeitsverzeichnis und geben Sie Folgendes in die Konsole ein:

$ ./bake.py configure -e ns-3.29

Als nächstes werden wir fragen Backen Überprüfen Sie, ob wir über genügend Werkzeuge verfügen, um die verschiedenen Komponenten zu laden. Wählen:

$ ./bake.py check

Sie sollten etwa Folgendes sehen:

> Python - OK 
> GNU C++ compiler - OK 
> Mercurial - OK 
> Git - OK 
> Tar tool - OK 
> Unzip tool - OK 
> Make - OK 
> cMake - OK 
> patch tool - OK 
> Path searched for tools: /usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin ...

Insbesondere Upload-Tools wie Mercurial, CVS, Git und Bazaar sind in diesem Schritt unerlässlich, da sie uns den Zugriff auf den Code ermöglichen. Installieren Sie an dieser Stelle die fehlenden Tools auf die für Ihr System übliche Weise (sofern Sie wissen, wie) oder wenden Sie sich an Ihren Systemadministrator, um Hilfe zu erhalten.

Versuchen Sie als Nächstes, die Software herunterzuladen:

$ ./bake.py download

Das Ergebnis sollte etwa so aussehen:

>> Searching for system dependency setuptools - OK 
>> Searching for system dependency libgoocanvas2 - OK 
>> Searching for system dependency gi-cairo - OK 
>> Searching for system dependency pygobject - OK 
>> Searching for system dependency pygraphviz - OK 
>> Searching for system dependency python-dev - OK 
>> Searching for system dependency qt - OK 
>> Searching for system dependency g++ - OK 
>> Downloading pybindgen-0.19.0.post4+ng823d8b2 (target directory:pybindgen) - OK 
>> Downloading netanim-3.108 - OK 
>> Downloading ns-3.29 - OK

Dies bedeutet, dass drei Quellen heruntergeladen wurden. Gehen Sie nun in das Quellverzeichnis und geben Sie ls; ein. Das solltest du sehen:

$ cd source 
$ ls
netanim-3.108 ns-3.29 pybindgen

Jetzt können Sie die NS-3-Distribution erstellen.

3.4 Montage ns-3

Wie beim Herunterladen von NS-3 gibt es mehrere Möglichkeiten, NS-3 zu erstellen. Das Wichtigste, was wir betonen möchten, ist, dass NS-3 mit einem Build-Tool namens erstellt wird Wafnachstehend beschrieben. Die meisten Benutzer werden damit arbeiten Waf, aber es gibt ein paar praktische Skripte, die Ihnen den Einstieg oder die Organisation komplexerer Builds erleichtern. Also bitte, bevor Sie darüber lesen Waf, schau mal rein build.py und Montage mit backen.

3.4.1 Erstellen mit build.py

Achtung! Dieser Build-Schritt ist nur ab der wie oben beschrieben erhaltenen Quellarchivversion verfügbar. und nicht über Git oder Bake heruntergeladen.

Beim Arbeiten mit einem Release-Archiv TarballIn ns-3-Allinon Es gibt ein praktisches Skript, das den Zusammenbau der Komponenten erleichtern kann. Es heißt build.py. Dieses Programm richtet das Projekt auf die nützlichste Weise für Sie ein. Beachten Sie jedoch, dass eine fortgeschrittenere Einrichtung und Arbeit mit NS-3 normalerweise die Verwendung des NS-3-eigenen Build-Systems Waf erfordert, das später in diesem Tutorial vorgestellt wird.

Wenn Sie mit heruntergeladen haben Tarball, dann in Ihrem Verzeichnis ~/Arbeitsbereich ein Verzeichnis mit einem Namen wie etwa ns-allinon-3.29. Gebe folgendes ein:

$ ./build.py --enable-examples --enable-tests

Wenn angerufen build.py Wir haben Befehlszeilenargumente verwendet, um die in diesem Tutorial verwendeten Beispiele und Tests zu erstellen, die in NS-3 nicht standardmäßig erstellt werden. Standardmäßig baut das Programm auch alle verfügbaren Module auf. Wenn Sie möchten, können Sie dann ns-3 ohne Beispiele und Tests erstellen oder Module ausschließen, die für Ihre Arbeit nicht benötigt werden.

Während das Skript die verschiedenen von Ihnen geladenen Teile erstellt, werden viele Compiler-Ausgabemeldungen angezeigt. Zuerst versucht das Skript, den Animator zu erstellen netanim, dann der Bindungsgenerator pybindgen und schließlich ns-3. Wenn der Vorgang abgeschlossen ist, sollten Sie Folgendes sehen:

Waf: Leaving directory '/path/to/workspace/ns-allinone-3.29/ns-3.29/build'
'build' finished successfully (6m25.032s) 

Modules built:
antenna                aodv                     applications
bridge                 buildings                config-store
core                   csma                     csma-layout
dsdv                   dsr                      energy 
fd-net-device          flow-monitor             internet
internet-apps          lr-wpan                  lte
mesh                   mobility                 mpi
netanim (no Python)    network                  nix-vector-routing 
olsr                   point-to-point           point-to-point-layout 
propagation            sixlowpan                spectrum 
stats                  tap-bridge               test (no Python) 
topology-read          traffic-control          uan 
virtual-net-device     visualizer               wave 
wifi                   wimax 

Modules not built (see ns-3 tutorial for explanation):
brite                  click                    openflow 
Leaving directory ./ns-3.29

In den letzten drei Zeilen der Auflistung sehen wir eine Meldung über Module, die nicht erstellt wurden:

Modules not built (see ns-3 tutorial for explanation):
brite                     click

Dies bedeutet einfach, dass einige NS-3-Module, die von externen Bibliotheken abhängen, möglicherweise nicht erstellt wurden oder dass sie für diese Konfiguration nicht erstellt werden müssen. Dies bedeutet nicht, dass der Simulator nicht zusammengebaut ist oder dass die zusammengebauten Module nicht ordnungsgemäß funktionieren.

3.4.2 Bauen mit Bake

Wenn Sie oben Bake verwendet haben, um Quellcode aus den Projekt-Repositorys abzurufen, können Sie ihn weiterhin zum Erstellen von ns-3 verwenden. Wählen:

$ ./bake.py build

und Sie sollten etwas sehen wie:

>> Building pybindgen-0.19.0.post4+ng823d8b2 - OK 
>> Building netanim-3.108 - OK 
>> Building ns-3.29 - OK

Tooltip: Sie können die Download- und Build-Schritte auch gleichzeitig ausführen, indem Sie „bake.pyploy“ aufrufen.

Der Zusammenbau aller Komponenten schlägt möglicherweise fehl, der Zusammenbau wird jedoch fortgesetzt, wenn eine Komponente nicht benötigt wird. Beispielsweise gab es kürzlich ein Problem mit der Portabilität castxml Kann mit Werkzeug zusammengebaut werden backen nicht auf allen Plattformen. In diesem Fall erscheint eine Meldung wie diese:

>> Building castxml - Problem 
> Problem: Optional dependency, module "castxml" failed
This may reduce the functionality of the final build.
However, bake will continue since "castxml" is not an essential dependency.
For more information call bake with -v or -vvv, for full verbose mode.

Aber castxml Wird nur benötigt, wenn Sie aktualisierte Python-Bindungen erstellen möchten. Für die meisten Benutzer besteht hierfür keine Notwendigkeit (zumindest bis sie ns-3 ändern), daher können solche Warnungen vorerst getrost ignoriert werden.

Wenn dies fehlschlägt, erhalten Sie mit dem folgenden Befehl einen Hinweis auf fehlende Abhängigkeiten:

$ ./bake.py show

Die verschiedenen Abhängigkeiten der Pakete, die Sie erstellen möchten, werden aufgelistet.

3.4.3 Erstellen mit Waf

Bis zu diesem Punkt haben wir zum Erstellen von ns-3 entweder das Skript verwendet build.py, oder Werkzeug backen. Diese Tools sind nützlich zum Erstellen von NS-3 und zum Verwalten von Bibliotheken. Tatsächlich führen sie zum Erstellen das Build-Tool aus Waf aus dem Verzeichnis ns-3. Waf mit dem NS-3-Quellcode installiert. Die meisten Benutzer gehen schnell dazu über, den NS-3 direkt zu konfigurieren und zusammenzubauen Waf. Um fortzufahren, wechseln Sie bitte in das NS-3-Verzeichnis, das Sie ursprünglich erstellt haben.

Dies ist zu diesem Zeitpunkt nicht unbedingt erforderlich, es kann jedoch hilfreich sein, ein wenig zurückzugehen und zu sehen, wie Sie Änderungen an der Projektkonfiguration vornehmen können. Die wahrscheinlich nützlichste Konfigurationsänderung, die Sie vornehmen können, besteht darin, eine optimierte Version des Codes zu erstellen. Standardmäßig haben Sie Ihr Projekt so konfiguriert, dass eine Debug-Version erstellt wird. Schauen wir uns ein Projekt an, um einen optimierten Build zu erstellen. Um Waf zu erklären, dass optimierte Builds mit Beispielen und Tests erstellt werden sollen, müssen Sie die folgenden Befehle ausführen:

$ ./waf clean 
$ ./waf configure --build-profile=optimized --enable-examples --enable-tests

Dies wird gestartet Waf außerhalb des lokalen Verzeichnisses (für Ihre Bequemlichkeit). Der erste Befehl bereinigt den vorherigen Build. Dies ist normalerweise nicht unbedingt erforderlich, aber eine bewährte Vorgehensweise (siehe auch Build-Profile unten); Dadurch werden zuvor erstellte Bibliotheken und Objektdateien im Verzeichnis gelöscht bauen/. Wenn das Projekt neu konfiguriert wird und das Build-System die verschiedenen Abhängigkeiten überprüft, sollten Sie eine Ausgabe ähnlich der folgenden sehen:

Setting top to      : /home/ns3user/workspace/bake/source/ns-3-dev
Setting out to      : /home/ns3user/workspace/bake/source/ns-3-dev/build
Checking for 'gcc' (C compiler)        : /usr/bin/gcc 
Checking for cc version                : 7.3.0 
Checking for 'g++' (C++ compiler)      : /usr/bin/g++ 
Checking for compilation flag -march=native support : ok 
Checking for compilation flag -Wl,--soname=foo support : ok 
Checking for compilation flag -std=c++11 support       : ok 
Checking boost includes   : headers not found, please ,!provide a --boost-includes argument (see help) 
Checking boost includes   : headers not found, please ,!provide a --boost-includes argument (see help) 
Checking for program 'python'            : /usr/bin/python 
Checking for python version >= 2.3       : 2.7.15 python-config                                                                     : /usr/bin/python-config
Asking python-config for pyembed '--cflags --libs --ldflags' flags : yes
Testing pyembed configuration                                      : yes
Asking python-config for pyext '--cflags --libs --ldflags' flags   : yes
Testing pyext configuration                                        : yes

Checking for compilation flag -fvisibility=hidden support          : ok 
Checking for compilation flag -Wno-array-bounds support            : ok 
Checking for pybindgen location          : ../pybindgen ,!(guessed) 
Checking for python module 'pybindgen'   : 0.19.0. ,!post4+g823d8b2 
Checking for pybindgen version           : 0.19.0. ,!post4+g823d8b2 
Checking for code snippet                : yes 
Checking for types uint64_t and unsigned long equivalence : no 
Checking for code snippet                                 : no 
Checking for types uint64_t and unsigned long long equivalence     : yes 
Checking for the apidefs that can be used for Python bindings                       : gcc-LP64 
Checking for internal GCC cxxabi         : complete 
Checking for python module 'pygccxml'    : not found 
Checking for click location              : not found 
Checking for program 'pkg-config'        : /usr/bin/pkg- ,!config 
Checking for 'gtk+-3.0'                  : not found 
Checking for 'libxml-2.0'                : yes 
checking for uint128_t                   : not found 
checking for __uint128_t                 : yes 
Checking high precision implementation   : 128-bit integer ,!(default) 
Checking for header stdint.h             : yes 
Checking for header inttypes.h           : yes 
Checking for header sys/inttypes.h       : not found 
Checking for header sys/types.h          : yes 
Checking for header sys/stat.h           : yes 
Checking for header dirent.h             : yes 
Checking for header stdlib.h             : yes 
Checking for header signal.h             : yes 
Checking for header pthread.h            : yes 
Checking for header stdint.h             : yes 
Checking for header inttypes.h           : yes 
Checking for header sys/inttypes.h       : not found
Checking for library rt                  : yes 
Checking for header sys/ioctl.h          : yes 
Checking for header net/if.h             : yes 
Checking for header net/ethernet.h       : yes 
Checking for header linux/if_tun.h       : yes 
Checking for header netpacket/packet.h   : yes 
Checking for NSC location                : not found 
Checking for 'sqlite3'                   : not found 
Checking for header linux/if_tun.h       : yes 
Checking for python module 'gi'          : 3.26.1 
Checking for python module 'gi.repository.GObject'      : ok 
Checking for python module 'cairo'                      : ok 
Checking for python module 'pygraphviz'                 : 1.4rc1 
Checking for python module 'gi.repository.Gtk'          : ok 
Checking for python module 'gi.repository.Gdk'          : ok 
Checking for python module 'gi.repository.Pango'        : ok 
Checking for python module 'gi.repository.GooCanvas'    : ok 
Checking for program 'sudo'                             : /usr/bin/sudo 
Checking for program 'valgrind'                         : not found 
Checking for 'gsl' : not found python-config            : not found 
Checking for compilation flag -fstrict-aliasing support : ok 
Checking for compilation flag -fstrict-aliasing support : ok 
Checking for compilation flag -Wstrict-aliasing support : ok 
Checking for compilation flag -Wstrict-aliasing support : ok 
Checking for program 'doxygen'                          : /usr/bin/doxygen
---- Summary of optional ns-3 features:
Build profile : optimized
Build directory : 
BRITE Integration : not enabled (BRITE not enabled (see option --with- ,!brite)) 
DES Metrics event collection : not enabled (defaults to disabled) 
Emulation FdNetDevice        : enabled 
Examples                     : enabled 
File descriptor NetDevice    : enabled 
GNU Scientific Library (GSL) : not enabled (GSL not found) 
Gcrypt library               : not enabled
(libgcrypt not found: you can use ,!libgcrypt-config to find its location.) GtkConfigStore               : not enabled (library 'gtk+-3.0 >= 3.0' not fou   nd)
MPI Support                  : not enabled (option --enable-mpi not selected)
ns-3 Click Integration       : not enabled (nsclick not enabled (see option --with- ,!nsclick))
ns-3 OpenFlow Integration   : not enabled (Required boost libraries not found) 
Network Simulation Cradle    : not enabled (NSC not found (see option --with-nsc))
PlanetLab FdNetDevice         : not enabled (PlanetLab operating system not detected ,!(see option --force-planetlab)) PyViz visualizer : enabled 
Python API Scanning Support   : not enabled (Missing 'pygccxml' Python module)
Python Bindings : enabled 
Real Time Simulator           : enabled 
SQlite stats data output      : not enabled (library 'sqlite3' not found)
Tap Bridge                    : enabled 
Tap FdNetDevice               : enabled
Tests                         : enabled 
Threading Primitives          : enabled 
Use sudo to set suid bit   : not enabled (option --enable-sudo not selected)
XmlIo                         : enabled
'configure' finished successfully (6.387s)

Bitte beachten Sie den letzten Teil der obigen Auflistung. Einige NS-3-Optionen sind standardmäßig nicht aktiviert oder erfordern Systemunterstützung, um ordnungsgemäß zu funktionieren. Um beispielsweise XmlTo zu aktivieren, muss die Bibliothek auf dem System vorhanden sein libxml-2.0. Wenn diese Bibliothek nicht gefunden wurde und die entsprechende NS-3-Funktion nicht aktiviert wurde, wird eine Meldung angezeigt. Beachten Sie auch, dass die Verwendung des Befehls möglich ist sudo um das Suid-Bit „Gruppen-ID zur Laufzeit festlegen“ für bestimmte Programme zu setzen. Es ist standardmäßig nicht aktiviert und daher wird diese Funktion als „nicht aktiviert“ angezeigt. Um schließlich eine Liste der aktivierten Optionen zu erhalten, verwenden Sie Waf mit Parameter --check-config.

Gehen wir nun zurück und wechseln wir zurück zum Debug-Build, der Beispiele und Tests enthält.

$ ./waf clean 
$ ./waf configure --build-profile=debug --enable-examples --enable-tests

Das Build-System ist nun eingerichtet und Sie können Debug-Versionen von NS-3-Programmen erstellen, indem Sie einfach Folgendes eingeben:

$ ./waf

Die oben genannten Schritte haben Sie möglicherweise gezwungen, einen Teil des NS-3-Systems zweimal zu erstellen, aber jetzt wissen Sie, wie Sie die Konfiguration ändern und optimierten Code erstellen.

Um zu überprüfen, welches Profil für eine bestimmte Projektkonfiguration aktiv ist, gibt es einen Befehl:

$ ./waf --check-profile 
Waf: Entering directory `/path/to/ns-3-allinone/ns-3.29/build' 
Build profile: debug

Das obige Szenario build.py unterstützt auch Argumente --enable-examples и --enable-tests, aber andere Optionen Waf es unterstützt nicht direkt. Das wird zum Beispiel nicht funktionieren:

$ ./build.py --disable-python

die Reaktion wird so sein:

build.py: error: no such option: --disable-python

Der spezielle Operator - - kann jedoch verwendet werden, um zusätzliche Parameter über zu übergeben wafAnstelle des oben genannten funktioniert also der folgende Befehl:

$ ./build.py -- --disable-python

weil es den Hauptbefehl generiert ./waf configure --disable-python. Hier finden Sie weitere Einführungstipps Waf.

Umgang mit Buildfehlern

NS-3-Releases werden auf den neuesten C++-Compilern getestet, die zum Zeitpunkt der Veröffentlichung auf gängigen Linux- und MacOS-Distributionen verfügbar waren. Mit der Zeit werden jedoch neue Distributionen mit neuen Compilern veröffentlicht, und diese neueren Compiler neigen dazu, bei Warnungen pedantischer zu sein. ns-3 konfiguriert seinen Build so, dass alle Warnungen als Fehler behandelt werden. Wenn Sie also eine ältere Version auf einem neueren System ausführen, kann es vorkommen, dass eine Compiler-Warnung den Build stoppt.

Beispielsweise gab es zuvor eine Veröffentlichung von ns‑3.28 für Fedora 28, die eine neue Hauptversion enthielt gcc (gcc-8). Beim Erstellen der Version ns-3.28 oder früherer Versionen unter Fedora 28 mit installiertem Gtk2+ tritt der folgende Fehler auf:

/usr/include/gtk-2.0/gtk/gtkfilechooserbutton.h:59:8: error: unnecessary parentheses ,!in declaration of ‘__gtk_reserved1’ [-Werror=parentheses] void (*__gtk_reserved1);

In Releases ab NS-3.28.1, in Waf Zur Lösung dieser Probleme steht eine Option zur Verfügung. Es deaktiviert das Setzen des „-Werror“-Flags in g++ und clang++. Dies ist die Option „--disable-werror“ und muss während der Konfiguration angewendet werden:

$ ./waf configure --disable-werror --enable-examples --enable-tests

Konfigurieren oder montieren

Einige Befehle Waf haben nur in der Konfigurationsphase eine Bedeutung, und einige sind nur in der Build-Phase gültig. Wenn Sie beispielsweise die NS-3-Emulationsfunktionen nutzen möchten, können Sie die Bit-Einstellung aktivieren suid mit sudo, wie oben beschrieben. Dadurch werden die Konfigurationsschrittbefehle überschrieben, und Sie können die Konfiguration daher mit dem folgenden Befehl ändern, der auch Beispiele und Tests enthält.

$ ./waf configure --enable-sudo --enable-examples --enable-tests

Wenn du das tust Waf wird gestartet sudoum Emulationscode-Socket-Erstellungsprogramme so zu ändern, dass sie mit Berechtigungen ausgeführt werden Wurzel. In Waf Für die Konfigurations- und Build-Schritte stehen viele weitere Optionen zur Verfügung. Geben Sie Folgendes ein, um Ihre Optionen zu erkunden:

$ ./waf --help

Im nächsten Abschnitt werden wir einige testbezogene Optionen verwenden.

Montageprofile

Wir haben bereits gesehen, wie Sie konfigurieren können Waf für Versammlungen debuggen и optimiert:

$ ./waf --build-profile=debug

Es gibt auch ein Zwischenmontageprofil, Release. Möglichkeit -d ist gleichbedeutend mit --build-profile. Das Build-Profil steuert die Verwendung von Protokollierung, Assertionen und Compiler-Optimierungsschaltern:

Tutorial zum NS-3-Netzwerksimulator. Kapitel 3

Wie Sie sehen, sind Protokollierung und Assertionen nur in Debug-Builds verfügbar. Die empfohlene Vorgehensweise besteht darin, Ihr Skript im Debug-Modus zu entwickeln und dann wiederholte Ausführungen (für Statistiken oder Parameteränderungen) in einem optimierten Build-Profil durchzuführen.

Wenn Sie Code haben, der nur in bestimmten Build-Profilen ausgeführt werden soll, verwenden Sie das Code-Wrapper-Makro:

NS_BUILD_DEBUG (std::cout << "Part of an output line..." << std::flush; timer.Start ,!()); DoLongInvolvedComputation ();
NS_BUILD_DEBUG (timer.Stop (); std::cout << "Done: " << timer << std::endl;)

Default, Waf platziert Build-Artefakte im Build-Verzeichnis. Mit der Option können Sie ein anderes Ausgabeverzeichnis angeben - -outzum Beispiel:

$ ./waf configure --out=my-build-dir

Durch die Kombination mit Build-Profilen können Sie problemlos zwischen verschiedenen Kompilierungsoptionen wechseln:

$ ./waf configure --build-profile=debug --out=build/debug
$ ./waf build
... 
$ ./waf configure --build-profile=optimized --out=build/optimized 
$ ./waf build
...

Dadurch können Sie mit mehreren Baugruppen arbeiten, ohne jedes Mal die neueste Baugruppe neu schreiben zu müssen. Wenn Sie zu einem anderen Profil wechseln, Waf wird nur es kompilieren, ohne alles komplett neu zu kompilieren.

Wenn Sie Build-Profile auf diese Weise wechseln, müssen Sie darauf achten, jedes Mal dieselben Konfigurationsoptionen bereitzustellen. Durch die Definition mehrerer Umgebungsvariablen können Sie Fehler vermeiden:

$ export NS3CONFIG="--enable-examples --enable-tests" 
$ export NS3DEBUG="--build-profile=debug --out=build/debug"
$ export NS3OPT=="--build-profile=optimized --out=build/optimized" 

$ ./waf configure $NS3CONFIG $NS3DEBUG
$ ./waf build 
... 
$ ./waf configure $NS3CONFIG $NS3OPT
$ ./waf build

Compiler und Flags

In den obigen Beispielen Waf Zum Erstellen von NS-3 wird der C++-Compiler von GCC verwendet ( g ++). Sie können jedoch die von Ihnen verwendete Version ändern Waf C++-Compiler durch Definieren der CXX-Umgebungsvariablen. Um beispielsweise den C++-Compiler Clang, clang++,

$ CXX="clang++" ./waf configure 
$ ./waf build 

Auf die gleiche Weise können Sie konfigurieren Waf Verwenden Sie die verteilte Kompilierung mithilfe von distcc:

$ CXX="distcc g++" ./waf configure 
$ ./waf build

Weitere Informationen zu distcc und verteilter Kompilierung finden Sie auf der Projektseite im Abschnitt Dokumentation. Um beim Konfigurieren von ns-3 Compiler-Flags hinzuzufügen, verwenden Sie die Umgebungsvariable CXXFLAGS_EXTRA.

Einstellung

Waf kann verwendet werden, um Bibliotheken an verschiedenen Stellen im System zu installieren. Standardmäßig befinden sich die kompilierten Bibliotheken und ausführbaren Dateien im Verzeichnis bauen, und da Waf den Speicherort dieser Bibliotheken und ausführbaren Dateien kennt, besteht keine Notwendigkeit, die Bibliotheken irgendwo anders zu installieren.

Wenn Benutzer die Installation außerhalb des Build-Verzeichnisses bevorzugen, können sie den Befehl ausführen ./waf installieren. Das Standardpräfix für die Installation ist Verzeichnis / usr / localSo ./waf installieren installiert Programme in / usr / local / bin, Bibliotheken in / Usr / local / lib und Header-Dateien in /usr/local/include. Superuser-Rechte müssen normalerweise mit einem Standardpräfix festgelegt werden, wie es bei einem typischen Befehl der Fall wäre sudo ./waf installieren. Beim Start entscheidet sich Waf zunächst für die Verwendung der gemeinsam genutzten Bibliotheken im Build-Verzeichnis und sucht dann nach Bibliotheken entlang des Pfads zu den in der lokalen Umgebung konfigurierten Bibliotheken. Daher empfiehlt es sich bei der Installation von Bibliotheken auf einem System zu überprüfen, ob die richtigen Bibliotheken verwendet werden. Benutzer können die Installation mit einem anderen Präfix auswählen, indem sie die Option während der Konfiguration übergeben --prefixzum Beispiel:

./waf configure --prefix=/opt/local

Später, nach dem Build, gibt der Benutzer den Installationsbefehl ein ./waf, wird das Präfix verwendet /opt/lokal.

Team ./waf clean muss vor der Neukonfiguration des Projekts verwendet werden, wenn die Installation verwendet werden soll Waf unter einem anderen Präfix.

Um ns-3 zu verwenden, ist daher kein Anruf erforderlich ./waf install. Die meisten Benutzer benötigen diesen Befehl nicht, weil Waf holt die aktuellen Bibliotheken aus dem Build-Verzeichnis, aber einige Benutzer könnten dies nützlich finden, wenn ihre Aktivitäten die Arbeit mit Programmen außerhalb des NS-3-Verzeichnisses beinhalten.

Waf-Single

Auf der obersten Ebene des NS-3-Quellbaums gibt es nur ein Waf-Skript. Sobald Sie mit der Arbeit beginnen, werden Sie viel Zeit im Verzeichnis verbringen scratch/ oder tiefer hineinsrc/... und gleichzeitig laufen müssen Waf. Sie können sich einfach daran erinnern, wo Sie sind, und rennen Waf следующим обрахом:

$ ../../../waf ...

Dies wird jedoch mühsam und fehleranfällig sein, daher gibt es bessere Lösungen. Eine übliche Methode ist die Verwendung eines Texteditors wie z Emacs oder vim, in dem zwei Terminalsitzungen geöffnet werden, eine zum Erstellen von NS-3 und die zweite zum Bearbeiten des Quellcodes. Wenn Sie nur haben Tarball, dann kann eine Umgebungsvariable helfen:

$ export NS3DIR="$PWD" 
$ function waff { cd $NS3DIR && ./waf $* ; } 

$ cd scratch 
$ waff build

Im Modulverzeichnis könnte es verlockend sein, ein triviales WAF-Skript wie hinzuzufügen exec ../../waf. Bitte, tun Sie das nicht. Dies ist für Neulinge verwirrend und führt, wenn es schlecht gemacht wird, zu schwer zu erkennenden Build-Fehlern. Die oben gezeigten Lösungen sind der Pfad, der verwendet werden sollte.

3.5 Testen von ns-3

Sie können die Komponententests der NS-3-Distribution ausführen, indem Sie das Skript ausführen ./test.py:

$ ./test.py

Diese Tests werden parallel durchgeführt Waf. Irgendwann sollten Sie eine Meldung sehen, die besagt:

92 of 92 tests passed (92 passed, 0 failed, 0 crashed, 0 valgrind errors)

Dies ist eine wichtige Meldung zur Identifizierung von Valgrind-Abstürzen, Abstürzen oder Fehlern, die auf Probleme mit dem Code oder Inkompatibilität zwischen Tools und Code hinweisen.

Sie sehen auch die endgültige Ausgabe von Waf und ein Tester, der jeden Test ausführt, was in etwa so aussehen wird:

Waf: Entering directory `/path/to/workspace/ns-3-allinone/ns-3-dev/build' 
Waf: Leaving directory `/path/to/workspace/ns-3-allinone/ns-3-dev/build' 
'build' finished successfully (1.799s) 

Modules built:
aodv           applications          bridge
click          config-store          core
csma           csma-layout           dsdv
emu            energy                flow-monitor
internet       lte                   mesh
mobility       mpi                   netanim
network        nix-vector-routing    ns3tcp
ns3wifi        olsr                  openflow
point-to-point point-to-point-layout propagation
spectrum       stats                 tap-bridge
template       test                  tools
topology-read  uan                   virtual-net-device
visualizer     wifi                  wimax

PASS: TestSuite ns3-wifi-interference
PASS: TestSuite histogram 

...

PASS: TestSuite object
PASS: TestSuite random-number-generators
92 of 92 tests passed (92 passed, 0 failed, 0 crashed, 0 valgrind errors)

Dieser Befehl wird normalerweise von Benutzern ausgeführt, um schnell zu überprüfen, ob die NS-3-Distribution korrekt erstellt wurde. (Beachten Sie, dass die Reihenfolge der „PASS: ...“-Zeilen unterschiedlich sein kann, das ist normal. Wichtig ist, dass die Zusammenfassungszeile am Ende des Berichts zeigt, dass alle Tests bestanden wurden; kein Test ist fehlgeschlagen oder abgestürzt.) Und WafUnd test.py parallelisiert die Arbeit auf den verfügbaren Prozessorkernen der Maschine.

3.6 Ausführen des Skripts

Normalerweise führen wir Skripte unter Kontrolle aus Waf. Dadurch kann das Build-System sicherstellen, dass die Pfade der gemeinsam genutzten Bibliotheken korrekt festgelegt sind und dass die Bibliotheken zur Laufzeit verfügbar sind. Um das Programm auszuführen, verwenden Sie einfach Waf mit Parameter - -run. Lassen Sie uns das NS-3-Äquivalent des allgegenwärtigen Programms ausführen Hallo Weltindem Sie Folgendes eingeben:

$ ./waf --run hello-simulator

Waf prüft zunächst, ob das Programm korrekt erstellt wurde und erstellt gegebenenfalls einen Build. Dann Waf führt ein Programm aus, das die folgende Ausgabe erzeugt.

Hello Simulator

Glückwunsch! Sie sind jetzt ein NS-3-Benutzer!

Was soll ich tun, wenn ich keine Ergebnisse sehe?

Wenn Sie Nachrichten sehen WafZeigt an, dass der Build erfolgreich abgeschlossen wurde, die Ausgabe wird jedoch nicht angezeigt „Hallo Simulator“, dann besteht die Möglichkeit, dass Sie im Abschnitt [Build-with-Waf] Ihren Build-Modus auf geändert haben optimiert, habe aber das Zurückschalten in den Modus verpasst debuggen. Alle in diesem Tutorial verwendeten Konsolenausgaben verwenden eine spezielle NS-3-Komponente, die die Protokollierung durchführt und zum Drucken benutzerdefinierter Nachrichten auf der Konsole verwendet wird. Die Ausgabe dieser Komponente wird automatisch deaktiviert, wenn optimierter Code kompiliert wird – er ist „optimiert“. Wenn die Ausgabe „Hello Simulator“ nicht angezeigt wird, geben Sie Folgendes ein:

$ ./waf configure --build-profile=debug --enable-examples --enable-tests

konfigurieren Waf um Debug-Versionen von NS-3-Programmen zu erstellen, die Beispiele und Tests enthalten. Anschließend sollten Sie die aktuelle Debug-Version des Codes durch Eingabe neu erstellen

$ ./waf

Wenn Sie nun das Programm ausführen hallo-simulator, sollten Sie das erwartete Ergebnis sehen.

3.6.1 Befehlszeilenargumente

Um Befehlszeilenargumente an das NS-3-Programm zu übergeben, verwenden Sie das folgende Muster:

$ ./waf --run <ns3-program> --command-template="%s <args>"

Ersetzen zum Namen Ihres Programms und zu den Argumenten. Streit - -command-template für Waf ist im Wesentlichen ein Rezept zum Erstellen der eigentlichen Befehlszeile Waf wird zur Ausführung des Programms verwendet. Waf prüft, ob der Build abgeschlossen ist, legt die Pfade der gemeinsam genutzten Bibliothek fest, verwendet dann die bereitgestellte Befehlszeilenvorlage und ersetzt den Platzhalter %s durch den Programmnamen, um die ausführbare Datei aufzurufen. Wenn Sie diese Syntax kompliziert finden, gibt es eine einfachere Version, die das Programm ns-3 und seine Argumente in einfache Anführungszeichen setzt:

$ ./waf --run '<ns3-program> --arg1=value1 --arg2=value2 ...'

Ein weiteres besonders nützliches Beispiel ist die selektive Ausführung von Testsuiten. Nehmen wir an, es gibt eine Testsuite namens mytest (tatsächlich gibt es keine). Oben haben wir das Skript ./test.py verwendet, um mehrere Tests parallel auszuführen, wodurch das Testprogramm wiederholt aufgerufen wird Testläufer. Anruf Testläufer direkt, um einen Test auszuführen:

$ ./waf --run test-runner --command-template="%s --suite=mytest --verbose"

Argumente werden an das Programm übergeben Testläufer. Da mytest nicht existiert, wird eine Fehlermeldung generiert. Geben Sie Folgendes ein, um die verfügbaren Testläuferoptionen auszudrucken:

$ ./waf --run test-runner --command-template="%s --help"

3.6.2 Debuggen

Um NS-3-Programme unter einem anderen Dienstprogramm auszuführen, beispielsweise einem Debugger (z. B. gdb) oder ein Speichertesttool (z. B. Valgrind), verwenden Sie ein ähnliches Formular - -command-template = "…". Zum Beispiel zur Ausführung im Debugger gdb Ihr Hello-Simulator NS-3-Programm mit Argumenten:

$ ./waf --run=hello-simulator --command-template="gdb %s --args <args>"

Beachten Sie, dass der NS-3-Programmname mit dem Argument geliefert wird - -run, und das Verwaltungsdienstprogramm (hier gdb) ist das erste Token im Argument - -command-template. Möglichkeit - -args Berichte gdbdass der Rest der Befehlszeile zum „untergeordneten“ Programm gehört. (Einige Versionen gdb Verstehe die Option nicht - -args. Entfernen Sie in diesem Fall die Programmargumente aus - -command-template und verwenden Sie den Befehlssatz gdb args.) Wir können dieses Rezept und das vorherige kombinieren, um den Test unter dem Debugger auszuführen:

$ ./waf --run test-runner --command-template="gdb %s --args --suite=mytest --verbose"

3.6.3 Arbeitsverzeichnis

Waf sollte von seinem Standort oben im NS-3-Baum gestartet werden. Dieser Ordner wird zum Arbeitsverzeichnis, in das die Ausgabedateien geschrieben werden. Was aber, wenn Sie diese Dateien außerhalb des NS-3-Quellbaums behalten möchten? Argument verwenden - -cwd:

$ ./waf --cwd=...

Möglicherweise ist es für Sie bequemer, die Ausgabedateien in Ihrem Arbeitsverzeichnis abzurufen. In diesem Fall kann folgende indirekte Maßnahme helfen:

$ function waff {
CWD="$PWD" 
cd $NS3DIR >/dev/null 
./waf --cwd="$CWD" $*
cd - >/dev/null 
}

Diese Ergänzung der vorherigen Version des Befehls behält das aktuelle Arbeitsverzeichnis bei und wechselt in das Verzeichnis Wafund befiehlt dann Waf um das Arbeitsverzeichnis wieder in das aktuelle Arbeitsverzeichnis zu ändern, das vor dem Start des Programms gespeichert wurde. Wir erwähnen das Team - -cwd Der Vollständigkeit halber führen die meisten Benutzer Waf einfach aus dem Verzeichnis der obersten Ebene aus und generieren dort Ausgabedateien.

Fortsetzung: Kapitel 4

Source: habr.com

Kommentar hinzufügen