Tutoriel du simulateur de réseau ns-3. chapitre 3

Tutoriel du simulateur de réseau ns-3. chapitre 3
chapitre 1,2

3 Pour commencer
3.1. Vue d'ensemble
3.2 Conditions préalables
3.2.1 Téléchargement de la version ns-3 en tant qu'archive source
3.3 Téléchargement de NS-3 à l'aide de Git
3.3.1 Chargement de NS-3 à l'aide de Bake
3.4 Assemblage ns-3
3.4.1 Construire avec build.py
3.4.2 Construire avec Bake
3.4.3 Construire avec Waf
3.5 Test de NS-3
3.6 Exécuter le script
3.6.1 Arguments de ligne de commande
3.6.2 Débogage
3.6.3 Répertoire de travail

Chapitre 3

Commencer

Ce chapitre est destiné à préparer le lecteur à démarrer avec un ordinateur sur lequel NS-3 n'a peut-être jamais été installé. Il couvre les plates-formes prises en charge, les prérequis, comment obtenir ns-3, comment construire ns-3 et comment tester votre build et exécuter des programmes simples.

3.1. Vue d'ensemble

Le simulateur ns-3 est construit comme un système de bibliothèques logicielles collaboratives. Lors de l'assemblage, le code des programmes utilisateur est lié à ces bibliothèques. Les langages de programmation C++ ou Python sont utilisés pour écrire des programmes personnalisés.

Ns-3 est distribué sous forme de code source, ce qui signifie que le système cible doit disposer d'un environnement de développement logiciel afin de construire d'abord les bibliothèques, puis de créer le programme utilisateur. En principe, ns-3 pourrait être distribué sous forme de bibliothèques prêtes à l'emploi pour un système spécifique, et à l'avenir, elles pourraient être distribuées de cette manière. Mais de nos jours, de nombreux utilisateurs font leur travail en éditant ns-3 lui-même, il est donc utile d'avoir le code source pour construire les bibliothèques. Si quelqu'un souhaite se charger du travail de création de bibliothèques et de packages prêts à l'emploi pour les systèmes d'exploitation, veuillez contacter la liste de diffusion ns-développeurs.

Ensuite, nous examinerons trois façons de télécharger et de construire ns-3. La première consiste à télécharger et à créer la version officielle à partir du site principal. La seconde est la sélection et l'assemblage de copies des versions de développement de l'installation de base de NS-3. La troisième consiste à utiliser des outils de construction supplémentaires pour charger plus d'extensions pour ns-3. Nous allons passer en revue chacun d’eux puisque les outils sont légèrement différents.

Les utilisateurs Linux expérimentés peuvent se demander pourquoi ns-3 n'est pas fourni sous forme de package comme la plupart des autres bibliothèques qui utilisent un gestionnaire de packages ? Bien qu'il existe des paquets binaires pour diverses distributions Linux (par exemple Debian), la plupart des utilisateurs finissent par éditer les bibliothèques et doivent reconstruire ns-3 eux-mêmes, il est donc pratique d'avoir le code source disponible. Pour cette raison, nous nous concentrerons sur l’installation à partir des sources.

Pour la plupart des applications, droits ns-3 racine ne sont pas nécessaires, il est recommandé d'utiliser un compte utilisateur non privilégié.

3.2 Conditions préalables

L'ensemble des bibliothèques ns-3 disponibles possède un certain nombre de dépendances vis-à-vis de bibliothèques tierces, mais pour la plupart, ns-3 peut être construit et utilisé avec la prise en charge de plusieurs composants courants (souvent installés par défaut) : un compilateur C++, Python, un éditeur de code source (par exemple, entrain, emacs ou Eclipse) et, si des référentiels de développement sont utilisés, des systèmes de contrôle de version Git. La plupart des nouveaux utilisateurs n'auront pas à s'inquiéter si leur configuration signale l'absence de certaines fonctionnalités avancées de NS-3, mais pour ceux qui souhaitent une installation complète, le projet fournit un wiki qui comprend des pages contenant de nombreux trucs et astuces utiles. L'une de ces pages est la page Installation, avec les instructions d'installation pour divers systèmes, disponible à l'adresse : https://www.nsnam.org/wiki/Installation.

La section Prérequis de ce wiki explique quels packages sont requis pour prendre en charge les options ns-3 courantes et fournit également les commandes utilisées pour les installer sur les versions courantes de Linux ou macOS.

Vous pouvez profiter de cette opportunité pour explorer la page wiki ns-3 ou le site Web principal : https://www.nsnam.org, car il y a beaucoup d’informations là-bas. À partir de la dernière version de ns-3 (ns-3.29), les outils suivants sont requis pour exécuter ns-3 :

Ensemble/version d'outils

  • Compilateur C++
    clang++ ou g++ (g++ version 4.9 ou supérieure)
  • Python
    version python2 >= 2.7.10 ou version python3 >=3.4
  • Git
    toute dernière version (pour accéder à ns-3 sur GitLab.com)
  • goudron
    toute dernière version (pour décompresser la version ns‑3)
  • bunzip2
    toute dernière version (pour décompresser la version ns‑3)

Pour vérifier la version par défaut de Python, tapez python -V. Pour vérifier la version g++, tapez g++ -v. Si des outils sont manquants ou trop anciens, veuillez vous référer au guide d'installation sur la page wiki ns-3.

À partir de maintenant, nous supposons que le lecteur exécute Linux, MacOS ou un émulateur Linux et dispose au moins des outils ci-dessus.

3.2.1 Téléchargement de la version ns-3 en tant qu'archive source

C'est la marche à suivre pour un nouvel utilisateur qui souhaite télécharger et expérimenter la dernière version et les versions du package de ns-3. Les versions ns-3 sont publiées sous forme d'archives sources compressées, parfois appelées archiver. archiver est un format d'archive logiciel spécial dans lequel plusieurs fichiers sont combinés. L'archive est généralement compressée. Processus de démarrage ns-3 via archiver C'est simple, il vous suffit de sélectionner une version, de la télécharger et de la décompresser.

Supposons que vous, en tant qu'utilisateur, souhaitiez créer ns-3 dans un répertoire local appelé espace de travail. Vous pouvez obtenir une copie de travail de la version en saisissant ce qui suit dans la console Linux (en remplaçant les numéros de version appropriés, bien sûr) :

$ 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 

Faites attention à l'utilitaire utilisé ci-dessus wget, qui est un outil de ligne de commande permettant de télécharger des objets depuis Internet. Si vous ne l'avez pas installé, vous pouvez utiliser votre navigateur pour cela.

En suivant ces étapes, vous arriverez au répertoire ns-allinone-3.29, vous devriez y voir plusieurs fichiers et répertoires.

$ 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

Vous êtes maintenant prêt à créer la distribution de base ns-3 et pouvez passer à la section sur la construction de ns-3.

3.3 Téléchargement de NS-3 à l'aide de Git

Le code ns-3 est disponible dans les dépôts Git sur GitLab.com à l'adresse https://gitlab.com/nsnam/. Groupe nsnam rassemble les différents référentiels utilisés par un projet open source.

Le moyen le plus simple de commencer à utiliser les référentiels Git est de créer ou de cloner l'environnement. ns-3-allinone. Il s'agit d'un ensemble de scripts qui gèrent le chargement et l'assemblage des sous-systèmes ns-3 les plus couramment utilisés. Si vous êtes nouveau sur Git, les termes « fork » et « clone » ne vous sont peut-être pas familiers ; si tel est le cas, nous vous recommandons de simplement cloner (faire votre propre copie) le référentiel situé sur GitLab.com comme ceci :

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

A ce stade, la vue de votre répertoire ns-3-allinone légèrement différent du répertoire d'archive de version décrit ci-dessus. Ça devrait ressembler a quelque chose comme ca:

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

Veuillez noter qu'il existe un script télécharger.py, qui extraira en outre ns-3 et le code source qui l'accompagne. Ici, vous avez le choix : soit télécharger le dernier instantané de développement ns-3 :

$ python download.py

ou préférez la version ns-3 en utilisant le flag -n pour indiquer le numéro de version :

$ python download.py -n ns-3.29

Après cette étape vers le répertoire ns-3-allinone des référentiels supplémentaires seront téléchargés ns-3, cuire, pybindgen и Netanim.

Noter
Sur une machine avec Ubuntu16.04 propre, je devais modifier la commande comme suit : $ sudo python3 download.py -n ns-3.29 (ci-après notes du traducteur).

3.3.1 Chargement de NS-3 à l'aide de Bake

Les deux méthodes ci-dessus (archive source ou référentiel ns-3-allinone via Git) sont utiles pour obtenir l'installation NS-3 la plus simple avec plusieurs modules complémentaires (pybindgen pour générer des liaisons Python et Netanim pour l'animation du réseau). Le troisième référentiel fourni par défaut dans ns-3-allinone s'appelle cuire.

Cuire est un outil de construction coordonnée de logiciels à partir de plusieurs référentiels, développé pour le projet ns-3. Cuire peut être utilisé pour obtenir des versions de développement de ns-3, ainsi que pour télécharger et créer des extensions de la version de base de la distribution ns-3, telles que l'environnement Exécution directe du code, Berceau de simulation de réseau Cradle, la possibilité de créer de nouvelles liaisons Python et diverses « applications » ns-3.

Noter
CradleNetwork Simulation Cradle est un framework qui vous permet d'utiliser de véritables piles réseau TCP/IP dans un simulateur de réseau.

Si vous prévoyez que votre installation ns-3 dispose de fonctionnalités avancées ou supplémentaires, vous pouvez suivre ce chemin d'installation.

Dans les dernières versions de NS-3 Cuire a été ajouté à la version tar. La version comprend un fichier de configuration qui vous permet de télécharger les versions actuelles du logiciel au moment de la publication. C'est par exemple la version Cuire, qui est distribué avec la version ns-3.29, peut être utilisé pour récupérer des composants pour cette version de ns-3 ou antérieure, mais ne peut pas être utilisé pour récupérer des composants pour des versions ultérieures (si le fichier de description du package bakeconf.xml pas à jour).

Vous pouvez également obtenir la dernière copie cuireen entrant la commande suivante dans votre console Linux (en supposant que Git soit installé) :

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

Lorsque vous exécutez la commande git, vous devriez voir quelque chose comme ce qui suit :

Cloning into 'bake'...
remote: Enumerating objects: 2086, done. 
remote: Counting objects: 100% (2086/2086), done. 
remote: Compressing objects: 100% (649/649), done. 
remote: Total 2086 (delta 1404), reused 2078 (delta 1399) 
Receiving objects: 100% (2086/2086), 2.68 MiB | 3.82 MiB/s, done. 
Resolving deltas: 100% (1404/1404), done.

Une fois la commande terminée cloner vous devriez avoir un répertoire nommé cuire, dont le contenu devrait ressembler à ceci :

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

Notez que vous avez chargé plusieurs scripts Python, un module Python nommé cuire et un fichier de configuration XML. L'étape suivante consiste à utiliser ces scripts pour télécharger et créer la distribution ns-3 de votre choix. Plusieurs cibles de personnalisation sont disponibles :

  1. ns-3.29: module correspondant à la version ; il téléchargera des composants similaires à la version dans l'archive tar ;

  2. ns-3-dev: un module similaire, mais utilisant le code de l'arborescence de développement ;

  3. ns-allinone-3.29: Un module qui inclut d'autres fonctionnalités supplémentaires telles que le routage Click et Network Simulation Cradle, Openflow pour ns-3.

  4. ns-3-allinone: similaire à la version release du module allinone, mais pour le code de développement.

Noter
Cliquez — architecture logicielle modulaire pour la création de routeurs.

Openflow est un protocole de gestion du processus de traitement des données transmises sur un réseau de données par des routeurs et des commutateurs, mettant en œuvre une technologie de réseau définie par logiciel.

L'instantané de développement actuel (non publié) ns-3 peut être trouvé à l'adresse :https://gitlab.com/nsnam/ns-3-dev.git.

Les développeurs essaient de maintenir ces référentiels dans un état de fonctionnement cohérent, mais ils sont dans la zone de développement et contiennent du code inédit, donc si vous ne prévoyez pas d'utiliser de nouvelles fonctionnalités, sélectionnez la version officielle.

Vous pouvez trouver la dernière version du code en parcourant la liste des référentiels ou en vous rendant sur la page Web ns-3 Releases :https://www.nsnam.org/releases/ et en cliquant sur le lien de la dernière version. Dans cet exemple, nous continuerons avec ns-3.29.

Maintenant, pour obtenir les composants ns-3 dont nous avons besoin, nous allons utiliser l'outil Cuire. Disons quelques mots d'introduction sur le travail Cuire.

Bake fonctionne en chargeant les sources du package dans un répertoire la source et installer les bibliothèques dans le répertoire de construction. Cuire peut être exécuté en référençant le binaire, mais si vous souhaitez exécuter Cuire pas du répertoire dans lequel il a été téléchargé, il est conseillé d'ajouter le chemin vers cuire à votre chemin (variable d'environnement PATH), par exemple comme suit (exemple pour le shell bash Linux). Accédez au répertoire "bake" puis définissez les variables d'environnement suivantes :

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

Cela placera le programme cuire.py au chemin du shell et permettra à d'autres programmes de trouver les exécutables et les bibliothèques qu'il a créés cuire. Dans certains cas d'utilisation cuire, les paramètres PATH et PYTHONPATH décrits ci-dessus ne sont pas requis, mais une version complète de ns-3-allinone (avec des packages supplémentaires) l'exige généralement.

Accédez à votre répertoire de travail et saisissez ce qui suit dans la console :

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

Nous demanderons ensuite Cuire vérifiez si nous avons suffisamment d'outils pour charger les différents composants. Cadran:

$ ./bake.py check

Vous devriez voir quelque chose comme ce qui suit :

> Python - OK 
> GNU C++ compiler - OK 
> Mercurial - OK 
> Git - OK 
> Tar tool - OK 
> Unzip tool - OK 
> Make - OK 
> cMake - OK 
> patch tool - OK 
> Path searched for tools: /usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin ...

En particulier, les outils de téléchargement tels que Mercurial, CVS, Git et Bazaar sont essentiels dans cette étape car ils nous permettent d'obtenir le code. À ce stade, installez les outils manquants de la manière habituelle pour votre système (si vous savez comment) ou contactez votre administrateur système pour obtenir de l'aide.

Ensuite, essayez de télécharger le logiciel :

$ ./bake.py download

le résultat devrait être quelque chose comme :

>> Searching for system dependency setuptools - OK 
>> Searching for system dependency libgoocanvas2 - OK 
>> Searching for system dependency gi-cairo - OK 
>> Searching for system dependency pygobject - OK 
>> Searching for system dependency pygraphviz - OK 
>> Searching for system dependency python-dev - OK 
>> Searching for system dependency qt - OK 
>> Searching for system dependency g++ - OK 
>> Downloading pybindgen-0.19.0.post4+ng823d8b2 (target directory:pybindgen) - OK 
>> Downloading netanim-3.108 - OK 
>> Downloading ns-3.29 - OK

Cela signifie que trois sources ont été téléchargées. Allez maintenant dans le répertoire source et tapez ls ; Tu devrais voir:

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

Vous êtes maintenant prêt à créer la distribution ns-3.

3.4 Assemblage ns-3

Comme pour le téléchargement de NS-3, il existe plusieurs façons de construire NS-3. La principale chose que nous souhaitons souligner est que ns-3 est construit à l'aide d'un outil de construction appelé Wafdécrit ci-dessous. La plupart des utilisateurs travailleront avec Waf, mais il existe quelques scripts pratiques pour vous aider à démarrer ou à organiser des builds plus complexes. Alors s'il vous plaît, avant de lire Waf, jeter un coup d'œil à build.py et assemblage avec cuire.

3.4.1 Construire avec build.py

Attention! Cette étape de construction n'est disponible qu'à partir de la version de l'archive source obtenue comme décrit ci-dessus ; et non téléchargé via git ou bake.

