Tutorial del simulador de xarxa ns-3. Capítol 3

Tutorial del simulador de xarxa ns-3. Capítol 3
capítol 1,2

3 Primers passos
3.1 Visió general
3.2 Requisits previs
3.2.1 Baixant la versió ns-3 com a arxiu font
3.3 Baixant ns-3 amb Git
3.3.1 Carregant ns-3 amb Bake
3.4 Muntatge ns-3
3.4.1 Construir amb build.py
3.4.2 Construcció amb Bake
3.4.3 Construeix amb Waf
3.5 Prova ns-3
3.6 Execució de l'script
3.6.1 Arguments de la línia d'ordres
3.6.2 Depuració
3.6.3 Directori de treball

Capítol 3

Començant

Aquest capítol pretén preparar el lector per començar amb un ordinador que potser mai no ha instal·lat ns-3. Cobreix les plataformes compatibles, els requisits previs, com obtenir ns-3, com crear ns-3 i com provar la vostra compilació i executar programes senzills.

3.1 Visió general

El simulador ns-3 es construeix com un sistema de biblioteques de programari col·laboratiu. Durant el muntatge, el codi dels programes d'usuari s'enllaça amb aquestes biblioteques. Els llenguatges de programació C++ o Python s'utilitzen per escriure programes personalitzats.

Ns-3 es distribueix com a codi font, el que significa que el sistema de destinació ha de tenir un entorn de desenvolupament de programari per tal de crear primer les biblioteques i després crear el programa d'usuari. En principi, ns-3 es podria distribuir com a biblioteques ja fetes per a un sistema específic, i en el futur es podrien distribuir d'aquesta manera. Però avui en dia molts usuaris realment fan la seva feina editant ns-3 mateix, per la qual cosa és útil tenir el codi font per construir les biblioteques. Si algú vol assumir la feina de crear biblioteques i paquets ja fets per a sistemes operatius, poseu-vos en contacte amb la llista de correu ns-desenvolupadors.

A continuació, veurem tres maneres de descarregar i compilar ns-3. El primer és descarregar i crear la versió oficial des del lloc principal. El segon és la selecció i el muntatge de còpies de les versions de desenvolupament de la instal·lació bàsica de ns-3. El tercer és utilitzar eines de compilació addicionals per carregar més extensions per a ns-3. Repassarem cadascuna, ja que les eines són lleugerament diferents.

Els usuaris de Linux experimentats poden preguntar-se per què ns-3 no es proporciona com a paquet com la majoria de biblioteques que utilitzen un gestor de paquets? Encara que hi ha paquets binaris per a diverses distribucions de Linux (per exemple, Debian), la majoria dels usuaris acaben editant les biblioteques i havent de reconstruir ns-3 ells mateixos, de manera que tenir el codi font disponible és útil. Per aquest motiu, ens centrarem a instal·lar des de la font.

Per a la majoria de les aplicacions drets ns-3 root no són necessaris, es recomana utilitzar un compte d'usuari sense privilegis.

3.2 Requisits previs

Tot el conjunt de biblioteques ns-3 disponibles té una sèrie de dependències de biblioteques de tercers, però en la seva major part ns-3 es pot construir i utilitzar amb suport per a diversos components comuns (sovint instal·lats per defecte): un compilador C++, Python, un editor de codi font (per exemple, empenta, Emacs o Eclipsi) i, si s'utilitzen repositoris de desenvolupament, sistemes de control de versions de Git. La majoria dels usuaris novells no hauran de preocupar-se si la seva configuració informa que falten algunes funcions avançades de ns-3, però per a aquells que vulguin una instal·lació completa, el projecte ofereix una wiki que inclou pàgines amb molts consells i trucs útils. Una d'aquestes pàgines és la pàgina d'instal·lació, amb instruccions d'instal·lació per a diversos sistemes, disponible a: https://www.nsnam.org/wiki/Installation.

La secció Requisits previs d'aquesta wiki explica quins paquets són necessaris per donar suport a les opcions comunes de ns-3 i també proporciona les ordres que s'utilitzen per instal·lar-les en versions habituals de Linux o macOS.

