Tutorial simulator de rețea ns-3. capitolul 3

Tutorial simulator de rețea ns-3. capitolul 3
capitolul 1,2

3 Introducere
3.1. Prezentare generală
3.2 Cerințe preliminare
3.2.1 Descărcarea versiunii ns-3 ca arhivă sursă
3.3 Descărcarea ns-3 folosind Git
3.3.1 Încărcarea ns-3 folosind Bake
3.4 Asamblare ns-3
3.4.1 Construire cu build.py
3.4.2 Construire cu Bake
3.4.3 Construire cu Waf
3.5 Testarea ns-3
3.6 Rularea scriptului
3.6.1 Argumente ale liniei de comandă
3.6.2 Depanare
3.6.3 Director de lucru

Capitolul 3

Noțiuni de bază

Acest capitol are scopul de a pregăti cititorul pentru a începe cu un computer care poate nu a instalat niciodată ns-3. Acesta acoperă platformele acceptate, cerințele preliminare, cum să obțineți ns-3, cum să construiți ns-3 și cum să vă testați construirea și rularea programelor simple.

3.1. Prezentare generală

Simulatorul ns-3 este construit ca un sistem de biblioteci software colaborative. În timpul asamblarii, codul programelor utilizator este legat de aceste biblioteci. Limbajele de programare C++ sau Python sunt folosite pentru a scrie programe personalizate.

Ns-3 este distribuit ca cod sursă, ceea ce înseamnă că sistemul țintă trebuie să aibă un mediu de dezvoltare software pentru a construi mai întâi bibliotecile și apoi a construi programul utilizatorului. În principiu, ns-3 ar putea fi distribuit ca biblioteci gata făcute pentru un anumit sistem, iar în viitor pot fi distribuite în acest fel. Dar în zilele noastre mulți utilizatori își fac treaba prin editarea ns-3 în sine, așa că este util să aveți codul sursă pentru a construi bibliotecile. Dacă cineva dorește să se ocupe de crearea de biblioteci și pachete gata făcute pentru sisteme de operare, vă rugăm să contactați lista de corespondență ns-dezvoltatori.

În continuare, ne vom uita la trei moduri de a descărca și de a construi ns-3. Primul este să descărcați și să construiți versiunea oficială de pe site-ul principal. Al doilea este selectarea și asamblarea de copii ale versiunilor de dezvoltare ale instalării de bază ns-3. Al treilea este să utilizați instrumente de compilare suplimentare pentru a încărca mai multe extensii pentru ns-3. Vom parcurge fiecare dintre ele, deoarece instrumentele sunt ușor diferite.

Utilizatorii Linux cu experiență s-ar putea întreba de ce ns-3 nu este furnizat ca pachet ca majoritatea altor biblioteci care folosesc un manager de pachete? Deși există pachete binare pentru diverse distribuții Linux (de exemplu, Debian), majoritatea utilizatorilor ajung să editeze bibliotecile și să fie nevoiți să reconstruiască ei înșiși ns-3, așa că este util să aveți codul sursă disponibil. Din acest motiv, ne vom concentra pe instalarea din sursă.

Pentru majoritatea aplicațiilor drepturi ns-3 rădăcină nu sunt necesare, se recomandă utilizarea unui cont de utilizator neprivilegiat.

3.2 Cerințe preliminare

Întregul set de biblioteci ns-3 disponibile are o serie de dependențe de biblioteci terțe, dar în cea mai mare parte ns-3 poate fi construit și utilizat cu suport pentru mai multe componente comune (deseori instalate implicit): un compilator C++, Python, un editor de cod sursă (de exemplu, sevă, emacs sau Eclipsă) și, dacă sunt utilizate depozite de dezvoltare, sisteme de control al versiunilor Git. Majoritatea utilizatorilor începători nu vor trebui să-și facă griji dacă configurația lor raportează că lipsesc unele funcții avansate ns-3, dar pentru cei care doresc o instalare completă, proiectul oferă un wiki care include pagini cu o mulțime de sfaturi și trucuri utile. O astfel de pagină este pagina de instalare, cu instrucțiuni de instalare pentru diferite sisteme, disponibile la: https://www.nsnam.org/wiki/Installation.

