Tutorial del simulador de red ns-3. Capítulo 3

Tutorial del simulador de red ns-3. Capítulo 3
Capítulo 1,2

3 Empezando
3.1 Descripción general
3.2 Condiciones previas
3.2.1 Descarga de la versión ns-3 como archivo fuente
3.3 Descargar ns-3 usando Git
3.3.1 Cargando ns-3 usando Bake
3.4 Montaje ns-3
3.4.1 Construyendo con build.py
3.4.2 Construir con Bake
3.4.3 Construir con Waf
3.5 Pruebas de ns-3
3.6 Ejecutar el script
3.6.1 Argumentos de la línea de comando
3.6.2 Depuración
3.6.3 Directorio de trabajo

Capítulo 3

Empezando

Este capítulo tiene como objetivo preparar al lector para comenzar con una computadora en la que quizás nunca se haya instalado ns-3. Cubre las plataformas compatibles, los requisitos previos, cómo obtener ns-3, cómo compilar ns-3 y cómo probar su compilación y ejecutar programas simples.

3.1 Descripción general

El simulador ns-3 está construido como un sistema de bibliotecas de software colaborativas. Durante el ensamblaje, el código de los programas de usuario se vincula con estas bibliotecas. Los lenguajes de programación C++ o Python se utilizan para escribir programas personalizados.

Ns-3 se distribuye como código fuente, lo que significa que el sistema de destino debe tener un entorno de desarrollo de software para poder construir primero las bibliotecas y luego crear el programa de usuario. En principio, ns-3 podría distribuirse como bibliotecas listas para usar para un sistema específico y en el futuro podrán distribuirse de esta manera. Pero hoy en día muchos usuarios hacen su trabajo editando el propio ns-3, por lo que es útil tener el código fuente para construir las bibliotecas. Si alguien desea asumir el trabajo de crear bibliotecas y paquetes listos para usar para sistemas operativos, comuníquese con la lista de correo. ns-desarrolladores.

A continuación, veremos tres formas de descargar y compilar ns-3. La primera es descargar y crear la versión oficial desde el sitio principal. El segundo es la selección y montaje de copias de las versiones de desarrollo de la instalación básica de ns-3. El tercero es utilizar herramientas de compilación adicionales para cargar más extensiones para ns-3. Revisaremos cada uno ya que las herramientas son ligeramente diferentes.

Los usuarios experimentados de Linux pueden preguntarse por qué ns-3 no se proporciona como un paquete como la mayoría de las otras bibliotecas que utilizan un administrador de paquetes. Aunque existen paquetes binarios para varias distribuciones de Linux (por ejemplo, Debian), la mayoría de los usuarios terminan editando las bibliotecas y teniendo que reconstruir ns-3 ellos mismos, por lo que es útil tener el código fuente disponible. Por este motivo, nos centraremos en la instalación desde el código fuente.

Para la mayoría de las aplicaciones, derechos ns-3 raíz no son necesarios, se recomienda utilizar una cuenta de usuario sin privilegios.

3.2 Condiciones previas

El conjunto completo de bibliotecas ns-3 disponibles tiene varias dependencias de bibliotecas de terceros, pero en su mayor parte, ns-3 se puede crear y utilizar con soporte para varios componentes comunes (a menudo instalados de forma predeterminada): un compilador de C++, Python, un editor de código fuente (por ejemplo, empuje, emacs o eclipsar) y, si se utilizan repositorios de desarrollo, sistemas de control de versiones Git. La mayoría de los usuarios nuevos no tendrán que preocuparse si su configuración indica que faltan algunas características avanzadas de ns-3, pero para aquellos que desean una instalación completa, el proyecto proporciona una wiki que incluye páginas con muchos consejos y trucos útiles. Una de esas páginas es la página de Instalación, con instrucciones de instalación para varios sistemas, disponible en: https://www.nsnam.org/wiki/Installation.

La sección de Requisitos previos de este wiki explica qué paquetes son necesarios para admitir opciones comunes de ns-3 y también proporciona los comandos utilizados para instalarlos en versiones comunes de Linux o macOS.