Podeu aprofitar aquesta oportunitat per explorar la pàgina wiki ns-3 o el lloc web principal: https://www.nsnam.org, perquè hi ha molta informació. A partir de la darrera versió de ns-3 (ns-3.29), es necessiten les eines següents per executar ns-3:

Paquet d'eines/versió

  • compilador C++
    clang++ o g++ (g++ versió 4.9 o superior)
  • Pitó
    versió python2 >= 2.7.10, o versió python3 >=3.4
  • anar
    qualsevol versió més recent (per accedir a ns-3 a GitLab.com)
  • tar
    qualsevol versió més recent (per desempaquetar la versió ns-3)
  • bunzip2
    qualsevol versió més recent (per desempaquetar la versió ns-3)

Per comprovar la versió predeterminada de Python, escriviu python -V. Per comprovar la versió de g++, escriviu g++ -v. Si falta alguna eina o és massa antiga, consulteu la guia d'instal·lació a la pàgina wiki ns-3.

A partir d'ara, suposem que el lector està executant Linux, MacOS o un emulador de Linux i té almenys les eines anteriors.

3.2.1 Baixant la versió ns-3 com a arxiu font

Aquest és el curs d'acció per a un usuari nou que vulgui baixar i experimentar amb la darrera versió i les versions del paquet de ns-3. Les versions ns-3 es publiquen com a arxius font comprimits, de vegades anomenats tarball. tarball és un format d'arxiu de programari especial en el qual es combinen diversos fitxers. L'arxiu normalment està comprimit. procés d'arrencada ns-3 mitjançant tarball és senzill, només heu de seleccionar una versió, descarregar-la i desempaquetar-la.

Suposem que, com a usuari, voleu construir ns-3 en un directori local anomenat espai de treball. Podeu obtenir una còpia de treball de la versió introduint el següent a la consola de Linux (substituint els números de versió adequats, és clar)

$ 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 

Preste atenció a la utilitat utilitzada anteriorment wget, que és una eina de línia d'ordres per descarregar objectes d'Internet. Si no l'heu instal·lat, podeu utilitzar el vostre navegador per fer-ho.

Seguint aquests passos us portarà al directori ns-allinone-3.29, allà hauríeu de veure diversos fitxers i directoris

$ 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

Ara esteu preparat per construir la distribució base ns-3 i podeu passar a la secció sobre la construcció de ns-3.

3.3 Baixant ns-3 amb Git

El codi ns-3 està disponible als repositoris de Git a GitLab.com a https://gitlab.com/nsnam/. Grup nsnam reuneix els diferents repositoris utilitzats per un projecte de codi obert.

La manera més senzilla de començar a utilitzar els repositoris Git és bifurcar o clonar l'entorn ns-3-allinona. Aquest és un conjunt d'scripts que gestiona la càrrega i el muntatge dels subsistemes ns-3 més utilitzats. Si sou nou a Git, els termes "fork" i "clon" us poden ser desconeguts; si és així, us recomanem que simplement cloneu (feu la vostra pròpia còpia) el repositori situat a GitLab.com així:

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

En aquesta etapa, la vista del vostre directori ns-3-allinona lleugerament diferent del directori d'arxiu de llançament descrit anteriorment. Hauria de semblar a això:

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

Tingueu en compte que hi ha un guió descarregar.py, que també extreu ns-3 i el codi font que l'acompanya. Aquí teniu una opció: descarregueu l'última instantània de desenvolupament de ns-3:

$ python download.py

o preferiu el llançament ns-3 utilitzant la bandera -n per indicar el número de llançament:

$ python download.py -n ns-3.29

Després d'aquest pas al directori ns-3-allinona es descarregaran repositoris addicionals ns-3, cocció, pybindgen и netanim.

Nota
En una màquina amb Ubuntu16.04 net, necessitava canviar l'ordre a aquesta: $ sudo python3 download.py -n ns-3.29 (d'ara endavant notes del traductor).

3.3.1 Carregant ns-3 amb Bake

