Výukový program síťového simulátoru ns-3. Kapitola 3

Výukový program síťového simulátoru ns-3. Kapitola 3
kapitola 1,2

3 Začínáme
3.1 Přehled
3.2 Předpoklady
3.2.1 Stažení verze ns-3 jako zdrojového archivu
3.3 Stažení ns-3 pomocí Git
3.3.1 Načítání ns-3 pomocí Bake
3.4 Montáž ns-3
3.4.1 Budova s ​​build.py
3.4.2 Budování pomocí Bake
3.4.3 Sestavení pomocí Waf
3.5 Testování ns-3
3.6 Spuštění skriptu
3.6.1 Argumenty příkazového řádku
3.6.2 Ladění
3.6.3 Pracovní adresář

Kapitola 3

Začínáme

Tato kapitola má připravit čtenáře na to, aby začal s počítačem, na kterém možná nikdy nebyl nainstalován ns-3. Pokrývá podporované platformy, předpoklady, jak získat ns-3, jak sestavit ns-3 a jak otestovat sestavování a spouštění jednoduchých programů.

3.1 Přehled

Simulátor ns-3 je postaven jako systém spolupracujících softwarových knihoven. Při sestavování je kód uživatelských programů propojen s těmito knihovnami. K psaní vlastních programů se používají programovací jazyky C++ nebo Python.

Ns-3 je distribuován jako zdrojový kód, což znamená, že cílový systém musí mít prostředí pro vývoj softwaru, aby bylo možné nejprve sestavit knihovny a poté vytvořit uživatelský program. V zásadě by ns-3 mohly být distribuovány jako hotové knihovny pro konkrétní systém a v budoucnu mohou být distribuovány tímto způsobem. Ale v dnešní době mnoho uživatelů skutečně dělá svou práci úpravou samotného ns-3, takže je užitečné mít zdrojový kód pro sestavení knihoven. Pokud by se někdo chtěl ujmout práce s tvorbou hotových knihoven a balíčků pro operační systémy, kontaktujte prosím mailing list ns-developers.

Dále se podíváme na tři způsoby, jak stáhnout a sestavit ns-3. Prvním je stažení a vytvoření oficiální verze z hlavní stránky. Druhým je výběr a sestavení kopií vývojových verzí základní instalace ns-3. Třetím je použití dalších nástrojů pro sestavení k načtení dalších rozšíření pro ns-3. Projdeme si každý z nich, protože nástroje se mírně liší.

Zkušení uživatelé Linuxu se mohou divit, proč není ns-3 poskytován jako balíček jako většina ostatních knihoven, které používají správce balíčků? Přestože existují binární balíčky pro různé distribuce Linuxu (např. Debian), většina uživatelů skončí tak, že knihovny upraví a budou muset ns-3 přebudovat sami, takže mít k dispozici zdrojový kód se hodí. Z tohoto důvodu se zaměříme na instalaci ze zdroje.

Pro většinu aplikací práva ns-3 kořen nejsou potřeba, doporučuje se použít neprivilegovaný uživatelský účet.

3.2 Předpoklady

Celá sada dostupných knihoven ns-3 má řadu závislostí na knihovnách třetích stran, ale z velké části lze ns-3 sestavit a používat s podporou několika běžných (často instalovaných ve výchozím nastavení) komponent: kompilátor C++, Python, editor zdrojového kódu (např. elán, emacs nebo Zatmění) a pokud se používají vývojová úložiště, systémy pro správu verzí Git. Většina začínajících uživatelů se nemusí obávat, pokud jejich konfigurace hlásí chybějící některé pokročilé funkce ns-3, ale pro ty, kteří chtějí plnou instalaci, projekt poskytuje wiki, která obsahuje stránky se spoustou užitečných tipů a triků. Jednou z takových stránek je stránka Instalace s pokyny k instalaci pro různé systémy, která je k dispozici na adrese: https://www.nsnam.org/wiki/Installation.

Sekce Předpoklady na této wiki vysvětluje, které balíčky jsou vyžadovány pro podporu běžných možností ns-3, a také poskytuje příkazy používané k jejich instalaci na běžné verze Linuxu nebo macOS.

