vodič za simulator mreže ns-3. Poglavlje 3

vodič za simulator mreže ns-3. Poglavlje 3
poglavlje 1,2

3 Početak rada
3.1 Pregled
3.2 Preduvjeti
3.2.1 Preuzimanje ns-3 izdanja kao izvorne arhive
3.3 Preuzimanje ns-3 pomoću Gita
3.3.1 Učitavanje ns-3 pomoću funkcije Bake
3.4 Montaža ns-3
3.4.1 Izgradnja s build.py
3.4.2 Izgradnja s Bakeom
3.4.3 Gradite s Wafom
3.5 Ispitivanje ns-3
3.6 Pokretanje skripte
3.6.1 Argumenti naredbenog retka
3.6.2 Otklanjanje pogrešaka
3.6.3 Radni imenik

Poglavlje 3

Početak

Ovo poglavlje ima za cilj pripremiti čitatelja za početak s računalom koje možda nikada nije instaliralo ns-3. Pokriva podržane platforme, preduvjete, kako dobiti ns-3, kako izgraditi ns-3 i kako testirati svoju izgradnju i pokrenuti jednostavne programe.

3.1 Pregled

Simulator ns-3 izgrađen je kao sustav kolaborativnih softverskih biblioteka. Tijekom asemblera kod korisničkih programa se povezuje s tim bibliotekama. Programski jezici C++ ili Python koriste se za pisanje prilagođenih programa.

Ns-3 se distribuira kao izvorni kod, što znači da ciljni sustav mora imati okruženje za razvoj softvera kako bi se prvo izgradile biblioteke, a zatim izgradio korisnički program. U principu, ns-3 bi se mogli distribuirati kao gotove biblioteke za određeni sustav, au budućnosti bi se mogle distribuirati i na ovaj način. Ali danas mnogi korisnici zapravo rade svoj posao uređujući sam ns-3, tako da je korisno imati izvorni kod za izgradnju biblioteka. Ako bi netko želio preuzeti posao izrade gotovih biblioteka i paketa za operativne sustave, molimo kontaktirajte mailing listu ns-programeri.

Zatim ćemo pogledati tri načina preuzimanja i izrade ns-3. Prvi je preuzimanje i izrada službenog izdanja s glavne stranice. Drugi je odabir i montaža primjeraka razvojnih verzija osnovne instalacije ns-3. Treći je korištenje dodatnih alata za izgradnju za učitavanje više proširenja za ns-3. Proći ćemo kroz svaki jer se alati malo razlikuju.

Iskusni korisnici Linuxa mogu se pitati zašto ns-3 nije dostupan kao paket kao većina drugih biblioteka koje koriste upravitelj paketa? Iako postoje binarni paketi za razne distribucije Linuxa (npr. Debian), većina korisnika na kraju uredi biblioteke i mora sama ponovno izgraditi ns-3, tako da je dostupnost izvornog koda zgodna. Iz tog razloga ćemo se usredotočiti na instalaciju iz izvora.

Za većinu aplikacija ns-3 prava korijen nisu potrebni, preporučuje se korištenje neprivilegiranog korisničkog računa.

3.2 Preduvjeti

Cijeli skup dostupnih ns-3 biblioteka ima niz ovisnosti o bibliotekama trećih strana, ali većinom se ns-3 može izgraditi i koristiti uz podršku za nekoliko uobičajenih (često instaliranih prema zadanim postavkama) komponenti: C++ kompajler, Python, uređivač izvornog koda (npr. energija, Emacs ili Pomračenje) i, ako se koriste razvojna spremišta, Git sustavi za kontrolu verzija. Većina novih korisnika neće se morati brinuti ako njihova konfiguracija izvijesti da neke ns-3 napredne značajke nedostaju, ali za one koji žele potpunu instalaciju, projekt nudi wiki koji uključuje stranice s puno korisnih savjeta i trikova. Jedna takva stranica je instalacijska stranica, s uputama za instalaciju za različite sustave, dostupna na: https://www.nsnam.org/wiki/Installation.

Odjeljak Preduvjeti ovog wikija objašnjava koji su paketi potrebni za podršku uobičajenih ns-3 opcija i također pruža naredbe koje se koriste za njihovu instalaciju na uobičajenim verzijama Linuxa ili macOS-a.

Možete iskoristiti ovu priliku da istražite ns-3 wiki stranicu ili glavnu web stranicu: https://www.nsnam.org, jer tamo ima puno informacija. Počevši od najnovije verzije ns-3 (ns-3.29), za pokretanje ns-3 potrebni su sljedeći alati:

Paket/verzija alata

  • C++ prevodilac
    clang++ ili g++ (g++ verzija 4.9 ili novija)
  • Piton
    python2 verzija >= 2.7.10 ili python3 verzija >=3.4
  • ići
    bilo koja najnovija verzija (za pristup ns-3 na GitLab.com)
  • katran
    bilo koja najnovija verzija (za raspakiranje izdanja ns‑3)
  • bunzip2
    bilo koja najnovija verzija (za raspakiranje izdanja ns‑3)

Da biste provjerili zadanu verziju Pythona, upišite python -V. Da biste provjerili verziju g++, upišite g++ -v. Ako bilo koji alat nedostaje ili je prestar, pogledajte vodič za instalaciju na ns-3 wiki stranici.

Od sada nadalje, pretpostavljamo da čitač koristi Linux, MacOS ili Linux emulator i da ima barem gore navedene alate.

3.2.1 Preuzimanje ns-3 izdanja kao izvorne arhive

Ovo je postupak za novog korisnika koji želi preuzeti i eksperimentirati s najnovijim izdanjem i verzijama paketa ns-3. ns-3 izdanja objavljuju se kao komprimirane izvorne arhive, ponekad se nazivaju tarball. tarball je poseban softverski arhivski format u kojem se nekoliko datoteka kombinira zajedno. Arhiva je obično komprimirana. ns-3 proces pokretanja putem tarball je jednostavan, samo trebate odabrati izdanje, preuzeti ga i raspakirati.

Pretpostavimo da vi, kao korisnik, želite izgraditi ns-3 u lokalnom imeniku zvanom radni prostor. Radnu kopiju izdanja možete dobiti unosom sljedećeg u Linux konzolu (naravno, zamjenom odgovarajućih brojeva verzija)

$ 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 

Obratite pozornost na gore korišteni uslužni program wget, koji je alat naredbenog retka za preuzimanje objekata s Interneta. Ako ga niste instalirali, za to možete koristiti svoj preglednik.

Slijedeći ove korake odvest ćete vas do direktorija ns-allinone-3.29, tamo biste trebali vidjeti nekoliko datoteka i direktorija

$ 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

Sada ste spremni za izgradnju ns-3 osnovne distribucije i možete prijeći na odjeljak o izgradnji ns-3.

3.3 Preuzimanje ns-3 pomoću Gita

Kod ns-3 dostupan je u Git repozitoriju na GitLab.com na adresi https://gitlab.com/nsnam/. Skupina nsnam okuplja različite repozitorije koje koristi projekt otvorenog koda.

Najlakši način za početak korištenja Git repozitorija je račvanje ili kloniranje okruženja ns-3-alinon. Ovo je skup skripti koji upravlja učitavanjem i sastavljanjem najčešće korištenih ns-3 podsustava. Ako ste novi u Gitu, pojmovi "fork" i "klon" možda vam nisu poznati; ako je tako, preporučujemo da jednostavno klonirate (napravite vlastitu kopiju) repozitorij koji se nalazi na GitLab.com ovako:

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

U ovoj fazi, pogled na vaš imenik ns-3-alinon malo drugačiji od gore opisanog direktorija arhive izdanja. Trebalo bi izgledati otprilike ovako:

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

Imajte na umu da postoji skripta preuzimanje.py, koji će dodatno izdvojiti ns-3 i prateći izvorni kod. Ovdje imate izbor: ili preuzmite najnoviju snimku razvoja ns-3:

$ python download.py

ili preferirajte izdanje ns-3 pomoću oznake -n za označavanje broja izdanja:

$ python download.py -n ns-3.29

Nakon ovog koraka u imenik ns-3-alinon dodatna spremišta bit će preuzeta ns-3, ispeći, pybindgen и netanim.

Primijetiti
Na stroju s čistim Ubuntu16.04, morao sam promijeniti naredbu u ovu: $ sudo python3 download.py -n ns-3.29 (u daljnjem tekstu bilješke prevoditelja).

3.3.1 Učitavanje ns-3 pomoću funkcije Bake

Gornje dvije metode (izvorna arhiva ili repozitorij ns-3-alinon putem Gita) korisni su za dobivanje najjednostavnije ns-3 instalacije s višestrukim dodacima (pybindgen za generiranje Python veza i netanim za mrežnu animaciju). Poziva se treće spremište dano prema zadanim postavkama u ns-3-allinone ispeći.

Pečenje je alat za koordiniranu izgradnju softvera iz više repozitorija, razvijen za projekt ns-3. Pečenje može se koristiti za dobivanje razvojnih verzija ns-3, kao i za preuzimanje i izgradnju proširenja osnovne verzije ns-3 distribucije, kao što je okruženje Izravno izvršavanje koda, CradleNetwork simulacija Cradle, mogućnost stvaranja novih Python veza i raznih ns-3 “aplikacija”.

Primijetiti
CradleNetwork Simulation Cradle je okvir koji vam omogućuje korištenje stvarnih TCP/IP mrežnih skupova unutar mrežnog simulatora.

Ako očekujete da vaša instalacija ns-3 ima napredne ili dodatne značajke, možete slijediti ovaj put instalacije.

U najnovijim izdanjima ns-3 Pečenje je dodan u tar izdanje. Izdanje uključuje konfiguracijsku datoteku koja vam omogućuje preuzimanje trenutnih verzija softvera u vrijeme izdanja. To je npr. verzija Pečenje, koji se distribuira s izdanjem ns-3.29, može se koristiti za dohvaćanje komponenti za to izdanje ns-3 ili ranije, ali se ne može koristiti za dohvaćanje komponenti za kasnija izdanja (ako datoteka opisa paketa bakeconf.xml nije ažuriran).

Također možete dobiti najnoviji primjerak ispećiunosom sljedeće naredbe u svoju Linux konzolu (pod pretpostavkom da imate instaliran Git):

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

Kada pokrenete naredbu git, trebali biste vidjeti nešto poput sljedećeg:

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.

Nakon završetka naredbe klon trebali biste imati imenik pod nazivom ispeći, čiji bi sadržaj trebao izgledati otprilike ovako:

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

Imajte na umu da ste učitali nekoliko Python skripti, Python modul pod nazivom ispeći i XML konfiguracijsku datoteku. Sljedeći korak je korištenje ovih skripti za preuzimanje i izgradnju ns-3 distribucije po vašem izboru. Dostupno je nekoliko ciljeva prilagodbe:

  1. ns-3.29: modul koji odgovara izdanju; preuzet će komponente slične izdanju u tarballu;

  2. ns-3-dev: sličan modul, ali koristeći kod iz razvojnog stabla;

  3. ns-allinon-3.29: Modul koji uključuje druge dodatne značajke kao što su Click routing i Network Simulation Cradle, Openflow za ns-3.

  4. ns-3-alinon: slično izdanju verzije modula alinon, ali za razvojni kod.

Primijetiti
Kliknite — modularna softverska arhitektura za izradu usmjerivača.

Openflow je protokol za upravljanje procesom obrade podataka koji se putem podatkovne mreže prenose usmjerivačima i preklopnicima, implementirajući softverski definiranu mrežnu tehnologiju.

Trenutni razvojni snimak (neizdanje) ns-3 može se pronaći na:https://gitlab.com/nsnam/ns-3-dev.git.

Programeri pokušavaju održati ova spremišta u dosljednom radnom stanju, ali ona su u području razvoja i sadrže neobjavljeni kod, pa ako ne planirate koristiti nove značajke, odaberite službeno izdanje.

Najnoviju verziju koda možete pronaći pregledavanjem popisa repozitorija ili odlaskom na web stranicu ns-3 Releases:https://www.nsnam.org/releases/ i klikom na vezu najnovije verzije. U ovom primjeru nastavit ćemo s ns-3.29.

Sada, da bismo dobili ns-3 komponente koje su nam potrebne, upotrijebit ćemo alat Pečenje. Recimo nekoliko uvodnih riječi o djelu Pečenje.

Bake radi učitavanjem izvora paketa u direktorij izvor i instaliranje biblioteka u direktorij za izgradnju. Pečenje može se pokrenuti pozivanjem na binarnu datoteku, ali ako želite pokrenuti Pečenje ne iz direktorija u kojem je preuzet, preporučljivo je dodati put do ispeći na vaš put (varijabla okruženja PATH), na primjer kako slijedi (primjer za Linux bash shell). Idite u direktorij "bake" i zatim postavite sljedeće varijable okruženja:

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

Ovo će postaviti program ispeći.py na stazu ljuske i omogućit će drugim programima da pronađu izvršne datoteke i biblioteke koje je stvorio ispeći. U nekim slučajevima upotrebe ispeći, postavka PATH i PYTHONPATH opisana gore nije potrebna, ali je potpuna izrada ns-3-allinona (s dodatnim paketima) obično zahtijeva.

Idite u svoj radni direktorij i unesite sljedeće u konzolu:

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

Dalje ćemo pitati Pečenje provjeriti imamo li dovoljno alata za učitavanje raznih komponenti. Brojčanik:

$ ./bake.py check

Trebali biste vidjeti nešto poput sljedećeg:

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

Konkretno, alati za učitavanje kao što su Mercurial, CVS, Git i Bazaar ključni su u ovom koraku jer nam omogućuju dobivanje koda. U ovom trenutku instalirajte alate koji nedostaju na uobičajeni način za vaš sustav (ako znate kako) ili kontaktirajte svog administratora sustava za pomoć.

Zatim pokušajte preuzeti softver:

$ ./bake.py download

rezultat bi trebao biti nešto poput:

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

To će značiti da su preuzeta tri izvora. Sada idite u izvorni direktorij i upišite ls; Trebali biste vidjeti:

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

Sada ste spremni za izgradnju ns-3 distribucije.

3.4 Montaža ns-3

Kao i kod preuzimanja ns-3, postoji nekoliko načina za izgradnju ns-3. Glavna stvar koju želimo naglasiti je da je ns-3 izgrađen pomoću alata za izgradnju tzv WAFopisano u nastavku. Većina korisnika će raditi s WAF, ali postoji nekoliko praktičnih skripti koje će vam pomoći da započnete ili organizirate složenije gradnje. Stoga vas molim, prije nego što pročitate o WAF, Pogledaj izgraditi.py i montaža sa ispeći.

3.4.1 Izgradnja s build.py

Upozorenje! Ovaj korak izgradnje dostupan je samo iz verzije izvorne arhive dobivene kako je gore opisano; a ne preuzima se putem gita ili bakea.

Kada radite s arhivom izdanja tarballU ns-3-alinon Postoji praktična skripta koja može olakšati sastavljanje komponenti. Zove se build.py. Ovaj program će za vas postaviti projekt na najkorisniji način. Međutim, imajte na umu da naprednije postavljanje i rad s ns-3 obično uključuje korištenje vlastitog sustava za izradu ns-3, Waf, koji će biti predstavljen kasnije u ovom vodiču.

Ako ste preuzeli pomoću tarball, zatim u svom imeniku ~/radni prostor imenik s nazivom otprilike ns-allinon-3.29. Unesite sljedeće:

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

Na poziv izgraditi.py Koristili smo argumente naredbenog retka za izradu primjera i testova korištenih u ovom vodiču, koji nisu izgrađeni prema zadanim postavkama u ns-3. Prema zadanim postavkama, program također gradi sve dostupne module. Zatim, ako želite, možete izgraditi ns-3 bez primjera i testova ili isključiti module koji nisu potrebni za vaš rad.

Vidjet ćete puno izlaznih poruka prevoditelja koje prikazuje skripta dok gradi različite dijelove koje ste učitali. Prvo će skripta pokušati izgraditi animatora netanim, zatim generator vezivanja pybindgen i konačno ns-3. Kada se proces završi, trebali biste vidjeti sljedeće:

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

U zadnja tri retka popisa vidimo poruku o modulima koji nisu izgrađeni:

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

To jednostavno znači da neki ns-3 moduli koji ovise o vanjskim bibliotekama možda nisu izgrađeni ili da ih nije potrebno izgraditi za ovu konfiguraciju. To ne znači da simulator nije sastavljen ili da sastavljeni moduli neće raditi ispravno.

3.4.2 Izgradnja s Bakeom

Ako ste gore koristili bake za dobivanje izvornog koda iz repozitorija projekta, možete ga nastaviti koristiti za izgradnju ns-3. Brojčanik:

$ ./bake.py build

i trebali biste vidjeti nešto poput:

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

potaknuti: Također možete izvršiti i korake preuzimanja i izgradnje odjednom pozivanjem "bake.py deploy".

Sastavljanje svih komponenti možda neće uspjeti, ali će se sastavljanje nastaviti ako komponenta nije potrebna. Na primjer, nedavni problem prenosivosti bio je taj castxml može se sastaviti pomoću alata ispeći ne na svim platformama. U tom slučaju pojavit će se ovakva poruka:

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

Ali castxml potreban samo ako želite stvoriti ažurirana Python povezivanja. Za većinu korisnika za tim nema potrebe (barem dok ne promijene ns-3), pa se takva upozorenja za sada mogu mirno ignorirati.

Ako ne uspije, sljedeća naredba će vam dati savjet o nedostajućim ovisnostima:

$ ./bake.py show

Bit će navedene različite ovisnosti paketa koje pokušavate izgraditi.

3.4.3 Gradite s Wafom

Do ove točke, za početak izgradnje ns-3, koristili smo skriptu izgraditi.py, ili alat ispeći. Ovi su alati korisni za izgradnju ns-3 i održavanje knjižnica. Zapravo, za izgradnju pokreću alat za izgradnju WAF iz imenika ns-3. WAF instaliran s ns-3 izvornim kodom. Većina korisnika brzo prijeđe na izravnu upotrebu za konfiguriranje i sastavljanje ns‑3 WAF. Dakle, da nastavite, idite na ns-3 direktorij koji ste izvorno kreirali.

Ovo trenutno nije striktno potrebno, ali bit će korisno vratiti se malo unatrag i vidjeti kako izvršiti izmjene u konfiguraciji projekta. Vjerojatno najkorisnija promjena konfiguracije koju možete napraviti je stvaranje optimizirane verzije koda. Prema zadanim postavkama, konfigurirali ste svoj projekt za izradu verzije za otklanjanje pogrešaka. Pogledajmo projekt za stvaranje optimizirane građe. Kako biste objasnili Wafu da bi trebao izraditi optimizirane verzije koje uključuju primjere i testove, morat ćete pokrenuti sljedeće naredbe:

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

Ovo će se pokrenuti WAF izvan lokalnog imenika (za vašu udobnost). Prva naredba čisti iz prethodne izgradnje, to obično nije striktno potrebno, ali je dobra praksa (također pogledajte profile izgradnje u nastavku); ovo će izbrisati prethodno stvorene biblioteke i objektne datoteke koje se nalaze u direktoriju izgraditi/. Kada se projekt ponovno konfigurira i sustav izrade provjerava različite ovisnosti, trebali biste vidjeti izlaz sličan sljedećem:

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)

Obratite pažnju na posljednji dio gornjeg popisa. Neke ns-3 opcije nisu omogućene prema zadanim postavkama ili zahtijevaju podršku sustava za ispravno funkcioniranje. Na primjer, da biste omogućili XmlTo, biblioteka mora biti prisutna u sustavu libxml-2.0. Ako ova biblioteka nije pronađena i odgovarajuća ns-3 funkcija nije bila omogućena, prikazat će se poruka. Također imajte na umu da je moguće koristiti naredbu sudo za postavljanje suid bita “postavi ID grupe tijekom izvođenja” za određene programe. Nije omogućeno prema zadanim postavkama i stoga se ova značajka pojavljuje kao "nije omogućeno". Na kraju, da biste dobili popis omogućenih opcija, upotrijebite WAF s parametrom --check-config.

Sada se vratimo i vratimo na verziju za otklanjanje pogrešaka koja sadrži primjere i testove.

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

Sustav izgradnje je sada postavljen i možete izgraditi verzije programa za ispravljanje pogrešaka ns-3 jednostavnim upisivanjem:

$ ./waf

Gore navedeni koraci možda su vas prisilili da dvaput izgradite dio ns-3 sustava, ali sada znate kako promijeniti konfiguraciju i izgraditi optimizirani kod.

Da biste provjerili koji je profil aktivan za određenu konfiguraciju projekta, postoji naredba:

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

Gornji scenarij izgraditi.py također podržava argumente --enable-examples и --enable-tests, ali druge opcije WAF ne podupire izravno. Na primjer, ovo neće raditi:

$ ./build.py --disable-python

reakcija će biti ovakva:

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

Međutim, specijalni operator - - može se koristiti za prosljeđivanje dodatnih parametara WAFpa će umjesto gornje raditi sljedeća naredba:

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

jer generira glavnu naredbu ./waf configure --disable-python. Evo još nekoliko uvodnih savjeta o WAF.

Rješavanje grešaka u izradi

Izdanja ns-3 testirana su na najnovijim C++ kompajlerima dostupnim u vrijeme izdavanja na uobičajenim distribucijama Linuxa i MacOS-a. Međutim, s vremenom se objavljuju nove distribucije s novim prevoditeljima, a ti noviji prevoditelji imaju tendenciju da budu pedantniji u pogledu upozorenja. ns-3 konfigurira svoju izgradnju da tretira sva upozorenja kao greške, tako da ponekad, ako koristite stariju verziju na novijem sustavu, upozorenje kompilatora može zaustaviti izgradnju.

Na primjer, prethodno je bilo izdanje ns‑3.28 za Fedoru 28, koje je uključivalo novu glavnu verziju GCC (gcc-8). Izgradnja izdanja ns-3.28 ili ranijih verzija pod sustavom Fedora 28, s instaliranim Gtk2+, dogodit će se sljedeća pogreška:

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

U izdanjima koja počinju od ns-3.28.1, in WAF dostupna je opcija za rješavanje ovih problema. Onemogućuje postavljanje oznake "-Werror" u g++ i clang++. Ovo je opcija "--disable-werror" i mora se primijeniti tijekom konfiguracije:

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

Konfigurirajte ili sastavite

Neke naredbe WAF imaju značenje samo u fazi konfiguracije, a neki su važeći samo u fazi izgradnje. Na primjer, ako želite koristiti značajke emulacije ns-3, možete omogućiti postavku bita suid koristeći sudo, kako je gore opisano. Ovo će nadjačati naredbe koraka konfiguracije i stoga možete promijeniti konfiguraciju pomoću sljedeće naredbe, koja također uključuje primjere i testove.

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

Ako ovo učinite WAF će lansirati sudoza promjenu programa za stvaranje utičnica koda emulacije da se izvode s dozvolama korijen. U WAF Dostupne su mnoge druge opcije za konfiguraciju i korake izgradnje. Da biste istražili svoje mogućnosti, unesite:

$ ./waf --help

U sljedećem odjeljku koristit ćemo neke opcije povezane s testiranjem.

Montažni profili

Već smo vidjeli kako možete konfigurirati WAF za sklopove otkloniti neispravnost и optimiziran:

$ ./waf --build-profile=debug

Tu je i međumontažni profil, objaviti. Opcija -d je sinonim za --build-profile. Profil građenja kontrolira korištenje prekidača za bilježenje, tvrdnje i optimizaciju kompilatora:

vodič za simulator mreže ns-3. Poglavlje 3

Kao što vidite, bilježenje i tvrdnje dostupni su samo u verzijama za otklanjanje pogrešaka. Preporučena praksa je da razvijete svoju skriptu u načinu za otklanjanje pogrešaka, a zatim izvršite ponovljena pokretanja (za statistiku ili promjene parametara) u optimiziranom profilu izgradnje.

Ako imate kod koji bi se trebao izvoditi samo u određenim profilima izrade, upotrijebite makronaredbu omotača koda:

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

Zadano, WAF postavlja artefakte izgradnje u direktorij izgradnje. Možete navesti drugi izlazni direktorij koristeći opciju - -out, na primjer:

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

Kombinirajući ovo s profilima izrade, možete se jednostavno prebacivati ​​između različitih opcija kompilacije:

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

Što vam omogućuje rad s više sklopova bez potrebe da svaki put ponovno pišete najnoviji sklop. Kada prijeđete na drugi profil, WAF kompajlirati će samo njega, bez potpunog ponovnog kompajliranja svega.

Kada mijenjate profile izgradnje na ovaj način, morate paziti da svaki put date iste opcije konfiguracije. Definiranje nekoliko varijabli okruženja pomoći će vam da izbjegnete pogreške:

$ 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

Kompajleri i oznake

U navedenim primjerima WAF za izgradnju ns-3 koristi C++ kompajler iz GCC-a ( g ++). Međutim, možete promijeniti onu koju koristite WAF C++ prevodilac, definiranjem CXX varijable okoline. Na primjer, za korištenje C++ kompajlera Clang, clang++,

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

Na isti način možete konfigurirati WAF koristiti distribuiranu kompilaciju pomoću distcc:

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

Više informacija o distcc-u i distribuiranoj kompilaciji možete pronaći na stranici projekta u odjeljku Dokumentacija. Za dodavanje zastavica prevoditelja prilikom konfiguriranja ns-3, koristite CXXFLAGS_EXTRA varijablu okruženja.

Instalacija

WAF može se koristiti za instaliranje biblioteka na različitim mjestima u sustavu. Prema zadanim postavkama, kompajlirane biblioteke i izvršne datoteke nalaze se u direktoriju graditi, a budući da Waf zna lokaciju tih biblioteka i izvršnih datoteka, nema potrebe instalirati knjižnice bilo gdje drugdje.

Ako korisnici više vole instalirati izvan direktorija za izgradnju, mogu pokrenuti naredbu ./waf instalacija. Zadani prefiks za instalaciju je / usr / local, dakle ./waf instalacija instalirat će programe u / Usr / local / bin, knjižnice u / Usr / local / lib i datoteke zaglavlja u /usr/local/include. Prava superkorisnika obično se moraju postaviti sa zadanim prefiksom, što bi bila tipična naredba sudo ./waf instaliraj. Kada se pokrene, Waf će prvo odabrati korištenje zajedničkih biblioteka u direktoriju za izgradnju, a zatim potražiti knjižnice na putu do biblioteka konfiguriranih u lokalnom okruženju. Dakle, kada instalirate biblioteke na sustav, dobra je praksa provjeriti koriste li se prave biblioteke. Korisnici mogu odabrati instalaciju s drugim prefiksom dodavanjem opcije tijekom konfiguracije --prefix, na primjer:

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

Ako kasnije, nakon izgradnje, korisnik unese naredbu instalacije ./waf, koristit će se prefiks /opt/lokalno.

Momčad ./waf clean mora se koristiti prije ponovne konfiguracije projekta ako će instalacija koristiti WAF pod drugim prefiksom.

Dakle, za korištenje ns-3 nema potrebe pozivati ./waf install. Većini korisnika ova naredba neće trebati jer WAF će pokupiti trenutne biblioteke iz direktorija za izgradnju, ali nekim korisnicima ovo može biti korisno ako njihove aktivnosti uključuju rad s programima izvan ns-3 direktorija.

Waf single

Na najvišoj razini izvornog stabla ns-3 postoji samo jedna Waf skripta. Nakon što počnete raditi, puno ćete vremena provoditi u imeniku scratch/ ili dublje usrc/... a u isto vrijeme moraju trčati WAF. Možete se samo sjetiti gdje ste i pobjeći WAF kako slijedi:

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

ali to će biti zamorno i sklono greškama, pa postoje bolja rješenja. Jedan uobičajeni način je korištenje uređivača teksta kao što je Emacs ili energija, u kojem se otvaraju dvije terminalske sesije, jedna se koristi za izgradnju ns-3, a druga se koristi za uređivanje izvornog koda. Ako samo imate tarball, onda varijabla okruženja može pomoći:

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

$ cd scratch 
$ waff build

U direktoriju modula moglo bi biti primamljivo dodati trivijalnu waf skriptu poput exec ../../waf. Molim te nemoj to raditi. Ovo je zbunjujuće za početnike i, ako se izvede loše, dovodi do teško uočljivih grešaka u izradi. Gore prikazana rješenja put su koji treba koristiti.

3.5 Ispitivanje ns-3

Možete pokrenuti jedinične testove distribucije ns-3 pokretanjem skripte ./test.py:

$ ./test.py

Ovi testovi se izvode paralelno s WAF. Na kraju biste trebali vidjeti poruku koja kaže:

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

Ovo je važna poruka za prepoznavanje valgrind padova, padova ili pogrešaka, što ukazuje na probleme s kodom ili nekompatibilnost između alata i koda.

Također ćete vidjeti konačni rezultat iz WAF i tester koji izvodi svaki test, koji će izgledati otprilike ovako:

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)

Ovu naredbu obično pokreću korisnici kako bi brzo provjerili je li ns-3 distribucija ispravno izgrađena. (Imajte na umu da redoslijed redaka "PASS: ..." može biti drugačiji, to je normalno. Ono što je važno je da linija sažetka na kraju izvješća pokazuje da su svi testovi prošli; nijedan test nije uspio ili se srušio.) I WAFI test.py će paralelizirati rad preko dostupnih procesorskih jezgri stroja.

3.6 Pokretanje skripte

Obično izvodimo skripte pod kontrolom WAF. Ovo omogućuje sustavu za izgradnju da osigura da su staze zajedničkih knjižnica ispravno postavljene i da su knjižnice dostupne tijekom izvođenja. Da biste pokrenuli program, jednostavno koristite WAF s parametrom - -run. Pokrenimo ns-3 ekvivalent sveprisutnog programa halo svijetupisivanjem sljedećeg:

$ ./waf --run hello-simulator

Waf će prvo provjeriti je li program ispravno izgrađen i izgraditi ako je potrebno. Zatim WAF će izvršiti program koji proizvodi sljedeći izlaz.

