ns-3 retsimulilo lernilo. Ĉapitro 3

ns-3 retsimulilo lernilo. Ĉapitro 3
Ĉapitro 1,2

3 Komencante
3.1 Superrigardo
3.2 Antaŭkondiĉoj
3.2.1 Elŝuti la ns-3-eldonon kiel fontarkivon
3.3 Elŝuti ns-3 uzante Git
3.3.1 Ŝargi ns-3 uzante Bake
3.4 Asembleo ns-3
3.4.1 Konstruado kun build.py
3.4.2 Konstruaĵo kun Bake
3.4.3 Konstruu kun Waf
3.5 Testado ns-3
3.6 Rulado de la skripto
3.6.1 Argumentoj de komandlinio
3.6.2 Sencimigado
3.6.3 Labora dosierujo

Ĉapitro 3

Komencante

Ĉi tiu ĉapitro celas prepari la leganton por komenci kun komputilo, kiu eble neniam instalis ns-3. Ĝi kovras subtenatajn platformojn, antaŭkondiĉojn, kiel akiri ns-3, kiel konstrui ns-3 kaj kiel testi vian konstruon kaj ruli simplajn programojn.

3.1 Superrigardo

La simulilo ns-3 estas konstruita kiel sistemo de kunlaboraj softvarbibliotekoj. Dum kunigo, la kodo de uzantprogramoj estas ligita kun ĉi tiuj bibliotekoj. La programlingvoj C++ aŭ Python estas uzataj por skribi kutimajn programojn.

Ns-3 estas distribuita kiel fontkodo, kio signifas, ke la celsistemo devas havi softvaran medion por unue konstrui la bibliotekojn kaj poste konstrui la uzantprogramon. Principe, ns-3 povus esti distribuita kiel pretaj bibliotekoj por specifa sistemo, kaj en la estonteco ili povas esti distribuitaj tiamaniere. Sed nuntempe multaj uzantoj efektive faras sian laboron redaktante ns-3 mem, do utilas havi la fontkodon por konstrui la bibliotekojn. Se iu ŝatus preni sur sin la laboron krei pretajn bibliotekojn kaj pakaĵojn por operaciumoj, bonvolu kontakti la dissendoliston. ns-programistoj.

Poste, ni rigardos tri manierojn elŝuti kaj konstrui ns-3. La unua estas elŝuti kaj konstrui la oficialan eldonon de la ĉefa retejo. La dua estas la elekto kaj kunigo de kopioj de evoluaj versioj de la baza instalado ns-3. La tria estas uzi pliajn konstruajn ilojn por ŝargi pliajn etendaĵojn por ns-3. Ni trarigardos ĉiun ĉar la iloj estas iomete malsamaj.

Spertaj Linukso-uzantoj povas scivoli kial ns-3 ne estas provizita kiel pakaĵo kiel la plej multaj aliaj bibliotekoj, kiuj uzas pakaĵadministrilon? Kvankam ekzistas binaraj pakaĵoj por diversaj Linukso-distribuoj (ekz. Debiano), la plej multaj uzantoj finas redakti la bibliotekojn kaj devi mem rekonstrui ns-3, do havi la fontkodon disponebla estas oportuna. Tial ni koncentriĝos pri instalo de fonto.

Por plej multaj aplikoj ns-3-rajtoj radikon ne necesas, oni rekomendas uzi senprivilegian uzantkonton.

3.2 Antaŭkondiĉoj

La tuta aro de disponeblaj ns-3-bibliotekoj havas kelkajn dependecojn de triaj bibliotekoj, sed plejparte ns-3 povas esti konstruita kaj uzata kun subteno por pluraj komunaj (ofte instalitaj defaŭlte) komponentoj: C++-kompililo, Python, fontkodredaktilo (ekzemple, vim, emacsmarĝenigi) kaj, se evoluaj deponejoj estas uzataj, Git-versiokontrolsistemoj. Plej unuafojaj uzantoj ne devos zorgi, se ilia agordo raportas ke kelkaj altnivelaj funkcioj de ns-3 mankas, sed por tiuj, kiuj volas plenan instaladon, la projekto disponigas vikion, kiu inkluzivas paĝojn kun multaj utilaj konsiloj kaj lertaĵoj. Unu tia paĝo estas la Instala paĝo, kun instalinstrukcioj por diversaj sistemoj, havebla ĉe: https://www.nsnam.org/wiki/Installation.

La Sekcio de Antaŭkondiĉoj de ĉi tiu vikio klarigas kiuj pakaĵoj estas postulataj por subteni oftajn ns-3-opciojn kaj ankaŭ provizas la komandojn uzatajn por instali ilin en oftaj gustoj de Linukso aŭ macOS.