Můžete využít této příležitosti a prozkoumat wiki stránku ns-3 nebo hlavní web: https://www.nsnam.org, protože tam je hodně informací. Počínaje nejnovější verzí ns-3 (ns-3.29) jsou ke spuštění ns-3 vyžadovány následující nástroje:

Balíček/verze nástroje

  • C++ kompilátor
    clang++ nebo g++ (g++ verze 4.9 nebo vyšší)
  • PYTHON
    verze python2 >= 2.7.10 nebo verze python3 >= 3.4
  • Git
    jakákoli nejnovější verze (pro přístup k ns-3 na GitLab.com)
  • dehet
    jakákoli nejnovější verze (pro rozbalení vydání ns‑3)
  • bunzip2
    jakákoli nejnovější verze (pro rozbalení vydání ns‑3)

Chcete-li zkontrolovat výchozí verzi Pythonu, napište python -V. Chcete-li zkontrolovat verzi g++, napište g++ -v. Pokud nějaké nástroje chybí nebo jsou příliš staré, podívejte se na instalační příručku na wiki stránce ns-3.

Od této chvíle předpokládáme, že čtečka používá Linux, MacOS nebo emulátor Linuxu a má alespoň výše uvedené nástroje.

3.2.1 Stažení verze ns-3 jako zdrojového archivu

Toto je postup pro nového uživatele, který si chce stáhnout a experimentovat s nejnovější verzí a verzemi balíčků ns-3. Vydání ns-3 jsou publikována jako komprimované zdrojové archivy, někdy nazývané tarball. tarball je speciální formát softwarového archivu, ve kterém je několik souborů spojeno dohromady. Archiv je obvykle komprimovaný. ns-3 spouštěcí proces přes tarball je jednoduchý, stačí si vybrat vydání, stáhnout a rozbalit.

Předpokládejme, že jako uživatel chcete sestavit ns-3 v místním adresáři s názvem pracovní prostor. Pracovní kopii vydání můžete získat zadáním následujícího do konzole Linuxu (samozřejmě nahrazením příslušných čísel verzí)

$ 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 

Věnujte pozornost výše použitému nástroji wget, což je nástroj příkazového řádku pro stahování objektů z internetu. Pokud jste jej nenainstalovali, můžete k tomu použít svůj prohlížeč.

Následující kroky vás zavedou do adresáře ns-allinone-3.29, kde byste měli vidět několik souborů a adresářů

$ 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

Nyní jste připraveni sestavit základní distribuci ns-3 a můžete přejít k části o stavbě ns-3.

3.3 Stažení ns-3 pomocí Git

Kód ns-3 je k dispozici v repozitářích Git na GitLab.com na adrese https://gitlab.com/nsnam/. Skupina nsnam sdružuje různá úložiště používaná projektem s otevřeným zdrojovým kódem.

Nejjednodušší způsob, jak začít používat úložiště Git, je fork nebo klonování prostředí ns-3-allinon. Jedná se o sadu skriptů, která řídí načítání a sestavování nejběžněji používaných subsystémů ns-3. Pokud jste v Gitu noví, pojmy „fork“ a „klon“ vám mohou být neznámé; pokud ano, doporučujeme vám jednoduše naklonovat (vytvořit si vlastní kopii) úložiště umístěné na GitLab.com takto:

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

V této fázi pohled na váš adresář ns-3-allinon mírně odlišný od adresáře archivu vydání popsaného výše. Mělo by to vypadat nějak takto:

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

Vezměte prosím na vědomí, že existuje skript download.py, který bude dodatečně extrahovat ns-3 a doprovodný zdrojový kód. Zde máte na výběr: buď si stáhněte nejnovější snímek vývoje ns-3:

$ python download.py

nebo preferujte vydání ns-3 pomocí příznaku -n pro uvedení čísla vydání:

$ python download.py -n ns-3.29

Po tomto kroku do adresáře ns-3-allinon budou stažena další úložiště ns-3, upéct, pybindgen и netaním.

Poznámka
Na počítači s čistým Ubuntu16.04 jsem potřeboval změnit příkaz na toto: $ sudo python3 download.py -n ns-3.29 (dále jen poznámky překladatele).

3.3.1 Načítání ns-3 pomocí Bake

Výše uvedené dvě metody (zdrojový archiv nebo úložiště ns-3-allinon přes Git) jsou užitečné pro získání nejjednodušší instalace ns-3 s více doplňky (pybindgen pro generování vazeb Pythonu a netaním pro síťovou animaci). Třetí úložiště poskytované standardně v ns-3-allinone se nazývá upéct.

Upéct je nástroj pro koordinované budování softwaru z více úložišť, vyvinutý pro projekt ns-3. Upéct lze použít k získání vývojových verzí ns-3 a také ke stažení a sestavení rozšíření základní verze distribuce ns-3, jako je prostředí Přímé spuštění kódu, CradleNetwork Simulation Cradle, schopnost vytvářet nové vazby Pythonu a různé „aplikace ns-3“.

Poznámka
CradleNetwork Simulation Cradle je rámec, který vám umožňuje používat skutečné síťové zásobníky TCP/IP v simulátoru sítě.

Pokud očekáváte, že vaše instalace ns-3 bude mít pokročilé nebo další funkce, můžete postupovat podle této instalační cesty.

V nejnovějších verzích ns-3 Upéct byla přidána k uvolnění dehtu. Vydání obsahuje konfigurační soubor, který vám umožňuje stáhnout aktuální verze softwaru v době vydání. Tedy například verze Upéct, který je distribuován s vydáním ns-3.29, lze použít k načtení komponent pro toto vydání ns-3 nebo starší, ale nelze jej použít k načtení komponent pro pozdější vydání (pokud soubor popisu balíčku bakeconf.xml neaktualizováno).

Můžete také získat nejnovější kopii upéctzadáním následujícího příkazu do konzole Linuxu (za předpokladu, že máte nainstalovaný Git):

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

Když spustíte příkaz git, měli byste vidět něco jako následující:

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.

Po dokončení příkazu klonovat měli byste mít pojmenovaný adresář upéct, jehož obsah by měl vypadat nějak takto:

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

Všimněte si, že jste nahráli několik skriptů Python, pojmenovaný modul Python upéct a konfigurační soubor XML. Dalším krokem je použití těchto skriptů ke stažení a sestavení distribuce ns-3 dle vašeho výběru. K dispozici je několik cílů přizpůsobení:

  1. ns-3.29: modul odpovídající vydání; stáhne komponenty podobné verzi v tarballu;

  2. ns-3-dev: podobný modul, ale používající kód z vývojového stromu;

  3. ns-allinon-3.29: Modul, který obsahuje další doplňkové funkce, jako je směrování kliknutí a kolébka simulace sítě, Openflow pro ns-3.

  4. ns-3-allinon: podobná verzi modulu allinone, ale pro vývojový kód.

Poznámka
klikněte — modulární softwarová architektura pro vytváření směrovačů.

Openflow je protokol pro řízení procesu zpracování dat přenášených přes datovou síť směrovači a přepínači, implementující softwarově definovanou síťovou technologii.

Aktuální vývojový snímek (nevydání) ns-3 lze nalézt na:https://gitlab.com/nsnam/ns-3-dev.git.

Vývojáři se snaží udržovat tato úložiště v konzistentním funkčním stavu, ale jsou ve vývojové oblasti a obsahují nevydaný kód, takže pokud neplánujete používat nové funkce, vyberte oficiální vydání.

Nejnovější verzi kódu můžete najít procházením seznamu úložišť nebo na webové stránce ns-3 Releases:https://www.nsnam.org/releases/ a kliknutím na odkaz na nejnovější verzi. V tomto příkladu budeme pokračovat s ns-3.29.

Nyní, abychom získali komponenty ns-3, které potřebujeme, použijeme nástroj Upéct. Řekněme si pár slov na úvod k dílu Upéct.

Bake funguje načítáním zdrojů balíčků do adresáře zdroj a instalaci knihoven do adresáře sestavení. Upéct lze spustit odkazem na binární soubor, ale pokud chcete spustit Upéct ne z adresáře, do kterého byl stažen, je vhodné přidat cestu ke upéct k vaší cestě (proměnná prostředí PATH), například takto (příklad pro Linux bash shell). Přejděte do adresáře "bake" a poté nastavte následující proměnné prostředí:

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

