ns-3 netwerksimulator-tutorial. Hoofdstuk 3

ns-3 netwerksimulator-tutorial. Hoofdstuk 3
Hoofdstuk 1,2

3 Aan de slag
3.1 Overzicht
3.2 Vereisten
3.2.1 De ns-3-release downloaden als bronarchief
3.3 NS-3 downloaden met Git
3.3.1 NS-3 laden met Bake
3.4 Montage ns-3
3.4.1 Bouwen met build.py
3.4.2 Bouwen met bakken
3.4.3 Bouwen met Waf
3.5 Testen van ns-3
3.6 Het script uitvoeren
3.6.1 Opdrachtregelargumenten
3.6.2 Foutopsporing
3.6.3 Werkmap

Hoofdstuk 3

Aan de slag

Dit hoofdstuk is bedoeld om de lezer voor te bereiden om te beginnen met een computer waarop ns-3 mogelijk nog nooit is geïnstalleerd. Het behandelt ondersteunde platforms, vereisten, hoe u ns-3 kunt verkrijgen, hoe u ns-3 kunt bouwen en hoe u uw build kunt testen en eenvoudige programma's kunt uitvoeren.

3.1 Overzicht

De ns-3-simulator is gebouwd als een systeem van samenwerkende softwarebibliotheken. Tijdens het assembleren wordt de code van gebruikersprogramma's aan deze bibliotheken gekoppeld. Voor het schrijven van programma's op maat wordt gebruik gemaakt van de programmeertalen C++ of Python.

Ns-3 wordt gedistribueerd als broncode, wat betekent dat het doelsysteem een ​​softwareontwikkelomgeving moet hebben om eerst de bibliotheken te bouwen en vervolgens het gebruikersprogramma te bouwen. In principe zouden ns-3 gedistribueerd kunnen worden als kant-en-klare bibliotheken voor een specifiek systeem, en in de toekomst kunnen ze ook op deze manier gedistribueerd worden. Maar tegenwoordig doen veel gebruikers hun werk feitelijk door ns-3 zelf te bewerken, dus het is handig om over de broncode te beschikken om de bibliotheken te bouwen. Als iemand het werk van het maken van kant-en-klare bibliotheken en pakketten voor besturingssystemen op zich wil nemen, neem dan contact op met de mailinglijst ns-ontwikkelaars.

Vervolgens bekijken we drie manieren om ns-3 te downloaden en te bouwen. De eerste is het downloaden en bouwen van de officiële release van de hoofdsite. De tweede is de selectie en assemblage van kopieën van ontwikkelingsversies van de standaard ns-3-installatie. De derde is om extra buildtools te gebruiken om meer extensies voor ns-3 te laden. We zullen ze allemaal doornemen, omdat de tools enigszins verschillen.

Ervaren Linux-gebruikers vragen zich misschien af ​​waarom ns-3 niet als pakket wordt geleverd, zoals de meeste andere bibliotheken die een pakketbeheerder gebruiken? Hoewel er binaire pakketten zijn voor verschillende Linux-distributies (bijvoorbeeld Debian), bewerken de meeste gebruikers uiteindelijk de bibliotheken en moeten ze ns-3 zelf opnieuw opbouwen, dus het is handig om de broncode beschikbaar te hebben. Om deze reden zullen we ons concentreren op het installeren vanaf de broncode.

Voor de meeste toepassingen ns-3 rechten wortel niet nodig zijn, wordt het aanbevolen om een ​​gebruikersaccount zonder privileges te gebruiken.

3.2 Vereisten

De volledige set beschikbare ns-3-bibliotheken is in een aantal opzichten afhankelijk van bibliotheken van derden, maar voor het grootste deel kan ns-3 worden gebouwd en gebruikt met ondersteuning voor verschillende algemene (vaak standaard geïnstalleerde) componenten: een C++-compiler, Python, een broncode-editor (bijvoorbeeld vim, emacs of Eclipse) en, als ontwikkelingsrepository's worden gebruikt, Git-versiecontrolesystemen. De meeste nieuwe gebruikers hoeven zich geen zorgen te maken als hun configuratie aangeeft dat er enkele geavanceerde ns-3-functies ontbreken, maar voor degenen die een volledige installatie willen, biedt het project een wiki die pagina's bevat met veel nuttige tips en trucs. Eén zo'n pagina is de Installatiepagina, met installatie-instructies voor verschillende systemen, beschikbaar op: https://www.nsnam.org/wiki/Installation.

In het gedeelte Vereisten van deze wiki wordt uitgelegd welke pakketten nodig zijn om veelgebruikte ns-3-opties te ondersteunen en worden ook de commando's gegeven die worden gebruikt om ze te installeren op veelgebruikte varianten van Linux of macOS.

U kunt van deze gelegenheid gebruik maken om de ns-3 wikipagina of de hoofdwebsite te verkennen: https://www.nsnam.org, omdat daar veel informatie staat. Vanaf de nieuwste versie van ns-3 (ns-3.29) zijn de volgende tools vereist om ns-3 uit te voeren:

Gereedschapspakket/versie

  • C++-compiler
    clang++ of g++ (g++ versie 4.9 of hoger)
  • Python
    python2 versie >= 2.7.10, of python3 versie >=3.4
  • Git
    elke nieuwste versie (voor toegang tot ns-3 op GitLab.com)
  • teer
    elke nieuwste versie (voor het uitpakken van de ns‑3-release)
  • bunzip2
    elke nieuwste versie (voor het uitpakken van de ns‑3-release)

Om de standaardversie van Python te controleren, typt u python -V. Om de g++-versie te controleren, typt u g++ -v. Als er tools ontbreken of te oud zijn, raadpleeg dan de installatiehandleiding op de ns-3 wikipagina.

Vanaf dit punt gaan we ervan uit dat de lezer Linux, MacOS of een Linux-emulator gebruikt en ten minste over de bovenstaande tools beschikt.

3.2.1 De ns-3-release downloaden als bronarchief

Dit is de handelwijze voor een nieuwe gebruiker die de nieuwste release- en pakketversies van ns-3 wil downloaden en ermee wil experimenteren. ns-3-releases worden gepubliceerd als gecomprimeerde bronarchieven, ook wel tarbal. tarbal is een speciaal software-archiefformaat waarin meerdere bestanden worden gecombineerd. Het archief is meestal gecomprimeerd. ns-3 opstartproces via tarbal is eenvoudig: u hoeft alleen maar een release te selecteren, te downloaden en uit te pakken.

Laten we aannemen dat u als gebruiker ns-3 wilt bouwen in een lokale map genaamd werkruimte. Je kunt een werkkopie van de release krijgen door het volgende in de Linux-console in te voeren (uiteraard met de juiste versienummers)

$ 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 

Besteed aandacht aan het hierboven gebruikte hulpprogramma wget, een opdrachtregelprogramma waarmee u objecten van internet kunt downloaden. Als u deze nog niet heeft geïnstalleerd, kunt u hiervoor uw browser gebruiken.

Als u deze stappen volgt, gaat u naar de map ns-allinone-3.29. Daar zou u verschillende bestanden en mappen moeten zien

$ 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

U bent nu klaar om de ns-3-basisdistributie te bouwen en kunt doorgaan naar de sectie over het bouwen van ns-3.

3.3 NS-3 downloaden met Git

De ns-3-code is beschikbaar in de Git-repository's op GitLab.com op https://gitlab.com/nsnam/. Groep nsnam brengt de verschillende repositories samen die door een open source-project worden gebruikt.

De eenvoudigste manier om Git-repository's te gaan gebruiken, is door de omgeving te forken of te klonen ns-3-allinon. Dit is een set scripts die het laden en samenstellen van de meest gebruikte ns-3-subsystemen beheert. Als je nieuw bent bij Git, zijn de termen "fork" en "clone" misschien onbekend voor je; als dat zo is, raden we je aan om eenvoudigweg de repository op GitLab.com als volgt te klonen (maak je eigen kopie):

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

In dit stadium de weergave van uw directory ns-3-allinon iets anders dan de hierboven beschreven release-archiefmap. Het zou er ongeveer zo uit moeten zien:

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

Houd er rekening mee dat er een script is download.py, die bovendien ns-3 en bijbehorende broncode zal extraheren. Hier heeft u de keuze: download de nieuwste ns-3 ontwikkelingssnapshot:

$ python download.py

of geef de voorkeur aan de ns-3-release met behulp van de vlag -n om het releasenummer aan te geven:

$ python download.py -n ns-3.29

Na deze stap naar de directory ns-3-allinon Er worden extra repository's gedownload ns-3, bakken, pybindgen и netanim.

Noot
Op een machine met schone Ubuntu16.04 moest ik de opdracht als volgt wijzigen: $ sudo python3 download.py -n ns-3.29 (hierna: aantekeningen van de vertaler).

3.3.1 NS-3 laden met Bake

De bovenstaande twee methoden (bronarchief of repository ns-3-allinon via Git) zijn handig voor het verkrijgen van de eenvoudigste ns-3-installatie met meerdere add-ons (pybindgen om Python-bindingen te genereren en netanim voor netwerkanimatie). De derde repository die standaard in ns-3-allinone wordt aangeboden, wordt aangeroepen bakken.

