Navodila za simulator omrežja ns-3. Poglavje 3

Navodila za simulator omrežja ns-3. Poglavje 3
poglavja 1,2

3 Začetek dela
3.1 Pregled
3.2 Predpogoji
3.2.1 Prenos izdaje ns-3 v obliki arhiva izvorne kode
3.3 Prenos ns-3 s pomočjo Gita
3.3.1 Prenos ns-3 s pomočjo Bake
3.4 Gradnja ns-3
3.4.1 Gradnja s pomočjo build.py
3.4.2 Gradnja s pomočjo Bake
3.4.3 Gradnja s pomočjo Waf
3.5 Preverjanje ns-3
3.6 Zagon skripte
3.6.1 Argumenti ukazne vrstice
3.6.2 Odpravljanje napak
3.6.3 Delovna mapa

Poglavje 3

Začetek dela

To poglavje je namenjeno pripravi bralca na delo s računalnikom, na katerega morda nikoli ni bil nameščen ns‑3. Opisuje podprte platforme, predpogoje, načine pridobivanja ns‑3, načine gradnje ns‑3 in načine preverjanja vaše gradnje ter zagon preprostih programov.

3.1 Pregled

Simulator ns‑3 je zasnovan kot sistem medsebojno delujočih programski knjižnic. Pri gradnji se uporabniški programi povezujejo s temi knjižnicami. Za pisanje uporabniških programov se uporabljata programska jezika C++ ali Python.

Ns‑3 se distribuira v obliki izvorne kode, kar pomeni, da mora ciljni sistem imeti okolje za razvoj programske opreme, da najprej zgradi knjižnice in nato ustvari uporabniški program. V načelu se ns‑3 lahko distribuira kot pripravljene knjižnice za specifičen sistem, in v prihodnosti bi se lahko distribucije odvijale na ta način. Vendar pa večina uporabnikov trenutno dejansko opravlja svoje delo z urejanjem samega ns‑3, tako da je koristno imeti izvorno kodo za gradnjo knjižnic. Če bi kdo želel prevzeti nalogo ustvarjanja pripravljenih knjižnic in paketov za operacijske sisteme, naj se obrne na mailing listo ns-developers.

Nato bomo obravnavali tri načine prenosa in gradnje ns‑3. Prvi je, da prenesemo in zgradimo uradno izdajo z glavne strani. Drugi je izbira in gradnja kopij razvojnih različic osnovne namestitve ns‑3. Tretji je uporaba dodatnih orodij za gradnjo za prenos več razširitev za ns‑3. O vsaki se bomo pogovorili, saj se orodja nekoliko razlikujejo.

Izkušeni uporabniki Linuxa se morda sprašujejo, zakaj ns‑3 ni na voljo v paketu, kot večina drugih knjižnic, ki uporabljajo upravitelje paketov. Čeprav so na voljo binarni paketi za različne distribucije Linuxa (na primer, Debian), večina uporabnikov na koncu ureja knjižnice in mora znova zgraditi ns‑3 sama, zato je dostop do izvorne kode priročen. Iz tega razloga se bomo osredotočili na namestitev iz izvorne kode.

Za večino aplikacij ns‑3 root ne potrebuje pravic, priporočamo uporabo nepriviligirane uporabniške računa.

3.2 Predpogoji

Celoten nabor razpoložljivih knjižnic ns‑3 ima vrsto odvisnosti od zunanjih knjižnic, vendar večinoma ns‑3 lahko zgradimo in uporabljamo s podporo za več pogostih (pogosto privzeto nameščenih) komponent: C++ prevajalnik, Python, urejevalnik izvorne kode (na primer, vim, emacs ili Eclipse) in, če se uporabljajo razvojni repozitoriji, sistema za nadzor različic Git. Večina začetnikov se ne rabi skrbeti, če njihova konfiguracija poroča o nekaterih manjkajočih dodatnih funkcijah ns‑3, ampak za tiste, ki želijo popolno namestitev, projekt ponuja wiki, ki vključuje strani z mnogimi uporabnimi nasveti in namigi. Ena takih strani je stran 'Namestitev' s navodili za namestitev za različne sisteme, na voljo na: https://www.nsnam.org/wiki/Installation.

Odsek 'Predpogoji' te wiki strani pojasnjuje, kateri paketi so potrebni za podporo splošnim možnostim ns‑3, in zagotavlja ukaze, ki se uporabljajo za njihovo namestitev v pogostih različicah Linuxa ali macOS.

Lahko izkoristite možnost, da raziščete wiki strani ns‑3 ali glavno spletno mesto: https://www.nsnam.org, saj tam najdete veliko informacij. Za zagon ns‑3 v zadnji različici ns‑3 (ns‑3.29) so potrebna naslednja orodja:

Orodje Paket/različica

  • C++ prevajalnik
    clang++ ali g++ (g++ različica 4.9 ali več)
  • Python
    python2 različica >= 2.7.10, ali python3 različica >=3.4
  • Git
    katera koli najnovejša različica (za dostop do ns‑3 na GitLab.com)
  • tar
    katera koli najnovejša različica (za razpakiranje izdaj ns‑3)
  • bunzip2
    katera koli sveža različica (za razpakiranje izdaj ns‑3)

Za preverjanje različice privzetega Pythona vnesite python -V. Da bi preverili različico g++, vnesite g++ -v. Če katera koli orodja manjkajo ali so predolga, se obrnite na navodila za namestitev na wiki strani ns‑3.

Od tega trenutka naprej predpostavljamo, da uporabnik deluje v Linuxu, MacOS-u ali emulatorju Linux okolja ter ima vsaj zgoraj navedena orodja.

3.2.1 Prenos izdaje ns-3 v obliki arhiva izvorne kode

To je način delovanja novega uporabnika, ki želi prenesti in eksperimentirati z najnovejšimi izdajo in paketnimi različicami ns‑3. Izdaje ns‑3 so objavljene v obliki stisnjenih arhivov izvorne kode, ki jih včasih imenujemo tarball. tarball — to je poseben format programske arhivske datoteke, v katerem je več datotek združenih skupaj. Arhiv je običajno stisnjen. Postopek prenosa ns‑3 je tarball enostaven, vse kar morate storiti je, da izberete izdajo, prenesete in jo razpakirate.

Predpostavimo, da želite kot uporabnik zgraditi ns‑3 v lokalni imenik z imenom workspace. Uspeli boste pridobiti delovno kopijo izdaje, tako da v Linux konzolo vnesete naslednje (seveda zamenjajte ustrezne številke različic)

$ 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 

Upoštevajte orodje, uporabljeno zgoraj, wget, ki je orodje ukazne vrstice za prenos objektov iz interneta. Če ga niste namestili, lahko za to uporabite brskalnik.

Z upoštevanjem teh korakov boste prešli v imenik ns-allinone-3.29, kjer bi morali videti več datotek in imenikov.

$ 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

Sedaj ste pripravljeni na gradnjo osnovne različice ns‑3 in lahko preidete na odsek, posvečen gradnji ns‑3.

3.3 Prenos ns-3 s pomočjo Gita

Koda ns‑3 je na voljo v Git repozitorijih na GitLab.com na naslovu https://gitlab.com/nsnam/. Skupina nsnam združuje različne repozitorije, ki jih uporablja projekt odprte kode.

Najlažji način za začetek uporabe Git repozitorijev je, da naredite fork ali klonirate okolje ns‑3-allinone. To je niz skript, ki upravlja prenos in gradnjo najbolj pogosto uporabljenih podsistemov ns‑3. Če ste novinec v Git-u, so izrazi "fork" in "kloniranje" morda za vas nepoznani; če je tako, priporočamo, da preprosto klonirate (ustvarite svojo kopijo) repozitorija na GitLab.com, kot sledi:

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

V tej fazi je videz vašega imenika ns‑3-allinone se nekoliko razlikuje od opisane direktorije s arhivom izdanja. Trebala bi izgledati otprilike ovako:

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

Obratite pažnju na prisutnost skripte download.py, koja dodatno izvlači ns‑3 i prateći izvorni kod. Imate izbor: ili preuzeti najnoviju snimku razvoja ns‑3:

$ python download.py

ili preferirate izdanje ns‑3, koristeći flag -n za navođenje broja izdanja:

$ python download.py -n ns-3.29

Nakon ovog koraka, dodatni repozitoriji ns‑3-allinone bit će preuzeti u direktorij ns‑3, bake, pybindgen in netanim.

Napomena
Na mašini sa čistom Ubuntu16.04, morao sam promijeniti komandu u ovakav oblik: $ sudo python3 download.py -n ns-3.29 (ovdje i dalje napomene prevoditelja).

3.3.1 Prenos ns-3 s pomočjo Bake

Dva prethodno spomenuta metoda (arhiv izvora ili repozitorij ns‑3-allinone preko Gita) su korisna za najjednostavniju instalaciju ns‑3 s nekoliko dodataka (pybindgen za generisanje veza Python i netanim za animiranje mreže). Treći repozitorij, koji se prema zadatku isporučuje u ns‑3-allinone, zove se bake.

Bake — to je alat za koordiniranu izradu softvera iz više repozitorija, razvijen za projekt ns‑3. Bake može se koristiti za dobivanje developerskih verzija ns‑3, kao i za preuzimanje i izradu proširenja osnovne verzije distribucije ns‑3, kao što je okruženje Direktna izvršavanja koda, CradleSimulacija mreže, mogućnost stvaranja novih veza Python i raznih 'aplikacija' ns‑3.

Napomena
CradleSimulacija mreže je okvir koji omogućava korištenje stvarnih mrežnih steka TCP / IP unutar mrežnog simulatora.

Ako pretpostavljate da vaša instalacija ns‑3 treba imati proširene ili dodatne funkcije, možete slijediti ovaj način instalacije.

U posljednjim izdanjima ns‑3 Bake je dodat u tar-izdanje. U izdanje je uključen konfiguracijski fajl koji omogućava preuzimanje ažuriranih verzija softvera u trenutku stvaranja izdanja. Odnosno, na primjer, verzija Bake, koja se distribuira s izdanjem ns‑3.29, može se koristiti za dobivanje komponenti za ovo izdanje ns‑3 ili ranije, ali se ne može koristiti za izvlačenje komponenti za novija izdanja (ako fajl s opisom paketa bakeconf.xml nije ažuriran).

Također možete dobiti najnoviju kopiju bake, unosom naredbe u vašu Linux konzolu (pod uvjetom da imate instaliran Git):

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

При выполнении команды git вы должны увидеть что-то вроде следующего:

Клонирование в 'bake'...
удалённый: Перечисление объектов: 2086, готово. 
удалённый: Подсчёт объектов: 100% (2086/2086), готово. 
удалённый: Сжатие объектов: 100% (649/649), готово. 
удалённый: Всего 2086 (дельта 1404), повторно использовано 2078 (дельта 1399) 
Получение объектов: 100% (2086/2086), 2.68 MiB | 3.82 MiB/с, готово. 
Разрешение дельт: 100% (1404/1404), готово.