Tím se program umístí upéct.py k cestě shellu a umožní ostatním programům najít spustitelné soubory a knihovny, které vytvořil upéct. V některých případech použití upéct, výše popsané nastavení PATH a PYTHONPATH není vyžadováno, ale kompletní sestavení ns-3-allinone (s dalšími balíčky) jej obvykle vyžaduje.

Přejděte do svého pracovního adresáře a do konzoly zadejte následující:

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

Dále se budeme ptát Upéct zkontrolujte, zda máme dostatek nástrojů k načtení různých komponent. Vytočit:

$ ./bake.py check

Měli byste vidět něco jako následující:

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

V tomto kroku jsou nezbytné zejména nástroje pro nahrávání, jako je Mercurial, CVS, Git a Bazaar, protože nám umožňují získat kód. V tomto okamžiku nainstalujte chybějící nástroje obvyklým způsobem pro váš systém (pokud víte jak) nebo se požádejte o pomoc správce systému.

Dále zkuste stáhnout software:

$ ./bake.py download

výsledek by měl být něco jako:

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

To znamená, že byly staženy tři zdroje. Nyní přejděte do zdrojového adresáře a zadejte ls; Měl bys vidět:

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

Nyní jste připraveni vytvořit distribuci ns-3.

3.4 Montáž ns-3

Stejně jako u stahování ns-3 existuje několik způsobů, jak sestavit ns-3. Hlavní věc, kterou chceme zdůraznit, je, že ns-3 je sestaven pomocí nástroje pro sestavení tzv Wafpopsané níže. Většina uživatelů bude pracovat s Waf, ale existuje několik užitečných skriptů, které vám pomohou začít nebo organizovat složitější sestavení. Takže prosím, než o tom budete číst Waf, Podívejte se na build.py a montáž s upéct.

3.4.1 Budova s ​​build.py

Varování! Tento krok sestavení je dostupný pouze z verze zdrojového archivu získané výše popsaným způsobem; a nestahují se přes git nebo bake.

Při práci s archivem vydání tarballV ns-3-allinon Existuje praktický skript, který může usnadnit sestavení komponent. Jmenuje se build.py. Tento program za vás nastaví projekt tím nejužitečnějším způsobem. Pamatujte však, že pokročilejší nastavení a práce s ns-3 obvykle zahrnuje použití vlastního systému sestavování ns-3, Waf, který bude představen později v tomto tutoriálu.

Pokud jste stáhli pomocí tarballa poté ve vašem adresáři ~/pracovní prostor adresář s názvem něco jako ns-allinon-3.29. Zadejte následující:

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

Při zavolání build.py Použili jsme argumenty příkazového řádku k vytvoření příkladů a testů použitých v tomto tutoriálu, které nejsou standardně sestaveny v ns-3. Ve výchozím nastavení program také sestaví všechny dostupné moduly. Pak, pokud si přejete, můžete sestavit ns-3 bez příkladů a testů, nebo vyloučit moduly, které pro vaši práci nepotřebujete.

Uvidíte spoustu výstupních zpráv kompilátoru zobrazených skriptem při vytváření různých částí, které jste načetli. Nejprve se skript pokusí postavit animátor netaním, pak generátor vazby pybindgen a nakonec ns-3. Po dokončení procesu byste měli vidět následující:

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

V posledních třech řádcích výpisu vidíme zprávu o modulech, které nebyly sestaveny:

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

To jednoduše znamená, že některé moduly ns-3, které jsou závislé na externích knihovnách, nemusely být sestaveny nebo že se pro tuto konfiguraci nevyžaduje jejich sestavování. To neznamená, že simulátor není sestaven nebo že sestavené moduly nebudou správně fungovat.

3.4.2 Budování pomocí Bake

Pokud jste použili bake výše k získání zdrojového kódu z repozitářů projektu, můžete jej nadále používat k sestavení ns-3. Vytočit:

$ ./bake.py build

a měli byste vidět něco jako:

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

Popisek: Můžete také provést kroky stahování i sestavení najednou voláním „bake.py deploy“.

Sestavení všech komponent může selhat, ale pokud komponenta není vyžadována, bude montáž pokračovat. Například nedávný problém s přenositelností byl takový castxml lze sestavit pomocí nástroje upéct ne na všech platformách. V tomto případě se zobrazí zpráva podobná této:

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