Bakken is een tool voor het gecoördineerd bouwen van software vanuit meerdere repositories, ontwikkeld voor het ns-3-project. Bakken kan worden gebruikt om ontwikkelingsversies van ns-3 te verkrijgen, maar ook om uitbreidingen van de basisversie van de ns-3-distributie te downloaden en te bouwen, zoals de omgeving Directe code-uitvoering, CradleNetwork-simulatiehouder, de mogelijkheid om nieuwe Python-bindingen en verschillende ns-3 “apps” te maken.

Noot
CradleNetwork Simulatie Cradle is een raamwerk waarmee u echte TCP/IP-netwerkstacks in een netwerksimulator kunt gebruiken.

Als u verwacht dat uw ns-3-installatie over geavanceerde of extra functies beschikt, kunt u dit installatiepad volgen.

In de nieuwste ns-3-releases Bakken werd toegevoegd aan de teerafgifte. De release bevat een configuratiebestand waarmee u de huidige softwareversies op het moment van de release kunt downloaden. Dat is bijvoorbeeld de versie Bakken, dat wordt gedistribueerd met release ns-3.29, kan worden gebruikt om componenten voor die release van ns-3 of eerder op te halen, maar kan niet worden gebruikt om componenten voor latere releases op te halen (als het pakketbeschrijvingsbestand bakeconf.xml niet geüpdate).

U kunt ook het nieuwste exemplaar verkrijgen bakkendoor de volgende opdracht in je Linux-console in te voeren (ervan uitgaande dat je Git hebt geïnstalleerd):

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

Wanneer je het git commando uitvoert, zou je zoiets als het volgende moeten zien:

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.

Nadat de opdracht is voltooid klonen je zou een map moeten hebben met de naam bakken, waarvan de inhoud er ongeveer zo uit zou moeten zien:

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

Merk op dat je verschillende Python-scripts hebt geladen, een Python-module met de naam bakken en een XML-configuratiebestand. De volgende stap is het gebruik van deze scripts om de ns-3-distributie van uw keuze te downloaden en te bouwen. Er zijn verschillende aanpassingsdoelen beschikbaar:

  1. ns-3.29: module die overeenkomt met de release; het zal componenten downloaden die vergelijkbaar zijn met de release in de tarball;

  2. ns-3-dev: een vergelijkbare module, maar met code uit de ontwikkelingsboom;

  3. ns-allinon-3.29: Een module die andere extra functies bevat, zoals klikroutering en Network Simulation Cradle, Openflow voor ns-3.

  4. ns-3-allinon: vergelijkbaar met de releaseversie van de module allinone, maar voor ontwikkelingscode.

Noot
Klik — modulaire softwarearchitectuur voor het maken van routers.

Openflow is een protocol voor het beheren van het proces van het verwerken van gegevens die via een datanetwerk worden verzonden door routers en switches, waarbij softwaregedefinieerde netwerktechnologie wordt geïmplementeerd.

De huidige momentopname van de ontwikkeling (niet-release) ns-3 is te vinden op:https://gitlab.com/nsnam/ns-3-dev.git.

De ontwikkelaars proberen deze repository's in een consistente werkende staat te houden, maar ze bevinden zich in het ontwikkelingsgebied en bevatten niet-uitgebrachte code, dus als je niet van plan bent nieuwe functies te gebruiken, selecteer dan de officiële release.

U kunt de nieuwste versie van de code vinden door door de lijst met opslagplaatsen te bladeren of door naar de ns-3 Releases-webpagina te gaan:https://www.nsnam.org/releases/ en klik op de link naar de nieuwste versie. In dit voorbeeld gaan we verder met ns-3.29.

Om de ns-3-componenten te krijgen die we nodig hebben, zullen we de tool gebruiken Bakken. Laten we een paar inleidende woorden over het werk zeggen Bakken.

Bake werkt door pakketbronnen in een map te laden (bron) en het installeren van de bibliotheken in de build-directory. Bakken kan worden uitgevoerd door naar het binaire bestand te verwijzen, maar als u wilt uitvoeren Bakken niet uit de map waarin het is gedownload, het is raadzaam om het pad toe te voegen bakken naar uw pad (omgevingsvariabele PATH), bijvoorbeeld als volgt (voorbeeld voor Linux bash-shell). Ga naar de map "bake" en stel vervolgens de volgende omgevingsvariabelen in:

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

Hiermee wordt het programma geplaatst bak.py naar het shell-pad en zorgt ervoor dat andere programma's de uitvoerbare bestanden en bibliotheken kunnen vinden die het heeft gemaakt bakken. In sommige gebruiksgevallen bakken, is de hierboven beschreven PATH- en PYTHONPATH-instelling niet vereist, maar een volledige build van ns-3-allinone (met extra pakketten) vereist dit meestal.

Ga naar uw werkmap en voer het volgende in de console in:

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

Vervolgens zullen we het vragen Bakken controleer of we voldoende gereedschap hebben om de verschillende componenten te laden. Wijzerplaat:

$ ./bake.py check

Je zou zoiets als het volgende moeten zien:

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

Met name uploadtools zoals Mercurial, CVS, Git en Bazaar zijn essentieel in deze stap, omdat ze ons in staat stellen de code te krijgen. Installeer nu de ontbrekende tools op de gebruikelijke manier voor uw systeem (als u weet hoe) of neem contact op met uw systeembeheerder voor hulp.

Probeer vervolgens de software te downloaden:

$ ./bake.py download

het resultaat zou zoiets moeten zijn als:

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

Dit betekent dat er drie bronnen zijn gedownload. Ga nu naar de bronmap en typ ls; Je zou moeten zien:

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

Nu bent u klaar om de ns-3-distributie te bouwen.

3.4 Montage ns-3

Net als bij het downloaden van ns-3 zijn er verschillende manieren om ns-3 te bouwen. Het belangrijkste dat we willen benadrukken is dat ns-3 is gebouwd met behulp van een build-tool genaamd Wafhieronder beschreven. De meeste gebruikers zullen ermee werken Waf, maar er zijn een paar handige scripts om u op weg te helpen of complexere builds te organiseren. Dus alsjeblieft, voordat je verder leest Waf, kijk eens bouwen.py en montage met bakken.

3.4.1 Bouwen met build.py

Waarschuwing! Deze bouwstap is alleen beschikbaar vanaf de bronarchiefversie die is verkregen zoals hierboven beschreven; en niet gedownload via git of bake.

Bij het werken met een release-archief tarbalIn ns-3-allinon Er is een handig script dat het samenstellen van de componenten eenvoudiger kan maken. Het heet build.py. Dit programma zal het project op de meest bruikbare manier voor u opzetten. Houd er echter rekening mee dat een geavanceerdere installatie en het werken met ns-3 meestal gepaard gaat met het gebruik van ns-3's eigen bouwsysteem, Waf, dat later in deze tutorial zal worden geïntroduceerd.

Als je hebt gedownload met tarbalen vervolgens in uw map ~/werkruimte een map met een naam zoiets als ns-allinon-3.29. Vul het volgende in:

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

Wanneer gebeld bouwen.py We hebben opdrachtregelargumenten gebruikt om de voorbeelden en tests te bouwen die in deze zelfstudie worden gebruikt, die niet standaard in ns-3 worden gebouwd. Standaard bouwt het programma ook alle beschikbare modules. Vervolgens kunt u desgewenst ns-3 bouwen zonder voorbeelden en tests, of modules uitsluiten die niet nodig zijn voor uw werk.

Je zult veel compileruitvoerberichten zien die door het script worden weergegeven terwijl het de verschillende onderdelen bouwt die je hebt geladen. Eerst zal het script proberen de animator te bouwen netanimen vervolgens de bindingsgenerator pybindgen en tenslotte ns-3. Wanneer het proces is voltooid, ziet u het volgende:

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 de laatste drie regels van de lijst zien we een bericht over modules die niet zijn gebouwd:

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

Dit betekent eenvoudigweg dat sommige ns-3-modules die afhankelijk zijn van externe bibliotheken mogelijk niet zijn gebouwd, of dat ze voor deze configuratie niet hoeven te worden gebouwd. Dit betekent niet dat de simulator niet is gemonteerd of dat de samengestelde modules niet correct zullen werken.

3.4.2 Bouwen met bakken

Als u hierboven bake hebt gebruikt om de broncode uit de projectrepository's te halen, kunt u deze blijven gebruiken om ns-3 te bouwen. Wijzerplaat:

$ ./bake.py build

en je zou zoiets moeten zien als:

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

helpen: U kunt ook zowel de download- als de build-stap in één keer uitvoeren door "bake.py deploy" aan te roepen.

Het assembleren van alle componenten kan mislukken, maar de montage gaat door als een component niet nodig is. Een recent draagbaarheidsprobleem was dat bijvoorbeeld castxml kan met gereedschap worden gemonteerd bakken niet op alle platforms. In dit geval verschijnt er een bericht als dit:

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

Maar castxml alleen nodig als u bijgewerkte Python-bindingen wilt maken. Voor de meeste gebruikers is dit niet nodig (tenminste totdat ze ns-3 wijzigen), dus dergelijke waarschuwingen kunnen voorlopig veilig worden genegeerd.

Als het mislukt, geeft de volgende opdracht u een hint over ontbrekende afhankelijkheden:

$ ./bake.py show

De verschillende afhankelijkheden van de pakketten die u probeert te bouwen, worden vermeld.

3.4.3 Bouwen met Waf

Tot nu toe gebruikten we, om te beginnen met het bouwen van ns-3, het script bouwen.py, of gereedschap bakken. Deze tools zijn handig voor het bouwen van ns-3 en het onderhouden van bibliotheken. Om te bouwen gebruiken ze zelfs de build-tool Waf uit map ns-3. Waf geïnstalleerd met de ns-3-broncode. De meeste gebruikers gaan snel over op direct gebruik voor het configureren en monteren van de ns‑3 Waf. Om verder te gaan, gaat u dus naar de ns-3-map die u oorspronkelijk hebt gemaakt.

Dit is op dit moment niet strikt vereist, maar het kan nuttig zijn om even terug te gaan en te zien hoe u wijzigingen in de projectconfiguratie kunt aanbrengen. Waarschijnlijk de nuttigste configuratiewijziging die u kunt aanbrengen, is het maken van een geoptimaliseerde versie van de code. Standaard hebt u uw project geconfigureerd om een ​​foutopsporingsversie te bouwen. Laten we een project bekijken om een ​​geoptimaliseerde build te maken. Om Waf uit te leggen dat het geoptimaliseerde builds moet maken die voorbeelden en tests bevatten, moet je de volgende opdrachten uitvoeren:

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

Dit wordt gestart Waf buiten de lokale map (voor uw gemak). Het eerste commando ruimt de vorige build op, dit is meestal niet strikt noodzakelijk, maar het is een goede gewoonte (zie ook buildprofielen hieronder); hierdoor worden eerder gemaakte bibliotheken en objectbestanden in de map verwijderd bouwen/. Wanneer het project opnieuw is geconfigureerd en het bouwsysteem de verschillende afhankelijkheden controleert, zou u een uitvoer moeten zien die er ongeveer als volgt uitziet:

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)

Let op het laatste deel van de bovenstaande lijst. Sommige ns-3-opties zijn standaard niet ingeschakeld of vereisen systeemondersteuning om goed te kunnen functioneren. Om XmlTo in te schakelen, moet de bibliotheek bijvoorbeeld op het systeem aanwezig zijn libxml-2.0. Als deze bibliotheek niet wordt gevonden en de bijbehorende ns-3-functie niet is ingeschakeld, wordt er een melding weergegeven. Merk ook op dat het mogelijk is om de opdracht te gebruiken sudo om de suid-bit "set group ID at runtime" in te stellen voor bepaalde programma's. Het is standaard niet ingeschakeld en daarom wordt deze functie weergegeven als “niet ingeschakeld”. Om ten slotte een lijst met ingeschakelde opties te krijgen, gebruikt u Waf met parameters --check-config.

Laten we nu teruggaan en teruggaan naar de debug-build met voorbeelden en tests.

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

Het bouwsysteem is nu ingesteld en u kunt debug-versies van ns-3-programma's bouwen door eenvoudigweg het volgende te typen:

$ ./waf

De bovenstaande stappen hebben je misschien gedwongen een deel van het ns-3-systeem twee keer te bouwen, maar nu weet je hoe je de configuratie kunt wijzigen en geoptimaliseerde code kunt bouwen.

Om te controleren welk profiel actief is voor een bepaalde projectconfiguratie, is er een commando:

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

Het bovenstaande scenario bouwen.py ondersteunt ook argumenten --enable-examples и --enable-tests, maar andere opties Waf het ondersteunt niet direct. Dit werkt bijvoorbeeld niet:

$ ./build.py --disable-python

de reactie zal als volgt zijn:

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

De speciale operator - - kan echter worden gebruikt om aanvullende parameters door te geven wafdus in plaats van het bovenstaande zal het volgende commando werken:

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

omdat het het hoofdcommando genereert ./waf configure --disable-python. Hier volgen nog enkele inleidende tips over Waf.

Bouwfouten afhandelen

ns-3-releases worden getest op de nieuwste C++-compilers die beschikbaar waren op het moment van uitgave op gangbare Linux- en MacOS-distributies. Na verloop van tijd worden er echter nieuwe distributies uitgebracht met nieuwe compilers, en deze nieuwere compilers zijn doorgaans pedanter over waarschuwingen. ns-3 configureert de build zo dat alle waarschuwingen als fouten worden behandeld, dus als u een oudere versie op een nieuwer systeem draait, kan een compilerwaarschuwing soms de build stoppen.

Er was bijvoorbeeld eerder een uitgave van ns-3.28 voor Fedora 28, die een nieuwe hoofdversie bevatte gcc (gcc-8). Bij het bouwen van de release ns-3.28 of eerdere versies onder Fedora 28, met Gtk2+ geïnstalleerd, zal de volgende fout optreden:

/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 vanaf ns‑3.28.1, in Waf Er is een optie beschikbaar om deze problemen op te lossen. Het schakelt het instellen van de vlag "-Werror" uit in g++ en clang++. Dit is de optie "--disable-werror" en moet tijdens de configuratie worden toegepast:

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

Configureren of monteren

Enkele commando's Waf hebben alleen betekenis in de configuratiefase, en sommige zijn alleen geldig in de bouwfase. Als u bijvoorbeeld de ns-3-emulatiefuncties wilt gebruiken, kunt u de bitinstelling inschakelen suid gebruik makend van sudo, zoals hierboven beschreven. Hierdoor worden de opdrachten voor de configuratiestappen overschreven en kunt u de configuratie wijzigen met behulp van de volgende opdracht, die ook voorbeelden en tests bevat.

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

Als je dit doet Waf zal starten sudoom programma's voor het maken van emulatiecodesockets te wijzigen zodat ze met machtigingen kunnen worden uitgevoerd wortel. In Waf Er zijn nog veel meer opties beschikbaar voor de configuratie- en bouwstappen. Om uw opties te verkennen, voert u het volgende in:

$ ./waf --help

In de volgende sectie zullen we enkele testgerelateerde opties gebruiken.

Montageprofielen

We hebben al gezien hoe je kunt configureren Waf voor montages debug и geoptimaliseerde:

$ ./waf --build-profile=debug

Er is ook een tussenmontageprofiel, los. Keuze -d is synoniem met --build-profile. Het buildprofiel regelt het gebruik van logboekregistratie, beweringen en schakelaars voor compileroptimalisatie:

ns-3 netwerksimulator-tutorial. Hoofdstuk 3

Zoals u kunt zien, zijn logboekregistratie en beweringen alleen beschikbaar in debug-builds. De aanbevolen praktijk is om uw script te ontwikkelen in de foutopsporingsmodus en vervolgens herhaalde runs uit te voeren (voor statistieken of parameterwijzigingen) in een geoptimaliseerd buildprofiel.

Als je code hebt die alleen in bepaalde buildprofielen mag worden uitgevoerd, gebruik dan 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;)

Standaard, Waf plaatst build-artefacten in de build-directory. Met de optie kunt u een andere uitvoermap opgeven - -out, bijvoorbeeld:

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

Door dit te combineren met buildprofielen kun je eenvoudig schakelen tussen verschillende compilatieopties:

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

Hierdoor kunt u met meerdere samenstellingen werken zonder dat u telkens de nieuwste samenstelling hoeft te herschrijven. Wanneer u naar een ander profiel overschakelt, Waf zal alleen het compileren, zonder alles volledig opnieuw te compileren.

Wanneer u op deze manier van bouwprofiel wisselt, moet u erop letten dat u elke keer dezelfde configuratie-opties geeft. Door verschillende omgevingsvariabelen te definiëren, kunt u fouten voorkomen:

$ 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 en vlaggen

In de bovenstaande voorbeelden Waf om ns-3 te bouwen gebruikt de C++ compiler van GCC ( g ++). U kunt echter degene die u gebruikt wijzigen Waf C++-compiler, door de CXX-omgevingsvariabele te definiëren. Als u bijvoorbeeld de C++-compiler Clang, clang++,

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

Op dezelfde manier kunt u configureren Waf om gedistribueerde compilatie te gebruiken met behulp van distcc:

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

Meer informatie over distcc en gedistribueerde compilatie is te vinden op de projectpagina in de sectie Documentatie. Om compilervlaggen toe te voegen bij het configureren van ns-3, gebruikt u de omgevingsvariabele CXXFLAGS_EXTRA.

installatie

Waf kan worden gebruikt om bibliotheken op verschillende plaatsen op het systeem te installeren. Standaard bevinden de gecompileerde bibliotheken en uitvoerbare bestanden zich in de map bouw, en aangezien Waf de locatie van deze bibliotheken en uitvoerbare bestanden kent, is het niet nodig om de bibliotheken ergens anders te installeren.

Als gebruikers liever buiten de build-directory installeren, kunnen ze de opdracht uitvoeren ./waf installeren. Het standaardvoorvoegsel voor installatie is / Usr / localdat is waarom ./waf installeren zal programma's installeren / Usr / local / bin, bibliotheken in / Usr / local / lib en header-bestanden in /usr/local/inclusief. Superuser-rechten moeten meestal worden ingesteld met een standaardvoorvoegsel, dus een typisch commando zou dat zijn sudo ./waf installeren. Wanneer het wordt gestart, zal Waf er eerst voor kiezen om de gedeelde bibliotheken in de build-map te gebruiken en vervolgens naar bibliotheken zoeken langs het pad naar de bibliotheken die in de lokale omgeving zijn geconfigureerd. Wanneer u bibliotheken op een systeem installeert, is het dus een goede gewoonte om te controleren of de juiste bibliotheken worden gebruikt. Gebruikers kunnen ervoor kiezen om met een ander voorvoegsel te installeren door de optie tijdens de configuratie door te geven --prefix, bijvoorbeeld:

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

Als de gebruiker later, na de build, de installatieopdracht invoert ./waf, wordt het voorvoegsel gebruikt /opt/lokaal.

Team ./waf clean moet worden gebruikt voordat het project opnieuw wordt geconfigureerd als de installatie zal worden gebruikt Waf onder een ander voorvoegsel.

Om ns-3 te gebruiken is het dus niet nodig om te bellen ./waf install. De meeste gebruikers hebben deze opdracht niet nodig omdat Waf zal de huidige bibliotheken uit de build-directory ophalen, maar sommige gebruikers kunnen dit nuttig vinden als hun activiteiten betrekking hebben op het werken met programma's buiten de ns-3-directory.

Waf single

Op het hoogste niveau van de ns-3-bronstructuur bevindt zich slechts één Waf-script. Als u eenmaal begint te werken, zult u veel tijd in de directory doorbrengen scratch/ of dieper insrc/... en tegelijkertijd moeten rennen Waf. Je kunt gewoon onthouden waar je bent en rennen Waf следующим обрахом:

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

maar dit zal vervelend en foutgevoelig zijn, dus er zijn betere oplossingen. Een veelgebruikte manier is om een ​​teksteditor te gebruiken, zoals emacs of vim, waarin twee terminalsessies worden geopend, één wordt gebruikt om ns-3 te bouwen en de tweede wordt gebruikt om de broncode te bewerken. Als je dat maar hebt tarbal, dan kan een omgevingsvariabele helpen:

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

$ cd scratch 
$ waff build

In de moduledirectory kan het verleidelijk zijn om een ​​triviaal waf-script toe te voegen, zoals exec ../../waf. Doe dat alsjeblieft niet. Dit is verwarrend voor nieuwelingen en leidt, als het slecht wordt gedaan, tot moeilijk te detecteren bouwfouten. De hierboven getoonde oplossingen zijn het pad dat moet worden gebruikt.

3.5 Testen van ns-3

U kunt de eenheidstests van de ns-3-distributie uitvoeren door het script uit te voeren ./test.py:

$ ./test.py

Deze tests worden parallel uitgevoerd met Waf. Uiteindelijk zou je een bericht moeten zien met de tekst:

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

Dit is een belangrijk bericht voor het identificeren van valgrind-crashes, crashes of fouten, wat problemen met de code of incompatibiliteit tussen tools en code aangeeft.

U zult ook de uiteindelijke uitvoer zien van Waf en een tester die elke test uitvoert, die er ongeveer zo uit zal zien:

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)

Deze opdracht wordt meestal door gebruikers uitgevoerd om snel te verifiëren dat de ns-3-distributie correct is gebouwd. (Merk op dat de volgorde van de regels "PASS: ..." anders kan zijn, dit is normaal. Wat belangrijk is, is dat de samenvattingsregel aan het einde van het rapport laat zien dat alle tests zijn geslaagd; geen enkele test is mislukt of gecrasht.) En WafEn test.py zal het werk parallelliseren over de beschikbare processorkernen van de machine.

3.6 Het script uitvoeren

Meestal voeren we scripts onder controle uit Waf. Hierdoor kan het bouwsysteem ervoor zorgen dat gedeelde bibliotheekpaden correct zijn ingesteld en dat de bibliotheken tijdens runtime beschikbaar zijn. Om het programma uit te voeren, gebruikt u eenvoudigweg Waf met parameters - -run. Laten we het ns-3-equivalent van het alomtegenwoordige programma uitvoeren hallo werelddoor het volgende te typen:

$ ./waf --run hello-simulator

Waf zal eerst controleren of het programma correct is gebouwd en indien nodig bouwen. Dan Waf zal een programma uitvoeren dat de volgende uitvoer produceert.

Hello Simulator

Gefeliciteerd! U bent nu een ns-3-gebruiker!

Wat moet ik doen als ik geen resultaten zie?

Als je berichten ziet Wafwat aangeeft dat de build met succes is voltooid, maar dat u de uitvoer niet ziet "Hallo simulator", dan bestaat de mogelijkheid dat je in de sectie [Build-with-Waf] naar de bouwmodus bent overgeschakeld geoptimaliseerde, maar miste het terugschakelen naar de modus debug. Alle console-uitvoer die in deze zelfstudie wordt gebruikt, maakt gebruik van een speciale ns-3-component die logboekregistratie uitvoert en wordt gebruikt om aangepaste berichten naar de console af te drukken. De uitvoer van dit onderdeel wordt automatisch uitgeschakeld wanneer geoptimaliseerde code wordt gecompileerd - het is "geoptimaliseerd". Als u de uitvoer "Hello Simulator" niet ziet, voert u het volgende in:

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

configureren Waf om debug-versies van ns-3-programma's te bouwen, inclusief voorbeelden en tests. Vervolgens moet u de huidige foutopsporingsversie van de code opnieuw opbouwen door te typen

$ ./waf

Als u nu het programma uitvoert hallo-simulator, zou u het verwachte resultaat moeten zien.

3.6.1 Opdrachtregelargumenten

Gebruik het volgende patroon om opdrachtregelargumenten door te geven aan het ns-3-programma:

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

Vervangen naar de naam van uw programma en naar de argumenten. Argument - -command-template voor Waf is in wezen een recept voor het bouwen van de daadwerkelijke opdrachtregel Waf gebruikt om het programma uit te voeren. Waf controleert of de build voltooid is, stelt de gedeelde bibliotheekpaden in, gebruikt vervolgens de meegeleverde opdrachtregelsjabloon en vervangt de programmanaam door de tijdelijke aanduiding %s om het uitvoerbare bestand aan te roepen. Als je deze syntaxis ingewikkeld vindt, is er een eenvoudigere versie waarbij het ns-3-programma en de argumenten tussen enkele aanhalingstekens betrokken zijn:

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

Een ander bijzonder nuttig voorbeeld is het selectief uitvoeren van testsuites. Laten we aannemen dat er een testpakket bestaat met de naam mytest (dat is in feite niet het geval). Hierboven hebben we het script ./test.py gebruikt om een ​​aantal tests parallel uit te voeren, waarbij het testprogramma herhaaldelijk wordt aangeroepen testloper. Telefoongesprek testloper direct om één test uit te voeren:

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

Argumenten worden doorgegeven aan het programma testloper. Omdat mytest niet bestaat, wordt er een foutmelding gegenereerd. Om de beschikbare testrunner-opties af te drukken, voert u het volgende in:

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

3.6.2 Foutopsporing

Om ns-3-programma's uit te voeren onder een ander hulpprogramma, zoals een debugger (bijvoorbeeld gdb) of een geheugentesttool (bijvoorbeeld valgrind), gebruik een soortgelijk formulier - -command-template = "…". Bijvoorbeeld om in de debugger uit te voeren gdb je hello-simulator ns-3-programma met argumenten:

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

Merk op dat de programmanaam ns-3 met het argument wordt geleverd - -runen het beheerhulpprogramma (hier gdb) is het eerste token in het argument - -command-template. Keuze - -args rapporten gdbdat de rest van de opdrachtregel tot het "lagere" programma behoort. (Sommige versies gdb begrijp de optie niet - -args. Verwijder in dit geval de programmaargumenten uit - -command-template en gebruik de commandoset gdb betoogt.) We kunnen dit recept en het vorige combineren om de test onder de debugger uit te voeren:

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

3.6.3 Werkmap

Waf moet worden gelanceerd vanaf de locatie bovenaan de ns-3-boom. Deze map wordt de werkmap waar de uitvoerbestanden zullen worden geschreven. Maar wat als u deze bestanden buiten de ns-3-bronstructuur wilt bewaren? Gebruik argumentatie - -cwd:

$ ./waf --cwd=...

Mogelijk vindt u het handiger om de uitvoerbestanden in uw werkmap te plaatsen. In dit geval kan de volgende indirecte actie helpen:

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

Deze decoratie van de vorige versie van de opdracht behoudt de huidige werkmap en gaat naar de map Wafen geeft dan instructies Waf om de werkmap terug te zetten naar de huidige werkmap die is opgeslagen voordat het programma werd gestart. We noemen het team - -cwd Voor de volledigheid: de meeste gebruikers voeren Waf eenvoudigweg uit vanuit de map op het hoogste niveau en genereren daar uitvoerbestanden.

Vervolg: Hoofdstuk 4

Bron: www.habr.com

Voeg een reactie