Tutorial do simulador de rede ns-3. Capítulo 3

Tutorial do simulador de rede ns-3. Capítulo 3
capítulo 1,2

3 Primeiros pasos
3.1 Visión xeral
3.2 Requisitos previos
3.2.1 Descarga da versión ns-3 como arquivo de orixe
3.3 Descargando ns-3 usando Git
3.3.1 Cargando ns-3 usando Bake
3.4 Montaxe ns-3
3.4.1 Construír con build.py
3.4.2 Construír con Bake
3.4.3 Construír con Waf
3.5 Proba ns-3
3.6 Execución do script
3.6.1 Argumentos da liña de comandos
3.6.2 Depuración
3.6.3 Directorio de traballo

Capítulo 3

Comezando

Este capítulo está destinado a preparar o lector para comezar cun ordenador que quizais nunca instalou ns-3. Abarca as plataformas compatibles, os requisitos previos, como obter ns-3, como construír ns-3 e como probar a compilación e executar programas sinxelos.

3.1 Visión xeral

O simulador ns-3 está construído como un sistema de bibliotecas de software colaborativo. Durante a montaxe, o código dos programas de usuario enlázase con estas bibliotecas. As linguaxes de programación C++ ou Python úsanse para escribir programas personalizados.

Ns-3 distribúese como código fonte, o que significa que o sistema de destino debe ter un ambiente de desenvolvemento de software para construír primeiro as bibliotecas e despois crear o programa de usuario. En principio, ns-3 podería distribuírse como bibliotecas preparadas para un sistema específico, e no futuro poden distribuírse deste xeito. Pero hoxe en día moitos usuarios realmente fan o seu traballo editando ns-3 en si, polo que é útil ter o código fonte para construír as bibliotecas. Se alguén quere asumir o traballo de crear bibliotecas e paquetes listos para os sistemas operativos, póñase en contacto coa lista de correo. ns-desenvolvedores.

A continuación, veremos tres formas de descargar e construír ns-3. O primeiro é descargar e construír a versión oficial desde o sitio principal. O segundo é a selección e montaxe de copias das versións de desenvolvemento da instalación básica de ns-3. O terceiro é usar ferramentas de compilación adicionais para cargar máis extensións para ns-3. Imos repasar cada un xa que as ferramentas son lixeiramente diferentes.

Os usuarios de Linux experimentados poden preguntarse por que ns-3 non se proporciona como paquete como a maioría das bibliotecas que usan un xestor de paquetes? Aínda que hai paquetes binarios para varias distribucións de Linux (por exemplo, Debian), a maioría dos usuarios acaban editando as bibliotecas e tendo que reconstruír eles mesmos ns-3, polo que ter o código fonte dispoñible é útil. Por este motivo, centrarémonos na instalación desde a fonte.

Para a maioría das aplicacións dereitos ns-3 raíz non son necesarios, recoméndase utilizar unha conta de usuario sen privilexios.

3.2 Requisitos previos

Todo o conxunto de bibliotecas ns-3 dispoñibles ten unha serie de dependencias de bibliotecas de terceiros, pero na súa maior parte ns-3 pódese construír e usar con soporte para varios compoñentes comúns (a miúdo instalados por defecto): un compilador C++, Python, un editor de código fonte (por exemplo, vitalidade, emacs ou Eclipse) e, se se usan repositorios de desenvolvemento, sistemas de control de versións de Git. A maioría dos primeiros usuarios non terán que preocuparse se a súa configuración indica que faltan algunhas funcións avanzadas de ns-3, pero para aqueles que queiran unha instalación completa, o proxecto ofrece unha wiki que inclúe páxinas con moitos consellos e trucos útiles. Unha destas páxinas é a páxina de instalación, con instrucións de instalación para varios sistemas, dispoñible en: https://www.nsnam.org/wiki/Installation.

A sección Requisitos previos deste wiki explica que paquetes son necesarios para admitir opcións ns-3 comúns e tamén proporciona os comandos utilizados para instalalos en versións comúns de Linux ou macOS.