Ale castxml potřeba pouze v případě, že chcete vytvořit aktualizované vazby Pythonu. Pro většinu uživatelů to není potřeba (alespoň dokud nezmění ns-3), takže taková varování lze prozatím bezpečně ignorovat.

Pokud selže, následující příkaz vám dá nápovědu o chybějících závislostech:

$ ./bake.py show

Zobrazí se různé závislosti balíčků, které se pokoušíte sestavit.

3.4.3 Sestavení pomocí Waf

Až do tohoto okamžiku jsme k zahájení sestavování ns-3 používali buď skript build.py, nebo nástroj upéct. Tyto nástroje jsou užitečné pro vytváření ns-3 a údržbu knihoven. Ve skutečnosti při sestavování spouštějí nástroj pro sestavení Waf z adresáře ns-3. Waf nainstalován se zdrojovým kódem ns-3. Většina uživatelů rychle přejde k přímému použití ke konfiguraci a sestavení ns‑3 Waf. Chcete-li tedy pokračovat, přejděte do adresáře ns-3, který jste původně vytvořili.

V tuto chvíli to není striktně vyžadováno, ale bude užitečné trochu ustoupit a podívat se, jak provést změny v konfiguraci projektu. Pravděpodobně nejužitečnější změnou konfigurace, kterou můžete provést, je vytvoření optimalizované verze kódu. Ve výchozím nastavení jste svůj projekt nakonfigurovali tak, aby vytvořil ladicí verzi. Pojďme se podívat na projekt vytvoření optimalizovaného sestavení. Abyste Wafu vysvětlili, že by měl vytvářet optimalizovaná sestavení, která obsahují příklady a testy, budete muset spustit následující příkazy:

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

Tím se spustí Waf mimo místní adresář (pro vaše pohodlí). První příkaz vyčistí předchozí sestavení, obvykle to není nezbytně nutné, ale je to dobrá praxe (viz také profily sestavení níže); tím se odstraní dříve vytvořené knihovny a soubory objektů umístěné v adresáři stavět/. Když je projekt překonfigurován a sestavovací systém zkontroluje různé závislosti, měli byste vidět výstup podobný následujícímu:

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)

Všimněte si prosím poslední části výše uvedeného seznamu. Některé možnosti ns-3 nejsou ve výchozím nastavení povoleny nebo vyžadují podporu systému, aby správně fungovaly. Chcete-li například povolit XmlTo, musí být knihovna přítomna v systému libxml-2.0. Pokud tato knihovna nebyla nalezena a odpovídající funkce ns-3 nebyla povolena, zobrazí se zpráva. Všimněte si také, že je možné použít příkaz sudo pro nastavení bitu suid „nastavení ID skupiny za běhu“ pro určité programy. Ve výchozím nastavení není povolena, a proto se tato funkce zobrazuje jako „nepovolená“. Nakonec, chcete-li získat seznam povolených možností, použijte Waf s parametrem --check-config.

Nyní se vraťme a přepněte zpět na sestavení ladění obsahující příklady a testy.

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

Systém sestavení je nyní nastaven a můžete sestavit ladicí verze programů ns-3 jednoduchým zadáním:

$ ./waf

Výše uvedené kroky vás možná donutily sestavit část systému ns-3 dvakrát, ale nyní víte, jak změnit konfiguraci a vytvořit optimalizovaný kód.

Chcete-li zkontrolovat, který profil je aktivní pro danou konfiguraci projektu, existuje příkaz:

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

Výše uvedený scénář build.py podporuje i argumenty --enable-examples и --enable-tests, ale další možnosti Waf nepodporuje přímo. Například toto nebude fungovat:

$ ./build.py --disable-python

reakce bude taková:

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

K předávání dalších parametrů však lze použít speciální operátor - - WAFtakže místo výše uvedeného bude fungovat následující příkaz:

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

protože generuje hlavní příkaz ./waf configure --disable-python. Zde je několik dalších úvodních tipů o Waf.

Ošetření chyb sestavení

