ns-3 netværkssimulator tutorial. Kapitel 3

ns-3 netværkssimulator tutorial. Kapitel 3
kapitel 1,2

3 Kom godt i gang
3.1 Oversigt
3.2 Forudsætninger
3.2.1 Download af ns-3-udgivelsen som et kildearkiv
3.3 Download af ns-3 ved hjælp af Git
3.3.1 Indlæsning af ns-3 ved hjælp af Bake
3.4 Samling ns-3
3.4.1 Bygning med build.py
3.4.2 Bygning med bage
3.4.3 Byg med Waf
3.5 Test ns-3
3.6 Kørsel af scriptet
3.6.1 Kommandolinjeargumenter
3.6.2 Fejlretning
3.6.3 Arbejdsmappe

Kapitel 3

Kom godt i gang

Dette kapitel er beregnet til at forberede læseren til at begynde med en computer, der måske aldrig har installeret ns-3. Den dækker understøttede platforme, forudsætninger, hvordan man får ns-3, hvordan man bygger ns-3, og hvordan man tester sin build og kører simple programmer.

3.1 Oversigt

ns-3 simulatoren er bygget som et system af kollaborative softwarebiblioteker. Under montering er koden for brugerprogrammer forbundet med disse biblioteker. Programmeringssprogene C++ eller Python bruges til at skrive brugerdefinerede programmer.

Ns-3 distribueres som kildekode, hvilket betyder, at målsystemet skal have et softwareudviklingsmiljø for først at bygge bibliotekerne og derefter bygge brugerprogrammet. I princippet vil ns-3 kunne distribueres som færdige biblioteker til et bestemt system, og i fremtiden kan de distribueres på denne måde. Men i dag udfører mange brugere faktisk deres arbejde ved at redigere selve ns-3, så det er nyttigt at have kildekoden til at bygge bibliotekerne. Hvis nogen har lyst til at påtage sig arbejdet med at lave færdige biblioteker og pakker til styresystemer, så kontakt venligst mailinglisten ns-udviklere.

Dernæst vil vi se på tre måder at downloade og bygge ns-3 på. Den første er at downloade og bygge den officielle udgivelse fra hovedsiden. Den anden er udvælgelsen og samlingen af ​​kopier af udviklingsversioner af den grundlæggende ns-3-installation. Den tredje er at bruge yderligere byggeværktøjer til at indlæse flere udvidelser til ns-3. Vi vil gennemgå hver enkelt, da værktøjerne er lidt forskellige.

Erfarne Linux-brugere undrer sig måske over, hvorfor ns-3 ikke leveres som en pakke som de fleste andre biblioteker, der bruger en pakkehåndtering? Selvom der er binære pakker til forskellige Linux-distributioner (f.eks. Debian), ender de fleste brugere med at redigere bibliotekerne og selv skulle genopbygge ns-3, så det er praktisk at have kildekoden tilgængelig. Af denne grund vil vi fokusere på at installere fra kilden.

For de fleste applikationer ns-3 rettigheder rod ikke er nødvendige, anbefales det at bruge en uprivilegeret brugerkonto.

3.2 Forudsætninger

Hele sættet af tilgængelige ns-3 biblioteker har en række afhængigheder af tredjeparts biblioteker, men for det meste kan ns-3 bygges og bruges med understøttelse af flere almindelige (ofte installeret som standard) komponenter: en C++ compiler, Python, en kildekodeeditor (f.eks. vim, emacs eller Eclipse) og, hvis der bruges udviklingslagre, Git versionskontrolsystemer. De fleste førstegangsbrugere behøver ikke at bekymre sig, hvis deres konfiguration rapporterer, at nogle ns-3 avancerede funktioner mangler, men for dem, der ønsker en fuld installation, giver projektet en wiki, der indeholder sider med masser af nyttige tips og tricks. En sådan side er installationssiden, med installationsinstruktioner til forskellige systemer, tilgængelig på: https://www.nsnam.org/wiki/Installation.

Afsnittet Forudsætninger i denne wiki forklarer, hvilke pakker der kræves for at understøtte almindelige ns-3-indstillinger og giver også kommandoerne, der bruges til at installere dem på almindelige varianter af Linux eller macOS.

