Manual de simulare a rețelei ns-3. Capitolul 3

Manual de simulare a rețelei ns-3. Capitolul 3
capitolele 1,2

3 Începând lucrul
3.1 Prezentare generală
3.2 Cerințe preliminare
3.2.1 Descărcarea versiunii ns-3 ca arhivă de surse
3.3 Descărcarea ns-3 folosind Git
3.3.1 Descărcarea ns-3 folosind Bake
3.4 Compilarea ns-3
3.4.1 Compilarea folosind build.py
3.4.2 Compilarea cu Bake
3.4.3 Compilarea cu Waf
3.5 Testarea ns-3
3.6 Rularea scriptului
3.6.1 Argumente de linie de comandă
3.6.2 Debbuging
3.6.3 Director de lucru

Capitolul 3

Începând lucrul

Acest capitol este destinat să pregătească cititorul pentru a începe lucrul, plecând de la un computer pe care, posibil, nu s-a instalat niciodată ns-3. Expunerea acoperă platformele suportate, cerințele preliminare, modalitățile de obținere a ns-3, modalitățile de compilare a ns-3 și modalitățile de verificare a compilării tale și rularea programelor simple.

3.1 Prezentare generală

Simulatorul ns-3 este construit ca un sistem de biblioteci software colaborative. La compilare, codul programelor utilizatorului este legat cu aceste biblioteci. Limbajele de programare utilizate pentru scrierea programelor utilizatorului sunt C++ sau Python.

Ns-3 este distribuit sub formă de cod sursă, ceea ce înseamnă că sistemul țintă trebuie să aibă un mediu de dezvoltare software pentru a compila mai întâi bibliotecile și apoi a compila programul utilizatorului. În principiu, ns-3 poate fi distribuit ca biblioteci gata pentru un sistem specific, și în viitor ar putea fi distribuit în acest fel. Dar în prezent, mulți utilizatori își desfășoară activitatea editând ns-3 în sine, așa că este util să ai codul sursă pentru a compila bibliotecile. Dacă cineva ar dori să își asume sarcina de a crea biblioteci și pachete gata pentru sistemele de operare, vă rugăm să contactați lista de corespondență. ns-developers.

Mai departe, vom examina trei modalități de a descărca și compila ns-3. Prima constă în a descărca și a construi versiunea oficială de pe site-ul principal. A doua este selecția și compilarea copiilor versiunilor dezvoltatorului ale instalării de bază ns-3. A treia - folosirea unor instrumente suplimentare de compilare pentru a descărca mai multe extensii pentru ns-3. Vom trece prin fiecare, deoarece instrumentele sunt puțin diferite.

Utilizatorii experimentați de Linux se pot întreba de ce ns-3 nu este furnizat ca pachet, așa cum fac majoritatea altor biblioteci care folosesc manageri de pachete? Deși există pachete binare pentru diverse distribuții de Linux (de exemplu, Debian), majoritatea utilizatorilor ajung în cele din urmă să editeze bibliotecile și sunt nevoiți să recompilieze ns-3, așa că disponibilitatea codului sursă este convenabilă. Din acest motiv, ne vom concentra pe instalarea din cod sursă.

Pentru cele mai multe aplicații ns-3, drepturile root nu sunt necesare, se recomandă utilizarea unui cont de utilizator neprivilegiat.

3.2 Cerințe preliminare

Întregul set de biblioteci disponibile ns-3 are o serie de dependențe față de biblioteci externe, dar în cea mai mare parte, ns-3 poate fi compilat și utilizat cu suport pentru mai multe componente comune (adesea instalate implicit): compilator C++, Python, editor de cod sursă (de exemplu, vim, emacs sau Eclipse) și, dacă se folosesc repozitorii de dezvoltare, sisteme de control al versiunilor Git. Majoritatea utilizatorilor începători nu trebuie să își facă griji dacă configurația lor raportează unele funcții ns-3 lipsă, dar pentru cei care doresc o instalare completă, proiectul oferă un wiki care include pagini cu multe sfaturi și sugestii utile. Una dintre aceste pagini este pagina „Instalare” cu instrucțiuni de instalare pentru diferite sisteme, disponibile la: https://www.nsnam.org/wiki/Installation.

Secțiunea „Cerințe preliminare” a acestei pagini wiki explică ce pachete sunt necesare pentru suportul opțiunilor comune ns-3 și oferă comenzi folosite pentru instalarea acestora pe variantele frecvente de Linux sau macOS.

Puteți profita de această oportunitate pentru a explora pagina wiki ns-3 sau site-ul principal: https://www.nsnam.org, deoarece acolo găsiți multe informații. Începând cu ultima versiune ns-3 (ns-3.29), pentru a rula ns-3 sunt necesare următoarele instrumente:

Instrument Pachet/versiune

  • Compilator C++
    clang++ sau g++ (g++ versiunea 4.9 sau mai mare)
  • Python
    python2 versiunea >= 2.7.10, sau python3 versiunea >=3.4
  • Git
    orice versiune recentă (pentru acces la ns-3 pe GitLab.com)
  • tar
    orice versiune recentă (pentru extragerea versiunii ns-3)
  • bunzip2
    orice versiune recentă (pentru extragerea versiunii ns-3)

Pentru a verifica versiunea Python instalată implicit, introduceți python -V. Pentru a verifica versiunea g++, introduceți g++ -v. Dacă unele instrumente lipsesc sau sunt prea vechi, consultați manualul de instalare de pe pagina wiki ns‑3.

De acum încolo, presupunem că cititorul lucrează pe Linux, MacOS sau un emulator de mediu Linux și are cel puțin instrumentele menționate mai sus.

3.2.1 Descărcarea versiunii ns-3 ca arhivă de surse

Aceasta este modalitatea de acțiune a unui utilizator nou care dorește să descarce și să experimenteze cu cele mai recente versiuni de lansare și pachete ns‑3. Lansările ns‑3 sunt publicate sub formă de arhive compresate de cod sursă, uneori denumite tarball. tarball — un format special de arhivă a programelor, în care mai multe fișiere sunt unite. Arhiva este de obicei comprimată. Procesul de descărcare a ns‑3 prin tarball este simplu, tot ce trebuie să faceți este să selectați lansarea, să o descărcați și să o dezarhivați.

Să presupunem că doriți, ca utilizator, să compilezi ns‑3 într-un director local numit workspace. Veți putea obține o copie de lucru a lansării, introducând în consola Linux următoarele (desigur, înlocuind numerele corespunzătoare ale versiunilor)

$ 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 

Rețineți utilitarul folosit mai sus wget, care este un instrument de linie de comandă pentru descărcarea obiectelor de pe Internet. Dacă nu l-ați instalat, puteți utiliza browserul pentru a face acest lucru.

Urmând acești pași, veți ajunge în directorul ns-allinone-3.29, unde ar trebui să vedeți mai multe fișiere și directoare

$ 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

Acum sunteți gata să compilați distribuția de bază ns‑3 și puteți trece la secțiunea dedicată compilării ns‑3.

3.3 Descărcarea ns-3 folosind Git

Codul ns‑3 este disponibil în repositoarele Git de pe GitLab.com la adresa https://gitlab.com/nsnam/. Grupul nsnam reunește diferitele repositoare folosite de proiectul cu sursă deschisă.

Cel mai simplu mod de a începe să utilizați repositoarele Git este să faceți un fork sau să clonati mediu ns‑3-allinone. Acesta este un set de scripturi care gestionează descărcarea și compilarea subsistemelor ns‑3 cel mai frecvent utilizate. Dacă sunteți începător în Git, termenii "fork" și "clonare" s-ar putea să vă fie necunoscuți; dacă este așa, vă recomandăm să clonați (să creați propria copie) depozitului de pe GitLab.com, astfel:

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

În acest moment, aspectul directorului dvs. ns‑3-allinone se deosebe puțin de directorul descris mai sus cu arhiva de lansare. Ar trebui să arate cam așa:

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

Observați prezența scriptului download.py, care va extrage suplimentar ns-3 și codul sursă asociat. Aici aveți de ales: fie să descărcați cel mai recent snapshot de dezvoltare ns-3:

$ python download.py

sau să preferați lansarea ns-3, folosind flagul -n pentru a specifica numărul versiunii:

$ python download.py -n ns-3.29

După acest pas, în directorul ns‑3-allinone vor fi descărcate depozite suplimentare ns-3, bake, pybindgen și netanim.

Notă
Pe o mașină cu Ubuntu16.04 curat, a trebuit să modific comanda astfel: $ sudo python3 download.py -n ns-3.29 (aici și mai departe, observații ale traducătorului).

3.3.1 Descărcarea ns-3 folosind Bake

Cele două metode menționate mai sus (arhiva surselor sau depozitul ns‑3-allinone prin Git) sunt utile pentru a obține cea mai simplă instalare ns-3 cu câteva adăugiri (pybindgen pentru generarea legăturilor Python și netanim pentru animarea rețelei). Al treilea depozit, furnizat implicit în ns-3-allinone, se numește bake.

Bake — acesta este un instrument pentru construirea coordonată a software-ului din mai multe depozite, dezvoltat pentru proiectul ns-3. Bake poate fi folosit pentru a obține versiuni de dezvoltare ns-3, precum și pentru a descărca și construi extensii ale versiunii de bază a distribuției ns-3, cum ar fi mediul Direct Code Execution, CradleNetwork Simulation Cradle, capacitatea de a crea noi legături Python și diverse „aplicații” ns-3.

Notă
CradleNetwork Simulation Cradle este un cadru care permite utilizarea stivelor rețea reale TCP / IP în interiorul simulatoarelor de rețea.

Dacă vă așteptați ca instalarea dvs. ns-3 să aibă funcții avansate sau suplimentare, puteți urma această cale de instalare.

În ultimele lansări ns-3 Bake a fost inclus în lansarea tar. În lansare este inclus un fișier de configurare care permite descărcarea versiunilor de software actuale la momentul creării lansării. Adică, de exemplu, versiunea Bake, care este distribuită cu lansarea ns-3.29, poate fi utilizată pentru a obține componente pentru această lansare ns-3 sau anterioară, dar nu poate fi utilizată pentru a extrage componente pentru lansări ulterioare (dacă fișierul de descriere a pachetului bakeconf.xml nu este actualizat).

De asemenea, puteți obține cea mai recentă copie bake, introducând următoarea comandă în consola dvs. Linux (cu condiția să aveți Git instalat):

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

Când executați comanda git, ar trebui să vedeți ceva similar cu următorul:

Clonare în 'bake'...
remote: Enumerare obiecte: 2086, finalizat. 
remote: Numărarea obiectelor: 100% (2086/2086), finalizat. 
remote: Comprimarea obiectelor: 100% (649/649), finalizat. 
remote: Total 2086 (delta 1404), reutilizat 2078 (delta 1399) 
Primire obiecte: 100% (2086/2086), 2.68 MiB | 3.82 MiB/s, finalizat. 
Rezolvarea deltas: 100% (1404/1404), finalizat.

După finalizarea comenzii clone ar trebui să apară un director numit bake, al cărui conținut ar trebui să arate aproximativ așa:

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

Observați că ați descărcat mai multe scripturi Python, un modul Python numit bake și un fișier de configurare XML. Următorul pas va fi să folosiți aceste scripturi pentru a descărca și compila distribuția ns-3 pe care o alegeți. Sunt disponibile mai multe obiective de configurare:

  1. ns-3.29: un modul care corespunde versiunii; acesta va descărca componente asemănătoare cu versiunea din tarball;

  2. ns-3-dev: un modul similar, dar folosind cod din arborele de dezvoltare;

  3. ns-allinone-3.29: un modul care include alte funcționalități suplimentare, cum ar fi rutarea Click și Cradle de Simulare a Rețelei, Openflow pentru ns-3.

  4. ns‑3-allinone: similar cu versiunea de lansare a modulului allinone, dar pentru codul de dezvoltare.

Notă
Click este o arhitectură software modulară pentru construirea routerelor.

Openflow este un protocol de control al fluxului de date transmise prin rețea de către routere și comutatoare, implementând tehnologia rețelei programabile.

Snapshot-ul curent al dezvoltării (nerelaționat) ns-3 poate fi găsit la:https://gitlab.com/nsnam/ns-3-dev.git.

Dezvoltatorii încearcă să mențină aceste repozitorii într-o stare de lucru coerentă, dar ele sunt în zona de dezvoltare și conțin cod nerelaționat, așa că, dacă nu intenționați să folosiți noile funcții, alegeți versiunea oficială.

Puteți găsi cea mai recentă versiune a codului consultând lista repozitoriilor sau mergând pe pagina web "ns-3 Releases":https://www.nsnam.org/releases/ și făcând clic pe linkul versiunii celei mai recente. În acest exemplu, vom continua cu ns-3.29.

Acum, pentru a obține părțile necesare ns-3, vom aplica instrumentul Bake. Să spunem câteva cuvinte introductive despre funcționarea Bake.

Bake funcționează, descărcând sursele pachetelor în directorul source și instalând bibliotecile în directorul de construcție. Bake poate fi executat, referindu-se la fișierul binar, dar dacă doriți să rulați Bake nu din directorul în care a fost încărcat, este recomandat să adăugați calea către bake calea dvs. (variabila de mediu PATH), de exemplu, în felul următor (exemplu pentru terminalul Linux bash). Accesați directorul „bake”, apoi setați următoarele variabile de mediu:

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

Aceasta va plasa programul bake.py în calea shell-ului și va permite altor programe să găsească fișierele executabile și bibliotecile pe care le-a creat bake. În anumite cazuri de utilizare, bakesetarea PATH și PYTHONPATH descrisă mai sus nu este necesară, dar pentru o compilare completă a ns‑3-allinone (cu pachete suplimentare) este în general necesară.

Intrați în directorul de lucru și tastați în terminal următoarele:

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

Apoi, vi se va cere Bake să verificați dacă aveți suficiente instrumente pentru a descărca diverse componente. Tastați:

$ ./bake.py check

Trebuie să vedeți ceva de genul următor:

> Python - OK 
> Compilator GNU C++ - OK 
> Mercurial - OK 
> Git - OK 
> Unelte Tar - OK 
> Unelte Unzip - OK 
> Make - OK 
> cMake - OK 
> Unelte patch - OK 
> Calea căutată pentru unelte: /usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin ...

În special, uneltele de descărcare, cum ar fi Mercurial, CVS, Git și Bazaar, sunt esențiale în acest pas, deoarece ne permit să obținem codul. În această etapă, instalați uneltele lipsă în mod obișnuit pentru sistemul dvs. (dacă știți cum) sau apelați la ajutorul administratorului sistemului.

Apoi, încercați să descărcați software-ul:

$ ./bake.py download

rezultatul ar trebui să fie ceva de genul:

>> Căutăm dependența de sistem setuptools - OK 
>> Căutăm dependența de sistem libgoocanvas2 - OK 
>> Căutăm dependența de sistem gi-cairo - OK 
>> Căutăm dependența de sistem pygobject - OK 
>> Căutăm dependența de sistem pygraphviz - OK 
>> Căutăm dependența de sistem python-dev - OK 
>> Căutăm dependența de sistem qt - OK 
>> Căutăm dependența de sistem g++ - OK 
>> Descărcare pybindgen-0.19.0.post4+ng823d8b2 (director țintă: pybindgen) - OK 
>> Descărcare netanim-3.108 - OK 
>> Descărcare ns-3.29 - OK

Aceasta va înseamna că au fost descărcate trei surse. Acum intrați în directorul sursă și tastați ls; ar trebui să vedeți:

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

Acum sunteți gata să construiți distribuția ns‑3.

3.4 Compilarea ns-3

Ca și în cazul descărcării ns‑3, există mai multe moduri de a construi ns‑3. Principalul lucru pe care vrem să-l subliniem este că ns‑3 este construit cu un instrument de construire numit Waf, descris mai jos. Majoritatea utilizatorilor vor lucra cu Waf, dar există câteva scenarii utile care te pot ajuta să începi sau să organizezi construcții mai complexe. Așadar, te rog, înainte de a citi despre Waf, aruncă o privire la build.py și construcția cu bake.

3.4.1 Compilarea folosind build.py

Atenție! Această etapă de construcție este disponibilă doar din versiunea arhivei sursă obținute conform celor menționate mai sus; și nu descărcată prin git sau bake.

Când lucrezi cu arhiva de lansare tarball, pe ns‑3‑allinone există un script util care poate simplifica construcția componentelor. Se numește build.py. Acest program îți va configura proiectul într-un mod cât mai util. Totuși, reține că setările mai complexe și lucrul cu ns‑3 includ, de obicei, utilizarea propriei tale sisteme de construcție ns‑3, Waf, care va fi prezentată mai târziu în acest ghid.

Dacă ai descărcat folosind tarball, atunci în directorul tău ~\/workspace ar trebui să apară un director numit ceva de genul ns-allinone-3.29. Introdu următoarele:

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

Când apelăm build.py am aplicat argumente pentru linia de comandă pentru a construi exemplele și testele folosite în acest ghid, care, în ns‑3, nu sunt construite în mod implicit. În mod implicit, programul construiește toate modulele disponibile. Apoi, dacă dorești, poți construi ns‑3 fără exemple și teste sau poți exclude modulele care nu sunt necesare pentru munca ta.

Vei vedea multe mesaje de ieșire ale compilatorului afișate de script în timpul construcției părților pe care le-ai descărcat. La început, scriptul va încerca să construiască animatorul netanim, apoi generatorul de legături pybindgen și, în final, ns‑3. La finalul procesului, ar trebui să vezi următoarele:

Waf: Părăsind directorul '\/path\/to\/workspace\/ns-allinone-3.29\/ns-3.29\/build'\n'build' s-a terminat cu succes (6m25.032s) \n\nModule construite:\nantenna                aodv                     applications\nbridge                 buildings                config-store\ncore                   csma                     csma-layout\ndsdv                   dsr                      energy \nfd-net-device          flow-monitor             internet\ninternet-apps          lr-wpan                  lte\nmesh                   mobility                 mpi\nnetanim (fără Python)    network                  nix-vector-routing \nolsr                   point-to-point           point-to-point-layout \npropagation            sixlowpan                spectrum \nstats                  tap-bridge               test (fără Python) \ntopology-read          traffic-control          uan \nvirtual-net-device     visualizer               wave \nwifi                   wimax \n\nModule care nu au fost construite (vezi tutorialul ns-3 pentru explicație):\nbrite                  click                    openflow \nPărăsind directorul .\/ns-3.29

În ultimele trei linii ale listării vedem un mesaj despre modulele care nu au fost construite:

Module care nu au fost construite (vezi tutorialul ns-3 pentru explicație):\nbrite                     click

Aceasta înseamnă pur și simplu că unele module ns-3, care depind de biblioteci externe, poate că nu au fost compilate, sau că pentru această configurație compilarea lor nu este necesară. Nu înseamnă că simulatorul nu s-a compilat sau că modulele compilate vor funcționa incorect.

3.4.2 Compilarea cu Bake

Dacă mai sus ați folosit bake pentru a obține codul sursă din repozitoarele proiectului, puteți să-l folosiți în continuare și pentru a compila ns-3. Tastați:

$ ./bake.py build

și ar trebui să vedeți ceva de genul:

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

Indiciu: puteți, de asemenea, să executați ambele etape simultan, descărcarea și compilarea, apelând «bake.py deploy».

Este posibil ca în timpul compilării tuturor componentelor să apară erori, dar compilarea va continua dacă componenta nu este esențială. De exemplu, o problemă recentă legată de portabilitate a fost că castxml poate fi compilat cu un instrument bake nu pe toate platformele. În acest caz, va apărea un mesaj de genul:

>> Compilare castxml - Problemă 
> Problemă: Dependență opțională, modul "castxml" a eșuat
Aceasta poate reduce funcționalitatea construirii finale.
Cu toate acestea, bake va continua deoarece "castxml" nu este o dependență esențială.
Pentru mai multe informații, apelați bake cu -v sau -vvv, pentru modul complet detaliat.

Cu toate acestea castxml este necesar doar dacă doriți să creați legături Python actualizate. Pentru majoritatea utilizatorilor, nu este nevoie de aceasta (cel puțin până nu încep să modifice ns-3), așa că astfel de avertizări pot fi ignorate în siguranță pentru moment.

Dacă apare o eroare, comanda următoare vă va oferi indicii despre dependențele lipsă:

$ ./bake.py show

Vor fi enumerate diferitele dependențe de pachete pe care încercați să le compilați.

3.4.3 Compilarea cu Waf

Până acum, pentru a începe compilarea ns-3, am folosit fie scriptul build.py, fie instrumentul bake. Aceste instrumente sunt utile pentru compilarea ns-3 și suportul bibliotecilor. De fapt, pentru a compila, ele rulează instrumentul de compilare Waf din directorul ns-3. Waf se instalează împreună cu codul sursă ns-3. Majoritatea utilizatorilor trec rapid la utilizarea directă a Waf. Așadar, pentru a continua, vă rugăm să accesați directorul ns-3, pe care l-ați creat inițial.

Deocamdată, acest lucru nu este strict necesar, dar ar fi util să facem o mică depărtare și să vedem cum să facem modificări în configurația proiectului. Probabil, cea mai utilă modificare a configurației pe care o puteți face va fi crearea unei versiuni optimizate a codului. În mod implicit, ați configurat proiectul pentru a crea o versiune de debug. Să analizăm proiectul pentru a crea o construcție optimizată. Pentru a explica lui Waf ce trebuie să facă pentru construcțiile optimizate, inclusiv exemple și teste, va trebui să executați următoarele comenzi:

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

Aceasta va porni Waf în afara directorului local (pentru confortul dumneavoastră). Prima comandă efectuează curățarea de la construcerea anterioară, aceasta nu este strict necesară, dar este o bună practică (consultați de asemenea profilele de construcție mai jos); aceasta va elimina bibliotecile și fișierele obiect create anterior aflate în directorul build\/. Când proiectul este reconfigurat și sistemul de construcție verifică diverse dependențe, ar trebui să vedeți o ieșire asemănătoare cu următoarea:

Setând calea de bază la   : /home/ns3user/workspace/bake/source/ns-3-dev
Setând calea de ieșire la  : /home/ns3user/workspace/bake/source/ns-3-dev/build
Verificând pentru 'gcc' (compilator C)         : /usr/bin/gcc 
Verificând versiunea cc                : 7.3.0 
Verificând pentru 'g++' (compilator C++)      : /usr/bin/g++ 
Verificând suportul pentru flag-ul de compilare -march=native : ok 
Verificând suportul pentru flag-ul de compilare -Wl,--soname=foo : ok 
Verificând suportul pentru flag-ul de compilare -std=c++11       : ok 
Verificând incluziile boost   : anteturile nu au fost găsite, vă rugăm să furnizați un argument --boost-includes (consultați ajutorul) 
Verificând incluziile boost   : anteturile nu au fost găsite, vă rugăm să furnizați un argument --boost-includes (consultați ajutorul) 
Verificând programul 'python'            : /usr/bin/python 
Verificând versiunea python >= 2.3       : 2.7.15 python-config                                                                     : /usr/bin/python-config
Întrebând python-config pentru flags-urile pyembed '--cflags --libs --ldflags' : da
Testând configurația pyembed                                      : da
Întrebând python-config pentru flags-urile pyext '--cflags --libs --ldflags'   : da
Testând configurația pyext                                        : da

Verificând suportul pentru flag-ul de compilare -fvisibility=hidden          : ok 
Verificând suportul pentru flag-ul de compilare -Wno-array-bounds            : ok 
Verificând locația pybindgen          : ../pybindgen ,!(estimată) 
Verificând modulul python 'pybindgen'   : 0.19.0. ,!post4+g823d8b2 
Verificând versiunea pybindgen           : 0.19.0. ,!post4+g823d8b2 
Verificând fragmentul de cod                : da 
Verificând pentru echivalența tipurilor uint64_t și unsigned long : nu 
Verificând fragmentul de cod                                 : nu 
Verificând pentru echivalența tipurilor uint64_t și unsigned long long     : da 
Verificând apidefs care pot fi folosite pentru legături Python                       : gcc-LP64 
Verificând compatibilitatea internală GCC cxxabi         : completă 
Verificând modulul python 'pygccxml'    : nu a fost găsit 
Verificând locația click              : nu a fost găsită 
Verificând programul 'pkg-config'        : /usr/bin/pkg- ,!config 
Verificând pentru 'gtk+-3.0'                  : nu a fost găsit 
Verificând pentru 'libxml-2.0'                : da 
verificând pentru uint128_t                   : nu a fost găsit 
verificând pentru __uint128_t                 : da 
Verificând implementarea de precizie înaltă   : 128-bit integer ,!(implicit) 
Verificând antetul stdint.h             : da 
Verificând antetul inttypes.h           : da 
Verificând antetul sys/inttypes.h       : nu a fost găsit 
Verificând antetul sys/types.h          : da 
Verificând antetul sys/stat.h           : da 
Verificând antetul dirent.h             : da 
Verificând antetul stdlib.h             : da 
Verificând antetul signal.h             : da 
Verificând antetul pthread.h            : da 
Verificând antetul stdint.h             : da 
Verificând antetul inttypes.h           : da 
Verificând antetul sys/inttypes.h       : nu a fost găsit
Verificând biblioteca rt                  : da 
Verificând antetul sys/ioctl.h          : da 
Verificând antetul net/if.h             : da 
Verificând antetul net/ethernet.h       : da 
Verificând antetul linux/if_tun.h       : da 
Verificând antetul netpacket/packet.h   : da 
Verificând locația NSC                : nu a fost găsită 
Verificând pentru 'sqlite3'                   : nu a fost găsit 
Verificând antetul linux/if_tun.h       : da 
Verificând modulul python 'gi'          : 3.26.1 
Verificând modulul python 'gi.repository.GObject'      : ok 
Verificând modulul python 'cairo'                      : ok 
Verificând modulul python 'pygraphviz'                 : 1.4rc1 
Verificând modulul python 'gi.repository.Gtk'          : ok 
Verificând modulul python 'gi.repository.Gdk'          : ok 
Verificând modulul python 'gi.repository.Pango'        : ok 
Verificând modulul python 'gi.repository.GooCanvas'    : ok 
Verificând programul 'sudo'                             : /usr/bin/sudo 
Verificând programul 'valgrind'                         : nu a fost găsit 
Verificând pentru 'gsl' : nu a fost găsit python-config            : nu a fost găsit 
Verificând suportul pentru flag-ul de compilare -fstrict-aliasing : ok 
Verificând suportul pentru flag-ul de compilare -fstrict-aliasing : ok 
Verificând suportul pentru flag-ul de compilare -Wstrict-aliasing : ok 
Verificând suportul pentru flag-ul de compilare -Wstrict-aliasing : ok 
Verificând programul 'doxygen'                          : /usr/bin/doxygen
---- Rezumat al caracteristicilor opționale ns-3:
Profil de compilare : optimizat
Director de compilare : 
Integrare BRITE : nu este activată (BRITE nu este activat (consultați opțiunea --with- ,!brite)) 
Colectarea evenimentelor DES Metrics : nu este activată (implicit este dezactivată) 
Dispozitivul FdNetDevice de emulare        : activat 
Exemple                     : activat 
Dispozitivul NetDevice cu descriptor de fișier    : activat 
Biblioteca  GNU Scientific (GSL) : nu este activată (GSL nu a fost găsit) 
Biblioteca Gcrypt               : nu este activată
(biblioteca libgcrypt nu a fost găsită: puteți folosi ,!libgcrypt-config pentru a-i găsi locația.) GtkConfigStore               : nu este activată (biblioteca 'gtk+-3.0 >= 3.0' nu a fost găsită)
Suport MPI                  : nu este activat (opțiunea --enable-mpi nu a fost selectată)
Integrarea ns-3 Click       : nu este activată (nsclick nu este activat (consultați opțiunea --with- ,!nsclick))
Integrarea ns-3 OpenFlow   : nu este activată (Bibliotecile boost necesare nu au fost găsite) 
Leagănul de simulare a rețelei    : nu este activat (NSC nu a fost găsit (consultați opțiunea --with-nsc))
Dispozitivul FdNetDevice PlanetLab         : nu este activat (sistemul de operare PlanetLab nu a fost detectat ,!(consultați opțiunea --force-planetlab)) Vizualizatorul PyViz : activat 
Suport pentru scanarea API Python   : nu este activat (Modulul Python 'pygccxml' lipsă)
Legături Python : activat 
Simulator în timp real           : activat 
Ieșirea datelor statistice SQlite      : nu este activată (biblioteca 'sqlite3' nu a fost găsită)
Podul Tap                    : activat 
FdNetDevice Tap               : activat
Teste                         : activat 
Primitive de threadi          : activat 
Folosiți sudo pentru a seta bitul suid   : nu este activat (opțiunea --enable-sudo nu a fost selectată)
XmlIo                         : activat
'configure' s-a terminat cu succes (6.387s)

Atenție la ultima parte a listei prezentate mai sus. Unele opțiuni ns-3 nu sunt incluse în mod implicit sau necesită suport din partea sistemului pentru a funcționa corect. De exemplu, pentru a activa XmlTo, biblioteca trebuie să fie prezentă în sistem. libxml-2.0. Dacă această bibliotecă nu a fost găsită și funcția corespunzătoare ns-3 nu a fost activată, va apărea un mesaj. De asemenea, rețineți că aveți posibilitatea de a folosi comanda sudo pentru a activa bitul suid "setare ID grup la execuție" pentru anumite programe. Acesta nu este activat în mod implicit, iar din acest motiv această funcție va fi afișată ca „nu activată” („not enabled”). În cele din urmă, pentru a obține o listă a opțiunilor activate, utilizați Waf cu parametrul --check-config.

Acum să ne întoarcem și să revenim la construcția de debug, care conține exemple și teste.

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

Sistemul de construire este acum configurat, iar voi puteți aduna versiunile de debug ale programelor ns-3, tastând doar:

$ ./waf

Poate că pașii descriși mai sus v-au obligat să construiți partea sistemului ns-3 de două ori, însă acum știți cum să schimbați configurația și să construiți cod optimizat.

Pentru a verifica care profil este activ pentru această configurație a proiectului, există comanda:

$ ./waf --check-profile 
Waf: Intrând în directorul `/path/to/ns-3-allinone/ns-3.29/build` 
Profil de construcție: debug

Scenariul discutat mai sus build.py de asemenea, suportă argumentele --enable-examples și --enable-tests, dar alte opțiuni Waf nu le suportă direct. De exemplu, aceasta nu va funcționa:

$ ./build.py --disable-python

reactia va fi:

build.py: eroare: nu există o astfel de opțiune: --disable-python

Cu toate acestea, operatorul special -- poate fi folosit pentru a transmite parametrii suplimentari prin waf, așa că în locul celei menționate anterior va funcționa următoarea comandă:

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

deoarece generează comanda principală ./waf configure --disable-python. Iată câteva sfaturi introductive despre Waf.

Tratarea erorilor de construcție

Versiunile ns‑3 au fost testate cu cele mai recente compilatoare C++ disponibile în momentul lansării pe distribuții populare Linux și MacOS. Totuși, de-a lungul timpului, noi distribuții cu compilatoare actualizate sunt lansate, iar aceste compilatoare mai noi sunt, în general, mai stricte în ceea ce privește avertizările. ns‑3 își configurează construcția pentru a trata toate avertizările ca erori, așadar, uneori, dacă utilizați o versiune mai veche într-un sistem mai nou, un avertisment al compilatorului poate opri construcția.

De exemplu, anterior a fost lansată ns‑3.28 pentru Fedora 28, care includea o nouă versiune majoră gcc (gcc-8). Construirea versiunii ns‑3.28 sau a versiunilor anterioare pe Fedora 28, cu Gtk2+ instalat, va genera o astfel de eroare:

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

În versiunile începând cu ns‑3.28.1, Waf este disponibilă o opțiune pentru a rezolva aceste probleme. Aceasta dezactivează setarea flag-ului „-Werror” în g++ și clang++. Aceasta este opțiunea „—disable-werror”, care trebuie aplicată în timpul configurării:

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

Configurează sau construiește

Unele comenzi Waf au sens doar în faza de configurare, iar altele acționează doar în faza de construire. De exemplu, dacă doriți să utilizați funcționalitățile de emulare ns‑3, puteți activa setarea bitului suid folosind sudo, așa cum este descris mai sus. Aceasta va anula comenzile din etapa de configurare, permițându-vă astfel să schimbați configurația folosind următoarea comandă, care include de asemenea exemple și teste.

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

Dacă faceți acest lucru, Waf va rula sudo, pentru a modifica programele de creare a socket-urilor de cod de emulare pentru a rula cu privilegiile root. În Waf sunt disponibile multe alte opțiuni pentru etapele de configurare și construire. Pentru a explora opțiunile, introduceți:

$ ./waf --help

În secțiunea următoare vom folosi câteva opțiuni legate de testare.

Profilele de construcție

Am văzut deja cum poate fi configurat Waf pentru construcții debug și optimized:

$ ./waf --build-profile=debug

Există, de asemenea, un profil intermediar de construcție, release. Opțiunea -d este un sinonim pentru --build-profile. Profilul de construcție controlează utilizarea jurnalizării, afirmațiilor (assertions) și cheilor de optimizare ale compilatorului:

Manual de simulare a rețelei ns-3. Capitolul 3

După cum se poate observa, jurnalizarea și afirmațiile sunt disponibile doar în versiunile de dezvoltare. Practica recomandată este să dezvoltați scriptul dvs. în modul de depanare, apoi să efectuați rulări repetate (pentru statistici sau modificarea parametrilor) în profilul de compilare optimizat.

Dacă aveți cod care trebuie să fie executat doar în anumite profiluri de compilare, utilizați macro-ul Code Wrapper Macro:

NS_BUILD_DEBUG (std::cout << "Parte a unei linii de ieșire..." << std::flush; timer.Start ,!()); DoLongInvolvedComputation ();
NS_BUILD_DEBUG (timer.Stop (); std::cout << "Finalizat: " << timer << std::endl;)

În mod implicit, Waf artefactele de compilare sunt plasate în directorul de compilare. Puteți specifica un alt director de ieșire cu ajutorul opțiunii - out, de exemplu:

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

Combinând aceasta cu profilurile de compilare, puteți comuta ușor între diferite opțiuni de compilare:

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

Ce vă permite să lucrați cu mai multe compilări fără a rescrie de fiecare dată ultima compilare. Când comutați pe un alt profil, Waf se va compila doar acesta, fără recompilarea completă a tot.

Când comutați astfel profilurile de compilare, trebuie să aveți grijă să oferiți de fiecare dată aceleași opțiuni de configurare. Vă poate ajuta să evitați erorile definirea mai multor variabile de mediu:

$ 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

Compilatoare și flag-uri

În exemplele de mai sus Waf pentru a construi ns-3, folosește compilatorul C++ din GCC ( g++). Cu toate acestea, se poate schimba compilatorul C++ utilizat prin definirea variabilei de mediu CXX. De exemplu, pentru a folosi compilatorul C++ Clang, clang++, Waf $ CXX="clang++" ./waf configure $ ./waf build

În mod similar, poate fi configurat 

pentru a folosi compilarea distribuită cu ajutorul Waf distcc $ CXX="distcc g++" ./waf configure $ ./waf build:

Informații mai detaliate despre distcc și compilarea distribuită se pot găsi pe pagina proiectului în secțiunea „Documentație”. Pentru a adăuga flage de compilare la configurarea ns-3, utilizați variabila de mediu CXXFLAGS_EXTRA.

Informații mai detaliate despre distcc și compilarea distribuită pot fi găsite pe pagina de proiect în secțiunea „Documentație”. Pentru a adăuga flaguri ale compilatorului la configurarea ns‑3, utilizați variabila de mediu CXXFLAGS_EXTRA.

Instalare

Waf poate fi folosit pentru instalarea bibliotecilor în diferite locații ale sistemului. În mod implicit, bibliotecile compilate și fișierele executabile se află în directorul build, și deoarece Waf știe locația acestor biblioteci și fișiere executabile, nu este necesar să instalați bibliotecile în altă parte.

Dacă utilizatorii preferă instalarea în afara directorului de compilare, pot executa comanda .\/waf install. În mod implicit, prefixul pentru instalare este /usr/local, așadar .\/waf install va instala programele în /usr/local/bin, bibliotecile în /usr/local/lib și fișierele de antet în /usr/local/include. Drepturile de superutilizator sunt de obicei necesare pentru a instala cu prefixul implicit, astfel că o comandă obișnuită va fi sudo .\/waf install. Atunci când este rulată, Waf va prefera mai întâi să utilizeze bibliotecile comune din directorul de compilare, apoi va căuta biblioteci pe calea de biblioteci configurată în mediu. Deci, la instalarea bibliotecilor în sistem, o practică bună este să verificați că se utilizează bibliotecile corecte. Utilizatorii pot alege să instaleze cu un alt prefix, trecând în timpul configurării opțiunea --prefix, de exemplu:

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

Dacă mai târziu, după compilare, utilizatorul introduce comanda de instalare .\/waf, va fi utilizat prefixul /opt/local.

Comanda .\/waf clean ar trebui să fie folosit înainte de reconfigurarea proiectului, dacă se va folosi Waf sub un alt prefix.

Astfel, pentru utilizarea ns‑3 nu este necesar să apelați .\/waf install. Majoritatea utilizatorilor nu vor avea nevoie de această comandă, deoarece Waf va prelua bibliotecile curente din directorul de compilare, dar unii utilizatori ar putea găsi acest lucru util, dacă activitatea lor implică lucrul cu programe în afara directorului ns‑3.

Waf este unic

La nivelul superior al arborelui sursă ns‑3 există doar un singur script Waf. Odată ce ați început să lucrați, veți petrece mult timp în directorul scratch\/ sau mai adânc, însrc\/... și, în același timp, va fi necesar să rulați Waf. Puteți pur și simplu să vă amintiți unde sunteți și să rulați Waf în următorul mod:

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

dar acest lucru va fi obositor și predispus la erori, așa că există soluții mai bune. Una dintre metodele comune este utilizarea unui editor de text, cum ar fi emacs sau vim, în care se deschid două sesiuni terminale, una folosită pentru compilarea ns‑3 și cealaltă pentru editarea codului sursă. Dacă aveți doar tarball, poate ajuta variabila de mediu:

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

$ cd scratch 
$ waff build

În directorul modulului, poate fi tentant să adăugați un script trivial waf de tip exemplu exec ../../waf. Vă rugăm, nu faceți asta. Asta derutatează începătorii și poate duce la erori de compilare dificil de descoperit dacă este executat prost. Soluțiile prezentate mai sus sunt calea pe care ar trebui să o urmați.

3.5 Testarea ns-3

Puteți rula teste modulare pentru distribuția ns-3, executând scriptul ./test.py:

$ ./test.py

Aceste teste se execută în paralel cu Waf. La final, ar trebui să vedeți un mesaj care anunță că

92 din 92 de teste au trecut (92 au trecut, 0 au eșuat, 0 au avut erori, 0 erori valgrind)

Acest mesaj este important pentru identificarea eșecurilor, crash-urilor sau erorilor valgrind, indicând probleme cu codul sau incompatibilitate între instrumente și cod.

De asemenea, veți vedea rezumatul final de la Waf și testatorul care rulează fiecare test, care va arăta aproximativ așa:

Waf: Intrați în directorul `/path/to/workspace/ns-3-allinone/ns-3-dev/build' 
Waf: Părăsiți directorul `/path/to/workspace/ns-3-allinone/ns-3-dev/build' 
'build' finalizat cu succes (1.799s) 

Module construite:
aodv           applications          bridge
click          config-store          core
csma           csma-layout           dsdv
emu            energie               flow-monitor
internet       lte                   mesh
mobilitate     mpi                   netanim
rețea         nix-vector-routing    ns3tcp
ns3wifi        olsr                  openflow
punct-la-punct punct-la-punct-layout propagare
spectru       statistici            tap-bridge
templat       test                  instrumente
topologie-lectură  uan               dispozitiv-rețea-virtual
vizualizator     wifi                  wimax

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

...

PASS: TestSuite obiect
PASS: TestSuite generatoare-de-numere-aleatorii
92 din 92 de teste au trecut (92 au trecut, 0 au eșuat, 0 au avut erori, 0 erori valgrind)

Această comandă este de obicei rulată de utilizatori pentru a verifica rapid corectitudinea compilării distribuției ns-3. (Rețineți că ordinea liniilor „PASS: ...” poate varia, ceea ce este normal. Important este să încheiați raportul fără nicio eșec; niciun test nu a eșuat sau a avut un crash.) Și Waf, și test.py vor distribui munca pe nucleele disponibile ale mașinii.

3.6 Rularea scriptului

De obicei, rulăm scripturile sub controlul Waf. Aceasta permite sistemului de compilare să se asigure că căile către biblioteca comună sunt corecte și că bibliotecile sunt disponibile în timpul execuției. Pentru a rula programul, utilizați pur și simplu Waf cu parametrul - run. Să rulăm echivalentul programului omniprezent pentru ns-3 hello world, tastând următoarele:

$ ./waf --run hello-simulator

Waf va verifica mai întâi dacă programul este compilat corect și, dacă este necesar, va efectua compilarea. Apoi Waf va rula programul, care va genera următorul output.

Simulator de Salut

Felicitări! Acum ești utilizator ns-3!

Ce trebuie să fac dacă nu văd rezultatul?

Dacă vezi mesaje Waf, care indică faptul că compilarea a fost finalizată cu succes, dar nu vezi outputul „Simulator de Salut”, atunci este posibil să fi folosit în secțiunea [Compilare cu Waf] un mod de compilare diferit optimized, dar ai omis să revii la modul debug. Tot outputul consolei folosit în acest ghid utilizează un component special ns-3, care efectuează înregistrarea jurnalului și este utilizat pentru a imprima mesaje personalizate în consolă. Outputul acestui component este dezactivat automat atunci când compilezi cod optimizat — este „optimizat”. Dacă nu vezi outputul „Simulator de Salut”, introdu următoarele:

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

pentru a configura Waf compilarea versiunilor de depanare ale programelor ns-3, care includ exemple și teste. Apoi, trebuie să recompili versiunea de depanare curentă a codului, tastând

$ ./waf

Acum, dacă rulezi programul hello-simulator, ar trebui să vezi rezultatul așteptat.

3.6.1 Argumente de linie de comandă

Pentru a transmite argumente din linia de comandă către programul ns-3, folosește următorul șablon:

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

Înlocuiește cu numele programului tău și cu argumentele. Argumentul - -command-template pentru Waf reprezintă, în esență, o rețetă pentru construirea efectivei linii de comandă Waf folosite pentru a rula programul. Waf verifică dacă compilarea a fost finalizată, setează căile către biblioteca comună și, apoi, folosind șablonul de linie de comandă furnizat și substituind numele programului în locul șablonului %s, apelează fișierul executabil. Dacă ți se pare că această sintaxă este complexă, există o variantă mai simplă, care include programul ns-3 și argumentele acestuia între ghilimele simple:

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

Un alt exemplu foarte util este rularea selectivă a unor seturi de teste. Să presupunem că există un set de teste (suite) mytest (de fapt nu există). Mai sus, am folosit scriptul ./test.py pentru a rula în paralel o serie de teste, care a apelat de mai multe ori programul de testare test-runner. Apel test-runner direct pentru a efectua un singur test:

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

Argumentele vor fi transmise programului test-runner. Deoarece mytest nu există, va fi generat un mesaj de eroare. Pentru a afișa parametrii disponibili pentru test-runner, introduceți:

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

3.6.2 Debbuging

Pentru a rula programe ns‑3 cu un alt utilitar, cum ar fi un debugger (de exemplu, gdb) sau un instrument de verificare a memoriei (de exemplu, valgrind), folosiți o formă similară - -command-template = "…". De exemplu, pentru a rula în debugger gdb programul dvs. hello-simulator ns‑3 cu argumentele:

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

Rețineți că numele programului ns‑3 vine cu argumentul - run, iar utilitarul de gestionare (aici gdb) este primul token în argumentul - -command-template. Opțiunea - -args raportează gdb, restul liniei de comandă aparține programului 'inferior'. (Unele versiuni gdb nu înțeleg opțiunea - -args. În acest caz, înlăturați argumentele programului din - -command-template și folosiți un set de comenzi gdb args.) Putem combina această rețetă cu cea anterioară pentru a rula un test în debugger:

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

3.6.3 Director de lucru

Waf trebuie să fie rulat din locația sa de la partea superioară a arborelui ns‑3. Această folder devine directorul de lucru, unde vor fi scrise fișierele de ieșire. Dar ce să faceți dacă doriți să păstrați aceste fișiere în afara arborelui sursă ns‑3? Folosiți argumentul - -cwd:

$ .\/waf --cwd=...

Poate că ar fi mai convenabil pentru dvs. să obțineți fișierele de ieșire în directorul dvs. de lucru. În acest caz, poate ajuta o acțiune indirectă:

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

Această decorare a versiunii anterioare a comenzii păstrează directorul de lucru curent, trece în directorul Waf, apoi instruiește Waf să schimbe directorul de lucru înapoi în cel salvat înainte de a rula programul din directorul de lucru curent. Menționăm comanda - -cwd pentru completitudine, majoritatea utilizatorilor pur și simplu rulează Waf din directorul de nivel superior și acolo generează fișierele de ieșire.

Continuare: capitolul 4

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster