Tutorial sul simulatore di rete ns-3. capitolo 3

Tutorial sul simulatore di rete ns-3. capitolo 3
capitolo 1,2

3 Per iniziare
3.1. Panoramica
3.2 Prerequisiti
3.2.1 Download della versione ns-3 come archivio sorgente
3.3 Scaricare ns-3 utilizzando Git
3.3.1 Caricamento di ns-3 utilizzando Bake
3.4 Assemblea ns-3
3.4.1 Costruire con build.py
3.4.2 Costruire con Bake
3.4.3 Costruisci con Waf
3.5 Test di ns-3
3.6 Esecuzione dello script
3.6.1 Argomenti della riga di comando
3.6.2 Debug
3.6.3 Directory di lavoro

Capitolo 3

Iniziare

Questo capitolo ha lo scopo di preparare il lettore a iniziare con un computer che potrebbe non aver mai installato ns-3. Copre le piattaforme supportate, i prerequisiti, come ottenere ns-3, come creare ns-3 e come testare la build ed eseguire programmi semplici.

3.1. Panoramica

Il simulatore ns-3 è costruito come un sistema di librerie software collaborative. Durante l'assemblaggio il codice dei programmi utente viene collegato a queste librerie. I linguaggi di programmazione C++ o Python vengono utilizzati per scrivere programmi personalizzati.

Ns-3 è distribuito come codice sorgente, il che significa che il sistema di destinazione deve disporre di un ambiente di sviluppo software per costruire prima le librerie e poi costruire il programma utente. In linea di principio, ns-3 potrebbero essere distribuite come librerie già pronte per un sistema specifico, e in futuro potrebbero essere distribuite in questo modo. Ma al giorno d'oggi molti utenti effettivamente fanno il loro lavoro modificando lo stesso ns-3, quindi è utile avere il codice sorgente per costruire le librerie. Se qualcuno desidera intraprendere il lavoro di creazione di librerie e pacchetti già pronti per sistemi operativi, può contattare la mailing list ns-sviluppatori.

Successivamente, esamineremo tre modi per scaricare e creare ns-3. Il primo è scaricare e creare la versione ufficiale dal sito principale. Il secondo è la selezione e l'assemblaggio di copie delle versioni di sviluppo dell'installazione base di ns-3. Il terzo consiste nell'utilizzare strumenti di creazione aggiuntivi per caricare più estensioni per ns-3. Esamineremo ciascuno di essi poiché gli strumenti sono leggermente diversi.

Gli utenti Linux esperti potrebbero chiedersi perché ns-3 non viene fornito come pacchetto come la maggior parte delle altre librerie che utilizzano un gestore di pacchetti? Sebbene esistano pacchetti binari per varie distribuzioni Linux (ad esempio Debian), la maggior parte degli utenti finisce per modificare le librerie e dover ricostruire ns-3 da soli, quindi avere a disposizione il codice sorgente è utile. Per questo motivo ci concentreremo sull'installazione dal sorgente.

Per la maggior parte delle applicazioni diritti ns-3 radice non sono necessari, si consiglia di utilizzare un account utente non privilegiato.

3.2 Prerequisiti

L'intero set di librerie ns-3 disponibili ha una serie di dipendenze da librerie di terze parti, ma per la maggior parte ns-3 può essere creato e utilizzato con il supporto per diversi componenti comuni (spesso installati per impostazione predefinita): un compilatore C++, Python, un editor di codice sorgente (ad esempio, vim, emacs o Eclissi) e, se vengono utilizzati repository di sviluppo, sistemi di controllo della versione Git. La maggior parte degli utenti alle prime armi non dovrà preoccuparsi se la configurazione segnala la mancanza di alcune funzionalità avanzate dell'ns-3, ma per coloro che desiderano un'installazione completa, il progetto fornisce una wiki che include pagine con molti suggerimenti e trucchi utili. Una di queste pagine è la pagina di installazione, con le istruzioni di installazione per vari sistemi, disponibile all'indirizzo: https://www.nsnam.org/wiki/Installation.

La sezione Prerequisiti di questa wiki spiega quali pacchetti sono necessari per supportare le opzioni ns-3 comuni e fornisce anche i comandi utilizzati per installarli su versioni comuni di Linux o macOS.

Puoi sfruttare questa opportunità per esplorare la pagina wiki di ns-3 o il sito Web principale: https://www.nsnam.org, perché ci sono molte informazioni lì. A partire dall'ultima versione di ns-3 (ns-3.29), per eseguire ns-3 sono necessari i seguenti strumenti:

Pacchetto/versione dello strumento

  • Compilatore C++
    clang++ o g++ (g++ versione 4.9 o successiva)
  • Python
    versione python2 >= 2.7.10 o versione python3 >= 3.4
  • Idiota
    qualsiasi versione più recente (per accedere a ns-3 su GitLab.com)
  • tar
    qualsiasi versione più recente (per decomprimere la versione ns‑3)
  • bunzip2
    qualsiasi versione più recente (per decomprimere la versione ns‑3)

Per verificare la versione predefinita di Python, digitare python -V. Per verificare la versione g++, digitare g++ -v. Se qualche strumento manca o è troppo vecchio, fare riferimento alla guida di installazione nella pagina wiki di ns-3.

D'ora in poi, presupponiamo che il lettore utilizzi Linux, MacOS o un emulatore Linux e disponga almeno degli strumenti di cui sopra.

3.2.1 Download della versione ns-3 come archivio sorgente

Questa è la linea di condotta per un nuovo utente che desidera scaricare e sperimentare le ultime versioni di rilascio e pacchetto di ns-3. Le versioni ns-3 vengono pubblicate come archivi di sorgenti compressi, a volte chiamati tarball. tarball è uno speciale formato di archivio software in cui diversi file vengono combinati insieme. L'archivio è solitamente compresso. Processo di avvio ns-3 tramite tarball è semplice, devi solo selezionare una versione, scaricarla e decomprimerla.

Supponiamo che tu, come utente, desideri creare ns-3 in una directory locale chiamata spazio di lavoro. Puoi ottenere una copia funzionante della versione inserendo quanto segue nella console Linux (sostituendo ovviamente i numeri di versione appropriati)

$ 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 

Prestare attenzione all'utilità utilizzata sopra wget, che è uno strumento da riga di comando per scaricare oggetti da Internet. Se non lo hai installato, puoi utilizzare il tuo browser per questo.

Seguendo questi passaggi ti porterà alla directory ns-allinone-3.29, lì dovresti vedere diversi file e directory

$ 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

Ora sei pronto per creare la distribuzione base di ns-3 e puoi passare alla sezione sulla creazione di ns-3.

3.3 Scaricare ns-3 utilizzando Git

Il codice ns-3 è disponibile nei repository Git su GitLab.com all'indirizzo https://gitlab.com/nsnam/. gruppo nsnam riunisce i vari repository utilizzati da un progetto open source.

Il modo più semplice per iniziare a utilizzare i repository Git è creare un fork o clonare l'ambiente ns-3-allineone. Si tratta di un insieme di script che gestisce il caricamento e l'assemblaggio dei sottosistemi ns-3 più comunemente utilizzati. Se non conosci Git, i termini "fork" e "clone" potrebbero non esserti familiari; in tal caso, ti consigliamo semplicemente di clonare (creare la tua copia) il repository situato su GitLab.com in questo modo:

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

In questa fase, la visualizzazione della tua directory ns-3-allineone leggermente diverso dalla directory dell'archivio di rilascio descritta sopra. Dovrebbe assomigliare a qualcosa di simile a questo:

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

Tieni presente che esiste uno script scarica.py, che estrarrà inoltre ns-3 e il relativo codice sorgente. Qui puoi scegliere: scaricare l'ultima istantanea di sviluppo di ns-3:

$ python download.py

o preferisci la versione ns-3 utilizzando il flag -n per indicare il numero di versione:

$ python download.py -n ns-3.29

Dopo questo passaggio alla directory ns-3-allineone verranno scaricati ulteriori repository ns-3, infornare, pybindgen и netanim.

Nota
Su una macchina con Ubuntu16.04 pulito, avevo bisogno di modificare il comando in questo: $ sudo python3 download.py -n ns-3.29 (di seguito note del traduttore).

3.3.1 Caricamento di ns-3 utilizzando Bake