Podes aproveitar esta oportunidade para explorar a páxina wiki ns-3 ou o sitio web principal: https://www.nsnam.org, porque alí hai moita información. A partir da última versión de ns-3 (ns-3.29), son necesarias as seguintes ferramentas para executar ns-3:

Paquete de ferramentas/versión

  • Compilador C++
    clang++ ou g++ (g++ versión 4.9 ou superior)
  • Pitão
    versión python2 >= 2.7.10 ou versión python3 >=3.4
  • ir
    calquera versión máis recente (para acceder a ns-3 en GitLab.com)
  • alcatrán
    calquera versión máis recente (para desempaquetar a versión ns-3)
  • bunzip 2
    calquera versión máis recente (para desempaquetar a versión ns-3)

Para comprobar a versión predeterminada de Python, escriba python -V. Para comprobar a versión de g++, escriba g++ -v. Se falta algunha ferramenta ou é demasiado antiga, consulta a guía de instalación na páxina wiki de ns-3.

A partir de agora, supoñemos que o lector está a executar Linux, MacOS ou un emulador de Linux e ten polo menos as ferramentas anteriores.

3.2.1 Descarga da versión ns-3 como arquivo de orixe

Este é o curso de acción para un usuario novo que quere descargar e experimentar coas últimas versións e paquetes de ns-3. As versións ns-3 publícanse como arquivos de orixe comprimidos, ás veces chamados tarball. tarball é un formato de arquivo de software especial no que se combinan varios ficheiros. O arquivo adoita estar comprimido. proceso de arranque ns-3 mediante tarball é sinxelo, só tes que seleccionar unha versión, descargala e desempaquetala.

Supoñamos que vostede, como usuario, quere construír ns-3 nun directorio local chamado espazo de traballo. Podes obter unha copia de traballo da versión introducindo o seguinte na consola de Linux (substituíndo os números de versión apropiados, por suposto)

$ 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ón á utilidade usada anteriormente wget, que é unha ferramenta de liña de comandos para descargar obxectos de Internet. Se non o instalaches, podes usar o teu navegador para iso.

Seguindo estes pasos levarache ao directorio ns-allinone-3.29, alí deberías ver varios ficheiros e directorios

$ 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

Agora estás listo para construír a distribución base ns-3 e podes pasar á sección sobre a construción de ns-3.

3.3 Descargando ns-3 usando Git

O código ns-3 está dispoñible nos repositorios de Git en GitLab.com en https://gitlab.com/nsnam/. Grupo nsnam reúne os distintos repositorios utilizados por un proxecto de código aberto.

A forma máis sinxela de comezar a usar os repositorios Git é fork ou clonar o ambiente ns-3-alinona. Este é un conxunto de scripts que xestiona a carga e a montaxe dos subsistemas ns-3 máis utilizados. Se es novo en Git, os termos "fork" e "clon" poden ser descoñecidos para ti; se é así, recomendámosche que simplemente clones (fagas a túa propia copia) o repositorio situado en GitLab.com deste xeito:

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

Nesta fase, a vista do seu directorio ns-3-alinona lixeiramente diferente do directorio de arquivo de versións descrito anteriormente. Debería parecer algo así:

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

Teña en conta que hai un guión descargar.py, que extraerá adicionalmente ns-3 e o código fonte que o acompaña. Aquí tes unha opción: descarga a última instantánea do desenvolvemento ns-3:

$ python download.py

ou prefire a versión ns-3 usando a bandeira -n para indicar o número de liberación:

$ python download.py -n ns-3.29

Despois deste paso, vai ao directorio ns-3-alinona descargaranse repositorios adicionais ns-3, asar, pybindgen и netanim.

Nota
Nunha máquina con Ubuntu16.04 limpo, necesitaba cambiar o comando a este: $ sudo python3 download.py -n ns-3.29 (en diante notas do tradutor).

3.3.1 Cargando ns-3 usando Bake