Lorsque vous travaillez avec une archive de versions archiverdans ns-3-allinone Il existe un script pratique qui peut faciliter l'assemblage des composants. Cela s'appelle build.py. Ce programme mettra en place le projet pour vous de la manière la plus utile. Cependant, notez qu'une configuration et un travail plus avancés avec ns-3 impliquent généralement l'utilisation du propre système de construction de ns-3, Waf, qui sera présenté plus loin dans ce didacticiel.

Si vous avez téléchargé en utilisant archiver, puis dans votre répertoire ~/espace de travail un répertoire avec un nom ressemblant à ns-allinone-3.29. Entrez ce qui suit :

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

Sur appel build.py Nous avons utilisé des arguments de ligne de commande pour créer les exemples et les tests utilisés dans ce didacticiel, qui ne sont pas construits par défaut dans ns-3. Par défaut, le programme construit également tous les modules disponibles. Ensuite, si vous le souhaitez, vous pouvez construire ns-3 sans exemples ni tests, ou exclure les modules qui ne sont pas nécessaires à votre travail.

Vous verrez de nombreux messages de sortie du compilateur affichés par le script au fur et à mesure qu'il crée les différentes parties que vous avez chargées. Le script va d'abord essayer de construire l'animateur Netanim, puis le générateur de liaison pybindgen et enfin ns-3. Une fois le processus terminé, vous devriez voir ce qui suit :

Waf: Leaving directory '/path/to/workspace/ns-allinone-3.29/ns-3.29/build'
'build' finished successfully (6m25.032s) 

Modules built:
antenna                aodv                     applications
bridge                 buildings                config-store
core                   csma                     csma-layout
dsdv                   dsr                      energy 
fd-net-device          flow-monitor             internet
internet-apps          lr-wpan                  lte
mesh                   mobility                 mpi
netanim (no Python)    network                  nix-vector-routing 
olsr                   point-to-point           point-to-point-layout 
propagation            sixlowpan                spectrum 
stats                  tap-bridge               test (no Python) 
topology-read          traffic-control          uan 
virtual-net-device     visualizer               wave 
wifi                   wimax 

Modules not built (see ns-3 tutorial for explanation):
brite                  click                    openflow 
Leaving directory ./ns-3.29

Dans les trois dernières lignes de la liste, nous voyons un message concernant les modules qui n'ont pas été construits :

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

Cela signifie simplement que certains modules ns-3 qui dépendent de bibliothèques externes n'ont peut-être pas été construits, ou qu'il n'est pas nécessaire de les construire pour cette configuration. Cela ne signifie pas que le simulateur n'est pas assemblé ou que les modules assemblés ne fonctionneront pas correctement.

3.4.2 Construire avec Bake

Si vous avez utilisé bake ci-dessus pour obtenir le code source des référentiels du projet, vous pouvez continuer à l'utiliser pour construire ns-3. Cadran:

$ ./bake.py build

et vous devriez voir quelque chose comme :

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

Info-bulle: Vous pouvez également effectuer les étapes de téléchargement et de construction en même temps en appelant "bake.py déployer".

L'assemblage de tous les composants peut échouer, mais l'assemblage continuera si un composant n'est pas requis. Par exemple, un problème récent de portabilité était que castxml peut être assemblé par outil cuire pas sur toutes les plateformes. Dans ce cas, un message comme celui-ci apparaîtra :

>> Building castxml - Problem 
> Problem: Optional dependency, module "castxml" failed
This may reduce the functionality of the final build.
However, bake will continue since "castxml" is not an essential dependency.
For more information call bake with -v or -vvv, for full verbose mode.

Mais castxml nécessaire uniquement si vous souhaitez créer des liaisons Python mises à jour. Pour la plupart des utilisateurs, cela n'est pas nécessaire (au moins jusqu'à ce qu'ils modifient ns-3), donc de tels avertissements peuvent être ignorés en toute sécurité pour le moment.

En cas d'échec, la commande suivante vous donnera un indice sur les dépendances manquantes :

$ ./bake.py show

Les différentes dépendances des packages que vous essayez de créer seront répertoriées.

3.4.3 Construire avec Waf

Jusqu'à présent, pour commencer à construire ns-3, nous avons utilisé soit le script build.py, ou un outil cuire. Ces outils sont utiles pour créer ns-3 et maintenir les bibliothèques. En fait, pour construire, ils exécutent l'outil de construction Waf du répertoire ns-3. Waf installé avec le code source ns-3. La plupart des utilisateurs passent rapidement à l'utilisation directe pour configurer et assembler le ns‑3. Waf. Donc, pour continuer, veuillez vous rendre dans le répertoire ns-3 que vous avez initialement créé.

Ce n’est pas strictement obligatoire pour le moment, mais il sera utile de revenir un peu en arrière et de voir comment apporter des modifications à la configuration du projet. Le changement de configuration le plus utile que vous puissiez apporter est probablement de créer une version optimisée du code. Par défaut, vous avez configuré votre projet pour créer une version de débogage. Jetons un coup d'œil à un projet pour créer une version optimisée. Pour expliquer à Waf qu'il doit créer des builds optimisés incluant des exemples et des tests, vous devrez exécuter les commandes suivantes :

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

Cela lancera Waf en dehors du répertoire local (pour votre commodité). La première commande nettoie la version précédente, ce n'est généralement pas strictement nécessaire, mais c'est une bonne pratique (voir également les profils de construction ci-dessous) ; cela supprimera les bibliothèques et les fichiers objets précédemment créés situés dans le répertoire construire/. Lorsque le projet est reconfiguré et que le système de build vérifie les différentes dépendances, vous devriez voir un résultat semblable à celui-ci :

Setting top to      : /home/ns3user/workspace/bake/source/ns-3-dev
Setting out to      : /home/ns3user/workspace/bake/source/ns-3-dev/build
Checking for 'gcc' (C compiler)        : /usr/bin/gcc 
Checking for cc version                : 7.3.0 
Checking for 'g++' (C++ compiler)      : /usr/bin/g++ 
Checking for compilation flag -march=native support : ok 
Checking for compilation flag -Wl,--soname=foo support : ok 
Checking for compilation flag -std=c++11 support       : ok 
Checking boost includes   : headers not found, please ,!provide a --boost-includes argument (see help) 
Checking boost includes   : headers not found, please ,!provide a --boost-includes argument (see help) 
Checking for program 'python'            : /usr/bin/python 
Checking for python version >= 2.3       : 2.7.15 python-config                                                                     : /usr/bin/python-config
Asking python-config for pyembed '--cflags --libs --ldflags' flags : yes
Testing pyembed configuration                                      : yes
Asking python-config for pyext '--cflags --libs --ldflags' flags   : yes
Testing pyext configuration                                        : yes

Checking for compilation flag -fvisibility=hidden support          : ok 
Checking for compilation flag -Wno-array-bounds support            : ok 
Checking for pybindgen location          : ../pybindgen ,!(guessed) 
Checking for python module 'pybindgen'   : 0.19.0. ,!post4+g823d8b2 
Checking for pybindgen version           : 0.19.0. ,!post4+g823d8b2 
Checking for code snippet                : yes 
Checking for types uint64_t and unsigned long equivalence : no 
Checking for code snippet                                 : no 
Checking for types uint64_t and unsigned long long equivalence     : yes 
Checking for the apidefs that can be used for Python bindings                       : gcc-LP64 
Checking for internal GCC cxxabi         : complete 
Checking for python module 'pygccxml'    : not found 
Checking for click location              : not found 
Checking for program 'pkg-config'        : /usr/bin/pkg- ,!config 
Checking for 'gtk+-3.0'                  : not found 
Checking for 'libxml-2.0'                : yes 
checking for uint128_t                   : not found 
checking for __uint128_t                 : yes 
Checking high precision implementation   : 128-bit integer ,!(default) 
Checking for header stdint.h             : yes 
Checking for header inttypes.h           : yes 
Checking for header sys/inttypes.h       : not found 
Checking for header sys/types.h          : yes 
Checking for header sys/stat.h           : yes 
Checking for header dirent.h             : yes 
Checking for header stdlib.h             : yes 
Checking for header signal.h             : yes 
Checking for header pthread.h            : yes 
Checking for header stdint.h             : yes 
Checking for header inttypes.h           : yes 
Checking for header sys/inttypes.h       : not found
Checking for library rt                  : yes 
Checking for header sys/ioctl.h          : yes 
Checking for header net/if.h             : yes 
Checking for header net/ethernet.h       : yes 
Checking for header linux/if_tun.h       : yes 
Checking for header netpacket/packet.h   : yes 
Checking for NSC location                : not found 
Checking for 'sqlite3'                   : not found 
Checking for header linux/if_tun.h       : yes 
Checking for python module 'gi'          : 3.26.1 
Checking for python module 'gi.repository.GObject'      : ok 
Checking for python module 'cairo'                      : ok 
Checking for python module 'pygraphviz'                 : 1.4rc1 
Checking for python module 'gi.repository.Gtk'          : ok 
Checking for python module 'gi.repository.Gdk'          : ok 
Checking for python module 'gi.repository.Pango'        : ok 
Checking for python module 'gi.repository.GooCanvas'    : ok 
Checking for program 'sudo'                             : /usr/bin/sudo 
Checking for program 'valgrind'                         : not found 
Checking for 'gsl' : not found python-config            : not found 
Checking for compilation flag -fstrict-aliasing support : ok 
Checking for compilation flag -fstrict-aliasing support : ok 
Checking for compilation flag -Wstrict-aliasing support : ok 
Checking for compilation flag -Wstrict-aliasing support : ok 
Checking for program 'doxygen'                          : /usr/bin/doxygen
---- Summary of optional ns-3 features:
Build profile : optimized
Build directory : 
BRITE Integration : not enabled (BRITE not enabled (see option --with- ,!brite)) 
DES Metrics event collection : not enabled (defaults to disabled) 
Emulation FdNetDevice        : enabled 
Examples                     : enabled 
File descriptor NetDevice    : enabled 
GNU Scientific Library (GSL) : not enabled (GSL not found) 
Gcrypt library               : not enabled
(libgcrypt not found: you can use ,!libgcrypt-config to find its location.) GtkConfigStore               : not enabled (library 'gtk+-3.0 >= 3.0' not fou   nd)
MPI Support                  : not enabled (option --enable-mpi not selected)
ns-3 Click Integration       : not enabled (nsclick not enabled (see option --with- ,!nsclick))
ns-3 OpenFlow Integration   : not enabled (Required boost libraries not found) 
Network Simulation Cradle    : not enabled (NSC not found (see option --with-nsc))
PlanetLab FdNetDevice         : not enabled (PlanetLab operating system not detected ,!(see option --force-planetlab)) PyViz visualizer : enabled 
Python API Scanning Support   : not enabled (Missing 'pygccxml' Python module)
Python Bindings : enabled 
Real Time Simulator           : enabled 
SQlite stats data output      : not enabled (library 'sqlite3' not found)
Tap Bridge                    : enabled 
Tap FdNetDevice               : enabled
Tests                         : enabled 
Threading Primitives          : enabled 
Use sudo to set suid bit   : not enabled (option --enable-sudo not selected)
XmlIo                         : enabled
'configure' finished successfully (6.387s)

Veuillez noter la dernière partie de la liste ci-dessus. Certaines options ns-3 ne sont pas activées par défaut ou nécessitent une prise en charge du système pour fonctionner correctement. Par exemple, pour activer XmlTo, la bibliothèque doit être présente sur le système libxml-2.0. Si cette bibliothèque n'a pas été trouvée et que la fonction ns-3 correspondante n'a pas été activée, un message s'affichera. A noter également qu'il est possible d'utiliser la commande sudo pour définir le bit suid « définir l'ID de groupe au moment de l'exécution » pour certains programmes. Elle n'est pas activée par défaut et cette fonctionnalité apparaît donc comme « non activée ». Enfin, pour obtenir une liste des options activées, utilisez Waf avec paramètre --check-config.

Revenons maintenant à la version de débogage contenant des exemples et des tests.

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

Le système de build est maintenant configuré et vous pouvez créer des versions de débogage des programmes ns-3 en tapant simplement :

$ ./waf

Les étapes ci-dessus vous ont peut-être obligé à créer une partie du système ns-3 deux fois, mais vous savez maintenant comment modifier la configuration et créer du code optimisé.

Pour vérifier quel profil est actif pour une configuration de projet donnée, il existe une commande :

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

Le scénario ci-dessus build.py soutient également les arguments --enable-examples и --enable-tests, mais d'autres options Waf il ne prend pas en charge directement. Par exemple, cela ne fonctionnera pas :

$ ./build.py --disable-python

la réaction sera comme ceci :

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

Cependant, l'opérateur spécial - - peut être utilisé pour transmettre des paramètres supplémentaires via wafdonc au lieu de ce qui précède, la commande suivante fonctionnera :

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

car il génère la commande principale ./waf configurer --disable-python. Voici quelques conseils d’introduction supplémentaires sur Waf.

Gestion des erreurs de build

Les versions ns-3 sont testées sur les derniers compilateurs C++ disponibles au moment de leur sortie sur les distributions Linux et MacOS courantes. Cependant, au fil du temps, de nouvelles distributions sont publiées avec de nouveaux compilateurs, et ces nouveaux compilateurs ont tendance à être plus pédants en matière d'avertissements. ns-3 configure sa build pour traiter tous les avertissements comme des erreurs, donc parfois si vous exécutez une ancienne version sur un système plus récent, un avertissement du compilateur peut arrêter la build.

Par exemple, il existait auparavant une version ns‑3.28 pour Fedora 28, qui incluait une nouvelle version majeure gcc (gcc-8). En construisant la version ns-3.28 ou des versions antérieures sous Fedora 28, avec Gtk2+ installé, l'erreur suivante se produira :

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

Dans les versions à partir de ns‑3.28.1, dans Waf une option est disponible pour résoudre ces problèmes. Il désactive la définition de l'indicateur "-Werror" dans g++ et clang++. Il s'agit de l'option "--disable-werror" et doit être appliquée lors de la configuration :

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

Configurer ou assembler

Quelques commandes Waf n'ont de sens que dans la phase de configuration, et certains ne sont valables que dans la phase de construction. Par exemple, si vous souhaitez utiliser les fonctionnalités d'émulation ns-3, vous pouvez activer le paramètre bit suid en utilisant sudo, comme décrit ci-dessus. Cela remplacera les commandes de l'étape de configuration et vous pourrez ainsi modifier la configuration à l'aide de la commande suivante, qui comprend également des exemples et des tests.

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

Si tu fais ça Waf va lancer sudopour modifier les programmes de création de sockets de code d'émulation afin qu'ils s'exécutent avec des autorisations racine. la Waf Il existe de nombreuses autres options disponibles pour les étapes de configuration et de construction. Pour explorer vos options, saisissez :

$ ./waf --help

Dans la section suivante, nous utiliserons quelques options liées aux tests.

Profils d'assemblage

Nous avons déjà vu comment configurer Waf pour les assemblées déboguer и optimisé:

$ ./waf --build-profile=debug

Il existe également un profil d'assemblage intermédiaire, libérer. Option -d est synonyme --build-profile. Le profil de build contrôle l'utilisation de la journalisation, des assertions et des commutateurs d'optimisation du compilateur :

Tutoriel du simulateur de réseau ns-3. chapitre 3

Comme vous pouvez le constater, la journalisation et les assertions ne sont disponibles que dans les versions de débogage. La pratique recommandée consiste à développer votre script en mode débogage, puis à effectuer des exécutions répétées (pour les statistiques ou les modifications de paramètres) dans un profil de build optimisé.

Si vous avez du code qui ne doit s'exécuter que dans certains profils de build, utilisez la macro Code Wrapper :

NS_BUILD_DEBUG (std::cout << "Part of an output line..." << std::flush; timer.Start ,!()); DoLongInvolvedComputation ();
NS_BUILD_DEBUG (timer.Stop (); std::cout << "Done: " << timer << std::endl;)

Défaut, Waf place les artefacts de build dans le répertoire de construction. Vous pouvez spécifier un répertoire de sortie différent à l'aide de l'option - -out, Par exemple:

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

En combinant cela avec des profils de build, vous pouvez facilement basculer entre différentes options de compilation :

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

Ce qui vous permet de travailler avec plusieurs assemblys sans avoir à réécrire le dernier assembly à chaque fois. Lorsque vous passez à un autre profil, Waf ne compilera que cela, sans tout recompiler complètement.

Lorsque vous changez de profil de build de cette manière, vous devez veiller à donner les mêmes options de configuration à chaque fois. Définir plusieurs variables d'environnement vous aidera à éviter les erreurs :

$ 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

Compilateurs et drapeaux

Dans les exemples ci-dessus Waf pour construire ns-3, il utilise le compilateur C++ de GCC ( g ++). Cependant, vous pouvez changer celui que vous utilisez Waf Compilateur C++, en définissant la variable d'environnement CXX. Par exemple, pour utiliser le compilateur C++ Clang, clang++,

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

De la même manière, vous pouvez configurer Waf utiliser la compilation distribuée en utilisant distcc:

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

Plus d'informations sur distcc et la compilation distribuée peuvent être trouvées sur la page du projet dans la section Documentation. Pour ajouter des indicateurs du compilateur lors de la configuration de ns-3, utilisez la variable d'environnement CXXFLAGS_EXTRA.

Installation

Waf peut être utilisé pour installer des bibliothèques à différents endroits du système. Par défaut, les bibliothèques compilées et les exécutables se trouvent dans le répertoire construire, et comme Waf connaît l'emplacement de ces bibliothèques et exécutables, il n'est pas nécessaire d'installer les bibliothèques ailleurs.

Si les utilisateurs préfèrent installer en dehors du répertoire de construction, ils peuvent exécuter la commande ./waf installer. Le préfixe par défaut pour l'installation est / Usr / localSi ./waf installer installera des programmes dans / usr / local / bin, les bibliothèques de / Usr / local / lib et les fichiers d'en-tête dans /usr/local/inclure. Les droits de superutilisateur doivent généralement être définis avec un préfixe par défaut, donc une commande typique serait sudo ./waf installer. Une fois lancé, Waf choisira d'abord d'utiliser les bibliothèques partagées dans le répertoire de construction, puis recherchera les bibliothèques le long du chemin d'accès aux bibliothèques configurées dans l'environnement local. Ainsi, lors de l'installation de bibliothèques sur un système, c'est une bonne pratique de vérifier que les bonnes bibliothèques sont utilisées. Les utilisateurs peuvent choisir d'installer avec un préfixe différent en passant l'option lors de la configuration --prefix, Par exemple:

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

Si plus tard, après la construction, l'utilisateur entre la commande d'installation ./waf, le préfixe sera utilisé /opt/local.

Équipe ./waf clean doit être utilisé avant de reconfigurer le projet si l'installation doit utiliser Waf sous un préfixe différent.

Ainsi, pour utiliser ns-3, il n’est pas nécessaire d’appeler ./waf install. La plupart des utilisateurs n'auront pas besoin de cette commande car Waf récupèrera les bibliothèques actuelles du répertoire build, mais certains utilisateurs peuvent trouver cela utile si leurs activités impliquent de travailler avec des programmes en dehors du répertoire ns-3.

Waf célibataire

Au niveau supérieur de l'arborescence des sources ns-3, il n'y a qu'un seul script Waf. Une fois que vous commencerez à travailler, vous passerez beaucoup de temps dans l'annuaire scratch/ ou plus profondément danssrc/... et en même temps je dois courir Waf. Tu peux juste te rappeler où tu es et courir Waf comme suit:

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

mais cela sera fastidieux et sujet aux erreurs, il existe donc de meilleures solutions. Une méthode courante consiste à utiliser un éditeur de texte tel que emacs ou entrain, dans lequel deux sessions de terminal sont ouvertes, l'une est utilisée pour construire ns-3 et la seconde est utilisée pour éditer le code source. Si seulement tu as archiver, alors une variable d'environnement peut aider :

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

$ cd scratch 
$ waff build

Dans le répertoire du module, il peut être tentant d'ajouter un script waf trivial comme exec ../../waf. S'il vous plaît, ne faites pas cela. Ceci est déroutant pour les débutants et, lorsqu'il est mal fait, conduit à des erreurs de construction difficiles à détecter. Les solutions présentées ci-dessus sont le chemin à utiliser.

3.5 Test de NS-3

Vous pouvez exécuter les tests unitaires de la distribution ns-3 en exécutant le script ./test.py:

$ ./test.py

Ces tests sont menés en parallèle avec Waf. Finalement, vous devriez voir un message disant :

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

Il s'agit d'un message important pour identifier les plantages, les plantages ou les erreurs de Valgrind, indiquant des problèmes avec le code ou une incompatibilité entre les outils et le code.

Vous verrez également le résultat final de Waf et un testeur exécutant chaque test, qui ressemblera à ceci :

Waf: Entering directory `/path/to/workspace/ns-3-allinone/ns-3-dev/build' 
Waf: Leaving directory `/path/to/workspace/ns-3-allinone/ns-3-dev/build' 
'build' finished successfully (1.799s) 

Modules built:
aodv           applications          bridge
click          config-store          core
csma           csma-layout           dsdv
emu            energy                flow-monitor
internet       lte                   mesh
mobility       mpi                   netanim
network        nix-vector-routing    ns3tcp
ns3wifi        olsr                  openflow
point-to-point point-to-point-layout propagation
spectrum       stats                 tap-bridge
template       test                  tools
topology-read  uan                   virtual-net-device
visualizer     wifi                  wimax

PASS: TestSuite ns3-wifi-interference
PASS: TestSuite histogram 

...

PASS: TestSuite object
PASS: TestSuite random-number-generators
92 of 92 tests passed (92 passed, 0 failed, 0 crashed, 0 valgrind errors)

Cette commande est généralement exécutée par les utilisateurs pour vérifier rapidement que la distribution ns-3 est correctement construite. (Notez que l'ordre des lignes "PASS: ..." peut être différent, c'est normal. Ce qui est important est que la ligne récapitulative à la fin du rapport montre que tous les tests ont réussi ; aucun test n'a échoué ou ne s'est écrasé.) Et WafEt test.py parallélisera le travail sur les cœurs de processeur disponibles de la machine.

3.6 Exécuter le script

Nous exécutons généralement des scripts sous contrôle Waf. Cela permet au système de build de garantir que les chemins des bibliothèques partagées sont correctement définis et que les bibliothèques sont disponibles au moment de l'exécution. Pour exécuter le programme, utilisez simplement Waf avec paramètre - -run. Exécutons l'équivalent ns-3 du programme omniprésent bonjour tout le mondeen tapant ce qui suit :

$ ./waf --run hello-simulator

Waf vérifiera d'abord que le programme est correctement construit et le construira si nécessaire. Alors Waf exécutera un programme qui produit la sortie suivante.

Hello Simulator

Toutes nos félicitations! Vous êtes maintenant un utilisateur NS-3 !

Que dois-je faire si je ne vois pas de résultats ?

Si vous voyez des messages Wafindiquant que la construction s'est terminée avec succès, mais vous ne voyez pas le résultat "Bonjour le simulateur", alors il est possible que dans la section [Build-with-Waf] vous ayez changé votre mode de construction en optimisé, mais j'ai manqué de revenir au mode déboguer. Toutes les sorties de console utilisées dans ce didacticiel utilisent un composant ns-3 spécial qui effectue la journalisation et est utilisé pour imprimer des messages personnalisés sur la console. La sortie de ce composant est automatiquement désactivée lorsque le code optimisé est compilé : il est "optimisé". Si vous ne voyez pas le résultat « Hello Simulator », saisissez ce qui suit :

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

customiser Waf pour créer des versions de débogage des programmes ns-3, qui incluent des exemples et des tests. Vous devez ensuite reconstruire la version de débogage actuelle du code en tapant

$ ./waf

Maintenant, si vous exécutez le programme bonjour-simulateur, vous devriez voir le résultat attendu.

3.6.1 Arguments de ligne de commande

Pour transmettre des arguments de ligne de commande au programme ns-3, utilisez le modèle suivant :

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

Remplacer au nom de votre programme et aux arguments. Argument - -command-template pour Waf est essentiellement une recette pour construire la ligne de commande réelle Waf utilisé pour exécuter le programme. Waf vérifie que la construction est terminée, définit les chemins de bibliothèque partagés, puis utilise le modèle de ligne de commande fourni et remplace le nom du programme par l'espace réservé %s pour appeler l'exécutable. Si vous trouvez cette syntaxe compliquée, il existe une version plus simple qui implique le programme ns-3 et ses arguments entre guillemets simples :

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

Un autre exemple particulièrement utile consiste à exécuter des suites de tests de manière sélective. Supposons qu'il existe une suite de tests appelée mytest (en fait, ce n'est pas le cas). Ci-dessus, nous avons utilisé le script ./test.py pour exécuter un certain nombre de tests en parallèle, qui appelle à plusieurs reprises le programme de test. testeur. Appel testeur directement pour exécuter un test :

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

Les arguments seront transmis au programme testeur. Puisque mytest n'existe pas, un message d'erreur sera généré. Pour imprimer les options de test disponibles, entrez :

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

3.6.2 Débogage

Pour exécuter des programmes ns-3 sous un autre utilitaire, tel qu'un débogueur (par exemple, gdb) ou un outil de test de mémoire (par exemple, valgrind), utilisez un formulaire similaire - -command-template = "…". Par exemple, pour exécuter dans le débogueur gdb votre programme hello-simulator ns-3 avec des arguments :

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

Notez que le nom du programme ns-3 est accompagné de l'argument - -run, et l'utilitaire de gestion (ici gdb) est le premier jeton de l'argument - -command-template. Option - -args rapports gdbque le reste de la ligne de commande appartient au programme "inférieur". (Certaines versions gdb je ne comprends pas l'option - -args. Dans ce cas, supprimez les arguments du programme de - -command-template et utilisez le jeu de commandes gdb args.) On peut combiner cette recette et la précédente pour lancer le test sous le débogueur :

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

3.6.3 Répertoire de travail

Waf doit être lancé depuis son emplacement en haut de l'arborescence ns-3. Ce dossier devient le répertoire de travail dans lequel les fichiers de sortie seront écrits. Mais que se passe-t-il si vous souhaitez conserver ces fichiers en dehors de l'arborescence source ns-3 ? Utiliser des arguments - -cwd:

$ ./waf --cwd=...

Vous trouverez peut-être plus pratique d'obtenir les fichiers de sortie dans votre répertoire de travail. Dans ce cas, l’action indirecte suivante peut aider :

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

Cette décoration de la version précédente de la commande préserve le répertoire de travail courant, va dans le répertoire Wafpuis demande Waf pour restaurer le répertoire de travail au répertoire de travail actuel enregistré avant de démarrer le programme. Nous mentionnons l'équipe - -cwd Pour être complet, la plupart des utilisateurs exécutent simplement Waf à partir du répertoire de niveau supérieur et y génèrent des fichiers de sortie.

Suite : Chapitre 4

Source: habr.com

Ajouter un commentaire