Puede aprovechar esta oportunidad para explorar la página wiki de ns-3 o el sitio web principal: https://www.nsnam.org, porque hay mucha información allí. A partir de la última versión de ns-3 (ns-3.29), se requieren las siguientes herramientas para ejecutar ns-3:

Paquete/versión de herramientas

  • compilador de C ++
    clang++ o g++ (g++ versión 4.9 o superior)
  • Python
    Versión de Python2 >= 2.7.10, o versión de Python3 >=3.4
  • Git
    cualquier versión más reciente (para acceder a ns-3 en GitLab.com)
  • alquitrán
    cualquier versión más reciente (para descomprimir la versión ns‑3)
  • bunzip2
    cualquier versión más reciente (para descomprimir la versión ns‑3)

Para verificar la versión predeterminada de Python, escriba python -V. Para comprobar la versión de g++, escriba g++ -v. Si falta alguna herramienta o es demasiado antigua, consulte la guía de instalación en la página wiki de ns-3.

De ahora en adelante, asumimos que el lector ejecuta Linux, MacOS o un emulador de Linux y tiene al menos las herramientas anteriores.

3.2.1 Descarga de la versión ns-3 como archivo fuente

Este es el curso de acción para un nuevo usuario que desea descargar y experimentar con las últimas versiones y paquetes de ns-3. Las versiones de ns-3 se publican como archivos fuente comprimidos, a veces llamados bola de alquitrán. bola de alquitrán es un formato de archivo de software especial en el que se combinan varios archivos. El archivo suele estar comprimido. proceso de arranque ns-3 a través de bola de alquitrán es simple, sólo necesita seleccionar una versión, descargarla y descomprimirla.

Supongamos que usted, como usuario, desea compilar ns-3 en un directorio local llamado espacio de trabajo. Puede obtener una copia funcional de la versión ingresando lo siguiente en la consola de Linux (sustituyendo los números de versión apropiados, por supuesto)

$ 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 a la utilidad utilizada anteriormente. wget, que es una herramienta de línea de comandos para descargar objetos de Internet. Si no lo ha instalado, puede utilizar su navegador para ello.

Si sigue estos pasos, accederá al directorio ns-allinone-3.29, allí debería ver varios archivos y 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

Ahora está listo para construir la distribución base de ns-3 y puede pasar a la sección sobre la construcción de ns-3.

3.3 Descargar ns-3 usando Git

El código ns-3 está disponible en los repositorios de Git en GitLab.com en https://gitlab.com/nsnam/. Grupo nsnam reúne los distintos repositorios utilizados por un proyecto de código abierto.

La forma más sencilla de empezar a utilizar los repositorios de Git es bifurcar o clonar el entorno. ns-3-alinona. Este es un conjunto de scripts que gestiona la carga y el ensamblaje de los subsistemas ns-3 más utilizados. Si es nuevo en Git, es posible que los términos "bifurcación" y "clon" no le resulten familiares; Si es así, te recomendamos que simplemente clones (hagas tu propia copia) el repositorio ubicado en GitLab.com de esta manera:

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

En esta etapa, la vista de su directorio ns-3-alinona ligeramente diferente del directorio de archivo de lanzamiento descrito anteriormente. Debería verse así:

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

Tenga en cuenta que hay un guión. descargar.py, que además extraerá ns-3 y el código fuente que lo acompaña. Aquí tienes una opción: descargar la última instantánea de desarrollo de ns-3:

$ python download.py

o prefiere la versión ns-3 usando la bandera -n para indicar el número de versión:

$ python download.py -n ns-3.29

Después de este paso al directorio. ns-3-alinona Se descargarán repositorios adicionales. ns-3, cocción, pybindgen и netanim.

Nota
En una máquina con Ubuntu16.04 limpio, necesitaba cambiar el comando a esto: $ sudo python3 download.py -n ns-3.29 (en adelante notas del traductor).

3.3.1 Cargando ns-3 usando Bake

Los dos métodos anteriores (archivo fuente o repositorio ns-3-alinona vía Git) son útiles para obtener la instalación más simple de ns-3 con múltiples complementos (pybindgen para generar enlaces de Python y netanim para animación en red). El tercer repositorio proporcionado por defecto en ns-3-allinone se llama cocción.

Hornear es una herramienta para la construcción coordinada de software desde múltiples repositorios, desarrollada para el proyecto ns-3. Hornear se puede utilizar para obtener versiones de desarrollo de ns-3, así como para descargar y crear extensiones de la versión base de la distribución de ns-3, como el entorno Ejecución directa de código, CradleCuna de simulación de red, la capacidad de crear nuevos enlaces de Python y varias “aplicaciones” ns-3.

Nota
CradleNetwork Simulation Cradle es un marco que le permite utilizar pilas de red TCP/IP reales dentro de un simulador de red.

Si espera que su instalación de ns-3 tenga funciones avanzadas o adicionales, puede seguir esta ruta de instalación.

En las últimas versiones de ns-3 Hornear se añadió a la liberación de alquitrán. La versión incluye un archivo de configuración que le permite descargar las versiones de software actuales en el momento del lanzamiento. Esta es, por ejemplo, la versión Hornear, que se distribuye con la versión ns-3.29, se puede utilizar para recuperar componentes de esa versión de ns-3 o anterior, pero no se puede utilizar para recuperar componentes de versiones posteriores (si el archivo de descripción del paquete hornearconf.xml no actualizado).

También puede obtener la última copia. coccióningresando el siguiente comando en su consola Linux (suponiendo que tenga Git instalado):

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

Cuando ejecutas el comando git, deberías ver algo como lo siguiente:

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.

Después de que se complete el comando clonar deberías tener un directorio llamado cocción, cuyo contenido debería verse así:

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

Tenga en cuenta que ha cargado varios scripts de Python, un módulo de Python llamado cocción y un archivo de configuración XML. El siguiente paso es utilizar estos scripts para descargar y crear la distribución ns-3 de su elección. Hay varios objetivos de personalización disponibles:

  1. ns-3.29: módulo correspondiente a la versión; descargará componentes similares a la versión en el tarball;

  2. ns-3-dev: un módulo similar, pero usando código del árbol de desarrollo;

  3. ns-allinona-3.29: Un módulo que incluye otras características adicionales como enrutamiento de clic y soporte de simulación de red, Openflow para ns-3.

  4. ns-3-alinona: similar a la versión de lanzamiento del módulo allinone, pero para código de desarrollo.

Nota
Haga Clic en — arquitectura de software modular para la creación de enrutadores.

Openflow es un protocolo para gestionar el proceso de procesamiento de datos transmitidos a través de una red de datos mediante enrutadores y conmutadores, implementando tecnología de red definida por software.

La instantánea de desarrollo actual (no publicada) ns-3 se puede encontrar en:https://gitlab.com/nsnam/ns-3-dev.git.

Los desarrolladores intentan mantener estos repositorios en un estado de funcionamiento constante, pero se encuentran en el área de desarrollo y contienen código inédito, por lo que si no planea utilizar nuevas funciones, seleccione la versión oficial.

Puede encontrar la última versión del código navegando por la lista de repositorios o visitando la página web de versiones de ns-3:https://www.nsnam.org/releases/ y haciendo clic en el enlace de la última versión. En este ejemplo continuaremos con ns-3.29.

Ahora, para obtener los componentes ns-3 que necesitamos, usaremos la herramienta Hornear. Digamos algunas palabras introductorias sobre el trabajo. Hornear.

Bake funciona cargando fuentes de paquetes en un directorio fuente e instalar las bibliotecas en el directorio de compilación. Hornear se puede ejecutar haciendo referencia al binario, pero si desea ejecutar Hornear no desde el directorio en el que se descargó, es recomendable agregar la ruta a cocción a su ruta (variable de entorno PATH), por ejemplo de la siguiente manera (ejemplo para Linux bash shell). Vaya al directorio "bake" y luego configure las siguientes variables de entorno:

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