Vydání ns-3 jsou testována na nejnovějších kompilátorech C++ dostupných v době vydání na běžných distribucích Linuxu a MacOS. Postupem času však vycházejí nové distribuce s novými kompilátory a tyto novější kompilátory mají tendenci být k varováním pedantičtější. ns-3 nakonfiguruje své sestavení tak, aby všechna varování považovala za chyby, takže někdy, pokud používáte starší verzi na novějším systému, může varování kompilátoru zastavit sestavení.

Například dříve existovalo vydání ns‑3.28 pro Fedoru 28, které zahrnovalo novou hlavní verzi gcc (gcc-8). Při vytváření vydání ns-3.28 nebo starších verzí pod Fedora 28 s nainstalovaným Gtk2+ dojde k následující chybě:

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

Ve verzích počínaje ns‑3.28.1, in Waf existuje možnost řešení těchto problémů. Zakáže nastavení příznaku "-Werror" v g++ a clang++. Toto je možnost "--disable-werror" a musí být použita během konfigurace:

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

Nakonfigurujte nebo sestavte

Některé příkazy Waf mají význam pouze ve fázi konfigurace a některé jsou platné pouze ve fázi sestavení. Pokud například chcete používat funkce emulace ns-3, můžete povolit nastavení bitů suid pomocí sudo, jak je popsáno výše. Tím přepíšete příkazy konfiguračního kroku, a proto můžete konfiguraci změnit pomocí následujícího příkazu, který také obsahuje příklady a testy.

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

Pokud to uděláte Waf se spustí sudozměnit programy pro vytváření soketů emulačního kódu tak, aby se spouštěly s oprávněními kořen. V Waf Pro kroky konfigurace a sestavení je k dispozici mnoho dalších možností. Chcete-li prozkoumat své možnosti, zadejte:

$ ./waf --help

V další části použijeme některé možnosti související s testováním.

Montážní profily

Již jsme viděli, jak můžete nakonfigurovat Waf pro montáže ladit и optimalizované:

$ ./waf --build-profile=debug

K dispozici je také mezilehlý montážní profil, uvolněte. Volba -d je synonymem pro --build-profile. Profil sestavení řídí použití protokolování, asercí a přepínačů optimalizace kompilátoru:

Výukový program síťového simulátoru ns-3. Kapitola 3

Jak vidíte, protokolování a aserce jsou k dispozici pouze v sestaveních ladění. Doporučená praxe je vyvinout skript v režimu ladění a poté provést opakované spuštění (pro statistiky nebo změny parametrů) v optimalizovaném profilu sestavení.

Pokud máte kód, který by se měl spouštět pouze v určitých profilech sestavení, použijte makro obálky kódu:

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

výchozí, Waf umístí artefakty sestavení do adresáře sestavení. Pomocí této volby můžete určit jiný výstupní adresář - -out, Například:

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

Když to zkombinujete s profily sestavení, můžete snadno přepínat mezi různými možnostmi kompilace:

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

Což vám umožňuje pracovat s více sestavami, aniž byste museli pokaždé přepisovat nejnovější sestavu. Když přepnete na jiný profil, Waf zkompiluje pouze jej, aniž by kompletně překompiloval vše.

Když přepínáte profily sestavení tímto způsobem, musíte být opatrní, abyste pokaždé poskytli stejné možnosti konfigurace. Definování několika proměnných prostředí vám pomůže vyhnout se chybám:

$ 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

Kompilátory a příznaky

Ve výše uvedených příkladech Waf k sestavení ns-3 používá kompilátor C++ z GCC ( g ++). Můžete však změnit ten, který používáte Waf C++ kompilátor definováním proměnné prostředí CXX. Chcete-li například použít kompilátor C++ Clang, clang++,

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

Stejným způsobem můžete konfigurovat Waf použít distribuovanou kompilaci pomocí distcc:

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

Více informací o distcc a distribuované kompilaci naleznete na stránce projektu v sekci Dokumentace. Chcete-li při konfiguraci ns-3 přidat příznaky kompilátoru, použijte proměnnou prostředí CXXFLAGS_EXTRA.

Instalace

Waf lze použít k instalaci knihoven na různá místa v systému. Ve výchozím nastavení jsou zkompilované knihovny a spustitelné soubory umístěny v adresáři stavěta protože Waf zná umístění těchto knihoven a spustitelných souborů, není třeba instalovat knihovny nikam jinam.