Du kan drage fordel af denne mulighed for at udforske ns-3 wiki-siden eller hovedwebstedet: https://www.nsnam.org, fordi der er en masse information der. Fra den seneste version af ns-3 (ns-3.29) kræves følgende værktøjer for at køre ns-3:

Værktøjspakke/version

  • C++ compiler
    clang++ eller g++ (g++ version 4.9 eller nyere)
  • Python
    python2 version >= 2.7.10 eller python3 version >=3.4
  • Git
    enhver seneste version (for at få adgang til ns-3 på GitLab.com)
  • tjære
    enhver seneste version (til udpakning af ns-3-udgivelse)
  • bunzip2
    enhver seneste version (til udpakning af ns-3-udgivelsen)

For at kontrollere standardversionen af ​​Python, skriv python -V. For at kontrollere g++-versionen skal du skrive g++ -v. Hvis nogen værktøjer mangler eller er for gamle, henvises til installationsvejledningen på ns-3 wiki-siden.

Fra dette tidspunkt antager vi, at læseren kører Linux, MacOS eller en Linux-emulator og i det mindste har ovenstående værktøjer.

3.2.1 Download af ns-3-udgivelsen som et kildearkiv

Dette er handlingsforløbet for en ny bruger, der ønsker at downloade og eksperimentere med den seneste udgivelse og pakkeversioner af ns-3. ns-3-udgivelser udgives som komprimerede kildearkiver, nogle gange kaldet tarball'en. tarball'en er et specielt softwarearkivformat, hvor flere filer kombineres. Arkivet er normalt komprimeret. ns-3 boot proces via tarball'en er enkelt, du skal bare vælge en udgivelse, downloade og pakke den ud.

Lad os antage, at du som bruger ønsker at bygge ns-3 i en lokal mappe kaldet arbejdsområde. Du kan få en arbejdskopi af udgivelsen ved at indtaste følgende i Linux-konsollen (naturligvis erstatte de relevante versionsnumre)

$ 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 

Vær opmærksom på værktøjet brugt ovenfor wget, som er et kommandolinjeværktøj til at downloade objekter fra internettet. Hvis du ikke har installeret det, kan du bruge din browser til dette.

Ved at følge disse trin kommer du til mappen ns-allinone-3.29, der skulle du se flere filer og mapper

$ 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

Du er nu klar til at bygge en grundlæggende ns-3 distribution og kan gå videre til afsnittet om at bygge ns-3.

3.3 Download af ns-3 ved hjælp af Git

ns-3-koden er tilgængelig i Git repositories på GitLab.com på https://gitlab.com/nsnam/. Gruppe nsnam samler de forskellige repositories, der bruges af et open source-projekt.

Den nemmeste måde at begynde at bruge Git-depoter på er at forgrene eller klone miljøet ns-3-allinon. Dette er et sæt scripts, der styrer indlæsning og samling af de mest almindeligt anvendte ns-3-undersystemer. Hvis du er ny til Git, kan termerne "gaffel" og "klone" være ukendte for dig; i så fald anbefaler vi, at du blot kloner (laver din egen kopi) lageret placeret på GitLab.com sådan her:

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

På dette stadium, visningen af ​​din mappe ns-3-allinon lidt anderledes end udgivelsesarkivbiblioteket beskrevet ovenfor. Det skal se sådan ud:

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

Bemærk venligst, at der er et script download.py, som desuden vil udtrække ns-3 og dens medfølgende kildekode. Her har du et valg: enten download det seneste ns-3 udviklingssnapshot:

$ python download.py

eller foretrækker ns-3 udgivelsen ved at bruge flaget -n for at angive udgivelsesnummeret:

$ python download.py -n ns-3.29

Efter dette trin til mappen ns-3-allinon yderligere arkiver vil blive downloadet ns-3, bage, pybindgen и netanim.

Bemærk
På en maskine med ren Ubuntu16.04 var jeg nødt til at ændre kommandoen til dette: $ sudo python3 download.py -n ns-3.29 (herefter oversætterens noter).

3.3.1 Indlæsning af ns-3 ved hjælp af Bake

