3 Te begjinnen
3.1 Oersjoch
3.2 Betingsten
3.2.1 De ns-3-release downloade as boarne-argyf
3.3 Downloaden fan ns-3 mei Git
3.3.1 Laden fan ns-3 mei Bake
3.4 Gearstalling ns-3
3.4.1 Bouwe mei build.py
3.4.2 Bouwe mei Bake
3.4.3 Bouwe mei Waf
3.5 Testen ns-3
3.6 It skript útfiere
3.6.1 Arguminten foar kommandorigel
3.6.2 Debuggen
3.6.3 Wurkmap
Haadstik 3
Begjinne
Dit haadstik is bedoeld om de lêzer ta te rieden om te begjinnen mei in kompjûter dy't ns-3 mooglik nea ynstallearre hat. It behannelt stipe platfoarms, betingsten, hoe't jo ns-3 kinne krije, hoe't jo ns-3 bouwe, en hoe jo jo bouwe en ienfâldige programma's kinne testen.
3.1 Oersjoch
De ns-3-simulator is boud as in systeem fan gearwurkjende softwarebiblioteken. Tidens de gearstalling is de koade fan brûkersprogramma's keppele oan dizze bibleteken. De programmeartalen C ++ of Python wurde brûkt om oanpaste programma's te skriuwen.
Ns-3 wurdt ferspraat as boarnekoade, wat betsjut dat it doelsysteem in softwareûntwikkelingomjouwing moat hawwe om earst de bibleteken te bouwen en dan it brûkersprogramma te bouwen. Yn prinsipe, ns-3 koe wurde ferspraat as klearmakke bibleteken foar in spesifyk systeem, en yn 'e takomst se meie wurde ferdield op dizze wize. Mar tsjintwurdich dogge in protte brûkers har wurk troch ns-3 sels te bewurkjen, dus it is handich om de boarnekoade te hawwen om de bibleteken te bouwen. As immen it wurk oannimme wol fan it meitsjen fan klearmakke biblioteken en pakketten foar bestjoeringssystemen, nim dan kontakt op mei de mailinglist ns-ûntwikkelders.
Folgjende sille wy nei trije manieren sjen om ns-3 te downloaden en te bouwen. De earste is om de offisjele release te downloaden en te bouwen fan 'e haadside. De twadde is de seleksje en gearstalling fan kopyen fan ûntwikkeling ferzjes fan de basis ns-3 ynstallaasje. De tredde is om ekstra build-ark te brûken om mear útwreidingen foar ns-3 te laden. Wy sille elk trochgean, om't de ark wat oars binne.
Erfarne Linux-brûkers kinne har ôffreegje wêrom't ns-3 net wurdt levere as in pakket lykas de measte oare bibleteken dy't in pakketbehearder brûke? Hoewol't d'r binêre pakketten binne foar ferskate Linux-distribúsjes (bgl. Debian), binne de measte brûkers úteinlik de bibleteken te bewurkjen en ns-3 sels opnij op te bouwen, sadat de boarnekoade beskikber is handich. Om dizze reden sille wy rjochtsje op ynstallaasje fan boarne.
Foar de measte applikaasjes ns-3 rjochten woartel binne net nedich, is it oan te rieden om in unprivileged brûkersaccount te brûken.
3.2 Betingsten
De hiele set fan beskikbere ns-3-biblioteken hat in oantal ôfhinklikens fan biblioteken fan tredden, mar foar it grutste part kin ns-3 boud en brûkt wurde mei stipe foar ferskate mienskiplike (faak standert ynstalleare) komponinten: in C++-kompiler, Python, in boarnekoade-bewurker (bygelyks, vim, emacs of Eklips) en, as ûntwikkelingsrepositories wurde brûkt, Git ferzjekontrôlesystemen. De measte earste kear brûkers hoege gjin soargen te meitsjen as har konfiguraasje rapportearret dat guon ns-3 avansearre funksjes ûntbrekke, mar foar dyjingen dy't in folsleine ynstallaasje wolle, leveret it projekt in wiki dy't siden befettet mei in protte nuttige tips en trúkjes. Ien sa'n side is de Ynstallaasje side, mei ynstallaasje ynstruksjes foar ferskate systemen, beskikber op:
De seksje Foareasken fan dizze wiki ferklearret hokker pakketten nedich binne om mienskiplike ns-3-opsjes te stypjen en jout ek de kommando's dy't brûkt wurde om se te ynstallearjen op gewoane smaken fan Linux of macOS.
Jo kinne profitearje fan dizze kâns om de ns-3 wiki-side of de haadwebside te ferkennen:
Tool Package / Ferzje
- C++ kompilator
clang++ of g++ (g++ ferzje 4.9 of heger) - Python
python2 ferzje >= 2.7.10, of python3 ferzje >=3.4 - gean
elke lêste ferzje (om tagong te krijen ta ns-3 op GitLab.com) - tar
elke lêste ferzje (foar it útpakken fan ns-3 release) - byp2
elke lêste ferzje (foar it útpakken fan de ns-3-release)
Om de standertferzje fan Python te kontrolearjen, typ python -V
. Om de g++ ferzje te kontrolearjen, typ g++ -v
. As der in ark ûntbrekt of te âld is, ferwize dan nei de ynstallaasjegids op 'e ns-3 wiki-side.
Fan no ôf geane wy derfan út dat de lêzer Linux, MacOS, as in Linux-emulator draait, en op syn minst de boppesteande ark hat.
3.2.1 De ns-3-release downloade as boarne-argyf
Dit is de kursus fan aksje foar in nije brûker dy't de lêste release en pakketferzjes fan ns-3 downloade en eksperimintearje wol. ns-3 releases wurde publisearre as komprimearre boarne argiven, soms neamd tarball. tarball is in spesjale software-argyfformaat wêryn ferskate bestannen byinoar wurde kombinearre. It argyf wurdt meastentiids komprimearre. ns-3 boot proses fia tarball is simpel, jo moatte gewoan selektearje in release, download en útpakke it.
Litte wy oannimme dat jo, as brûker, ns-3 bouwe wolle yn in lokale map neamd wurkromte. Jo kinne in wurkkopy fan 'e release krije troch it folgjende yn te fieren yn' e Linux-konsole (ferfanging fan de passende ferzjenûmers, fansels)
$ 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
Soarch omtinken foar it hjirboppe brûkte nut wget, dat is in kommandorigelark foar it downloaden fan objekten fan it ynternet. As jo it net ynstalleare hawwe, kinne jo jo browser hjirfoar brûke.
Troch dizze stappen te folgjen sille jo nei de map ns-allinone-3.29 bringe, dêr moatte jo ferskate bestannen en mappen sjen
$ 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
Jo binne no ree om de ns-3 basisferdieling te bouwen en kinne trochgean nei de seksje oer it bouwen fan ns-3.
3.3 Downloaden fan ns-3 mei Git
De ns-3-koade is beskikber yn 'e Git-repositories op GitLab.com at
De maklikste manier om te begjinnen mei it brûken fan Git-repositories is om de omjouwing te gabeljen of te klonen ns-3-allinone. Dit is in set fan skripts dy't beheart it laden en gearstalling fan de meast brûkte ns-3 subsystemen. As jo nij binne by Git, kinne de termen "foark" en "kloon" foar jo ûnbekend wêze; as dat sa is, riede wy oan dat jo de repository op GitLab.com gewoan klonen (meitsje jo eigen kopy) sa:
$ cd
$ mkdir workspace
$ cd workspace
$ git clone https://gitlab.com/nsnam/ns-3-allinone.git
$ cd ns-3-allinone
Op dit stadium is de werjefte fan jo map ns-3-allinone in bytsje oars as de hjirboppe beskreaune triemtafel foar release-argyf. It moat der sa útsjen:
$ ls
build.py constants.py download.py README util.py
Tink derom dat der in skript is download.py, dy't ek ns-3 en byhearrende boarnekoade ekstrahearje sil. Hjir hawwe jo in kar: download of de lêste ns-3-ûntwikkelingssnapshot:
$ python download.py
of leaver de ns-3 release mei help fan de flagge -n
om it útjeftenûmer oan te jaan:
$ python download.py -n ns-3.29
Nei dizze stap nei de map ns-3-allinone ekstra repositories sille wurde ynladen ns-3, bakke, pybindgen и netanim.
remark
Op in masine mei skjinne Ubuntu16.04 moast ik it kommando feroarje nei dit: $ sudo python3 download.py -n ns-3.29
(hjirnei oersetternotysjes).
3.3.1 Laden fan ns-3 mei Bake
De boppesteande twa metoaden (boarne argyf as repository ns-3-allinone fia Git) binne nuttich foar it krijen fan de ienfâldichste ns-3 ynstallaasje mei meardere tafoegings (pybindgen te generearjen Python bindingen en netanim foar netwurkanimaasje). De tredde repository levere standert yn ns-3-allinone wurdt neamd bakke.
Bakke is in ark foar koördinearre bou fan software út meardere repositories, ûntwikkele foar it ns-3 projekt. Bakke kin brûkt wurde om ûntwikkelingsferzjes fan ns-3 te krijen, lykas ek om útwreidingen fan 'e basisferzje fan' e ns-3-distribúsje te downloaden en te bouwen, lykas de omjouwing Direkte koade útfiering, CradleNetwork Simulaasje Cradle, de mooglikheid om nije Python-bindingen en ferskate ns-3 "apps" te meitsjen.
remark
CradleNetwork Simulation Cradle is in ramt wêrmei jo echte TCP/IP-netwurkstacks yn in netwurksimulator kinne brûke.
As jo ferwachtsje dat jo ns-3 ynstallaasje avansearre of ekstra funksjes hat, kinne jo dit ynstallaasjepaad folgje.
Yn de lêste ns-3 releases Bakke waard tafoege oan de tar release. De release omfettet in konfiguraasjetriem wêrmei jo de aktuele softwareferzjes kinne downloade op it momint fan de frijlitting. Dat is bygelyks de ferzje Bakke. bakeconf.xml net bywurke).
Jo kinne ek it lêste eksimplaar krije bakketroch it folgjende kommando yn te fieren yn jo Linux-konsole (oannommen dat jo Git ynstalleare hawwe):
$ cd
$ mkdir workspace
$ cd workspace
$ git clone https://gitlab.com/nsnam/bake.git
As jo it git-kommando útfiere, moatte jo wat sjen as it folgjende:
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.
Nei it kommando foltôge klon jo moatte in map mei de namme hawwe bakke, wêrfan de ynhâld der sa útsjen moat:
$ cd bake
$ ls
bake bakeconf.xml bake.py doc examples generate-binary.py test TODO
Tink derom dat jo ferskate Python-skripts laden hawwe, in Python-module neamd bakke en in XML-konfiguraasjetriem. De folgjende stap is om dizze skripts te brûken om de ns-3-distribúsje fan jo kar te downloaden en te bouwen. Ferskate maatwurkdoelen binne beskikber:
-
ns-3.29: module oerienkomt mei de release; it sil komponinten downloade fergelykber mei de frijlitting yn 'e tarball;
-
ns-3-dev: in ferlykbere module, mar mei help fan koade út de ûntwikkeling beam;
-
ns-allinone-3.29: In module dy't oare oanfoljende funksjes omfettet lykas Click-routing en Network Simulation Cradle, Openflow foar ns-3.
-
ns-3-allinone: fergelykber mei de release ferzje fan de module alles yn ien, mar foar ûntwikkeling koade.
remark
Klik - Modulêre software-arsjitektuer foar it meitsjen fan routers.
Openflow is in protokol foar it behearen fan it proses fan it ferwurkjen fan gegevens oer in gegevensnetwurk troch routers en switches, it ymplementearjen fan software-definieare netwurktechnology.
De aktuele snapshot fan ûntwikkeling (net-release) ns-3 is te finen op:
De ûntwikkelders besykje dizze repositories yn in konsekwinte wurkjende folchoarder te hâlden, mar se binne yn it ûntwikkelingsgebiet en befetsje unreleased koade, dus as jo gjin nije funksjes brûke, selektearje dan de offisjele release.
Jo kinne de lêste ferzje fan 'e koade fine troch te blêdzjen troch de list mei repositories, of troch te gean nei de ns-3 Releases webside:
No, om de ns-3-komponinten te krijen dy't wy nedich binne, sille wy it ark brûke Bakke. Lit ús in pear ynliedende wurden sizze oer it wurk Bakke.
Bake wurket troch pakketboarnen te laden yn in map boarne en it ynstallearjen fan de bibleteken yn de build map. Bakke kin útfierd wurde troch ferwizing nei de binêre, mar as jo wolle rinne Bakke net út de map wêryn it is ynladen, is it oan te rieden om it paad ta te foegjen bakke nei jo paad (PATH omjouwingsfariabele), bygelyks as folget (foarbyld foar Linux bash shell). Gean nei de map "bake" en set dan de folgjende omjouwingsfariabelen yn:
$ export BAKE_HOME=`pwd`
$ export PATH=$PATH:$BAKE_HOME:$BAKE_HOME/build/bin
$ export PYTHONPATH=$PYTHONPATH:$BAKE_HOME:$BAKE_HOME/build/lib
Dit sil it programma pleatse bake.py nei it shellpaad en sil oare programma's tastean de útfierbere en bibleteken te finen dy't it makke bakke. Yn guon gefallen fan gebrûk bakke, de hjirboppe beskreaune PATH- en PYTHONPATH-ynstelling is net fereaske, mar in folsleine build fan ns-3-allinone (mei ekstra pakketten) fereasket it normaal.
Gean nei jo wurkmap en fier it folgjende yn yn 'e konsole:
$ ./bake.py configure -e ns-3.29
Folgjende sille wy freegje Bakke kontrolearje as wy genôch ark hawwe om de ferskate komponinten te laden. Dial:
$ ./bake.py check
Jo moatte wat sjen as it folgjende:
> 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 ...
Benammen upload ark lykas Mercurial, CVS, Git en Bazaar binne essensjeel yn dizze stap, om't se ús de koade kinne krije. Ynstallearje op dit punt de ûntbrekkende ark op 'e gewoane manier foar jo systeem (as jo witte hoe) of nim kontakt op mei jo systeembehearder foar help.
Besykje dan de software te downloaden:
$ ./bake.py download
it resultaat moat sa'n ding wêze as:
>> 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
Dit sil betsjutte dat trije boarnen binne ynladen. Gean no nei de boarne map en typ ls; Jo moatte sjen:
$ cd source
$ ls
netanim-3.108 ns-3.29 pybindgen
No binne jo ree om de ns-3-distribúsje te bouwen.
3.4 Gearstalling ns-3
Lykas by it downloaden fan ns-3, binne d'r ferskate manieren om ns-3 te bouwen. It wichtichste ding dat wy wolle beklamje is dat ns-3 is boud mei in build ark neamd Wafhjirûnder beskreaun. De measte brûkers sille wurkje mei Waf, mar d'r binne in pear handige skripts om jo te helpen te begjinnen of kompleksere builds te organisearjen. Dus asjebleaft, foardat jo oer lêze Waf, Sjoch ris nei build.py en gearkomste mei bakke.
3.4.1 Bouwe mei build.py
Wês opsichtich! Dizze boustap is allinich beskikber fanút de boarne-argyfferzje krigen lykas hjirboppe beskreaun; en net ynladen fia git of bake.
By it wurkjen mei in release argyf tarball, yn ns-3-allinone D'r is in handich skript dat it gearstallen fan de komponinten makliker meitsje kin. It hjit build.py. Dit programma sil it projekt foar jo op 'e nuttichste manier ynstelle. Tink derom lykwols dat mear avansearre opset en wurk mei ns-3 meastentiids omfettet it brûken fan ns-3's eigen buildsysteem, Waf, dat letter yn dizze tutorial sil wurde yntrodusearre.
As jo downloade mei tarball, dan yn jo map ~/wurkromte in map mei in namme sa as ns-allinone-3.29. Typ it folgjende yn:
$ ./build.py --enable-examples --enable-tests
Wannear't neamd build.py Wy brûkten kommando-rigelarguminten om de foarbylden en tests te bouwen dy't brûkt wurde yn dizze tutorial, dy't net standert binne boud yn ns-3. Standert bout it programma ek alle beskikbere modules. Dan, as jo wolle, kinne jo bouwe ns-3 sûnder foarbylden en tests, of útslute modules dy't net nedich binne foar jo wurk.
Jo sille in protte kompilator-útfierberjochten sjen werjûn troch it skript as it de ferskate dielen bouwt dy't jo hawwe laden. Earst sil it skript besykje de animator te bouwen netanim, dan de binende generator pybindgen en úteinlik ns-3. As it proses foltôge is, moatte jo it folgjende sjen:
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
Yn 'e lêste trije rigels fan' e list sjogge wy in berjocht oer modules dy't net binne boud:
Modules not built (see ns-3 tutorial for explanation):
brite click
Dit betsjut gewoan dat guon ns-3-modules dy't ôfhinklik binne fan eksterne biblioteken, miskien net boud binne, of dat se net nedich binne om te bouwen foar dizze konfiguraasje. Dit betsjut net dat de simulator net is gearstald of dat de gearstalde modules net goed wurkje.
3.4.2 Bouwe mei Bake
As jo Bake hjirboppe hawwe brûkt om boarnekoade te krijen fan 'e projektrepositories, kinne jo it trochgean brûke om ns-3 te bouwen. Dial:
$ ./bake.py build
en jo moatte wat sjen as:
>> Building pybindgen-0.19.0.post4+ng823d8b2 - OK
>> Building netanim-3.108 - OK
>> Building ns-3.29 - OK
hint: Jo kinne ek de download- en bouwstappen tagelyk dwaan troch "bake.py deploy" te roppen.
It gearstallen fan alle komponinten kin mislearje, mar de gearstalling sil trochgean as in komponint net fereaske is. Bygelyks, in resinte portabiliteitsprobleem wie dat castxml kin wurde gearstald troch ark bakke net op alle platfoarms. Yn dit gefal sil in berjocht as dit ferskine:
>> 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.
Mar, castxml allinnich nedich as jo wolle meitsje bywurke Python bindings. Foar de measte brûkers is d'r gjin ferlet fan dit (op syn minst oant se feroarje ns-3), dus sokke warskôgings kinne feilich negearre wurde foar no.
As it mislearret, sil it folgjende kommando jo in hint jaan oer ûntbrekkende ôfhinklikens:
$ ./bake.py show
De ferskate ôfhinklikens fan 'e pakketten dy't jo besykje te bouwen sille wurde neamd.
3.4.3 Bouwe mei Waf
Oant dit punt, om te begjinnen mei it bouwen fan ns-3, hawwe wy it skript brûkt build.py, of ark bakke. Dizze ark binne nuttich foar it bouwen fan ns-3 en it ûnderhâld fan biblioteken. Yn feite, om te bouwen se rinne it bou ark Waf út de ns-3 map. Waf ynstalleare mei de ns-3 boarnekoade. De measte brûkers geane fluch troch nei direkt gebrûk om de ns-3 te konfigurearjen en te sammeljen Waf. Dat, om troch te gean, gean asjebleaft nei de ns-3-map dy't jo oarspronklik makke hawwe.
Dit is op dit stuit net strikt ferplicht, mar it sil nuttich wêze om in bytsje werom te folgjen en te sjen hoe't jo wizigingen meitsje kinne yn 'e projektkonfiguraasje. Wierskynlik de meast brûkbere konfiguraasjewiziging dy't jo kinne meitsje is om in optimalisearre ferzje fan 'e koade te meitsjen. Standert hawwe jo jo projekt ynsteld om in debugferzje te bouwen. Litte wy nei in projekt sjen om in optimalisearre build te meitsjen. Om Waf út te lizzen dat it optimalisearre builds moat meitsje dy't foarbylden en tests omfetsje, moatte jo de folgjende kommando's útfiere:
$ ./waf clean
$ ./waf configure --build-profile=optimized --enable-examples --enable-tests
Dit sil lansearje Waf bûten de lokale map (foar jo gemak). De earste kommando skjin út de foarige build, dit is meastal net strikt nedich, mar it is goede praktyk (sjoch ek build profilen hjirûnder); dit sil earder oanmakke biblioteken en objektbestannen wiskje dy't yn 'e map lizze bouwe/. As it projekt opnij is konfigureare en it bousysteem de ferskate ôfhinklikens kontrolearret, moatte jo útfier sjen lykas de folgjende:
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)
Notysje asjebleaft it lêste diel fan 'e fermelding hjirboppe. Guon ns-3-opsjes binne standert net ynskeakele of fereaskje systeemstipe om goed te funksjonearjen. Bygelyks, om XmlTo yn te skeakeljen, moat de bibleteek oanwêzich wêze op it systeem libxml-2.0. As dizze bibleteek net fûn is en de oerienkommende ns-3-funksje net ynskeakele is, sil in berjocht werjûn wurde. Tink derom ek dat it mooglik is om it kommando te brûken sudo om it suid-bit "set groep ID by runtime" yn te stellen foar bepaalde programma's. It is net standert ynskeakele en dêrom ferskynt dizze funksje as "net ynskeakele". As lêste, om in list te krijen mei ynskeakele opsjes, brûk Waf mei parameter --check-config
.
Litte wy no werom gean en weromgean nei de debugbuild mei foarbylden en tests.
$ ./waf clean
$ ./waf configure --build-profile=debug --enable-examples --enable-tests
It bousysteem is no ynsteld en jo kinne debug-ferzjes fan ns-3-programma's bouwe troch gewoan te typen:
$ ./waf
De boppesteande stappen hawwe jo miskien twongen om twa kear in diel fan it ns-3-systeem te bouwen, mar no witte jo hoe't jo de konfiguraasje feroarje en optimalisearre koade bouwe.
Om te kontrolearjen hokker profyl aktyf is foar in opjûne projektkonfiguraasje, is d'r in kommando:
$ ./waf --check-profile
Waf: Entering directory `/path/to/ns-3-allinone/ns-3.29/build'
Build profile: debug
It boppesteande senario build.py stipet ek arguminten --enable-examples
и --enable-tests
, mar oare opsjes Waf it stipet net direkt. Dit sil bygelyks net wurkje:
$ ./build.py --disable-python
de reaksje sil sa wêze:
build.py: error: no such option: --disable-python
De spesjale operator - - kin lykwols brûkt wurde om ekstra parameters troch te jaan wafdus ynstee fan it boppesteande sil it folgjende kommando wurkje:
$ ./build.py -- --disable-python
om't it it haadkommando genereart ./waf configure --disable-python. Hjir binne wat mear ynliedende tips oer Waf.
Omgean bou flaters
ns-3-releases wurde hifke op de lêste C++-kompilers dy't beskikber binne op it momint fan frijlitting op mienskiplike Linux- en MacOS-distribúsjes. Yn 'e rin fan' e tiid wurde lykwols nije distribúsjes frijlitten mei nije gearstallers, en dizze nijere gearstallers hawwe de neiging om mear pedantysk te wêzen oer warskôgings. ns-3 konfigurearret syn build om alle warskôgingen as flaters te behanneljen, dus soms as jo in âldere ferzje op in nijere systeem útfiere, kin in kompilerwarskôging de build stopje.
Bygelyks, d'r wie earder in release fan ns-3.28 foar Fedora 28, dy't in nije grutte ferzje omfette gcc (gcc-8). It bouwen fan de release ns-3.28 of eardere ferzjes ûnder Fedora 28, mei Gtk2+ ynstalleare, sil de folgjende flater foarkomme:
/usr/include/gtk-2.0/gtk/gtkfilechooserbutton.h:59:8: error: unnecessary parentheses ,!in declaration of ‘__gtk_reserved1’ [-Werror=parentheses] void (*__gtk_reserved1);
Yn releases begjinnend fan ns-3.28.1, yn Waf in opsje is beskikber te lossen dizze problemen. It skeakelet it ynstellen fan de "-Werror" flagge yn g++ en clang++ út. Dit is de opsje "--disable-werror" en moat tapast wurde by konfiguraasje:
$ ./waf configure --disable-werror --enable-examples --enable-tests
Konfigurearje of gearstalle
Guon kommando's Waf hawwe betsjutting allinnich yn de konfiguraasje faze, en guon binne allinnich jildich yn de bou faze. As jo bygelyks de ns-3-emulaasjefunksjes wolle brûke, kinne jo de bitynstelling ynskeakelje Súd mei help fan sudo, lykas hjirboppe beskreaun. Dit sil de kommando's foar konfiguraasjestap oerskriuwe, en dus kinne jo de konfiguraasje feroarje mei it folgjende kommando, dat ek foarbylden en tests omfettet.
$ ./waf configure --enable-sudo --enable-examples --enable-tests
As jo dit dogge Waf sil starte sudoom programma's foar oanmeitsjen fan emulaasjekoade socket te feroarjen om te rinnen mei tagongsrjochten woartel. de Waf D'r binne in protte oare opsjes beskikber foar de konfiguraasje en boustappen. Om jo opsjes te ferkennen, ynfiere:
$ ./waf --help
Yn 'e folgjende seksje sille wy wat testen relatearre opsjes brûke.
Assembly Profilen
Wy hawwe al sjoen hoe't jo kinne konfigurearje Waf foar gearkomsten debug и optimalisearre:
$ ./waf --build-profile=debug
D'r is ek in tuskenlizzende assemblageprofyl, release. Opsje -d
is synonym mei --build-profile
. It bouprofyl kontrolearret it gebrûk fan logging, bewearingen, en kompilatoroptimalisaasje-skeakels:
Sa't jo sjen kinne, logging en bewearingen binne allinnich beskikber yn debug builds. De oanrikkemandearre praktyk is om jo skript te ûntwikkeljen yn debug-modus, en dan werhelle runs út te fieren (foar statistyk of parameterwizigingen) yn in optimalisearre buildprofyl.
As jo koade hawwe dy't allinich moatte rinne yn bepaalde buildprofilen, brûk dan de Code Wrapper Macro:
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;)
Standert, Waf plakken build artefakten yn de build map. Jo kinne in oare útfiermap opjaan mei de opsje - -out
bygelyks:
$ ./waf configure --out=my-build-dir
Troch dit te kombinearjen mei buildprofilen, kinne jo maklik wikselje tusken ferskate kompilaasjeopsjes:
$ ./waf configure --build-profile=debug --out=build/debug
$ ./waf build
...
$ ./waf configure --build-profile=optimized --out=build/optimized
$ ./waf build
...
Dêrmei kinne jo wurkje mei meardere gearkomsten sûnder dat jo de lêste gearkomste elke kear moatte oerskriuwe. As jo oerskeakelje nei in oar profyl, Waf sil it allinich kompilearje, sûnder alles folslein opnij te kompilearjen.
As jo op dizze manier bouwprofilen wikselje, moatte jo foarsichtich wêze om elke kear deselde konfiguraasjeopsjes te jaan. It definiearjen fan ferskate omjouwingsfariabelen sil jo helpe om flaters te foarkommen:
$ 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
Compilers en flaggen
Yn de boppesteande foarbylden Waf om ns-3 te bouwen brûkt de C++-kompiler fan GCC ( g ++). Jo kinne lykwols dejinge dy't jo brûke feroarje Waf C ++ kompilator, troch it definiearjen fan de CXX omjouwingsfariabele. Om bygelyks de C++-kompiler Clang te brûken, clang++,
$ CXX="clang++" ./waf configure
$ ./waf build
Op deselde wize kinne jo konfigurearje Waf te brûken ferspraat kompilaasje brûkend distcc:
$ CXX="distcc g++" ./waf configure
$ ./waf build
Mear ynformaasje oer distcc en ferspraat kompilaasje is te finen op 'e projektside yn' e seksje Dokumintaasje. Om kompilerflaggen ta te foegjen by it konfigurearjen fan ns-3, brûk de omjouwingsfariabele CXXFLAGS_EXTRA.
ynstelling
Waf kin brûkt wurde om bibleteken te ynstallearjen op ferskate plakken op it systeem. Standert binne de kompilearre bibleteken en útfierbere bestannen yn 'e map bouwe, en om't Waf de lokaasje fan dizze biblioteken en útfierbere bestannen wit, is it net nedich om de biblioteken earne oars te ynstallearjen.
As brûkers leaver bûten de build-map te ynstallearjen, kinne se it kommando útfiere ./waf ynstallearje. De standert foarheaksel foar ynstallaasje is / usr / lokaaldêrom ./waf ynstallearje sil ynstallearje programma yn / usr / local / bin, biblioteken yn / usr / local / lib en koptekstbestannen yn /usr/local/include. Superuser-rjochten moatte normaal ynsteld wurde mei in standert foarheaksel, dus in typysk kommando soe wêze sudo ./waf ynstallearje. As it wurdt lansearre, sil Waf earst kieze om de dielde biblioteken te brûken yn 'e build-map, en sykje dan nei biblioteken lâns it paad nei de biblioteken konfigureare yn' e lokale omjouwing. Dus by it ynstallearjen fan bibleteken op in systeem, is it in goede praktyk om te kontrolearjen dat de juste bibleteken wurde brûkt. Brûkers kinne kieze om te ynstallearjen mei in oar foarheaksel troch de opsje troch te jaan tidens konfiguraasje --prefix
bygelyks:
./waf configure --prefix=/opt/local
As letter, nei it bouwen, de brûker it ynstallaasjekommando ynfiert ./waf
, sil it foarheaksel brûkt wurde /opt/local.
team ./waf clean
moat brûkt wurde foardat it projekt opnij konfigureare as de ynstallaasje sil brûke Waf ûnder in oar foarheaksel.
Dus, om ns-3 te brûken is d'r gjin need om te skiljen ./waf install
. De measte brûkers sille dit kommando net nedich wêze om't Waf sil de aktuele bibleteken ophelje út 'e build-map, mar guon brûkers kinne dit nuttich fine as har aktiviteiten it wurkje mei programma's bûten de ns-3-map.
Waf single
Op it boppeste nivo fan 'e ns-3 boarnebeam is d'r mar ien Waf-skript. As jo ienris begjinne te wurkjen, sille jo in protte tiid yn 'e map besteegje scratch/
of djipper ynsrc/...
en tagelyk moatte rinne Waf. Jo kinne gewoan ûnthâlde wêr't jo binne en rinne Waf as folget:
$ ../../../waf ...
mar dit sil ferfeelsum en flaterber wêze, dus d'r binne bettere oplossingen. Ien mienskiplike manier is om in tekstbewurker te brûken lykas emacs of vim, wêryn twa terminalsesjes wurde iepene, ien wurdt brûkt om ns-3 te bouwen, en de twadde wurdt brûkt om de boarnekoade te bewurkjen. As jo mar hawwe tarball, dan kin in omjouwingsfariabele helpe:
$ export NS3DIR="$PWD"
$ function waff { cd $NS3DIR && ./waf $* ; }
$ cd scratch
$ waff build
Yn 'e modulemap kin it ferleidend wêze om in triviale waf-skript ta te foegjen lykas exec ../../waf
. Asjebleaft, doch dat net. Dit is betiizjend foar newbies en, as it min dien wurdt, liedt ta hurd te detektearjen bouflaters. De hjirboppe werjûn oplossingen binne it paad dat moat wurde brûkt.
3.5 Testen ns-3
Jo kinne de ienheidstests fan 'e ns-3-distribúsje útfiere troch it skript út te fieren ./test.py:
$ ./test.py
Dizze testen wurde útfierd parallel mei Waf. Uteinlik moatte jo in berjocht sjen dat seit:
92 of 92 tests passed (92 passed, 0 failed, 0 crashed, 0 valgrind errors)
Dit is in wichtich berjocht foar in identifisearje valgrind crashes, crashes of flaters, oanjout problemen mei de koade of ynkompatibiliteit tusken ark en koade.
Jo sille ek sjen de definitive útfier fan Waf en in tester dy't elke test útfiert, dy't der sa útsjen sil:
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)
Dit kommando wurdt normaal útfierd troch brûkers om fluch te kontrolearjen dat de ns-3-distribúsje goed boud is. (Tink derom dat de folchoarder fan 'e "PASS: ..."-rigels oars kin wêze, dit is normaal. Wat wichtich is, is dat de gearfettingsline oan 'e ein fan it rapport sjen lit dat alle tests trochjûn binne; gjin tests mislearre of ferûngelokke.) En Wafen test.py sil parallelisearje wurk oer de beskikbere prosessor kearnen fan 'e masine.
3.6 It skript útfiere
Wy meastal rinne skripts ûnder kontrôle Waf. Dit lit it bousysteem derfoar soargje dat dielde biblioteekpaden goed ynsteld binne en dat de bibleteken beskikber binne by runtime. Om it programma út te fieren, brûk gewoan Waf mei parameter - -run
. Litte wy it ns-3-ekwivalint fan it ubiquitous programma útfiere Hallo wrâldtroch it folgjende te typen:
$ ./waf --run hello-simulator
Waf sil earst kontrolearje dat it programma goed boud is en bouwe as it nedich is. Dan Waf sil in programma útfiere dat de folgjende útfier produsearret.
Hello Simulator
Lokwinske! Jo binne no in ns-3 brûker!
Wat moat ik dwaan as ik gjin resultaten sjoch?
As jo sjogge berjochten Wafoanjout dat de bou mei súkses foltôge, mar jo sjogge de útfier net "Hallo Simulator", dan is d'r in mooglikheid dat jo yn 'e seksje [Build-with-Waf] jo bouwmodus oerskeakele hawwe nei optimalisearre, mar miste wikseljen werom nei de modus debug. Alle konsole-útfier brûkt yn dizze tutorial brûkt in spesjale ns-3-komponint dy't logging útfiert en wurdt brûkt om oanpaste berjochten nei de konsole te printsjen. Utfier fan dizze komponint wurdt automatysk útskeakele as optimalisearre koade wurdt kompilearre - it is "optimalisearre". As jo de útfier "Hallo Simulator" net sjogge, fier dan it folgjende yn:
$ ./waf configure --build-profile=debug --enable-examples --enable-tests
oan te passen Waf om debug-ferzjes fan ns-3-programma's te bouwen, dy't foarbylden en tests befetsje. Jo moatte dan de aktuele debug-ferzje fan 'e koade opnij opbouwe troch te typen
$ ./waf
No as jo it programma útfiere hallo-simulator, Jo moatte it ferwachte resultaat sjen.
3.6.1 Arguminten foar kommandorigel
Om kommando-rigelarguminten troch te jaan oan it ns-3-programma, brûk it folgjende patroan:
$ ./waf --run <ns3-program> --command-template="%s <args>"
Ferfange nei de namme fan jo programma en nei de arguminten. Argumint - -command-template
foar Waf is yn wêzen in resept foar it bouwen fan de eigentlike kommandorigel Waf brûkt om it programma út te fieren. Waf kontrolearret dat de bou kompleet is, stelt de dielde bibleteekpaden yn, brûkt dan it levere kommandorigel-sjabloan en ferfangt de programmanamme foar de %s-plakhâlder om de útfierbere te neamen. As jo dizze syntaksis yngewikkeld fine, is d'r in ienfâldiger ferzje dy't it ns-3-programma omfettet en syn arguminten ynsletten yn inkele quotes:
$ ./waf --run '<ns3-program> --arg1=value1 --arg2=value2 ...'
In oar benammen nuttich foarbyld is it selektyf útfieren fan testsuites. Litte wy oannimme dat d'r in testsuite is mei de namme mytest (yn feite is d'r net). Hjirboppe hawwe wy it ./test.py-skript brûkt om in oantal testen parallel út te fieren, dy't it testprogramma hieltyd wer opropt test-runner. Belje test-runner direkt om ien test út te fieren:
$ ./waf --run test-runner --command-template="%s --suite=mytest --verbose"
Arguminten sille wurde trochjûn oan it programma test-runner. Sûnt mytest net bestiet, sil in flaterberjocht oanmakke wurde. Om de beskikbere test-runner-opsjes te printsjen, ynfiere:
$ ./waf --run test-runner --command-template="%s --help"
3.6.2 Debuggen
Om ns-3-programma's út te fieren ûnder in oar hulpprogramma, lykas in debugger (bygelyks, gdb) of in ark foar ûnthâldtest (bygelyks, valgrind), brûke in ferlykbere foarm - -command-template = "…"
. Bygelyks om te rinnen yn 'e debugger gdb jo hello-simulator ns-3 programma mei arguminten:
$ ./waf --run=hello-simulator --command-template="gdb %s --args <args>"
Tink derom dat de ns-3 programma namme komt mei it argumint - -run
, en it behearprogramma (hjir gdb) is it earste token yn it argumint - -command-template
. Opsje - -args
ynformearret gdbdat de rest fan 'e kommandorigel heart by it "legere" programma. (Guon ferzjes gdb begryp de opsje net - -args
. Yn dit gefal, fuortsmite de programma arguminten út - -command-template
en brûk de kommando set gdb args.) Wy kinne dit resept en it foarige kombinearje om de test ûnder de debugger út te fieren:
$ ./waf --run test-runner --command-template="gdb %s --args --suite=mytest --verbose"
3.6.3 Wurkmap
Waf moat wurde lansearre út syn lokaasje oan de top fan 'e ns-3 beam. Dizze map wurdt de wurkmap wêr't de útfierbestannen skreaun wurde. Mar wat as jo dizze bestannen bûten de ns-3 boarnebeam hâlde wolle? Brûk argumint - -cwd
:
$ ./waf --cwd=...
Jo kinne it handiger fine om de útfierbestannen yn jo wurkmap te krijen. Yn dit gefal kin de folgjende yndirekte aksje helpe:
$ function waff {
CWD="$PWD"
cd $NS3DIR >/dev/null
./waf --cwd="$CWD" $*
cd - >/dev/null
}
Dizze dekoraasje fan 'e foarige ferzje fan it kommando behâldt de hjoeddeistige wurkmap, giet nei de map Wafen dan ynstruearret Waf om de wurkmap werom te feroarjen nei de aktuele wurkmap bewarre foardat it programma start. Wy neame it team - -cwd
Foar folsleinens rinne de measte brûkers Waf gewoan út 'e map op topnivo en generearje dêr útfierbestannen.
Boarne: www.habr.com