Os dous métodos anteriores (arquivo de orixe ou repositorio ns-3-alinona a través de Git) son útiles para conseguir a instalación ns-3 máis sinxela con varios complementos (pybindgen para xerar enlaces de Python e netanim para animación en rede). O terceiro repositorio proporcionado por defecto en ns-3-allinone chámase asar.

Ás é unha ferramenta para a construción coordinada de software a partir de múltiples repositorios, desenvolvida para o proxecto ns-3. Ás pódese usar para obter versións de desenvolvemento de ns-3, así como para descargar e construír extensións da versión base da distribución ns-3, como o ambiente Execución directa de código, CradleNetwork Simulation Cradle, a capacidade de crear novas ligazóns de Python e varias "aplicacións" ns-3.

Nota
CradleNetwork Simulation Cradle é un framework que che permite usar pilas de rede TCP/IP reais dentro dun simulador de rede.

Se esperas que a túa instalación de ns-3 teña funcións avanzadas ou adicionais, podes seguir esta ruta de instalación.

Nas últimas versións de ns-3 Ás engadiuse á versión de tar. A versión inclúe un ficheiro de configuración que che permite descargar as versións actuais do software no momento da publicación. Esa é, por exemplo, a versión Ás, que se distribúe coa versión ns-3.29, pódese usar para recuperar compoñentes para esa versión de ns-3 ou anterior, pero non se pode usar para recuperar compoñentes para versións posteriores (se o ficheiro de descrición do paquete bakeconf.xml non actualizado).

Tamén podes obter a última copia asarintroducindo o seguinte comando na súa consola Linux (supoñendo que teña Git instalado):

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

Cando executas o comando git, deberías ver algo como o seguinte:

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.

Despois de completar o comando clonar deberías ter un directorio nomeado asar, cuxo contido debería ser algo así:

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

Teña en conta que cargaches varios scripts de Python, un módulo Python chamado asar e un ficheiro de configuración XML. O seguinte paso é usar estes scripts para descargar e construír a distribución ns-3 que elixas. Hai varios obxectivos de personalización dispoñibles:

  1. ns-3.29: módulo correspondente á versión; descargará compoñentes similares á versión no tarball;

  2. ns-3-dev: un módulo similar, pero usando código da árbore de desenvolvemento;

  3. ns-allinona-3.29: Un módulo que inclúe outras funcións adicionais como o enrutamento de clics e o soporte de simulación de rede, Openflow para ns-3.

  4. ns-3-alinona: similar á versión de lanzamento do módulo todo en un, pero para o código de desenvolvemento.

Nota
prema — Arquitectura de software modular para crear routers.

Openflow é un protocolo para xestionar o proceso de procesamento de datos transmitidos a través dunha rede de datos por enrutadores e conmutadores, implementando tecnoloxía de rede definida por software.

A instantánea do desenvolvemento actual (non lanzamento) ns-3 pódese atopar en:https://gitlab.com/nsnam/ns-3-dev.git.

Os desenvolvedores tentan manter estes repositorios nunha orde de funcionamento coherente, pero están na área de desenvolvemento e conteñen código inédito, polo que se non pensas usar novas funcións, selecciona a versión oficial.

Podes atopar a última versión do código navegando pola lista de repositorios ou accedendo á páxina web de Versións ns-3:https://www.nsnam.org/releases/ e premendo na ligazón da última versión. Neste exemplo continuaremos con ns-3.29.

Agora, para obter os compoñentes ns-3 que necesitamos, usaremos a ferramenta Ás. Digamos unhas palabras introdutorias sobre a obra Ás.

Bake funciona cargando fontes de paquetes nun directorio fonte e instalando as bibliotecas no directorio de compilación. Ás pódese executar facendo referencia ao binario, pero se quere executalo Ás non desde o directorio no que foi descargado, é recomendable engadir o camiño asar á súa ruta (variable de ambiente PATH), por exemplo como segue (exemplo para Linux bash shell). Vaia ao directorio "bake" e, a continuación, configure as seguintes variables de ambiente:

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

Isto situará o programa cocer.py á ruta do shell e permitirá que outros programas atopen os executables e as bibliotecas que creou asar. Nalgúns casos de uso asar, a configuración PATH e PYTHONPATH descrita anteriormente non é necesaria, pero normalmente o require unha compilación completa de ns-3-allinone (con paquetes adicionais).

Vaia ao seu directorio de traballo e introduza o seguinte na consola:

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

A continuación preguntarémolo Ás comprobar se temos ferramentas suficientes para cargar os distintos compoñentes. Marcar:

$ ./bake.py check

Deberías ver algo como o seguinte:

> 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, ferramentas de carga como Mercurial, CVS, Git e Bazaar son esenciais neste paso xa que nos permiten obter o código. Nesta fase, instale as ferramentas que faltan do xeito habitual para o seu sistema (se sabe como) ou póñase en contacto co administrador do sistema para obter axuda.

A continuación, intente descargar o software:

$ ./bake.py download

o resultado debería ser algo así como:

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

Isto significará que se descargaron tres fontes. Agora vai ao directorio fonte e escribe ls; Deberías ver:

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

Agora estás listo para construír a distribución ns-3.

3.4 Montaxe ns-3

Do mesmo xeito que coa descarga de ns-3, hai varias formas de construír ns-3. O principal que queremos enfatizar é que ns-3 está construído usando unha ferramenta de compilación chamada Wafdescrito a continuación. A maioría dos usuarios traballarán Waf, pero hai algúns scripts útiles para axudarche a comezar ou a organizar compilacións máis complexas. Entón, por favor, antes de ler Waf, bótalle un ollo construír.py e montaxe con asar.

3.4.1 Construír con build.py

Atención! Este paso de compilación só está dispoñible a partir da versión do arquivo de orixe obtida como se describe anteriormente; e non descargado a través de git ou bake.

Cando se traballa cun arquivo de versión tarballEn ns-3-alinona Hai un script útil que pode facilitar a montaxe dos compoñentes. Chámase build.py. Este programa configurará o proxecto para ti da forma máis útil. Non obstante, teña en conta que a configuración e o traballo máis avanzados con ns-3 adoitan implicar o uso do propio sistema de compilación de ns-3, Waf, que se presentará máis adiante neste tutorial.

Se descargaches usando tarball, despois no teu directorio ~/espazo de traballo un directorio cun nome como ns-allinona-3.29. Introduza o seguinte:

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

Cando se chama construír.py Usamos argumentos da liña de comandos para construír os exemplos e probas que se usan neste tutorial, que non están construídos por defecto en ns-3. Por defecto, o programa tamén constrúe todos os módulos dispoñibles. Entón, se o desexa, pode construír ns-3 sen exemplos e probas, ou excluír módulos que non sexan necesarios para o seu traballo.

Verás moitas mensaxes de saída do compilador que mostra o script mentres crea as distintas partes que cargaches. Primeiro o guión tentará construír o animador netanim, entón o xerador de enlace pybindgen e finalmente ns-3. Cando se complete o proceso, deberías ver o seguinte:

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

Nas tres últimas liñas do listado vemos unha mensaxe sobre módulos que non foron construídos:

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

Isto simplemente significa que algúns módulos ns-3 que dependen de bibliotecas externas poden non ter sido construídos, ou que non é necesario construír para esta configuración. Isto non significa que o simulador non estea montado ou que os módulos montados non funcionen correctamente.

3.4.2 Construír con Bake

Se usaches Bake arriba para obter o código fonte dos repositorios do proxecto, podes seguir usándoo para construír ns-3. Marcar:

$ ./bake.py build

e deberías ver algo así como:

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

Tipo de información: Tamén podes facer tanto os pasos de descarga como de compilación ao mesmo tempo chamando a "bake.py deploy".

