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

Manual del simulador de red ns-3. Capítulo 3
capítulos 1, 2

3 Empezando a trabajar
3.1 Resumen
3.2 Requisitos previos
3.2.1 Descarga de la versión ns-3 como un archivo fuente comprimido
3.3 Descarga de ns-3 utilizando Git
3.3.1 Descarga de ns-3 con Bake
3.4 Compilación de ns-3
3.4.1 Compilación utilizando build.py
3.4.2 Compilación con Bake
3.4.3 Compilación con Waf
3.5 Pruebas de ns-3
3.6 Ejecución del script
3.6.1 Argumentos de línea de comandos
3.6.2 Depuración
3.6.3 Directorio de trabajo

Capítulo 3

Empezando a trabajar

Este capítulo está diseñado para preparar al lector para trabajar desde una computadora en la que posiblemente nunca se ha instalado ns-3. La exposición cubre plataformas soportadas, requisitos previos, métodos para obtener ns-3, métodos para compilar ns-3 y métodos para verificar tu compilación y ejecutar programas simples.

3.1 Resumen

El simulador ns-3 está construido como un sistema de bibliotecas de software que trabajan conjuntamente. Al compilar, el código de programas personalizados se enlaza con estas bibliotecas. Se utilizan los lenguajes de programación C++ o Python para escribir programas personalizados.

Ns-3 se distribuye en forma de código fuente, lo que significa que el sistema objetivo debe tener un entorno de desarrollo de software para compilar primero las bibliotecas y luego compilar el programa personalizado. En principio, ns-3 podría distribuirse como bibliotecas listas para un sistema específico, y en el futuro podrían distribuirse de esta manera. Pero actualmente, muchos usuarios realizan su trabajo editando el ns-3 en sí, por lo que es útil tener el código fuente para compilar las bibliotecas. Si alguien quisiera hacerse cargo de crear bibliotecas listas y paquetes para sistemas operativos, por favor, póngase en contacto con la lista de correo. ns-developers.

A continuación, veremos tres métodos para descargar y compilar ns-3. El primero es descargar y construir la versión oficial desde el sitio principal. El segundo es seleccionar y compilar versiones de desarrollo de la instalación base de ns-3. El tercero es usar herramientas adicionales de compilación para descargar más extensiones para ns-3. Abordaremos cada uno, ya que las herramientas son un poco diferentes.

Los usuarios experimentados de Linux pueden preguntarse por qué ns-3 no se proporciona como un paquete, a diferencia de la mayoría de las otras bibliotecas que utilizan un gestor de paquetes. Aunque existen paquetes binarios para varias distribuciones de Linux (como Debian), la mayoría de los usuarios eventualmente editan las bibliotecas y necesitan recompilar ns-3, por lo que la disponibilidad del código fuente es conveniente. Por esta razón, nos centraremos en la instalación desde el código fuente.

Para la mayoría de las aplicaciones, ns-3 no requiere root , se recomienda usar una cuenta de usuario no privilegiada.

3.2 Requisitos previos

Todo el conjunto de bibliotecas disponibles en ns-3 tiene una serie de dependencias de bibliotecas externas, pero en su mayor parte, ns-3 se puede compilar y utilizar con el soporte de varios componentes comunes (a menudo instalados por defecto): el compilador C++, Python, un editor de código fuente (por ejemplo, vim, emacs o Eclipse) y, si se utilizan repositorios de desarrollo, sistemas de control de versiones Git. La mayoría de los usuarios principiantes no necesitan preocuparse si su configuración informa algunas funciones adicionales faltantes 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 pistas útiles. Una de estas 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 "Requisitos previos" de esta página de la wiki explica qué paquetes se requieren para soportar las opciones comunes de ns-3, así como proporciona comandos utilizados para su instalación en versiones populares de Linux o macOS.

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

Herramienta Paquete/version

  • Compilador C++
    clang++ o g++ (g++ versión 4.9 o superior)
  • Python
    python2 versión >= 2.7.10, o python3 versión >=3.4
  • Git
    cualquier versión reciente (para acceder a ns-3 en GitLab.com)
  • tar
    cualquier versión reciente (para descomprimir la versión de ns-3)
  • bunzip2
    cualquier versión reciente (para descomprimir la versión de ns-3)

Para verificar la versión de Python instalada por defecto, ingresa python -V. Para comprobar la versión de g++, introduce g++ -v. Si faltan herramientas o son demasiado antiguas, consulta la guía de instalación en la página wiki de ns‑3.

A partir de este punto, asumimos que el lector está trabajando en Linux, MacOS o un emulador de entorno Linux y tiene al menos las herramientas mencionadas anteriormente.

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

Este es el procedimiento para un nuevo usuario que quiere descargar y experimentar con las últimas versiones de lanzamiento y por paquetes de ns‑3. Las versiones de ns‑3 se publican en forma de archivos comprimidos de código fuente, a veces llamados tarball. tarball — es un formato especial de archivo que combina múltiples archivos. El archivo suele estar comprimido. El proceso de descarga de ns‑3 a través de tarball es sencillo, solo necesitas seleccionar una versión, descargarla y descomprimirla.

Supongamos que, como usuario, deseas compilar ns‑3 en un directorio local llamado workspace. Podrás obtener una copia de trabajo de la versión introduciendo en la consola de Linux lo siguiente (por supuesto, reemplazando los números de versión correspondientes)

