Tutorial di simulatore di rete ns-3. Capitulu 3

Tutorial di simulatore di rete ns-3. Capitulu 3
capitulu 1,2

3 Principià
3.1 Panoramica
3.2 Prerequisites
3.2.1 Scaricatu a versione ns-3 cum'è un archiviu fonte
3.3 Scaricatu ns-3 cù Git
3.3.1 Loading ns-3 usendu Bake
3.4 Assemblea ns-3
3.4.1 Custruì cù build.py
3.4.2 Custruisce cù Bake
3.4.3 Custruite cù Waf
3.5 Testing ns-3
3.6 Esecuzione di u script
3.6.1 Argumenti di linea di cumanda
3.6.2 Debugging
3.6.3 Directory di travagliu

Capitulu 3

Cumminciate

Stu capitulu hè destinatu à preparà u lettore per cumincià cù un urdinatore chì ùn hà mai installatu ns-3. Copre piattaforme supportate, prerequisiti, cumu uttene ns-3, cumu custruisce ns-3, è cumu pruvà a vostra custruzione è eseguisce prugrammi simplici.

3.1 Panoramica

U simulatore ns-3 hè custruitu cum'è un sistema di biblioteche di software in cullaburazione. Durante l'assemblea, u codice di i prugrammi d'utilizatori hè ligatu cù queste librerie. I linguaggi di prugrammazione C++ o Python sò usati per scrive prugrammi persunalizati.

Ns-3 hè distribuitu cum'è codice fonte, chì significa chì u sistema di destinazione deve avè un ambiente di sviluppu di software per pudè prima custruisce e librerie è poi custruisce u prugramma d'utilizatore. In principiu, ns-3 puderia esse distribuitu cum'è biblioteche pronti per un sistema specificu, è in u futuru ponu esse distribuiti in questu modu. Ma oghje parechji utilizatori facenu veramente u so travagliu editendu ns-3 stessu, cusì hè utile avè u codice fonte per custruisce e librerie. Se qualchissia vulete piglià u travagliu di creà biblioteche è pacchetti pronti per i sistemi operativi, per piacè cuntattate a lista di mailing. ns-sviluppatori.

In seguitu, fighjemu trè manere di scaricà è di custruisce ns-3. U primu hè di scaricà è di custruisce a versione ufficiale da u situ principale. U sicondu hè a selezzione è l'assemblea di copie di versioni di sviluppu di a stallazione basica ns-3. U terzu hè di utilizà strumenti di creazione supplementari per carricà più estensioni per ns-3. Passeremu per ognunu postu chì l'arnesi sò un pocu diffirenti.

L'utilizatori Linux sperimentati ponu dumandassi perchè ns-3 ùn hè micca furnitu cum'è un pacchettu cum'è a maiò parte di l'altri biblioteche chì utilizanu un gestore di pacchetti? Ancu s'ellu ci sò pacchetti binari per diverse distribuzioni Linux (per esempiu, Debian), a maiò parte di l'utilizatori finiscinu per edità e librerie è avè da ricustruisce ns-3 elli stessi, cusì avè u codice fonte dispunibule hè utile. Per questu mutivu, avemu da fucalizza nantu à a stallazione da a fonte.

Per a maiò parte di l'applicazioni diritti ns-3 ràdica ùn sò micca necessariu, hè cunsigliatu di utilizà un contu d'utilizatore senza privilege.

3.2 Prerequisites

L'inseme tutale di biblioteche ns-3 dispunibuli hà una quantità di dipendenze nantu à biblioteche di terze parti, ma per a maiò parte ns-3 pò esse custruitu è ​​​​usatu cù supportu per parechji cumpunenti cumuni (spessu installati per difettu): un compilatore C++, Python, un editore di codice fonte (per esempiu, vim, emacs o eclissi) è, se i repositori di sviluppu sò usati, sistemi di cuntrollu di versione Git. A maiò parte di l'utilizatori per a prima volta ùn anu micca bisognu di preoccupassi se a so cunfigurazione informa chì alcune funzioni avanzate ns-3 mancanu, ma per quelli chì volenu una stallazione completa, u prughjettu furnisce una wiki chì include pagine cù assai cunsiglii è trucchi utili. Una tale pagina hè a pagina di Installazione, cù l'istruzzioni di stallazione per diversi sistemi, dispunibule à: https://www.nsnam.org/wiki/Installation.

A sezione Prerequisiti di sta wiki spiega quali pacchetti sò richiesti per supportà l'opzioni ns-3 cumuni è furnisce ancu i cumandamenti utilizati per installallu nantu à i sapori cumuni di Linux o macOS.

Pudete prufittà di sta opportunità per esplorà a pagina wiki ns-3 o u situ web principale: https://www.nsnam.org, perchè ci hè assai infurmazione. Partendu cù l'ultima versione di ns-3 (ns-3.29), i seguenti strumenti sò necessarii per eseguisce ns-3:

Tool Package / Versione

  • compilatore C++
    clang++ o g++ (g++ versione 4.9 o superiore)
  • pitone
    versione python2>= 2.7.10, o versione python3>=3.4
  • Git
    qualsiasi ultima versione (per accede à ns-3 in GitLab.com)
  • ta
    qualsiasi ultima versione (per unpacking ns‑3 release)
  • bunzip2
    qualsiasi versione più recente (per sballà a versione ns‑3)

Per verificà a versione predeterminata di Python, scrivite python -V. Per verificà a versione g++, scrivite g++ -v. Se ci sò strumenti mancanti o troppu vechji, fate riferimentu à a guida d'installazione nantu à a pagina wiki ns-3.

Da avà, assumemu chì u lettore hè in esecuzione Linux, MacOS, o un emulatore Linux, è hà almenu l'arnesi sopra.

3.2.1 Scaricatu a versione ns-3 cum'è un archiviu fonte

Questu hè u cursu di l'azzione per un novu utilizatore chì vole scaricà è sperimentà cù l'ultime versioni di liberazione è di pacchettu di ns-3. I versioni ns-3 sò publicati cum'è archivi di fonte cumpressi, qualchì volta chjamati tarball. tarball hè un furmatu d'archiviu di software speciale in quale parechji schedari sò cumminati. L'archiviu hè generalmente cumpressu. ns-3 prucessu di boot via tarball hè simplice, basta à selezziunà una liberazione, scaricà è unpack it.

Assumimu chì voi, cum'è utilizatore, vulete custruisce ns-3 in un repertoriu lucale chjamatu spaziu di travagliu. Pudete ottene una copia di travagliu di a liberazione inserendu i seguenti in a cunsola Linux (sustituendu i numeri di versione appropritati, sicuru)

$ 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 

Prestate attenzione à l'utilità utilizata sopra wget, chì hè un strumentu di linea di cumanda per scaricà l'uggetti da Internet. Se ùn avete micca stallatu, pudete aduprà u vostru navigatore per questu.

Dopu sti passi vi purterà à u cartulare ns-allinone-3.29, ci duvete vede parechji schedari è cartulari.

$ 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

Avà site prontu à custruisce a distribuzione di basa ns-3 è pudete passà à a sezione nantu à a custruzione ns-3.

3.3 Scaricatu ns-3 cù Git

U codice ns-3 hè dispunibule in i repositori Git in GitLab.com à https://gitlab.com/nsnam/. gruppu nsnam riunisce i diversi repositori utilizati da un prughjettu open source.

U modu più faciule per cumincià à utilizà i repositori Git hè di furchetta o clone l'ambiente ns-3-allinone. Questu hè un inseme di script chì gestisce a carica è l'assemblea di i sottosistemi ns-3 più cumunimenti utilizati. Sè vo site novu in Git, i termini "furchetta" è "clone" pò esse micca cunnisciutu per voi; se sì, ricumandemu di simplificà clone (fate a vostra propria copia) u repository situatu in GitLab.com cusì:

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

À questu stadiu, a vista di u vostru annuariu ns-3-allinone un pocu sfarente da u repertoriu di l'archiviu di liberazione descrittu sopra. Duverebbe vede qualcosa cum'è questu:

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

Per piacè nutate chì ci hè un script download.py, chì extrarà in più ns-3 è u codice fonte accumpagnatu. Quì avete una scelta: o scaricate l'ultime snapshot di sviluppu ns-3:

$ python download.py

o preferite a liberazione ns-3 cù a bandiera -n per indicà u numeru di liberazione:

$ python download.py -n ns-3.29

Dopu stu passu à u cartulare ns-3-allinone repositori supplementari seranu scaricati ns-3, coce, pybindgen и netanim.

Vita
In una macchina cù Ubuntu16.04 pulita, avia bisognu di cambià u cumandamentu à questu: $ sudo python3 download.py -n ns-3.29 (di seguito note del traduttore).

3.3.1 Loading ns-3 usendu Bake

I dui metudi sopra (archive source o repository ns-3-allinone via Git) sò utili per uttene l'installazione ns-3 più simplice cù parechji addons (pybindgen per generà associazioni Python è netanim per l'animazione di rete). U terzu repositoriu furnitu per difettu in ns-3-allinone hè chjamatu coce.

Cuoce hè un strumentu per a custruzione coordinata di software da parechji repositori, sviluppatu per u prughjettu ns-3. Cuoce pò esse usatu per ottene versioni di sviluppu di ns-3, è ancu per scaricà è custruisce estensioni di a versione di basa di a distribuzione ns-3, cum'è l'ambiente. Esecuzione diretta di codice, CradleNetwork Simulation Cradle, l'abilità di creà novi ligami Python è diverse ns-3 "app".

Vita
CradleNetwork Simulation Cradle hè un framework chì permette di utilizà pile di rete TCP / IP reali in un simulatore di rete.

Se aspettate chì a vostra installazione ns-3 hà caratteristiche avanzate o supplementari, pudete seguità sta strada di installazione.

In l'ultime versioni ns-3 Cuoce hè statu aghjuntu à a liberazione di tar. A liberazione include un schedariu di cunfigurazione chì permette di scaricà e versioni di u software attuale à u mumentu di a liberazione. Questu hè, per esempiu, a versione Cuoce, chì hè distribuitu cù a liberazione ns-3.29, pò esse usata per ricuperà cumpunenti per quella liberazione di ns-3 o prima, ma ùn pò micca esse usata per ricuperà cumpunenti per versioni successive (se u schedariu di descrizzione di u pacchettu). bakeconf.xml micca aghjurnatu).

Pudete ancu ottene l'ultima copia coceinserendu u cumandimu seguitu in a vostra cunsola Linux (assumendu chì avete Git installatu):

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

Quandu eseguite u cumandamentu git, duvete vede qualcosa cum'è questu:

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.

Dopu à u cumandamentu cumpleta clonazzioni duvete avè un repertoriu chjamatu coce, u cuntenutu di u quale deve esse simile à questu:

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

Nota chì avete caricatu parechji script Python, un modulu Python chjamatu coce è un schedariu di cunfigurazione XML. U prossimu passu hè di utilizà sti script per scaricà è custruisce a distribuzione ns-3 di a vostra scelta. Diversi obiettivi di persunalizazione sò dispunibili:

  1. ns-3.29: modulu chì currisponde à a liberazione; scaricarà cumpunenti simili à a liberazione in u tarball;

  2. ns-3-dev: un modulu simili, ma cù u codice da l'arburu di sviluppu;

  3. ns-allinone-3.29: Un modulu chì include altre funzioni supplementari cum'è Click routing è Network Simulation Cradle, Openflow per ns-3.

  4. ns-3-allinone: simile à a versione di liberazione di u modulu allinone, ma per u codice di sviluppu.

Vita
Clicca - architettura di software modulare per a creazione di routers.

Openflow hè un protokollu per a gestione di u prucessu di trasfurmazioni di dati trasmessi nantu à una rete di dati da routers è switches, implementendu a tecnulugia di rete definita da u software.

L'attuale snapshot di sviluppu (non-release) ns-3 pò esse truvata à:https://gitlab.com/nsnam/ns-3-dev.git.

I sviluppatori pruvate à mantene questi repositori in un ordine di travagliu coherente, ma sò in l'area di sviluppu è cuntenenu codice inedite, perchè se ùn avete micca pensatu à aduprà novi funziunalità, allora selezziunate a versione ufficiale.

Pudete truvà l'ultima versione di u codice navigendu in a lista di repository, o andendu à a pagina web ns-3 Releases:https://www.nsnam.org/releases/ è cliccate nant'à u ligame di l'ultima versione. In questu esempiu continueremu cù ns-3.29.

Avà, pè ottene i cumpunenti ns-3 avemu bisognu, avemu aduprà u strumentu Cuoce. Dicemu uni pochi di parolle introduttive nantu à u travagliu Cuoce.

Bake travaglia carchendu e fonti di pacchettu in un cartulare surghjenti è installendu e librerie in u cartulare di custruzzione. Cuoce pò esse eseguitu da riferimentu à u binariu, ma se vulete eseguisce Cuoce micca da u repertoriu in u quale hè statu telecaricatu, hè cunsigliu per aghjunghje a strada coce à u vostru percorsu (variabile d'ambiente PATH), per esempiu cum'è seguita (esempiu per Linux bash shell). Andate à u cartulare "bake" è dopu stabilisce e seguenti variabili di l'ambiente:

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

Stu metterà u prugramma coccia.py à u percorsu di a cunchiglia è permetterà à altri prugrammi di truvà l'eseguibili è e librerie chì hà creatu coce. In certi casi di usu coce, l'impostazione PATH è PYTHONPATH descritta sopra ùn hè micca necessariu, ma una custruzzione cumpleta di ns-3-allinone (cù pacchetti supplementari) generalmente ne richiede.

Andate à u vostru cartulare di travagliu è inserite i seguenti in a cunsola:

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

Dopu avemu da dumandà Cuoce verificate s'ellu avemu abbastanza arnesi per carricà i diversi cumpunenti. Dial:

$ ./bake.py check

Duvete vede qualcosa cum'è questu:

> 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 particulare, l'arnesi di carica cum'è Mercurial, CVS, Git è Bazaar sò indispensabili in questu passu perchè ci permettenu di ottene u codice. À questu puntu, installate l'arnesi mancanti in u modu di solitu per u vostru sistema (se sapete cumu) o cuntattate u vostru amministratore di sistema per aiutu.

Dopu, pruvate à scaricà u software:

$ ./bake.py download

u risultatu deve esse qualcosa cum'è:

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

Questu significarà chì trè fonti sò stati scaricati. Avà andate à u cartulare fonte è scrivite ls; Duvete vede:

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

Avà site prontu à custruisce a distribuzione ns-3.

3.4 Assemblea ns-3

Cum'è cù u scaricamentu di ns-3, ci sò parechje manere di custruisce ns-3. A cosa principal chì vulemu enfatizà hè chì ns-3 hè custruitu cù un strumentu di creazione chjamatu Wafdescrittu quì sottu. A maiò parte di l'utilizatori travaglià cù Waf, ma ci sò uni pochi di script pratichi per aiutà à inizià o urganizà custruzzioni più cumplessi. Allora per piacè, prima di leghje Waf, fighjate custruì.py è assemblea cun coce.

3.4.1 Custruì cù build.py

Attenzione! Stu passu di custruzzione hè dispunibule solu da a versione di l'archiviu fonte ottenuta cum'è descritta sopra; è micca scaricatu via git o bake.

Quandu travaglia cù un archiviu di liberazione tarballin ns-3-allinone Ci hè un script praticu chì pò facilità l'assemblea di i cumpunenti. Hè chjamatu build.py. Stu prugramma hà stallatu u prugettu per voi in u modu più utile. Tuttavia, nutate chì una configurazione più avanzata è u travagliu cù ns-3 generalmente implica l'usu di u sistema di creazione di ns-3, Waf, chì serà introduttu più tardi in stu tutoriale.

Sè avete scaricatu usendu tarball, dopu in u vostru cartulare ~/spaziu di travagliu un repertoriu cù un nome cum'è ns-allinone-3.29. Inserite i seguenti:

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

Quandu si chjama custruì.py Avemu usatu argumenti di linea di cummanda per custruisce l'esempii è i testi utilizati in stu tutoriale, chì ùn sò micca custruiti per difettu in ns-3. Per automaticamente, u prugramma crea ancu tutti i moduli dispunibili. Allora, se vulete, pudete custruisce ns-3 senza esempi è testi, o esclude moduli chì ùn sò micca necessariu per u vostru travagliu.

Puderete vede assai messagi di output di compilatore affissati da u script cum'è custruisce e diverse parti chì avete caricatu. Prima u script hà da pruvà à custruisce l'animatore netanim, dopu u generatore di ubligatoriu pybindgen è infine ns-3. Quandu u prucessu hè cumpletu, duvete vede i seguenti:

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

In l'ultimi trè linee di u listinu vedemu un messagiu nantu à i moduli chì ùn sò micca stati custruiti:

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

Questu significa solu chì certi moduli ns-3 chì dependenu di biblioteche esterne ùn sò micca stati custruiti, o chì ùn sò micca necessarii per esse custruitu per questa cunfigurazione. Questu ùn significa micca chì u simulatore ùn hè micca assemblatu o chì i moduli assemblati ùn viaghjanu micca bè.

3.4.2 Custruisce cù Bake

Se avete usatu bake sopra per uttene u codice fonte da i repositori di u prugettu, pudete cuntinuà à aduprà per custruisce ns-3. Dial:

$ ./bake.py build

è duvete vede qualcosa cum'è:

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

Suggerimentu: Pudete ancu fà tramindui u scaricamentu è custruisce i passi in una volta chjamendu "bake.py deploy".

L'assemblea di tutti i cumpunenti pò falla, ma l'assemblea continuarà se un cumpunente ùn hè micca necessariu. Per esempiu, un prublema di portabilità recente era questu castxml pò esse assemblatu da strumentu coce micca in tutte e piattaforme. In questu casu, apparirà un missaghju cum'è questu:

>> 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 solu necessariu s'è vo vulete creà ligami Python aghjurnati. Per a maiò parte di l'utilizatori ùn ci hè micca bisognu di questu (almenu finu à chì cambianu ns-3), cusì tali avvisi ponu esse ignorati in modu sicuru per avà.

Se falla, u cumandamentu seguente vi darà un suggerimentu nantu à e dipendenze mancanti:

$ ./bake.py show

E diverse dipendenze di i pacchetti chì pruvate di custruisce seranu listati.

3.4.3 Custruite cù Waf

Finu à questu puntu, per cumincià à custruisce ns-3, avemu usatu sia u script custruì.py, o strumentu coce. Questi strumenti sò utili per custruisce ns-3 è mantene e librerie. In fatti, per custruisce, eseguinu u strumentu di creazione Waf da u cartulare ns-3. Waf installatu cù u codice fonte ns-3. A maiò parte di l'utilizatori passanu rapidamente à l'usu direttu per cunfigurà è assemble u ns-3 Waf. Dunque, per cuntinuà, andate à u cartulare ns-3 chì avete creatu originariamente.

Questu ùn hè micca strettamente necessariu in questu mumentu, ma serà utile per retrocede un pocu è vede cumu fà cambiamenti à a cunfigurazione di u prugettu. Probabilmente u cambiamentu di cunfigurazione più utile chì pudete fà hè di creà una versione ottimizzata di u codice. Per automaticamente, avete cunfiguratu u vostru prughjettu per custruisce una versione di debug. Fighjemu un prughjettu per creà una custruzzione ottimizzata. Per spiegà à Waf chì deve fà custruzzioni ottimizzati chì includenu esempi è testi, avete bisognu di eseguisce i seguenti cumandamenti:

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

Questu serà lanciatu Waf fora di u cartulare locale (per a vostra comodità). U primu cumandamentu pulisce da a custruzzione precedente, questu ùn hè generalmente micca strettamente necessariu, ma hè una bona pratica (vede ancu i profili di custruisce quì sottu); questu eliminerà e biblioteche create prima è i fugliali d'ughjettu situati in u cartulare custruì/. Quandu u prugettu hè ricunfiguratu è u sistema di custruzzione verifica e diverse dipendenze, duvete vede output simili à i seguenti:

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)

Per piacè nutate l'ultima parte di a lista sopra. Alcune opzioni ns-3 ùn sò micca attivate per difettu o necessitanu supportu di u sistema per funziunà bè. Per esempiu, per attivà XmlTo, a biblioteca deve esse presente in u sistema libxml-2.0. Se sta libreria ùn hè stata truvata è a funzione ns-3 currispondente ùn hè micca attivata, un missaghju serà visualizatu. Innota ancu chì hè pussibule aduprà u cumandamentu sudo per stabilisce u bit suid "set group ID at runtime" per certi prugrammi. Ùn hè micca attivatu per difettu è per quessa sta funzione appare cum'è "micca attivata". Infine, per uttene una lista di l'opzioni attivate, utilizate Waf cun paràmetru --check-config.

Avà andemu in daretu è turnemu à a custruzione di debug chì cuntene esempi è testi.

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

U sistema di custruzzione hè avà stallatu è pudete custruisce versioni di debug di i prugrammi ns-3 semplicemente scrivendu:

$ ./waf

I passi sopra pò avè ubligatu à custruisce una parte di u sistema ns-3 duie volte, ma avà sapete cumu cambià a cunfigurazione è custruisce un codice ottimizatu.

Per verificà quale prufilu hè attivu per una cunfigurazione di prughjettu datu, ci hè un cumandamentu:

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

U scenariu sopra custruì.py sustene ancu l'argumenti --enable-examples и --enable-tests, ma altre opzioni Waf ùn sustene micca direttamente. Per esempiu, questu ùn funziona micca:

$ ./build.py --disable-python

a reazione serà cusì:

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

Tuttavia, l'operatore speciale - - pò esse usatu per passà paràmetri supplementari via wafdunque invece di quì sopra u cumandimu seguitu hà da travaglià:

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

perchè genera u cumandamentu principale ./waf configure --disable-python. Eccu alcuni più cunsiglii introduttivi Waf.

Gestisce l'errori di custruzzione

I versioni ns-3 sò pruvati nantu à l'ultimi compilatori C++ dispunibili à u mumentu di a liberazione in distribuzioni Linux è MacOS cumuni. In ogni casu, cù u tempu, e novi distribuzioni sò liberati cù novi compilatori, è questi compilatori novi tendenu à esse più pedanti nantu à l'avvirtimenti. ns-3 cunfigurà a so custruzzione per trattà tutti l'avvirtimenti cum'è errori, cusì qualchì volta se site una versione più vechja in un sistema più novu, un avvisu di compilatore pò piantà a custruzione.

Per esempiu, ci era prima una versione di ns-3.28 per Fedora 28, chì includeva una nova versione maiò. gcc (gcc-8). Custruendu a versione ns-3.28 o versioni precedenti sottu Fedora 28, cù Gtk2+ installatu, l'errore seguente accaderà:

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

In versioni chì partenu da ns-3.28.1, in Waf una opzione hè dispunibule per risolve questi prublemi. Disabilita l'impostazione di a bandiera "-Werror" in g++ è clang++. Questa hè l'opzione "--disable-werror" è deve esse applicata durante a cunfigurazione:

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

Cunfigurate o assemblà

Certi cumandamenti Waf anu significatu solu in a fase di cunfigurazione, è certi sò validi solu in a fase di creazione. Per esempiu, sè vo vulete usà e funzioni di emulazione ns-3, pudete attivà a paràmetra di bit sudu aduprendu sudo, cum'è descrittu sopra. Questu hà da annullà i cumandamenti di u passu di cunfigurazione, è cusì pudete cambià a cunfigurazione cù u cumandimu seguitu, chì include ancu esempi è testi.

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

Se fate questu Waf lancerà sudoper cambià i prugrammi di creazione di socket di codice di emulazione per eseguisce cù permessi ràdica. L' Waf Ci hè parechje altre opzioni dispunibili per a cunfigurazione è i passi di custruzzione. Per scopre e vostre opzioni, entre:

$ ./waf --help

In a sezione dopu, useremu alcune opzioni relative à a prova.

Profili di Assemblea

Avemu digià vistu cumu pudete cunfigurà Waf per l'assemblee leghjitoghji и ottimisata:

$ ./waf --build-profile=debug

Ci hè ancu un prufilu di assemblea intermediu, etichettatura. Opzione -d hè sinonimu di --build-profile. U prufilu di custruzzione cuntrolla l'usu di logging, assertions, è switches di ottimisazione di compilatore:

Tutorial di simulatore di rete ns-3. Capitulu 3

Comu pudete vede, u logu è l'affirmazioni sò dispunibili solu in e custruzzioni di debug. A pratica ricumandata hè di sviluppà u vostru script in modu di debug, poi eseguisce eseguimenti ripetuti (per statistiche o cambiamenti di parametri) in un prufilu di custruzzione ottimisatu.

Sè vo avete codice chì deve esse esecutatu solu in certi profili di creazione, utilizate a 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;)

Default, Waf i posti custruiscenu artefatti in u cartulare di custruzzione. Pudete specificà un cartulare di output differente usendu l'opzione - -out, per esempiu:

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

Cumminendu questu cù profili di creazione, pudete facilmente cambià trà e diverse opzioni di compilazione:

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

Chì permette di travaglià cù parechje assemblee senza avè da riscrive l'ultima assemblea ogni volta. Quandu si passa à un altru prufilu, Waf compilerà solu, senza recompilà tuttu.

Quandu cambiate i profili di custruisce in questu modu, avete bisognu à esse attentu à dà e stesse opzioni di cunfigurazione ogni volta. A definizione di parechje variabili di l'ambiente vi aiuterà à evità i sbagli:

$ 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 è bandiere

In l'esempii sopra Waf per custruisce ns-3 usa u compilatore C++ da GCC ( g ++). Tuttavia, pudete cambià quellu chì utilizate Waf Cumpilatore C++, definendu a variabile d'ambiente CXX. Per esempiu, per utilizà u compilatore C ++ Clang, clang++,

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

In u listessu modu, pudete cunfigurà Waf per utilizà a compilazione distribuita usendu distcc:

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

Più infurmazione nantu à distcc è a compilazione distribuita pò esse truvata nantu à a pagina di u prugettu in a sezione Documentazione. Per aghjunghje bandieri di compilatore quandu cunfigurà ns-3, utilizate a variabile d'ambiente CXXFLAGS_EXTRA.

rimarchevuli

Waf pò esse usatu per installà e biblioteche in diversi lochi di u sistema. Per automaticamente, e librerie compilate è eseguibili sò situati in u cartulare custruisce, è postu chì Waf cunnosci u locu di queste biblioteche è eseguibili, ùn ci hè bisognu di installà e librerie in altre locu.

Se l'utilizatori preferiscenu installà fora di u cartulare di custruzzione, ponu eseguisce u cumandamentu ./waf installà. U prefissu predeterminatu per a stallazione hè / usr / lucalehè per quessa ./waf installà installerà i prugrammi in / usr / local / bin, biblioteche in / usr / local / lib è i fugliali di header in /usr/local/include. I diritti di superuser generalmente devenu esse stabilitu cù un prefissu predeterminatu, cusì un cumandamentu tipicu seria sudo ./waf install. Quandu u lanciatu, Waf hà da sceglie prima di utilizà e biblioteche spartute in u cartulare di custruzzione, dopu cercà e biblioteche longu u percorsu à e biblioteche cunfigurate in l'ambiente lucale. Allora, quandu si stallanu biblioteche in un sistema, hè una bona pratica per verificà chì e librerie ghjustificate sò aduprate. L'utilizatori ponu sceglie di installà cù un prefissu sfarente passendu l'opzione durante a cunfigurazione --prefix, per esempiu:

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

Se dopu, dopu a custruzzione, l'utilizatore entra in u cumandimu di stallazione ./waf, u prefissu serà usatu / opt / locale.

squadra ./waf clean deve esse usatu prima di cunfigurà u prugettu se a stallazione hà da aduprà Waf sottu un prefissu differente.

Cusì, per utilizà ns-3 ùn ci hè micca bisognu di chjamà ./waf install. A maiò parte di l'utilizatori ùn anu micca bisognu di stu cumandamentu perchè Waf ripiglià e librerie attuali da u cartulare di custruzzione, ma alcuni utilizatori ponu truvà questu utile se e so attività implicanu travaglià cù prugrammi fora di u cartulare ns-3.

Waf single

À u livellu più altu di l'arburu fonte ns-3, ci hè solu un script Waf. Quandu avete principiatu à travaglià, passerete assai tempu in u cartulare scratch/ o più profondasrc/... è à u listessu tempu hà da curriri Waf. Pudete solu ricurdà induve site è corre Waf a siguenti:

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

ma questu serà tedious è propensu à l'errore, cusì ci sò megliu suluzioni. Un modu cumuni hè di utilizà un editore di testu cum'è emacs o vim, in quale duie sessioni di terminal sò aperte, una hè aduprata per custruisce ns-3, è u sicondu hè utilizatu per edità u codice fonte. Sì avete solu tarball, allura una variabile d'ambiente pò aiutà:

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

$ cd scratch 
$ waff build

In u cartulare di u modulu puderia esse tentatore di aghjunghje un script waf triviale cum'è exec ../../waf. Per piacè, ùn fate micca cusì. Questu hè cunfusu per i principianti è, quandu hè fattu male, porta à l'errore di custruzzione difficiuli di detectà. I suluzioni mostrati sopra sò a strada chì deve esse usata.

3.5 Testing ns-3

Pudete eseguisce e teste di unità di distribuzione ns-3 eseguendu u script ./test.py:

$ ./test.py

Sti testi sò eseguiti in parallelu Waf. Eventualmente duvete vede un missaghju chì dice:

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

Questu hè un missaghju impurtante per identificà valgrind crashes, crashes or errors, indicà prublemi cù u codice o incompatibilità trà l'arnesi è u codice.

Tu vi dinù vede u risultatu finali da Waf è un tester chì eseguisce ogni prova, chì parerà cusì:

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)

Stu cumandamentu hè generalmente gestitu da l'utilizatori per verificà rapidamente chì a distribuzione ns-3 hè custruita currettamente. (Nota chì l'ordine di e linee "PASS: ..." pò esse sfarente, questu hè normale. Ciò chì hè impurtante hè chì a linea di riassuntu à a fine di u rapportu mostra chì tutti i testi anu passatu; nisuna prova hà fallutu o sbattutu). È Wafe prova.py Parallelizà u travagliu attraversu i nuclei di processore dispunibuli di a macchina.

3.6 Esecuzione di u script

Di solitu eseguimu scripts sottu cuntrollu Waf. Questu permette à u sistema di custruzzione per assicurà chì i percorsi di libreria spartuti sò stallati currettamente è chì e biblioteche sò dispunibili in runtime. Per fà u prugramma, basta aduprà Waf cun paràmetru - -run. Eseguimu l'equivalente ns-3 di u prugramma ubiquitous ciao monduscrivendu i seguenti:

$ ./waf --run hello-simulator

Waf prima verificarà chì u prugramma hè custruitu currettamente è custruisce se ne necessariu. Allora Waf eseguirà un prugramma chì pruduce a seguente output.

Hello Simulator

Felicitazioni! Avà site un utilizatore ns-3!

Chì duverebbe fà se ùn vecu micca risultati?

Sè vo vede missaghji Wafindicà chì a custruzione hè stata cumpletata cù successu, ma ùn vede micca u risultatu "Hello Simulator", allora ci hè una pussibilità chì in a sezione [Build-with-Waf] hà cambiatu u vostru modu di custruzione à ottimisata, ma hà mancatu di turnà à u modu leghjitoghji. Tutta l'output di a cunsola utilizata in stu tutorialu usa un cumpunente ns-3 speciale chì esegue logging è hè utilizatu per stampà missaghji persunalizati à a cunsola. L'output da stu cumpunente hè automaticamente disattivatu quandu u codice ottimizatu hè compilatu - hè "optimizatu". Se ùn vede micca l'output "Hello Simulator", inserite u seguente:

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

per persunalizà Waf per custruisce versioni di debug di prugrammi ns-3, chì includenu esempi è testi. Avete da ricustruisce a versione di debug attuale di u codice scrivendu

$ ./waf

Avà s'è vo eseguite u prugramma ciao-simulatore, duvete vede u risultatu previstu.

3.6.1 Argumenti di linea di cumanda

Per passà l'argumenti di a linea di cummanda à u prugramma ns-3, utilizate u mudellu seguente:

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

Sustituisce à u nome di u vostru prugramma è à l'argumenti. Argumentu - -command-template di Waf hè essenzialmente una ricetta per custruisce a linea di cummanda attuale Waf utilizatu per eseguisce u prugramma. Waf verifica chì a custruzione hè cumpleta, stabilisce i percorsi di a libreria spartuta, poi usa u mudellu di linea di cumanda furnitu è ​​sustituisci u nome di u prugramma per u placeholder %s per chjamà l'eseguibile. Se truvate sta sintassi cumplicata, ci hè una versione più simplice chì implica u prugramma ns-3 è i so argumenti chjusi in virgulette singuli:

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

Un altru esempiu particularmente utile hè l'esecuzione di suite di teste selettivamente. Assumimu chì ci hè una suite di teste chjamata mytest (in fattu ùn ci hè micca). Sopra avemu usatu u script ./test.py per eseguisce una quantità di teste in parallelu, chì chjama ripetutamente u prugramma di prova. corridore di prova. Chjama corridore di prova direttamente per fà una prova:

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

L'argumenti seranu passati à u prugramma corridore di prova. Siccomu mytest ùn esiste micca, un missaghju d'errore serà generatu. Per stampà l'opzioni di test-runner dispunibili, entre:

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

3.6.2 Debugging

Per eseguisce i prugrammi ns-3 sottu una altra utilità, cum'è un debugger (per esempiu, gdb) o un strumentu di prova di memoria (per esempiu, valgrind), utilizate una forma simili - -command-template = "…". Per esempiu, per eseguisce in u debugger gdb u vostru prugramma hello-simulator ns-3 cù argumenti:

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

Nota chì u nome di u prugramma ns-3 vene cù l'argumentu - -run, è l'utilità di gestione (qui gdb) hè u primu token in l'argumentu - -command-template. Opzione - -args informa gdbchì u restu di a linea di cummanda appartene à u prugramma "bassu". (Alcune versioni gdb ùn capisce micca l'opzione - -args. In questu casu, sguassate l'argumenti di u prugramma - -command-template è aduprà u set di cumandamenti gdb args.) Pudemu combine sta ricetta è a precedente per eseguisce a prova sottu u debugger:

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

3.6.3 Directory di travagliu

Waf deve esse lanciatu da u so locu à a cima di l'arbulu ns-3. Stu cartulare diventa u cartulare di travagliu induve i schedari di pruduzzioni sarà scritta. Ma chì si vulete mantene questi schedari fora di l'arbulu fonte ns-3? Utilizà l'argumentu - -cwd:

$ ./waf --cwd=...

Pudete truvà più còmuda per uttene i schedarii di output in u vostru cartulare di travagliu. In questu casu, l'azzione indiretta seguente pò aiutà:

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

Questa dicurazione di a versione precedente di u cumandimu conserva u repertoriu di travagliu attuale, va à u cartulare Wafe poi istruisce Waf per cambià u cartulare di travagliu torna à u cartulare di travagliu attuale salvatu prima di inizià u prugramma. Mencionemu a squadra - -cwd Per a completezza, a maiò parte di l'utilizatori simpricimenti eseguite Waf da u cartulare di primu livellu è generanu schedarii di output quì.

Continuu: Capitulu 4

Source: www.habr.com

Add a comment