A montaxe de todos os compoñentes pode fallar, pero a montaxe continuará se non se precisa un compoñente. Por exemplo, un problema de portabilidade recente foi ese castxml pódese montar mediante ferramenta asar non en todas as plataformas. Neste caso, aparecerá unha mensaxe como esta:

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

Pero castxml só é necesario se queres crear ligazóns de Python actualizadas. Para a maioría dos usuarios non hai necesidade diso (polo menos ata que cambien ns-3), polo que estes avisos poden ignorarse con seguridade polo momento.

Se falla, o seguinte comando darache unha pista sobre as dependencias que faltan:

$ ./bake.py show

Listaranse as distintas dependencias dos paquetes que estás a crear.

3.4.3 Construír con Waf

Ata este punto, para comezar a construír ns-3, utilizamos o script construír.py, ou ferramenta asar. Estas ferramentas son útiles para construír ns-3 e manter bibliotecas. De feito, para construír executan a ferramenta de compilación Waf do directorio ns-3. Waf instalado co código fonte ns-3. A maioría dos usuarios pasan rapidamente ao uso directo para configurar e montar o ns-3 Waf. Entón, para continuar, vai ao directorio ns-3 que creaches orixinalmente.

Isto non é estrictamente necesario neste momento, pero será útil retroceder un pouco e ver como facer cambios na configuración do proxecto. Probablemente o cambio de configuración máis útil que podes facer é crear unha versión optimizada do código. Por defecto, configuraches o teu proxecto para construír unha versión de depuración. Vexamos un proxecto para crear unha compilación optimizada. Para explicarlle a Waf que debería facer compilacións optimizadas que inclúan exemplos e probas, terás que executar os seguintes comandos:

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

Este lanzarase Waf fóra do directorio local (para a súa comodidade). O primeiro comando limpa da compilación anterior, normalmente non é estrictamente necesario, pero é unha boa práctica (vexa tamén os perfís de compilación a continuación); isto eliminará as bibliotecas creadas previamente e os ficheiros de obxectos situados no directorio construír /. Cando se reconfigure o proxecto e o sistema de compilación comproba as distintas dependencias, deberías ver unha saída similar á seguinte:

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)

Teña en conta a última parte da lista anterior. Algunhas opcións ns-3 non están activadas por defecto ou requiren soporte do sistema para funcionar correctamente. Por exemplo, para activar XmlTo, a biblioteca debe estar presente no sistema libxml-2.0. Se non se atopou esta biblioteca e non se habilitou a función ns-3 correspondente, amosarase unha mensaxe. Teña en conta tamén que é posible usar o comando sudo para establecer o bit suid "definir o ID do grupo en tempo de execución" para determinados programas. Non está activado por defecto e, polo tanto, esta función aparece como "non activada". Finalmente, para obter unha lista de opcións activadas, use Waf con parámetro --check-config.

Agora volvamos e volvamos á compilación de depuración que contén exemplos e probas.

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

O sistema de compilación agora está configurado e pode crear versións de depuración dos programas ns-3 simplemente escribindo:

$ ./waf

É posible que os pasos anteriores te obrigaran a construír parte do sistema ns-3 dúas veces, pero agora xa sabes como cambiar a configuración e crear código optimizado.

Para comprobar que perfil está activo para unha configuración de proxecto determinada, hai un comando:

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

O escenario anterior construír.py tamén admite argumentos --enable-examples и --enable-tests, pero outras opcións Waf non soporta directamente. Por exemplo, isto non funcionará:

$ ./build.py --disable-python

a reacción será a seguinte:

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

Non obstante, o operador especial - - pode usarse para pasar parámetros adicionais wafpolo que en lugar do anterior funcionará o seguinte comando:

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

porque xera o comando principal ./waf configure --disable-python. Aquí tes algúns consellos introdutorios máis sobre Waf.

Manexo de erros de compilación