Pokud uživatelé dávají přednost instalaci mimo adresář sestavení, mohou příkaz spustit ./waf instalace. Výchozí předpona pro instalaci je / usr / localTak ./waf instalace nainstaluje programy do / usr / local / bin, knihovny v / usr / local / lib a hlavičkové soubory v /usr/local/include. Práva superuživatele je obvykle třeba nastavit s výchozí předponou, takže typický příkaz by byl instalace sudo ./waf. Po spuštění se Waf nejprve rozhodne použít sdílené knihovny v adresáři sestavení a poté vyhledá knihovny podél cesty ke knihovnám nakonfigurovaným v místním prostředí. Při instalaci knihoven do systému je tedy dobrým zvykem zkontrolovat, zda jsou používány správné knihovny. Uživatelé si mohou zvolit instalaci s jinou předponou tím, že předají volbu během konfigurace --prefix, Například:

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

Pokud později, po sestavení, uživatel zadá příkaz k instalaci ./waf, použije se předpona /opt/local.

Tým ./waf clean musí být použit před překonfigurováním projektu, pokud bude instalace používat Waf pod jinou předponou.

Pro použití ns-3 tedy není potřeba volat ./waf install. Většina uživatelů nebude tento příkaz potřebovat, protože Waf převezme aktuální knihovny z adresáře sestavení, ale některým uživatelům to může být užitečné, pokud jejich činnosti zahrnují práci s programy mimo adresář ns-3.

Waf singl

Na nejvyšší úrovni zdrojového stromu ns-3 je pouze jeden skript Waf. Jakmile začnete pracovat, strávíte v adresáři spoustu času scratch/ nebo hloubějisrc/... a zároveň musí běžet Waf. Můžete si jen vzpomenout, kde jste, a utéct Waf takto:

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

ale to bude zdlouhavé a náchylné k chybám, takže existují lepší řešení. Jedním z běžných způsobů je použití textového editoru jako např emacs nebo elán, ve kterém jsou otevřeny dvě terminálové relace, jedna se používá k sestavení ns-3 a druhá se používá k úpravě zdrojového kódu. Pokud jen máte tarball, pak proměnná prostředí může pomoci:

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

$ cd scratch 
$ waff build

V adresáři modulu může být lákavé přidat triviální skript waf, jako je exec ../../waf. Prosím nedělej to. To je pro nováčky matoucí a při špatném provedení to vede k těžko odhalitelným chybám sestavení. Výše uvedená řešení představují cestu, která by měla být použita.

3.5 Testování ns-3

Jednotkové testy distribuce ns-3 můžete spustit spuštěním skriptu ./test.py:

$ ./test.py

Tyto testy probíhají souběžně s Waf. Nakonec byste měli vidět zprávu:

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

Toto je důležitá zpráva pro identifikaci pádů, pádů nebo chyb valgrindu, což naznačuje problémy s kódem nebo nekompatibilitu mezi nástroji a kódem.

Uvidíte také konečný výstup z Waf a tester spouštějící každý test, který bude vypadat nějak takto:

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)

Tento příkaz obvykle spouští uživatelé, aby rychle ověřili, že je distribuce ns-3 sestavena správně. (Všimněte si, že pořadí řádků "PASS: ..." se může lišit, to je normální. Důležité je, že souhrnný řádek na konci zprávy ukazuje, že všechny testy prošly úspěšně; žádné testy se nezdařily ani nezhroutily.) A WafA test.py bude paralelizovat práci napříč dostupnými procesorovými jádry stroje.

3.6 Spuštění skriptu

Obvykle spouštíme skripty pod kontrolou Waf. To umožňuje systému sestavení zajistit, aby cesty ke sdíleným knihovnám byly nastaveny správně a aby byly knihovny dostupné za běhu. Pro spuštění programu stačí použít Waf s parametrem - -run. Spustíme ekvivalent ns-3 všudypřítomného programu hello worldzadáním následujícího:

$ ./waf --run hello-simulator

Waf nejprve zkontroluje, zda je program sestaven správně, a v případě potřeby sestaví. Pak Waf spustí program, který vytvoří následující výstup.

Hello Simulator

Gratulujeme! Nyní jste uživatelem ns-3!

