Vodič za ns-3 mrežni simulator. Poglavlje 3

Vodič za ns-3 mrežni simulator. Poglavlje 3
poglavlje 1,2

3 Početak rada
3.1 Pregled
3.2 Preduslovi
3.2.1 Preuzimanje ns-3 izdanja kao izvorne arhive
3.3 Preuzimanje ns-3 koristeći Git
3.3.1 Učitavanje ns-3 koristeći Bake
3.4 Montaža ns-3
3.4.1 Izgradnja sa build.py
3.4.2 Izgradnja sa Bake
3.4.3 Graditi sa Waf-om
3.5 Testiranje ns-3
3.6 Pokretanje skripte
3.6.1 Argumenti komandne linije
3.6.2 Otklanjanje grešaka
3.6.3 Radni imenik

Poglavlje 3

Početak

Ovo poglavlje ima za cilj da pripremi čitaoca da počne sa računarom koji možda nikada nije instalirao ns-3. Pokriva podržane platforme, preduvjete, kako dobiti ns-3, kako napraviti ns-3 i kako testirati svoju izgradnju i pokrenuti jednostavne programe.

3.1 Pregled

ns-3 simulator je izgrađen kao sistem kolaborativnih softverskih biblioteka. Tokom asemblera, kod korisničkih programa se povezuje sa ovim bibliotekama. Programski jezici C++ ili Python se koriste za pisanje prilagođenih programa.

Ns-3 se distribuira kao izvorni kod, što znači da ciljni sistem 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 sistem, au budućnosti bi se mogle distribuirati 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. Ukoliko neko želi da preuzme posao kreiranja gotovih biblioteka i paketa za operativne sisteme neka se javi na mailing listu ns-programeri.

Zatim ćemo pogledati tri načina za preuzimanje i izgradnju ns-3. Prvi je preuzimanje i sastavljanje službenog izdanja sa glavne stranice. Drugi je odabir i sastavljanje kopija razvojnih verzija osnovne ns-3 instalacije. Treće je korištenje dodatnih alata za pravljenje za učitavanje više ekstenzija za ns-3. Proći ćemo kroz svaki jer se alati malo razlikuju.

Iskusni korisnici Linuxa mogu se zapitati zašto ns-3 nije obezbeđen kao paket kao većina drugih biblioteka koje koriste menadžer paketa? Iako postoje binarni paketi za različite distribucije Linuxa (npr. Debian), većina korisnika na kraju uređuje biblioteke i mora sami rekonstruirati ns-3, tako da je dostupnost izvornog koda zgodna. Iz tog razloga ćemo se fokusirati 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 Preduslovi

Čitav skup dostupnih ns-3 biblioteka ima brojne zavisnosti od biblioteka trećih strana, ali uglavnom se ns-3 može izgraditi i koristiti uz podršku za nekoliko uobičajenih (često instaliranih po defaultu) komponenti: C++ kompajler, Python, uređivač izvornog koda (na primjer, energija, emacs ili zasjeniti) i, ako se koriste razvojna spremišta, Git sistemi kontrole verzija. Većina novih korisnika neće morati da brine ako njihova konfiguracija prijavi da neke ns-3 napredne funkcije nedostaju, ali za one koji žele potpunu instalaciju, projekat obezbeđuje wiki koji uključuje stranice sa puno korisnih saveta i trikova. Jedna takva stranica je stranica za instalaciju, s uputama za instalaciju za različite sisteme, 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), sljedeći alati su potrebni za pokretanje ns-3:

Paket alata/verzija

  • C++ kompajler
    clang++ ili g++ (g++ verzija 4.9 ili novija)
  • piton
    python2 verzija >= 2.7.10, ili verzija python3 >=3.4
  • ići
    bilo koju najnoviju verziju (za pristup ns-3 na GitLab.com)
  • katran
    bilo koju najnoviju verziju (za raspakivanje ns‑3 izdanja)
  • bunzip2
    bilo koju najnoviju verziju (za raspakivanje ns‑3 izdanja)

Da biste provjerili zadanu verziju Pythona, unesite python -V. Da biste provjerili verziju g++, otkucajte g++ -v. Ako neki alati nedostaju ili su prestari, pogledajte vodič za instalaciju na ns-3 wiki stranici.

Od sada, 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 pravac akcije za novog korisnika koji želi preuzeti i eksperimentirati s najnovijim izdanjem i verzijama paketa ns-3. ns-3 izdanja se objavljuju kao komprimirane izvorne arhive, koje se ponekad 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 jednostavno, samo trebate odabrati izdanje, preuzeti i raspakirati ga.

Pretpostavimo da vi, kao korisnik, želite izgraditi ns-3 u lokalnom direktoriju pod nazivom radni prostor. Možete dobiti radnu kopiju izdanja unošenjem 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 pažnju na gore korišćeni uslužni program wget, koji je alat komandne linije za preuzimanje objekata sa Interneta. Ako ga niste instalirali, možete koristiti svoj pretraživač za ovo.

Praćenje ovih koraka odvest će 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 osnovne ns-3 distribucije i možete prijeći na odjeljak o izgradnji ns-3.

3.3 Preuzimanje ns-3 koristeći Git

ns-3 kod je dostupan u Git repozitorijumima na GitLab.com na adresi https://gitlab.com/nsnam/... Grupa nsnam objedinjuje različite repozitorije koje koristi projekat otvorenog koda.

Najlakši način da počnete koristiti Git repozitorije je da račvate ili klonirate okruženje ns-3-alinon. Ovo je skup skripti koji upravlja učitavanjem i sklapanjem najčešće korišćenih ns-3 podsistema. Ako ste novi u Gitu, termini "fork" i "clone" možda vam nisu poznati; ako je tako, preporučujemo da jednostavno klonirate (napravite vlastitu kopiju) spremište koje 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, prikaz vašeg imenika 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 download.py, koji će dodatno izdvojiti ns-3 i prateći izvorni kod. Ovdje imate izbor: ili preuzmite najnoviji snimak razvoja ns-3:

$ python download.py

ili radije ns-3 oslobađanje koristeći zastavu -n da naznačite broj izdanja:

$ python download.py -n ns-3.29

Nakon ovog koraka do direktorija ns-3-alinon dodatna spremišta će biti preuzeta ns-3, peći, pybindgen и netanim.

primjedba
Na mašini sa čistim Ubuntu16.04, morao sam da promenim naredbu u ovu: $ sudo python3 download.py -n ns-3.29 (u daljem tekstu napomene prevodioca).

3.3.1 Učitavanje ns-3 koristeći Bake

Gornje dvije metode (izvorna arhiva ili spremište ns-3-alinon preko Gita) korisni su za dobijanje najjednostavnije instalacije ns-3 sa više dodataka (pybindgen za generiranje Python veza i netanim za mrežnu animaciju). Poziva se treće spremište koje je podrazumevano obezbeđeno u ns-3-allinonu peći.

Peći je alat za koordiniranu izgradnju softvera iz više repozitorija, razvijen za ns-3 projekat. Peći može se koristiti za dobijanje razvojnih verzija ns-3, kao i za preuzimanje i izgradnju ekstenzija osnovne verzije ns-3 distribucije, kao što je okruženje Direktno izvršavanje koda, CradleNetwork Simulation Cradle, mogućnost kreiranja novih Python veza i raznih ns-3 „aplikacija“.

primjedba
CradleNetwork Simulation Cradle je okvir koji vam omogućava da koristite prave TCP/IP mrežne stekove unutar mrežnog simulatora.

Ako očekujete da će vaša ns-3 instalacija imati napredne ili dodatne mogućnosti, možete slijediti ovaj instalacijski put.

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

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

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