Els dos mètodes anteriors (arxiu font o dipòsit ns-3-allinona mitjançant Git) són útils per obtenir la instal·lació ns-3 més senzilla amb diversos complements (pybindgen per generar enllaços Python i netanim per a animació en xarxa). El tercer repositori proporcionat per defecte a ns-3-allinone s'anomena cocció.

Enfornar és una eina per a la creació coordinada de programari a partir de múltiples repositoris, desenvolupada per al projecte ns-3. Enfornar es pot utilitzar per obtenir versions de desenvolupament de ns-3, així com per descarregar i crear extensions de la versió base de la distribució ns-3, com ara l'entorn Execució directa de codi, CradleNetwork Simulation Cradle, la possibilitat de crear nous enllaços de Python i diverses "aplicacions" ns-3.

Nota
CradleNetwork Simulation Cradle és un marc que us permet utilitzar piles de xarxa TCP/IP reals dins d'un simulador de xarxa.

Si espereu que la vostra instal·lació ns-3 tingui funcions avançades o addicionals, podeu seguir aquesta ruta d'instal·lació.

A les darreres versions de ns-3 Enfornar es va afegir al llançament de quitrà. El llançament inclou un fitxer de configuració que us permet descarregar les versions actuals del programari en el moment del llançament. Això és, per exemple, la versió Enfornar, que es distribueix amb la versió ns-3.29, es pot utilitzar per recuperar components per a aquesta versió de ns-3 o anterior, però no es pot utilitzar per recuperar components per a versions posteriors (si el fitxer de descripció del paquet bakeconf.xml no actualitzat).

També podeu obtenir la darrera còpia coccióintroduint l'ordre següent a la vostra consola Linux (suposant que teniu Git instal·lat):

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

Quan executeu l'ordre git, hauríeu de veure alguna cosa com el següent:

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.

Després de completar l'ordre clonar hauríeu de tenir un directori anomenat cocció, el contingut del qual hauria de semblar a això:

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

Tingueu en compte que heu carregat diversos scripts de Python, un mòdul Python anomenat cocció i un fitxer de configuració XML. El següent pas és utilitzar aquests scripts per descarregar i crear la distribució ns-3 que trieu. Hi ha disponibles diversos objectius de personalització:

  1. ns-3.29: mòdul corresponent al llançament; descarregarà components similars al llançament al fitxer tar;

  2. ns-3-dev: un mòdul similar, però utilitzant codi de l'arbre de desenvolupament;

  3. ns-allinona-3.29: un mòdul que inclou altres funcions addicionals, com ara l'encaminament de clics i el bressol de simulació de xarxa, Openflow per a ns-3.

  4. ns-3-allinona: similar a la versió de llançament del mòdul tot en un, però per al codi de desenvolupament.

Nota
feu clic — Arquitectura de programari modular per a la creació d'encaminadors.

Openflow és un protocol per gestionar el procés de processament de dades transmeses a través d'una xarxa de dades mitjançant encaminadors i commutadors, implementant tecnologia de xarxa definida per programari.

La instantània del desenvolupament actual (no publicada) ns-3 es pot trobar a:https://gitlab.com/nsnam/ns-3-dev.git.

Els desenvolupadors intenten mantenir aquests dipòsits en un ordre de funcionament coherent, però es troben a l'àrea de desenvolupament i contenen codi inèdit, de manera que si no teniu previst utilitzar funcions noves, seleccioneu la versió oficial.

Podeu trobar l'última versió del codi navegant per la llista de repositoris o anant a la pàgina web de versions ns-3:https://www.nsnam.org/releases/ i fent clic a l'enllaç de la darrera versió. En aquest exemple continuarem amb ns-3.29.

Ara, per obtenir els components ns-3 que necessitem, utilitzarem l'eina Enfornar. Diguem unes paraules introductories sobre l'obra Enfornar.

Bake funciona carregant les fonts de paquets en un directori font i instal·lant les biblioteques al directori de compilació. Enfornar es pot executar fent referència al binari, però si voleu executar-lo Enfornar no des del directori on s'ha descarregat, és recomanable afegir-hi el camí cocció al vostre camí (variable d'entorn PATH), per exemple de la següent manera (exemple per a Linux bash shell). Aneu al directori "bake" i, a continuació, configureu les variables d'entorn següents:

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