Ovenstående to metoder (kildearkiv eller arkiv ns-3-allinon via Git) er nyttige til at få den enkleste ns-3 installation med flere tilføjelser (pybindgen at generere Python-bindinger og netanim til netværksanimation). Det tredje lager, der leveres som standard i ns-3-allinone, kaldes bage.

Bage er et værktøj til koordineret opbygning af software fra flere repositories, udviklet til ns-3 projektet. Bage kan bruges til at hente udviklingsversioner af ns-3, samt til at downloade og bygge udvidelser af basisversionen af ​​ns-3 distributionen, såsom miljøet Direkte kodeudførelse, CradleNetwork Simulation Cradle, muligheden for at skabe nye Python-bindinger og forskellige ns-3 "apps".

Bemærk
CradleNetwork Simulation Cradle er en ramme, der giver dig mulighed for at bruge rigtige TCP/IP-netværksstakke inde i en netværkssimulator.

Hvis du forventer, at din ns-3 installation har avancerede eller yderligere funktioner, kan du følge denne installationssti.

I de seneste ns-3 udgivelser Bage blev tilføjet til tjærefrigivelsen. Udgivelsen inkluderer en konfigurationsfil, der giver dig mulighed for at downloade de aktuelle softwareversioner på udgivelsestidspunktet. Det er for eksempel versionen Bage, som er distribueret med udgivelse ns-3.29, kan bruges til at hente komponenter til den pågældende udgivelse af ns-3 eller tidligere, men kan ikke bruges til at hente komponenter til senere udgivelser (hvis pakkebeskrivelsesfilen bakeconf.xml ikke opdateret).

Du kan også få det seneste eksemplar bageved at indtaste følgende kommando i din Linux-konsol (forudsat at du har Git installeret):

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

Når du kører git-kommandoen, skulle du se noget i stil med følgende:

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.

Når kommandoen er fuldført klone du skal have en mappe navngivet bage, hvis indhold skulle se nogenlunde sådan ud:

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

Bemærk, at du har indlæst flere Python-scripts, et Python-modul med navnet bage og en XML-konfigurationsfil. Det næste trin er at bruge disse scripts til at downloade og bygge ns-3 distributionen efter eget valg. Flere tilpasningsmål er tilgængelige:

  1. ns-3.29: modul svarende til udgivelsen; det vil downloade komponenter svarende til udgivelsen i tarballen;

  2. ns-3-dev: et lignende modul, men ved hjælp af kode fra udviklingstræet;

  3. ns-allinon-3.29: Et modul, der indeholder andre ekstra funktioner såsom klikruting og netværkssimuleringsholder, Openflow til ns-3.

  4. ns-3-allinon: ligner udgivelsesversionen af ​​modulet alt i en, men for udviklingskode.

Bemærk
Klik — modulær softwarearkitektur til oprettelse af routere.

Openflow er en protokol til styring af processen med at behandle data, der transmitteres over et datanetværk af routere og switches, ved at implementere softwaredefineret netværksteknologi.

Det aktuelle udviklingsøjebliksbillede (ikke-udgivet) ns-3 kan findes på:https://gitlab.com/nsnam/ns-3-dev.git.

Udviklerne forsøger at holde disse lagre i en ensartet funktionsdygtig stand, men de er i udviklingsområdet og indeholder ikke-udgivet kode, så hvis du ikke planlægger at bruge nye funktioner, så vælg den officielle udgivelse.

Du kan finde den seneste version af koden ved at gennemse listen over repositories eller ved at gå til ns-3 Releases-websiden:https://www.nsnam.org/releases/ og klik på linket til den seneste version. I dette eksempel vil vi fortsætte med ns-3.29.

Nu, for at få de ns-3-komponenter, vi har brug for, bruger vi værktøjet Bage. Lad os sige et par indledende ord om arbejdet Bage.

Bake fungerer ved at indlæse pakkekilder i en mappe kilde og installation af bibliotekerne i build-mappen. Bage kan køres ved at referere til det binære, men hvis du vil køre Bage ikke fra den mappe, hvor den blev downloadet, er det tilrådeligt at tilføje stien til bage til din sti (PATH miljøvariabel), for eksempel som følger (eksempel på Linux bash shell). Gå til mappen "bage", og indstil derefter følgende miljøvariabler:

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