As versións ns-3 son probadas nos últimos compiladores de C++ dispoñibles no momento do lanzamento nas distribucións comúns de Linux e MacOS. Non obstante, co paso do tempo, lánzanse novas distribucións con novos compiladores, e estes compiladores máis novos tenden a ser máis pedantes sobre as advertencias. ns-3 configura a súa compilación para tratar todas as advertencias como erros, polo que ás veces se está a executar unha versión antiga nun sistema máis novo, un aviso do compilador pode deter a compilación.

Por exemplo, houbo anteriormente unha versión de ns-3.28 para Fedora 28, que incluía unha nova versión principal gcc (gcc-8). Creando a versión ns-3.28 ou versións anteriores baixo Fedora 28, con Gtk2+ instalado, producirase o seguinte erro:

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

Nas versións a partir de ns‑3.28.1, en Waf hai unha opción dispoñible para resolver estes problemas. Desactiva a configuración da bandeira "-Werror" en g++ e clang++. Esta é a opción "--disable-werror" e debe aplicarse durante a configuración:

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

Configurar ou montar

Algúns comandos Waf só teñen significado na fase de configuración, e algúns só son válidos na fase de compilación. Por exemplo, se queres usar as funcións de emulación ns-3, podes activar a configuración de bits sur usando sudo, como se describe anteriormente. Isto anulará os comandos do paso de configuración e, polo tanto, pode cambiar a configuración mediante o seguinte comando, que tamén inclúe exemplos e probas.

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

Se fas isto Waf lanzará sudopara cambiar os programas de creación de sockets de código de emulación para que se executen con permisos raíz. En Waf Hai moitas outras opcións dispoñibles para a configuración e os pasos de compilación. Para explorar as túas opcións, introduce:

$ ./waf --help

Na seguinte sección usaremos algunhas opcións relacionadas coa proba.

Perfís de montaxe

Xa vimos como se pode configurar Waf para asembleas depurar и óptimo:

$ ./waf --build-profile=debug

Tamén hai un perfil de montaxe intermedio, liberar. Opción -d é sinónimo de --build-profile. O perfil de compilación controla o uso de conmutadores de rexistro, asercións e optimización do compilador:

Tutorial do simulador de rede ns-3. Capítulo 3

Como podes ver, o rexistro e as afirmacións só están dispoñibles nas compilacións de depuración. A práctica recomendada é desenvolver o seu script en modo de depuración, despois realizar execucións repetidas (para estatísticas ou cambios de parámetros) nun perfil de compilación optimizado.

Se tes código que só debería executarse en determinados perfís de compilación, utiliza a Macro de envoltorio de código:

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

Predeterminado, Waf coloca artefactos de construción no directorio de compilación. Podes especificar un directorio de saída diferente usando a opción - -out, por exemplo:

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

Ao combinar isto cos perfís de compilación, podes cambiar facilmente entre as diferentes opcións de compilación:

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

O que che permite traballar con varias montaxes sen ter que reescribir a última ensamblaxe cada vez. Cando cambias a outro perfil, Waf compilará só el, sen recompilar todo completamente.

Cando cambias os perfís de compilación deste xeito, debes ter coidado de dar as mesmas opcións de configuración cada vez. Definir varias variables de ambiente axudarache a evitar erros:

$ 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

Compiladores e bandeiras

Nos exemplos anteriores Waf para construír ns-3 usa o compilador C++ de GCC ( g ++). Non obstante, podes cambiar o que utilizas Waf compilador C++, definindo a variable de ambiente CXX. Por exemplo, para usar o compilador C++ Clang, clang++,

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

Do mesmo xeito pode configurar Waf utilizar a compilación distribuída usando distcc:

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

Pódese atopar máis información sobre distcc e compilación distribuída na páxina do proxecto na sección Documentación. Para engadir marcas do compilador ao configurar ns-3, use a variable de ambiente CXXFLAGS_EXTRA.

Instalación

Waf pódese usar para instalar bibliotecas en diferentes lugares do sistema. Por defecto, as bibliotecas compiladas e os executables sitúanse no directorio construír, e dado que Waf coñece a localización destas bibliotecas e executables, non hai necesidade de instalar as bibliotecas en ningún outro lugar.

Se os usuarios prefiren instalar fóra do directorio de compilación, poden executar o comando ./waf instalar. O prefixo predeterminado para a instalación é / usr / localpolo tanto ./waf instalar instalará programas en / usr / local / bin, bibliotecas en / Usr / local / lib e ficheiros de cabeceira en /usr/local/include. Os dereitos de superusuario xeralmente deben establecerse cun prefixo predeterminado, polo que sería un comando típico sudo ./waf install. Cando se lance, Waf optará primeiro por usar as bibliotecas compartidas no directorio de compilación e, a continuación, buscará bibliotecas ao longo do camiño cara ás bibliotecas configuradas no ambiente local. Polo tanto, ao instalar bibliotecas nun sistema, é unha boa práctica comprobar que se están a utilizar as bibliotecas correctas. Os usuarios poden optar por instalar cun prefixo diferente pasando a opción durante a configuración --prefix, por exemplo:

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

Se máis tarde, despois da compilación, o usuario introduce o comando de instalación ./waf, empregarase o prefixo /opt/local.

Equipo ./waf clean debe usarse antes de reconfigurar o proxecto se a instalación vai usar Waf baixo un prefixo diferente.

Así, para usar ns-3 non hai que chamar ./waf install. A maioría dos usuarios non necesitarán este comando porque Waf recollerá as bibliotecas actuais do directorio de compilación, pero algúns usuarios poden considerar isto útil se as súas actividades implican traballar con programas fóra do directorio ns-3.

Waf single

No nivel superior da árbore de orixe ns-3, só hai un script Waf. Unha vez que comeces a traballar, pasarás moito tempo no directorio scratch/ ou máis profundosrc/... e ao mesmo tempo ten que correr Waf. Podes lembrar onde estás e correr Waf do seguinte xeito:

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

pero isto será tedioso e propenso a erros, polo que hai mellores solucións. Unha forma habitual é usar un editor de texto como emacs ou vitalidade, na que se abren dúas sesións de terminal, unha úsase para construír ns-3 e a segunda para editar o código fonte. Se só tes tarball, entón unha variable de ambiente pode axudar:

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

$ cd scratch 
$ waff build

No directorio do módulo pode ser tentador engadir un script waf trivial como exec ../../waf. Por favor, non o fagas. Isto é confuso para os novatos e, cando se fai mal, leva a erros de compilación difíciles de detectar. As solucións mostradas arriba son o camiño que se debe usar.

3.5 Proba ns-3

Pode executar as probas unitarias da distribución ns-3 executando o script ./test.py:

$ ./test.py

Estas probas realízanse en paralelo Waf. Finalmente deberías ver unha mensaxe que di:

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

Esta é unha mensaxe importante para identificar fallos, fallos ou erros de valgrind, indicando problemas co código ou incompatibilidade entre ferramentas e código.

Tamén verá a saída final de Waf e un probador executando cada proba, que terá un aspecto así:

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)

Este comando adoita ser executado polos usuarios para verificar rapidamente que a distribución ns-3 está construída correctamente. (Ten en conta que a orde das liñas "PASS: ..." pode ser diferente, isto é normal. O importante é que a liña de resumo ao final do informe mostre que todas as probas pasaron; ningunha proba fallou ou fallou.) E WafE proba.py paralelizará o traballo nos núcleos de procesadores dispoñibles da máquina.

3.6 Execución do script

Normalmente executamos scripts baixo control Waf. Isto permite que o sistema de compilación garantice que as rutas das bibliotecas compartidas están configuradas correctamente e que as bibliotecas están dispoñibles no tempo de execución. Para executar o programa, simplemente use Waf con parámetro - -run. Imos executar o equivalente ns-3 do programa ubicuo Ola mundoescribindo o seguinte:

$ ./waf --run hello-simulator

Waf comprobará primeiro que o programa está construído correctamente e compilará se é necesario. Entón Waf executará un programa que produce a seguinte saída.

Hello Simulator