Co mám dělat, když nevidím výsledky?

Pokud vidíte zprávy Wafcož znamená, že sestavení bylo úspěšně dokončeno, ale nevidíte výstup "Ahoj simulátor", pak je možné, že v sekci [Build-with-Waf] jste přepnuli svůj režim sestavení optimalizované, ale zmeškal přepnutí zpět do režimu ladit. Veškerý výstup konzoly použitý v tomto kurzu používá speciální komponentu ns-3, která provádí protokolování a používá se k tisku vlastních zpráv do konzoly. Výstup z této komponenty je automaticky deaktivován při kompilaci optimalizovaného kódu – je „optimalizován“. Pokud nevidíte výstup „Hello Simulator“, zadejte následující:

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

konfigurovat Waf vytvářet ladicí verze programů ns-3, které zahrnují příklady a testy. Poté byste měli znovu sestavit aktuální verzi ladění kódu zadáním

$ ./waf

Nyní, pokud spustíte program ahoj-simulátor, měli byste vidět očekávaný výsledek.

3.6.1 Argumenty příkazového řádku

Chcete-li předat argumenty příkazového řádku programu ns-3, použijte následující vzor:

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

Nahradit na název vašeho programu a na argumenty. Argument - -command-template pro Waf je v podstatě recept na sestavení skutečného příkazového řádku Waf slouží ke spuštění programu. Waf zkontroluje, že je sestavení dokončeno, nastaví cesty ke sdílené knihovně, poté použije poskytnutou šablonu příkazového řádku a nahradí zástupný symbol %s jménem programu pro volání spustitelného souboru. Pokud vám tato syntaxe připadá složitá, existuje jednodušší verze, která zahrnuje program ns-3 a jeho argumenty uzavřené v jednoduchých uvozovkách:

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

Dalším zvláště užitečným příkladem je selektivní spouštění testovacích sad. Předpokládejme, že existuje testovací sada nazvaná mytest (ve skutečnosti neexistuje). Výše jsme použili skript ./test.py ke spuštění řady testů paralelně, který opakovaně volá testovací program testovací běžec. Volání testovací běžec přímo ke spuštění jednoho testu:

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

Argumenty budou předány programu testovací běžec. Protože mytest neexistuje, vygeneruje se chybová zpráva. Chcete-li vytisknout dostupné možnosti testovacího běhu, zadejte:

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

3.6.2 Ladění

Chcete-li spustit programy ns-3 pod jiným nástrojem, jako je debugger (např. gdb) nebo nástroj na testování paměti (např. valgrind), použijte podobný formulář - -command-template = "…". Například ke spuštění v debuggeru gdb váš program hello-simulator ns-3 s argumenty:

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

Všimněte si, že název programu ns-3 je dodáván s argumentem - -runa nástroj pro správu (zde gdb) je první token v argumentu - -command-template. Volba - -args zprávy gdbže zbytek příkazového řádku patří „nižšímu“ programu. (Některé verze gdb nerozumím možnosti - -args. V tomto případě odeberte argumenty programu z - -command-template a použijte sadu příkazů gdb args.) Můžeme zkombinovat tento recept a předchozí a spustit test pod debuggerem:

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

3.6.3 Pracovní adresář

Waf by měl být vypuštěn ze svého umístění v horní části stromu ns-3. Tato složka se stane pracovním adresářem, kam se budou zapisovat výstupní soubory. Ale co když chcete tyto soubory ponechat mimo zdrojový strom ns-3? Použijte argument - -cwd:

$ ./waf --cwd=...

Možná bude pro vás pohodlnější získat výstupní soubory ve vašem pracovním adresáři. V tomto případě může pomoci následující nepřímá akce:

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

Tato dekorace předchozí verze příkazu zachová aktuální pracovní adresář, přejde do adresáře Wafa pak dává pokyn Waf změnit pracovní adresář zpět na aktuální pracovní adresář uložený před spuštěním programu. Zmiňujeme tým - -cwd Pro úplnost, většina uživatelů jednoduše spustí Waf z adresáře nejvyšší úrovně a vygeneruje výstupní soubory tam.

Pokračování: Kapitola 4

Zdroj: www.habr.com

Přidat komentář