Dette vil placere programmet bage.py til shell-stien og vil tillade andre programmer at finde de eksekverbare filer og biblioteker, som den oprettede bage. I nogle tilfælde bage, er indstillingen PATH og PYTHONPATH beskrevet ovenfor ikke påkrævet, men en komplet build af ns-3-allinone (med yderligere pakker) kræver det normalt.

Gå til din arbejdsmappe og indtast følgende i konsollen:

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

Dernæst vil vi spørge Bage kontrollere, om vi har nok værktøjer til at indlæse de forskellige komponenter. Urskive:

$ ./bake.py check

Du bør se noget i stil med følgende:

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

Især upload-værktøjer som Mercurial, CVS, Git og Bazaar er essentielle i dette trin, da de giver os mulighed for at få koden. På dette tidspunkt skal du installere de manglende værktøjer på den sædvanlige måde for dit system (hvis du ved hvordan) eller kontakte din systemadministrator for at få hjælp.

Prøv derefter at downloade softwaren:

$ ./bake.py download

resultatet skulle være noget som:

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

Det vil betyde, at tre kilder er blevet downloadet. Gå nu til kildebiblioteket og skriv ls; Du bør se:

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

Nu er du klar til at bygge ns-3 distributionen.

3.4 Samling ns-3

Som med at downloade ns-3, er der flere måder at bygge ns-3 på. Det vigtigste, vi vil understrege, er, at ns-3 er bygget ved hjælp af et byggeværktøj kaldet Wafbeskrevet nedenfor. De fleste brugere vil arbejde med Waf, men der er et par praktiske scripts, der hjælper dig med at komme i gang eller organisere mere komplekse builds. Så venligst, før du læser om Waf, se på build.py og montering med bage.

3.4.1 Bygning med build.py

Advarsel! Dette byggetrin er kun tilgængeligt fra kildearkivversionen opnået som beskrevet ovenfor; og ikke downloades via git eller bake.

Når du arbejder med et udgivelsesarkiv tarball'enI ns-3-allinon Der er et praktisk script, der kan gøre det nemmere at samle komponenterne. Det hedder build.py. Dette program vil sætte projektet op for dig på den mest nyttige måde. Bemærk dog, at mere avanceret opsætning og arbejde med ns-3 normalt involverer brug af ns-3's eget byggesystem, Waf, som vil blive introduceret senere i denne tutorial.

Hvis du downloadede vha tarball'en, derefter i din mappe ~/arbejdsplads en mappe med et navn noget lignende ns-allinon-3.29. Indtaste følgende:

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

Når du ringer build.py Vi brugte kommandolinjeargumenter til at bygge de eksempler og test, der blev brugt i denne øvelse, som ikke er bygget som standard i ns-3. Som standard bygger programmet også alle tilgængelige moduler. Så kan du, hvis du ønsker det, bygge ns-3 uden eksempler og test, eller udelukke moduler, der ikke er nødvendige for dit arbejde.

Du vil se en masse compiler-outputmeddelelser, der vises af scriptet, mens det bygger de forskellige dele, du har indlæst. Først vil scriptet forsøge at bygge animatoren netanim, derefter bindingsgeneratoren pybindgen og til sidst ns-3. Når processen er færdig, bør du se følgende:

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

I de sidste tre linjer af listen ser vi en besked om moduler, der ikke blev bygget:

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

Dette betyder ganske enkelt, at nogle ns-3-moduler, der er afhængige af eksterne biblioteker, måske ikke er blevet bygget, eller at de ikke skal bygges til denne konfiguration. Det betyder ikke, at simulatoren ikke er samlet, eller at de samlede moduler ikke vil fungere korrekt.

3.4.2 Bygning med bage

Hvis du brugte bake ovenfor til at hente kildekode fra projektets repositories, kan du fortsætte med at bruge det til at bygge ns-3. Urskive:

$ ./bake.py build

og du skulle se noget som:

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

hjælpe: Du kan også udføre både download- og build-trinene på én gang ved at kalde "bake.py deploy".

Samling af alle komponenter kan mislykkes, men monteringen fortsætter, hvis en komponent ikke er påkrævet. For eksempel var et nyligt portabilitetsproblem det castxml kan samles med værktøj bage ikke på alle platforme. I dette tilfælde vises en meddelelse som denne:

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

Men castxml kun nødvendigt, hvis du vil oprette opdaterede Python-bindinger. For de fleste brugere er der ikke behov for dette (i hvert fald indtil de ændrer ns-3), så sådanne advarsler kan sikkert ignoreres indtil videre.

Hvis det mislykkes, vil følgende kommando give dig et tip om manglende afhængigheder:

$ ./bake.py show

De forskellige afhængigheder af de pakker, du forsøger at bygge, vil blive vist.

3.4.3 Byg med Waf

Indtil dette tidspunkt brugte vi enten scriptet for at begynde at bygge ns-3 build.pyeller værktøj bage. Disse værktøjer er nyttige til at bygge ns-3 og vedligeholde biblioteker. Faktisk kører de byggeværktøjet for at bygge Waf fra ns-3 mappen. Waf installeret med ns-3 kildekoden. De fleste brugere går hurtigt videre til direkte brug for at konfigurere og samle ns-3 Waf. Så for at fortsætte skal du gå til ns-3-biblioteket, som du oprindeligt oprettede.

Dette er ikke strengt nødvendigt på nuværende tidspunkt, men det vil være nyttigt at gå lidt tilbage og se, hvordan man foretager ændringer i projektkonfigurationen. Den sandsynligvis mest nyttige konfigurationsændring, du kan foretage, er at oprette en optimeret version af koden. Som standard har du konfigureret dit projekt til at bygge en fejlretningsversion. Lad os se på et projekt for at skabe en optimeret samling. For at forklare Waf, at det skal lave optimerede builds, der inkluderer eksempler og tests, skal du køre følgende kommandoer:

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

Dette vil starte Waf uden for den lokale telefonbog (for nemheds skyld). Den første kommando rydder op fra den forrige build, dette er normalt ikke strengt nødvendigt, men det er god praksis (se også build-profiler nedenfor); dette vil slette tidligere oprettede biblioteker og objektfiler, der er placeret i mappen bygge/. Når projektet er omkonfigureret, og byggesystemet kontrollerer de forskellige afhængigheder, bør du se output svarende til følgende:

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)

Bemærk venligst den sidste del af listen ovenfor. Nogle ns-3-indstillinger er ikke aktiveret som standard eller kræver systemsupport for at fungere korrekt. For at aktivere XmlTo skal biblioteket f.eks. være til stede på systemet libxml-2.0. Hvis dette bibliotek ikke blev fundet, og den tilsvarende ns-3-funktion ikke var aktiveret, vil der blive vist en meddelelse. Bemærk også, at det er muligt at bruge kommandoen sudo at indstille suid bit "indstil gruppe-id ved kørsel" for visse programmer. Den er ikke aktiveret som standard, og derfor vises denne funktion som "ikke aktiveret". Til sidst, for at få en liste over aktiverede muligheder, brug Waf med parameter --check-config.

Lad os nu gå tilbage og skifte tilbage til debug-builden, der indeholder eksempler og tests.

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

Byggesystemet er nu sat op, og du kan bygge debug-versioner af ns-3-programmer ved blot at skrive:

$ ./waf

Ovenstående trin kan have tvunget dig til at bygge en del af ns-3-systemet to gange, men nu ved du, hvordan du ændrer konfigurationen og bygger optimeret kode.

For at kontrollere, hvilken profil der er aktiv for en given projektkonfiguration, er der en kommando:

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

Ovenstående scenarie build.py understøtter også argumenter --enable-examples и --enable-tests, men andre muligheder Waf det understøtter ikke direkte. For eksempel vil dette ikke virke:

$ ./build.py --disable-python

reaktionen vil være sådan:

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

Den specielle operatør - - kan dog bruges til at sende yderligere parametre via WAFså i stedet for ovenstående vil følgende kommando virke:

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

fordi den genererer hovedkommandoen ./waf configure --disable-python. Her er nogle flere indledende tips om Waf.

Håndtering af byggefejl