Esto colocará el programa hornear.py a la ruta del shell y permitirá que otros programas encuentren los ejecutables y bibliotecas que creó cocción. En algunos casos de uso cocción, la configuración PATH y PYTHONPATH descrita anteriormente no es necesaria, pero normalmente sí la requiere una compilación completa de ns-3-allinone (con paquetes adicionales).

Vaya a su directorio de trabajo e ingrese lo siguiente en la consola:

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

A continuación preguntaremos Hornear comprobar si tenemos suficientes herramientas para cargar los distintos componentes. Marcar:

$ ./bake.py check

Deberías ver algo como lo siguiente:

> 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, herramientas de carga como Mercurial, CVS, Git y Bazaar son fundamentales en este paso ya que nos permiten obtener el código. En este punto, instale las herramientas que faltan de la forma habitual para su sistema (si sabe cómo hacerlo) o comuníquese con el administrador de su sistema para obtener ayuda.

A continuación, intente descargar el software:

$ ./bake.py download

el resultado debería ser algo 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

Esto significará que se han descargado tres fuentes. Ahora vaya al directorio fuente y escriba ls; Debería ver:

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

Ahora está listo para construir la distribución ns-3.

3.4 Montaje ns-3

Al igual que con la descarga de ns-3, hay varias formas de compilar ns-3. Lo principal que queremos enfatizar es que ns-3 se construye utilizando una herramienta de compilación llamada Wafdescrito abajo. La mayoría de los usuarios trabajarán con Waf, pero existen algunos scripts útiles que le ayudarán a empezar u organizar compilaciones más complejas. Entonces, por favor, antes de leer sobre Waf, echa un vistazo a construir.py y montaje con cocción.

3.4.1 Construyendo con build.py

¡Atención! Este paso de compilación solo está disponible en la versión del archivo fuente obtenida como se describe anteriormente; y no descargado a través de git o bake.

Cuando se trabaja con un archivo de lanzamiento bola de alquitránEn ns-3-alinona Hay un script útil que puede facilitar el montaje de los componentes. Se llama build.py. Este programa configurará el proyecto para usted de la manera más útil. Sin embargo, tenga en cuenta que la configuración más avanzada y el trabajo con ns-3 generalmente implican el uso del propio sistema de compilación de ns-3, Waf, que se presentará más adelante en este tutorial.

Si descargaste usando bola de alquitrán, luego en tu directorio ~ / espacio de trabajo un directorio con un nombre algo así como ns-allinona-3.29. Introduzca la siguiente:

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

cuando se llama construir.py Usamos argumentos de línea de comando para crear los ejemplos y pruebas utilizados en este tutorial, que no están integrados de forma predeterminada en ns-3. De forma predeterminada, el programa también crea todos los módulos disponibles. Luego, si lo desea, puede compilar ns-3 sin ejemplos ni pruebas, o excluir módulos que no sean necesarios para su trabajo.

Verá muchos mensajes de salida del compilador mostrados por el script a medida que construye las distintas partes que ha cargado. Primero, el guión intentará construir el animador. netanim, entonces el generador de enlace pybindgen y finalmente ns-3. Cuando se complete el proceso, debería ver lo siguiente:

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

En las últimas tres líneas del listado vemos un mensaje sobre módulos que no fueron creados:

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

Esto simplemente significa que es posible que algunos módulos ns-3 que dependen de bibliotecas externas no se hayan compilado o que no es necesario compilarlos para esta configuración. Esto no significa que el simulador no esté ensamblado o que los módulos ensamblados no funcionen correctamente.

3.4.2 Construir con Bake

Si usó Bake arriba para obtener el código fuente de los repositorios del proyecto, puede continuar usándolo para compilar ns-3. Marcar:

$ ./bake.py build

y deberías ver algo como:

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

Tooltip: También puede realizar los pasos de descarga y compilación a la vez llamando a "bake.py implementar".

El ensamblaje de todos los componentes puede fallar, pero el ensamblaje continuará si no se requiere un componente. Por ejemplo, un problema reciente de portabilidad fue que castxml se puede montar con herramienta cocción no en todas las plataformas. En este caso, aparecerá un mensaje como este:

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

Sino castxml solo es necesario si desea crear enlaces de Python actualizados. Para la mayoría de los usuarios no es necesario esto (al menos hasta que cambien ns-3), por lo que dichas advertencias pueden ignorarse con seguridad por ahora.

Si falla, el siguiente comando le dará una pista sobre las dependencias que faltan:

$ ./bake.py show

Se enumerarán las distintas dependencias de los paquetes que está intentando crear.

3.4.3 Construir con Waf

Hasta este punto, para comenzar a construir ns-3, usamos el script construir.py, o herramienta cocción. Estas herramientas son útiles para construir ns-3 y mantener bibliotecas. De hecho, para construir ejecutan la herramienta de compilación. Waf del directorio ns-3. Waf instalado con el código fuente ns-3. La mayoría de los usuarios pasan rápidamente al uso directo para configurar y ensamblar el ns‑3. Waf. Entonces, para continuar, vaya al directorio ns-3 que creó originalmente.

Esto no es estrictamente necesario en este momento, pero será útil retroceder un poco y ver cómo realizar cambios en la configuración del proyecto. Probablemente el cambio de configuración más útil que puede realizar es crear una versión optimizada del código. De forma predeterminada, ha configurado su proyecto para crear una versión de depuración. Echemos un vistazo a un proyecto para crear una compilación optimizada. Para explicarle a Waf que debe realizar compilaciones optimizadas que incluyan ejemplos y pruebas, deberá ejecutar los siguientes comandos:

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

Esto lanzará Waf fuera del directorio local (para su comodidad). El primer comando limpia la compilación anterior; esto generalmente no es estrictamente necesario, pero es una buena práctica (consulte también los perfiles de compilación a continuación); esto eliminará las bibliotecas creadas previamente y los archivos de objetos ubicados en el directorio construir/. Cuando se reconfigura el proyecto y el sistema de compilación verifica las distintas dependencias, debería ver un resultado similar al siguiente:

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)

Tenga en cuenta la última parte del listado anterior. Algunas opciones de ns-3 no están habilitadas de forma predeterminada o requieren soporte del sistema para funcionar correctamente. Por ejemplo, para habilitar XmlTo, la biblioteca debe estar presente en el sistema. libxml-2.0. Si no se encontró esta biblioteca y la función ns-3 correspondiente no estaba habilitada, se mostrará un mensaje. También tenga en cuenta que es posible utilizar el comando sudo para establecer el bit suid "establecer ID de grupo en tiempo de ejecución" para ciertos programas. No está habilitada de forma predeterminada y, por lo tanto, esta función aparece como "no habilitada". Finalmente, para obtener una lista de opciones habilitadas, use Waf con parámetro --check-config.

Ahora regresemos y volvamos a la compilación de depuración que contiene ejemplos y pruebas.

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

El sistema de compilación ahora está configurado y puede compilar versiones de depuración de programas ns-3 simplemente escribiendo:

$ ./waf

Es posible que los pasos anteriores le hayan obligado a crear parte del sistema ns-3 dos veces, pero ahora sabe cómo cambiar la configuración y crear código optimizado.

Para comprobar qué perfil está activo para una configuración de proyecto determinada, existe un comando:

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

El escenario anterior construir.py también apoya argumentos --enable-examples и --enable-tests, pero otras opciones Waf No es compatible directamente. Por ejemplo, esto no funcionará:

$ ./build.py --disable-python

la reacción será así:

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

Sin embargo, el operador especial - - se puede utilizar para pasar parámetros adicionales a través de wafentonces, en lugar de lo anterior, funcionará el siguiente comando:

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

porque genera el comando principal ./waf configurar --disable-python. A continuación se ofrecen algunos consejos más introductorios sobre Waf.

Manejo de errores de compilación

Las versiones de ns-3 se prueban en los compiladores de C++ más recientes disponibles en el momento del lanzamiento en distribuciones comunes de Linux y MacOS. Sin embargo, con el tiempo, se lanzan nuevas distribuciones con nuevos compiladores, y estos compiladores más nuevos tienden a ser más pedantes con las advertencias. ns-3 configura su compilación para tratar todas las advertencias como errores, por lo que a veces, si ejecuta una versión anterior en un sistema más nuevo, una advertencia del compilador puede detener la compilación.