После завершения команды clone у вас должна появиться директория с именем bake, содержимое которой должно выглядеть примерно так:

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

Обратите внимание, что вы загрузили несколько скриптов Python и модуль Python с именем bake и файл конфигурации XML. Следующим шагом будет использование этих скриптов для загрузки и сборки дистрибутива ns‑3 по вашему выбору. Доступно несколько целей настройки:

  1. ns‑3.29: модуль, соответствующий релизу; он будет загружать компоненты, аналогичные релизу в tarball;

  2. ns‑3-dev: аналогичный модуль, но с использованием кода из дерева разработки;

  3. ns-allinone-3.29: модуль, который включает в себя другие дополнительные функции, такие как Click маршрутизация и Network Simulation Cradle, Openflow для ns-3.

  4. ns‑3-allinone: аналогично релизной версии модуля allinone, но для кода разработки.

Napomena
Click — модульная программная архитектура для создания маршрутизаторов.

Openflow — протокол управления процессом обработки данных, передающихся по сети передачи данных маршрутизаторами и коммутаторами, реализующий технологию программно-конфигурируемой сети.

Текущий снапшот разработки (нерелизный) ns‑3 можно найти по адресу:https://gitlab.com/nsnam/ns-3-dev.git.

Разработчики стараются поддерживать эти репозитории в согласованном рабочем состоянии, но они находятся в области разработки и в них присутствует нерелизный код, поэтому если вы не планируете использовать новые функции то выбирайте официальный релиз.

Вы можете найти последнюю версию кода, просмотрев список репозиториев, либо перейдя на веб-страницу «ns‑3 Releases»:https://www.nsnam.org/releases/ и нажав на ссылку последней версии. В этом примере мы продолжим с ns‑3.29.

Теперь, чтобы получить нужные нам составные части ns‑3, применим инструмент Bake. Скажем несколько вводных слов о работе Bake.

Bake работает, загружая исходники пакетов в директорию source и устанавливая библиотеки в сборочную директорию. Bake можно запустить, ссылаясь на двоичный файл, но если вы хотите запускать Bake ne iz direktorija, v katerem je bil naložen, je priporočljivo dodati pot do bake v vašo pot (okoljska spremenljivka PATH), na primer na naslednji način (primer za lupino Linux bash). Pojdite v direktorij "bake" in nastavite naslednje okoljske spremenljivke:

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

To bo program bake.py v pot lupine in omogočilo drugim programom, da najdejo izvršljive datoteke in knjižnice, ki jih je ustvaril bake. V nekaterih primerih uporabe bake, zgoraj opisano nastavitev PATH in PYTHONPATH ni potrebno, vendar je za popolno sestavljanje ns‑3-allinone (z dodatnimi paketi) običajno potrebna.

Pojdite v delovno direktorijo in v konzolo vnesite naslednje:

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

Nato vas bomo prosili, Bake da preverite, ali imamo dovolj orodij za prenos različnih komponent. Vnesite:

$ ./bake.py check

Videli bi morali nekaj takega:

> Python - OK 
> GNU C++ compiler - OK 
> Mercurial - OK 
> Git - OK 
> Tar tool - OK 
> Unzip tool - OK 
> Make - OK 
> cMake - OK 
> patch tool - OK 
> Pot iskanja orodij: /usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin ...

Še posebej so orodja za prenos, kot so Mercurial, CVS, Git in Bazaar, ključna v tem koraku, saj nam omogočajo pridobitev kode. V tej fazi namestite manjkajoča orodja na običajen način za vašo sistem (če znate) ali se obrnite na vašega sistemskega administratorja po pomoč.

Nato poskusite prenesti programsko opremo:

$ ./bake.py download

rezultat bi moral biti nekaj takega:

>> Iskanje sistemske odvisnosti setuptools - OK 
>> Iskanje sistemske odvisnosti libgoocanvas2 - OK 
>> Iskanje sistemske odvisnosti gi-cairo - OK 
>> Iskanje sistemske odvisnosti pygobject - OK 
>> Iskanje sistemske odvisnosti pygraphviz - OK 
>> Iskanje sistemske odvisnosti python-dev - OK 
>> Iskanje sistemske odvisnosti qt - OK 
>> Iskanje sistemske odvisnosti g++ - OK 
>> Prenos pybindgen-0.19.0.post4+ng823d8b2 (ciljni direktorij:pybindgen) - OK 
>> Prenos netanim-3.108 - OK 
>> Prenos ns-3.29 - OK

To bo pomenilo, da so bili preneseni trije izvorni kod. Zdaj pojdite v direktorij source in vnesite ls; videli bi morali:

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

Zdaj ste pripravljeni za sestavljanje razdelka ns‑3.

3.4 Gradnja ns-3

Kot pri prenosu ns‑3, obstaja več načinov za sestavljanje ns‑3. Glavno, kar želimo poudariti, je, da se ns‑3 sestavi z orodjem za sestavljanje, imenovanim Waf, opisanim spodaj. Večina uporabnikov bo delovala z Waf, but there are several convenient scripts that can help you start or organize more complex builds. Therefore, please read about Waf, si poglejte build.py and building with bake.

3.4.1 Gradnja s pomočjo build.py

Pozor! This build step is only available from the source archive version obtained as described above; not downloaded via git or bake.

When working with the release archive tarball, v ns‑3‑allinone there is a convenient script that can simplify building the components. It is called build.py. This program will set up the project for you in the most useful way. However, please note that more complex configurations and working with ns‑3 usually involve using ns‑3's own build system, Waf, which will be introduced later in this guide.

If you downloaded using tarball, then you should have a directory in your ~\/workspace with a name something like ns-allinone-3.29. Enter the following:

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

Ob klicu build.py we applied command line arguments to build the examples and tests used in this guide, which are not built by default in ns‑3. By default, the program also builds all available modules. Later, if you wish, you can build ns‑3 without examples and tests or exclude modules that are not needed for your work.

You will see a lot of compiler output messages displayed by the script when building the various parts you downloaded. First, the script will try to build the animator netanim, then the binding generator pybindgen and finally, ns‑3. Upon completion of the process, you should see the following:

Waf: Leaving directory '\/path\/to\/workspace\/ns-allinone-3.29\/ns-3.29\/build'\n'build' finished successfully (6m25.032s) \n\nModules built:\nantenna                aodv                     applications\nbridge                 buildings                config-store\ncore                   csma                     csma-layout\ndsdv                   dsr                      energy \nfd-net-device          flow-monitor             internet\ninternet-apps          lr-wpan                  lte\nmesh                   mobility                 mpi\nnetanim (no Python)    network                  nix-vector-routing \nolsr                   point-to-point           point-to-point-layout \npropagation            sixlowpan                spectrum \nstats                  tap-bridge               test (no Python) \ntopology-read          traffic-control          uan \nvirtual-net-device     visualizer               wave \nwifi                   wimax \n\nModules not built (see ns-3 tutorial for explanation):\nbrite                  click                    openflow \nLeaving directory .\/ns-3.29

In the last three lines of the listing, we see a message about the modules that were not built:

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

To je preprosto pomeni, da nekateri moduli ns‑3, ki so odvisni od zunanjih knjižnic, morda niso bili sestavljeni ali da za to konfiguracijo njihovo sestavljanje ni potrebno. To ne pomeni, da simulator ni bil sestavljen ali da sestavljeni moduli ne bodo delovali pravilno.

3.4.2 Gradnja s pomočjo Bake

Če ste zgoraj za pridobivanje izvorne kode iz repozitorijev projekta uporabili bake, ga lahko še naprej uporabljate tudi za sestavljanje ns‑3. Vpišite:

$ ./bake.py build

in morali bi videti nekaj takega:

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

Savet: lahko pa lahko tudi hkrati izvedete oba koraka, prenos in sestavljanje, tako da pokličete „bake.py deploy“.

Pri sestavljanju vseh komponent se lahko pojavijo napake, vendar bo sestavljanje nadaljevalo, če komponenta ni obvezna. Na primer, nedavna težava s prenosljivostjo je bila to, da castxml lahko sestavi orodje bake ne na vseh platformah. V tem primeru se bo prikazalo sporočilo:

>> Sestavljanje castxml - Težava 
> Težava: Neobvezna odvisnost, modul "castxml" je odpovedal
To lahko zmanjša funkcionalnost končne gradnje.
Vendar bo bake nadaljeval, saj "castxml" ni bistvena odvisnost.
Za več informacij pokličite bake z -v ali -vvv za polni verbose način.

govori izključno o unicorn podjetjih, da je le 20% teh ustanovila ena oseba. Ali moramo to vrednost upoštevati, ko je vsaka milijardna podjetje edinstvena in neponovljiva zgodba? Poleg tega je velika statistična vzorčna skupina vedno natančnejša. Mit je razbit. castxml je potrebna le, če želite ustvariti posodobljene vezave Python. Za večino uporabnikov to ni potrebno (vsaj dokler ne začnejo spreminjati ns‑3), zato se te težave lahko trenutno varno ignorirajo.

Če pride do napake, bo naslednji ukaz dal namig o manjkajočih odvisnostih:

$ ./bake.py show

Naštete bodo različne odvisnosti paketov, ki jih poskušate sestaviti.

3.4.3 Gradnja s pomočjo Waf

Do tega trenutka smo za začetek sestavljanja ns‑3 uporabljali bodisi skripto build.py, bodisi orodje bake. Ta orodja so koristna za sestavljanje ns‑3 in podporo knjižnicam. V resnici za sestavljanje zaženejo orodje za sestavljanje Waf iz imenika ns‑3. Waf ki se namestijo skupaj z izvorno kodo ns‑3. Večina uporabnikov se hitro preklopi na neposredno uporabo Waf. Torej, da nadaljujete, prosimo, pojdite v imenik ns‑3, ki ste ga prvotno ustvarili.

Trenutno to nije strogo potrebno, ali bi bilo korisno malo skrenuti s teme i pogledati kako unijeti promjene u konfiguraciji projekta. Vjerojatno će najkorisnija promjena konfiguracije koju možete napraviti biti stvaranje optimizirane verzije koda. Po defaultu, postavili ste svoj projekt na izradu verzije za ispravku grešaka. Pogledajmo projekt za izradu optimizirane verzije. Da biste objasnili Wafu da treba napraviti optimizirane verzije s primjerima i testovima, trebate izvršiti sljedeće naredbe:

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

Ovo će pokrenuti Waf izvan lokalnog direktorija (radi vaše udobnosti). Prva naredba čisti prethodnu izradu, što obično nije strogo potrebno, ali je dobra praksa (vidite i profile izrade u nastavku); ovo će ukloniti ranije stvorene biblioteke i objektne datoteke koje se nalaze u direktoriju build/. Kada se projekt ponovo konfigurira i sustav za izradu provjerava razne ovisnosti, trebali biste vidjeti izlaz sličan sljedećem:

Nastavitev vrha na      : /home/ns3user/workspace/bake/source/ns-3-dev
Nastavitev izhoda na      : /home/ns3user/workspace/bake/source/ns-3-dev/build
Preverjanje za 'gcc' (C prevajalnik)        : /usr/bin/gcc 
Preverjanje za različico cc                : 7.3.0 
Preverjanje za 'g++' (C++ prevajalnik)      : /usr/bin/g++ 
Preverjanje za podporo za različico -march=native : ok 
Preverjanje za podporo za različico -Wl,--soname=foo : ok 
Preverjanje za podporo za različico -std=c++11       : ok 
Preverjanje vključkov boost   : glave niso bile najdene, prosim,!zagotovite argument --boost-includes (glejte pomoč) 
Preverjanje vključkov boost   : glave niso bile najdene, prosim,!zagotovite argument --boost-includes (glejte pomoč) 
Preverjanje za program 'python'            : /usr/bin/python 
Preverjanje za različico python >= 2.3       : 2.7.15 python-config                                                                     : /usr/bin/python-config
Vprašanje python-config za pyembed '--cflags --libs --ldflags' oznake : yes
Preizkušanje konfiguracije pyembed                                      : yes
Vprašanje python-config za pyext '--cflags --libs --ldflags' oznake   : yes
Preizkušanje konfiguracije pyext                                        : yes

Preverjanje za podporo za različico -fvisibility=hidden          : ok 
Preverjanje za podporo za različico -Wno-array-bounds            : ok 
Preverjanje lokacije pybindgen          : ../pybindgen ,!(ugerjeno) 
Preverjanje modula python 'pybindgen'   : 0.19.0. ,!post4+g823d8b2 
Preverjanje različice pybindgen           : 0.19.0. ,!post4+g823d8b2 
Preverjanje za kodo                : yes 
Preverjanje za enakovrednost tipov uint64_t in unsigned long : no 
Preverjanje za kodo                                 : no 
Preverjanje za enakovrednost tipov uint64_t in unsigned long long     : yes 
Preverjanje za apidefs, ki se lahko uporabijo za Python vezave                       : gcc-LP64 
Preverjanje notranjega GCC cxxabi         : končano 
Preverjanje modula python 'pygccxml'    : ni najden 
Preverjanje lokacije click              : ni najden 
Preverjanje za program 'pkg-config'        : /usr/bin/pkg- ,!config 
Preverjanje za 'gtk+-3.0'                  : ni najden 
Preverjanje za 'libxml-2.0'                : yes 
Preverjanje za uint128_t                   : ni najden 
Preverjanje za __uint128_t                 : yes 
Preverjanje visoke natančnosti   : 128-bitni celoten ,!(privzeto) 
Preverjanje za glavo stdint.h             : yes 
Preverjanje za glavo inttypes.h           : yes 
Preverjanje za glavo sys/inttypes.h       : ni najden 
Preverjanje za glavo sys/types.h          : yes 
Preverjanje za glavo sys/stat.h           : yes 
Preverjanje za glavo dirent.h             : yes 
Preverjanje za glavo stdlib.h             : yes 
Preverjanje za glavo signal.h             : yes 
Preverjanje za glavo pthread.h            : yes 
Preverjanje za glavo stdint.h             : yes 
Preverjanje za glavo inttypes.h           : yes 
Preverjanje za glavo sys/inttypes.h       : ni najden
Preverjanje za knjižnico rt                  : yes 
Preverjanje za glavo sys/ioctl.h          : yes 
Preverjanje za glavo net/if.h             : yes 
Preverjanje za glavo net/ethernet.h       : yes 
Preverjanje za glavo linux/if_tun.h       : yes 
Preverjanje za glavo netpacket/packet.h   : yes 
Preverjanje lokacije NSC                : ni najden 
Preverjanje za 'sqlite3'                   : ni najden 
Preverjanje za glavo linux/if_tun.h       : yes 
Preverjanje modula python 'gi'          : 3.26.1 
Preverjanje modula python 'gi.repository.GObject'      : ok 
Preverjanje modula python 'cairo'                      : ok 
Preverjanje modula python 'pygraphviz'                 : 1.4rc1 
Preverjanje modula python 'gi.repository.Gtk'          : ok 
Preverjanje modula python 'gi.repository.Gdk'          : ok 
Preverjanje modula python 'gi.repository.Pango'        : ok 
Preverjanje modula python 'gi.repository.GooCanvas'    : ok 
Preverjanje za program 'sudo'                             : /usr/bin/sudo 
Preverjanje za program 'valgrind'                         : ni najden 
Preverjanje za 'gsl' : ni najden python-config            : ni najden 
Preverjanje za podporo za različico -fstrict-aliasing : ok 
Preverjanje za podporo za različico -fstrict-aliasing : ok 
Preverjanje za podporo za različico -Wstrict-aliasing : ok 
Preverjanje za podporo za različico -Wstrict-aliasing : ok 
Preverjanje za program 'doxygen'                          : /usr/bin/doxygen
---- Povzetek opcijskih funkcij ns-3:
Profil gradnje : optimizirano
Direktorij gradnje : 
BRITE Integracija : ni omogočena (BRITE ni omogočen (glejte možnost --with- ,!brite)) 
DES Metrics zbiranje dogodkov : ni omogočeno (privzeto je onemogočeno) 
Emulacija FdNetDevice        : omogočeno 
Primeri                     : omogočeno 
Opis datoteke NetDevice    : omogočeno 
GNU Scientific Library (GSL) : ni omogočena (GSL ni najden) 
Knjižnica Gcrypt               : ni omogočena
(libgcrypt ni najden: lahko uporabite ,!libgcrypt-config za iskanje njegove lokacije.) GtkConfigStore               : ni omogočen (knjižnica 'gtk+-3.0 >= 3.0' ni najdena)
MPI Podpora                  : ni omogočena (možnost --enable-mpi ni izbrana)
ns-3 Click Integracija       : ni omogočena (nsclick ni omogočen (glejte možnost --with- ,!nsclick))
ns-3 OpenFlow Integracija   : ni omogočena ( zahtevane knjižnice boost niso bile najdene) 
Mrežno simulacijsko kolebnico    : ni omogočena (NSC ni najden (glejte možnost --with-nsc))
PlanetLab FdNetDevice         : ni omogočen (operacijski sistem PlanetLab ni bil zaznan ,!(glejte možnost --force-planetlab)) PyViz vizualizator : omogočen 
Podpora za skeniranje Python API   : ni omogočena (manjkajoč 'pygccxml' Python modul)
Python Vezave : omogočeno 
Simulator v realnem času           : omogočeno 
Izhod podatkov SQlite statov      : ni omogočen (knjižnica 'sqlite3' ni najdena)
Tap Bridge                    : omogočeno 
Tap FdNetDevice               : omogočeno
Testi                         : omogočeno 
Primitivi za večnitnost          : omogočeno 
Uporabite sudo za nastavitev suid bit   : ni omogočeno (možnost --enable-sudo ni bila izbrana)
XmlIo                         : omogočeno
'configure' se je uspešno končal (6.387s)

Upoštevajte zadnji del zgoraj navedenega seznama. Nekatere možnosti ns-3 niso privzeto vključene ali pa za pravilno delovanje potrebujejo podporo sistema. Na primer, za vključitev XmlTo mora biti v sistemu prisotna knjižnica libxml-2.0. Če ta knjižnica ni bila najdena in ustrezna funkcija ns-3 ni bila vključena, se bo prikazalo sporočilo. Prav tako upoštevajte, da obstaja možnost uporabe ukaza sudo za nastavitev bitov suid „nastavitev ID skupine med izvajanjem“ nekaterih programov. Privzeto ni vključen, zato se ta funkcija prikaže kot „ni vključena“. Nazadnje, za pridobitev seznama vključenih možnosti uporabite Waf s parametrom --check-config.

Zdaj se vrnimo in preklopimo nazaj na način za odpravljanje napak, ki vsebuje primere in teste.

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

Sistemski graditelj je zdaj nastavljen in lahko zgradite različice odpravljanja napak programov ns-3 preprosto z vnosom:

$ ./waf

Naj opisani zgoraj koraki povzročijo, da ste del sistema ns-3 zgradili dvakrat, vendar zdaj veste, kako prilagoditi konfiguracijo in zgraditi optimizirano kodo.

Za preverjanje tega, kateri profil je aktiven za dano konfiguracijo projekta, obstaja ukaz:

$ ./waf --check-profile 
Waf: Vstop v imenik `/path/to/ns-3-allinone/ns-3.29/build' 
Gradbeni profil: debug

Obravnavani zgoraj scenarij build.py prav tako podpira argumente --enable-examples in --enable-tests, vendar drugih možnosti Waf ne podpira neposredno. Na primer, to ne bo delovalo:

$ ./build.py --disable-python

reakcija bo naslednja:

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

Kljub temu se lahko posebni operator -- uporablja za posredovanje dodatnih parametrov preko waf, zato bo delovala naslednja ukazna vrstica namesto zgoraj omenjene:

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

saj generira osnovno ukazno vrstico ./waf configure --disable-python. Tukaj je še nekaj uvodnih nasvetov o Waf.

Obravnava napak pri gradnji

Izdanja ns-3 su testirana na najnovijim dostupnim C++ kompajlerima u trenutku izdanja na popularnim distribucijama Linux i MacOS. Međutim, s vremenom, izlaze nove distribucije sa novim kompajlerima, a ti noviji kompajleri obično su pedantniji u vezi sa upozorenjima. ns-3 postavlja svoju izgradnju da tretira sve upozorenje kao greške, tako da ponekad, ako koristite stariju verziju na novijem sistemu, upozorenje kompajlera može zaustaviti izgradnju.

Na primer, ranije je bilo izdanje ns-3.28 za Fedora 28, koje je uključivalo novu glavnu verziju gcc (gcc-8). Izgradnja izdanja ns-3.28 ili starijih verzija pod Fedora 28, pri instaliranom Gtk2+, izazvaće ovu grešku:

/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 od ns-3.28.1, Waf dostupna je opcija za rešavanje ovih problema. Ona isključuje postavljanje oznake „-Werror“ u g++ i clang++. Ova opcija je „—disable-werror“, treba je koristiti prilikom konfiguracije:

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

Konfiguriši ili gradi

Neke komande Waf imaju smisla samo u fazi konfiguracije, dok neke deluju samo u fazi izgradnje. Na primer, ako želite da koristite funkcije emulacije ns-3, možete omogućiti postavljanje bita suid koristeći sudo, kao što je opisano gore. Ovo će poništiti komande faze konfiguracije, i tako ćete moći da promenite konfiguraciju koristeći sledeću komandu, koja takođe uključuje primere i testove.

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

Ako to uradite, Waf pokrenuće sudo, kako bi promenili programe za pravljenje soketa emulacije za pokretanje sa privilegijama. root. U Waf Dostupno je mnogo drugih opcija za faze konfiguracije i izgradnje. Da biste istražili opcije, unesite:

$ ./waf --help

U sledećem odeljku koristićemo neke opcije povezane sa testiranjem.

Profilisanje izgradnje

Već smo videli kako se može konfigurisati Waf za izgradnje debug in optimized:

$ ./waf --build-profile=debug

Takođe postoji međuprofesionalni profil izgradnje, release. Možnost -d koji je sinonim za --build-profile. Profil izgradnje upravlja korišćenjem logovanja, tvrdnji (assertions) i optimizatorskim ključevima kompajlera:

Navodila za simulator omrežja ns-3. Poglavje 3

Kot lahko vidite, so dnevniški zapisi in trditve na voljo samo v različicah z razhroščevanjem. Priporočena praksa je, da razvijate svoj skript v načinu za razhroščevanje, nato pa izvedete ponovne zanke (za statistiko ali spremembo parametrov) v optimiziranem profilu zbirke.

Če imate kodo, ki jo je treba izvajati samo v določenih profilih zbirke, uporabite makro Code Wrapper Macro:

NS_BUILD_DEBUG (std::cout << "Del dela na izhodni vrstici..." << std::flush; timer.Start ,!()); DoLongInvolvedComputation ();
NS_BUILD_DEBUG (timer.Stop (); std::cout << "Končano: " << timer << std::endl;)

По умолчанию, Waf premakne artefakte zbirke v mapo za zbirko. Z možnostjo lahko navedete drugo izhodno mapo - -out, na primer:

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

S kombiniranjem s profili zbirke lahko preprosto preklapljate med različnimi parametri prevajanja:

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

Kar vam omogoča delo z več različicami brez potrebe po ponovnem pisanju vsakega zadnjega. Waf Ko preklopite na drug profil,

bo prevajal le tega, brez popolne ponovne prevajanja vsega.

Ko tako preklapljate med profili zbirke, morate biti pozorni, da vsakič zagotovite enake konfiguracijske parametre. Pomagalo vam bo preprečiti napake, če določite več okoljskih spremenljivk:

$ 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

Prevajalniki in zastavice Waf V zgoraj navedenih primerih g++za zbiranje ns-3 uporablja C++ prevajalnik iz GCC ( Waf ). Vendar pa lahko spremenite uporabljen

C++ prevajalnik, tako da določite okoljsko spremenljivko CXX. Na primer, za uporabo C++ prevajalnika Clang, clang++, 

$ CXX="clang++" ./waf configure $ ./waf build Waf Na podoben način lahko nastavite za uporabo distribuiranega prevajanja z:

distcc

$ CXX="distcc g++" ./waf configure $ ./waf build Več informacij o distcc in distribuiranem prevajanju najdete na strani projekta v razdelku 'Dokumentacija'. Da dodate zastavice prevajalnika pri konfiguriranju ns-3, uporabite okoljsko spremenljivko CXXFLAGS_EXTRA.

Namestitev

Waf lahko se uporablja za namestitev knjižnic na različne lokacije sistema. Privzeto so zbrane knjižnice in izvršljivi programi v imeniku build, in ker Waf pozna lokacijo teh knjižnic in izvršljivih datotek, ni potrebe po namestitvi knjižnic drugam.

Če uporabniki raje namestijo zunaj imenika za zbiranje, lahko izvedejo ukaz .\/waf install. Privzeti predpona za namestitev je /usr/local, zato .\/waf install bo nameščal programe v /usr/local/bin, knjižnice v /usr/local/lib in glave datoteke v /usr/local/include. Pravice superuporabnika so običajno potrebne za namestitev s privzetim predpono, zato bo tipičen ukaz sudo .\/waf install. Ob zagonu Waf najprej daje prednost uporabi skupnih knjižnic v imeniku za zbiranje, nato išče knjižnice po poti do knjižnic, nastavljenih v lokalnem okolju. Zato je dobra praksa, da ob namestitvi knjižnic v sistem preverite, da so uporabljene prave knjižnice. Uporabniki se lahko odločijo za namestitev z drugim predpono, tako da med konfiguracijo posredujejo možnost --prefix, na primer:

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

Če uporabnik pozneje, po zbiranju, vnese ukaz za namestitev .\/waf, bo uporabljen predpona /opt/local.

Komanda .\/waf clean mora biti uporabljen pred ponovno konfiguracijo projekta, če bo namestitev uporabljala Waf pod drugim predpono.

Torej, za uporabo ns‑3 ni treba klicati .\/waf install. Večina uporabnikov te ukaze ne bo potrebovala, saj Waf prevzame trenutne knjižnice iz imenika za zbiranje, vendar nekateri uporabniki to morda najdejo koristno, če njihovo delo vključuje ukvarjanje s programi zunaj imenika ns‑3.

Waf je enoten

Na vrhu drevesa izvorne kode ns‑3 obstaja samo en Waf skript. Ko začnete delo, boste preživeli veliko časa v imeniku scratch\/ ali globlje, vsrc\/... in ob tem boste potrebovali zagon Waf. Preprosto se lahko spomnite, kje ste, in zaženete Waf takole:

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

, toda to bo naporno in podvrženo napakam, zato obstajajo boljše rešitve. Eden pogostih načinov je uporaba besedilnega urejevalnika, kot je emacs ili vim, v katerem odprete dve terminanski seji, ena se uporablja za zbiranje ns‑3, druga pa za urejanje izvorne kode. Če imate le tarball, then you might find the environment variable helpful:

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

$ cd scratch 
$ waff build

In the module directory, it might be tempting to add a trivial waf script as a sample exec ..\/..\/waf. Please do not do this. It confuses newcomers and, if done poorly, leads to hard-to-detect build errors. The solutions provided above are the way to go.

3.5 Preverjanje ns-3

You can run the ns‑3 distribution's module tests by executing the script .\/test.py:

$ .\/test.py

These tests run in parallel with Waf. Ultimately, you should see a message that

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

This important message highlights failures, crashes, or valgrind errors, indicating code issues or incompatibilities between tools and the code.

You will also see a summary output from Waf and the tester running each test, which will look something like this:

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)

This command is usually run by users for a quick check of the ns‑3 distribution's build integrity. (Note that the order of lines "PASS: ..." may vary, which is normal. What matters is that in the final line of the report, all tests passed; no test failed or crashed.) And Waf, i test.py will parallelize the workload across the available CPU cores of the machine.

3.6 Zagon skripte

Typically, we run scripts under the control of Waf. This allows the build system to ensure that the paths to the shared library are set correctly and that libraries are available at runtime. To run the program, simply use Waf s parametrom - -run. Let's run for ns‑3 the equivalent of the ubiquitous program hello world, by typing the following:

$ .\/waf --run hello-simulator

Waf najprej preveri, ali je program pravilno sestavljen, in po potrebi izvede sestavljanje. Nato Waf izvede program, ki bo izvedel naslednji izhod.

Hello Simulator

Čestitamo! Zdaj ste uporabnik ns‑3!

Kaj naj naredim, če ne vidim rezultata?

Če vidite sporočila Waf, ki kažejo, da je bilo sestavljanje uspešno zaključeno, vendar ne vidite izhoda »Hello Simulator«, obstaja verjetnost, da ste v razdelku [Sestavljanje-s-Waf] preklopili svoj način sestavljanja na optimized, vendar ste pozabili, da se vrnete v način debug. Vsi izhodi konzole, ki se uporabljajo v tem priročniku, uporabljajo posebna komponento ns‑3, ki izvaja zapisovanje dnevnika in se uporablja za tiskanje uporabniških sporočil v konzolo. Izhod iz te komponente je samodejno onemogočen pri prevodu optimiziranega kode — je »optimiran«. Če ne vidite izhoda »Hello Simulator«, vnesite naslednje:

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

da nastavite Waf na sestavljanje odpravnih različic programov ns‑3, ki vključujejo primere in teste. Nato morate znova sestaviti aktualno odpravne različice kode s tipkanjem

$ ./waf

Zdaj, če zaženete program hello-simulator, bi morali videti pričakovani rezultat.

3.6.1 Argumenti ukazne vrstice

Za prenos argumentov ukazne vrstice v program ns‑3 uporabite naslednjo predlogo:

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

Zamenjajte z imenom vašega programa in z argumenti. Argument - -command-template za Waf je v bistvu recept za sestavljanje dejanske ukazne vrstice Waf ki se uporablja za izvajanje programa. Waf preveri, ali je sestavljanje zaključeno, nastavi poti do skupne knjižnice, nato pa z uporabo dane predloge ukazne vrstice in zamenjavo imena programa namesto prostora za oznako %s pokliče izvršilno datoteko. Če se vam zdi ta sintaksa zapletena, obstaja enostavnejša možnost, ki vključuje program ns‑3 in njegove argumente, ki so zapisani v enojnih narekovajih:

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

Drug, še posebej koristen primer je izbirno izvajanje nizov testov. Predpostavimo, da obstaja testni niz (suite) mytest (v resnici ga ni). Zgoraj smo uporabili skripto .\/test.py za paralelno izvajanje celega niza testov, kar večkrat pokliče program testiranja test-runner. Klic test-runner direktno za izvršavanje jednog testa:

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

Argumenti će biti prosledjeni programu test-runner. Pošto mytest ne postoji, generisaće se poruka o grešci. Da biste odštampali dostupne opcije test-runnera, unesite:

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

3.6.2 Odpravljanje napak

Za pokretanje programa ns-3 uz pomoć druge alatke, kao što je debager (npr. gdb) ili alat za proveru memorije (npr. valgrind), koristite sličan oblik - -command-template = "…". Na primer, da biste pokrenuli u debageru gdb vaš program hello-simulator ns-3 sa argumentima:

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

Imajte na umu da ime programa ns-3 ide sa argumentom - -run, a alat za upravljanje (ovde gdb) je prvi token u argumentu - -command-template. Možnost - -args poroča gdb, što ostatak komandne linije pripada «nižem» programu. (Neke verzije gdb ne razumeju opciju - -args. U tom slučaju, uklonite argumente programa iz - -command-template i koristite skup komandi gdb args.) Možemo spojiti ovaj recept i prethodni za pokretanje testa u debageru:

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

3.6.3 Delovna mapa

Waf treba da se pokreće iz svog mesta na vrhu stabla ns-3. Ova fascikla postaje radna direktorija, gde će se zapisivati izlazni fajlovi. Ali šta ako želite da sačuvate te fajlove van stabla izvornog koda ns-3? Koristite argument - -cwd:

$ . /waf --cwd=...

Možda će vam biti zgodnije da dobijate izlazne fajlove u vašoj radnoj direktoriji. U tom slučaju može pomoći ovako neizravno delovanje:

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

Ovo dekorisanje prethodne verzije komande čuva trenutnu radnu direktoriju, prelazi u direktoriju Waf, a zatim instruiše Waf da promeni radnu direktoriju nazad u sačuvanu pre pokretanja programa trenutnu radnu direktoriju. Pominjemo komandu - -cwd za potpunost objašnjenja, većina korisnika jednostavno pokreće Waf iz direktorije na vrhu nivoa i tamo generiše izlazne fajlove.

Nastavak: poglavlje 4

Izvor: habr.com

Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki 🔥 Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki | ProHoster