ns-3 Network Simulator Tutorial. Kapitel 3

ns-3 Network Simulator Tutorial. Kapitel 3
Kapitel 1,2

3 Ugefaangen
3.1 Iwwersiicht
3.2 Viraussetzunge
3.2.1 Download vun der ns-3 Verëffentlechung als Quellarchiv
3.3 Eroflueden ns-3 mat Git
3.3.1 Luede ns-3 mat Bake
3.4 Assemblée ns-3
3.4.1 Gebai mat build.py
3.4.2 Gebai mat Bake
3.4.3 Bauen mat Waf
3.5 Testen ns-3
3.6 De Skript ausféieren
3.6.1 Kommando Linn Argumenter
3.6.2 Debugging
3.6.3 Aarbechtsverzeechnes

Kapitel 3

Ufänken

Dëst Kapitel ass geduecht fir de Lieser ze preparéieren fir mat engem Computer unzefänken deen ns-3 vläicht ni installéiert huet. Et deckt ënnerstëtzt Plattformen, Viraussetzungen, wéi Dir ns-3 kritt, wéi Dir ns-3 baut, a wéi Dir Äre Baut testen an einfache Programmer ausféiert.

3.1 Iwwersiicht

Den ns-3 Simulator ass als e System vu kollaborativen Softwarebibliothéike gebaut. Wärend der Versammlung ass de Code vun de Benotzerprogrammer mat dëse Bibliothéike verbonnen. D'C ++ oder Python Programméierungssprooche gi benotzt fir personaliséiert Programmer ze schreiwen.

Ns-3 gëtt als Quellcode verdeelt, dat heescht datt den Zilsystem e Softwareentwécklungsëmfeld muss hunn fir d'éischt d'Bibliothéiken ze bauen an dann de Benotzerprogramm ze bauen. Am Prinzip kéint ns-3 als fäerdeg Bibliothéike fir e spezifesche System verdeelt ginn, an an Zukunft kënnen se op dës Manéier verdeelt ginn. Awer hautdesdaags maachen vill Benotzer tatsächlech hir Aarbecht andeems se ns-3 selwer änneren, also ass et nëtzlech de Quellcode ze hunn fir d'Bibliothéiken ze bauen. Wann iergendeen d'Aarbecht wëll iwwerhuelen fir fäerdeg Bibliothéiken a Packagen fir Betribssystemer ze kreéieren, da kontaktéiert w.e.g. d'Mailinglëscht ns-Entwéckler.

Als nächst wäerte mir dräi Weeër kucken fir ns-3 erofzelueden an ze bauen. Déi éischt ass fir déi offiziell Verëffentlechung vun der Haaptsäit erofzelueden an ze bauen. Déi zweet ass d'Auswiel an d'Versammlung vun Exemplare vun Entwécklungsversiounen vun der Basis ns-3 Installatioun. Déi drëtt ass zousätzlech Build Tools ze benotzen fir méi Extensiounen fir ns-3 ze lueden. Mir ginn duerch jidderee well d'Tools liicht anescht sinn.

Erfuerene Linux Benotzer kënne sech froen firwat ns-3 net als Package geliwwert gëtt wéi déi meescht aner Bibliothéiken déi e Package Manager benotzen? Obwuel et binär Pakete fir verschidde Linux Verdeelungen (zB Debian) ginn, sinn déi meescht Benotzer um Enn d'Bibliothéiken z'änneren an d'ns-3 selwer opzebauen, sou datt de Quellcode verfügbar ass praktesch. Aus dësem Grond konzentréiere mir eis op d'Installatioun vun der Quell.

Fir déi meescht Uwendungen ns-3 Rechter root sinn net néideg, et ass recommandéiert en onprivilegéierte Benotzerkont ze benotzen.

3.2 Viraussetzunge

De ganze Set vu verfügbare ns-3 Bibliothéiken huet eng Zuel vun Ofhängegkeete vun Drëtt-Partei-Bibliothéiken, awer zum gréissten Deel kann ns-3 gebaut a benotzt ginn mat Ënnerstëtzung fir verschidde gemeinsam (oft Standard installéiert) Komponenten: e C++ Compiler, Python, e Quellcode Editor (zum Beispill, vim, Emacs oder Sonnendäischtert) an, wann Entwécklungsrepositories benotzt ginn, Git Versiounskontrollsystemer. Déi meescht éischte Kéier Benotzer brauche keng Suergen ze maachen wann hir Konfiguratioun e puer ns-3 fortgeschratt Features fehlt, awer fir déi, déi eng voll Installatioun wëllen, bitt de Projet eng Wiki déi Säiten mat vill nëtzlechen Tipps an Tricks enthält. Eng esou Säit ass d'Installatiounssäit, mat Installatiounsinstruktiounen fir verschidde Systemer, verfügbar op: https://www.nsnam.org/wiki/Installation.

D'Viraussetzunge Sektioun vun dëser Wiki erklärt wéi eng Packagen erfuerderlech sinn fir allgemeng ns-3 Optiounen z'ënnerstëtzen a liwwert och d'Befehle fir se op gemeinsame Goûten vu Linux oder MacOS z'installéieren.