Kada pokrenete git naredbu, 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 što se naredba završi Klon trebali biste imati imenik peć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 peći i XML konfiguracijski fajl. Sljedeći korak je korištenje ovih skripti za preuzimanje i izgradnju ns-3 distribucije po vašem izboru. Dostupno je nekoliko ciljeva prilagođavanja:

  1. ns-3.29: modul koji odgovara izdanju; preuzima komponente slične izdanju u tarball-u;

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

  3. ns-alinon-3.29: Modul koji uključuje druge dodatne funkcije kao što su usmjeravanje klikova i postolje za mrežnu simulaciju, Openflow za ns-3.

  4. ns-3-alinon: slično izdanoj verziji modula sve u jednom, ali za razvojni kod.

primjedba
kliknite — modularna softverska arhitektura za kreiranje rutera.

Openflow je protokol za upravljanje procesom obrade podataka koji se prenose preko mreže podataka putem rutera i prekidača, implementirajući softverski definiranu mrežnu tehnologiju.

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

Programeri pokušavaju da ova spremišta održavaju u dosljednom radnom redu, ali ona su u razvojnoj oblasti i sadrže neobjavljeni kod, pa ako ne planirate koristiti nove funkcije, odaberite službeno izdanje.

Najnoviju verziju koda možete pronaći tako što ćete pregledati listu spremišta ili otići 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 dobijemo ns-3 komponente koje su nam potrebne, koristit ćemo alat Peći. Recimo nekoliko uvodnih riječi o radu Peći.

Bake radi učitavanjem izvora paketa u direktorij izvor i instaliranje biblioteka u build direktorij. Peći može se pokrenuti upućivanjem na binarni fajl, ali ako želite da se pokrenete Peći ne iz direktorija u kojem je preuzeto, preporučljivo je dodati putanju do peći do vaše putanje (PATH varijabla okruženja), 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 bake.py na putanju ljuske i omogućit će drugim programima da pronađu izvršne datoteke i biblioteke koje je kreirao peći. U nekim slučajevima upotrebe peći, gore opisane postavke PATH i PYTHONPATH nisu potrebne, ali to obično zahtijeva potpuna izrada ns-3-allinona (sa dodatnim paketima).

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

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

Zatim ćemo pitati Peći provjerite imamo li dovoljno alata za učitavanje različitih komponenti. biranje:

$ ./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 su neophodni u ovom koraku jer nam omogućavaju da dobijemo kod. U ovom trenutku, instalirajte alate koji nedostaju na uobičajen način za vaš sistem (ako znate kako) ili se obratite svom administratoru sistema 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 na 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 pravljenje ns-3. Glavna stvar koju želimo naglasiti je da je ns-3 izgrađen pomoću alata za izgradnju pod nazivom Wafopisano u nastavku. Većina korisnika će raditi sa Waf, ali postoji nekoliko zgodnih skripti koje će vam pomoći da započnete ili organizirate složenije izrade. Zato vas molim, prije nego što pročitate o tome Waf, pogledaj build.py i montaža sa peći.

3.4.1 Izgradnja sa build.py

Oprez Ovaj korak izgradnje dostupan je samo iz izvorne arhivske verzije dobijene na gore opisani način; a ne preuzima se putem git-a ili bake-a.

Kada radite s arhivom izdanja tarball, in ns-3-alinon Postoji zgodna skripta koja može olakšati sastavljanje komponenti. Zove se build.py. Ovaj program će vam postaviti projekat na najkorisniji način. Međutim, imajte na umu da naprednije podešavanje i rad sa ns-3 obično uključuje korištenje ns-3 vlastitog sistema izgradnje, Waf, koji će biti predstavljen kasnije u ovom vodiču.

Ako ste preuzeli koristeći tarball, zatim u vašem imeniku ~/radni prostor direktorij s imenom nešto poput ns-alinon-3.29. Unesite sljedeće:

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

Prilikom poziva build.py Koristili smo argumente komandne linije da napravimo primjere i testove korištene u ovom vodiču, a koji nisu napravljeni po defaultu u ns-3. Po defaultu, program također gradi sve dostupne module. Zatim, ako želite, možete napraviti ns-3 bez primjera i testova ili isključiti module koji vam nisu potrebni za rad.

Vidjet ćete puno izlaznih poruka kompajlera koje prikazuje skripta dok gradi različite dijelove koje ste učitali. Prvo će skripta pokušati da napravi animator 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 reda liste 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 zavise od eksternih biblioteka možda nisu izgrađeni, ili da se ne moraju izgraditi za ovu konfiguraciju. To ne znači da simulator nije sastavljen ili da sklopljeni moduli neće raditi ispravno.

3.4.2 Izgradnja sa Bake

Ako ste koristili bake iznad da biste dobili izvorni kod iz projektnih spremišta, možete ga nastaviti koristiti za pravljenje ns-3. biranje:

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

Savet: Također možete izvršiti korake preuzimanja i izgradnje odjednom tako što ćete pozvati "bake.py deploy".

Sastavljanje svih komponenti možda neće uspjeti, ali montaža će se nastaviti ako komponenta nije potrebna. Na primjer, nedavni problem prenosivosti bio je to castxml može se sastaviti pomoću alata peći ne na svim platformama. U tom slučaju će se pojaviti poruka poput ove:

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

Međutim, castxml potrebno samo ako želite da kreirate ažurirane Python veze. Za većinu korisnika za tim nema potrebe (barem dok ne promijene ns-3), pa se takva upozorenja za sada mogu bezbedno zanemariti.

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

$ ./bake.py show

Biće navedene različite zavisnosti paketa koje pokušavate da napravite.

3.4.3 Graditi sa Waf-om

Do ove tačke, da bismo započeli izgradnju ns-3, koristili smo ili skriptu build.py, ili alat peći. Ovi alati su korisni za izgradnju ns-3 i održavanje biblioteka. U stvari, da bi izgradili, pokreću alat za izgradnju Waf iz direktorija ns-3. Waf instaliran sa ns-3 izvornim kodom. Većina korisnika brzo prelazi na direktnu upotrebu za konfiguriranje i sklapanje ns‑3 Waf. Dakle, da nastavite, idite na ns-3 direktorij koji ste prvobitno kreirali.

Ovo u ovom trenutku nije striktno potrebno, ali će biti korisno da se malo vratimo i vidimo kako napraviti promjene u konfiguraciji projekta. Vjerovatno najkorisnija promjena konfiguracije koju možete napraviti je kreiranje optimizirane verzije koda. Prema zadanim postavkama, konfigurirali ste svoj projekt za izradu verzije za otklanjanje grešaka. Hajde da pogledamo projekat za kreiranje optimizovane konstrukcije. Da biste objasnili Waf-u da bi trebao napraviti 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 (radi vaše udobnosti). Prva naredba čisti od prethodne gradnje, to obično nije striktno neophodno, ali je dobra praksa (takođe pogledajte profile izgradnje ispod); ovo će izbrisati prethodno kreirane biblioteke i objektne datoteke koje se nalaze u direktoriju build /. Kada se projekat rekonfiguriše i sistem izgradnje proveri različite zavisnosti, trebalo bi da vidite izlaz sličan sledeć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 zadnji dio gore navedenog popisa. Neke ns-3 opcije nisu omogućene prema zadanim postavkama ili im je potrebna sistemska podrška da bi ispravno funkcionisale. Na primjer, da omogućite XmlTo, biblioteka mora biti prisutna na sistemu libxml-2.0. Ako ova biblioteka nije pronađena i odgovarajuća ns-3 funkcija nije 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 u vrijeme izvođenja” za određene programe. Nije omogućena prema zadanim postavkama i stoga se ova funkcija pojavljuje kao „nije omogućena“. Na kraju, da biste dobili listu omogućenih opcija, koristite Waf sa parametrom --check-config.