Parabéns! Agora es un usuario ns-3!

Que debo facer se non vexo resultados?

Se ves mensaxes Wafindicando que a compilación completouse correctamente, pero non ves a saída "Ola simulador", entón existe a posibilidade de que na sección [Build-with-Waf] cambiaches o teu modo de compilación a óptimo, pero perdín volver ao modo depurar. Todas as saídas da consola utilizadas neste titorial usan un compoñente ns-3 especial que realiza o rexistro e úsase para imprimir mensaxes personalizadas na consola. A saída deste compoñente desactívase automaticamente cando se compila o código optimizado; está "optimizado". Se non ves a saída "Hello Simulator", introduce o seguinte:

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

para configurar Waf para construír versións de depuración dos programas ns-3, que inclúen exemplos e probas. Despois deberías reconstruír a versión de depuración actual do código escribindo

$ ./waf

Agora se executa o programa ola-simulador, deberías ver o resultado esperado.

3.6.1 Argumentos da liña de comandos

Para pasar argumentos da liña de comandos ao programa ns-3, use o seguinte patrón:

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

Substituír ao nome do seu programa e aos argumentos. Argumento - -command-template para Waf é esencialmente unha receita para construír a liña de comandos real Waf usado para executar o programa. Waf comproba que a compilación está completa, establece as rutas da biblioteca compartida, despois usa o modelo de liña de comandos proporcionado e substitúe o nome do programa polo marcador de posición %s para chamar ao executable. Se pensas que esta sintaxe é complicada, hai unha versión máis sinxela que inclúe o programa ns-3 e os seus argumentos entre comiñas simples:

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

Outro exemplo particularmente útil é a execución selectiva de conxuntos de probas. Supoñamos que hai unha suite de probas chamada mytest (de feito non a hai). Anteriormente usamos o script ./test.py para executar unha serie de probas en paralelo, que chama repetidamente ao programa de proba. corredor de probas. Chamar corredor de probas directamente para realizar unha proba:

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

Os argumentos pasaranse ao programa corredor de probas. Dado que mytest non existe, xerarase unha mensaxe de erro. Para imprimir as opcións de corredor de proba dispoñibles, introduza:

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

3.6.2 Depuración

Para executar programas ns-3 con outra utilidade, como un depurador (por exemplo, gdb) ou unha ferramenta de proba de memoria (por exemplo, valgrind), use unha forma similar - -command-template = "…". Por exemplo, para executar no depurador gdb o teu programa hello-simulator ns-3 con argumentos:

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

Teña en conta que o nome do programa ns-3 vén co argumento - -run, e a utilidade de xestión (aquí gdb) é o primeiro símbolo do argumento - -command-template. Opción - -args informa gdbque o resto da liña de comandos pertence ao programa "inferior". (Algunhas versións gdb non entendo a opción - -args. Neste caso, elimine os argumentos do programa de - -command-template e use o conxunto de comandos gdb argumentos.) Podemos combinar esta receita e a anterior para executar a proba baixo o depurador:

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

3.6.3 Directorio de traballo

Waf debería lanzarse desde a súa localización na parte superior da árbore ns-3. Este cartafol convértese no directorio de traballo onde se escribirán os ficheiros de saída. Pero e se queres manter estes ficheiros fóra da árbore de orixe ns-3? Usa argumento - -cwd:

$ ./waf --cwd=...

Pode que che resulte máis cómodo obter os ficheiros de saída no teu directorio de traballo. Neste caso, a seguinte acción indirecta pode axudar:

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

Esta decoración da versión anterior do comando conserva o directorio de traballo actual, vai ao directorio Wafe despois instrúe Waf para cambiar o directorio de traballo de novo ao directorio de traballo actual gardado antes de iniciar o programa. Mencionamos o equipo - -cwd Para completar, a maioría dos usuarios simplemente executan Waf desde o directorio de nivel superior e xeran alí ficheiros de saída.

Continúa: Capítulo 4

Fonte: www.habr.com

Engadir un comentario