Hello Simulator

Čestitamo! Sada ste ns-3 korisnik!

Što da radim ako ne vidim rezultate?

Ako vidite poruke WAFšto pokazuje da je izgradnja uspješno dovršena, ali ne vidite izlaz "Hello Simulator", tada postoji mogućnost da ste u odjeljku [Build-with-Waf] prebacili svoj način izrade na optimiziran, ali propustili ste se vratiti na način rada otkloniti neispravnost. Sav izlaz konzole koji se koristi u ovom vodiču koristi posebnu ns-3 komponentu koja izvodi zapisivanje i koristi se za ispis prilagođenih poruka na konzolu. Izlaz ove komponente automatski je onemogućen kada se optimizirani kod kompajlira - on je "optimiziran". Ako ne vidite izlaz "Hello Simulator", unesite sljedeće:

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

prilagoditi WAF za izradu debug verzija ns-3 programa, koje uključuju primjere i testove. Zatim biste trebali ponovno izgraditi trenutnu verziju koda za otklanjanje pogrešaka upisivanjem

$ ./waf

Sada ako pokrenete program hello-simulator, trebali biste vidjeti očekivani rezultat.

3.6.1 Argumenti naredbenog retka

Za prosljeđivanje argumenata naredbenog retka programu ns-3 koristite sljedeći uzorak:

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

Zamijeniti na naziv vašeg programa i na argumente. Argument - -command-template za WAF je u biti recept za izgradnju stvarne naredbene linije WAF koristi za izvođenje programa. Waf provjerava je li izgradnja dovršena, postavlja staze dijeljene biblioteke, zatim koristi predložak naredbenog retka i zamjenjuje naziv programa za rezervirano mjesto %s za pozivanje izvršne datoteke. Ako smatrate da je ova sintaksa komplicirana, postoji jednostavnija verzija koja uključuje ns-3 program i njegove argumente unutar jednostrukih navodnika:

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

Drugi posebno koristan primjer je selektivno izvođenje paketa testova. Pretpostavimo da postoji testni paket pod nazivom mytest (zapravo ne postoji). Gore smo upotrijebili skriptu ./test.py za paralelno pokretanje niza testova, koji više puta pozivaju testni program test-runner. Poziv test-runner izravno za pokretanje jednog testa:

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

Argumenti će biti proslijeđeni programu test-runner. Budući da mytest ne postoji, bit će generirana poruka o pogrešci. Za ispis dostupnih opcija test runnera unesite:

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

3.6.2 Otklanjanje pogrešaka

Za pokretanje ns-3 programa pod drugim uslužnim programom, kao što je debugger (na primjer, gdb) ili alat za testiranje memorije (na primjer, valgrind), koristite sličan obrazac - -command-template = "…". Na primjer, za pokretanje u debuggeru gdb vaš hello-simulator ns-3 program s argumentima:

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

Imajte na umu da naziv programa ns-3 dolazi s argumentom - -run, i uslužni program za upravljanje (ovdje gdb) je prvi token u argumentu - -command-template. Opcija - -args izvješća gdbda ostatak naredbenog retka pripada "nižem" programu. (Neke verzije gdb ne razumijem opciju - -args. U tom slučaju uklonite argumente programa iz - -command-template i koristite skup naredbi gdb argumenata.) Možemo kombinirati ovaj recept i prethodni kako bismo pokrenuli test pod debuggerom:

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

3.6.3 Radni imenik

Waf bi trebao biti lansiran sa svoje lokacije na vrhu ns-3 stabla. Ova mapa postaje radni direktorij u koji će se zapisivati ​​izlazne datoteke. Ali što ako želite zadržati ove datoteke izvan ns-3 izvornog stabla? Koristite argument - -cwd:

$ ./waf --cwd=...

Možda će vam biti prikladnije dobiti izlazne datoteke u svoj radni direktorij. U ovom slučaju, sljedeća neizravna radnja može pomoći:

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

Ova dekoracija prethodne verzije naredbe čuva trenutni radni direktorij, ide u imenik WAFa zatim upućuje WAF za promjenu radnog direktorija natrag u trenutni radni direktorij spremljen prije pokretanja programa. Spominjemo tim - -cwd Radi potpunosti, većina korisnika jednostavno pokreće Waf iz direktorija najviše razine i tamo generira izlazne datoteke.

Nastavak: 4. poglavlje

Izvor: www.habr.com

Dodajte komentar