$ 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 

Nota la utilidad utilizada arriba, wget, que es una herramienta de línea de comandos para descargar objetos desde Internet. Si no la has instalado, puedes utilizar tu navegador para hacerlo.

Siguiendo estos pasos, entrarás en el directorio ns-allinone-3.29, donde deberías 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ás listo para compilar la distribución base de ns‑3 y puedes dirigirte a la sección dedicada a la compilación de ns‑3.

3.3 Descarga de ns-3 utilizando Git

El código de ns‑3 está disponible en los repositorios de Git en GitLab.com en la dirección https://gitlab.com/nsnam/. El grupo nsnam agrupa varios repositorios utilizados por el proyecto de código abierto.

La forma más fácil de comenzar a usar los repositorios de Git es hacer un fork o clonar el entorno ns‑3-allinone. Este es un conjunto de scripts que gestiona la descarga y compilación de los subsistemas de ns‑3 más utilizados. Si eres nuevo en Git, los términos "fork" y "clonación" pueden no ser familiares; si es así, te recomendamos simplemente clonar (crear tu propia copia) el repositorio que se encuentra en GitLab.com de la siguiente manera:

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

En este punto, ves tu directorio ns‑3-allinone es un poco diferente del directorio de archivo de lanzamiento descrito anteriormente. Debe verse aproximadamente así:

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

Tenga en cuenta la existencia del script download.py, que extraerá ns‑3 y el código fuente asociado. Aquí tiene dos opciones: o bien descargar el último snapshot de desarrollo de ns‑3:

$ python download.py

o preferir la versión de ns‑3, utilizando el flag -n para especificar el número de lanzamiento:

$ python download.py -n ns-3.29

Después de este paso, se descargarán repositorios adicionales en el directorio ns‑3-allinone ns‑3 bake, pybindgen, netanim y En una máquina con Ubuntu 16.04 limpio, tuve que modificar el comando a lo siguiente:.

Nota
$ sudo python3 download.py -n ns-3.29 (aquí y en adelante, notas del traductor). Los dos métodos mencionados anteriormente (archivo de origen o repositorio

3.3.1 Descarga de ns-3 con Bake

a través de Git) son útiles para obtener la instalación más simple de ns‑3 con algunos complementos ( ns‑3-allinone para generar enlaces de Python ynetanim para la animación de la red). El tercer repositorio, proporcionado por defecto en ns‑3-allinone, se llama En una máquina con Ubuntu 16.04 limpio, tuve que modificar el comando a lo siguiente: Bake pybindgen.

— es una herramienta para la construcción coordinada de software de múltiples repositorios, diseñada para el proyecto ns‑3. se puede utilizar para obtener versiones de desarrollo de ns‑3, así como para descargar y construir extensiones de la versión básica de la distribución ns‑3, como el entorno — es una herramienta para la construcción coordinada de software de múltiples repositorios, diseñada para el proyecto ns‑3. Direct Code Execution CradleNetwork Simulation Cradle, , la capacidad de crear nuevos enlaces de Python y diversas "aplicaciones" de ns‑3.CradleNetwork Simulation Cradle es un marco que permite usar pilas de red TCP/IP reales dentro del simulador de red.

Nota
Si considera que su instalación de ns‑3 debería tener características ampliadas o adicionales, puede seguir este camino de instalación.

En las últimas versiones de ns‑3

se ha añadido al lanzamiento tar. La versión incluye un archivo de configuración que permite descargar versiones de software actuales al momento de la creación del lanzamiento. Es decir, por ejemplo, la versión — es una herramienta para la construcción coordinada de software de múltiples repositorios, diseñada para el proyecto ns‑3. , que se distribuye con el lanzamiento ns‑3.29, puede utilizarse para obtener componentes para este lanzamiento de ns‑3 o anteriores, pero no puede utilizarse para extraer componentes para lanzamientos posteriores (si el archivo de descripción del paquete — es una herramienta para la construcción coordinada de software de múltiples repositorios, diseñada para el proyecto ns‑3.bakeconf.xml no se ha actualizado). También puede obtener la copia más reciente

, introduciendo el siguiente comando en su consola de Linux (suponiendo que tenga Git instalado): pybindgen, introduciendo el siguiente comando en tu consola de Linux (si tienes Git instalado):

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

Al ejecutar el comando git, deberías ver algo como lo siguiente:

Clonando en 'bake'...
remoto: Enumerando objetos: 2086, listo. 
remoto: Contando objetos: 100% (2086/2086), listo. 
remoto: Comprimiendo objetos: 100% (649/649), listo. 
remoto: Total 2086 (delta 1404), reutilizado 2078 (delta 1399) 
Recibiendo objetos: 100% (2086/2086), 2.68 MiB | 3.82 MiB/s, listo. 
Resolviendo deltas: 100% (1404/1404), listo.

Una vez que se complete el comando clone deberías tener un directorio llamado pybindgen, cuyo contenido debería verse aproximadamente así:

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

Ten en cuenta que has descargado varios scripts de Python, un módulo de Python llamado pybindgen y un archivo de configuración XML. El siguiente paso será utilizar estos scripts para descargar y compilar la distribución de ns‑3 de tu elección. Hay varias metas de configuración disponibles:

  1. ns‑3.29: módulo correspondiente a la versión lanzada; descargará componentes que son similares a la versión en tarball;

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

  3. ns-allinone-3.29: módulo que incluye otras funciones adicionales, tales como el enrutamiento Click y la Cuna de Simulación de Redes, Openflow para ns-3.

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