Sada se vratimo i vratimo se na debug build koji sadrži primjere i testove.

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

Sistem izgradnje je sada postavljen i možete napraviti verzije za otklanjanje grešaka ns-3 programa jednostavnim upisivanjem:

$ ./waf

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

Da biste provjerili koji je profil aktivan za datu konfiguraciju projekta, postoji naredba:

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

Gore navedeni scenario build.py takođe podržava argumente --enable-examples и --enable-tests, ali i druge opcije Waf ne podržava direktno. 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 putem wafpa će umjesto gore navedenog raditi sljedeća naredba:

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

jer generiše glavnu komandu ./waf configure --disable-python. Evo još nekoliko uvodnih savjeta o tome Waf.

Rukovanje greškama u izgradnji

ns-3 izdanja su testirana na najnovijim C++ kompajlerima dostupnim u vrijeme izdavanja na uobičajenim Linux i MacOS distribucijama. Međutim, s vremenom se nove distribucije objavljuju s novim prevodiocima, a ovi noviji kompajleri imaju tendenciju da budu pedantičniji u pogledu upozorenja. ns-3 konfiguriše svoju verziju tako da sva upozorenja tretira kao greške, tako da ponekad ako koristite stariju verziju na novijem sistemu, upozorenje kompajlera može zaustaviti izgradnju.

Na primjer, ranije je bilo izdanje ns‑3.28 za Fedora 28, koje je uključivalo novu glavnu verziju gcc (gcc-8). Prilikom izrade izdanja ns-3.28 ili starijih verzija pod Fedora 28, s instaliranim Gtk2+, pojavit će se sljedeća greš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ćava postavljanje oznake "-Werror" u g++ i clang++. Ovo je opcija "--disable-werror" i mora se primijeniti tokom konfiguracije:

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

Konfigurirajte ili sastavite

Neke komande Waf imaju smisla samo u fazi konfiguracije, a neke su važeće samo u fazi izgradnje. Na primjer, ako želite koristiti funkcije emulacije ns-3, možete omogućiti postavku bita jug koristeći sudo, kao što je gore opisano. Ovo će nadjačati naredbe koraka konfiguracije, i stoga možete promijeniti konfiguraciju koristeći sljedeću naredbu, koja također uključuje primjere i testove.

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

Ako uradiš ovo Waf će lansirati sudoza promjenu programa za kreiranje utičnice koda za emulaciju da se izvode s dozvolama korijen. The Waf Dostupne su mnoge druge opcije za korake konfiguracije i izgradnje. Da istražite svoje mogućnosti, unesite:

$ ./waf --help

U sljedećem odjeljku ćemo koristiti neke opcije vezane za testiranje.

Montažni profili

Već smo vidjeli kako možete konfigurirati Waf za skupštine debug и optimizovan:

$ ./waf --build-profile=debug

Postoji i srednji montažni profil, puštanje. Opcija -d je sinonim za --build-profile. Profil građenja kontrolira korištenje logiranja, tvrdnji i prekidača za optimizaciju kompajlera:

Vodič za ns-3 mrežni simulator. Poglavlje 3

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

Ako imate kod koji bi trebao raditi samo u određenim profilima izgradnje, koristite makro makro za omotač 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;)

Default, Waf smješta artefakte izgradnje u direktorij izgradnje. Pomoću opcije možete odrediti drugi izlazni direktorij - -out, na primjer:

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

Kombinirajući ovo s profilima za izgradnju, možete se lako 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ćava da radite sa više sklopova bez potrebe da svaki put prepisujete najnoviji sklop. Kada pređete na drugi profil, Waf će kompajlirati samo to, bez potpunog ponovnog kompajliranja svega.

Kada mijenjate profile izgradnje na ovaj način, morate biti oprezni da svaki put dajete iste opcije konfiguracije. Definiranje nekoliko varijabli okruženja pomoći će vam da izbjegnete greš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 zastavice

U gornjim primjerima Waf za izgradnju ns-3 koristi se C++ kompajler iz GCC-a ( g ++). Međutim, možete promijeniti onu koju koristite Waf C++ kompajler, definisanjem varijable okruženja CXX. Na primjer, da koristite C++ kompajler Clang, clang++,

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

Na isti način možete konfigurirati Waf koristiti distribuiranu kompilaciju koristeći distcc:

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

Više informacija o distcc i distribuiranoj kompilaciji možete pronaći na stranici projekta u odjeljku Dokumentacija. Da biste dodali zastavice kompajlera prilikom konfigurisanja ns-3, koristite varijablu okruženja CXXFLAGS_EXTRA.

postavljanje

Waf može se koristiti za instaliranje biblioteka na različitim mjestima u sistemu. Podrazumevano, kompajlirane biblioteke i izvršni fajlovi se nalaze u direktorijumu graditi, a budući da Waf zna lokaciju ovih biblioteka i izvršnih datoteka, nema potrebe da instalirate biblioteke bilo gdje drugdje.

Ako korisnici više vole da instaliraju izvan direktorija izgradnje, mogu pokrenuti naredbu ./waf install. Zadani prefiks za instalaciju je / usr / local, tako ./waf install će instalirati programe u / usr / local / bin, biblioteke u / usr / local / lib i datoteke zaglavlja /usr/local/include. Prava superkorisnika obično treba da budu postavljena sa podrazumevanim prefiksom, tako da bi tipična komanda bila sudo ./waf install. Kada se pokrene, Waf će prvo odabrati da koristi dijeljene biblioteke u direktoriju izgradnje, a zatim će potražiti biblioteke duž putanje do biblioteka konfiguriranih u lokalnom okruženju. Dakle, kada instalirate biblioteke na sistem, dobra je praksa provjeriti da li se koriste prave biblioteke. Korisnici mogu izabrati da instaliraju sa drugim prefiksom tako što će proslediti opciju tokom konfiguracije --prefix, na primjer:

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

Ako kasnije, nakon izgradnje, korisnik unese naredbu za instalaciju ./waf, koristit će se prefiks /opt/local.

tim ./waf clean mora se koristiti prije rekonfiguracije projekta ako će se koristiti instalacija Waf pod drugim prefiksom.

Dakle, za korištenje ns-3 nema potrebe za pozivanjem ./waf install. Većina korisnika neće trebati ovu naredbu jer Waf će pokupiti trenutne biblioteke iz build direktorija, ali nekim korisnicima ovo može biti korisno ako njihove aktivnosti uključuju rad s programima izvan ns-3 direktorija.

Waf single

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

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

ali ovo će biti zamorno i podložno greškama, tako da 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. Samo ako imaš tarball, tada 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 kao što je exec ../../waf. Molim te, ne radi to. Ovo je zbunjujuće za početnike i, kada se uradi loše, dovodi do teško otkrivih grešaka u izgradnji. Gore prikazana rješenja su put koji treba koristiti.

3.5 Testiranje ns-3

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

$ ./test.py

Ovi testovi se izvode paralelno sa 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 identifikaciju valgrind rušenja, rušenja ili grešaka, što ukazuje na probleme sa kodom ili nekompatibilnost između alata i koda.

Također ćete vidjeti konačni izlaz iz Waf i tester koji pokreće 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 da li je ns-3 distribucija pravilno izgrađena. (Imajte na umu da redoslijed redova "PASS: ..." može biti drugačiji, to je normalno. Ono što je važno je da linija sažetka na kraju izvještaja pokazuje da su svi testovi prošli; nijedan test nije uspio ili pao.) I Wafi test.py će paralelizirati rad na dostupnim procesorskim jezgrama mašine.

3.6 Pokretanje skripte