Secțiunea Cerințe preliminare a acestui wiki explică ce pachete sunt necesare pentru a accepta opțiunile comune ns-3 și oferă, de asemenea, comenzile folosite pentru a le instala pe versiunile obișnuite ale Linux sau macOS.

Puteți profita de această oportunitate pentru a explora pagina wiki ns-3 sau site-ul principal: https://www.nsnam.org, pentru că există o mulțime de informații acolo. Începând cu cea mai recentă versiune a ns-3 (ns-3.29), sunt necesare următoarele instrumente pentru a rula ns-3:

Pachet de instrumente/Versiune

  • compilator C++
    clang++ sau g++ (g++ versiunea 4.9 sau mai mare)
  • Piton
    versiunea python2 >= 2.7.10 sau versiunea python3 >=3.4
  • merge
    orice cea mai recentă versiune (pentru a accesa ns-3 pe GitLab.com)
  • gudron
    orice cea mai recentă versiune (pentru despachetarea versiunii ns‑3)
  • bunzip2
    orice versiune cea mai recentă (pentru despachetarea versiunii ns‑3)

Pentru a verifica versiunea implicită de Python, tastați python -V. Pentru a verifica versiunea g++, tastați g++ -v. Dacă vreun instrument lipsește sau este prea vechi, consultați ghidul de instalare de pe pagina wiki ns-3.

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

3.2.1 Descărcarea versiunii ns-3 ca arhivă sursă

Acesta este cursul de acțiune pentru un utilizator nou care dorește să descarce și să experimenteze cu cea mai recentă versiune și versiuni de pachet de ns-3. Versiunile ns-3 sunt publicate ca arhive sursă comprimate, uneori numite tarball. tarball este un format de arhivă software special în care mai multe fișiere sunt combinate împreună. Arhiva este de obicei comprimată. procesul de pornire ns-3 prin tarball este simplu, trebuie doar să selectați o versiune, să o descărcați și să o despachetați.

Să presupunem că, ca utilizator, doriți să construiți ns-3 într-un director local numit spațiu de lucru. Puteți obține o copie de lucru a versiunii introducând următoarele în consola Linux (înlocuind numerele de versiune corespunzătoare, desigur)

$ 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 

Atenție la utilitatea 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 aceasta.

Urmând acești pași, veți ajunge la directorul ns-allinone-3.29, acolo 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ă construiți distribuția de bază ns-3 și puteți trece la secțiunea despre construirea ns-3.

3.3 Descărcarea ns-3 folosind Git

Codul ns-3 este disponibil în depozitele Git de pe GitLab.com la adresa https://gitlab.com/nsnam/... grup nsnam reunește diferitele depozite utilizate de un proiect open source.

Cel mai simplu mod de a începe să utilizați depozitele Git este să bifurcați sau să clonați mediul ns-3-alinonă. Acesta este un set de scripturi care gestionează încărcarea și asamblarea celor mai utilizate subsisteme ns-3. Dacă sunteți nou în Git, termenii „furcătură” și „clonă” s-ar putea să vă fie nefamiliare; dacă da, vă recomandăm să clonați pur și simplu (să faceți propria copie) depozitul situat pe GitLab.com astfel:

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

În această etapă, vizualizarea directorului dvs ns-3-alinonă ușor diferit de directorul de arhivă de lansare descris mai sus. Ar trebui să arate cam așa:

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

Vă rugăm să rețineți că există un script download.py, care va extrage suplimentar ns-3 și codul sursă însoțitor. Aici aveți de ales: fie descărcați cel mai recent instantaneu de dezvoltare ns-3:

$ python download.py

sau preferați lansarea ns-3 folosind steag -n pentru a indica numărul de lansare:

$ python download.py -n ns-3.29

După acest pas la director ns-3-alinonă vor fi descărcate depozite suplimentare ns-3, coace, pybindgen и netanim.

Nota
Pe o mașină cu Ubuntu16.04 curat, trebuia să schimb comanda la aceasta: $ sudo python3 download.py -n ns-3.29 (denumite în continuare notele traducătorului).

3.3.1 Încărcarea ns-3 folosind Bake

Cele două metode de mai sus (arhivă sursă sau depozit ns-3-alinonă prin Git) sunt utile pentru a obține cea mai simplă instalare ns-3 cu mai multe suplimente (pybindgen pentru a genera legături Python și netanim pentru animație în rețea). Al treilea depozit furnizat implicit în ns-3-allinone este numit coace.

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

Nota
CradleNetwork Simulation Cradle este un cadru care vă permite să utilizați stive de rețea TCP/IP reale în interiorul unui simulator de rețea.

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

În cele mai recente versiuni ns-3 Coace a fost adăugat la versiunea de gudron. Versiunea include un fișier de configurare care vă permite să descărcați versiunile software curente la momentul lansării. Aceasta este, de exemplu, versiunea Coace, care este distribuit cu ediția ns-3.29, poate fi folosit pentru a prelua componente pentru acea ediție a ns-3 sau anterioară, dar nu poate fi folosit pentru a prelua componente pentru edițiile ulterioare (dacă fișierul de descriere a pachetului bakeconf.xml neactualizat).

De asemenea, puteți obține cea mai recentă copie coaceintroducând următoarea comandă în consola dumneavoastră Linux (presupunând că aveți Git instalat):

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

Când rulați comanda git, ar trebui să vedeți ceva de genul următor:

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.

După finalizarea comenzii clona ar trebui să aveți un director numit coace, al cărui conținut ar trebui să arate cam așa:

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

Rețineți că ați încărcat mai multe scripturi Python, un modul Python numit coace și un fișier de configurare XML. Următorul pas este să utilizați aceste scripturi pentru a descărca și a construi distribuția ns-3 la alegere. Sunt disponibile mai multe obiective de personalizare:

  1. ns-3.29: modul corespunzător lansării; va descărca componente similare versiunii din tarball;

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

  3. ns-alinona-3.29: Un modul care include alte caracteristici suplimentare, cum ar fi rutarea prin clic și suportul de simulare a rețelei, Openflow pentru ns-3.

  4. ns-3-alinonă: similar cu versiunea de lansare a modulului toate intr-unul, dar pentru codul de dezvoltare.

Nota
Clic — arhitectură software modulară pentru crearea de routere.

Openflow este un protocol pentru gestionarea procesului de procesare a datelor transmise printr-o rețea de date de către routere și switch-uri, implementând tehnologia de rețea definită de software.

Instantaneul actual al dezvoltării (non-lansare) ns-3 poate fi găsit la:https://gitlab.com/nsnam/ns-3-dev.git.

Dezvoltatorii încearcă să mențină aceste depozite într-o stare de funcționare consecventă, dar ele se află în zona de dezvoltare și conțin cod nelansat, așa că dacă nu intenționați să utilizați funcții noi, atunci selectați versiunea oficială.

Puteți găsi cea mai recentă versiune a codului răsfoind lista de depozite sau accesând pagina web ns-3 Releases:https://www.nsnam.org/releases/ și făcând clic pe linkul celei mai recente versiuni. În acest exemplu vom continua cu ns-3.29.

Acum, pentru a obține componentele ns-3 de care avem nevoie, vom folosi instrumentul Coace. Să spunem câteva cuvinte introductive despre lucrare Coace.

Bake funcționează prin încărcarea surselor pachetelor într-un director sursă și instalarea bibliotecilor în directorul de compilare. Coace poate fi rulat prin referire la binar, dar dacă doriți să rulați Coace nu din directorul în care a fost descărcat, este indicat să adăugați calea către coace către calea dumneavoastră (variabilă de mediu PATH), de exemplu, după cum urmează (exemplu pentru Linux bash shell). Accesați directorul „coace” și apoi setați următoarele variabile de mediu:

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

Acest lucru va plasa programul coace.py la calea shell-ului și va permite altor programe să găsească executabilele și bibliotecile pe care le-a creat coace. În unele cazuri de utilizare coace, setarea PATH și PYTHONPATH descrise mai sus nu este necesară, dar o construcție completă a ns-3-allinone (cu pachete suplimentare) o necesită de obicei.

Accesați directorul de lucru și introduceți următoarele în consolă:

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

În continuare vom întreba Coace verificați dacă avem suficiente instrumente pentru a încărca diferitele componente. Apelează:

$ ./bake.py check

Ar trebui să vedeți ceva de genul următor:

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

În special, instrumentele de încărcare precum Mercurial, CVS, Git și Bazaar sunt esențiale în acest pas, deoarece ne permit să obținem codul. În acest moment, instalați instrumentele lipsă în modul obișnuit pentru sistemul dvs. (dacă știți cum) sau contactați administratorul de sistem pentru ajutor.

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

$ ./bake.py download

rezultatul ar trebui să fie ceva de genul:

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

Aceasta va însemna că trei surse au fost descărcate. Acum mergeți la directorul sursă și tastați ls; Ar trebui sa vezi:

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

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

3.4 Asamblare ns-3

Ca și în cazul descărcarii 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 folosind un instrument de compilare numit wafdescris mai jos. Majoritatea utilizatorilor vor lucra cu waf, dar există câteva scripturi utile care vă ajută să începeți sau să organizați versiuni mai complexe. Deci, te rog, înainte de a citi despre waf, aruncăm o privire la construi.py si asamblare cu coace.

3.4.1 Construire cu build.py

Atenție! Acest pas de construire este disponibil numai din versiunea arhivă sursă obținută așa cum este descris mai sus; și nu este descărcat prin git sau bake.

Când lucrați cu o arhivă de lansare tarballÎn ns-3-alinonă Există un script la îndemână care poate face asamblarea componentelor mai ușoară. Se numește build.py. Acest program vă va configura proiectul în cel mai util mod. Cu toate acestea, rețineți că o configurare mai avansată și lucrul cu ns-3 implică de obicei utilizarea propriului sistem de construcție al ns-3, Waf, care va fi introdus mai târziu în acest tutorial.

Dacă ați descărcat folosind tarball, apoi în directorul dvs ~/spațiu de lucru un director cu un nume de genul ns-alinona-3.29. Introduceți următoarele:

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

Când chemat construi.py Am folosit argumente de linie de comandă pentru a construi exemplele și testele utilizate în acest tutorial, care nu sunt construite implicit în ns-3. În mod implicit, programul construiește și toate modulele disponibile. Apoi, dacă doriți, puteți construi ns-3 fără exemple și teste sau puteți exclude modulele care nu sunt necesare pentru munca dvs.

Veți vedea o mulțime de mesaje de ieșire ale compilatorului afișate de script pe măsură ce construiește diferitele părți pe care le-ați încărcat. Mai întâi, scenariul va încerca să construiască animatorul netanim, apoi generatorul de legare pybindgen și în final ns-3. Când procesul este finalizat, ar trebui să vedeți următoarele:

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

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

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

Acest lucru înseamnă pur și simplu că unele module ns-3 care depind de biblioteci externe pot să nu fi fost construite sau că nu trebuie să fie construite pentru această configurație. Aceasta nu înseamnă că simulatorul nu este asamblat sau că modulele asamblate nu vor funcționa corect.

3.4.2 Construire cu Bake

Dacă ați folosit bake mai sus pentru a obține codul sursă din depozitele de proiect, puteți continua să îl utilizați pentru a construi ns-3. Apelează:

$ ./bake.py build

și ar trebui să vezi ceva de genul:

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

ajutor: Puteți, de asemenea, să faceți atât descărcarea, cât și pașii de compilare, apelând „bake.py deploy”.

Asamblarea tuturor componentelor poate eșua, dar asamblarea va continua dacă nu este necesară o componentă. De exemplu, o problemă recentă de portabilitate a fost aceea castxml poate fi asamblat cu unealtă coace nu pe toate platformele. În acest caz, va apărea un mesaj ca acesta:

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

Dar castxml este necesar doar dacă doriți să creați legături Python actualizate. Pentru majoritatea utilizatorilor nu este nevoie de acest lucru (cel puțin până când vor schimba ns-3), astfel încât astfel de avertismente pot fi ignorate în siguranță pentru moment.

Dacă eșuează, următoarea comandă vă va oferi un indiciu despre dependențe lipsă:

$ ./bake.py show

Diferitele dependențe ale pachetelor pe care încercați să le construiți vor fi listate.

3.4.3 Construire cu Waf

Până în acest moment, pentru a începe construirea ns-3, am folosit fie scriptul construi.py, sau instrument coace. Aceste instrumente sunt utile pentru construirea ns-3 și întreținerea bibliotecilor. De fapt, pentru a construi ei rulează instrumentul de construire waf din directorul ns-3. waf instalat cu codul sursă ns-3. Majoritatea utilizatorilor trec rapid la utilizarea directă pentru a configura și a asambla ns-3 waf. Deci, pentru a continua, mergeți la directorul ns-3 pe care l-ați creat inițial.

Acest lucru nu este strict necesar în acest moment, dar va fi util să reveniți puțin și să vedeți cum să faceți modificări în configurația proiectului. Probabil cea mai utilă modificare de configurare pe care o puteți face este să creați o versiune optimizată a codului. În mod implicit, ați configurat proiectul pentru a construi o versiune de depanare. Să aruncăm o privire la un proiect pentru a crea o construcție optimizată. Pentru a explica lui Waf că ar trebui să facă versiuni optimizate care să includă exemple și teste, va trebui să rulați următoarele comenzi:

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

Aceasta se va lansa waf în afara directorului local (pentru comoditatea dvs.). Prima comandă curăță din versiunea anterioară, acest lucru nu este de obicei strict necesar, dar este o practică bună (vezi și profilele de construcție de mai jos); aceasta va șterge bibliotecile create anterior și fișierele obiect aflate în director construi/. Când proiectul este reconfigurat și sistemul de compilare verifică diferitele dependențe, ar trebui să vedeți rezultate similare cu următoarea:

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)

Vă rugăm să rețineți ultima parte a listei de mai sus. Unele opțiuni ns-3 nu sunt activate în mod implicit sau necesită asistență de sistem 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 ns-3 corespunzătoare nu a fost activată, va fi afișat un mesaj. De asemenea, rețineți că este posibil să utilizați comanda sudo pentru a seta bitul suid „set group ID at runtime” pentru anumite programe. Nu este activată implicit și, prin urmare, această caracteristică apare ca „neactivată”. În cele din urmă, pentru a obține o listă de opțiuni activate, utilizați waf cu parametru --check-config.

Acum să revenim și să revenim la versiunea de depanare care conține exemple și teste.

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

Sistemul de compilare este acum configurat și puteți construi versiuni de depanare ale programelor ns-3 tastând pur și simplu:

$ ./waf

Este posibil ca pașii de mai sus să vă fi forțat să construiți o parte a sistemului ns-3 de două ori, dar acum știți cum să schimbați configurația și să construiți cod optimizat.

Pentru a verifica ce profil este activ pentru o anumită configurație de proiect, există o comandă:

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

Scenariul de mai sus construi.py susține și argumente --enable-examples и --enable-tests, dar alte variante waf nu suportă direct. De exemplu, acest lucru nu va funcționa:

$ ./build.py --disable-python

reactia va fi asa:

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

Cu toate acestea, operatorul special - - poate fi folosit pentru a trece parametri suplimentari prin WAFdeci, în loc de cele de mai sus, următoarea comandă va funcționa:

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

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

Gestionarea erorilor de construcție

Versiunile ns-3 sunt testate pe cele mai recente compilatoare C++ disponibile la momentul lansării pe distribuțiile comune Linux și MacOS. Cu toate acestea, de-a lungul timpului, noi distribuții sunt lansate cu compilatoare noi, iar aceste compilatoare mai noi tind să fie mai pedanți cu privire la avertismente. ns-3 își configurează construcția pentru a trata toate avertismentele ca erori, așa că, uneori, dacă rulați o versiune mai veche pe un sistem mai nou, un avertisment al compilatorului poate opri construcția.

De exemplu, a existat anterior o lansare a ns-3.28 pentru Fedora 28, care includea o nouă versiune majoră gcc (gcc-8). Construind versiunea ns-3.28 sau versiuni anterioare sub Fedora 28, cu Gtk2+ instalat, va apărea următoarea 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 care încep de la ns‑3.28.1, în waf este disponibilă o opțiune pentru a rezolva aceste probleme. Dezactivează setarea steagului „-Werror” în g++ și clang++. Aceasta este opțiunea „--disable-werror” și trebuie aplicată în timpul configurării:

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

Configurați sau asamblați

Unele comenzi waf au sens doar în faza de configurare, iar unele sunt valabile doar în faza de construire. De exemplu, dacă doriți să utilizați funcțiile de emulare ns-3, puteți activa setarea biților sud folosind sudo, așa cum este descris mai sus. Aceasta va suprascrie comenzile pasului de configurare și, astfel, puteți modifica configurația folosind următoarea comandă, care include și exemple și teste.

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

Dacă faci asta waf va lansa sudopentru a schimba programele de creare a socketului codului de emulare pentru a rula cu permisiuni rădăcină. În waf Există multe alte opțiuni disponibile pentru configurarea și pașii de construire. Pentru a vă explora opțiunile, introduceți:

$ ./waf --help

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

Profile de asamblare

Am văzut deja cum puteți configura waf pentru ansambluri depana и optimizate:

$ ./waf --build-profile=debug

Există și un profil de asamblare intermediar, eliberaţi. Opțiune -d este sinonim cu --build-profile. Profilul de compilare controlează utilizarea comutatoarelor de jurnalizare, aserțiuni și optimizare a compilatorului:

Tutorial simulator de rețea ns-3. capitolul 3

După cum puteți vedea, înregistrarea și aserțiunile sunt disponibile numai în versiunile de depanare. Practica recomandată este să vă dezvoltați scriptul în modul de depanare, apoi să efectuați rulări repetate (pentru statistici sau modificări ale parametrilor) într-un profil de compilare optimizat.

Dacă aveți cod care ar trebui să ruleze numai în anumite profiluri de compilare, utilizați Macro-ul Cod 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;)

Mod implicit, waf plasează artefacte de construcție în directorul de compilare. Puteți specifica un director de ieșire diferit folosind opțiunea - -out, de exemplu:

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

Combinând acest lucru cu profiluri de compilare, puteți comuta cu ușurință î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
...

Ceea ce vă permite să lucrați cu mai multe ansambluri fără a fi nevoie să rescrieți cel mai recent ansamblu de fiecare dată. Când treceți la alt profil, waf va compila numai acesta, fără a recompila complet totul.

Când schimbați profilurile de construcție în acest mod, trebuie să aveți grijă să oferiți aceleași opțiuni de configurare de fiecare dată. Definirea mai multor variabile de mediu vă va ajuta să evitați greșelile:

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

În exemplele de mai sus waf pentru a construi ns-3 folosește compilatorul C++ de la GCC ( g ++). Cu toate acestea, îl puteți schimba pe cel pe care îl utilizați waf Compilatorul C++, prin definirea variabilei de mediu CXX. De exemplu, pentru a utiliza compilatorul C++ Clang, clang++,

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

În același mod, puteți configura waf pentru a utiliza compilarea distribuită folosind distcc:

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

Mai multe informații despre distcc și compilarea distribuită pot fi găsite pe pagina proiectului din secțiunea Documentație. Pentru a adăuga steaguri de compilator la configurarea ns-3, utilizați variabila de mediu CXXFLAGS_EXTRA.

Instalare

waf poate fi folosit pentru a instala biblioteci în diferite locuri ale sistemului. În mod implicit, bibliotecile compilate și executabilele sunt localizate în director construiși, deoarece Waf știe locația acestor biblioteci și executabile, nu este nevoie să instalați bibliotecile în altă parte.

Dacă utilizatorii preferă să instaleze în afara directorului de compilare, pot rula comanda ./waf instalare. Prefixul implicit pentru instalare este / Usr / localAstfel ./waf instalare va instala programe în / / Local / bin usr, biblioteci în / Usr / local / lib și fișierele antet în /usr/local/include. Drepturile superutilizatorului trebuie de obicei setate cu un prefix implicit, deci o comandă tipică ar fi sudo ./waf install. Când este lansat, Waf va alege mai întâi să folosească bibliotecile partajate în directorul de compilare, apoi va căuta biblioteci de-a lungul căii către bibliotecile configurate în mediul local. Deci, atunci când instalați biblioteci pe un sistem, este o bună practică să verificați dacă sunt utilizate bibliotecile potrivite. Utilizatorii pot alege să instaleze cu un prefix diferit trecând opțiunea în timpul configurării --prefix, de exemplu:

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

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

Echipă ./waf clean trebuie utilizat înainte de a reconfigura proiectul dacă instalarea va folosi waf sub un prefix diferit.

Astfel, pentru a folosi ns-3 nu este nevoie 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 pot găsi acest lucru util dacă activitățile lor implică lucrul cu programe din afara directorului ns-3.

Waf single

La nivelul superior al arborelui sursă ns-3, există un singur script Waf. Odată ce începi să lucrezi, vei petrece mult timp în director scratch/ sau mai adânc însrc/... și în același timp trebuie să alerge waf. Poți doar să-ți amintești unde ești și să alergi waf după cum urmează:

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

dar acest lucru va fi plictisitor și predispus la erori, deci există soluții mai bune. O modalitate obișnuită este de a folosi un editor de text, cum ar fi emacs sau sevă, în care sunt deschise două sesiuni de terminal, una este folosită pentru a construi ns-3, iar a doua este folosită pentru a edita codul sursă. Dacă ai doar tarball, atunci o variabilă de mediu poate ajuta:

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

$ cd scratch 
$ waff build

În directorul modulului ar putea fi tentant să adăugați un script waf banal, cum ar fi exec ../../waf. Te rog, nu face asta. Acest lucru este confuz pentru începători și, atunci când este făcut prost, duce la erori de compilare greu de detectat. Soluțiile prezentate mai sus sunt calea care ar trebui utilizată.

3.5 Testarea ns-3

Puteți rula testele unitare ale distribuției ns-3 rulând scriptul ./test.py:

$ ./test.py

Aceste teste sunt efectuate în paralel cu waf. În cele din urmă, ar trebui să vedeți un mesaj care spune:

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

Acesta este un mesaj important pentru identificarea erorilor, blocărilor sau erorilor valgrind, indicând probleme cu codul sau incompatibilitatea dintre instrumente și cod.

Veți vedea, de asemenea, rezultatul final de la waf și un tester care execută fiecare test, care va arăta cam așa:

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)

Această comandă este de obicei rulată de utilizatori pentru a verifica rapid dacă distribuția ns-3 este construită corect. (Rețineți că ordinea liniilor „PASS: ...” poate fi diferită, acest lucru este normal. Ceea ce este important este că linia rezumată de la sfârșitul raportului arată că toate testele au trecut; niciun test nu a eșuat sau s-a prăbușit.) Și wafși test.py va paraleliza munca între nucleele de procesor disponibile ale mașinii.

3.6 Rularea scriptului

De obicei rulăm scripturi sub control waf. Acest lucru permite sistemului de compilare să se asigure că căile de bibliotecă partajată sunt setate corect și că bibliotecile sunt disponibile în timpul execuției. Pentru a rula programul, pur și simplu utilizați waf cu parametru - -run. Să rulăm echivalentul ns-3 al programului omniprezent Bună ziua lumetastând următoarele:

$ ./waf --run hello-simulator

Waf va verifica mai întâi dacă programul este construit corect și va construi dacă este necesar. Apoi waf va executa un program care produce următoarea ieșire.

Hello Simulator

Felicitări! Acum sunteți utilizator ns-3!

Ce ar trebui să fac dacă nu văd rezultate?

Dacă vezi mesaje wafindicând faptul că construcția s-a finalizat cu succes, dar nu vedeți rezultatul „Salut Simulator”, atunci există posibilitatea ca în secțiunea [Build-with-Waf] să fi schimbat modul de construire la optimizate, dar nu a revenit la modul depana. Toate ieșirile din consolă utilizate în acest tutorial utilizează o componentă specială ns-3 care realizează înregistrarea în jurnal și este folosită pentru a tipări mesaje personalizate pe consolă. Ieșirea din această componentă este dezactivată automat când codul optimizat este compilat - este „optimizat”. Dacă nu vedeți ieșirea „Hello Simulator”, introduceți următoarele:

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

a personaliza waf pentru a construi versiuni de depanare ale programelor ns-3, care includ exemple și teste. Ar trebui apoi să reconstruiți versiunea curentă de depanare a codului tastând

$ ./waf

Acum, dacă rulați programul salut-simulator, ar trebui să vedeți rezultatul așteptat.

3.6.1 Argumente ale liniei de comandă

Pentru a transmite argumente de linie de comandă programului ns-3, utilizați următorul model:

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

A inlocui la numele programului dumneavoastră și la argumente. Argument - -command-template pentru waf este în esență o rețetă pentru construirea liniei de comandă actuale waf folosit pentru a executa programul. Waf verifică dacă construcția este completă, setează căile de bibliotecă partajată, apoi folosește șablonul de linie de comandă furnizat și înlocuiește numele programului cu substituentul %s pentru a apela executabilul. Dacă ți se pare complicată această sintaxă, există o versiune mai simplă care implică programul ns-3 și argumentele sale cuprinse între ghilimele simple:

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

Un alt exemplu deosebit de util este rularea selectivă a suitelor de testare. Să presupunem că există o suită de teste numită mytest (de fapt nu există). Mai sus am folosit scriptul ./test.py pentru a rula o serie de teste în paralel, care apelează în mod repetat programul de testare alergător de încercare. Apel alergător de încercare direct pentru a rula un test:

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

Argumentele vor fi transmise programului alergător de încercare. Deoarece mytest nu există, va fi generat un mesaj de eroare. Pentru a imprima opțiunile disponibile pentru test-runner, introduceți:

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

3.6.2 Depanare

Pentru a rula programe ns-3 sub alt utilitar, cum ar fi un depanator (de exemplu, gDB) sau un instrument de testare a memoriei (de exemplu, valgrind), utilizați o formă similară - -command-template = "…". De exemplu, pentru a rula în depanator gDB programul dvs. hello-simulator ns-3 cu argumente:

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

Rețineți că numele programului ns-3 vine cu argumentul - -run, și utilitarul de management (aici gDB) este primul simbol din argument - -command-template. Opțiune - -args rapoarte gDBcă restul liniei de comandă aparține programului „inferior”. (Unele versiuni gDB nu inteleg varianta - -args. În acest caz, eliminați argumentele programului din - -command-template și utilizați setul de comenzi gDB args.) Putem combina această rețetă cu cea anterioară pentru a rula testul sub depanator:

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

3.6.3 Director de lucru

Waf ar trebui să fie lansat din locația sa din vârful arborelui ns-3. Acest folder devine directorul de lucru în care vor fi scrise fișierele de ieșire. Dar ce se întâmplă dacă doriți să păstrați aceste fișiere în afara arborelui sursă ns-3? Folosește argument - -cwd:

$ ./waf --cwd=...

S-ar putea să vă fie mai convenabil să obțineți fișierele de ieșire în directorul de lucru. În acest caz, următoarea acțiune indirectă poate ajuta:

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

Această decorare a versiunii anterioare a comenzii salvează directorul de lucru curent, merge la director wafși apoi instruiește waf pentru a schimba directorul de lucru înapoi în directorul de lucru curent salvat înainte de a porni programul. Mentionam echipa - -cwd Pentru a fi complet, majoritatea utilizatorilor pur și simplu rulează Waf din directorul de nivel superior și generează fișiere de ieșire acolo.

Continuare: Capitolul 4

Sursa: www.habr.com

Adauga un comentariu