ns-3 rezo similatè leson patikilye. Chapit 3

ns-3 rezo similatè leson patikilye. Chapit 3
chapit 1,2

3 Kòmanse
3.1 Apèsi sou lekòl la
3.2 Prekondisyon
3.2.1 Telechaje lage ns-3 kòm yon achiv sous
3.3 Telechaje ns-3 lè l sèvi avèk Git
3.3.1 Chaje ns-3 lè l sèvi avèk Bake
3.4 Asanble ns-3
3.4.1 Bati ak build.py
3.4.2 Bati ak kwit
3.4.3 Bati ak Waf
3.5 Tès ns-3
3.6 Kouri script la
3.6.1 Agiman liy kòmand
3.6.2 Debogaj
3.6.3 Anyè travay

Chapter 3

Pou kòmanse

Chapit sa a gen entansyon prepare lektè a pou kòmanse ak yon òdinatè ki ka pa janm enstale ns-3. Li kouvri platfòm sipòte, kondisyon, kijan pou jwenn ns-3, kijan pou konstwi ns-3, ak kijan pou teste pwogram ki senp pou konstwi ak kouri.

3.1 Apèsi sou lekòl la

Se similatè ns-3 bati kòm yon sistèm bibliyotèk lojisyèl kolaborasyon. Pandan asanble a, kòd pwogram itilizatè yo lye ak bibliyotèk sa yo. Lang pwogramasyon C++ oswa Python yo itilize pou ekri pwogram koutim.

Ns-3 distribye kòm kòd sous, ki vle di ke sistèm sib la dwe gen yon anviwònman devlopman lojisyèl yo nan lòd yo premye bati bibliyotèk yo ak Lè sa a, bati pwogram itilizatè a. Nan prensip, ns-3 ta ka distribye kòm bibliyotèk ki pare pou yon sistèm espesifik, epi nan lavni yo ka distribye nan fason sa a. Men, sèjousi anpil itilizatè yo aktyèlman fè travay yo pa koreksyon ns-3 tèt li, kidonk li itil pou gen kòd sous la pou konstwi bibliyotèk yo. Si yon moun ta renmen pran travay pou kreye bibliyotèk pare yo ak pakè pou sistèm opere, tanpri kontakte lis adrès la. ns-devlopè.

Apre sa, nou pral gade twa fason pou telechaje ak bati ns-3. Premye a se telechaje ak bati lage ofisyèl la nan sit prensipal la. Dezyèm lan se seleksyon an ak asanble kopi vèsyon devlopman nan enstalasyon ns-3 debaz la. Twazyèm lan se sèvi ak zouti adisyonèl pou chaje plis ekstansyon pou ns-3. Nou pral ale nan chak youn paske zouti yo se yon ti kras diferan.

Itilizatè Linux ki gen eksperyans ka mande poukisa ns-3 pa bay kòm yon pake tankou pifò lòt bibliyotèk ki itilize yon manadjè pake? Malgre ke gen pakè binè pou divès distribisyon Linux (egzanp Debian), pifò itilizatè yo fini edite bibliyotèk yo epi yo oblije rebati ns-3 tèt yo, kidonk gen kòd sous la disponib. Pou rezon sa a, nou pral konsantre sou enstale soti nan sous.

Pou pifò aplikasyon ns-3 dwa rasin yo pa nesesè, li rekòmande pou itilize yon kont itilizatè ki pa gen privilèj.

3.2 Prekondisyon

Tout seri bibliyotèk ns-3 ki disponib yo gen yon kantite depandans sou bibliyotèk twazyèm pati yo, men pou pifò nan ns-3 yo ka bati epi itilize ak sipò pou plizyè konpozan komen (souvan enstale pa default): yon du C++, Python, yon editè kòd sous (pa egzanp, VIM, emak oswa Eklips) epi, si yo itilize depo devlopman yo, sistèm kontwòl vèsyon Git. Pifò itilizatè premye fwa pa pral bezwen enkyete si konfigirasyon yo rapòte kèk karakteristik avanse ns-3 ki manke, men pou moun ki vle yon enstalasyon konplè, pwojè a bay yon wiki ki gen ladan paj ak anpil konsèy itil ak ke trik nouvèl. Youn nan paj sa yo se paj Enstalasyon an, ak enstriksyon enstalasyon pou divès sistèm, ki disponib nan: https://www.nsnam.org/wiki/Installation.

Seksyon Prekondisyon nan wiki sa a eksplike ki pakè ki nesesè pou sipòte opsyon ns-3 komen yo epi tou li bay kòmandman yo itilize pou enstale yo sou gou komen Linux oswa macOS.

Ou ka pwofite opòtinite sa a pou eksplore paj wiki ns-3 la oswa sit entènèt prensipal la: https://www.nsnam.org, paske gen anpil enfòmasyon la. Kòmanse ak dènye vèsyon ns-3 (ns-3.29), zouti sa yo oblije kouri ns-3:

Pake Zouti/Vèsyon

  • C++ du
    clang++ oswa g++ (g++ vèsyon 4.9 oswa pi wo)
  • Piton
    vèsyon python2 >= 2.7.10, oswa vèsyon python3 >=3.4
  • ale
    nenpòt dènye vèsyon (pou jwenn aksè nan ns-3 sou GitLab.com)
  • pran asfat
    nenpòt dènye vèsyon (pou depale lage ns-3)
  • bunzip2
    nenpòt dènye vèsyon (pou depale lage ns-3 la)

Pou tcheke vèsyon default Python, tape python -V. Pou tcheke vèsyon g++, tape g++ -v. Si nenpòt zouti ki manke oswa ki twò ansyen, tanpri al gade nan gid enstalasyon an sou paj wiki ns-3 la.

Depi koulye a, nou sipoze ke lektè a ap kouri Linux, MacOS, oswa yon Emulation Linux, epi li gen omwen zouti ki anwo yo.

3.2.1 Telechaje lage ns-3 kòm yon achiv sous

Sa a se aksyon an pou yon nouvo itilizatè ki vle telechaje ak fè eksperyans ak dènye lage ak vèsyon pake nan ns-3. ns-3 lage yo pibliye kòm achiv sous konprese, pafwa yo rele tarball. tarball se yon fòma achiv lojisyèl espesyal kote plizyè dosye yo konbine ansanm. Achiv la anjeneral konprese. ns-3 pwosesis bòt atravè tarball se senp, ou jis bezwen chwazi yon lage, telechaje ak depake li.

Ann sipoze ke ou, kòm yon itilizatè, vle bati ns-3 nan yon anyè lokal yo rele espas travay. Ou ka jwenn yon kopi k ap travay nan lage a lè w antre sa ki annapre yo nan konsole Linux la (ranplase nimewo vèsyon ki apwopriye yo, nan kou)

$ 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 

Peye atansyon sou sèvis piblik yo itilize pi wo a wje, ki se yon zouti liy kòmand pou telechaje objè soti nan entènèt la. Si ou pa te enstale li, ou ka itilize navigatè ou a pou sa.

Swiv etap sa yo pral mennen ou nan anyè ns-allinone-3.29 la, ou ta dwe wè plizyè fichye ak repèrtwar.

$ 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

Ou pare kounye a pou konstwi distribisyon baz ns-3 epi ou ka ale nan seksyon sou bati ns-3.

3.3 Telechaje ns-3 lè l sèvi avèk Git

Kòd ns-3 la disponib nan depo Git yo sou GitLab.com nan https://gitlab.com/nsnam/. Gwoup nsnam pote ansanm plizyè depo yo itilize pa yon pwojè sous louvri.

Fason ki pi fasil pou kòmanse itilize depo Git se fouchèt oswa klonaj anviwònman an ns-3-allinon. Sa a se yon seri scripts ki jere chajman ak asanble sous-sistèm ns-3 ki pi souvan itilize yo. Si w se nouvo nan Git, tèm "fouchèt" ak "klonaj" yo ka pa abitye pou ou; si se konsa, nou rekòmande pou ou tou senpleman klonaj (fè pwòp kopi ou) depo ki sitiye sou GitLab.com tankou sa a:

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

Nan etap sa a, gade nan anyè ou ns-3-allinon yon ti kras diferan de anyè achiv lage ki dekri pi wo a. Li ta dwe gade yon bagay tankou sa a:

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

Tanpri sonje ke gen yon script download.py, ki pral anplis ekstrè ns-3 ak kòd sous ki akonpaye. Isit la ou gen yon chwa: swa telechaje dènye snapshot devlopman ns-3 la:

$ python download.py

oswa prefere lage ns-3 lè l sèvi avèk drapo a -n pou endike nimewo liberasyon an:

$ python download.py -n ns-3.29

Apre etap sa a nan anyè a ns-3-allinon repozitwa adisyonèl yo pral telechaje ns-3, founen, pybindgen и netanim.

Note
Sou yon machin ki gen pwòp Ubuntu16.04, mwen te bezwen chanje lòd sa a: $ sudo python3 download.py -n ns-3.29 (apwe nòt tradiktè a).

3.3.1 Chaje ns-3 lè l sèvi avèk Bake

De metòd ki anwo yo (sous achiv oswa depo ns-3-allinon atravè Git) yo itil pou jwenn enstalasyon ns-3 ki pi senp la ak plizyè addons (pybindgen jenere Python obligatwa ak netanim pou animasyon rezo). Twazyèm depo bay pa default nan ns-3-allinone rele founen.

Kwit se yon zouti pou kowòdone bati lojisyèl ki soti nan plizyè depo, devlope pou pwojè ns-3 la. Kwit ka itilize pou jwenn vèsyon devlopman nan ns-3, osi byen ke telechaje ak bati ekstansyon nan vèsyon an baz nan distribisyon an ns-3, tankou anviwònman an. Egzekisyon Kòd Dirèk, CradleNetwork Simulation Cradle, kapasite pou kreye nouvo Liaison Python ak divès kalite ns-3 "aplikasyon".

Note
CradleNetwork Simulation Cradle se yon kad ki pèmèt ou itilize vrè pil rezo TCP/IP andedan yon similatè rezo.

Si ou espere enstalasyon ns-3 ou a gen karakteristik avanse oswa adisyonèl, ou ka swiv chemen enstalasyon sa a.

Nan dènye degaje ns-3 yo Kwit te ajoute nan lage goudwon ​​an. Liberasyon an gen ladann yon fichye konfigirasyon ki pèmèt ou telechaje vèsyon lojisyèl aktyèl yo nan moman lage a. Sa se, pou egzanp, vèsyon an Kwit, ki distribye ak lage ns-3.29, ka itilize pou rekipere konpozan pou lage sa a nan ns-3 oswa pi bonè, men li pa ka itilize pou rekipere konpozan pou degaje pita (si fichye deskripsyon pake a bakeconf.xml pa mete ajou).

Ou ka jwenn tou dènye kopi a founenpa antre nan lòd sa a nan konsole Linux ou a (si nou gen Git enstale):

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

Lè ou kouri lòd git la, ou ta dwe wè yon bagay tankou sa ki annapre yo:

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.

Apre kòmandman an fini script ou ta dwe gen yon anyè non founen, sa ki nan ki ta dwe gade yon bagay tankou sa a:

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

Remake byen ke ou te chaje plizyè scripts Python, yon modil Python yo te rele founen ak yon fichye konfigirasyon XML. Pwochen etap la se sèvi ak scripts sa yo pou telechaje ak bati distribisyon ns-3 ou chwazi a. Plizyè objektif personnalisation ki disponib:

  1. ns-3.29: modil ki koresponn ak lage a; li pral telechaje eleman ki sanble ak lage nan tarball la;

  2. ns-3-dev: yon modil ki sanble, men lè l sèvi avèk kòd ki soti nan pye bwa devlopman an;

  3. ns-allinone-3.29: Yon modil ki gen ladan lòt karakteristik adisyonèl tankou Klike routage ak Rezo Simulation Cradle, Openflow pou ns-3.

  4. ns-3-allinon: menm jan ak vèsyon an lage nan modil la alinon, men pou kòd devlopman.

Note
Klike sou — Achitekti lojisyèl modilè pou kreye routeurs.

Openflow se yon pwotokòl pou jere pwosesis la nan pwosesis done transmèt sou yon rezo done pa routeurs ak switch, mete ann aplikasyon lojisyèl-defini teknoloji rezo.

Ou ka jwenn snapshot devlopman aktyèl la (ki pa lage) ns-3 nan:https://gitlab.com/nsnam/ns-3-dev.git.

Devlopè yo eseye kenbe depo sa yo nan yon lòd travay ki konsistan, men yo nan zòn nan devlopman epi yo gen kòd ki pa pibliye, kidonk si ou pa planifye pou sèvi ak nouvo karakteristik, Lè sa a, chwazi lage ofisyèl la.

Ou ka jwenn dènye vèsyon kòd la lè w ap gade lis depo yo, oswa lè w ale nan paj wèb ns-3 Releases:https://www.nsnam.org/releases/ epi klike sou lyen dènye vèsyon an. Nan egzanp sa a nou pral kontinye ak ns-3.29.

Koulye a, pou jwenn konpozan ns-3 nou bezwen yo, nou pral sèvi ak zouti a Kwit. Ann di kèk mo entwodiksyon sou travay la Kwit.

Bake travay pa chaje sous pake nan yon anyè sous ak enstale bibliyotèk yo nan anyè konstriksyon an. Kwit ka kouri pa referans binè a, men si ou vle kouri Kwit pa soti nan anyè a nan ki li te telechaje, li se konseye yo ajoute chemen an founen nan chemen ou a (PATH anviwònman varyab), pou egzanp jan sa a (egzanp pou Linux bash koki). Ale nan anyè "kwit" epi mete varyab anviwònman sa yo:

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

Sa a pral mete pwogram nan kwit.py nan chemen an koki epi yo pral pèmèt lòt pwogram yo jwenn ègzèkutabl yo ak bibliyotèk ke li te kreye founen. Nan kèk ka itilize founen, paramèt PATH ak PYTHONPATH ki dekri pi wo a pa obligatwa, men yon konstriksyon konplè ns-3-allinone (ak pakè adisyonèl) anjeneral mande sa.

Ale nan anyè k ap travay ou a epi antre sa ki annapre yo nan konsole a:

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

Apre sa nou pral mande Kwit tcheke si nou gen ase zouti pou chaje plizyè konpozan. Rele:

$ ./bake.py check

Ou ta dwe wè yon bagay tankou sa ki annapre yo:

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

An patikilye, Upload zouti tankou Mercurial, CVS, Git ak Bazaar esansyèl nan etap sa a paske yo pèmèt nou jwenn kòd la. Nan pwen sa a, enstale zouti ki manke yo nan fason nòmal pou sistèm ou a (si ou konnen ki jan) oswa kontakte administratè sistèm ou a pou èd.

Apre sa, eseye telechaje lojisyèl an:

$ ./bake.py download

rezilta a ta dwe yon bagay tankou:

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

Sa a pral vle di ke twa sous yo te telechaje. Koulye a, ale nan anyè sous la epi tape ls; Ou ta dwe wè:

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

Kounye a ou pare pou konstwi distribisyon ns-3 la.

3.4 Asanble ns-3

Menm jan ak telechaje ns-3, gen plizyè fason pou konstwi ns-3. Bagay pwensipal lan nou vle mete aksan sou se ke ns-3 bati lè l sèvi avèk yon zouti bati yo rele Wafki dekri anba a. Pifò itilizatè yo pral travay avèk yo Waf, men gen kèk scripts sou la men pou ede w kòmanse oswa òganize bati plis konplèks. Se konsa, tanpri, anvan ou li sou Waf, pran yon gade nan bati.py ak asanble avèk founen.

3.4.1 Bati ak build.py

Attention! Etap konstriksyon sa a disponib sèlman nan vèsyon achiv sous yo jwenn jan sa dekri pi wo a; epi yo pa telechaje atravè git oswa bake.

Lè w ap travay ak yon achiv lage tarballpous ns-3-allinon Gen yon script sou la men ki ka fè rasanble eleman yo pi fasil. Li rele build.py. Pwogram sa a pral mete sou pye pwojè a pou ou nan fason ki pi itil. Sepandan, sonje ke konfigirasyon pi avanse ak travay ak ns-3 anjeneral enplike nan itilize pwòp sistèm bati ns-3 a, Waf, ki pral prezante pita nan leson patikilye sa a.

Si ou telechaje lè l sèvi avèk tarball, Lè sa a, nan anyè ou a ~/espas travay yon anyè ki gen yon non yon bagay tankou ns-allinone-3.29. Antre sa ki annapre yo:

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

Lè yo rele bati.py Nou itilize agiman liy kòmand pou konstwi egzanp ak tès yo itilize nan leson patikilye sa a, ki pa bati pa default nan ns-3. Pa default, pwogram nan bati tou tout modil ki disponib. Lè sa a, si ou vle, ou ka bati ns-3 san egzanp ak tès, oswa eskli modil ki pa nesesè pou travay ou.

Ou pral wè yon anpil nan mesaj pèsistans yap ogmante jiska du s' script a menm jan li konstwi plizyè pati ou te chaje. Premye script la pral eseye bati animatè a netanim, Lè sa a, dèlko a obligatwa pybindgen epi finalman ns-3. Lè pwosesis la fini, ou ta dwe wè bagay sa yo:

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

Nan twa dènye liy yo nan lis la nou wè yon mesaj sou modil ki pa te bati:

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

Sa tou senpleman vle di ke kèk modil ns-3 ki depann de bibliyotèk ekstèn ka pa te bati, oswa ke yo pa oblije bati pou konfigirasyon sa a. Sa pa vle di ke similatè a pa reyini oswa ke modil yo reyini pa pral travay kòrèkteman.

3.4.2 Bati ak kwit

Si ou te itilize bake pi wo a pou jwenn kòd sous nan depo pwojè yo, ou ka kontinye sèvi ak li pou konstwi ns-3. Rele:

$ ./bake.py build

epi ou ta dwe wè yon bagay tankou:

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

rapid: Ou kapab tou fè tou de telechaje a ak bati etap nan yon fwa lè w rele "bake.py deploy".

Asanble tout eleman yo ka echwe, men asanble a ap kontinye si yon eleman pa obligatwa. Pou egzanp, yon pwoblèm portabilite resan te sa castxml ka rasanble pa zouti founen pa sou tout platfòm. Nan ka sa a, yon mesaj tankou sa a ap parèt:

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

Men, castxml sèlman nesesè si ou vle kreye mete ajou Liaison Python. Pou pifò itilizatè pa gen okenn nesesite pou sa (omwen jiskaske yo chanje ns-3), kidonk avètisman sa yo ka san danje inyore pou kounye a.

Si li echwe, lòd sa a ap ba ou yon allusion sou depandans ki manke:

$ ./bake.py show

Depandans yo divès kalite pakè w ap eseye bati yo pral nan lis.

3.4.3 Bati ak Waf

Jiska pwen sa a, pou kòmanse bati ns-3, nou te itilize swa script la bati.py, oswa zouti founen. Zouti sa yo itil pou konstwi ns-3 ak kenbe bibliyotèk. An reyalite, yo bati yo kouri zouti nan bati Waf soti nan anyè ns-3. Waf enstale ak kòd sous ns-3. Pifò itilizatè yo byen vit ale nan itilizasyon dirèk pou konfigirasyon ak rasanble ns-3 la Waf. Se konsa, pou kontinye, tanpri ale nan anyè ns-3 ke ou te kreye orijinèlman.

Sa a se pa entèdi obligatwa nan moman sa a, men li pral itil pou fè bak yon ti kras epi wè ki jan yo fè chanjman nan konfigirasyon pwojè a. Pwobableman chanjman nan konfigirasyon ki pi itil ou ka fè se kreye yon vèsyon optimize nan kòd la. Pa default, ou te configuré pwojè ou a bati yon vèsyon debug. Ann pran yon gade nan yon pwojè yo kreye yon konstriksyon optimize. Pou eksplike Waf ke li ta dwe fè optimize bati ki gen ladan egzanp ak tès, w ap bezwen kouri kòmandman sa yo:

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

Sa a pral lanse Waf andeyò anyè lokal la (pou konvenyans ou). Kòmandman an premye netwaye soti nan bati anvan an, sa a se nòmalman pa estrikteman nesesè, men li se bon pratik (gade tou pwofil bati anba a); sa a pral efase bibliyotèk ki te deja kreye ak dosye objè ki sitiye nan anyè a bati /. Lè pwojè a rekonfigire epi sistèm konstriksyon an tcheke plizyè depandans yo, ou ta dwe wè pwodiksyon ki sanble ak sa ki annapre yo:

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)

Tanpri sonje dènye pati lis ki anwo a. Gen kèk opsyon ns-3 ki pa aktive pa default oswa ki mande sipò sistèm pou fonksyone byen. Pa egzanp, pou pèmèt XmlTo, bibliyotèk la dwe prezan sou sistèm lan libxml-2.0. Si yo pa jwenn bibliyotèk sa a epi fonksyon ns-3 ki koresponn lan pa t aktive, y ap parèt yon mesaj. Epitou sonje ke li posib pou itilize kòmandman an sudo pou mete suid bit la "mete gwoup ID nan ekzekisyon" pou sèten pwogram. Li pa pèmèt pa default ak Se poutèt sa karakteristik sa a parèt kòm "pa pèmèt". Finalman, pou jwenn yon lis opsyon ki pèmèt, sèvi ak Waf ak paramèt --check-config.

Koulye a, ann tounen tounen epi chanje tounen nan bati debug ki gen egzanp ak tès yo.

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

Se sistèm nan bati kounye a mete kanpe epi ou ka bati vèsyon debug nan pwogram ns-3 pa senpleman tape:

$ ./waf

Etap ki anwo yo ka fòse ou bati yon pati nan sistèm ns-3 la de fwa, men kounye a ou konnen ki jan yo chanje konfigirasyon an ak bati kòd optimize.

Pou tcheke ki pwofil ki aktif pou yon konfigirasyon pwojè bay, gen yon lòd:

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

Senaryo ki anwo a bati.py tou sipòte agiman --enable-examples и --enable-tests, men lòt opsyon Waf li pa sipòte dirèkteman. Pou egzanp, sa a pa pral travay:

$ ./build.py --disable-python

reyaksyon an pral tankou sa a:

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

Sepandan, operatè a espesyal - - ka itilize yo pase paramèt adisyonèl atravè wafSe konsa, olye pou yo pi wo a kòmandman sa a ap travay:

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

paske li jenere kòmand prensipal la ./waf konfigirasyon --disable-python. Men kèk konsèy plis entwodiksyon sou Waf.

Manyen erè konstriksyon

Yo teste ns-3 yo sou dènye konpilateur C++ ki disponib nan moman yo pibliye sou distribisyon Linux ak MacOS komen. Sepandan, apre yon sèten tan, nouvo distribisyon yo lage ak nouvo konpilateur, ak nouvo konpilateur sa yo gen tandans vin pi pedantè sou avètisman. ns-3 konfigirasyon bati li yo pou trete tout avètisman kòm erè, kidonk pafwa si w ap kouri yon vèsyon ki pi ansyen sou yon nouvo sistèm, yon avètisman konpilatè ka sispann bati a.

Pou egzanp, te gen deja yon lage nan ns-3.28 pou Fedora 28, ki gen ladann yon nouvo vèsyon pi gwo. gcc (gcc-8). Bati lage ns-3.28 oswa vèsyon pi bonè anba Fedora 28, ak Gtk2+ enstale, erè sa a pral rive:

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

Nan degaje ki kòmanse nan ns-3.28.1, nan Waf gen yon opsyon ki disponib pou rezoud pwoblèm sa yo. Li enfim mete "-Werror" drapo a nan g++ ak clang++. Sa a se opsyon "--disable-werror" epi yo dwe aplike pandan konfigirasyon:

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

Konfigirasyon oswa rasanble

Kèk kòmandman Waf gen siyifikasyon sèlman nan faz nan konfigirasyon, ak kèk ki valab sèlman nan faz nan bati. Pou egzanp, si ou vle sèvi ak karakteristik yo imitasyon ns-3, ou ka pèmèt anviwònman an ti jan sid lè l sèvi avèk sudo, jan sa dekri pi wo a. Sa a pral depase kòmandman etap konfigirasyon yo, epi konsa ou ka chanje konfigirasyon an lè l sèvi avèk kòmandman sa a, ki gen ladan tou egzanp ak tès yo.

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

Si ou fè sa Waf pral lanse sudochanje pwogram kreyasyon priz kòd emulasyon pou kouri ak otorizasyon rasin. Nan Waf Gen anpil lòt opsyon ki disponib pou konfigirasyon an ak etap bati. Pou eksplore opsyon ou yo, antre:

$ ./waf --help

Nan pwochen seksyon an nou pral itilize kèk opsyon ki gen rapò ak tès yo.

Des asanble

Nou te deja wè ki jan ou ka konfigirasyon Waf pou asanble yo dbug и optimisé:

$ ./waf --build-profile=debug

Genyen tou yon pwofil asanble entèmedyè, divilge. Opsyon -d se sinonim ak --build-profile. Pwofil konstriksyon an kontwole itilizasyon enregistrement, afimasyon, ak switch optimize konpilatè:

ns-3 rezo similatè leson patikilye. Chapit 3

Kòm ou ka wè, antre ak afimasyon yo disponib sèlman nan bati debug. Pratik la rekòmande se devlope script ou a nan mòd debug, Lè sa a, fè kouri repete (pou estatistik oswa chanjman paramèt) nan yon pwofil konstriksyon optimize.

Si ou gen kòd ki ta dwe sèlman kouri nan kèk pwofil bati, sèvi ak Macro Wrapper Kòd la:

NS_BUILD_DEBUG (std::cout << "Part of an output line..." << std::flush; timer.Start ,!()); DoLongInvolvedComputation ();
NS_BUILD_DEBUG (timer.Stop (); std::cout << "Done: " << timer << std::endl;)

Default, Waf kote bati zafè nan anyè a bati. Ou ka presize yon anyè pwodiksyon diferan lè l sèvi avèk opsyon an - -outpa egzanp:

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

Lè w konbine sa a ak pwofil bati, ou ka fasilman chanje ant diferan opsyon konpilasyon:

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

Ki pèmèt ou travay ak plizyè asanble san ou pa bezwen reekri dènye asanble a chak fwa. Lè ou chanje nan yon lòt pwofil, Waf pral konpile sèlman li, san yo pa konplètman rekonpile tout bagay.

Lè ou chanje pwofil bati nan fason sa a, ou bezwen fè atansyon pou bay menm opsyon konfigirasyon yo chak fwa. Defini plizyè varyab anviwònman ap ede ou evite erè:

$ 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

Konpilateur ak drapo

Nan egzanp ki anwo yo Waf pou konstwi ns-3 itilize C++ du GCC ( g ++). Sepandan, ou ka chanje youn nan ou itilize a Waf C++ du, pa defini varyab anviwònman CXX. Pa egzanp, pou itilize C ++ du Clang, clang++,

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

Nan menm fason an ou ka konfigirasyon Waf pou itilize distribye konpilasyon itilize distcc:

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

Ou ka jwenn plis enfòmasyon sou konpilasyon distcc ak distribye nan paj pwojè a nan seksyon Dokimantasyon an. Pou ajoute drapo konpilatè lè w ap konfigirasyon ns-3, sèvi ak varyab anviwònman CXXFLAGS_EXTRA.

Enstalasyon

Waf ka itilize pou enstale bibliyotèk nan diferan kote sou sistèm nan. Pa default, bibliyotèk yo konpile ak ègzèkutabl yo sitiye nan anyè a bati, epi kòm Waf konnen ki kote bibliyotèk sa yo ak ègzèkutabl sa yo, pa gen okenn bezwen enstale bibliyotèk yo nenpòt lòt kote.

Si itilizatè yo prefere enstale deyò anyè a bati, yo ka kouri lòd la ./waf enstale. Prefiks default pou enstalasyon an se / usr / lokalSe poutèt sa ./waf enstale pral enstale pwogram nan / usr / lokal / bin, bibliyotèk nan / Uzr / lokal / LIB ak dosye header nan /usr/local/include. Dwa sipè itilizatè anjeneral bezwen mete ak yon prefiks default, kidonk yon lòd tipik ta dwe sudo ./waf enstale. Lè yo te lanse, Waf pral premye chwazi sèvi ak bibliyotèk yo pataje nan anyè konstriksyon an, Lè sa a, gade pou bibliyotèk sou chemen ki mennen nan bibliyotèk yo konfigirasyon nan anviwònman lokal la. Se konsa, lè enstale bibliyotèk sou yon sistèm, li se yon bon pratik yo tcheke ke bibliyotèk yo dwa yo te itilize. Itilizatè yo ka chwazi enstale ak yon prefiks diferan lè yo pase opsyon a pandan konfigirasyon --prefixpa egzanp:

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

Si pita, apre konstriksyon an, itilizatè a antre nan lòd enstalasyon an ./waf, yo pral itilize prefiks la / opt / lokal.

Ekip ./waf clean dwe itilize anvan rkonfigirasyon pwojè a si enstalasyon an pral itilize Waf anba yon prefiks diferan.

Kidonk, pou itilize ns-3 pa gen okenn nesesite pou rele ./waf install. Pifò itilizatè pa pral bezwen lòd sa a paske Waf pral ranmase bibliyotèk aktyèl yo nan anyè konstriksyon, men kèk itilizatè yo ka jwenn sa itil si aktivite yo enplike travay ak pwogram ki andeyò anyè ns-3 la.

Waf sèl

Nan nivo tèt pyebwa sous ns-3 la, gen yon sèl script Waf. Yon fwa ou kòmanse travay, ou pral pase anpil tan nan anyè a scratch/ oswa pi fon nansrc/... e an menm tan gen pou kouri Waf. Ou ka jis sonje kote ou ye epi kouri Waf jan sa a:

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

men sa a pral fatigan ak erè ki gen tandans, kidonk gen pi bon solisyon. Yon fason komen se sèvi ak yon editè tèks tankou emak oswa VIM, kote de sesyon tèminal yo louvri, youn itilize pou konstwi ns-3, epi dezyèm lan itilize pou edite kòd sous la. Si ou genyen sèlman tarball, Lè sa a, yon varyab anviwònman ka ede:

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

$ cd scratch 
$ waff build

Nan anyè modil la li ta ka tante ajoute yon script waf trivial tankou exec ../../waf. Tanpri, pa fè sa. Sa a se konfizyon pou newbies epi, lè yo fè mal, mennen nan difisil-a-detekte erè bati. Solisyon yo montre pi wo a se chemen ki ta dwe itilize.

3.5 Tès ns-3

Ou ka kouri tès inite distribisyon ns-3 la lè w kouri script la ./test.py:

$ ./test.py

Tès sa yo fèt an paralèl ak Waf. Evantyèlman ou ta dwe wè yon mesaj ki di:

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

Sa a se yon mesaj enpòtan pou idantifye aksidan valgrind, aksidan oswa erè, ki endike pwoblèm ak kòd la oswa enkonpatibilite ant zouti ak kòd.

Ou pral wè tou pwodiksyon final la soti nan Waf ak yon tèsteur kap kouri chak tès, ki pral sanble yon bagay tankou sa a:

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)

Kòmand sa a anjeneral kouri pa itilizatè yo byen vit verifye ke distribisyon an ns-3 bati kòrèkteman. (Remake byen ke lòd "PASS: ..." liy yo ka diferan, sa a se nòmal. Sa ki enpòtan se ke liy rezime nan fen rapò a montre ke tout tès yo pase; pa gen okenn tès echwe oswa fè aksidan.) Epi Waf, Ak tès.py pral paralelize travay atravè nwayo processeur ki disponib nan machin nan.

3.6 Kouri script la

Nou anjeneral kouri scripts anba kontwòl Waf. Sa a pèmèt sistèm konstriksyon an asire ke chemen bibliyotèk pataje yo fikse kòrèkteman epi ke bibliyotèk yo disponib nan ègzekutabl. Pou kouri pwogram nan, tou senpleman itilize Waf ak paramèt - -run. Ann kouri ekivalan ns-3 pwogram omniprésente la alo mondpa tape sa ki annapre yo:

$ ./waf --run hello-simulator

Waf pral premye tcheke si pwogram nan bati kòrèkteman epi bati si sa nesesè. Lè sa a Waf pral egzekite yon pwogram ki pwodui pwodiksyon sa a.

Hello Simulator

Felisitasyon! Ou se kounye a yon itilizatè ns-3!

Kisa mwen ta dwe fè si mwen pa wè rezilta?

Si ou wè mesaj Wafki endike ke bati a fini avèk siksè, men ou pa wè pwodiksyon an "Bonjou similatè", Lè sa a, gen yon posibilite ke nan seksyon [Build-with-Waf] ou chanje mòd bati ou a optimisé, men rate chanje tounen nan mòd la dbug. Tout pwodiksyon konsole yo itilize nan leson patikilye sa a sèvi ak yon eleman espesyal ns-3 ki fè antre epi yo itilize pou enprime mesaj koutim nan konsole a. Sòti nan eleman sa a otomatikman enfim lè kòd optimize konpile - li se "optimize". Si ou pa wè pwodiksyon "Alo similatè", antre sa ki annapre yo:

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

pou personnaliser Waf pou konstwi vèsyon debug nan pwogram ns-3, ki enkli egzanp ak tès yo. Lè sa a, ou ta dwe rebati vèsyon aktyèl la debug nan kòd la pa tape

$ ./waf

Koulye a, si ou kouri pwogram nan alo-simulatè, ou ta dwe wè rezilta espere.

3.6.1 Agiman liy kòmand

Pou pase agiman liy kòmand nan pwogram ns-3, sèvi ak modèl sa a:

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

Ranplase nan non pwogram ou a ak nan agiman yo. Agiman - -command-template pou Waf se esansyèlman yon resèt pou bati liy kòmand aktyèl la Waf itilize pou egzekite pwogram nan. Waf tcheke si batiman an fini, mete chemen bibliyotèk pataje yo, epi sèvi ak modèl liy kòmand yo bay la epi ranplase non pwogram %s pou rele ègzekutabl la. Si ou jwenn sentaks sa a konplike, gen yon vèsyon ki pi senp ki enplike pwogram ns-3 la ak agiman li yo ki fèmen nan yon sèl guillemets:

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

Yon lòt egzanp patikilyèman itil se kouri swit tès oaza. Ann sipoze gen yon suite tès ki rele mytest (an reyalite pa genyen). Pi wo a nou te itilize script ./test.py a pou fè yon seri tès nan paralèl, ki repete apèl pwogram tès la. tès-kourè. Rele tès-kourè dirèkteman pou fè yon tès:

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

Agiman yo pral pase nan pwogram nan tès-kourè. Depi mytest pa egziste, yo pral pwodwi yon mesaj erè. Pou enprime opsyon tès-kourè ki disponib yo, antre:

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

3.6.2 Debogaj

Pou kouri pwogram ns-3 anba yon lòt sèvis piblik, tankou yon debogaj (pa egzanp, gdb) oswa yon zouti tès memwa (pa egzanp, valgrind), sèvi ak yon fòm menm jan an - -command-template = "…". Pou egzanp, kouri nan debogaj la gdb pwogram hello-simulator ns-3 ou a ak agiman:

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

Remake byen ke non pwogram ns-3 la vini ak agiman an - -run, ak sèvis piblik jesyon an (isit la gdb) se premye siy nan agiman an - -command-template. Opsyon - -args enfòme gdbke rès la nan liy lan lòd fè pati pwogram "pi ba a". (Kèk vèsyon gdb pa konprann opsyon an - -args. Nan ka sa a, retire agiman pwogram nan - -command-template epi sèvi ak seri lòd la gdb arg.) Nou ka konbine resèt sa a ak youn anvan an pou fè tès la anba debogaj la:

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

3.6.3 Anyè travay

Waf ta dwe lanse soti nan kote li nan tèt pyebwa ns-3 la. Katab sa a vin anyè k ap travay kote yo pral ekri dosye pwodiksyon yo. Men, e si ou vle kenbe dosye sa yo deyò pyebwa sous ns-3 la? Sèvi ak agiman - -cwd:

$ ./waf --cwd=...

Ou ka jwenn li pi pratik pou jwenn fichiers pèsistans yap ogmante jiska yo nan anyè travay ou. Nan ka sa a, aksyon endirèk sa yo ka ede:

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

Dekorasyon sa a nan vèsyon anvan an nan lòd la prezève aktyèl anyè k ap travay, ale nan anyè a Wafepi apre enstwi Waf pou chanje anyè k ap travay la tounen nan anyè k ap travay aktyèl la sove anvan ou kòmanse pwogram nan. Nou mansyone ekip la - -cwd Pou konplè, pifò itilizatè yo tou senpleman kouri Waf soti nan anyè ki pi wo a epi jenere dosye pwodiksyon la.

Kontinye: Chapit 4

Sous: www.habr.com

Add nouvo kòmantè