ns-3-udgivelser er testet på de seneste C++-kompilere, der er tilgængelige på udgivelsestidspunktet på almindelige Linux- og MacOS-distributioner. Men over tid frigives nye distributioner med nye compilere, og disse nyere compilere har en tendens til at være mere pedantiske over for advarsler. ns-3 konfigurerer sin build til at behandle alle advarsler som fejl, så nogle gange, hvis du kører en ældre version på et nyere system, kan en compiler-advarsel stoppe buildet.

For eksempel var der tidligere en udgivelse af ns-3.28 til Fedora 28, som inkluderede en ny større version gcc (gcc-8). Ved at bygge udgivelsen ns-3.28 eller tidligere versioner under Fedora 28, med Gtk2+ installeret, vil følgende fejl opstå:

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

I udgivelser, der starter fra ns-3.28.1, i Waf en mulighed er tilgængelig for at løse disse problemer. Det deaktiverer indstilling af "-Werror"-flaget i g++ og clang++. Dette er "--disable-werror"-indstillingen og skal anvendes under konfigurationen:

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

Konfigurer eller saml

Nogle kommandoer Waf har kun betydning i konfigurationsfasen, og nogle er kun gyldige i byggefasen. For eksempel, hvis du vil bruge ns-3 emuleringsfunktionerne, kan du aktivere bitindstillingen SUID ved brug af sudo, som beskrevet ovenfor. Dette vil tilsidesætte kommandoerne for konfigurationstrin, og du kan således ændre konfigurationen ved hjælp af følgende kommando, som også inkluderer eksempler og tests.

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

Hvis du gør dette Waf vil starte sudofor at ændre programmer til oprettelse af emuleringskodesocket til at køre med tilladelser rod. I Waf Der er mange andre muligheder tilgængelige for konfigurations- og byggetrinene. For at udforske dine muligheder skal du indtaste:

$ ./waf --help

I det næste afsnit vil vi bruge nogle testrelaterede muligheder.

Samlingsprofiler

Vi har allerede set, hvordan du kan konfigurere Waf til forsamlinger debug и optimeret:

$ ./waf --build-profile=debug

Der er også en mellemliggende montageprofil, frigive. Mulighed -d er synonymt med --build-profile. Byggeprofilen styrer brugen af ​​logning, påstande og kompileringsoptimeringsswitches:

ns-3 netværkssimulator tutorial. Kapitel 3

Som du kan se, er logning og påstande kun tilgængelige i debug-builds. Den anbefalede praksis er at udvikle dit script i debug-tilstand og derefter udføre gentagne kørsler (til statistik eller parameterændringer) i en optimeret build-profil.

Hvis du har kode, der kun skal køre i visse build-profiler, skal du bruge kodeombrydningsmakroen:

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 placerer byggeartefakter i build-mappen. Du kan angive en anden outputmappe ved hjælp af indstillingen - -out, for eksempel:

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

Ved at kombinere dette med byggeprofiler kan du nemt skifte mellem forskellige kompileringsmuligheder:

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

Hvilket giver dig mulighed for at arbejde med flere samlinger uden at skulle omskrive den seneste samling hver gang. Når du skifter til en anden profil, Waf vil kun kompilere det uden fuldstændigt at omkompilere alt.

Når du skifter byggeprofiler på denne måde, skal du være omhyggelig med at give de samme konfigurationsmuligheder hver gang. At definere flere miljøvariabler hjælper dig med at undgå fejl:

$ 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

Kompilere og flag

I ovenstående eksempler Waf at bygge ns-3 bruger C++ compileren fra GCC ( g ++). Du kan dog ændre den, du bruger Waf C++ compiler ved at definere CXX miljøvariablen. For at bruge C++ compileren Clang, clang++,

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

På samme måde kan du konfigurere Waf at bruge distribueret kompilering vha distcc:

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

Mere information om distcc og distribueret kompilering kan findes på projektsiden i afsnittet Dokumentation. For at tilføje compilerflag, når du konfigurerer ns-3, skal du bruge miljøvariablen CXXFLAGS_EXTRA.

Installation

Waf kan bruges til at installere biblioteker forskellige steder på systemet. Som standard er de kompilerede biblioteker og eksekverbare filer placeret i mappen bygge, og da Waf kender placeringen af ​​disse biblioteker og eksekverbare filer, er der ingen grund til at installere bibliotekerne andre steder.

