ns-3 nethermir kennsla. 3. kafli

ns-3 nethermir kennsla. 3. kafli
kafli 1,2

3 Byrjað
3.1 Yfirlit
3.2 Forkröfur
3.2.1 Að hlaða niður ns-3 útgáfunni sem upprunaskjalasafn
3.3 Að hlaða niður ns-3 með Git
3.3.1 Hleðsla ns-3 með Bake
3.4 Þing ns-3
3.4.1 Bygging með build.py
3.4.2 Bygging með bakstri
3.4.3 Byggja með Waf
3.5 Próf ns-3
3.6 Keyra handritið
3.6.1 Skipanalínurök
3.6.2 Villuleit
3.6.3 Vinnuskrá

3 kafli

Að byrja

Þessum kafla er ætlað að undirbúa lesandann til að byrja með tölvu sem hefur kannski aldrei sett upp ns-3. Það fjallar um studda vettvang, forsendur, hvernig á að fá ns-3, hvernig á að smíða ns-3 og hvernig á að prófa smíðina þína og keyra einföld forrit.

3.1 Yfirlit

ns-3 hermirinn er byggður sem kerfi samvinnuhugbúnaðarsafna. Við samsetningu er kóðinn notendaforrita tengdur þessum bókasöfnum. C++ eða Python forritunarmálin eru notuð til að skrifa sérsniðin forrit.

Ns-3 er dreift sem frumkóði, sem þýðir að markkerfið þarf að hafa hugbúnaðarþróunarumhverfi til að fyrst geti byggt upp söfnin og síðan byggt upp notendaforritið. Í grundvallaratriðum væri hægt að dreifa ns-3 sem tilbúnum bókasöfnum fyrir ákveðið kerfi og í framtíðinni gæti þeim verið dreift á þennan hátt. En nú á dögum vinna margir notendur vinnu sína með því að breyta ns-3 sjálfum, svo það er gagnlegt að hafa frumkóðann til að byggja upp bókasöfnin. Ef einhver vill taka að sér að búa til tilbúin bókasöfn og pakka fyrir stýrikerfi, vinsamlega hafið samband við póstlistann ns-hönnuðir.

Næst munum við skoða þrjár leiðir til að hlaða niður og byggja ns-3. Hið fyrsta er að hlaða niður og smíða opinberu útgáfuna frá aðalsíðunni. Annað er val og samsetning afrita af þróunarútgáfum af grunnuppsetningu ns-3. Þriðja er að nota viðbótarsmíðaverkfæri til að hlaða fleiri viðbótum fyrir ns-3. Við förum í gegnum hvert og eitt þar sem verkfærin eru aðeins öðruvísi.

Reyndir Linux notendur gætu velt því fyrir sér hvers vegna ns-3 er ekki veittur sem pakki eins og flest önnur bókasöfn sem nota pakkastjórnun? Þó að það séu til tvöfaldir pakkar fyrir ýmsar Linux dreifingar (td Debian) endar flestir notendur með því að breyta söfnunum og þurfa að endurbyggja ns-3 sjálfir, svo að hafa frumkóðann tiltækan. Af þessum sökum munum við einbeita okkur að því að setja upp frá uppruna.

Fyrir flest forrit ns-3 réttindi rót eru ekki nauðsynlegar, þá er mælt með því að nota notandareikning án forréttinda.

3.2 Forkröfur

Allt settið af tiltækum ns-3 bókasöfnum er háð fjölda söfnum þriðja aðila, en að mestu leyti er hægt að smíða og nota ns-3 með stuðningi fyrir nokkra algenga (oft uppsetta sjálfgefið) íhluti: C++ þýðanda, Python, frumkóða ritstjóri (til dæmis, Vim, emacs eða Eclipse) og, ef þróunargeymslur eru notaðar, Git útgáfustýringarkerfi. Flestir sem eru í fyrsta skipti þurfa ekki að hafa áhyggjur ef uppsetning þeirra tilkynnir að einhverjir ns-3 háþróaðir eiginleikar vanti, en fyrir þá sem vilja fulla uppsetningu, býður verkefnið upp á wiki sem inniheldur síður með fullt af gagnlegum ráðum og brellum. Ein slík síða er Uppsetningarsíðan, með uppsetningarleiðbeiningum fyrir ýmis kerfi, aðgengileg á: https://www.nsnam.org/wiki/Installation.

Forkröfur hluti þessarar wiki útskýrir hvaða pakkar eru nauðsynlegir til að styðja algenga ns-3 valkosti og gefur einnig skipanirnar sem notaðar eru til að setja þá upp á algengum tegundum af Linux eða macOS.

Þú getur nýtt þér þetta tækifæri til að skoða ns-3 wiki síðuna eða aðalvefsíðuna: https://www.nsnam.org, vegna þess að þar er mikið af upplýsingum. Frá og með nýjustu útgáfunni af ns-3 (ns-3.29), þarf eftirfarandi verkfæri til að keyra ns-3:

Verkfærapakki/útgáfa

  • C++ þýðanda
    clang++ eða g++ (g++ útgáfa 4.9 eða nýrri)
  • Python
    python2 útgáfa >= 2.7.10, eða python3 útgáfa >=3.4
  • fara
    hvaða nýjustu útgáfu sem er (til að fá aðgang að ns-3 á GitLab.com)
  • tar
    hvaða nýjustu útgáfu sem er (til að taka upp ns-3 útgáfu)
  • bunzip2
    hvaða nýjustu útgáfu sem er (til að taka upp ns-3 útgáfuna)

Til að athuga sjálfgefna útgáfu Python skaltu slá inn python -V. Til að athuga g++ útgáfuna skaltu slá inn g++ -v. Ef einhver verkfæri vantar eða eru of gömul, vinsamlegast skoðaðu uppsetningarleiðbeiningarnar á ns-3 wiki síðunni.

Héðan í frá gerum við ráð fyrir að lesandinn sé að keyra Linux, MacOS eða Linux keppinaut og hafi að minnsta kosti ofangreind verkfæri.

3.2.1 Að hlaða niður ns-3 útgáfunni sem upprunaskjalasafn

Þetta er aðferðin fyrir nýjan notanda sem vill hlaða niður og gera tilraunir með nýjustu útgáfuna og pakkaútgáfur ns-3. ns-3 útgáfur eru gefnar út sem þjappað frumskjalasafn, stundum kallað tarball. tarball er sérstakt hugbúnaðarskjalasafn þar sem nokkrar skrár eru sameinaðar saman. Skjalasafnið er venjulega þjappað. ns-3 ræsiferli í gegnum tarball er einfalt, þú þarft bara að velja útgáfu, hlaða niður og pakka henni upp.

Gerum ráð fyrir að þú, sem notandi, viljir byggja ns-3 í staðbundinni skrá sem heitir vinnusvæði. Þú getur fengið vinnueintak af útgáfunni með því að slá eftirfarandi inn í Linux stjórnborðið (að sjálfsögðu skipta út viðeigandi útgáfunúmerum)

$ 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 

Gefðu gaum að tólinu sem notað er hér að ofan wget, sem er skipanalínutól til að hlaða niður hlutum af internetinu. Ef þú hefur ekki sett það upp geturðu notað vafrann þinn til þess.

Með því að fylgja þessum skrefum ferðu í ns-allinone-3.29 möppuna, þar ættir þú að sjá nokkrar skrár og möppur

$ 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

Þú ert nú tilbúinn til að byggja upp ns-3 grunndreifingu og getur farið í kaflann um byggingu ns-3.

3.3 Að hlaða niður ns-3 með Git

ns-3 kóðinn er fáanlegur í Git geymslunum á GitLab.com á https://gitlab.com/nsnam/. Hópur nsnam sameinar hinar ýmsu geymslur sem notaðar eru af opnum hugbúnaði.

Auðveldasta leiðin til að byrja að nota Git geymslur er að gaffla eða klóna umhverfið ns-3-allínón. Þetta er sett af forskriftum sem stjórnar hleðslu og samsetningu á algengustu ns-3 undirkerfunum. Ef þú ert nýr í Git, gætu hugtökin „gaffill“ og „klón“ verið þér ókunnug; ef svo er mælum við með því að þú klónir einfaldlega (búir til þitt eigið eintak) geymsluna sem staðsett er á GitLab.com svona:

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

Á þessu stigi, útsýni yfir möppuna þína ns-3-allínón örlítið frábrugðin útgáfuskjalaskránni sem lýst er hér að ofan. Það ætti að líta einhvern veginn svona út:

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

Vinsamlegast athugaðu að það er handrit download.py, sem mun að auki draga út ns-3 og meðfylgjandi frumkóða. Hér hefur þú val: annað hvort hlaðið niður nýjustu ns-3 þróunarmyndinni:

$ python download.py

eða kjósa frekar ns-3 útgáfuna með því að nota fánann -n til að tilgreina útgáfunúmer:

$ python download.py -n ns-3.29

Eftir þetta skref í möppuna ns-3-allínón viðbótargeymslum verður hlaðið niður ns-3, baka, pybindgen и netanim.

Athugið
Á vél með hreinu Ubuntu16.04 þurfti ég að breyta skipuninni í þetta: $ sudo python3 download.py -n ns-3.29 (hér eftir athugasemdir þýðanda).

3.3.1 Hleðsla ns-3 með Bake

Ofangreindar tvær aðferðir (heimildasafn eða geymsla ns-3-allínón í gegnum Git) eru gagnlegar til að fá einföldustu ns-3 uppsetninguna með mörgum viðbótum (pybindgen að búa til Python bindingar og netanim fyrir netfjör). Þriðja geymslan sem sjálfgefið er í ns-3-allinone er kölluð baka.

Baka er tæki til samræmdrar smíði hugbúnaðar úr mörgum geymslum, þróað fyrir ns-3 verkefnið. Baka hægt að nota til að fá þróunarútgáfur af ns-3, sem og til að hlaða niður og byggja viðbætur á grunnútgáfu ns-3 dreifingarinnar, svo sem umhverfið Bein framkvæmd kóða, CradleNetwork Simulation Cradle, getu til að búa til nýjar Python bindingar og ýmis ns-3 „öpp“.

Athugið
CradleNetwork Simulation Cradle er rammi sem gerir þér kleift að nota alvöru TCP/IP netstafla inni í nethermi.

Ef þú býst við að ns-3 uppsetningin þín hafi háþróaða eða viðbótareiginleika geturðu fylgt þessari uppsetningarleið.

Í nýjustu ns-3 útgáfum Baka var bætt við tjörulosunina. Útgáfan inniheldur stillingarskrá sem gerir þér kleift að hlaða niður núverandi hugbúnaðarútgáfum við útgáfuna. Það er til dæmis útgáfa Baka, sem er dreift með útgáfu ns-3.29, er hægt að nota til að sækja íhluti fyrir þá útgáfu af ns-3 eða eldri, en ekki er hægt að nota til að sækja íhluti fyrir síðari útgáfur (ef pakkalýsingaskráin bakeconf.xml ekki uppfært).

Þú getur líka fengið nýjasta eintakið bakameð því að slá inn eftirfarandi skipun í Linux stjórnborðið þitt (að því gefnu að þú hafir Git uppsett):

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

Þegar þú keyrir git skipunina ættirðu að sjá eitthvað eins og eftirfarandi:

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.

Eftir að skipuninni er lokið klón þú ættir að hafa möppu sem heitir baka, en innihaldið ætti að líta einhvern veginn svona út:

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

Athugaðu að þú hefur hlaðið inn nokkrum Python forskriftum, Python mát sem heitir baka og XML stillingarskrá. Næsta skref er að nota þessi forskrift til að hlaða niður og byggja upp ns-3 dreifingu að eigin vali. Nokkur sérsniðnar markmið eru fáanleg:

  1. ns-3.29: eining sem samsvarar útgáfunni; það mun hlaða niður íhlutum sem líkjast útgáfunni í tarballinu;

  2. ns-3-dev: svipuð eining, en með kóða frá þróunartrénu;

  3. ns-allinone-3.29: Eining sem inniheldur aðra viðbótareiginleika eins og smella leið og Network Simulation Cradle, Openflow fyrir ns-3.

  4. ns-3-allínón: svipað útgáfuútgáfu einingarinnar allt í einu, en fyrir þróunarkóða.

Athugið
Smellur - mát hugbúnaðararkitektúr til að búa til beina.

Openflow er siðareglur til að stjórna ferlinu við að vinna úr gögnum sem send eru um gagnanet með beinum og rofum, innleiða hugbúnaðarskilgreinda nettækni.

Núverandi þróunarmynd (ekki útgefin) ns-3 er að finna á:https://gitlab.com/nsnam/ns-3-dev.git.

Hönnuðir reyna að halda þessum geymslum í stöðugri vinnu, en þær eru á þróunarsvæðinu og innihalda óútgefinn kóða, þannig að ef þú ætlar ekki að nota nýja eiginleika skaltu velja opinberu útgáfuna.

Þú getur fundið nýjustu útgáfuna af kóðanum með því að skoða listann yfir geymslur, eða með því að fara á ns-3 útgáfur vefsíðuna:https://www.nsnam.org/releases/ og smelltu á tengilinn fyrir nýjustu útgáfuna. Í þessu dæmi munum við halda áfram með ns-3.29.

Nú, til að fá ns-3 íhlutina sem við þurfum, munum við nota tólið Baka. Við skulum segja nokkur inngangsorð um verkið Baka.

Bake virkar með því að hlaða pakkaheimildum í möppu uppspretta og setja upp bókasöfnin í byggingarskrána. Baka er hægt að keyra með því að vísa í tvöfaldann, en ef þú vilt keyra Baka ekki úr möppunni sem það var hlaðið niður í, það er ráðlegt að bæta slóðinni við baka að leiðinni þinni (PATH umhverfisbreyta), til dæmis sem hér segir (dæmi fyrir Linux bash skel). Farðu í "baka" möppuna og stilltu síðan eftirfarandi umhverfisbreytur:

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

Þetta mun setja forritið bake.py í skeljaslóðina og mun leyfa öðrum forritum að finna keyrslurnar og bókasöfnin sem það bjó til baka. Í sumum notkunartilfellum baka, PATH og PYTHONPATH stillingin sem lýst er hér að ofan er ekki nauðsynleg, en fullkomin smíði af ns-3-allinone (með viðbótarpökkum) krefst þess venjulega.

Farðu í vinnuskrána þína og sláðu inn eftirfarandi í stjórnborðinu:

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

Næst munum við spyrja Baka athuga hvort við höfum næg verkfæri til að hlaða hinum ýmsu íhlutum. Hringja:

$ ./bake.py check

Þú ættir að sjá eitthvað eins og eftirfarandi:

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

Sérstaklega eru upphleðslutæki eins og Mercurial, CVS, Git og Bazaar nauðsynleg í þessu skrefi þar sem þau gera okkur kleift að fá kóðann. Á þessum tímapunkti skaltu setja upp verkfærin sem vantar á venjulegan hátt fyrir kerfið þitt (ef þú veist hvernig) eða hafðu samband við kerfisstjórann þinn til að fá aðstoð.

Næst skaltu reyna að hlaða niður hugbúnaðinum:

$ ./bake.py download

niðurstaðan ætti að vera eitthvað eins og:

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

Þetta þýðir að þremur heimildum hefur verið hlaðið niður. Farðu nú í upprunaskrána og sláðu inn ls; Þú ættir að sjá:

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

Nú ertu tilbúinn til að byggja upp ns-3 dreifinguna.

3.4 Þing ns-3

Eins og með að hlaða niður ns-3, þá eru nokkrar leiðir til að byggja ns-3. Það helsta sem við viljum leggja áherslu á er að ns-3 er smíðað með því að nota byggingartól sem kallast Waflýst hér að neðan. Flestir notendur munu vinna með Waf, en það eru nokkrar handhægar forskriftir til að hjálpa þér að byrja eða skipuleggja flóknari smíði. Svo vinsamlegast, áður en þú lest um Waf, Sjáðu build.py og samsetning með baka.

3.4.1 Bygging með build.py

Attention! Þetta byggingarskref er aðeins fáanlegt úr upprunaskjalasafnsútgáfunni sem fæst eins og lýst er hér að ofan; og ekki hlaðið niður í gegnum git eða bake.

Þegar unnið er með útgáfusafn tarballÍ ns-3-allínón Það er handhægt handrit sem getur auðveldað samsetningu íhlutanna. Það heitir build.py. Þetta forrit mun setja verkefnið upp fyrir þig á sem hagkvæmastan hátt. Athugaðu samt að fullkomnari uppsetning og vinna með ns-3 felur venjulega í sér að nota eigin byggingarkerfi ns-3, Waf, sem verður kynnt síðar í þessari kennslu.

Ef þú halaðir niður með því að nota tarball, síðan í möppunni þinni ~/vinnusvæði möppu með nafni eitthvað eins og ns-allinone-3.29. Skráðu Eftirfarandi:

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

Þegar hringt er í build.py Við notuðum skipanalínurök til að byggja upp dæmin og prófin sem notuð eru í þessari kennslu, sem eru ekki byggð sjálfgefið í ns-3. Sjálfgefið er að forritið byggir einnig allar tiltækar einingar. Síðan, ef þú vilt, geturðu smíðað ns-3 án dæma og prófana, eða útilokað einingar sem eru ekki nauðsynlegar fyrir vinnu þína.

Þú munt sjá fullt af úttaksskilaboðum frá þýðanda birt af handritinu þegar það byggir upp hina ýmsu hluta sem þú hefur hlaðið inn. Fyrst mun handritið reyna að byggja upp hreyfimyndina netanim, þá bindandi rafall pybindgen og loks ns-3. Þegar ferlinu er lokið ættirðu að sjá eftirfarandi:

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

Í síðustu þremur línum skráningarinnar sjáum við skilaboð um einingar sem ekki voru byggðar:

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

Þetta þýðir einfaldlega að sumar ns-3 einingar sem eru háðar utanaðkomandi bókasöfnum hafa kannski ekki verið smíðaðar, eða að ekki þarf að smíða þær fyrir þessa uppsetningu. Þetta þýðir ekki að hermirinn sé ekki settur saman eða að samsettu einingarnar virki ekki rétt.

3.4.2 Bygging með bakstri

Ef þú notaðir bake hér að ofan til að fá frumkóða úr verkefnageymslunum geturðu haldið áfram að nota hann til að byggja ns-3. Hringja:

$ ./bake.py build

og þú ættir að sjá eitthvað eins og:

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

Tooltip: Þú getur líka gert bæði niðurhals- og smíðaskrefin í einu með því að kalla „bake.py deploy“.

Samsetning allra íhluta getur mistekist, en samsetningin heldur áfram ef ekki er þörf á íhlutnum. Til dæmis var nýlegt flytjanleikamál það castxml hægt að setja saman með verkfærum baka ekki á öllum kerfum. Í þessu tilviki munu skilaboð eins og þessi birtast:

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

En castxml aðeins þörf ef þú vilt búa til uppfærðar Python bindingar. Fyrir flesta notendur er engin þörf á þessu (að minnsta kosti þar til þeir breyta ns-3), svo hægt er að hunsa slíkar viðvaranir á öruggan hátt í bili.

Ef það mistekst mun eftirfarandi skipun gefa þér vísbendingu um ósjálfstæði:

$ ./bake.py show

Hinar ýmsu ósjálfstæði pakkana sem þú ert að reyna að smíða verða skráðar.

3.4.3 Byggja með Waf

Hingað til, til að byrja að byggja ns-3, notuðum við annað hvort handritið build.py, eða tól baka. Þessi verkfæri eru gagnleg til að byggja upp ns-3 og viðhalda bókasöfnum. Reyndar keyra þeir byggingartólið til að byggja Waf úr ns-3 skránni. Waf sett upp með ns-3 frumkóðanum. Flestir notendur fara fljótt yfir í beina notkun til að stilla og setja saman ns-3 Waf. Svo til að halda áfram skaltu fara í ns-3 möppuna sem þú bjóst til upphaflega.

Þetta er ekki stranglega krafist eins og er, en það mun vera gagnlegt að fara aðeins til baka og sjá hvernig á að gera breytingar á uppsetningu verkefnisins. Sennilega er gagnlegasta stillingarbreytingin sem þú getur gert að búa til fínstillta útgáfu af kóðanum. Sjálfgefið hefur þú stillt verkefnið þitt til að búa til villuleitarútgáfu. Við skulum skoða verkefni til að búa til bjartsýni samsetningu. Til að útskýra fyrir Waf að það ætti að búa til fínstilltar byggingar sem innihalda dæmi og próf þarftu að keyra eftirfarandi skipanir:

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

Þetta mun hefjast Waf utan staðbundinnar skráar (til þæginda). Fyrsta skipunin hreinsar upp frá fyrri byggingu, þetta er venjulega ekki stranglega nauðsynlegt, en það er góð venja (sjá einnig byggingarsnið hér að neðan); þetta mun eyða áður stofnuðum bókasöfnum og hlutaskrám sem staðsettar eru í möppunni byggja/. Þegar verkefnið er endurstillt og byggingarkerfið athugar hinar ýmsu ósjálfstæði ættirðu að sjá úttak svipað og eftirfarandi:

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)

Vinsamlegast athugaðu síðasta hluta skráningar hér að ofan. Sumir ns-3 valkostir eru ekki virkjaðir sjálfgefið eða þurfa kerfisstuðning til að virka rétt. Til dæmis, til að virkja XmlTo, verður bókasafnið að vera til staðar á kerfinu libxml-2.0. Ef þetta bókasafn fannst ekki og samsvarandi ns-3 aðgerð var ekki virkjuð munu skilaboð birtast. Athugaðu líka að það er hægt að nota skipunina sudo til að stilla suid bitann „setja hópauðkenni á keyrslutíma“ fyrir ákveðin forrit. Það er ekki sjálfgefið virkt og því birtist þessi eiginleiki sem „ekki virkur“. Að lokum, til að fá lista yfir virka valkosti, notaðu Waf með færibreytu --check-config.

Nú skulum við fara til baka og skipta aftur yfir í villuleit sem inniheldur dæmi og próf.

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

Byggingarkerfið er nú sett upp og þú getur smíðað villuútgáfur af ns-3 forritum með því einfaldlega að slá inn:

$ ./waf

Skrefin hér að ofan gætu hafa neytt þig til að smíða hluta af ns-3 kerfinu tvisvar, en nú veistu hvernig á að breyta stillingum og búa til fínstilltan kóða.

Til að athuga hvaða snið er virkt fyrir tiltekna verkefnisstillingu er skipun:

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

Ofangreind atburðarás build.py styður líka rök --enable-examples и --enable-tests, en aðrir valkostir Waf það styður ekki beint. Til dæmis, þetta mun ekki virka:

$ ./build.py --disable-python

viðbrögðin verða svona:

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

Hins vegar er hægt að nota sérstaka rekstraraðilann - - til að senda viðbótarfæribreytur í gegnum vafsvo í staðinn fyrir ofangreint mun eftirfarandi skipun virka:

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

vegna þess að það býr til aðalskipunina ./waf stilla --disable-python. Hér eru fleiri kynningarráð um Waf.

Meðhöndla byggingarvillur

ns-3 útgáfur eru prófaðar á nýjustu C++ þýðendum sem til eru við útgáfu á algengum Linux og MacOS dreifingum. Hins vegar, með tímanum, eru nýjar dreifingar gefnar út með nýjum þýðendum, og þessir nýrri þýðendur hafa tilhneigingu til að vera pirrandi gagnvart viðvörunum. ns-3 stillir byggingu þess til að meðhöndla allar viðvaranir sem villur, þannig að stundum ef þú ert að keyra eldri útgáfu á nýrra kerfi gæti þýðandaviðvörun stöðvað smíðina.

Til dæmis var áður útgáfa af ns-3.28 fyrir Fedora 28, sem innihélt nýja aðalútgáfu gcc (gcc-8). Að byggja útgáfuna ns-3.28 eða fyrri útgáfur undir Fedora 28, með Gtk2+ uppsett, mun eftirfarandi villa eiga sér stað:

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

Í útgáfum sem byrja frá ns-3.28.1, í Waf möguleiki er í boði til að leysa þessi vandamál. Það gerir það óvirkt að setja "-Werror" fánann í g++ og clang++. Þetta er "--disable-werror" valmöguleikinn og verður að vera notaður við uppsetningu:

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

Stilla eða setja saman

Nokkrar skipanir Waf hafa aðeins merkingu í uppsetningarfasanum og sum eru aðeins gild í byggingarfasanum. Til dæmis, ef þú vilt nota ns-3 hermiaðgerðirnar, geturðu virkjað bitastillinguna suður að nota sudo, eins og lýst er hér að ofan. Þetta mun hnekkja stillingarskrefskipunum og þannig geturðu breytt stillingunum með því að nota eftirfarandi skipun, sem inniheldur einnig dæmi og próf.

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

Ef þú gerir þetta Waf mun ráðast sudotil að breyta forritum til að búa til keppinautakóða til að keyra með heimildum rót. Í Waf Það eru margir aðrir valkostir í boði fyrir stillingar og byggingarskref. Til að kanna valkostina þína skaltu slá inn:

$ ./waf --help

Í næsta hluta munum við nota nokkra prófunartengda valkosti.

Samsetningarsnið

Við höfum þegar séð hvernig þú getur stillt Waf fyrir samkomur kemba и bjartsýni:

$ ./waf --build-profile=debug

Það er líka millisamsetningarsnið, gefa út. Valkostur -d er samheiti við --build-profile. Byggingarsniðið stjórnar notkun skráningar-, fullyrðinga- og hagræðingarrofa fyrir þýðanda:

ns-3 nethermir kennsla. 3. kafli

Eins og þú sérð eru skráningar og fullyrðingar aðeins fáanlegar í villuleit. Mælt er með því að þróa handritið þitt í villuleitarstillingu og framkvæma síðan endurteknar keyrslur (fyrir tölfræði eða breytubreytingar) í fínstilltu byggingarsniði.

Ef þú ert með kóða sem ætti aðeins að keyra í ákveðnum byggingarsniðum, notaðu 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;)

Sjálfgefið, Waf setur byggingargripi í byggingarskránni. Þú getur tilgreint aðra úttaksskrá með því að nota valkostinn - -out, til dæmis:

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

Með því að sameina þetta við byggingarsnið geturðu auðveldlega skipt á milli mismunandi safnvalkosta:

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

Sem gerir þér kleift að vinna með margar samsetningar án þess að þurfa að endurskrifa nýjustu samsetninguna í hvert sinn. Þegar þú skiptir yfir í annan prófíl, Waf mun aðeins setja það saman, án þess að endursamsetja allt.

Þegar þú skiptir um byggingarsnið á þennan hátt þarftu að gæta þess að gefa sömu stillingarvalkosti í hvert skipti. Að skilgreina nokkrar umhverfisbreytur mun hjálpa þér að forðast mistök:

$ 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

Þýðendur og fánar

Í ofangreindum dæmum Waf til að byggja ns-3 notar C++ þýðandann frá GCC ( g ++). Hins vegar geturðu breytt því sem þú notar Waf C++ þýðanda, með því að skilgreina CXX umhverfisbreytuna. Til dæmis, til að nota C++ þýðanda Clang, clang++,

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

Á sama hátt getur þú stillt Waf að nota dreifða samantekt með því að nota distcc:

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

Frekari upplýsingar um distcc og dreifða samantekt er að finna á verkefnasíðunni í Documentation hlutanum. Til að bæta við þýðandafánum þegar þú stillir ns-3 skaltu nota CXXFLAGS_EXTRA umhverfisbreytuna.

Uppsetning

Waf hægt að nota til að setja upp bókasöfn á mismunandi stöðum í kerfinu. Sjálfgefið er að söfnuð söfn og executables eru staðsett í möppunni byggja, og þar sem Waf veit hvar þessi bókasöfn og keyrslur eru staðsettar, þá er engin þörf á að setja söfnin upp annars staðar.

Ef notendur kjósa að setja upp utan byggingarskrárinnar geta þeir keyrt skipunina ./waf setja í embætti. Sjálfgefið forskeytið fyrir uppsetningu er / usr / localSvo ./waf setja í embætti mun setja upp forrit í / usr / local / bin, bókasöfn í / Usr / local / lib og hausskrár inn /usr/local/include. Yfirnotendaréttindi þurfa venjulega að vera stillt með sjálfgefnu forskeyti, svo dæmigerð skipun væri sudo ./waf setja upp. Þegar Waf er hleypt af stokkunum mun Waf fyrst velja að nota sameiginlegu bókasöfnin í byggingarskránni og leita síðan að bókasöfnum meðfram leiðinni að söfnunum sem eru stillt í staðbundnu umhverfi. Svo þegar bókasöfn eru sett upp á kerfi er gott að athuga hvort rétt söfn séu notuð. Notendur geta valið að setja upp með öðru forskeyti með því að fara framhjá valkostinum meðan á uppsetningu stendur --prefix, til dæmis:

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

Ef seinna, eftir byggingu, slær notandinn inn uppsetningarskipunina ./waf, verður forskeytið notað /opt/local.

Team ./waf clean verður að nota áður en verkefnið er endurstillt ef uppsetningin mun nota Waf undir öðru forskeyti.

Þannig að til að nota ns-3 er engin þörf á að hringja ./waf install. Flestir notendur þurfa ekki þessa skipun vegna þess Waf mun sækja núverandi bókasöfn úr byggingarskránni, en sumum notendum gæti fundist þetta gagnlegt ef starfsemi þeirra felur í sér að vinna með forrit utan ns-3 möppunnar.

Vaf single

Á efsta stigi ns-3 upprunatrésins er aðeins eitt Waf handrit. Þegar þú byrjar að vinna muntu eyða miklum tíma í möppunni scratch/ eða dýpra ísrc/... og á sama tíma að hlaupa Waf. Þú getur bara munað hvar þú ert og hlaupið Waf sem hér segir:

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

en þetta verður leiðinlegt og villuhættulegt, svo það eru betri lausnir. Ein algeng leið er að nota textaritil eins og emacs eða Vim, þar sem tvær flugstöðvarlotur eru opnaðar, önnur er notuð til að byggja upp ns-3 og hin er notuð til að breyta frumkóðanum. Ef þú hefur aðeins tarball, þá getur umhverfisbreyta hjálpað:

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

$ cd scratch 
$ waff build

Í einingaskránni gæti verið freistandi að bæta við léttvægu waf handriti eins og exec ../../waf. Vinsamlegast ekki gera það. Þetta er ruglingslegt fyrir nýliða og, þegar það er gert illa, leiðir það til byggingarvillna sem erfitt er að greina. Lausnirnar sem sýndar eru hér að ofan eru leiðin sem ætti að nota.

3.5 Próf ns-3

Þú getur keyrt einingapróf ns-3 dreifingarinnar með því að keyra skriftuna ./test.py:

$ ./test.py

Þessar prófanir eru keyrðar samhliða Waf. Að lokum ættirðu að sjá skilaboð sem segja:

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

Þetta eru mikilvæg skilaboð til að bera kennsl á valgrind hrun, hrun eða villur, sem gefur til kynna vandamál með kóðann eða ósamrýmanleika milli verkfæra og kóða.

Þú munt líka sjá lokaúttakið frá Waf og prófunaraðili sem keyrir hvert próf, sem mun líta eitthvað svona út:

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)

Þessi skipun er venjulega keyrð af notendum til að staðfesta fljótt að ns-3 dreifingin sé rétt byggð. (Athugið að röð "PASS: ..." línanna getur verið önnur, þetta er eðlilegt. Það sem skiptir máli er að yfirlitslínan í lok skýrslunnar sýnir að öll próf stóðust; engin próf féllu eða hrundu.) Og WafOg test.py mun samhliða vinnu yfir tiltæka örgjörvakjarna vélarinnar.

3.6 Keyra handritið

Við keyrum venjulega forskriftir undir stjórn Waf. Þetta gerir byggingarkerfinu kleift að tryggja að sameiginlegar bókasafnsleiðir séu rétt stilltar og að söfnin séu tiltæk á keyrslutíma. Til að keyra forritið skaltu einfaldlega nota Waf með færibreytu - -run. Við skulum keyra ns-3 jafngildi alls staðar nálægu forritsins Halló heimurmeð því að slá inn eftirfarandi:

$ ./waf --run hello-simulator

Waf mun fyrst athuga hvort forritið sé rétt byggt og smíða ef þörf krefur. Þá Waf mun keyra forrit sem framleiðir eftirfarandi úttak.

Hello Simulator

Til hamingju! Þú ert nú ns-3 notandi!

Hvað ætti ég að gera ef ég sé engar niðurstöður?

Ef þú sérð skilaboð Wafsem gefur til kynna að smíðin hafi lokið með góðum árangri, en þú sérð ekki úttakið "Halló hermir", þá er möguleiki á því að í [Build-with-Waf] hlutanum hafirðu skipt um smíðastillingu yfir í bjartsýni, en missti af því að skipta aftur yfir í ham kemba. Öll framleiðsla stjórnborðs sem notuð er í þessari kennslu notar sérstakan ns-3 íhlut sem framkvæmir skráningu og er notaður til að prenta sérsniðin skilaboð á stjórnborðið. Úttak frá þessum íhlut er sjálfkrafa óvirkt þegar fínstilltur kóða er settur saman - hann er "bjartsýni". Ef þú sérð ekki „Hello Simulator“ úttakið skaltu slá inn eftirfarandi:

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

að sérsníða Waf að smíða villuútgáfur af ns-3 forritum, sem innihalda dæmi og próf. Þú ættir síðan að endurbyggja núverandi villuleitarútgáfu kóðans með því að slá inn

$ ./waf

Nú ef þú keyrir forritið halló-hermir, þú ættir að sjá væntanlega niðurstöðu.

3.6.1 Skipanalínurök

Til að senda skipanalínurök til ns-3 forritsins, notaðu eftirfarandi mynstur:

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

Skipta um að nafni forritsins þíns og rökunum. Rök - -command-template í Waf er í raun uppskrift að því að byggja upp raunverulega skipanalínuna Waf notað til að keyra forritið. Waf athugar hvort smíðin sé lokið, setur sameiginlegu bókasafnsslóðina, notar síðan skipanalínusniðmátið sem fylgir með og setur forritsheitið í stað %s staðgengils til að kalla fram keyrslu. Ef þér finnst þessi setningafræði flókin, þá er til einfaldari útgáfa sem felur í sér ns-3 forritið og rök þess innan gæsalappa:

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

Annað sérstaklega gagnlegt dæmi er að keyra prófunarsvítur sértækt. Gerum ráð fyrir að það sé til prófunarsvíta sem heitir mytest (reyndar er það ekki). Hér að ofan notuðum við ./test.py forskriftina til að keyra fjölda prófana samhliða, sem kallar ítrekað á prófunarforritið tilraunahlaupari. Hringdu tilraunahlaupari beint til að keyra eitt próf:

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

Rök verða send til prógrammsins tilraunahlaupari. Þar sem mytest er ekki til munu villuboð verða til. Til að prenta út tiltæka prófunarvalkosti skaltu slá inn:

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

3.6.2 Villuleit

Til að keyra ns-3 forrit undir öðru tóli, eins og villuleitarforriti (til dæmis, gdb) eða minnisprófunartæki (td, valgrind), notaðu svipað form - -command-template = "…". Til dæmis til að keyra í villuleitarforritinu gdb hello-simulator ns-3 forritið þitt með rökum:

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

Athugaðu að ns-3 forritsheitið kemur með röksemdinni - -run, og stjórnunartólið (hér gdb) er fyrsta táknið í rökræðunni - -command-template. Valkostur - -args сообщает gdbað restin af skipanalínunni tilheyri "neðri" forritinu. (Sumar útgáfur gdb skil ekki valmöguleikann - -args. Í þessu tilviki skaltu fjarlægja forritsrök frá - -command-template og notaðu skipanasettið gdb heldur því fram.) Við getum sameinað þessa uppskrift og þá fyrri til að keyra prófið undir villuleit:

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

3.6.3 Vinnuskrá

Waf ætti að vera skotið frá staðsetningu sinni efst á ns-3 trénu. Þessi mappa verður vinnuskráin þar sem úttaksskrárnar verða skrifaðar. En hvað ef þú vilt halda þessum skrám utan ns-3 frumtrésins? Notaðu rök - -cwd:

$ ./waf --cwd=...

Þú gætir fundið það þægilegra að fá úttaksskrárnar í vinnuskrána þína. Í þessu tilviki getur eftirfarandi óbein aðgerð hjálpað:

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

Þessi skreyting fyrri útgáfu af skipuninni varðveitir núverandi vinnumöppu, fer í möppuna Wafog leiðbeinir síðan Waf til að breyta vinnuskránni aftur í núverandi vinnuskrá sem er vistuð áður en forritið er ræst. Við nefnum liðið - -cwd Til fullnustu keyra flestir notendur einfaldlega Waf úr efstu möppunni og búa til úttaksskrár þar.

Framhald: 4. kafli

Heimild: www.habr.com

Bæta við athugasemd