Por ejemplo, anteriormente hubo una versión de ns‑3.28 para Fedora 28, que incluía una nueva versión principal. gcc (gcc-8). Al compilar la versión ns-3.28 o versiones anteriores en Fedora 28, con Gtk2+ instalado, se producirá el siguiente error:

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

En las versiones a partir de ns‑3.28.1, en Waf Hay una opción disponible para resolver estos problemas. Deshabilita la configuración del indicador "-Werror" en g++ y clang++. Esta es la opción "--disable-werror" y debe aplicarse durante la configuración:

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

Configurar o montar

Algunos comandos Waf tienen significado sólo en la fase de configuración, y algunos sólo son válidos en la fase de construcción. Por ejemplo, si desea utilizar las funciones de emulación ns-3, puede habilitar la configuración de bits suid utilizando sudo, como se describió anteriormente. Esto anulará los comandos de los pasos de configuración y, por lo tanto, podrá cambiar la configuración utilizando el siguiente comando, que también incluye ejemplos y pruebas.

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

Si haces esto Waf lanzará sudopara cambiar los programas de creación de sockets de código de emulación para ejecutarlos con permisos raíz. En Waf Hay muchas otras opciones disponibles para los pasos de configuración y compilación. Para explorar sus opciones, ingrese:

$ ./waf --help

En la siguiente sección usaremos algunas opciones relacionadas con las pruebas.

Perfiles de montaje

Ya hemos visto cómo puedes configurar Waf para montajes depurar и optimizado:

$ ./waf --build-profile=debug

También existe un perfil de montaje intermedio, ,. Opción -d es sinónimo de --build-profile. El perfil de compilación controla el uso de registros, aserciones y modificadores de optimización del compilador:

Tutorial del simulador de red ns-3. Capítulo 3

Como puede ver, el registro y las afirmaciones solo están disponibles en compilaciones de depuración. La práctica recomendada es desarrollar su script en modo de depuración y luego realizar ejecuciones repetidas (para estadísticas o cambios de parámetros) en un perfil de compilación optimizado.

Si tiene código que solo debería ejecutarse en ciertos perfiles de compilación, use la macro Code Wrapper:

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

Defecto, Waf coloca los artefactos de compilación en el directorio de compilación. Puede especificar un directorio de salida diferente usando la opción - -out, Por ejemplo:

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

Al combinar esto con perfiles de compilación, puedes cambiar fácilmente entre diferentes opciones de compilación:

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

Lo que le permite trabajar con múltiples ensamblajes sin tener que reescribir el último ensamblaje cada vez. Cuando cambias a otro perfil, Waf solo lo compilará, sin recompilar todo por completo.

Cuando cambia los perfiles de compilación de esta manera, debe tener cuidado de ofrecer las mismas opciones de configuración cada vez. Definir varias variables de entorno le ayudará a evitar errores:

$ 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 y banderas

En los ejemplos anteriores Waf para compilar ns-3 se utiliza el compilador C++ de GCC ( g ++). Sin embargo, puedes cambiar el que usas. Waf Compilador de C++, definiendo la variable de entorno CXX. Por ejemplo, para utilizar el compilador de C++ Clang, clang++,

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

De la misma manera puedes configurar Waf usar compilación distribuida usando distrito:

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

Puede encontrar más información sobre distcc y la compilación distribuida en la página del proyecto en la sección Documentación. Para agregar indicadores del compilador al configurar ns-3, use la variable de entorno CXXFLAGS_EXTRA.

Instalación

Waf se puede utilizar para instalar bibliotecas en diferentes lugares del sistema. De forma predeterminada, las bibliotecas y ejecutables compilados se encuentran en el directorio build, y dado que Waf conoce la ubicación de estas bibliotecas y ejecutables, no es necesario instalar las bibliotecas en ningún otro lugar.

Si los usuarios prefieren instalar fuera del directorio de compilación, pueden ejecutar el comando ./waf instalar. El prefijo predeterminado para la instalación es / usr / localpor eso ./waf instalar instalará programas en / usr / local / bin, bibliotecas en / usr / local / lib y archivos de encabezado en / usr / local / include. Los derechos de superusuario generalmente deben configurarse con un prefijo predeterminado, por lo que un comando típico sería instalación de sudo ./waf. Cuando se inicie, Waf primero elegirá usar las bibliotecas compartidas en el directorio de compilación y luego buscará bibliotecas en la ruta a las bibliotecas configuradas en el entorno local. Por lo tanto, al instalar bibliotecas en un sistema, es una buena práctica comprobar que se estén utilizando las bibliotecas correctas. Los usuarios pueden optar por instalar con un prefijo diferente pasando la opción durante la configuración. --prefix, Por ejemplo:

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

Si más tarde, después de la compilación, el usuario ingresa el comando de instalación ./waf, se utilizará el prefijo / opt / local.

Equipo ./waf clean debe usarse antes de reconfigurar el proyecto si la instalación usará Waf bajo un prefijo diferente.

Por tanto, para utilizar ns-3 no es necesario llamar ./waf install. La mayoría de los usuarios no necesitarán este comando porque Waf recogerá las bibliotecas actuales del directorio de compilación, pero algunos usuarios pueden encontrarlo útil si sus actividades implican trabajar con programas fuera del directorio ns-3.

waf soltero

En el nivel superior del árbol de fuentes de ns-3, solo hay un script Waf. Una vez que empieces a trabajar, pasarás mucho tiempo en el directorio. scratch/ o más profundamente ensrc/... y al mismo tiempo tener que correr Waf. Puedes simplemente recordar dónde estás y correr. Waf следующим обрахом:

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

pero esto será tedioso y propenso a errores, por lo que existen mejores soluciones. Una forma común es utilizar un editor de texto como emacs o empuje, en el que se abren dos sesiones de terminal, una se usa para construir ns-3 y la segunda se usa para editar el código fuente. si solo tienes bola de alquitrán, entonces una variable de entorno puede ayudar:

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

$ cd scratch 
$ waff build

En el directorio del módulo puede resultar tentador agregar un script waf trivial como exec ../../waf. Por favor, no hagas eso. Esto resulta confuso para los principiantes y, cuando se hace mal, genera errores de compilación difíciles de detectar. Las soluciones que se muestran arriba son el camino que se debe utilizar.

3.5 Pruebas de ns-3

Puede ejecutar las pruebas unitarias de la distribución ns-3 ejecutando el script ./prueba.py:

$ ./test.py

Estas pruebas se realizan en paralelo con Waf. Finalmente deberías ver un mensaje que diga:

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

Este es un mensaje importante para identificar fallas, fallas o errores de valgrind, que indican problemas con el código o incompatibilidad entre herramientas y código.

También verá el resultado final de Waf y un probador que ejecuta cada prueba, que se verá 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)

Los usuarios suelen ejecutar este comando para verificar rápidamente que la distribución ns-3 esté construida correctamente. (Tenga en cuenta que el orden de las líneas "APROBADO: ..." puede ser diferente, esto es normal. Lo importante es que la línea de resumen al final del informe muestra que todas las pruebas pasaron; ninguna prueba falló o falló). Y WafY prueba.py paralelizará el trabajo en los núcleos de procesador disponibles de la máquina.

3.6 Ejecutar el script

Normalmente ejecutamos scripts bajo control. Waf. Esto permite que el sistema de compilación garantice que las rutas de las bibliotecas compartidas estén configuradas correctamente y que las bibliotecas estén disponibles en tiempo de ejecución. Para ejecutar el programa, simplemente use Waf con parámetro - -run. Ejecutemos el equivalente ns-3 del omnipresente programa. hola mundoescribiendo lo siguiente:

$ ./waf --run hello-simulator

Waf primero verificará que el programa esté compilado correctamente y lo compilará si es necesario. Entonces Waf ejecutará un programa que produce el siguiente resultado.

Hello Simulator

¡Felicidades! ¡Ahora eres usuario de ns-3!

¿Qué debo hacer si no veo resultados?

Si ves mensajes Wafindicando que la compilación se completó correctamente, pero no ve el resultado "Hola Simulador", entonces existe la posibilidad de que en la sección [Build-with-Waf] hayas cambiado tu modo de compilación a optimizado, pero no pudo volver al modo depurar. Toda la salida de la consola utilizada en este tutorial utiliza un componente ns-3 especial que realiza el registro y se utiliza para imprimir mensajes personalizados en la consola. La salida de este componente se desactiva automáticamente cuando se compila el código optimizado: está "optimizado". Si no ve el resultado "Hola Simulador", ingrese lo siguiente:

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

para configurar Waf para crear versiones de depuración de programas ns-3, que incluyen ejemplos y pruebas. Luego deberías reconstruir la versión de depuración actual del código escribiendo

$ ./waf

Ahora si ejecutas el programa hola-simulador, deberías ver el resultado esperado.

3.6.1 Argumentos de la línea de comando

Para pasar argumentos de línea de comando al programa ns-3, use el siguiente patrón:

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

Reemplazar al nombre de su programa y a los argumentos. Argumento - -command-template para Waf es esencialmente una receta para construir la línea de comando real Waf utilizado para ejecutar el programa. Waf verifica que la compilación esté completa, establece las rutas de la biblioteca compartida, luego usa la plantilla de línea de comando proporcionada y sustituye el nombre del programa por el marcador de posición %s para llamar al ejecutable. Si esta sintaxis le resulta complicada, existe una versión más sencilla que incluye el programa ns-3 y sus argumentos entre comillas simples:

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

Otro ejemplo particularmente útil es la ejecución selectiva de conjuntos de pruebas. Supongamos que hay un conjunto de pruebas llamado mytest (de hecho, no lo hay). Arriba utilizamos el script ./test.py para ejecutar varias pruebas en paralelo, que llama repetidamente al programa de prueba. corredor de pruebas. Llamar corredor de pruebas directamente para ejecutar una prueba:

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

Los argumentos se pasarán al programa. corredor de pruebas. Como mytest no existe, se generará un mensaje de error. Para imprimir las opciones disponibles del corredor de prueba, ingrese:

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

3.6.2 Depuración

Para ejecutar programas ns-3 con otra utilidad, como un depurador (por ejemplo, gdb) o una herramienta de prueba de memoria (por ejemplo, Valgrind), utilice una forma similar - -command-template = "…". Por ejemplo, para ejecutar en el depurador gdb su programa hello-simulator ns-3 con argumentos:

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

Tenga en cuenta que el nombre del programa ns-3 viene con el argumento - -runy la utilidad de gestión (aquí gdb) es el primer token del argumento - -command-template. Opción - -args сообщает gdbque el resto de la línea de comando pertenece al programa "inferior". (Algunas versiones gdb no entiendo la opción - -args. En este caso, elimine los argumentos del programa de - -command-template y usar el conjunto de comandos gdb args.) Podemos combinar esta receta y la anterior para ejecutar la prueba en el depurador:

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

3.6.3 Directorio de trabajo

Waf debe iniciarse desde su ubicación en la parte superior del árbol ns-3. Esta carpeta se convierte en el directorio de trabajo donde se escribirán los archivos de salida. Pero, ¿qué sucede si desea mantener estos archivos fuera del árbol fuente de ns-3? Usar argumento - -cwd:

$ ./waf --cwd=...

Puede que le resulte más conveniente obtener los archivos de salida en su directorio de trabajo. En este caso, las siguientes acciones indirectas pueden ayudar:

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

Esta decoración de la versión anterior del comando conserva el directorio de trabajo actual, va al directorio Wafy luego instruye Waf para volver a cambiar el directorio de trabajo al directorio de trabajo actual guardado antes de iniciar el programa. Mencionamos al equipo. - -cwd Para completar, la mayoría de los usuarios simplemente ejecutan Waf desde el directorio de nivel superior y generan archivos de salida allí.

Continuación: Capítulo 4

Fuente: habr.com

Añadir un comentario