Dir kënnt vun dëser Geleeënheet profitéieren fir d'ns-3 Wiki Säit oder d'Haaptwebsäit z'entdecken: https://www.nsnam.org, well do ass vill Informatioun. Vun der leschter Versioun vun ns-3 (ns-3.29) unzefänken, sinn déi folgend Tools erfuerderlech fir ns-3 ze lafen:

Tool Package / Versioun

  • C++ Compiler
    clang++ oder g++ (g++ Versioun 4.9 oder méi héich)
  • Python
    python2 Versioun >= 2.7.10, oder python3 Versioun >=3.4
  • goen
    all lescht Versioun (fir Zougang zu ns-3 op GitLab.com)
  • tar
    all lescht Versioun (fir d'ns-3 Verëffentlechung auszepaken)
  • bunz2
    all lescht Versioun (fir d'NS-3 Verëffentlechung auszepaken)

Fir d'Default Versioun vum Python z'iwwerpréiwen, Typ python -V. Fir d'g ++ Versioun z'iwwerpréiwen, Typ g++ -v. Wann Tools fehlen oder ze al sinn, kuckt w.e.g. den Installatiounsguide op der ns-3 Wiki Säit.

Vun elo un huelen mir un datt de Lieser Linux, MacOS oder e Linux Emulator leeft an op d'mannst déi uewe genannte Tools huet.

3.2.1 Download vun der ns-3 Verëffentlechung als Quellarchiv

Dëst ass de Verlaf vun der Handlung fir en neie Benotzer dee wëllt eroflueden an experimentéieren mat der leschter Verëffentlechung a Package Versioune vun ns-3. ns-3 Verëffentlechungen ginn als kompriméiert Quellarchiv publizéiert, heiansdo genannt tarball. tarball ass e spezielle Softwarearchivformat an deem verschidde Dateien zesumme kombinéiert sinn. Den Archiv ass normalerweis kompriméiert. ns-3 Boot Prozess iwwer tarball ass einfach, Dir musst just eng Verëffentlechung auswielen, eroflueden an auspacken.

Loosst eis unhuelen datt Dir als Benotzer ns-3 an engem lokalen Verzeichnis mam Numm bauen wëllt Aarbechtsberäich. Dir kënnt eng Aarbechtskopie vun der Verëffentlechung kréien andeems Dir déi folgend an d'Linux Konsole gitt (natierlech déi entspriechend Versiounsnummeren 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 

Opgepasst op d'Utilitéit déi uewen benotzt gëtt wiisst, wat e Kommandozeilinstrument ass fir Objeten vum Internet erofzelueden. Wann Dir et net installéiert hutt, kënnt Dir Äre Browser dofir benotzen.

Follegt dës Schrëtt Iech an den ns-allinone-3.29 Verzeichnis, do sollt Dir verschidde Dateien an Verzeichnisser gesinn

$ 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

Dir sidd elo prett fir d'NS-3 Basisverdeelung ze bauen a kënnt op d'Sektioun iwwer d'Gebai ns-3 weidergoen.

3.3 Eroflueden ns-3 mat Git

Den ns-3 Code ass verfügbar an de Git Repositories op GitLab.com bei https://gitlab.com/nsnam/. Grupp nsnam bréngt déi verschidde Repositories zesummen, déi vun engem Open Source Projet benotzt ginn.

Deen einfachste Wee fir Git Repositories ze benotzen ass d'Ëmwelt ze gabel oder ze klonen ns-3-allinone. Dëst ass eng Rei vu Scripten déi d'Luede an d'Versammlung vun de meescht benotzten ns-3 Subsystemer geréiert. Wann Dir nei bei Git sidd, kënnen d'Begrëffer "Gabel" an "Klon" fir Iech onbekannt sinn; wann jo, empfeelen mir Iech einfach de Repository op GitLab.com ze klonen (maacht Är eege Kopie) sou:

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

Op dëser Etapp, d'Vue vun Ärem Verzeechnes ns-3-allinone liicht anescht aus dem Verëffentlechungsarchiv Dossier uewen beschriwwen. Et soll sou eppes ausgesinn:

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

Maacht weg datt et e Skript gëtt download.py, déi zousätzlech ns-3 a begleetend Quellcode extrahéiert. Hei hutt Dir e Choix: Luet entweder déi lescht ns-3 Entwécklung Snapshot erof:

$ python download.py

oder léiwer d'ns-3 Verëffentlechung mam Fändel benotzen -n fir d'Verëffentlechungsnummer unzeginn:

$ python download.py -n ns-3.29

No dësem Schrëtt an de Verzeechnes ns-3-allinone zousätzlech Repositories ginn erofgelueden ns-3, Bak, pybindgen и netanim.

Remarque
Op enger Maschinn mat propperem Ubuntu16.04, brauch ech de Kommando op dëst z'änneren: $ sudo python3 download.py -n ns-3.29 (nodréiglech Iwwersetzer Notizen).

3.3.1 Luede ns-3 mat Bake

Déi uewe genannte zwou Methoden (Quellarchiv oder Repository ns-3-allinone iwwer Git) sinn nëtzlech fir déi einfachst ns-3 Installatioun mat multiple Addons ze kréien (pybindgen fir Python Bindungen ze generéieren an netanim fir Netzwierkanimatioun). Den drëtte Repository, deen am Standard am ns-3-allinone geliwwert gëtt, gëtt genannt Bak.

Bake ass en Tool fir koordinéiert Bau vu Software aus Multiple Repositories, entwéckelt fir den ns-3 Projet. Bake ka benotzt ginn fir Entwécklungsversioune vun ns-3 ze kréien, souwéi fir Extensiounen vun der Basisversioun vun der ns-3 Verdeelung erofzelueden an ze bauen, sou wéi d'Ëmwelt. Direkter Code Ausféierung, CradleNetwork Simulatioun Cradle, d'Kapazitéit fir nei Python Bindungen a verschidde ns-3 "Apps" ze kreéieren.

Remarque
CradleNetwork Simulation Cradle ass e Kader deen Iech erlaabt real TCP/IP Netzwierkstacks an engem Netzwierksimulator ze benotzen.

Wann Dir erwaart datt Är ns-3 Installatioun fortgeschratt oder zousätzlech Funktiounen huet, kënnt Dir dësen Installatiounswee verfollegen.

An de leschten ns-3 Verëffentlechungen Bake gouf zu der tar Fräisetzung dobäi. D'Verëffentlechung enthält eng Konfiguratiounsdatei déi Iech erlaabt déi aktuell Software Versiounen zur Zäit vun der Verëffentlechung erofzelueden. Dat ass zum Beispill d'Versioun Bake, déi mat der Verëffentlechung ns-3.29 verdeelt gëtt, ka benotzt ginn fir Komponente fir dës Verëffentlechung vun ns-3 oder fréier ze recuperéieren, awer kann net benotzt ginn fir Komponente fir spéider Verëffentlechungen ze recuperéieren (wann d'Paketbeschreiwungsdatei bakeconf.xml net aktualiséiert).

Dir kënnt och déi lescht Kopie kréien Bakandeems Dir de folgende Kommando an Är Linux Konsole gitt (ugeholl datt Dir Git installéiert hutt):

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

Wann Dir de git Kommando leeft, sollt Dir eppes wéi déi folgend gesinn:

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.

Nodeems de Kommando fäerdeg ass Klon Dir sollt e Verzeechnes mam Numm hunn Bak, den Inhalt vun deem soll esou ausgesinn:

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

Bedenkt datt Dir e puer Python Scripte gelueden hutt, e Python Modul genannt Bak an eng XML Konfiguratiounsdatei. De nächste Schrëtt ass dës Skripte ze benotzen fir d'ns-3 Verdeelung vun Ärer Wiel erofzelueden an ze bauen. Verschidde Personnalisatiounsziler sinn verfügbar:

  1. ns-3.29: Modul entspriechend der Verëffentlechung; et wäert Komponente ähnlech wéi d'Verëffentlechung am Tarball eroflueden;

  2. ns-3-dev: en ähnleche Modul, awer benotzt Code vum Entwécklungsbam;

  3. ns-allinone-3.29: E Modul deen aner zousätzlech Funktiounen enthält wéi Click Routing an Network Simulation Cradle, Openflow fir ns-3.

  4. ns-3-allinone: ähnlech wéi d'Verëffentlechungsversioun vum Modul alles an engem, mee fir Entwécklung Code.

Remarque
klickt - Modulär Softwarearchitektur fir Router ze kreéieren.

Openflow ass e Protokoll fir de Prozess vun der Veraarbechtung vun Daten iwwer e Datennetz duerch Router a Schalter iwwerdroen, Software-definéiert Netzwierktechnologie ëmzesetzen.

Den aktuellen Entwécklung Schnappschëss (net-Verëffentlechung) ns-3 kann op fonnt ginn:https://gitlab.com/nsnam/ns-3-dev.git.

D'Entwéckler probéieren dës Repositories an enger konsequent Aarbechtsuerdnung ze halen, awer si sinn am Entwécklungsberäich an enthalen net verëffentlechte Code, also wann Dir net plangt nei Features ze benotzen, wielt dann déi offiziell Verëffentlechung.

Dir kënnt déi lescht Versioun vum Code fannen andeems Dir d'Lëscht vun de Repositories sicht, oder andeems Dir op d'ns-3 Releases Websäit gitt:https://www.nsnam.org/releases/ a klickt op déi lescht Versioun Link. An dësem Beispill wäerte mir weider mat ns-3.29.

Elo, fir d'ns-3 Komponenten ze kréien, déi mir brauchen, benotze mir den Tool Bake. Loosst eis e puer Aféierungswierder iwwer d'Aarbecht soen Bake.

Bake funktionnéiert andeems Paketquellen an e Verzeichnis lueden Quell an d'Bibliothéiken an de Build-Verzeichnis z'installéieren. Bake kann duerch Referenz op de Binär lafen, awer wann Dir wëllt lafen Bake net aus dem Verzeechnes an deem et erofgeluede gouf, ass et unzeroden de Wee ze addéieren Bak op Äre Wee (PATH Ëmfeld Variabel), zum Beispill wéi follegt (Beispill fir Linux Bash Shell). Gitt an de "bake" Verzeechnes a setzt dann déi folgend Ëmfeldvariablen:

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

Dëst wäert de Programm placéieren bake.py op de Shell Wee an erlaabt aner Programmer d'Ausféierbaren a Bibliothéiken ze fannen déi se erstallt hunn Bak. An e puer Benotzungsfäll Bak, d'PATH a PYTHONPATH Astellung uewen beschriwwen ass net erfuerderlech, awer e komplette Bau vun ns-3-allinone (mat zousätzlech Packagen) erfuerdert et normalerweis.

Gitt an Ären Aarbechtsverzeichnis a gitt déi folgend an der Konsole:

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

Als nächst wäerte mir froen Bake kontrolléiert ob mir genuch Tools hunn fir déi verschidde Komponenten ze lueden. Wielt:

$ ./bake.py check

Dir sollt eppes wéi déi folgend gesinn:

> 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 ...

Besonnesch eropluede Tools wéi Mercurial, CVS, Git a Bazaar sinn essentiell an dësem Schrëtt well se eis erlaben de Code ze kréien. Op dëser Etapp installéiert déi fehlend Tools op déi üblech Manéier fir Äre System (wann Dir wësst wéi) oder kontaktéiert Äre Systemadministrator fir Hëllef.

Als nächst probéiert d'Software erofzelueden:

$ ./bake.py download

d'Resultat sollt eppes sinn wéi:

>> 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

Dëst bedeit datt dräi Quellen erofgeluede goufen. Gitt elo an de Quellverzeichnis a gitt ls; Dir sollt gesinn:

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

Elo sidd Dir prett fir d'ns-3 Verdeelung ze bauen.

3.4 Assemblée ns-3

Wéi beim Download vun ns-3, ginn et verschidde Weeër fir ns-3 ze bauen. Den Haapt Saach mir ënnersträichen wëllen ass, datt ns-3 gebaut ass mat engem bauen Outil genannt Wafënnert beschriwwen. Déi meescht Benotzer wäerte mat schaffen Waf, awer et ginn e puer praktesch Scripte fir Iech ze hëllefen unzefänken oder méi komplex Builds ze organiséieren. Also w.e.g., ier Dir iwwer liest Waf, kuckt op build.py an Assemblée mat Bak.

3.4.1 Gebai mat build.py

Opgepasst weg! Dëse Bauschrëtt ass nëmme verfügbar aus der Quellarchiv Versioun kritt wéi uewen beschriwwen; an net iwwer Git oder Bake erofgelueden.

Wann Dir mat engem Verëffentlechungsarchiv schafft tarball, an ns-3-allinone Et gëtt e praktesche Skript deen d'Komponente méi einfach maache kann. Et gëtt build.py genannt. Dëse Programm setzt de Projet fir Iech op déi nëtzlechst Manéier op. Wéi och ëmmer, bemierkt datt méi fortgeschratt Setup an Aarbecht mat ns-3 normalerweis d'Benotzung vum ns-3 säin eegene Build System, Waf, involvéiert, dee spéider an dësem Tutorial agefouert gëtt.

Wann Dir erofgeluede benotzt tarball, dann an Ärem Verzeichnis ~/Aarbechtsberäich engem Verzeechnes mat engem Numm eppes wéi ns-allinone-3.29. Gitt déi folgend:

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

Wann genannt build.py Mir hunn Kommandozeilargumenter benotzt fir d'Beispiller an Tester ze bauen déi an dësem Tutorial benotzt ginn, déi net als Standard an ns-3 gebaut ginn. Par défaut baut de Programm och all verfügbare Moduler. Dann, wann Dir wëllt, kënnt Dir ns-3 ouni Beispiller an Tester bauen, oder Moduler ausschléissen déi net fir Är Aarbecht gebraucht ginn.

Dir gesitt vill Compiler Output Messagen ugewisen vum Skript wéi et déi verschidden Deeler baut déi Dir gelueden hutt. Als éischt wäert de Skript probéieren den Animateur ze bauen netanim, dann de Bindungsgenerator pybindgen an endlech ns-3. Wann de Prozess fäerdeg ass, sollt Dir déi folgend gesinn:

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

An de leschten dräi Zeilen vun der Oplëschtung gesi mir e Message iwwer Moduler déi net gebaut goufen:

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

Dëst bedeit einfach datt e puer ns-3 Moduler, déi vun externe Bibliothéiken ofhängeg sinn, vläicht net gebaut goufen oder datt se net fir dës Konfiguratioun gebaut sinn. Dëst bedeit net datt de Simulator net montéiert ass oder datt déi montéiert Moduler net richteg funktionnéieren.

3.4.2 Gebai mat Bake

Wann Dir Bake uewen benotzt hutt fir Quellcode aus de Projet Repositories ze kréien, kënnt Dir weider benotze fir ns-3 ze bauen. Wielt:

$ ./bake.py build

an Dir sollt eppes gesinn wéi:

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

prompt: Dir kënnt och d'Download- an d'Build Schrëtt gläichzäiteg maachen andeems Dir "bake.py deploy" nennt.

Assemblée all Komponente kann versoen, mee Assemblée wäert weider wann eng Komponent net néideg ass. Zum Beispill, e rezente Portabilitéitsprobleem war dat castxml kann duerch Tool zesummegesat ginn Bak net op all Plattformen. An dësem Fall erschéngt e Message wéi dës:

>> 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.

Awer, castxml nëmmen néideg wann Dir aktualiséiert Python Bindungen erstellen wëllt. Fir déi meescht Benotzer ass et net néideg fir dëst (op d'mannst bis se ns-3 änneren), sou datt esou Warnunge fir de Moment sécher ignoréiert kënne ginn.

Wann et feelt, gëtt de folgende Kommando Iech en Hiweis iwwer fehlend Ofhängegkeeten:

$ ./bake.py show

Déi verschidde Ofhängegkeete vun de Packagen, déi Dir probéiert ze bauen, ginn opgelëscht.

3.4.3 Bauen mat Waf

Bis zu dësem Zäitpunkt, fir unzefänken ns-3 ze bauen, hu mir entweder de Skript benotzt build.py, oder Tool Bak. Dës Tools sinn nëtzlech fir ns-3 ze bauen a Bibliothéiken z'erhalen. Tatsächlech, fir ze bauen lafen se de Bauinstrument Waf aus dem ns-3 Verzeichnis. Waf installéiert mam ns-3 Quellcode. Déi meescht Benotzer gi séier op direkt Benotzung fir den ns-3 ze konfiguréieren an ze montéieren Waf. Also, fir weiderzemaachen, gitt w.e.g. an den ns-3 Verzeichnis deen Dir ursprénglech erstallt hutt.

Dëst ass net strikt erfuerderlech zu dësem Zäitpunkt, awer et wäert nëtzlech sinn e bëssen zréckzekréien a kucken wéi Dir Ännerunge vun der Projektkonfiguratioun maacht. Wahrscheinlech déi nëtzlechst Konfiguratiounsännerung déi Dir maache kënnt ass eng optimiséiert Versioun vum Code ze kreéieren. Par défaut hutt Dir Äre Projet konfiguréiert fir eng Debug Versioun ze bauen. Loosst eis e Projet kucken fir en optimiséierte Bau ze kreéieren. Fir dem Waf z'erklären datt et optimiséiert Builds maache soll, déi Beispiller an Tester enthalen, musst Dir déi folgend Kommandoen ausféieren:

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

Dëst wäert starten Waf ausserhalb vum lokalen Verzeechnes (fir Är Kamoudheet). Den éischte Kommando botzt aus dem fréiere Build, dëst ass normalerweis net strikt néideg, awer et ass gutt Praxis (kuckt och Build Profiler hei ënnen); dëst läscht virdrun erstallt Bibliothéiken an Objektdateien, déi am Verzeechnes sinn bauen /. Wann de Projet nei konfiguréiert ass an de Build-System déi verschidde Ofhängegkeete kontrolléiert, sollt Dir d'Ausgab ähnlech wéi déi folgend gesinn:

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)

Notéiert w.e.g. de leschten Deel vun der Oplëschtung hei uewen. E puer ns-3 Optiounen sinn net als Standard aktivéiert oder erfuerderen System Ënnerstëtzung fir richteg ze fonktionnéieren. Zum Beispill, fir XmlTo z'aktivéieren, muss d'Bibliothéik um System präsent sinn libxml-2.0. Wann dës Bibliothéik net fonnt gouf an déi entspriechend ns-3 Funktioun net ageschalt war, gëtt e Message ugewisen. Notéiert och datt et méiglech ass de Kommando ze benotzen sudo fir de suid Bit "Grupp ID bei Runtime" fir verschidde Programmer ze setzen. Et ass net als Standard aktivéiert an dofir erschéngt dës Feature als "net aktivéiert". Endlech, fir eng Lëscht vun aktivéierten Optiounen ze kréien, benotzt Waf mat Parameter --check-config.

Loosst eis elo zréck goen a wiesselen zréck op den Debug Build mat Beispiller an Tester.

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

De Build System ass elo ageriicht an Dir kënnt Debug Versioune vun ns-3 Programmer bauen andeems Dir einfach tippt:

$ ./waf

D'Schrëtt uewendriwwer hu vläicht gezwongen, en Deel vum ns-3 System zweemol ze bauen, awer elo wësst Dir wéi Dir d'Konfiguratioun ännert an e optimiséierte Code bauen.

Fir z'iwwerpréiwen wéi ee Profil fir eng bestëmmte Projetkonfiguratioun aktiv ass, gëtt et e Kommando:

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

Den uewe Szenario build.py ënnerstëtzt och Argumenter --enable-examples и --enable-tests, awer aner Optiounen Waf et ënnerstëtzt net direkt. Zum Beispill, dëst wäert net schaffen:

$ ./build.py --disable-python

d'Reaktioun wäert esou sinn:

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

Wéi och ëmmer, de spezielle Bedreiwer -- kann benotzt ginn fir zousätzlech Parameteren duerch ze passéieren vufalso amplaz vun der uewendriwwer funktionnéiert de folgende Kommando:

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

well et generéiert den Haaptbefehl ./waf configuréieren --disable-python. Hei sinn e puer méi Aféierungscoursen Tipps iwwer Waf.

Ëmgank mat Baufehler

ns-3 Verëffentlechungen ginn op déi lescht C++ Compilers getest, déi zur Verëffentlechung op gemeinsame Linux a MacOS Verdeelungen verfügbar sinn. Wéi och ëmmer, mat der Zäit ginn nei Verdeelunge mat neie Compiler verëffentlecht, an dës méi nei Compiler tendéieren méi pedantesch iwwer Warnungen. ns-3 konfiguréiert säi Build fir all Warnungen als Feeler ze behandelen, also heiansdo wann Dir eng al Versioun op engem méi neie System leeft, kann eng Compilerwarnung de Bau stoppen.

Zum Beispill gouf et virdru eng Verëffentlechung vun ns-3.28 fir Fedora 28, déi eng nei grouss Versioun enthält gcc (gcc-8). Baut d'Verëffentlechung ns-3.28 oder fréier Versiounen ënner Fedora 28, mat Gtk2+ installéiert, de folgende Feeler geschitt:

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

An Verëffentlechungen ab ns-3.28.1, an Waf eng Optioun ass verfügbar fir dës Problemer ze léisen. Et deaktivéiert d'Astellung vum "-Werror" Fändel a g ++ a clang ++. Dëst ass d'Optioun "--disable-werror" a muss während der Konfiguratioun applizéiert ginn:

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

Konfiguréieren oder montéieren

E puer Kommandoen Waf hunn Bedeitung nëmmen an der Configuratioun Phase, an e puer sinn nëmmen valabel am Bau Phase. Zum Beispill, wann Dir d'ns-3 Emulatiounsfeatures benotze wëllt, kënnt Dir d'Bit-Astellung aktivéieren Suid benotzen sudo, wéi uewen beschriwwen. Dëst wäert d'Konfiguratiounsschrëttbefehl iwwerschreiden, an dofir kënnt Dir d'Konfiguratioun änneren andeems Dir de folgende Kommando benotzt, deen och Beispiller an Tester enthält.

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

Wann Dir dëst maacht Waf wäert starten sudoEmulatiounscode Socket Kreatiounsprogrammer z'änneren fir mat Permissiounen ze lafen root. d' Waf Et gi vill aner Optiounen verfügbar fir d'Konfiguratioun a Bauschrëtt. Fir Är Optiounen ze entdecken, gitt:

$ ./waf --help

An der nächster Sektioun wäerte mir e puer Testbezunnen Optiounen benotzen.

Assemblée Profiler

Mir hu scho gesinn wéi Dir kënnt konfiguréieren Waf fir Versammlungen Debug- и optimiséiert:

$ ./waf --build-profile=debug

Et gëtt och en Zwëschenversammlungsprofil, Fräisetzung. Optioun -d ass synonym mat --build-profile. De Build Profil kontrolléiert d'Benotzung vu Logbicher, Behaaptungen, a Compiler Optimisatiounsschalter:

ns-3 Network Simulator Tutorial. Kapitel 3

Wéi Dir kënnt gesinn, Logbicher an Behaaptungen sinn nëmme verfügbar an Debug Builds. D'recommandéiert Praxis ass Äert Skript am Debug-Modus z'entwéckelen, dann widderholl Runen (fir Statistiken oder Parameterännerungen) an engem optimiséierte Bauprofil auszeféieren.

Wann Dir Code hutt deen nëmmen a bestëmmte Build Profiler lafen soll, benotzt de Code Wrapper Macro:

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;)

Standard, Waf Plaze bauen artifacts am bauen directory. Dir kënnt en aneren Ausgangsverzeichnis mat der Optioun spezifizéieren - -out, zum Beispill:

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

Andeems Dir dëst mat Bauprofile kombinéiert, kënnt Dir einfach tëscht verschiddene Kompiléierungsoptiounen wiesselen:

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

Wat Iech erlaabt mat méi Versammlungen ze schaffen ouni all Kéier déi lescht Versammlung ze iwwerschreiwen. Wann Dir op en anere Profil wiesselt, Waf wäert et nëmmen kompiléieren, ouni alles komplett nei ze kompiléieren.

Wann Dir Build Profiler op dës Manéier wiesselt, musst Dir virsiichteg sinn all Kéier déiselwecht Konfiguratiounsoptiounen ze ginn. Verschidde Ëmweltvariablen definéieren hëlleft Iech Feeler ze 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

Compilers a Fändelen

An den uewe Beispiller Waf fir ns-3 ze bauen benotzt den C++ Compiler vu GCC ( g ++). Wéi och ëmmer, Dir kënnt deen änneren deen Dir benotzt Waf C ++ Compiler, andeems Dir d'CXX Ëmfeldvariabel definéiert. Zum Beispill, fir den C++ Compiler Clang ze benotzen, clang++,

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

Am selwechte Wee kënnt Dir konfiguréieren Waf ze benotzen verdeelt Kompilatioun benotzt distcc:

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

Méi Informatioun iwwer distcc a verdeelt Kompilatioun fannt Dir op der Projektsäit an der Dokumentatiounssektioun. Fir Compiler Fändelen ze addéieren wann Dir ns-3 konfiguréiert, benotzt d'CXXFLAGS_EXTRA Ëmfeldvariabel.

Kader

Waf ka benotzt ginn fir Bibliothéiken op verschiddene Plazen um System z'installéieren. Par défaut sinn déi kompiléiert Bibliothéiken an ausführbaren am Verzeechnes bauen, a well Waf d'Plaz vun dëse Bibliothéiken an ausféierbar kennt, ass et net néideg d'Bibliothéiken soss anzwousch ze installéieren.

Wann d'Benotzer léiwer ausserhalb vum Build-Verzeichnis installéieren, kënne se de Kommando ausféieren ./waf installéieren. De Standard Präfix fir Installatioun ass / usr / lokal, also ./waf installéieren wäert Programmer installéieren an / usr / local / bin, Bibliothéiken an / usr / lokal / lib an Header Dateien an /usr/local/include. Superuser Rechter mussen normalerweis mat engem Standardpräfix gesat ginn, sou datt en typesche Kommando wier sudo ./waf installéieren. Wann lancéiert, wäert Waf fir d'éischt wielen déi gemeinsam Bibliothéiken am Build Verzeechnes ze benotzen, da kuckt no Bibliothéiken laanscht de Wee op d'Bibliothéiken déi am lokalen Ëmfeld konfiguréiert sinn. Also wann Dir Bibliothéiken op engem System installéiert, ass et eng gutt Praxis fir ze kontrolléieren ob déi richteg Bibliothéike benotzt ginn. D'Benotzer kënnen wielen mat engem anere Präfix z'installéieren andeems se d'Optioun während der Konfiguratioun weiderginn --prefix, zum Beispill:

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

Wann méi spéit, nom Build, gitt de Benotzer den Installatiounskommando ./waf, gëtt de Präfix benotzt /opt/local.

Equipe ./waf clean muss benotzt ginn ier de Projet nei konfiguréieren wann d'Installatioun benotzt gëtt Waf ënner engem anere Präfix.

Also, fir ns-3 ze benotzen ass et net néideg ze ruffen ./waf install. Déi meescht Benotzer brauche dëse Kommando net well Waf wäert déi aktuell Bibliothéiken aus dem Build Verzeechnes ophuelen, awer e puer Benotzer kënnen dat nëtzlech fannen wann hir Aktivitéite mat Programmer ausserhalb vum ns-3 Verzeichnis schaffen.

Waf Single

Um ieweschte Niveau vun der ns-3 Quell Bam gëtt et nëmmen ee Waf Skript. Wann Dir ufänkt ze schaffen, verbréngt Dir vill Zäit am Verzeechnes scratch/ oder méi déif ansrc/... a gläichzäiteg musse lafen Waf. Dir kënnt just erënneren wou Dir sidd a lafen Waf wéi folgend:

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

awer dëst wäert langweileg a Feeler ufälleg sinn, sou datt et besser Léisunge gëtt. Ee gemeinsame Wee ass en Texteditor ze benotzen wéi z Emacs oder vim, an deenen zwee Terminal Sessiounen opgemaach ginn, gëtt eng benotzt fir ns-3 ze bauen, an déi zweet gëtt benotzt fir de Quellcode z'änneren. Wann Dir nëmmen hutt tarball, da kann eng Ëmfeldvariabel hëllefen:

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

$ cd scratch 
$ waff build

Am Modulverzeechnes kéint et verlockend sinn en trivial waf Skript derbäi ze ginn wéi exec ../../waf. W.e.g. maach dat net. Dëst ass konfus fir Newbies a wann et schlecht gemaach gëtt, féiert dat zu schwéier z'entdecken Baufehler. Déi uewe gewisen Léisungen sinn de Wee dee benotzt soll ginn.

3.5 Testen ns-3

Dir kënnt d'ns-3 Verdeelung Eenheetstester ausféieren andeems Dir de Skript leeft ./test.py:

$ ./test.py

Dës Tester lafen parallel mat Waf. Eventuell sollt Dir e Message gesinn, deen seet:

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

Dëst ass e wichtege Message fir valgrind Crashen, Crashen oder Feeler z'identifizéieren, wat Problemer mam Code oder Inkompatibilitéit tëscht Tools a Code ugeet.

Dir wäert och d'Finale Ausgang gesinn aus Waf an en Tester deen all Test leeft, deen esou ausgesäit:

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)

Dëse Kommando gëtt normalerweis vu Benotzer ausgeführt fir séier z'iwwerpréiwen datt d'ns-3 Verdeelung richteg gebaut ass. (Notéiert datt d'Uerdnung vun den "PASS: ..." Zeilen anescht kann sinn, wat normal ass. Wat wichteg ass, ass datt d'Zesummesetzungslinn um Enn vum Bericht weist datt all Tester passéiert sinn; keng Tester gescheitert oder erofgefall.) An Wafan test.py wäert d'Aarbecht iwwer déi verfügbare Prozessorkäre vun der Maschinn paralleliséieren.

3.6 De Skript ausféieren

Mir lafen normalerweis Scripten ënner Kontroll Waf. Dëst erlaabt dem Build System sécherzestellen datt gemeinsame Bibliothéiksweeër korrekt agestallt sinn an datt d'Bibliothéike bei der Runtime verfügbar sinn. Fir de Programm ze lafen, benotzt einfach Waf mat Parameter - -run. Loosst eis den ns-3 Äquivalent vum ubiquitesche Programm lafen Moien Weltandeems Dir déi folgend tippt:

$ ./waf --run hello-simulator

Waf wäert éischt kontrolléieren, datt de Programm richteg gebaut ass a bauen wann néideg. Dann Waf wäert e Programm ausféieren deen déi folgend Ausgab produzéiert.

Hello Simulator

Gratulatioun! Dir sidd elo e ns-3 Benotzer!

Wat soll ech maachen wann ech keng Resultater gesinn?

Wann Dir Messagen gesinn Wafbeweist datt de Bau erfollegräich ofgeschloss ass, awer Dir gesitt den Ausgang net "Hallo Simulator", da gëtt et eng Méiglechkeet datt Dir an der [Build-with-Waf] Sektioun Dir Äre Baumodus ëmgewandelt hutt optimiséiert, awer verpasst zréck an de Modus ze wiesselen Debug-. All Konsoloutput, déi an dësem Tutorial benotzt gëtt, benotzt e speziellen ns-3 Komponent, dee Logbicher ausféiert a benotzt gëtt fir personaliséiert Messagen op d'Konsole ze drécken. D'Ausgab vun dëser Komponent gëtt automatesch deaktivéiert wann optimiséierte Code kompiléiert ass - et ass "optimiséiert". Wann Dir den Ausgang "Hallo Simulator" net gesitt, gitt déi folgend:

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

ze personaliséieren Waf fir Debug Versioune vun ns-3 Programmer ze bauen, déi Beispiller an Tester enthalen. Dir sollt dann déi aktuell Debug Versioun vum Code nei opbauen andeems Dir tippt

$ ./waf

Elo wann Dir de Programm lafen Moien-simulator, Dir sollt dat erwaart Resultat gesinn.

3.6.1 Kommando Linn Argumenter

Fir Kommandozeilargumenter an den ns-3 Programm ze passéieren, benotzt de folgende Muster:

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

Ersetzt mam Numm vun Ärem Programm an den Argumenter. Argument - -command-template fir Waf ass wesentlech e Rezept fir déi aktuell Kommandozeil ze bauen Waf benotzt fir de Programm auszeféieren. Waf kontrolléiert datt de Bau fäerdeg ass, setzt déi gemeinsam Bibliothéiksweeër, benotzt dann déi geliwwert Kommandozeil Schabloun an ersetzt de Programmnumm fir den %s Plazhalter fir den Ausféierbar ze ruffen. Wann Dir dës Syntax komplizéiert fannt, gëtt et eng méi einfach Versioun déi den ns-3 Programm involvéiert a seng Argumenter an eenzel Zitater abegraff:

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

En anert besonnesch nëtzlecht Beispill ass Test Suiten selektiv ze lafen. Loosst eis unhuelen datt et eng Testsuite gëtt genannt mytest (tatsächlech ass et net). Uewen hu mir den ./test.py Skript benotzt fir eng Rei Tester parallel auszeféieren, déi ëmmer erëm den Testprogramm ruffen test-runner. Call test-runner direkt fir een Test auszeféieren:

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

Argumenter ginn un de Programm weiderginn test-runner. Well mytest net existéiert, gëtt eng Fehlermeldung generéiert. Fir déi verfügbar Test-Runner Optiounen ze drécken, gitt:

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

3.6.2 Debugging

Fir ns-3 Programmer ënner engem aneren Utility ze lafen, wéi en Debugger (zum Beispill, gdb) oder e Memory Test Tool (zum Beispill, valgrind), benotzt eng ähnlech Form - -command-template = "…". Zum Beispill, am Debugger ze lafen gdb Ären Hello-Simulator ns-3 Programm mat Argumenter:

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

Notéiert datt den ns-3 Programmnumm mam Argument kënnt - -run, an de Management Utility (hei gdb) ass den éischten Token am Argument - -command-template. Optioun - -args informéiert gdbdatt de Rescht vun der Kommandozeil zum "ënneschten" Programm gehéiert. (E puer Versiounen gdb verstinn d'Optioun net - -args. An dësem Fall, ewechzehuelen de Programm Argumenter aus - -command-template a benotzt de Kommando Set gdb streit.) Mir kënnen dëst Rezept an dee virdrun kombinéieren fir den Test ënner dem Debugger auszeféieren:

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

3.6.3 Aarbechtsverzeechnes

Waf soll vu senger Plaz am Top vum ns-3 Bam lancéiert ginn. Dësen Dossier gëtt den Aarbechtsverzeechnes wou d'Ausgabdateien geschriwwe ginn. Awer wat wann Dir dës Dateien ausserhalb vum ns-3 Quellbaum wëllt halen? Benotzt Argument - -cwd:

$ ./waf --cwd=...

Dir kënnt et méi bequem fannen d'Ausgabdateien an Ärem Aarbechtsverzeechnes ze kréien. An dësem Fall kann déi folgend indirekt Aktioun hëllefen:

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

Dës Dekoratioun vun der viregter Versioun vum Kommando behält den aktuellen Aarbechtsverzeechnes, geet an de Verzeichnis Wafan dann instructs Waf fir den Aarbechtsverzeechnes zréck an den aktuellen Aarbechtsverzeechnes ze änneren, dee gespäichert ass, ier Dir de Programm starten. Mir ernimmen d'Equipe - -cwd Fir Vollständegkeet, lafen déi meescht Benotzer einfach Waf aus dem Top-Level Verzeechnes a generéieren do Outputdateien.

Fortsetzung: Kapitel 4

Source: will.com

Setzt e Commentaire