Obično pokrećemo skripte pod kontrolom Waf. Ovo omogućava sistemu izgradnje da osigura da su staze dijeljene biblioteke ispravno postavljene i da su biblioteke dostupne u vrijeme izvođenja. Za pokretanje programa jednostavno koristite Waf sa parametrom - -run. Pokrenimo ns-3 ekvivalent sveprisutnog programa Hello Worldupisivanjem sljedećeg:

$ ./waf --run hello-simulator

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

Hello Simulator

Čestitamo! Sada ste ns-3 korisnik!

Šta da radim ako ne vidim rezultate?

Ako vidite poruke Wafoznačavajući da je izgradnja uspješno završena, ali ne vidite izlaz "Zdravo simulator", onda postoji mogućnost da ste u odjeljku [Build-with-Waf] promijenili način izrade na optimizovan, ali je propustio povratak na način rada debug. Sav izlaz konzole koji se koristi u ovom vodiču koristi posebnu ns-3 komponentu koja vrši evidentiranje i koristi se za ispis prilagođenih poruka na konzoli. Izlaz iz ove komponente je automatski 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 verzija za otklanjanje grešaka ns-3 programa, koje uključuju primjere i testove. Zatim biste trebali ponovo izgraditi trenutnu verziju koda za otklanjanje grešaka upisivanjem

$ ./waf

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

3.6.1 Argumenti komandne linije

Da biste prosledili argumente komandne linije programu ns-3, koristite sledeći obrazac:

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

Zamijenite na ime vašeg programa i na argumente. Argument - -command-template do Waf je u suštini recept za izgradnju stvarne komandne linije Waf koristi se za izvršavanje programa. Waf provjerava da li je gradnja završena, postavlja putanje dijeljene biblioteke, zatim koristi dostavljeni predložak komandne linije i zamjenjuje ime programa za %s čuvar mjesta za pozivanje izvršne datoteke. Ako smatrate da je ova sintaksa komplikovana, postoji jednostavnija verzija koja uključuje program ns-3 i njegove argumente zatvorene u jednostruke navodnike:

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

Još jedan posebno koristan primjer je selektivno pokretanje testnih paketa. Pretpostavimo da postoji testni paket koji se zove mytest (u stvari, ne postoji). Iznad smo koristili skriptu ./test.py za paralelno pokretanje brojnih testova, koji više puta pozivaju program za testiranje test-runner. Zovi test-runner direktno za pokretanje jednog testa:

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

Argumenti će biti proslijeđeni programu test-runner. Pošto mytest ne postoji, biće generisana poruka o grešci. Za ispis dostupnih opcija probnog pokretača unesite:

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

3.6.2 Otklanjanje greš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 sa argumentima:

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

Imajte na umu da ime programa ns-3 dolazi sa argumentom - -run, i uslužni program za upravljanje (ovdje gdb) je prvi token u argumentu - -command-template. Opcija - -args informiše gdbda ostatak komandne linije 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 args.) Možemo kombinovati ovaj recept i prethodni da pokrenemo test pod debagerom:

$ ./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. Ovaj folder postaje radni direktorij u koji će se zapisivati ​​izlazne datoteke. Ali šta ako želite da ove datoteke zadržite izvan ns-3 izvornog stabla? Koristite argument - -cwd:

$ ./waf --cwd=...

Možda će vam biti zgodnije da dobijete izlazne datoteke u svom radnom direktoriju. U ovom slučaju, sljedeća indirektna radnja može pomoći:

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

Ova dekoracija prethodne verzije naredbe sprema trenutni radni direktorij, ide u direktorij Wafa zatim instrukcije Waf da promijenite radni direktorij natrag u trenutni radni direktorij spremljen prije pokretanja programa. Pominjemo ekipu - -cwd Radi potpunosti, većina korisnika jednostavno pokreće Waf iz direktorija najviše razine i tamo generira izlazne datoteke.

Nastavak: Poglavlje 4

izvor: www.habr.com

Dodajte komentar