
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: .
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: , 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.pyAhora 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 . 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.pyTenga 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.pyo preferir la versión de ns‑3, utilizando el flag -n para especificar el número de lanzamiento:
$ python download.py -n ns-3.29Despué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.gitAl 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 TODOTen 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:
ns‑3.29: módulo correspondiente a la versión lanzada; descargará componentes que son similares a la versión en tarball;
ns‑3-dev: módulo similar, pero utilizando código del árbol de desarrollo;
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.
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:.
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': 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/libEsto 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.29A 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 checkDeberí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 downloadel 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 - OKEsto 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 pybindgenAhora 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.29En 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 clickEsto 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 buildy deberías ver algo como:
>> Construyendo pybindgen-0.19.0.post4+ng823d8b2 - OK
>> Construyendo netanim-3.108 - OK
>> Construyendo ns-3.29 - OKSugerencia: 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 showSe 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-testsEsto 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-testsEl sistema de construcción está ahora configurado, y puede compilar las versiones de depuración de los programas ns-3 simplemente escribiendo:
$ .\/wafAunque 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: debugEl 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 dewaf , 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-testsConfigurar 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-testsSi 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 --helpEn 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=debugTambié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:

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-dirAl 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 buildCompiladores 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/localSi 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 buildPuede 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.pyEstas 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-simulatorWaf 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-testspara 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
$ .\/wafAhora, 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.
Fuente: habr.com