I due metodi precedenti (archivio di origine o repository ns-3-allineone tramite Git) sono utili per ottenere l'installazione più semplice di ns-3 con più componenti aggiuntivi (pybindgen per generare associazioni Python e netanim per l'animazione in rete). Viene chiamato il terzo repository fornito per impostazione predefinita in ns-3-allinone infornare.

Infornare è uno strumento per la creazione coordinata di software da più repository, sviluppato per il progetto ns-3. Infornare può essere utilizzato per ottenere versioni di sviluppo di ns-3, nonché per scaricare e creare estensioni della versione base della distribuzione ns-3, come l'ambiente Esecuzione diretta del codice, Culla di simulazione CradleNetwork, la possibilità di creare nuovi collegamenti Python e varie "app" ns-3.

Nota
CradleNetwork Simulation Cradle è un framework che consente di utilizzare stack di rete TCP/IP reali all'interno di un simulatore di rete.

Se prevedi che l'installazione dell'NS-3 disponga di funzionalità avanzate o aggiuntive, puoi seguire questo percorso di installazione.

Nelle ultime versioni di ns-3 Infornare è stato aggiunto al rilascio del catrame. Il rilascio include un file di configurazione che consente di scaricare le versioni software correnti al momento del rilascio. Questa è, ad esempio, la versione Infornare, distribuito con la versione ns-3.29, può essere utilizzato per recuperare componenti per quella versione di ns-3 o precedente, ma non può essere utilizzato per recuperare componenti per versioni successive (se il file di descrizione del pacchetto bakeconf.xml non aggiornato).

Puoi anche ottenere l'ultima copia infornareinserendo il seguente comando nella tua console Linux (supponendo che tu abbia installato Git):

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

Quando esegui il comando git, dovresti vedere qualcosa di simile al seguente:

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.

Al termine del comando clonare dovresti avere una directory denominata infornare, il cui contenuto dovrebbe assomigliare a questo:

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

Tieni presente che hai caricato diversi script Python, un modulo Python denominato infornare e un file di configurazione XML. Il prossimo passo è utilizzare questi script per scaricare e creare la distribuzione ns-3 di tua scelta. Sono disponibili diversi target di personalizzazione:

  1. ns-3.29: modulo corrispondente alla versione; scaricherà componenti simili alla versione nel tarball;

  2. ns-3-dev: un modulo simile, ma che utilizza il codice dell'albero di sviluppo;

  3. ns-allinene-3.29: un modulo che include altre funzionalità aggiuntive come Click routing e Network Simulation Cradle, Openflow per ns-3.

  4. ns-3-allineone: simile alla versione release del modulo tutto in uno, ma per il codice di sviluppo.

Nota
Clicchi — architettura software modulare per la creazione di router.

Openflow è un protocollo per la gestione del processo di elaborazione dei dati trasmessi su una rete dati da router e switch, implementando la tecnologia di rete definita dal software.

L'attuale istantanea di sviluppo (non rilasciata) ns-3 può essere trovata all'indirizzo:https://gitlab.com/nsnam/ns-3-dev.git.

Gli sviluppatori cercano di mantenere questi repository in condizioni di funzionamento coerenti, ma si trovano nell'area di sviluppo e contengono codice non rilasciato, quindi se non prevedi di utilizzare nuove funzionalità, seleziona la versione ufficiale.

Puoi trovare la versione più recente del codice sfogliando l'elenco dei repository o andando alla pagina web ns-3 Releases:https://www.nsnam.org/releases/ e facendo clic sul collegamento alla versione più recente. In questo esempio continueremo con ns-3.29.

Ora, per ottenere i componenti ns-3 di cui abbiamo bisogno, utilizzeremo lo strumento Infornare. Diciamo alcune parole introduttive sul lavoro Infornare.

Bake funziona caricando i sorgenti dei pacchetti in una directory source e installando le librerie nella directory build. Infornare può essere eseguito facendo riferimento al binario, ma se si desidera eseguire Infornare non dalla directory in cui è stato scaricato, è consigliabile aggiungere il percorso a infornare al tuo percorso (variabile d'ambiente PATH), ad esempio come segue (esempio per la shell bash di Linux). Vai alla directory "bake" e quindi imposta le seguenti variabili di ambiente:

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

Questo posizionerà il programma cuocere.py al percorso della shell e consentirà ad altri programmi di trovare gli eseguibili e le librerie che ha creato infornare. In alcuni casi d'uso infornare, l'impostazione PATH e PYTHONPATH descritta sopra non è richiesta, ma una build completa di ns-3-allinone (con pacchetti aggiuntivi) solitamente la richiede.

Vai alla tua directory di lavoro e inserisci quanto segue nella console:

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

Successivamente chiederemo Infornare controlliamo se abbiamo abbastanza strumenti per caricare i vari componenti. Comporre:

$ ./bake.py check

Dovresti vedere qualcosa di simile al seguente:

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

In particolare, strumenti di upload come Mercurial, CVS, Git e Bazaar sono essenziali in questo passaggio poiché ci permettono di ottenere il codice. A questo punto, installa gli strumenti mancanti nel modo consueto per il tuo sistema (se sai come fare) o contatta l'amministratore di sistema per ricevere assistenza.

Successivamente, prova a scaricare il software:

$ ./bake.py download

il risultato dovrebbe essere qualcosa del tipo:

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

Ciò significherà che sono state scaricate tre fonti. Ora vai nella directory dei sorgenti e digita ls; Tu dovresti vedere:

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

Ora sei pronto per creare la distribuzione ns-3.

3.4 Assemblea ns-3

Come per il download di ns-3, esistono diversi modi per creare ns-3. La cosa principale che vogliamo sottolineare è che ns-3 è costruito utilizzando uno strumento di compilazione chiamato Wafdescritto sotto. La maggior parte degli utenti lavorerà con Waf, ma sono disponibili alcuni script utili per aiutarti a iniziare o a organizzare build più complesse. Quindi, per favore, prima di leggere Waf, dare un'occhiata a build.py e assemblaggio con infornare.

3.4.1 Costruire con build.py

Attenzione! Questo passaggio di creazione è disponibile solo dalla versione dell'archivio sorgente ottenuta come descritto sopra; e non scaricato tramite git o bake.

Quando si lavora con un archivio di rilascio tarballIn ns-3-allineone C'è un pratico script che può facilitare l'assemblaggio dei componenti. Si chiama build.py. Questo programma imposterà il progetto per te nel modo più utile. Tuttavia, tieni presente che la configurazione e il lavoro più avanzati con ns-3 di solito implicano l'utilizzo del sistema di compilazione di ns-3, Waf, che verrà introdotto più avanti in questo tutorial.

Se hai scaricato utilizzando tarball, quindi nella tua directory ~/spazio di lavoro una directory con un nome simile a ns-allinene-3.29. Digita il seguente:

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

Quando chiamato build.py Abbiamo utilizzato gli argomenti della riga di comando per creare gli esempi e i test utilizzati in questo tutorial, che non sono creati per impostazione predefinita in ns-3. Per impostazione predefinita, il programma crea anche tutti i moduli disponibili. Quindi, se lo desideri, puoi creare ns-3 senza esempi e test, oppure escludere moduli che non sono necessari per il tuo lavoro.

Vedrai molti messaggi di output del compilatore visualizzati dallo script mentre costruisce le varie parti che hai caricato. Per prima cosa lo script proverà a costruire l'animatore netanim, quindi il generatore di associazione pybindgen e infine ns-3. Una volta completato il processo, dovresti vedere quanto segue:

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

Nelle ultime tre righe dell'elenco vediamo un messaggio relativo ai moduli che non sono stati compilati:

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

Ciò significa semplicemente che alcuni moduli ns-3 che dipendono da librerie esterne potrebbero non essere stati creati o che non è necessario che siano creati per questa configurazione. Ciò non significa che il simulatore non è assemblato o che i moduli assemblati non funzioneranno correttamente.

3.4.2 Costruire con Bake

Se hai utilizzato bake sopra per ottenere il codice sorgente dai repository del progetto, puoi continuare a utilizzarlo per creare ns-3. Comporre:

$ ./bake.py build

e dovresti vedere qualcosa del tipo:

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

aiutare: puoi anche eseguire contemporaneamente sia il download che la creazione chiamando "bake.py deploy".

L'assemblaggio di tutti i componenti potrebbe non riuscire, ma l'assemblaggio continuerà se un componente non è richiesto. Ad esempio, un recente problema di portabilità è stato quello castxml può essere assemblato tramite strumento infornare non su tutte le piattaforme. In questo caso apparirà un messaggio come questo:

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

tuttavia castxml necessario solo se desideri creare collegamenti Python aggiornati. Per la maggior parte degli utenti non ce n'è bisogno (almeno finché non cambiano ns-3), quindi per ora tali avvisi possono essere tranquillamente ignorati.

Se fallisce, il seguente comando ti darà un suggerimento sulle dipendenze mancanti:

$ ./bake.py show

Verranno elencate le varie dipendenze dei pacchetti che stai tentando di creare.

3.4.3 Costruisci con Waf

Fino a questo punto, per iniziare a costruire ns-3, abbiamo utilizzato lo script build.pyo strumento infornare. Questi strumenti sono utili per creare ns-3 e mantenere le librerie. Infatti, per costruire eseguono lo strumento di compilazione Waf dalla directory ns-3. Waf installato con il codice sorgente ns-3. La maggior parte degli utenti passa rapidamente all'utilizzo diretto per configurare e assemblare l'ns‑3 Waf. Quindi, per continuare, vai alla directory ns-3 creata originariamente.

Questo non è strettamente necessario in questo momento, ma sarà utile tornare un po' indietro e vedere come apportare modifiche alla configurazione del progetto. Probabilmente la modifica di configurazione più utile che puoi apportare è creare una versione ottimizzata del codice. Per impostazione predefinita, hai configurato il tuo progetto per creare una versione di debug. Diamo un'occhiata a un progetto per creare una build ottimizzata. Per spiegare a Waf che dovrebbe realizzare build ottimizzate che includano esempi e test, sarà necessario eseguire i seguenti comandi:

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

Questo lancerà Waf fuori dalla directory locale (per comodità). Il primo comando ripulisce dalla build precedente, questo solitamente non è strettamente necessario, ma è buona pratica (vedi anche i profili di build sotto); questo eliminerà le librerie create in precedenza e i file oggetto situati nella directory costruire /. Quando il progetto viene riconfigurato e il sistema di compilazione controlla le varie dipendenze, dovresti vedere un output simile al seguente:

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)

Si prega di notare l'ultima parte dell'elenco sopra. Alcune opzioni ns-3 non sono abilitate per impostazione predefinita o richiedono il supporto del sistema per funzionare correttamente. Ad esempio, per abilitare XmlTo, la libreria deve essere presente nel sistema libxml-2.0. Se questa libreria non è stata trovata e la corrispondente funzione ns-3 non è stata abilitata, verrà visualizzato un messaggio. Si noti inoltre che è possibile utilizzare il comando sudo per impostare il bit suid "imposta ID gruppo in fase di esecuzione" per determinati programmi. Non è abilitata per impostazione predefinita e pertanto questa funzione appare come "non abilitata". Infine, per ottenere un elenco delle opzioni abilitate, utilizzare Waf con parametro --check-config.

Ora torniamo indietro e torniamo alla build di debug contenente esempi e test.

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

Il sistema di compilazione è ora configurato e puoi creare versioni di debug dei programmi ns-3 semplicemente digitando:

$ ./waf

I passaggi precedenti potrebbero averti costretto a creare parte del sistema ns-3 due volte, ma ora sai come modificare la configurazione e creare codice ottimizzato.

Per verificare quale profilo è attivo per una determinata configurazione di progetto, esiste un comando:

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

Lo scenario di cui sopra build.py supporta anche le argomentazioni --enable-examples и --enable-tests, ma altre opzioni Waf non supporta direttamente. Ad esempio, questo non funzionerà:

$ ./build.py --disable-python

la reazione sarà questa:

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

Tuttavia, è possibile utilizzare l'operatore speciale - - per passare parametri aggiuntivi tramite wafquindi invece di quanto sopra funzionerà il seguente comando:

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

perché genera il comando principale ./waf configure --disable-python. Ecco alcuni suggerimenti introduttivi su Waf.

Gestione degli errori di compilazione

Le versioni ns-3 sono testate sugli ultimi compilatori C++ disponibili al momento del rilascio sulle comuni distribuzioni Linux e MacOS. Tuttavia, nel tempo, vengono rilasciate nuove distribuzioni con nuovi compilatori e questi compilatori più recenti tendono ad essere più pedanti riguardo agli avvisi. ns-3 configura la sua build per trattare tutti gli avvisi come errori, quindi a volte se stai eseguendo una versione precedente su un sistema più recente, un avviso del compilatore potrebbe interrompere la build.

Ad esempio, in precedenza esisteva una versione di ns‑3.28 per Fedora 28, che includeva una nuova versione principale gcc (gcc-8). Compilando la versione ns-3.28 o versioni precedenti sotto Fedora 28, con Gtk2+ installato, si verificherà il seguente errore:

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

Nelle versioni a partire da ns‑3.28.1, in Waf è disponibile un'opzione per risolvere questi problemi. Disabilita l'impostazione del flag "-Werror" in g++ e clang++. Questa è l'opzione "--disable-werror" e deve essere applicata durante la configurazione:

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

Configura o assembla

Alcuni comandi Waf hanno significato solo nella fase di configurazione e alcuni sono validi solo nella fase di compilazione. Ad esempio, se desideri utilizzare le funzionalità di emulazione ns-3, puoi abilitare l'impostazione bit suid utilizzando sudo, come descritto sopra. Ciò sovrascriverà i comandi della fase di configurazione e quindi potrai modificare la configurazione utilizzando il comando seguente, che include anche esempi e test.

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

Se lo fai Waf verrà lanciato sudoper modificare i programmi di creazione del socket del codice di emulazione in modo che vengano eseguiti con autorizzazioni radice. In Waf Sono disponibili molte altre opzioni per la configurazione e i passaggi di creazione. Per esplorare le tue opzioni, inserisci:

$ ./waf --help

Nella prossima sezione utilizzeremo alcune opzioni relative ai test.

Profili di assemblaggio

Abbiamo già visto come è possibile configurarlo Waf per le assemblee mettere a punto и ottimizzati:

$ ./waf --build-profile=debug

È presente anche un profilo di montaggio intermedio, rilasciare. Opzione -d è sinonimo di --build-profile. Il profilo di build controlla l'uso di registrazione, asserzioni e opzioni di ottimizzazione del compilatore:

Tutorial sul simulatore di rete ns-3. capitolo 3

Come puoi vedere, la registrazione e le asserzioni sono disponibili solo nelle build di debug. La pratica consigliata è sviluppare lo script in modalità debug, quindi eseguire esecuzioni ripetute (per statistiche o modifiche dei parametri) in un profilo di build ottimizzato.

Se disponi di codice che deve essere eseguito solo in determinati profili di build, utilizza 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;)

Di default Waf inserisce gli artefatti di build nella directory build. È possibile specificare una directory di output diversa utilizzando l'opzione - -out, ad esempio:

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

Combinandolo con i profili di build, puoi passare facilmente tra diverse opzioni di compilazione:

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

Ciò consente di lavorare con più assiemi senza dover riscrivere ogni volta l'ultimo assieme. Quando passi a un altro profilo, Waf compilerà solo quello, senza ricompilare completamente il tutto.

Quando cambi i profili di build in questo modo, devi fare attenzione a fornire ogni volta le stesse opzioni di configurazione. La definizione di diverse variabili d'ambiente ti aiuterà a evitare errori:

$ 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

Compilatori e flag

Negli esempi sopra Waf per creare ns-3 utilizza il compilatore C++ di GCC ( g ++). Tuttavia, puoi cambiare quello che usi Waf Compilatore C++, definendo la variabile di ambiente CXX. Ad esempio, per utilizzare il compilatore C++ Clang, clang++,

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

Allo stesso modo puoi configurare Waf utilizzare la compilazione distribuita utilizzando distcc:

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

Maggiori informazioni su distcc e sulla compilazione distribuita possono essere trovate sulla pagina del progetto nella sezione Documentazione. Per aggiungere flag del compilatore durante la configurazione di ns-3, utilizzare la variabile di ambiente CXXFLAGS_EXTRA.

Installazione

Waf può essere utilizzato per installare le librerie in diversi punti del sistema. Per impostazione predefinita, le librerie compilate e gli eseguibili si trovano nella directory costruiree poiché Waf conosce la posizione di queste librerie ed eseguibili, non è necessario installare le librerie altrove.

Se gli utenti preferiscono eseguire l'installazione all'esterno della directory di build, possono eseguire il comando ./waf installa. Il prefisso predefinito per l'installazione è / Usr / localCosì ./waf installa installerà i programmi in / Usr / local / bin, biblioteche in / Usr / local / lib e file di intestazione in /usr/local/include. I diritti di superutente di solito devono essere impostati con un prefisso predefinito, quindi sarebbe un comando tipico sudo ./waf install. Una volta avviato, Waf sceglierà innanzitutto di utilizzare le librerie condivise nella directory di build, quindi cercherà le librerie lungo il percorso delle librerie configurate nell'ambiente locale. Pertanto, quando si installano le librerie su un sistema, è buona pratica verificare che vengano utilizzate le librerie giuste. Gli utenti possono scegliere di installare con un prefisso diverso passando l'opzione durante la configurazione --prefix, ad esempio:

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

Se successivamente, dopo la compilazione, l'utente immette il comando di installazione ./waf, verrà utilizzato il prefisso /opt/locale.

Squadra ./waf clean deve essere utilizzato prima di riconfigurare il progetto se l'installazione lo utilizzerà Waf sotto un prefisso diverso.

Pertanto, per utilizzare ns-3 non è necessario chiamare ./waf install. La maggior parte degli utenti non avrà bisogno di questo comando perché Waf preleverà le librerie correnti dalla directory build, ma alcuni utenti potrebbero trovarlo utile se le loro attività implicano l'utilizzo di programmi esterni alla directory ns-3.

Waf singolo

Al livello più alto dell'albero dei sorgenti di ns-3, è presente un solo script Waf. Una volta che inizi a lavorare, trascorrerai molto tempo nella directory scratch/ o più in profonditàsrc/... e allo stesso tempo devono correre Waf. Puoi semplicemente ricordare dove sei e scappare Waf следующим обрахом:

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

ma questo sarà noioso e soggetto a errori, quindi ci sono soluzioni migliori. Un modo comune è utilizzare un editor di testo come emacs o vim, in cui vengono aperte due sessioni terminali, una viene utilizzata per creare ns-3 e la seconda viene utilizzata per modificare il codice sorgente. Se solo hai tarball, allora una variabile d'ambiente può aiutare:

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

$ cd scratch 
$ waff build

Nella directory del modulo potrebbe essere forte la tentazione di aggiungere un banale script waf come exec ../../waf. Per favore, non farlo. Questo crea confusione per i principianti e, se fatto male, porta a errori di compilazione difficili da rilevare. Le soluzioni mostrate sopra rappresentano il percorso da utilizzare.

3.5 Test di ns-3

È possibile eseguire gli unit test della distribuzione ns-3 eseguendo lo script ./prova.py:

$ ./test.py

Questi test vengono eseguiti parallelamente a Waf. Alla fine dovresti vedere un messaggio che dice:

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

Questo è un messaggio importante per identificare arresti anomali, arresti anomali o errori di valgrind, indicando problemi con il codice o incompatibilità tra strumenti e codice.

Vedrai anche l'output finale di Waf e un tester che esegue ogni test, che sarà simile a questo:

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)

Questo comando viene solitamente eseguito dagli utenti per verificare rapidamente che la distribuzione ns-3 sia creata correttamente. (Nota che l'ordine delle righe "PASS: ..." può essere diverso, questo è normale. Ciò che è importante è che la riga di riepilogo alla fine del rapporto mostri che tutti i test sono stati superati; nessun test ha fallito o si è bloccato.) E WafE prova.py parallelizzerà il lavoro tra i core del processore disponibili della macchina.

3.6 Esecuzione dello script

Di solito eseguiamo gli script sotto controllo Waf. Ciò consente al sistema di compilazione di garantire che i percorsi delle librerie condivise siano impostati correttamente e che le librerie siano disponibili in fase di runtime. Per eseguire il programma, utilizzare semplicemente Waf con parametro - -run. Eseguiamo l'equivalente ns-3 dell'onnipresente programma ciao mondodigitando quanto segue:

$ ./waf --run hello-simulator

Waf controllerà innanzitutto che il programma sia costruito correttamente e lo costruirà se necessario. Poi Waf eseguirà un programma che produce il seguente output.

Hello Simulator

Congratulazioni! Ora sei un utente ns-3!

Cosa devo fare se non vedo risultati?

Se vedi i messaggi Wafindicando che la compilazione è stata completata correttamente, ma non vedi l'output "Ciao simulatore", allora c'è la possibilità che nella sezione [Build-with-Waf] tu abbia cambiato la modalità di creazione ottimizzati, ma non è stato possibile tornare alla modalità mettere a punto. Tutto l'output della console utilizzato in questo tutorial utilizza uno speciale componente ns-3 che esegue la registrazione e viene utilizzato per stampare messaggi personalizzati sulla console. L'output di questo componente viene automaticamente disabilitato quando viene compilato il codice ottimizzato: è "ottimizzato". Se non vedi l'output "Hello Simulator", inserisci quanto segue:

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

personalizzare Waf per creare versioni di debug dei programmi ns-3, che includono esempi e test. Dovresti quindi ricostruire la versione di debug corrente del codice digitando

$ ./waf

Ora se esegui il programma ciao-simulatore, dovresti vedere il risultato atteso.

3.6.1 Argomenti della riga di comando

Per passare gli argomenti della riga di comando al programma ns-3, utilizzare il seguente schema:

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

Sostituire al nome del programma e agli argomenti. Discussione - -command-template per Waf è essenzialmente una ricetta per costruire la riga di comando vera e propria Waf utilizzato per eseguire il programma. Waf verifica che la compilazione sia completa, imposta i percorsi della libreria condivisa, quindi utilizza il modello di riga di comando fornito e sostituisce il nome del programma con il segnaposto %s per chiamare l'eseguibile. Se trovi complicata questa sintassi, esiste una versione più semplice che coinvolge il programma ns-3 e i suoi argomenti racchiusi tra virgolette singole:

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

Un altro esempio particolarmente utile è l'esecuzione selettiva delle suite di test. Supponiamo che esista una suite di test chiamata mytest (in realtà non esiste). Sopra abbiamo utilizzato lo script ./test.py per eseguire una serie di test in parallelo, che richiama ripetutamente il programma di test corridore. Chiamata corridore direttamente per eseguire un test:

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

Gli argomenti verranno passati al programma corridore. Poiché mytest non esiste, verrà generato un messaggio di errore. Per stampare le opzioni del test runner disponibili, immettere:

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

3.6.2 Debug

Per eseguire i programmi ns-3 con un'altra utilità, come un debugger (ad esempio, gdb) o uno strumento di test della memoria (ad esempio, valgrind), utilizzare una forma simile - -command-template = "…". Ad esempio, per eseguire nel debugger gdb il tuo programma hello-simulator ns-3 con argomenti:

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

Tieni presente che il nome del programma ns-3 viene fornito con l'argomento - -rune l'utilità di gestione (qui gdb) è il primo token nell'argomento - -command-template. Opzione - -args rapporti gdbche il resto della riga di comando appartiene al programma "inferiore". (Alcune versioni gdb non capisco l'opzione - -args. In questo caso, rimuovere gli argomenti del programma da - -command-template e utilizzare il set di comandi gdb args.) Possiamo combinare questa ricetta e quella precedente per eseguire il test sotto il debugger:

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

3.6.3 Directory di lavoro

Waf dovrebbe essere lanciato dalla sua posizione in cima all'albero ns-3. Questa cartella diventa la directory di lavoro in cui verranno scritti i file di output. Ma cosa succede se si desidera mantenere questi file all'esterno dell'albero dei sorgenti ns-3? Usa l'argomentazione - -cwd:

$ ./waf --cwd=...

Potrebbe essere più conveniente ottenere i file di output nella directory di lavoro. In questo caso, la seguente azione indiretta può aiutare:

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

Questa decorazione della versione precedente del comando preserva la directory di lavoro corrente, va alla directory Wafe poi istruisce Waf per riportare la directory di lavoro alla directory di lavoro corrente salvata prima di avviare il programma. Citiamo la squadra - -cwd Per completezza, la maggior parte degli utenti esegue semplicemente Waf dalla directory di livello superiore e genera lì i file di output.

Continua: Capitolo 4

Fonte: habr.com

Aggiungi un commento