Hvis brugere foretrækker at installere uden for build-mappen, kan de køre kommandoen ./waf installere. Standardpræfikset for installation er / Usr / localdet er derfor ./waf installere vil installere programmer i / Usr / local / bin, biblioteker i / Usr / local / lib og header-filer i /usr/local/include. Superbrugerrettigheder skal normalt indstilles med et standardpræfiks, så en typisk kommando ville være det sudo ./waf installere. Når det er lanceret, vil Waf først vælge at bruge de delte biblioteker i build-mappen og derefter søge efter biblioteker langs stien til bibliotekerne, der er konfigureret i det lokale miljø. Så når du installerer biblioteker på et system, er det en god praksis at kontrollere, at de rigtige biblioteker bliver brugt. Brugere kan vælge at installere med et andet præfiks ved at videregive muligheden under konfigurationen --prefix, for eksempel:

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

Hvis brugeren senere, efter build, indtaster installationskommandoen ./waf, vil præfikset blive brugt /opt/local.

Team ./waf clean skal bruges før rekonfigurering af projektet, hvis installationen vil bruge Waf under et andet præfiks.

For at bruge ns-3 er der således ingen grund til at ringe ./waf install. De fleste brugere har ikke brug for denne kommando, fordi Waf vil hente de aktuelle biblioteker fra build-mappen, men nogle brugere kan finde dette nyttigt, hvis deres aktiviteter involverer at arbejde med programmer uden for ns-3-mappen.

Waf single

På det øverste niveau af ns-3 kildetræet er der kun ét Waf-script. Når du begynder at arbejde, vil du bruge meget tid i biblioteket scratch/ eller dybere indsrc/... og skal samtidig løbe Waf. Du kan bare huske, hvor du er og løbe Waf som følger:

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

men dette vil være kedeligt og udsat for fejl, så der er bedre løsninger. En almindelig måde er at bruge en teksteditor som f.eks emacs eller vim, hvor to terminalsessioner åbnes, den ene bruges til at bygge ns-3, og den anden bruges til at redigere kildekoden. Hvis du bare har tarball'en, så kan en miljøvariabel hjælpe:

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

$ cd scratch 
$ waff build

I modulbiblioteket kan det være fristende at tilføje et trivielt waf-script som f.eks exec ../../waf. Gør venligst ikke det. Dette er forvirrende for nybegyndere, og når det gøres dårligt, fører det til byggefejl, der er svære at opdage. Løsningerne vist ovenfor er den vej, der skal bruges.

3.5 Test ns-3

Du kan køre ns-3 distributionens enhedstests ved at køre scriptet ./test.py:

$ ./test.py

Disse test afvikles sideløbende med Waf. Til sidst skulle du se en besked, der siger:

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

Dette er en vigtig besked til at identificere valgrind-nedbrud, nedbrud eller fejl, hvilket indikerer problemer med koden eller inkompatibilitet mellem værktøjer og kode.

Du vil også se det endelige output fra Waf og en tester, der kører hver test, som ser sådan ud:

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)

Denne kommando køres normalt af brugere for hurtigt at verificere, at ns-3-distributionen er bygget korrekt. (Bemærk, at rækkefølgen af ​​"PASS: ..."-linjerne kan være anderledes, dette er normalt. Det vigtige er, at oversigtslinjen i slutningen af ​​rapporten viser, at alle tests bestået; ingen test bestod eller gik ned.) Og WafOg test.py vil parallelisere arbejdet på tværs af maskinens tilgængelige processorkerner.

3.6 Kørsel af scriptet

Vi kører normalt scripts under kontrol Waf. Dette gør det muligt for build-systemet at sikre, at delte biblioteksstier er indstillet korrekt, og at bibliotekerne er tilgængelige under kørsel. For at køre programmet skal du blot bruge Waf med parameter - -run. Lad os køre ns-3-ækvivalenten til det allestedsnærværende program hej verdenved at skrive følgende:

$ ./waf --run hello-simulator

Waf vil først kontrollere, at programmet er bygget korrekt og bygge evt. Derefter Waf vil udføre et program, der producerer følgende output.

Hello Simulator

Tillykke! Du er nu en ns-3 bruger!

Hvad skal jeg gøre, hvis jeg ikke kan se resultater?

Hvis du ser beskeder Wafangiver, at opbygningen er gennemført med succes, men du kan ikke se outputtet "Hej Simulator", så er der en mulighed for, at du i [Byg-med-Waf]-sektionen skiftede din byggetilstand til optimeret, men savnede at skifte tilbage til tilstanden debug. Alt konsoloutput, der bruges i denne øvelse, bruger en speciel ns-3-komponent, der udfører logning og bruges til at udskrive brugerdefinerede meddelelser til konsollen. Output fra denne komponent deaktiveres automatisk, når optimeret kode kompileres - den er "optimeret". Hvis du ikke kan se "Hej Simulator"-output, skal du indtaste følgende:

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

at konfigurere Waf at bygge debug-versioner af ns-3-programmer, som inkluderer eksempler og tests. Du bør derefter genopbygge den aktuelle debug-version af koden ved at skrive

$ ./waf

Hvis du nu kører programmet hej-simulator, bør du se det forventede resultat.

3.6.1 Kommandolinjeargumenter

For at sende kommandolinjeargumenter til ns-3-programmet skal du bruge følgende mønster:

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

Erstatte til navnet på dit program og til argumenterne. Argument - -command-template for Waf er i bund og grund en opskrift på at bygge selve kommandolinjen Waf bruges til at køre programmet. Waf kontrollerer, at opbygningen er færdig, indstiller de delte biblioteksstier, bruger derefter den medfølgende kommandolinjeskabelon og erstatter programnavnet med %s pladsholderen for at kalde den eksekverbare. Hvis du finder denne syntaks kompliceret, er der en enklere version, der involverer ns-3-programmet og dets argumenter omsluttet af enkelte anførselstegn:

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

Et andet særligt nyttigt eksempel er at køre testpakker selektivt. Lad os antage, at der er en testpakke kaldet mytest (det er der faktisk ikke). Ovenfor brugte vi ./test.py-scriptet til at køre en række tests parallelt, som gentagne gange kalder testprogrammet testløber. Opkald testløber direkte for at køre en test:

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

Argumenter vil blive videregivet til programmet testløber. Da mytest ikke eksisterer, vil der blive genereret en fejlmeddelelse. For at udskrive de tilgængelige test-runner-indstillinger skal du indtaste:

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

3.6.2 Fejlretning

For at køre ns-3-programmer under et andet hjælpeprogram, såsom en debugger (f.eks. gdb) eller et hukommelsestestværktøj (f.eks. valgrind), brug en lignende form - -command-template = "…". For eksempel at køre i debuggeren gdb dit hello-simulator ns-3 program med argumenter:

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

Bemærk, at ns-3 programnavnet kommer med argumentet - -run, og administrationsværktøjet (her gdb) er det første token i argumentet - -command-template. Mulighed - -args rapporter gdbat resten af ​​kommandolinjen tilhører det "nederste" program. (Nogle versioner gdb forstår ikke muligheden - -args. I dette tilfælde skal du fjerne programargumenterne fra - -command-template og brug kommandosættet gdb args.) Vi kan kombinere denne opskrift og den forrige for at køre testen under debuggeren:

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

3.6.3 Arbejdsmappe

Waf bør affyres fra sin placering i toppen af ​​ns-3 træet. Denne mappe bliver den arbejdsmappe, hvor outputfilerne vil blive skrevet. Men hvad hvis du vil beholde disse filer uden for ns-3 kildetræet? Brug argument - -cwd:

$ ./waf --cwd=...

Du kan finde det mere praktisk at få outputfilerne i din arbejdsmappe. I dette tilfælde kan følgende indirekte handling hjælpe:

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

Denne udsmykning af den tidligere version af kommandoen bevarer den nuværende arbejdsmappe, går til mappen Wafog instruerer derefter Waf for at ændre arbejdsbiblioteket tilbage til det aktuelle arbejdsbibliotek, der er gemt før start af programmet. Vi nævner holdet - -cwd For fuldstændighedens skyld kører de fleste brugere blot Waf fra biblioteket på øverste niveau og genererer outputfiler der.

Fortsat: Kapitel 4

Kilde: www.habr.com

Tilføj en kommentar