Això situarà el programa coure.py al camí de l'intèrpret d'ordres i permetrà que altres programes trobin els executables i les biblioteques que va crear cocció. En alguns casos d'ús cocció, la configuració PATH i PYTHONPATH descrita anteriorment no és necessària, però una compilació completa de ns-3-allinone (amb paquets addicionals) normalment ho requereix.

Aneu al vostre directori de treball i introduïu el següent a la consola:

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

A continuació preguntarem Enfornar comproveu si tenim prou eines per carregar els diferents components. Marca:

$ ./bake.py check

Hauríeu de veure alguna cosa com el següent:

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

En particular, eines de càrrega com Mercurial, CVS, Git i Bazaar són essencials en aquest pas, ja que ens permeten obtenir el codi. En aquest punt, instal·leu les eines que falten de la manera habitual per al vostre sistema (si sabeu com fer-ho) o poseu-vos en contacte amb l'administrador del sistema per obtenir ajuda.

A continuació, proveu de descarregar el programari:

$ ./bake.py download

el resultat hauria de ser una cosa com:

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

Això significarà que s'han descarregat tres fonts. Ara aneu al directori font i escriviu ls; Hauries de veure:

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

Ara ja esteu preparat per crear la distribució ns-3.

3.4 Muntatge ns-3

Igual que amb la descàrrega de ns-3, hi ha diverses maneres de crear ns-3. El més important que volem destacar és que ns-3 es construeix mitjançant una eina de creació anomenada Wafdescrit a continuació. La majoria dels usuaris treballaran Waf, però hi ha uns quants scripts útils per ajudar-vos a començar o organitzar compilacions més complexes. Així que si us plau, abans de llegir-ne Waf, fes-hi una ullada construir.py i muntatge amb cocció.

3.4.1 Construir amb build.py

Atenció! Aquest pas de compilació només està disponible a partir de la versió d'arxiu font obtinguda tal com es descriu anteriorment; i no es descarrega mitjançant git o bake.

Quan es treballa amb un arxiu de llançament tarballa ns-3-allinona Hi ha un script pràctic que pot facilitar el muntatge dels components. S'anomena build.py. Aquest programa us configurarà el projecte de la manera més útil. Tanmateix, tingueu en compte que la configuració i el treball més avançats amb ns-3 solen implicar l'ús del sistema de compilació propi de ns-3, Waf, que s'introduirà més endavant en aquest tutorial.

Si us heu descarregat utilitzant tarball, després al vostre directori ~/espai de treball un directori amb un nom com ns-allinona-3.29. Introdueixi la següent:

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

En trucar construir.py Hem utilitzat arguments de línia d'ordres per crear els exemples i proves utilitzats en aquest tutorial, que no es construeixen per defecte a ns-3. Per defecte, el programa també crea tots els mòduls disponibles. Aleshores, si ho desitgeu, podeu construir ns-3 sense exemples i proves, o excloure mòduls que no són necessaris per al vostre treball.

Veureu molts missatges de sortida del compilador que l'script mostra a mesura que construeix les diferents parts que heu carregat. Primer el guió intentarà construir l'animador netanim, després el generador d'enllaç pybindgen i finalment ns-3. Quan s'hagi completat el procés, hauríeu de veure el següent:

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

A les tres últimes línies del llistat veiem un missatge sobre mòduls que no es van construir:

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

Això simplement vol dir que alguns mòduls ns-3 que depenen de biblioteques externes potser no s'han creat o que no s'han de construir per a aquesta configuració. Això no vol dir que el simulador no estigui muntat o que els mòduls muntats no funcionin correctament.

3.4.2 Construcció amb Bake

Si heu utilitzat Bake a dalt per obtenir el codi font dels repositoris del projecte, podeu continuar utilitzant-lo per crear ns-3. Marca:

$ ./bake.py build

i hauríeu de veure alguna cosa com:

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

prompt: també podeu fer tant els passos de descàrrega com de compilació alhora trucant a "bake.py deploy".

El muntatge de tots els components pot fallar, però el muntatge continuarà si no cal un component. Per exemple, un problema de portabilitat recent va ser aquest castxml es pot muntar amb eina cocció no a totes les plataformes. En aquest cas, apareixerà un missatge com aquest:

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

Sinó castxml només cal si voleu crear enllaços Python actualitzats. Per a la majoria d'usuaris no cal fer-ho (almenys fins que canviïn ns-3), de manera que aquests avisos es poden ignorar de manera segura de moment.

Si falla, l'ordre següent us donarà una pista sobre les dependències que falten:

$ ./bake.py show

Es llistaran les diferents dependències dels paquets que esteu intentant construir.

3.4.3 Construeix amb Waf

Fins a aquest punt, per començar a construir ns-3, hem utilitzat l'script construir.py, o eina cocció. Aquestes eines són útils per construir ns-3 i mantenir biblioteques. De fet, per construir executen l'eina de compilació Waf del directori ns-3. Waf instal·lat amb el codi font ns-3. La majoria dels usuaris passen ràpidament a l'ús directe per configurar i muntar l'ns-3 Waf. Per tant, per continuar, aneu al directori ns-3 que vau crear originalment.

Això no és estrictament obligatori en aquest moment, però serà útil fer una mica enrere i veure com fer canvis a la configuració del projecte. Probablement el canvi de configuració més útil que podeu fer és crear una versió optimitzada del codi. Per defecte, heu configurat el vostre projecte per crear una versió de depuració. Fem una ullada a un projecte per crear una compilació optimitzada. Per explicar a Waf que hauria de fer compilacions optimitzades que incloguin exemples i proves, haureu d'executar les ordres següents:

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

Això es posarà en marxa Waf fora del directori local (per a la vostra comoditat). La primera ordre neteja de la compilació anterior, això normalment no és estrictament necessari, però és una bona pràctica (vegeu també els perfils de compilació a continuació); això suprimirà les biblioteques i els fitxers d'objectes creats anteriorment situats al directori construir /. Quan es reconfigura el projecte i el sistema de compilació comprova les diferents dependències, hauríeu de veure una sortida similar a la següent:

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)

Tingueu en compte l'última part de la llista anterior. Algunes opcions ns-3 no estan habilitades per defecte o requereixen suport del sistema per funcionar correctament. Per exemple, per habilitar XmlTo, la biblioteca ha d'estar present al sistema libxml-2.0. Si no s'ha trobat aquesta biblioteca i no s'ha activat la funció ns-3 corresponent, es mostrarà un missatge. Tingueu en compte també que és possible utilitzar l'ordre suo per establir el bit suid "establir l'ID de grup en temps d'execució" per a determinats programes. No està habilitat per defecte i, per tant, aquesta funció apareix com a "no activada". Finalment, per obtenir una llista d'opcions activades, utilitzeu Waf amb paràmetre --check-config.

Ara tornem enrere i tornem a la compilació de depuració que conté exemples i proves.

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

El sistema de compilació ja està configurat i podeu crear versions de depuració dels programes ns-3 simplement escrivint:

$ ./waf

És possible que els passos anteriors us hagin obligat a crear part del sistema ns-3 dues vegades, però ara ja sabeu com canviar la configuració i crear codi optimitzat.

Per comprovar quin perfil està actiu per a una configuració de projecte determinada, hi ha una ordre:

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

L'escenari anterior construir.py també admet arguments --enable-examples и --enable-tests, però altres opcions Waf no admet directament. Per exemple, això no funcionarà:

$ ./build.py --disable-python

la reacció serà així:

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

Tanmateix, l'operador especial - - es pot utilitzar per passar paràmetres addicionals via wafaixí que en comptes de l'anterior, funcionarà l'ordre següent:

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

perquè genera l'ordre principal ./waf configure --disable-python. Aquí teniu alguns consells introductoris més sobre Waf.

Gestió d'errors de construcció

Les versions ns-3 es posen a prova amb els darrers compiladors de C++ disponibles en el moment de la publicació en distribucions comunes de Linux i MacOS. Tanmateix, amb el pas del temps, es publiquen noves distribucions amb nous compiladors, i aquests compiladors més nous solen ser més pedants amb els advertiments. ns-3 configura la seva compilació per tractar tots els avisos com a errors, de manera que de vegades, si esteu executant una versió anterior en un sistema més nou, un avís del compilador pot aturar la compilació.

Per exemple, abans hi havia una versió de ns-3.28 per a Fedora 28, que incloïa una nova versió principal gcc (gcc-8). Construint la versió ns-3.28 o versions anteriors amb Fedora 28, amb Gtk2+ instal·lat, es produirà el següent error:

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

A les versions a partir de ns-3.28.1, a Waf hi ha una opció disponible per resoldre aquests problemes. Desactiva la configuració de la bandera "-Werror" a g++ i clang++. Aquesta és l'opció "--disable-werror" i s'ha d'aplicar durant la configuració:

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

Configurar o muntar

Algunes ordres Waf tenen significat només en la fase de configuració, i alguns només són vàlids en la fase de construcció. Per exemple, si voleu utilitzar les funcions d'emulació ns-3, podeu habilitar la configuració de bits sud utilitzant suo, tal com es descriu anteriorment. Això anul·larà les ordres de l'etapa de configuració i, per tant, podeu canviar la configuració mitjançant l'ordre següent, que també inclou exemples i proves.

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

Si fas això Waf es llançarà suoper canviar els programes de creació de sòcols de codi d'emulació perquè s'executin amb permisos root. En Waf Hi ha moltes altres opcions disponibles per a la configuració i els passos de creació. Per explorar les vostres opcions, introduïu:

$ ./waf --help

A la següent secció utilitzarem algunes opcions relacionades amb les proves.

Perfils de muntatge

Ja hem vist com es pot configurar Waf per a assemblees depurar и optimitzat:

$ ./waf --build-profile=debug

També hi ha un perfil de muntatge intermedi, alliberar. Opció -d és sinònim de --build-profile. El perfil de compilació controla l'ús de registres, assercions i commutadors d'optimització del compilador:

Tutorial del simulador de xarxa ns-3. Capítol 3

Com podeu veure, el registre i les afirmacions només estan disponibles a les compilacions de depuració. La pràctica recomanada és desenvolupar el vostre script en mode de depuració i, a continuació, realitzar execucions repetides (per a estadístiques o canvis de paràmetres) en un perfil de compilació optimitzat.

Si teniu codi que només s'hauria d'executar en determinats perfils de compilació, utilitzeu la macro d'embolcall de codi:

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

Per defecte, Waf col·loca artefactes de construcció al directori de compilació. Podeu especificar un directori de sortida diferent mitjançant l'opció - -out, per exemple:

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

En combinar-ho amb els perfils de compilació, podeu canviar fàcilment entre diferents opcions de compilació:

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

El que us permet treballar amb diversos muntatges sense haver de reescriure l'últim conjunt cada vegada. Quan canvieu a un altre perfil, Waf només el compilarà, sense recompilar-ho tot completament.

Quan canvieu els perfils de compilació d'aquesta manera, heu de tenir cura de donar les mateixes opcions de configuració cada vegada. Definir diverses variables d'entorn us ajudarà a evitar errors:

$ 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

Compiladors i banderes

En els exemples anteriors Waf per construir ns-3 utilitza el compilador C++ de GCC ( g ++). Tanmateix, podeu canviar el que feu servir Waf compilador C++, mitjançant la definició de la variable d'entorn CXX. Per exemple, per utilitzar el compilador C++ Clang, clang++,

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

De la mateixa manera es pot configurar Waf per utilitzar la compilació distribuïda utilitzant distcc:

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

Es pot trobar més informació sobre distcc i compilació distribuïda a la pàgina del projecte a la secció Documentació. Per afegir indicadors del compilador quan configureu ns-3, utilitzeu la variable d'entorn CXXFLAGS_EXTRA.

Instal · lació

Waf es pot utilitzar per instal·lar biblioteques en diferents llocs del sistema. Per defecte, les biblioteques compilades i els executables es troben al directori construir, i com que Waf coneix la ubicació d'aquestes biblioteques i executables, no cal instal·lar les biblioteques en cap altre lloc.

Si els usuaris prefereixen instal·lar fora del directori de compilació, poden executar l'ordre ./waf instal·lació. El prefix per defecte per a la instal·lació és / Usr / localTan ./waf instal·lació instal·larà programes a / usr / local / bin, biblioteques a / / Local / lib usr i fitxers de capçalera a /usr/local/include. Els drets de superusuari normalment s'han d'establir amb un prefix per defecte, de manera que seria una ordre típica sudo ./waf install. Quan es llanci, Waf triarà primer utilitzar les biblioteques compartides al directori de compilació i després buscarà biblioteques al llarg del camí cap a les biblioteques configurades a l'entorn local. Per tant, quan instal·leu biblioteques en un sistema, és una bona pràctica comprovar que s'utilitzen les biblioteques adequades. Els usuaris poden optar per instal·lar amb un prefix diferent passant l'opció durant la configuració --prefix, per exemple:

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

Si més tard, després de la compilació, l'usuari introdueix l'ordre d'instal·lació ./waf, s'utilitzarà el prefix /opt/local.

Equip ./waf clean s'ha d'utilitzar abans de reconfigurar el projecte si s'utilitzarà la instal·lació Waf sota un prefix diferent.

Per tant, per utilitzar ns-3 no cal trucar ./waf install. La majoria dels usuaris no necessitaran aquesta ordre perquè Waf recollirà les biblioteques actuals del directori de compilació, però alguns usuaris poden trobar-ho útil si les seves activitats impliquen treballar amb programes fora del directori ns-3.

Waf solter

Al nivell superior de l'arbre de fonts ns-3, només hi ha un script Waf. Un cop comencis a treballar, passaràs molt de temps al directori scratch/ o més endinssrc/... i al mateix temps han de córrer Waf. Només pots recordar on ets i córrer Waf de la manera següent:

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

però això serà tediós i propens a errors, de manera que hi ha millors solucions. Una manera habitual és utilitzar un editor de text com ara Emacs o empenta, en què s'obren dues sessions de terminal, una s'utilitza per construir ns-3 i la segona s'utilitza per editar el codi font. Si només tens tarball, llavors una variable d'entorn pot ajudar:

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

$ cd scratch 
$ waff build

Al directori del mòdul pot ser temptador afegir un script waf trivial com exec ../../waf. Si us plau, no ho facis. Això és confús per als novells i, quan es fa malament, provoca errors de compilació difícils de detectar. Les solucions que es mostren a dalt són el camí que s'ha d'utilitzar.

3.5 Prova ns-3

Podeu executar les proves unitàries de la distribució ns-3 executant l'script ./test.py:

$ ./test.py

Aquestes proves es realitzen en paral·lel Waf. Finalment hauríeu de veure un missatge que digui:

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

Aquest és un missatge important per identificar errors, fallades o errors de valgrind, indicant problemes amb el codi o incompatibilitats entre eines i codi.

També veureu la sortida final de Waf i un verificador executant cada prova, que semblarà a això:

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)

Els usuaris solen executar aquesta ordre per verificar ràpidament que la distribució ns-3 s'ha construït correctament. (Tingueu en compte que l'ordre de les línies "PASS: ..." pot ser diferent, això és normal. El que és important és que la línia de resum al final de l'informe mostri que totes les proves han passat; cap prova ha fallat o s'ha bloquejat). I WafI prova.py paral·lelitzarà el treball als nuclis de processador disponibles de la màquina.

3.6 Execució de l'script

Normalment executem scripts sota control Waf. Això permet que el sistema de compilació garanteixi que els camins de biblioteques compartides estiguin configurats correctament i que les biblioteques estiguin disponibles en temps d'execució. Per executar el programa, només cal que utilitzeu Waf amb paràmetre - -run. Executem l'equivalent ns-3 del programa ubiqua hola mónescrivint el següent:

$ ./waf --run hello-simulator

Waf primer comprovarà que el programa s'ha construït correctament i, si cal, ho farà. Aleshores Waf executarà un programa que produeix la següent sortida.

Hello Simulator

Felicitats! Ara ets un usuari de ns-3!

Què he de fer si no veig resultats?

Si veus missatges Wafindicant que la compilació s'ha completat correctament, però no veieu la sortida "Hola simulador", aleshores hi ha la possibilitat que a la secció [Build-with-Waf] hagis canviat el mode de compilació a optimitzat, però no va tornar al mode depurar. Tota la sortida de la consola utilitzada en aquest tutorial utilitza un component especial ns-3 que realitza el registre i s'utilitza per imprimir missatges personalitzats a la consola. La sortida d'aquest component es desactiva automàticament quan es compila el codi optimitzat: està "optimitzat". Si no veieu la sortida "Hello Simulator", introduïu el següent:

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

per personalitzar Waf per crear versions de depuració dels programes ns-3, que inclouen exemples i proves. Aleshores, hauríeu de reconstruir la versió de depuració actual del codi escrivint

$ ./waf

Ara si executeu el programa hola-simulador, hauríeu de veure el resultat esperat.

3.6.1 Arguments de la línia d'ordres

Per passar arguments de línia d'ordres al programa ns-3, utilitzeu el patró següent:

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

Substituïu al nom del vostre programa i als arguments. Argumentació - -command-template per Waf és essencialment una recepta per construir la línia d'ordres real Waf utilitzat per executar el programa. Waf comprova que la compilació estigui completa, estableix els camins de la biblioteca compartida, després utilitza la plantilla de línia d'ordres proporcionada i substitueix el nom del programa pel marcador de posició %s per cridar l'executable. Si trobeu complicada aquesta sintaxi, hi ha una versió més senzilla que inclou el programa ns-3 i els seus arguments entre cometes simples:

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

Un altre exemple especialment útil és l'execució selectiva de suites de proves. Suposem que hi ha una suite de proves anomenada mytest (de fet no n'hi ha). Més amunt hem utilitzat l'script ./test.py per executar una sèrie de proves en paral·lel, que crida repetidament al programa de prova. corredor de proves. Anomenada corredor de proves directament per executar una prova:

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

Els arguments es passaran al programa corredor de proves. Com que mytest no existeix, es generarà un missatge d'error. Per imprimir les opcions de test-runner disponibles, introduïu:

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

3.6.2 Depuració

Per executar programes ns-3 amb una altra utilitat, com ara un depurador (per exemple, gdb) o una eina de prova de memòria (per exemple, valgrind), utilitzeu una forma similar - -command-template = "…". Per exemple, per executar-se al depurador gdb el vostre programa hello-simulator ns-3 amb arguments:

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

Tingueu en compte que el nom del programa ns-3 ve amb l'argument - -run, i la utilitat de gestió (aquí gdb) és el primer testimoni de l'argument - -command-template. Opció - -args informa gdbque la resta de la línia d'ordres pertany al programa "inferior". (Algunes versions gdb no entenc l'opció - -args. En aquest cas, elimineu els arguments del programa - -command-template i utilitzeu el conjunt d'ordres gdb Arguments.) Podem combinar aquesta recepta i l'anterior per executar la prova sota el depurador:

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

3.6.3 Directori de treball

El waf s'ha de llançar des de la seva ubicació a la part superior de l'arbre ns-3. Aquesta carpeta es converteix en el directori de treball on s'escriuran els fitxers de sortida. Però, què passa si voleu mantenir aquests fitxers fora de l'arbre de fonts ns-3? Utilitzeu arguments - -cwd:

$ ./waf --cwd=...

Potser us resulti més convenient obtenir els fitxers de sortida al vostre directori de treball. En aquest cas, l'acció indirecta següent pot ajudar:

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

Aquesta decoració de la versió anterior de l'ordre conserva el directori de treball actual, va al directori Wafi després instrueix Waf per tornar a canviar el directori de treball al directori de treball actual desat abans d'iniciar el programa. Esmentem l'equip - -cwd Per completar-ho, la majoria dels usuaris simplement executen Waf des del directori de nivell superior i hi generen fitxers de sortida.

Continuació: Capítol 4

Font: www.habr.com

Afegeix comentari