Nota
Click — arquitectura de software modular para crear enrutadores.

Openflow es un protocolo de control del proceso de manejo de datos que viajan a través de la red de datos enrutada por enrutadores y conmutadores, implementando tecnología de red programable y configurable.

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

Los desarrolladores intentan mantener estos repositorios en un estado de trabajo coherente, pero están en la fase de desarrollo y contienen código no liberado, así que si no planeas usar nuevas funciones, elige la versión oficial.

Puedes encontrar la última versión del código revisando la lista de repositorios, o visitando la página web de 'ns‑3 Releases':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 necesarios de ns‑3, aplicaremos la herramienta — es una herramienta para la construcción coordinada de software de múltiples repositorios, diseñada para el proyecto ns‑3.. Digamos algunas palabras introductorias sobre el funcionamiento de — es una herramienta para la construcción coordinada de software de múltiples repositorios, diseñada para el proyecto ns‑3..

Bake trabaja descargando las fuentes de paquetes en el directorio source y instalando bibliotecas en el directorio de construcción. — es una herramienta para la construcción coordinada de software de múltiples repositorios, diseñada para el proyecto ns‑3. se puede ejecutar refiriéndose al archivo binario, pero si deseas ejecutarlo — es una herramienta para la construcción coordinada de software de múltiples repositorios, diseñada para el proyecto ns‑3. no desde el directorio al que fue subido, es recomendable agregar la ruta a pybindgen tu ruta (variable de entorno PATH), por ejemplo, de la siguiente manera (ejemplo para la terminal de Linux bash). Ve al directorio "bake" y luego establece 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 bake.py en la ruta de la terminal y permitirá que otros programas encuentren los archivos ejecutables y bibliotecas que creó pybindgen. En algunos casos de uso pybindgen, la configuración de PATH y PYTHONPATH mencionada anteriormente no es necesaria, pero para la compilación completa de ns‑3-allinone (con paquetes adicionales) generalmente es necesaria.

Ve a tu directorio de trabajo e ingresa lo siguiente en la consola:

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

A continuación, se nos pedirá — es una herramienta para la construcción coordinada de software de múltiples repositorios, diseñada para el proyecto ns‑3. que verifiquemos si contamos con las herramientas adecuadas para descargar varios componentes. Escribe:

$ ./bake.py check

Deberías ver algo como lo siguiente:

> Python - OK 
> Compilador GNU C++ - OK 
> Mercurial - OK 
> Git - OK 
> Herramienta Tar - OK 
> Herramienta Unzip - OK 
> Make - OK 
> cMake - OK 
> Herramienta patch - OK 
> Ruta buscada para herramientas: /usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin ...

En particular, herramientas de descarga como Mercurial, CVS, Git y Bazaar son fundamentales en este paso, ya que nos permiten obtener el código. En esta etapa, instala las herramientas faltantes de la manera habitual para tu sistema (si sabes cómo hacerlo) o pide ayuda a tu administrador del sistema.

A continuación, intenta descargar el software:

$ ./bake.py download

el resultado debería ser algo como:

>> Buscando dependencia del sistema setuptools - OK 
>> Buscando dependencia del sistema libgoocanvas2 - OK 
>> Buscando dependencia del sistema gi-cairo - OK 
>> Buscando dependencia del sistema pygobject - OK 
>> Buscando dependencia del sistema pygraphviz - OK 
>> Buscando dependencia del sistema python-dev - OK 
>> Buscando dependencia del sistema qt - OK 
>> Buscando dependencia del sistema g++ - OK 
>> Descargando pybindgen-0.19.0.post4+ng823d8b2 (directorio objetivo: pybindgen) - OK 
>> Descargando netanim-3.108 - OK 
>> Descargando ns-3.29 - OK

Esto significa que se han descargado tres fuentes. Ahora ve al directorio source y escribe ls; deberías ver:

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

Ahora estás listo para compilar el paquete ns‑3.

3.4 Compilación de ns-3

Al igual que con la descarga de ns‑3, hay varias formas de compilar ns‑3. Principalmente, queremos enfatizar que ns‑3 se compila usando una herramienta de construcción llamada Waf, que se describe a continuación. La mayoría de los usuarios trabajarán con Waf, pero hay varios scripts útiles que pueden ayudarle a comenzar o a organizar compilaciones más complejas. Por lo tanto, por favor, antes de leer sobre Waf, echa un vistazo a build.py y la compilación con pybindgen.

3.4.1 Compilación utilizando build.py

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

Al trabajar con el archivo de lanzamiento tarball, en ns‑3‑allinone hay un script conveniente que puede simplificar la compilación de componentes. Se llama build.py. Este programa configurará el proyecto para usted de la manera más útil posible. Sin embargo, tenga en cuenta que configuraciones más complejas y el trabajo con ns‑3 generalmente implican el uso del propio sistema de construcción de ns‑3, Waf, que se presentará más adelante en esta guía.

Si ha descargado usando tarball, entonces en su directorio ~\/workspace debería aparecer un directorio llamado algo como ns-allinone-3.29. Ingrese lo siguiente:

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