Vi povas profiti ĉi tiun ŝancon por esplori la ns-3-vikipaĝon aŭ la ĉefan retejon: https://www.nsnam.org, ĉar estas multe da informoj tie. Komencante kun la plej nova versio de ns-3 (ns-3.29), la sekvaj iloj estas postulataj por ruli ns-3:

Ila Pako/Versio

  • C++-kompililo
    clang++ aŭ g++ (g++ versio 4.9 aŭ pli alta)
  • python
    python2 versio >= 2.7.10, aŭ python3 versio >=3.4
  • Git
    ajna lasta versio (por aliri ns-3 ĉe GitLab.com)
  • gudro
    ajna lasta versio (por malpakigi ns‑3-eldonon)
  • bunzip2
    ajna lasta versio (por malpakigi la ns‑3-eldonon)

Por kontroli la defaŭltan version de Python, tajpu python -V. Por kontroli la g++-version, tajpu g++ -v. Se iuj iloj mankas aŭ tro malnovaj, bonvolu konsulti la instalan gvidilon sur la vikipaĝo de ns-3.

De ĉi tiu punkto ni supozas, ke la leganto funkcias Linukson, MacOS aŭ Linuksan emulilon, kaj havas almenaŭ la ĉi-suprajn ilojn.

3.2.1 Elŝuti la ns-3-eldonon kiel fontarkivon

Ĉi tio estas la procedo por nova uzanto, kiu volas elŝuti kaj eksperimenti kun la plej novaj eldonoj kaj pakaĵversioj de ns-3. ns-3-eldonoj estas publikigitaj kiel kunpremitaj fontarkivoj, foje nomitaj tarball. tarball estas speciala softvara arkivformato en kiu pluraj dosieroj estas kombinitaj kune. La arkivo estas kutime kunpremita. ns-3 startprocezo per tarball estas simpla, vi nur bezonas elekti eldonon, elŝuti kaj malpakigi ĝin.

Ni supozu, ke vi, kiel uzanto, volas konstrui ns-3 en loka dosierujo nomita laborspaco. Vi povas akiri funkciantan kopion de la eldono enmetante la jenon en la Linukso-konzolo (anstataŭigante la taŭgajn versionumrojn, kompreneble)

$ 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 

Atentu la ilon uzatan supre wget, kiu estas komandlinia ilo por elŝuti objektojn el la Interreto. Se vi ne instalis ĝin, vi povas uzi vian retumilon por tio.

Sekvante ĉi tiujn paŝojn kondukos vin al la dosierujo ns-allinone-3.29, tie vi devus vidi plurajn dosierojn kaj dosierujojn.

$ 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

Vi nun pretas konstrui la bazan distribuon ns-3 kaj povas pluiri al la sekcio pri konstruado de ns-3.

3.3 Elŝuti ns-3 uzante Git

La ns-3-kodo haveblas en la Git-deponejoj ĉe GitLab.com ĉe https://gitlab.com/nsnam/. Grupo nsnam kunigas la diversajn deponejojn uzatajn de malfermkoda projekto.

La plej facila maniero komenci uzi Git-deponejojn estas forki aŭ kloni la medion ns-3-alinone. Ĉi tio estas aro de skriptoj, kiuj administras la ŝarĝon kaj muntadon de la plej ofte uzataj ns-3-subsistemoj. Se vi estas nova al Git, la terminoj "forko" kaj "klono" eble estas nekonataj al vi; se jes, ni rekomendas ke vi simple klonu (faru vian propran kopion) la deponejon situantan sur GitLab.com jene:

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

En ĉi tiu etapo, la vido de via dosierujo ns-3-alinone iomete malsama de la eldonarkiva dosierujo priskribita supre. Ĝi devus aspekti kiel ĉi tio:

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

Bonvolu noti, ke ekzistas skripto elŝuti.py, kiu krome ĉerpos ns-3 kaj ĝian akompanan fontkodon. Ĉi tie vi havas elekton: aŭ elŝuti la plej novan disvolvan foton pri ns-3:

$ python download.py

aŭ preferu la ns-3-eldonon uzante la flagon -n por indiki la eldonnumeron:

$ python download.py -n ns-3.29

Post ĉi tiu paŝo al la dosierujo ns-3-alinone pliaj deponejoj estos elŝutitaj ns-3, baku, pybindgen и netanim.

Примечание
Sur maŝino kun pura Ubuntu16.04, mi devis ŝanĝi la komandon al ĉi tio: $ sudo python3 download.py -n ns-3.29 (ĉi-poste notoj de tradukinto).

3.3.1 Ŝargi ns-3 uzante Bake

La supraj du metodoj (fonto-arkivo aŭ deponejo ns-3-alinone per Git) estas utilaj por akiri la plej simplan ns-3-instaladon kun pluraj aldonaĵoj (pybindgen por generi Python-ligojn kaj netanim por reto-animacio). La tria deponejo provizita defaŭlte en ns-3-allinone estas nomita baku.

Baku estas ilo por kunordigita konstruado de programaro el multoblaj deponejoj, evoluigita por la projekto ns-3. Baku povas esti uzata por akiri evoluajn versiojn de ns-3, kaj ankaŭ por elŝuti kaj konstrui etendaĵojn de la bazversio de la distribuo ns-3, kiel la medio. Rekta Kodo-Ekzekuto, CradleNetwork Simulada Lulilo, la kapablo krei novajn Python-ligojn kaj diversajn ns-3 "apojn".

Примечание
CradleNetwork Simulation Cradle estas kadro, kiu ebligas al vi uzi realajn TCP/IP-retajn stakojn ene de reto-simulilo.

Se vi atendas, ke via ns-3-instalado havas altnivelajn aŭ aldonajn funkciojn, vi povas sekvi ĉi tiun instalan vojon.

En la plej novaj ns-3-eldonoj Baku estis aldonita al la gudro-eldono. La eldono inkluzivas agordan dosieron, kiu ebligas al vi elŝuti la aktualajn programajn versiojn en la momento de la eldono. Tio estas, ekzemple, la versio Baku, kiu estas distribuita kun eldono ns-3.29, povas esti uzita por preni komponentojn por tiu eldono de ns-3 aŭ pli frue, sed ne povas esti uzita por preni komponentojn por postaj eldonoj (se la paka priskriba dosiero bakeconf.xml ne ĝisdatigita).

Vi ankaŭ povas akiri la lastan kopion bakuenigante la sekvan komandon en vian Linuksan konzolon (supozante, ke vi havas Git instalitan):

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

Kiam vi rulas la komandon git, vi devus vidi ion kiel la jenon:

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.

Post kiam la komando finiĝas klono vi devus havi dosierujon nomitan baku, kies enhavo devus aspekti kiel ĉi tio:

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

Notu, ke vi ŝargis plurajn Python-skriptojn, nomitan Python-modulo baku kaj XML-agorda dosiero. La sekva paŝo estas uzi ĉi tiujn skriptojn por elŝuti kaj konstrui la ns-3-distribuon de via elekto. Pluraj personigaj celoj estas disponeblaj:

  1. ns-3.29: modulo responda al la liberigo; ĝi elŝutos komponantojn similajn al la eldono en la tarball;

  2. ns-3-dev: simila modulo, sed uzante kodon el la evoluarbo;

  3. ns-allinone-3.29: Modulo kiu inkluzivas aliajn kromajn funkciojn kiel Klak-vojigo kaj Network Simulation Cradle, Openflow por ns-3.

  4. ns-3-alinone: simila al la eldonversio de la modulo allinone, sed por evolukodo.

Примечание
klaku — modula programara arkitekturo por krei enkursigilojn.

Openflow estas protokolo por administri la procezon de prilaborado de datumoj transdonitaj tra datumreto per enkursigiloj kaj ŝaltiloj, efektivigante programar-difinitan retan teknologion.

La nuna evoluiga momentfoto (ne-eldonita) ns-3 troveblas ĉe:https://gitlab.com/nsnam/ns-3-dev.git.

La programistoj provas konservi ĉi tiujn deponejojn en konsekvenca funkciado, sed ili estas en la disvolva areo kaj enhavas nepublikigitan kodon, do se vi ne planas uzi novajn funkciojn, tiam elektu la oficialan eldonon.

Vi povas trovi la plej novan version de la kodo foliumante la liston de deponejoj, aŭ irante al la retpaĝo de ns-3 Releases:https://www.nsnam.org/releases/ kaj alklakante la plej novan version-ligilon. En ĉi tiu ekzemplo ni daŭrigos kun ns-3.29.

Nun, por akiri la ns-3-komponentojn, kiujn ni bezonas, ni uzos la ilon Baku. Ni diru kelkajn enkondukajn vortojn pri la verko Baku.

Bake funkcias ŝarĝante pakajn fontojn en dosierujon fonto kaj instali la bibliotekojn en la konstrua dosierujo. Baku povas ruliĝi per referenco de la binaro, sed se vi volas ruli Baku ne el la dosierujo en kiu ĝi estis elŝutita, estas konsilinde aldoni la vojon al baku al via vojo (PATH-mediovariablo), ekzemple jene (ekzemplo por Linukso bash-ŝelo). Iru al la dosierujo "bake" kaj poste agordu la sekvajn mediajn variablojn:

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

Ĉi tio metos la programon baki.py al la ŝelpado kaj permesos al aliaj programoj trovi la ruleblajn kaj bibliotekojn kiujn ĝi kreis baku. En iuj uzkazoj baku, la agordo PATH kaj PYTHONPATH priskribita supre ne estas bezonata, sed kompleta konstruo de ns-3-allinone (kun pliaj pakaĵoj) kutime postulas ĝin.

Iru al via labordosierujo kaj enigu la jenon en la konzolo:

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

Poste ni demandos Baku kontrolu ĉu ni havas sufiĉe da iloj por ŝargi la diversajn komponantojn. Ciferdisko:

$ ./bake.py check

Vi devus vidi ion kiel la jenon:

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

Precipe, alŝutaj iloj kiel Mercurial, CVS, Git kaj Bazaar estas esencaj en ĉi tiu paŝo, ĉar ili permesas al ni akiri la kodon. Je ĉi tiu punkto, instalu la mankantajn ilojn laŭ la kutima maniero por via sistemo (se vi scias kiel) aŭ kontaktu vian sisteman administranton por helpo.

Poste, provu elŝuti la programaron:

$ ./bake.py download

la rezulto devus esti io kiel:

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

Ĉi tio signifos, ke tri fontoj estis elŝutitaj. Nun iru al la fonta dosierujo kaj tajpu ls; Vi devus vidi:

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

Nun vi pretas konstrui la ns-3-distribuon.

3.4 Asembleo ns-3

Kiel ĉe elŝutado de ns-3, ekzistas pluraj manieroj konstrui ns-3. La ĉefa afero, kiun ni volas emfazi, estas, ke ns-3 estas konstruita per konstrua ilo nomata Wafpriskribita sube. Plej multaj uzantoj laboros kun Waf, sed ekzistas kelkaj oportunaj skriptoj por helpi vin komenci aŭ organizi pli kompleksajn konstruojn. Do bonvolu, antaŭ ol vi legis pri Waf, rigardu konstrui.py kaj asembleo kun baku.

3.4.1 Konstruado kun build.py

Singardemo Ĉi tiu konstrupaŝo disponeblas nur de la fonta arkivversio akirita kiel priskribite supre; kaj ne elŝutita per git aŭ bake.

Kiam vi laboras kun eldono-arkivo tarballen ns-3-alinone Estas oportuna skripto, kiu povas faciligi kunigon de la komponantoj. Ĝi nomiĝas build.py. Ĉi tiu programo starigos la projekton por vi laŭ la plej utila maniero. Tamen, notu, ke pli altnivela agordo kaj laboro kun ns-3 kutime implikas uzi la propran konstrusistemon de ns-3, Waf, kiu estos enkondukita poste en ĉi tiu lernilo.

Se vi elŝutis uzante tarball, tiam en via dosierujo ~/laborspaco dosierujo kun nomo io simila ns-allinone-3.29. Enigu la jenon:

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

Kiam oni vokas konstrui.py Ni uzis komandliniajn argumentojn por konstrui la ekzemplojn kaj testojn uzatajn en ĉi tiu lernilo, kiuj ne estas defaŭlte konstruitaj en ns-3. Defaŭlte, la programo ankaŭ konstruas ĉiujn disponeblajn modulojn. Tiam, se vi deziras, vi povas konstrui ns-3 sen ekzemploj kaj testoj, aŭ ekskludi modulojn kiuj ne estas bezonataj por via laboro.

Vi vidos multajn kompililajn eligmesaĝojn montritajn de la skripto dum ĝi konstruas la diversajn partojn, kiujn vi ŝarĝis. Unue la skripto provos konstrui la animaciiston netanim, tiam la liga generatoro pybindgen kaj fine ns-3. Kiam la procezo finiĝos, vi devus vidi la jenon:

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

En la lastaj tri linioj de la listo ni vidas mesaĝon pri moduloj kiuj ne estis konstruitaj:

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

Ĉi tio simple signifas, ke iuj ns-3-moduloj kiuj dependas de eksteraj bibliotekoj eble ne estis konstruitaj, aŭ ke ili ne bezonas esti konstruitaj por ĉi tiu agordo. Ĉi tio ne signifas, ke la simulilo ne estas kunmetita aŭ ke la kunmetitaj moduloj ne funkcios ĝuste.

3.4.2 Konstruaĵo kun Bake

Se vi uzis bake supre por akiri fontkodon de la projektaj deponejoj, vi povas daŭre uzi ĝin por konstrui ns-3. Ciferdisko:

$ ./bake.py build

kaj vi devus vidi ion kiel:

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

prompto: Vi ankaŭ povas fari ambaŭ la elŝuton kaj konstrui paŝojn samtempe vokante "bake.py deploy".

La kunigo de ĉiuj komponentoj povas malsukcesi, sed kunigo daŭros se la komponento ne estas postulata. Ekzemple, lastatempa portebla afero estis tio castxml povas esti kunvenita per ilo baku ne sur ĉiuj platformoj. En ĉi tiu kazo, mesaĝo kiel ĉi aperos:

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

Tamen, castxml necesas nur se vi volas krei ĝisdatigitajn Python-ligojn. Por la plej multaj uzantoj ne necesas por tio (almenaŭ ĝis ili ŝanĝas ns-3), do tiaj avertoj povas esti sekure ignoritaj nuntempe.

Se ĝi malsukcesas, la sekva komando donos al vi sugeston pri mankantaj dependecoj:

$ ./bake.py show

La diversaj dependecoj de la pakaĵoj, kiujn vi provas konstrui, estos listigitaj.

3.4.3 Konstruu kun Waf

Ĝis ĉi tiu punkto, por komenci konstrui ns-3, ni uzis aŭ la skripton konstrui.py, aŭ ilo baku. Ĉi tiuj iloj estas utilaj por konstrui ns-3 kaj konservi bibliotekojn. Fakte, por konstrui ili rulas la konstruilon Waf el dosierujo ns-3. Waf instalita per la fontkodo ns-3. Plej multaj uzantoj rapide transiras al rekta uzo por agordi kaj kunmeti la ns‑3 Waf. Do, por daŭrigi, bonvolu iri al la dosierujo ns-3, kiun vi origine kreis.

Ĉi tio ne estas strikte bezonata ĉi-momente, sed estos utile iom retroiri kaj vidi kiel fari ŝanĝojn al la agordo de la projekto. Verŝajne la plej utila agorda ŝanĝo, kiun vi povas fari, estas krei optimumigitan version de la kodo. Defaŭlte, vi agordis vian projekton por konstrui sencimigan version. Ni rigardu projekton por krei optimumigitan konstruon. Por klarigi al Waf, ke ĝi devus fari optimumigitajn konstruojn, kiuj inkluzivas ekzemplojn kaj testojn, vi devos ruli la jenajn komandojn:

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

Ĉi tio lanĉos Waf ekster la loka adresaro (por via komforto). La unua komando purigas de la antaŭa konstruo, ĉi tio kutime ne estas strikte necesa, sed ĝi estas bona praktiko (vidu ankaŭ konstruajn profilojn sube); ĉi tio forigos antaŭe kreitajn bibliotekojn kaj objektodosierojn situantajn en la dosierujo konstrui/. Kiam la projekto estas reagordita kaj la konstrusistemo kontrolas la diversajn dependecojn, vi devus vidi eligon similan al la sekvanta:

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)

Bonvolu noti la lastan parton de la supra listo. Kelkaj ns-3-opcioj ne estas ebligitaj defaŭlte aŭ postulas sisteman subtenon por funkcii ĝuste. Ekzemple, por ebligi XmlTo, la biblioteko devas ĉeesti en la sistemo libxml-2.0. Se ĉi tiu biblioteko ne estis trovita kaj la responda funkcio ns-3 ne estis ebligita, mesaĝo aperos. Rimarku ankaŭ, ke eblas uzi la komandon sudo por agordi la suid biton "starigi grupan ID ĉe rultempo" por certaj programoj. Ĝi ne estas ebligita defaŭlte kaj tial ĉi tiu funkcio aperas kiel "ne ebligita". Fine, por akiri liston de ebligitaj opcioj, uzu Waf kun parametro --check-config.

Nun ni reiru kaj reiru al la sencimiga konstruo enhavanta ekzemplojn kaj testojn.

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

La konstrusistemo nun estas starigita kaj vi povas konstrui sencimigajn versiojn de ns-3-programoj simple tajpante:

$ ./waf

La supraj paŝoj eble devigis vin konstrui parton de la sistemo ns-3 dufoje, sed nun vi scias kiel ŝanĝi la agordon kaj konstrui optimumigitan kodon.

Por kontroli kiu profilo estas aktiva por difinita projekta agordo, estas komando:

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

La supra scenaro konstrui.py ankaŭ subtenas argumentojn --enable-examples и --enable-tests, sed aliaj ebloj Waf ĝi ne subtenas rekte. Ekzemple, ĉi tio ne funkcios:

$ ./build.py --disable-python

la reago estos tia:

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

Tamen, la speciala operatoro - - povas esti uzata por trapasi pliajn parametrojn wafdo anstataŭ la supre la sekva komando funkcios:

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

ĉar ĝi generas la ĉefan komandon ./waf agordi --disable-python. Jen kelkaj pliaj enkondukaj konsiletoj pri Waf.

Pritraktado de konstru-eraroj

ns-3-eldonoj estas testitaj sur la plej novaj C++-kompililoj disponeblaj en la momento de liberigo en oftaj Linukso kaj MacOS-distribuoj. Tamen, kun la tempo, novaj distribuoj estas liberigitaj per novaj kompililoj, kaj ĉi tiuj pli novaj kompililoj tendencas esti pli pedantaj pri avertoj. ns-3 agordas sian konstruon por trakti ĉiujn avertojn kiel erarojn, do foje se vi rulas pli malnovan version sur pli nova sistemo, kompilila averto povas ĉesigi la konstruon.

Ekzemple, antaŭe estis eldono de ns‑3.28 por Fedora 28, kiu inkludis novan gravan version gcc (gcc-8). Konstruante la eldonon ns-3.28 aŭ pli fruajn versiojn sub Fedora 28, kun Gtk2+ instalita, la sekva eraro okazos:

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

En eldonoj ekde ns‑3.28.1, en Waf eblo estas disponebla por solvi ĉi tiujn problemojn. Ĝi malŝaltas agordi la flagon "-Werror" en g++ kaj clang++. Ĉi tio estas la opcio "--disable-werror" kaj devas esti aplikata dum agordo:

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

Agordi aŭ kunmeti

Kelkaj komandoj Waf havas signifon nur en la agorda fazo, kaj iuj validas nur en la konstrufazo. Ekzemple, se vi volas uzi la emulajn funkciojn de ns-3, vi povas ebligi la bitan agordon sude uzante sudo, kiel priskribite supre. Ĉi tio anstataŭigos la agordajn paŝokomandojn, kaj tiel vi povas ŝanĝi la agordon per la sekva komando, kiu ankaŭ inkluzivas ekzemplojn kaj testojn.

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

Se vi faras ĉi tion Waf lanĉos sudoŝanĝi programojn de kreado de ingoj de emulado por funkcii kun permesoj radikon. la Waf Estas multaj aliaj ebloj disponeblaj por la agordo kaj konstruaj paŝoj. Por esplori viajn opciojn, enigu:

$ ./waf --help

En la sekva sekcio ni uzos kelkajn provajn rilatajn eblojn.

Asembleaj Profiloj

Ni jam vidis kiel vi povas agordi Waf por asembleoj elpurigi и optimumigita:

$ ./waf --build-profile=debug

Ekzistas ankaŭ meza kunigprofilo, ĵeto. Opcio -d estas sinonima kun --build-profile. La konstruprofilo kontrolas la uzon de protokolo, asertoj, kaj kompiligaj optimumigoŝaltiloj:

ns-3 retsimulilo lernilo. Ĉapitro 3

Kiel vi povas vidi, protokolo kaj asertoj disponeblas nur en sencimigaj konstruoj. La rekomendinda praktiko estas evoluigi vian skripton en sencimiga reĝimo, tiam fari ripetajn kurojn (por statistiko aŭ parametroŝanĝoj) en optimumigita konstruprofilo.

Se vi havas kodon, kiu devus ruliĝi nur en iuj konstruaj profiloj, uzu la Kod-Envolvaĵan Makroon:

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

Defaŭlta, Waf lokoj konstruas artefaktojn en la konstrua dosierujo. Vi povas specifi malsaman eligdosierujon uzante la opcion - -outekzemple:

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

Kombinante ĉi tion kun konstruaj profiloj, vi povas facile ŝanĝi inter malsamaj kompilopcioj:

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

Kiu permesas vin labori kun multoblaj asembleoj sen devi reverki la plej novan asembleon ĉiufoje. Kiam vi ŝanĝas al alia profilo, Waf kompilos nur ĝin, sen tute rekompili ĉion.

Kiam vi ŝanĝas konstruajn profilojn tiamaniere, vi devas zorgi doni la samajn agordajn elektojn ĉiufoje. Difini plurajn mediajn variablojn helpos vin eviti erarojn:

$ 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

Kompililoj kaj flagoj

En la supraj ekzemploj Waf por konstrui ns-3 uzas la C++-kompililon de GCC ( g ++). Tamen, vi povas ŝanĝi tiun, kiun vi uzas Waf C++-kompililo, difinante la CXX-medivariablon. Ekzemple, por uzi la C++-kompililon Clang, clang++,

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

Sammaniere vi povas agordi Waf uzi distribuitan kompilon uzante distcc:

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

Pliaj informoj pri distcc kaj distribuita kompilo troveblas sur la projektpaĝo en la sekcio Dokumentado. Por aldoni kompililajn flagojn dum agordado de ns-3, uzu la mediovariablon CXXFLAGS_EXTRA.

fikso

Waf povas esti uzata por instali bibliotekojn en malsamaj lokoj en la sistemo. Defaŭlte, la kompilitaj bibliotekoj kaj plenumeblaj troviĝas en la dosierujo konstruu, kaj ĉar Waf konas la lokon de ĉi tiuj bibliotekoj kaj ekzekuteblaj, ne necesas instali la bibliotekojn aliloke.

Se uzantoj preferas instali ekster la konstrua dosierujo, ili povas ruli la komandon ./waf instali. La defaŭlta prefikso por instalado estas / usr / lokatial ./waf instali instalos programojn en / usr / loka / bin, bibliotekoj en / usr / loka / lib kaj kapdosierojn en /usr/local/include. Superuzantrajtoj kutime devas esti agordita kun defaŭlta prefikso, do tipa komando estus sudo ./waf install. Kiam estas lanĉita, Waf unue elektos uzi la komunajn bibliotekojn en la konstrua dosierujo, tiam serĉos bibliotekojn laŭ la vojo al la bibliotekoj agordita en la loka medio. Do kiam oni instalas bibliotekojn en sistemo, estas bona praktiko kontroli, ke la ĝustaj bibliotekoj estas uzataj. Uzantoj povas elekti instali kun malsama prefikso pasante la opcion dum agordo --prefixekzemple:

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

Se poste, post la konstruo, la uzanto enigas la instalan komandon ./waf, la prefikso estos uzata /opt/loka.

teamo ./waf clean devas esti uzata antaŭ reagordi la projekton se la instalado uzos Waf sub malsama prefikso.

Tiel, por uzi ns-3 ne necesas voki ./waf install. Plej multaj uzantoj ne bezonos ĉi tiun komandon ĉar Waf prenos la nunajn bibliotekojn el la konstrua dosierujo, sed iuj uzantoj povas trovi ĉi tion utila se iliaj agadoj implikas labori kun programoj ekster la ns-3-dosierujo.

Waf unuopaĵo

Ĉe la supra nivelo de la fontarbo ns-3, ekzistas nur unu Waf-skripto. Post kiam vi komencos labori, vi pasigos multan tempon en la dosierujo scratch/ aŭ pli profunde ensrc/... kaj samtempe devas kuri Waf. Vi povas simple memori kie vi estas kaj kuri Waf kiel sekvas:

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

sed ĉi tio estos teda kaj ema eraro, do ekzistas pli bonaj solvoj. Unu ofta maniero estas uzi tekstredaktilon kiel ekz emacsvim, en kiu du finaj sesioj estas malfermitaj, unu estas uzata por konstrui ns-3, kaj la dua estas uzata por redakti la fontkodon. Se vi nur havas tarball, tiam mediovariablo povas helpi:

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

$ cd scratch 
$ waff build

En la modula dosierujo povus esti tenta aldoni banalan waf-skripton kiel exec ../../waf. Bonvolu, ne faru tion. Ĉi tio estas konfuza por novuloj kaj, se farita malbone, kondukas al malfacile detekteblaj konstrueraroj. La solvoj montritaj supre estas la vojo, kiu devus esti uzata.

3.5 Testado ns-3

Vi povas ruli la unutestojn de la distribuo ns-3 rulante la skripton ./test.py:

$ ./test.py

Ĉi tiuj provoj okazas paralele kun Waf. Fine vi devus vidi mesaĝon dirantan:

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

Ĉi tio estas grava mesaĝo por identigi valgrind-kraŝojn, kraŝojn aŭ erarojn, indikante problemojn kun la kodo aŭ nekongruon inter iloj kaj kodo.

Vi ankaŭ vidos la finan eligon de Waf kaj testilo plenumanta ĉiun teston, kiu aspektos kiel ĉi tio:

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)

Ĉi tiu komando estas kutime rulata de uzantoj por rapide kontroli, ke la distribuo ns-3 estas ĝuste konstruita. (Rimarku, ke la ordo de la linioj "PASS: ..." povas esti malsama, tio estas normala. Gravas, ke la resuma linio ĉe la fino de la raporto montras, ke ĉiuj testoj trapasis; neniuj provoj malsukcesis aŭ kraŝis.) Kaj Wafkaj testo.py paraleligos laboron trans la disponeblaj procesoraj kernoj de la maŝino.

3.6 Rulado de la skripto

Ni kutime rulas skriptojn sub kontrolo Waf. Ĉi tio permesas al la konstrusistemo certigi, ke komunaj bibliotekaj vojoj estas ĝuste fiksitaj kaj ke la bibliotekoj estas disponeblaj ĉe rultempo. Por ruli la programon, simple uzu Waf kun parametro - -run. Ni rulu la ns-3-ekvivalenton de la ĉiea programo Saluton mondotajpante la jenon:

$ ./waf --run hello-simulator

Waf unue kontrolos, ke la programo estas ĝuste konstruita kaj konstruos se necese. Tiam Waf ekzekutos programon kiu produktas la sekvan eligon.

Hello Simulator

Gratulon! Vi nun estas uzanto de ns-3!

Kion mi faru se mi ne vidas rezultojn?

Se vi vidas mesaĝojn Wafindikante ke la konstruo finiĝis sukcese, sed vi ne vidas la eligon "Saluton Simulilo", tiam estas ebleco, ke en la sekcio [Konstruu-kun-Waf] vi ŝanĝis vian konstrureĝimon al optimumigita, sed maltrafis reveni al la reĝimo elpurigi. Ĉiu konzola eligo uzata en ĉi tiu lernilo uzas specialan ns-3-komponenton, kiu plenumas protokolojn kaj estas uzataj por presi kutimajn mesaĝojn al la konzolo. Eligo de ĉi tiu komponanto estas aŭtomate malŝaltita kiam optimumigita kodo estas kompilita - ĝi estas "optimumigita". Se vi ne vidas la eliron "Saluton Simulilo", enigu la jenon:

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

agordi Waf konstrui sencimigajn versiojn de ns-3-programoj, kiuj inkluzivas ekzemplojn kaj testojn. Vi tiam devus rekonstrui la nunan sencimigan version de la kodo tajpante

$ ./waf

Nun se vi rulas la programon saluton-simulator, vi devus vidi la atenditan rezulton.

3.6.1 Argumentoj de komandlinio

Por transdoni komandliniajn argumentojn al la programo ns-3, uzu la sekvan ŝablonon:

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

Anstataŭigi al la nomo de via programo kaj al la argumentoj. Argumento - -command-template por Waf estas esence recepto por konstrui la realan komandlinion Waf uzata por ekzekuti la programon. Waf kontrolas, ke la konstruo estas kompleta, fiksas la komunajn bibliotekojn, poste uzas la provizitan komandlinian ŝablonon kaj anstataŭigas la programnomon por la lokokupilo %s por voki la ruleblan. Se vi trovas ĉi tiun sintakson komplika, ekzistas pli simpla versio kiu implikas la ns-3-programon kaj ĝiajn argumentojn enfermitajn per unuopaj citiloj:

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

Alia aparte utila ekzemplo estas funkciigado de testsuitoj selekteme. Ni supozu, ke ekzistas testaro nomata mytest (fakte ne ekzistas). Supre ni uzis la skripton ./test.py por ruli kelkajn provojn paralele, kiu plurfoje vokas la testprogramon testkuristo. Voku testkuristo rekte por fari unu teston:

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

Argumentoj estos transdonitaj al la programo testkuristo. Ĉar mytest ne ekzistas, erarmesaĝo estos generita. Por presi la disponeblajn eblojn de testkuristo, enigu:

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

3.6.2 Sencimigado

Por ruli ns-3-programojn sub alia ilo, kiel ekzemple erarserĉilo (ekzemple, gdb) aŭ memortestilo (ekzemple, valgrind), uzu similan formon - -command-template = "…". Ekzemple, ruli en la erarserĉilo gdb via hello-simulator ns-3-programo kun argumentoj:

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

Notu, ke la nomo de la programo ns-3 venas kun la argumento - -run, kaj la administra ilo (ĉi tie gdb) estas la unua signo en la argumento - -command-template. Opcio - -args informas gdbke la resto de la komandlinio apartenas al la "malsupera" programo. (Kelkaj versioj gdb ne komprenas la opcion - -args. En ĉi tiu kazo, forigu la programargumentojn de - -command-template kaj uzu la komandan aron gdb argumentoj.) Ni povas kombini ĉi tiun recepton kaj la antaŭan por ruli la teston sub la erarserĉilo:

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

3.6.3 Labora dosierujo

Waf devus esti lanĉita de sia loko ĉe la supro de la ns-3-arbo. Ĉi tiu dosierujo fariĝas la labordosierujo kie la eligodosieroj estos skribitaj. Sed kio se vi volas konservi ĉi tiujn dosierojn ekster la fontarbo ns-3? Uzu argumenton - -cwd:

$ ./waf --cwd=...

Vi eble trovos pli oportune akiri la eligdosierojn en via labordosierujo. En ĉi tiu kazo, la sekva nerekta agado povas helpi:

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

Ĉi tiu dekoracio de la antaŭa versio de la komando konservas la nunan labordosierujon, iras al la dosierujo Wafkaj poste instruas Waf por ŝanĝi la labordosierujon reen al la nuna labordosierujo konservita antaŭ komenci la programon. Ni mencias la teamon - -cwd Por kompleteco, plej multaj uzantoj simple rulas Waf el la plej alta dosierujo kaj generas eligajn dosierojn tie.

Daŭrigo: Ĉapitro 4

fonto: www.habr.com

Aldoni komenton