Al invocar build.py hemos aplicado argumentos de línea de comandos para compilar los ejemplos y pruebas utilizados en esta guía, que por defecto no se compilan en ns‑3. De forma predeterminada, el programa también compila todos los módulos disponibles. Luego, si lo desea, puede compilar ns‑3 sin ejemplos y pruebas o excluir módulos que no sean necesarios para su trabajo.

Verá muchos mensajes del compilador que son mostrados por el script al compilar varias partes que ha descargado. Primero, el script intentará compilar el animador En una máquina con Ubuntu 16.04 limpio, tuve que modificar el comando a lo siguiente:, luego el generador de enlaces netanim y, finalmente, ns‑3. Al finalizar el proceso, debe ver lo siguiente:

Waf: Saliendo del directorio '\/path\/to\/workspace\/ns-allinone-3.29\/ns-3.29\/build'\n'build' finalizó con éxito (6m25.032s) \n\nMódulos construidos:\nantenna                aodv                     applications\nbridge                 buildings                config-store\ncore                   csma                     csma-layout\ndsdv                   dsr                      energía \nfd-net-device          flow-monitor             internet\ninternet-apps          lr-wpan                  lte\nmesh                   movilidad                mpi\nnetanim (sin Python)   red                      enrutamiento de vector nix \nolsr                   punto a punto           diseño de punto a punto \npropagación            sixlowpan                espectro \nstats                  tap-bridge               prueba (sin Python) \ntopología-leer          control de tráfico        uan \nvirtual-net-device     visualizador            onda \nwifi                   wimax \n\nMódulos no construidos (consulte el tutorial de ns-3 para explicaciones):\nbrite                  click                    openflow \nSaliendo del directorio .\/ns-3.29

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

Módulos no construidos (consulte el tutorial de ns-3 para explicaciones):\nbrite                     click

Esto simplemente significa que algunos módulos de ns-3, que dependen de bibliotecas externas, pueden no haberse compilado, o que para esta configuración no se requiere su compilación. No significa que el simulador no se haya compilado o que los módulos compilados no funcionen correctamente.

3.4.2 Compilación con Bake

Si utilizaste bake para obtener el código fuente de los repositorios del proyecto anteriormente, puedes continuar usándolo para compilar ns-3. Escribe:

$ ./bake.py build

y deberías ver algo como:

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

Sugerencia: también puedes realizar ambos pasos, la descarga y la compilación, invocando 'bake.py deploy'.

Es posible que ocurran fallos al compilar todos los componentes, pero la compilación continuará si el componente no es obligatorio. Por ejemplo, un problema reciente con la portabilidad fue que castxml puede ser compilado por la herramienta pybindgen no en todas las plataformas. En este caso, aparecerá un mensaje como:

>> Construyendo castxml - Problema 
> Problema: Dependencia opcional, el módulo "castxml" falló. Esto puede reducir la funcionalidad de la compilación final. Sin embargo, bake continuará ya que "castxml" no es una dependencia esencial. Para más información, llama a bake con -v o -vvv, para el modo verbose completo.

Sin embargo castxml solo es necesario si deseas crear enlaces de Python actualizados. Para la mayoría de los usuarios, esto no es necesario (al menos hasta que comiencen a modificar ns-3), por lo que tales advertencias se pueden ignorar con seguridad por ahora.

Si ocurre un fallo, el siguiente comando te dará una pista sobre dependencias faltantes:

$ ./bake.py show

Se enumerarán varias dependencias de paquetes que intentas compilar.

3.4.3 Compilación con Waf

Hasta este momento, para comenzar la compilación de ns-3, hemos utilizado ya sea un script build.py, o la herramienta pybindgen. Estas herramientas son útiles para compilar ns-3 y administrar bibliotecas. De hecho, para la compilación, ejecutan la herramienta de compilación Waf desde el directorio ns-3. Waf se instala junto con el código fuente de ns-3. La mayoría de los usuarios para configurar y compilar ns-3 rápidamente pasan a utilizar directamente Waf. Así que, para continuar, por favor, dirígete al directorio ns-3 que creaste originalmente.

En este momento no es estrictamente necesario, pero sería útil hacer un pequeño desvío y ver cómo hacer cambios en la configuración del proyecto. Probablemente, el cambio de configuración más útil que puedes hacer será crear una versión optimizada del código. Por defecto, has configurado tu proyecto para compilar una versión de depuración. Vamos a ver el proyecto para crear una compilación optimizada. Para explicarle a Waf que debe realizar compilaciones optimizadas que incluyan ejemplos y pruebas, necesitarás ejecutar los siguientes comandos:

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

Esto iniciará Waf fuera del directorio local (para tu conveniencia). El primer comando realiza la limpieza de una compilación anterior, no es estrictamente necesario, pero es una buena práctica (también consulta los perfiles de compilación a continuación); esto eliminará las bibliotecas y archivos objeto previamente creados que se encuentran en el directorio build\/. Una vez que el proyecto se haya reconfigurado y el sistema de compilación verifique las diversas dependencias, deberías ver una salida similar a la siguiente:

Configurando la ruta superior a      : /home/ns3user/workspace/bake/source/ns-3-dev
Configurando la salida a      : /home/ns3user/workspace/bake/source/ns-3-dev/build
Verificando 'gcc' (compilador C)        : /usr/bin/gcc 
Verificando la versión de cc                : 7.3.0 
Verificando 'g++' (compilador C++)      : /usr/bin/g++ 
Verificando soporte para la bandera de compilación -march=native : ok 
Verificando soporte para la bandera de compilación -Wl,--soname=foo : ok 
Verificando soporte para la bandera de compilación -std=c++11       : ok 
Verificando las inclusiones de boost   : encabezados no encontrados, por favor, proporciona un argumento --boost-includes (ver ayuda) 
Verificando las inclusiones de boost   : encabezados no encontrados, por favor, proporciona un argumento --boost-includes (ver ayuda) 
Verificando el programa 'python'            : /usr/bin/python 
Verificando la versión de python >= 2.3       : 2.7.15 python-config                                                                     : /usr/bin/python-config
Solicitando a python-config las banderas pyembed '--cflags --libs --ldflags' : yes
Probando la configuración de pyembed                                      : yes
Solicitando a python-config las banderas pyext '--cflags --libs --ldflags'   : yes
Probando la configuración de pyext                                        : yes

Verificando soporte para la bandera de compilación -fvisibility=hidden          : ok 
Verificando soporte para la bandera de compilación -Wno-array-bounds            : ok 
Verificando la ubicación de pybindgen          : ../pybindgen ,!(adivinado) 
Verificando el módulo de python 'pybindgen'   : 0.19.0. ,!post4+g823d8b2 
Verificando la versión de pybindgen           : 0.19.0. ,!post4+g823d8b2 
Verificando el fragmento de código                : yes 
Verificando la equivalencia de tipos uint64_t y unsigned long : no 
Verificando el fragmento de código                                 : no 
Verificando la equivalencia de tipos uint64_t y unsigned long long : yes 
Verificando los apidefs que se pueden usar para los enlaces de Python                       : gcc-LP64 
Verificando el cxxabi interno de GCC         : completo 
Verificando el módulo de python 'pygccxml'    : no encontrado 
Verificando la ubicación de click              : no encontrado 
Verificando el programa 'pkg-config'        : /usr/bin/pkg- ,!config 
Verificando 'gtk+-3.0'                  : no encontrado 
Verificando 'libxml-2.0'                : yes 
verificando uint128_t                   : no encontrado 
verificando __uint128_t                 : yes 
Verificando implementación de alta precisión   : entero de 128 bits ,!(predeterminado) 
Verificando encabezado stdint.h             : yes 
Verificando encabezado inttypes.h           : yes 
Verificando encabezado sys/inttypes.h       : no encontrado 
Verificando encabezado sys/types.h          : yes 
Verificando encabezado sys/stat.h           : yes 
Verificando encabezado dirent.h             : yes 
Verificando encabezado stdlib.h             : yes 
Verificando encabezado signal.h             : yes 
Verificando encabezado pthread.h            : yes 
Verificando encabezado stdint.h             : yes 
Verificando encabezado inttypes.h           : yes 
Verificando encabezado sys/inttypes.h       : no encontrado
Verificando la biblioteca rt                  : yes 
Verificando el encabezado sys/ioctl.h          : yes 
Verificando el encabezado net/if.h             : yes 
Verificando el encabezado net/ethernet.h       : yes 
Verificando el encabezado linux/if_tun.h       : yes 
Verificando el encabezado netpacket/packet.h   : yes 
Verificando la ubicación de NSC                : no encontrado 
Verificando 'sqlite3'                   : no encontrado 
Verificando el encabezado linux/if_tun.h       : yes 
Verificando el módulo de python 'gi'          : 3.26.1 
Verificando el módulo de python 'gi.repository.GObject'      : ok 
Verificando el módulo de python 'cairo'                      : ok 
Verificando el módulo de python 'pygraphviz'                 : 1.4rc1 
Verificando el módulo de python 'gi.repository.Gtk'          : ok 
Verificando el módulo de python 'gi.repository.Gdk'          : ok 
Verificando el módulo de python 'gi.repository.Pango'        : ok 
Verificando el módulo de python 'gi.repository.GooCanvas'    : ok 
Verificando el programa 'sudo'                             : /usr/bin/sudo 
Verificando el programa 'valgrind'                         : no encontrado 
Verificando 'gsl' : no encontrado python-config            : no encontrado 
Verificando soporte para la bandera de compilación -fstrict-aliasing : ok 
Verificando soporte para la bandera de compilación -fstrict-aliasing : ok 
Verificando soporte para la bandera de compilación -Wstrict-aliasing : ok 
Verificando soporte para la bandera de compilación -Wstrict-aliasing : ok 
Verificando el programa 'doxygen'                          : /usr/bin/doxygen
---- Resumen de las características opcionales de ns-3:
Perfil de construcción : optimizado
Directorio de construcción : 
Integración de BRITE : no habilitada (BRITE no habilitada (ver opción --with- ,!brite)) 
Colección de eventos de métricas DES : no habilitada (predeterminado a deshabilitado) 
Emulación FdNetDevice        : habilitada 
Ejemplos                     : habilitados 
Dispositivo NetDevice de descriptor de archivos    : habilitado 
Biblioteca Científica GNU (GSL) : no habilitada (GSL no encontrado) 
Biblioteca Gcrypt               : no habilitada
(libgcrypt no encontrado: puedes usar ,!libgcrypt-config para encontrar su ubicación.) GtkConfigStore               : no habilitada (biblioteca 'gtk+-3.0 >= 3.0' no encontrada)
Soporte MPI                  : no habilitado (opción --enable-mpi no seleccionada)
Integración de ns-3 Click       : no habilitada (nsclick no habilitado (ver opción --with- ,!nsclick))
Integración de ns-3 OpenFlow   : no habilitada (No se encontraron bibliotecas de boost requeridas) 
Cuna de Simulación de Redes    : no habilitada (NSC no encontrado (ver opción --with-nsc))
Dispositivo FdNet de PlanetLab         : no habilitada (sistema operativo PlanetLab no detectado ,!(ver opción --force-planetlab)) PyViz visualizer : habilitado 
Soporte de escaneo de API de Python   : no habilitado (falta el módulo de Python 'pygccxml')
Enlaces de Python : habilitados 
Simulador en Tiempo Real           : habilitado 
Salida de datos de estadísticas SQlite      : no habilitada (biblioteca 'sqlite3' no encontrada)
Puente Tap                    : habilitado 
Dispositivo FdNet Tap               : habilitado
Pruebas                         : habilitadas 
Primitivas de Hilos          : habilitadas 
Usa sudo para establecer el bit suid   : no habilitado (opción --enable-sudo no seleccionada)
XmlIo                         : habilitado
'configure' finalizado con éxito (6.387s)

Preste atención a la última parte del listado anterior. Algunas opciones de ns-3 no están habilitadas por defecto o requieren soporte del sistema para funcionar correctamente. Por ejemplo, para habilitar XmlTo, debe estar presente la biblioteca libxml-2.0. Si esta biblioteca no se encuentra y la función correspondiente de ns-3 no está habilitada, se mostrará un mensaje. También tenga en cuenta que es posible usar el comando sudo para establecer el bit suid "instalación de ID de grupo en tiempo de ejecución" en ciertos programas. Este bit no está habilitado por defecto, por lo que esta función se muestra como "no habilitada". Finalmente, para obtener una lista de las opciones habilitadas, utilice Waf con el parámetro --check-config.

Ahora volvamos y cambiemos de nuevo a la construcción de depuración que contiene ejemplos y pruebas.

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

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

$ .\/waf

Aunque los pasos descritos anteriormente le hayan llevado a compilar una parte del sistema ns-3 dos veces, ahora sabe cómo cambiar la configuración y construir código optimizado.

Para verificar qué perfil está activo para la configuración del proyecto actual, existe un comando:

$ .\/waf --check-profile 
Waf: Entrando en el directorio `\/path\/to\/ns-3-allinone\/ns-3.29\/build' 
Perfil de construcción: debug

El escenario discutido anteriormente build.py también soporta los argumentos --enable-examples y --enable-tests, pero no soporta directamente otras opciones. Por ejemplo, esto no funcionará: Waf $ .\/build.py --disable-python

la reacción será la siguiente:

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

Sin embargo, el operador especial - - puede usarse para pasar parámetros adicionales a través de

waf , por lo que en vez de lo anterior, el siguiente comando funcionará:$ .\/build.py -- --disable-python

ya que genera el comando básico

.\/waf configure —disable-python . Aquí hay algunos consejos adicionales sobreManejo de errores de construcción Waf.

Manejo de errores de compilación

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

Por ejemplo, anteriormente hubo un lanzamiento de ns-3.28 para Fedora 28, que incluía una nueva versión mayor. gcc (gcc-8). La construcción del lanzamiento ns-3.28 o versiones anteriores en Fedora 28, con Gtk2+ instalado, dará lugar a un error como el siguiente:

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

En los lanzamientos a partir de ns-3.28.1, hay Waf una opción disponible para resolver estos problemas. Desactiva la instalación de la bandera «-Werror» en g++ y clang++. Esta opción es «—disable-werror», que debe aplicarse al configurar:

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

Configurar o construir

Algunos comandos Waf solo son relevantes en la fase de configuración, mientras que otros solo funcionan en la fase de construcción. Por ejemplo, si deseas utilizar las funciones de emulación de ns-3, puedes habilitar el bit suid usando sudo, como se describe anteriormente. Esto cancelará los comandos de la fase de configuración, y así podrás 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 se ejecutará sudo, para modificar los programas de creación de sockets de código de emulación para ejecutarse con privilegios root. Hay Waf varias otras opciones disponibles para las fases de configuración y construcción. Para explorar las opciones, introduce:

$ ./waf --help

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

Perfiles de construcción

Ya hemos visto cómo configurar Waf para construcciones debug y optimized:

$ ./waf --build-profile=debug

También hay un perfil de construcción intermedio, release. La opción -d es sinónimo de --build-profile. El perfil de construcción gestiona el uso de registro, afirmaciones y claves de optimización del compilador:

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

Como se puede ver, el registro y las afirmaciones están disponibles solo en las 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 la versión optimizada de la compilación.

Si tiene código que debe ejecutarse solo en ciertos perfiles de compilación, utilice el macro Code Wrapper Macro:

NS_BUILD_DEBUG (std::cout << "Parte de una línea de salida..." << std::flush; timer.Start, !()); DoLongInvolvedComputation();
NS_BUILD_DEBUG (timer.Stop(); std::cout << "Hecho: " << timer << std::endl;)

Por defecto, Waf coloca los artefactos de la compilación en el directorio de compilación. Puede especificar otro directorio de salida utilizando la opción - -out, por ejemplo:

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

Al combinar esto con los perfiles de compilación, puede alternar 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 compilaciones sin tener que sobrescribir cada vez la última compilación. Cuando cambie a otro perfil, Waf solo compilará ese, sin recompilar completamente todo.

Cuando cambia de este modo entre perfiles de compilación, es necesario asegurarse de proporcionar siempre los mismos parámetros de configuración. 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 utiliza el compilador C++ de GCC ( g++). Sin embargo, se puede cambiar el compilador C++ utilizado, definiendo la variable de entorno CXX. Por ejemplo, para usar el compilador C++ Clang, clang++, Waf $ CXX="clang++" ./waf configure $ ./waf build

De manera similar, se puede configurar 

para utilizar compilación distribuida con Waf distcc $ CXX="distcc g++" ./waf configure $ ./waf build:

Para obtener más información sobre distcc y la compilación distribuida, consulte la página del proyecto en la sección "Documentación". Para agregar banderas de compilador al configurar ns-3, utilice la variable de entorno CXXFLAGS_EXTRA.

Más información sobre distcc y la compilación distribuida se puede encontrar en la página del proyecto en la sección 'Documentación'. Para agregar banderas de compilador al configurar ns‑3, utiliza la variable de entorno CXXFLAGS_EXTRA.

Instalación

Waf puede utilizarse para instalar bibliotecas en diferentes lugares del sistema. Por defecto, las bibliotecas compiladas y los archivos ejecutables se encuentran en el directorio build, y dado que Waf conoce la ubicación de estas bibliotecas y archivos ejecutables, no es necesario instalar las bibliotecas en ningún otro lugar.

Si los usuarios prefieren la instalación fuera del directorio de construcción, pueden ejecutar el comando ./waf install. Por defecto, el prefijo para la instalación es /usr/local, por lo tanto ./waf install instalará programas en /usr/local/bin, bibliotecas en /usr/local/lib y archivos de encabezado en /usr/local/include. Por lo general, se requiere permisos de superusuario para instalarse con el prefijo por defecto, así que el comando típico será sudo ./waf install. Al ejecutarse, Waf primero preferirá usar las bibliotecas compartidas en el directorio de construcción, luego buscará bibliotecas en la ruta a las bibliotecas configuradas en el entorno local. Así que al instalar bibliotecas en el sistema, es una buena práctica verificar que se estén utilizando las bibliotecas correctas. Los usuarios pueden elegir instalar con un prefijo diferente, pasando durante la configuración la opción --prefix, por ejemplo:

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

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

Comando ./waf clean debe utilizarse antes de reconfigurar el proyecto, si la instalación se va a realizar Waf bajo otro prefijo.

Por lo tanto, no es necesario invocar ./waf installpara usar ns‑3. La mayoría de los usuarios no necesitarán este comando, ya que Waf capturará las bibliotecas actuales del directorio de construcción, pero algunos usuarios pueden encontrarlo útil si su actividad implica trabajar con programas fuera del directorio ns‑3.

Waf es un único

En el nivel superior del árbol de código fuente de ns‑3, solo hay un script de Waf. Al comenzar a trabajar, pasarás mucho tiempo en el directorio scratch/ o más profundo, ensrc/... y necesitarás ejecutar Waf. Simplemente puedes recordar dónde estás y ejecutar Waf de la siguiente manera:

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

pero esto será tedioso y propenso a errores, así que hay mejores soluciones. Una de las formas comunes es usar un editor de texto, como emacs o vim, donde se abren dos sesiones de terminal, una se utiliza para construir ns‑3 y la otra para editar el código fuente. Si solo tienes tarball, puede ayudar la variable de entorno:

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

$ cd scratch 
$ waff build

Puede parecer tentador agregar un script trivial de waf en el directorio del módulo, siguiendo el ejemplo exec ..\/..\/waf. Por favor, no lo haga. Esto confunde a los principiantes y puede llevar a errores de construcción difíciles de detectar si se ejecuta incorrectamente. Las soluciones mostradas anteriormente son el camino a seguir.

3.5 Pruebas de ns-3

Puede realizar pruebas modulares de la distribución ns‑3 ejecutando el script .\/test.py:

$ .\/test.py

Estas pruebas se ejecutan en paralelo con Waf. Al final, debe ver un mensaje que diga que

92 de 92 pruebas pasaron (92 pasaron, 0 fallaron, 0 se bloquearon, 0 errores de valgrind)

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

También verá un resumen final de Waf y un probador que ejecuta cada prueba, que se verá aproximadamente así:

Waf: Entrando en el directorio `\/path\/to\/workspace\/ns-3-allinone\/ns-3-dev\/build' 
Waf: Saliendo del directorio `\/path\/to\/workspace\/ns-3-allinone\/ns-3-dev\/build' 
'build' finalizado con éxito (1.799s) 

Módulos construidos:
aodv           aplicaciones          puente
click          almacén de configuración          núcleo
csma           diseño csma           dsdv
emu            energía                monitor de flujo
internet       lte                   malla
movilidad      mpi                   netanim
red           enrutamiento de vector nix    ns3tcp
ns3wifi        olsr                  openflow
punto-a-punto diseño de punto-a-punto propagación
espectro       estadísticas                 tap-bridge
template       prueba                  herramientas
diseño de topología  uan                   dispositivo de red virtual
visualizador     wifi                  wimax

PASO: TestSuite ns3-wifi-interference
PASO: TestSuite histograma 

...

PASO: TestSuite objeto
PASO: TestSuite generadores-de-números-aleatorios
92 de 92 pruebas pasaron (92 pasaron, 0 fallaron, 0 se bloquearon, 0 errores de valgrind)

Este comando generalmente lo ejecutan los usuarios para verificar rápidamente la validez de la construcción de la distribución ns‑3. (Tenga en cuenta que el orden de las líneas «PASO: ...» puede variar, lo cual es normal. Lo importante es que en la línea final del informe todas las pruebas fueron superadas; ninguna prueba falló o se bloqueó.) Y Wafcomo test.py paralelizarán el trabajo en los núcleos de CPU disponibles de la máquina.

3.6 Ejecución del script

Normalmente ejecutamos scripts bajo el control de Waf. Esto permite al sistema de construcción asegurarse de que las rutas a la biblioteca compartida estén configuradas correctamente y que las bibliotecas estén disponibles durante la ejecución. Para ejecutar el programa, simplemente use Waf con el parámetro - -run. Ejecutaremos para ns‑3 el equivalente de la omnipresente programa hello world, escribiendo lo siguiente:

$ .\/waf --run hello-simulator

Waf primero verificará que el programa esté correctamente compilado y, si es necesario, realizará la compilación. Luego Waf ejecutará el programa que producirá la siguiente salida.

Hola Simulador

¡Felicidades! Ahora eres un usuario de ns‑3.

¿Qué debo hacer si no veo el resultado?

Si ves mensajes Waf, que indican que la compilación se completó con éxito, pero no ves la salida «Hola Simulador», entonces es probable que en la sección [Compilación-con-Waf] hayas cambiado tu modo de compilación a optimized, pero omitiste volver a cambiarlo a debug. Toda la salida de la consola utilizada en esta guía emplea un componente especial de ns‑3 que realiza el registro de logs y se utiliza para imprimir mensajes personalizados en la consola. La salida de este componente está automáticamente deshabilitada al compilar código optimizado — está “optimizando”. Si no ves la salida “Hola Simulador”, ingresa lo siguiente:

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

para configurar Waf la compilación de versiones de depuración de programas ns‑3 que incluyen ejemplos y pruebas. Luego deberás recompilar 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 línea de comandos

Para pasar argumentos de línea de comandos al programa ns‑3, utiliza la siguiente plantilla:

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

Reemplaza con el nombre de tu programa y con los argumentos. El argumento - -command-template para Waf es esencialmente una receta para construir la línea de comandos real Waf que se utiliza para ejecutar el programa. Waf verifica que la compilación se haya completado, establece caminos a la biblioteca compartida, luego, utilizando la plantilla de línea de comandos proporcionada y sustituyendo el nombre del programa en lugar del marcador %s, llama al archivo ejecutable. Si te parece complicado ese sintaxis, hay una opción más simple que incluye el programa ns‑3 y sus argumentos entre comillas simples:

$ ./waf --run ' --arg1=value1 --arg2=value2 ...'

Otro ejemplo especialmente útil es el lanzamiento selectivo de conjuntos de pruebas. Supongamos que hay un conjunto de pruebas (suite) mytest (en realidad, no existe). Anteriormente utilizamos el script ./test.py para ejecutar en paralelo una serie de pruebas, que llama repetidamente al programa de pruebas test-runner. Llamada test-runner directamente para ejecutar una prueba:

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

Los argumentos se pasarán al programa test-runner. Dado que mytest no existe, se generará un mensaje de error. Para imprimir los parámetros disponibles de test-runner, ingresa:

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

3.6.2 Depuración

Para ejecutar programas de ns-3 bajo otra utilidad, como un depurador (por ejemplo, gdb) o una herramienta de verificación de memoria (por ejemplo, valgrind), utiliza una forma similar - -command-template = "…". Por ejemplo, para ejecutar en el depurador gdb tu programa hello-simulator de ns-3 con argumentos:

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

Ten en cuenta que el nombre del programa ns-3 viene con el argumento - -run, y la utilidad de gestión (aquí gdb) es el primer token en el argumento - -command-template. La opción - --args informa gdb, que el resto de la línea de comandos pertenece al 'programa inferior'. (Algunas versiones gdb no entienden la opción - --args. En este caso, elimina los argumentos del programa de - -command-template y utiliza el conjunto de comandos gdb args.) Podemos combinar esta receta y la anterior para ejecutar una prueba bajo el depurador:

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

3.6.3 Directorio de trabajo

Waf debe ejecutarse desde su ubicación en la parte superior del árbol de ns-3. Esta carpeta se convierte en el directorio de trabajo, donde se escribirán los archivos de salida. Pero, ¿qué hacer si deseas mantener esos archivos fuera del árbol de código fuente de ns-3? Utiliza el argumento - -cwd:

$ ./waf --cwd=...

Quizás prefieras obtener los archivos de salida en tu directorio de trabajo. En este caso, puede ayudar una acción indirecta como esta:

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

Este decorado de la versión anterior del comando conserva el directorio de trabajo actual, cambia al directorio Waf, y luego instruye Waf para cambiar el directorio de trabajo de nuevo al guardado antes de ejecutar el programa actual en el directorio de trabajo. Mencionamos el comando - -cwd por completitud, la mayoría de los usuarios simplemente ejecutan Waf desde el directorio superior y allí generan los archivos de salida.

Continuación: capítulo 4

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster