Урок за симулатор на мрежа ns-3. Глава 3

Урок за симулатор на мрежа ns-3. Глава 3
глава 1,2

3 Първи стъпки
3.1 Преглед
3.2 Предварителни условия
3.2.1 Изтегляне на изданието ns-3 като изходен архив
3.3 Изтегляне на ns-3 с помощта на Git
3.3.1 Зареждане на ns-3 с помощта на Bake
3.4 Монтаж ns-3
3.4.1 Изграждане с build.py
3.4.2 Изграждане с Bake
3.4.3 Създаване с Waf
3.5 Тестване на ns-3
3.6 Изпълнение на скрипта
3.6.1 Аргументи на командния ред
3.6.2 Отстраняване на грешки
3.6.3 Работна директория

Глава 3

Приготвяме се да започнем

Тази глава има за цел да подготви читателя да започне с компютър, който може никога да не е инсталирал ns-3. Той обхваща поддържаните платформи, предпоставки, как да получите ns-3, как да изградите ns-3 и как да тествате вашата компилация и стартиране на прости програми.

3.1 Преглед

Симулаторът ns-3 е изграден като система от софтуерни библиотеки за сътрудничество. По време на асемблирането кодът на потребителските програми се свързва с тези библиотеки. Езиците за програмиране C++ или Python се използват за писане на потребителски програми.

Ns-3 се разпространява като изходен код, което означава, че целевата система трябва да има среда за разработка на софтуер, за да се изградят първо библиотеките и след това потребителската програма. По принцип ns-3 могат да се разпространяват като готови библиотеки за конкретна система и в бъдеще може да се разпространяват по този начин. Но в днешно време много потребители всъщност вършат работата си, като редактират самия ns-3, така че е полезно да имате изходния код за изграждане на библиотеките. Ако някой желае да поеме работата по създаването на готови библиотеки и пакети за операционни системи, моля, свържете се с пощенския списък ns-разработчици.

След това ще разгледаме три начина за изтегляне и изграждане на ns-3. Първият е да изтеглите и изградите официалната версия от основния сайт. Вторият е изборът и сглобяването на копия на развойните версии на основната инсталация ns-3. Третото е да използвате допълнителни инструменти за изграждане, за да заредите повече разширения за ns-3. Ще разгледаме всеки от тях, тъй като инструментите са малко по-различни.

Опитните потребители на Linux може да се чудят защо ns-3 не се предоставя като пакет като повечето други библиотеки, които използват мениджър на пакети? Въпреки че има двоични пакети за различни Linux дистрибуции (напр. Debian), повечето потребители в крайна сметка редактират библиотеките и трябва сами да възстановят ns-3, така че наличието на изходния код е удобно. Поради тази причина ще се съсредоточим върху инсталирането от източника.

За повечето приложения ns-3 права корен не са необходими, препоръчително е да използвате непривилегирован потребителски акаунт.

3.2 Предварителни условия

Целият набор от налични ns-3 библиотеки има редица зависимости от библиотеки на трети страни, но в по-голямата си част ns-3 може да се изгради и използва с поддръжка на няколко общи (често инсталирани по подразбиране) компонента: C++ компилатор, Python, редактор на изходен код (напр. Vim, Emacs или Затъмнение) и, ако се използват хранилища за разработка, Git системи за контрол на версиите. Повечето потребители за първи път няма да се притесняват, ако конфигурацията им докладва, че липсват някои разширени функции на ns-3, но за тези, които искат пълна инсталация, проектът предоставя wiki, което включва страници с много полезни съвети и трикове. Една такава страница е страницата за инсталиране с инструкции за инсталиране за различни системи, достъпна на: https://www.nsnam.org/wiki/Installation.

Разделът Предпоставки на тази wiki обяснява кои пакети са необходими за поддържане на общи опции за ns-3 и също така предоставя командите, използвани за инсталирането им в общи разновидности на Linux или macOS.

Можете да се възползвате от тази възможност, за да разгледате wiki страницата на ns-3 или основния уебсайт: https://www.nsnam.org, защото там има много информация. Започвайки с най-новата версия на ns-3 (ns-3.29), за стартиране на ns-3 са необходими следните инструменти:

Пакет с инструменти/Версия

  • C++ компилатор
    clang++ или g++ (g++ версия 4.9 или по-нова)
  • Питон
    python2 версия >= 2.7.10 или python3 версия >=3.4
  • отивам
    всяка последна версия (за достъп до ns-3 на GitLab.com)
  • катран
    всяка най-нова версия (за разопаковане на версия ns‑3)
  • bunzip2
    всяка последна версия (за разопаковане на изданието ns‑3)

За да проверите версията по подразбиране на Python, въведете python -V. За да проверите версията на g++, въведете g++ -v. Ако някои инструменти липсват или са твърде стари, моля, направете справка с ръководството за инсталиране на wiki страницата ns-3.

Отсега нататък приемаме, че четецът работи с Linux, MacOS или Linux емулатор и разполага поне с горните инструменти.

3.2.1 Изтегляне на изданието ns-3 като изходен архив

Това е курсът на действие за нов потребител, който иска да изтегли и експериментира с най-новата версия и пакетни версии на ns-3. Изданията ns-3 се публикуват като архиви с компресиран източник, понякога наричани тарбол. тарбол е специален софтуерен архивен формат, в който няколко файла се комбинират заедно. Архивът обикновено е компресиран. Процес на стартиране на ns-3 чрез тарбол е проста, просто трябва да изберете издание, да го изтеглите и разопаковате.

Да предположим, че вие, като потребител, искате да изградите ns-3 в локална директория, наречена работно пространство. Можете да получите работно копие на изданието, като въведете следното в конзолата на Linux (като замените съответните номера на версията, разбира се)

$ 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 

Обърнете внимание на използваната по-горе програма Wget, който е инструмент от командния ред за изтегляне на обекти от Интернет. Ако не сте го инсталирали, можете да използвате браузъра си за това.

Следвайки тези стъпки, ще ви отведе до директорията ns-allinone-3.29, там трябва да видите няколко файла и директории

$ 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

Вече сте готови да изградите базовата дистрибуция ns-3 и можете да преминете към раздела за изграждане на ns-3.

3.3 Изтегляне на ns-3 с помощта на Git

Кодът ns-3 е достъпен в Git хранилищата на GitLab.com на адрес https://gitlab.com/nsnam/. Група nsnam обединява различните хранилища, използвани от проект с отворен код.

Най-лесният начин да започнете да използвате Git хранилища е да разклоните или клонирате средата ns-3-алинон. Това е набор от скриптове, които управляват зареждането и асемблирането на най-често използваните ns-3 подсистеми. Ако сте нов в Git, термините "форк" и "клонинг" може да са ви непознати; ако е така, препоръчваме ви просто да клонирате (направите свое собствено копие) хранилището, намиращо се на GitLab.com по следния начин:

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

На този етап изгледът на вашата директория ns-3-алинон малко по-различен от директорията за архивиране на версиите, описана по-горе. Трябва да изглежда нещо подобно:

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

Моля, имайте предвид, че има скрипт изтегляне.py, който допълнително ще извлече ns-3 и придружаващия го изходен код. Тук имате избор: или изтеглете най-новата моментна снимка на разработката на ns-3:

$ python download.py

или предпочитайте изданието ns-3, като използвате флага -n за да посочите номера на изданието:

$ python download.py -n ns-3.29

След тази стъпка към директорията ns-3-алинон ще бъдат изтеглени допълнителни хранилища ns-3, пекат, pybindgen и нетаним.

Внимание
На машина с чист Ubuntu16.04 трябваше да променя командата на следното: $ sudo python3 download.py -n ns-3.29 (по-нататък бележки на преводача).

3.3.1 Зареждане на ns-3 с помощта на Bake

Горните два метода (изходен архив или хранилище ns-3-алинон чрез Git) са полезни за получаване на най-простата ns-3 инсталация с множество добавки (pybindgen за генериране на Python свързвания и нетаним за мрежова анимация). Третото хранилище, предоставено по подразбиране в ns-3-allinone, се извиква пекат.

пека е инструмент за координирано изграждане на софтуер от множество хранилища, разработен за проекта ns-3. пека може да се използва за получаване на версии за разработка на ns-3, както и за изтегляне и изграждане на разширения на базовата версия на разпространението ns-3, като например средата Директно изпълнение на код, CradleNetwork Симулационна люлка, възможността за създаване на нови обвързвания на Python и различни ns-3 „приложения“.

Внимание
CradleNetwork Simulation Cradle е рамка, която ви позволява да използвате реални TCP/IP мрежови стекове в мрежов симулатор.

Ако очаквате вашата инсталация ns-3 да има разширени или допълнителни функции, можете да следвате този път за инсталиране.

В най-новите версии на ns-3 пека беше добавен към изданието tar. Изданието включва конфигурационен файл, който ви позволява да изтеглите текущите версии на софтуера към момента на издаването. Такава е например версията пека, който се разпространява с версия ns-3.29, може да се използва за извличане на компоненти за тази версия на ns-3 или по-ранна, но не може да се използва за извличане на компоненти за по-късни версии (ако файлът с описание на пакета bakeconf.xml не е актуализиран).

Можете също да получите най-новото копие пекаткато въведете следната команда във вашата Linux конзола (при положение, че имате инсталиран Git):

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

Когато изпълните командата git, трябва да видите нещо като следното:

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.

След като командата приключи клонинг трябва да имате директория с име пекат, чието съдържание трябва да изглежда така:

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

Имайте предвид, че сте заредили няколко Python скрипта, Python модул с име пекат и XML конфигурационен файл. Следващата стъпка е да използвате тези скриптове, за да изтеглите и изградите ns-3 дистрибуцията по ваш избор. Налични са няколко цели за персонализиране:

  1. ns-3.29: модул, съответстващ на изданието; ще изтегли компоненти, подобни на изданието в tarball;

  2. ns-3-dev: подобен модул, но използващ код от дървото за разработка;

  3. ns-алинон-3.29: Модул, който включва други допълнителни функции като маршрутизиране на щракване и люлка за мрежова симулация, Openflow за ns-3.

  4. ns-3-алинон: подобно на версията за освобождаване на модула AllInOne, но за код за разработка.

Внимание
Кликнете — модулна софтуерна архитектура за създаване на рутери.

Openflow е протокол за управление на процеса на обработка на данни, предавани през мрежа за данни от рутери и комутатори, прилагайки софтуерно дефинирана мрежова технология.

Моментната снимка на текущата разработка (неиздавана) ns-3 може да бъде намерена на:https://gitlab.com/nsnam/ns-3-dev.git.

Разработчиците се опитват да поддържат тези хранилища в последователен работен ред, но те са в зоната за разработка и съдържат непубликуван код, така че ако не планирате да използвате нови функции, изберете официалната версия.

Можете да намерите най-новата версия на кода, като прегледате списъка с хранилища или като отидете на уеб страницата на ns-3 Releases:https://www.nsnam.org/releases/ и щракнете върху връзката към най-новата версия. В този пример ще продължим с ns-3.29.

Сега, за да получим компонентите ns-3, от които се нуждаем, ще използваме инструмента пека. Нека кажем няколко уводни думи за работата пека.

Bake работи, като зарежда източници на пакети в директория източник и инсталиране на библиотеките в директорията за изграждане. пека може да се стартира чрез препратка към двоичния файл, но ако искате да стартирате пека не от директорията, в която е изтеглен, препоръчително е да добавите пътя към пекат към вашия път (променлива на средата PATH), например както следва (пример за Linux bash shell). Отидете в директорията "bake" и след това задайте следните променливи на средата:

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

Това ще постави програмата bake.py към пътя на обвивката и ще позволи на други програми да намерят изпълнимите файлове и библиотеките, които е създал пекат. В някои случаи на употреба пекат, настройката PATH и PYTHONPATH, описана по-горе, не се изисква, но пълната компилация на ns-3-allinone (с допълнителни пакети) обикновено го изисква.

Отидете в работната си директория и въведете следното в конзолата:

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

След това ще питаме пека проверете дали имаме достатъчно инструменти за зареждане на различните компоненти. Циферблат:

$ ./bake.py check

Трябва да видите нещо като следното:

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

По-специално, инструменти за качване като Mercurial, CVS, Git и Bazaar са от съществено значение в тази стъпка, тъй като ни позволяват да получим кода. На този етап инсталирайте липсващите инструменти по обичайния начин за вашата система (ако знаете как) или се свържете с вашия системен администратор за помощ.

След това опитайте да изтеглите софтуера:

$ ./bake.py download

резултатът трябва да е нещо като:

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

Това ще означава, че са изтеглени три източника. Сега отидете в изходната директория и въведете ls; Трябва да видиш:

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

Сега сте готови да изградите дистрибуцията ns-3.

3.4 Монтаж ns-3

Както при изтеглянето на ns-3, има няколко начина за изграждане на ns-3. Основното нещо, което искаме да подчертаем е, че ns-3 е изграден с помощта на инструмент за изграждане, наречен Wafописани по-долу. Повечето потребители ще работят с Waf, но има няколко удобни скрипта, които да ви помогнат да започнете или да организирате по-сложни компилации. Така че, моля, преди да прочетете за Waf, погледни build.py и монтаж с пекат.

3.4.1 Изграждане с build.py

Внимание! Тази стъпка на изграждане е достъпна само от изходната архивна версия, получена, както е описано по-горе; и не е изтеглен чрез git или bake.

Когато работите с архив на версиите тарбол, Аз Н ns-3-алинон Има удобен скрипт, който може да улесни сглобяването на компонентите. Нарича се build.py. Тази програма ще настрои проекта за вас по най-полезния начин. Обърнете внимание обаче, че по-усъвършенстваната настройка и работа с ns-3 обикновено включва използването на собствената система за изграждане на ns-3, Waf, която ще бъде представена по-късно в този урок.

Ако сте изтеглили с помощта на тарбол, след това във вашата директория ~/работно пространство директория с име нещо като ns-алинон-3.29. Въведете следния:

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

При обаждане build.py Използвахме аргументи на командния ред, за да изградим примерите и тестовете, използвани в този урок, които не са изградени по подразбиране в ns-3. По подразбиране програмата изгражда и всички налични модули. След това, ако желаете, можете да изградите ns-3 без примери и тестове или да изключите модули, които не са необходими за вашата работа.

Ще видите много изходни съобщения на компилатора, показани от скрипта, докато изгражда различните части, които сте заредили. Първо скриптът ще се опита да създаде аниматора нетаним, след това генераторът на свързване pybindgen и накрая ns-3. Когато процесът приключи, трябва да видите следното:

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

В последните три реда на списъка виждаме съобщение за модули, които не са изградени:

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

Това просто означава, че някои модули ns-3, които зависят от външни библиотеки, може да не са изградени или че не е необходимо да бъдат изградени за тази конфигурация. Това не означава, че симулаторът не е сглобен или че сглобените модули няма да работят правилно.

3.4.2 Изграждане с Bake

Ако сте използвали bake по-горе, за да получите изходния код от хранилищата на проекта, можете да продължите да го използвате за изграждане на ns-3. Циферблат:

$ ./bake.py build

и трябва да видите нещо като:

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

помощ: Можете също така да извършите едновременно стъпките за изтегляне и изграждане, като извикате „bake.py deploy“.

Сглобяването на всички компоненти може да е неуспешно, но сглобяването ще продължи, ако компонент не е необходим. Например скорошен проблем с преносимостта беше това castxml може да се сглоби с инструмент пекат не на всички платформи. В този случай ще се появи съобщение като това:

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

Но castxml необходим само ако искате да създадете актуализирани обвързвания на Python. За повечето потребители няма нужда от това (поне докато не сменят ns-3), така че подобни предупреждения могат спокойно да бъдат игнорирани засега.

Ако не успее, следната команда ще ви даде намек за липсващи зависимости:

$ ./bake.py show

Ще бъдат изброени различните зависимости на пакетите, които се опитвате да създадете.

3.4.3 Създаване с Waf

До този момент, за да започнем изграждането на ns-3, използвахме или скрипта build.py, или инструмент пекат. Тези инструменти са полезни за изграждане на ns-3 и поддържане на библиотеки. Всъщност, за изграждане те стартират инструмента за изграждане Waf от директория ns-3. Waf инсталиран с изходния код ns-3. Повечето потребители бързо преминават към директна употреба за конфигуриране и сглобяване на ns‑3 Waf. Така че, за да продължите, моля, отидете в директорията ns-3, която сте създали първоначално.

Това не е строго задължително в момента, но ще бъде полезно да се върнете малко назад и да видите как да направите промени в конфигурацията на проекта. Вероятно най-полезната промяна в конфигурацията, която можете да направите, е да създадете оптимизирана версия на кода. По подразбиране сте конфигурирали проекта си за изграждане на версия за отстраняване на грешки. Нека да разгледаме проект за създаване на оптимизирана компилация. За да обясните на Waf, че трябва да прави оптимизирани компилации, които включват примери и тестове, ще трябва да изпълните следните команди:

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

Това ще стартира Waf извън локалната директория (за ваше удобство). Първата команда изчиства от предишната компилация, това обикновено не е строго необходимо, но е добра практика (вижте също профилите на компилация по-долу); това ще изтрие предварително създадени библиотеки и обектни файлове, намиращи се в директорията изграждане /. Когато проектът е преконфигуриран и системата за изграждане проверява различните зависимости, трябва да видите изход, подобен на следния:

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)

Моля, обърнете внимание на последната част от списъка по-горе. Някои опции на ns-3 не са активирани по подразбиране или изискват системна поддръжка, за да функционират правилно. Например, за да активирате XmlTo, библиотеката трябва да присъства в системата libxml-2.0. Ако тази библиотека не е намерена и съответната функция ns-3 не е активирана, ще се покаже съобщение. Също така имайте предвид, че е възможно да използвате командата Sudo за да зададете suid бита „задаване на идентификатор на група по време на изпълнение“ за определени програми. Не е активирана по подразбиране и затова тази функция се показва като „не е активирана“. И накрая, за да получите списък с активирани опции, използвайте Waf с параметър --check-config.

Сега нека се върнем и да превключим обратно към компилацията за отстраняване на грешки, съдържаща примери и тестове.

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

Системата за изграждане вече е настроена и можете да създавате версии за отстраняване на грешки на ns-3 програми, като просто напишете:

$ ./waf

Стъпките по-горе може да са ви принудили да изградите част от системата ns-3 два пъти, но сега знаете как да промените конфигурацията и да изградите оптимизиран код.

За да проверите кой профил е активен за дадена конфигурация на проекта, има команда:

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

Горният сценарий build.py също подкрепя аргументи --enable-examples и --enable-tests, но други опции Waf не поддържа директно. Например, това няма да работи:

$ ./build.py --disable-python

реакцията ще бъде следната:

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

Въпреки това, специалният оператор - - може да се използва за предаване на допълнителни параметри чрез WAFтака че вместо горното ще работи следната команда:

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

защото генерира основната команда ./waf configure --disable-python. Ето още няколко въвеждащи съвета за Waf.

Обработка на грешки при компилиране

Изданията на ns-3 са тествани на най-новите компилатори на C++, налични към момента на издаването на общи дистрибуции на Linux и MacOS. С течение на времето обаче се пускат нови дистрибуции с нови компилатори и тези по-нови компилатори са склонни да бъдат по-педантични относно предупрежденията. ns-3 конфигурира своята компилация да третира всички предупреждения като грешки, така че понякога, ако използвате по-стара версия на по-нова система, предупреждението на компилатора може да спре компилацията.

Например, преди това имаше издание на ns‑3.28 за Fedora 28, което включваше нова основна версия GCC (gcc-8). При изграждане на изданието ns-3.28 или по-ранни версии под Fedora 28, с инсталиран Gtk2+, ще възникне следната грешка:

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

В версии, започващи от ns‑3.28.1, in Waf налична е опция за решаване на тези проблеми. Той деактивира настройката на флага "-Werror" в g++ и clang++. Това е опцията "--disable-werror" и трябва да се приложи по време на конфигурацията:

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

Конфигурирайте или сглобете

Някои команди Waf имат значение само във фазата на конфигуриране, а някои са валидни само във фазата на изграждане. Например, ако искате да използвате функциите за емулация на ns-3, можете да активирате битовата настройка SUID използване Sudo, както е описано по-горе. Това ще отмени командите на стъпката за конфигуриране и по този начин можете да промените конфигурацията, като използвате следната команда, която също включва примери и тестове.

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

Ако направите това Waf ще стартира Sudoза промяна на програмите за създаване на сокет за код за емулация, така че да се изпълняват с разрешения корен. В Waf Има много други налични опции за конфигурация и стъпки за изграждане. За да разгледате опциите си, въведете:

$ ./waf --help

В следващия раздел ще използваме някои опции, свързани с тестването.

Монтажни профили

Вече видяхме как можете да конфигурирате Waf за сглобки отстраняване на грешки и оптимизирани:

$ ./waf --build-profile=debug

Има и междинен монтажен профил, освободи. опция -d е синоним на --build-profile. Профилът на изграждане контролира използването на превключватели за регистриране, твърдения и оптимизация на компилатора:

Урок за симулатор на мрежа ns-3. Глава 3

Както можете да видите, регистрирането и твърденията са налични само в компилации за отстраняване на грешки. Препоръчителната практика е да разработите своя скрипт в режим на отстраняване на грешки, след което да извършите многократни стартирания (за статистика или промени на параметрите) в оптимизиран профил на компилация.

Ако имате код, който трябва да се изпълнява само в определени профили на компилация, използвайте макроса Code Wrapper:

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

По подразбиране, Waf поставя артефакти за изграждане в директорията за изграждане. Можете да посочите различна изходна директория, като използвате опцията - -out, например:

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

Като комбинирате това с профили за изграждане, можете лесно да превключвате между различни опции за компилиране:

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

Което ви позволява да работите с множество асембли, без да се налага да пренаписвате най-новата асембли всеки път. Когато превключите към друг профил, Waf ще компилира само него, без да прекомпилира напълно всичко.

Когато превключвате профилите за изграждане по този начин, трябва да внимавате да давате едни и същи опции за конфигурация всеки път. Дефинирането на няколко променливи на средата ще ви помогне да избегнете грешки:

$ 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

Компилатори и флагове

В горните примери Waf за изграждане на ns-3 използва C++ компилатора от GCC ( g ++). Можете обаче да промените този, който използвате Waf C++ компилатор, чрез дефиниране на променливата на средата CXX. Например, за да използвате C++ компилатора Clang, clang++,

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

По същия начин можете да конфигурирате Waf за използване на разпределена компилация с помощта на distcc:

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

Повече информация за distcc и разпределената компилация можете да намерите на страницата на проекта в раздела Документация. За да добавите флагове на компилатора при конфигуриране на ns-3, използвайте променливата на средата CXXFLAGS_EXTRA.

Инсталация

Waf може да се използва за инсталиране на библиотеки на различни места в системата. По подразбиране компилираните библиотеки и изпълними файлове се намират в директорията изграждане на, и тъй като Waf знае местоположението на тези библиотеки и изпълними файлове, няма нужда да инсталирате библиотеките никъде другаде.

Ако потребителите предпочитат да инсталират извън директорията за изграждане, те могат да изпълнят командата ./waf инсталиране. Префиксът по подразбиране за инсталиране е / ЮЕсАр / местни, следователно ./waf инсталиране ще инсталира програми в / ЮЕсАр / местни / хамбар, библиотеки в / ЮЕсАр / местни / ИЪ и заглавни файлове в /usr/local/include. Правата на суперпотребител обикновено трябва да бъдат зададени с префикс по подразбиране, така че типичната команда би била sudo ./waf инсталирайте. Когато се стартира, Waf първо ще избере да използва споделените библиотеки в директорията за изграждане, след което ще потърси библиотеки по пътя към библиотеките, конфигурирани в локалната среда. Така че, когато инсталирате библиотеки на система, добра практика е да проверите дали се използват правилните библиотеки. Потребителите могат да изберат да инсталират с различен префикс, като подадат опцията по време на конфигурацията --prefix, например:

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

Ако по-късно, след изграждането, потребителят въвежда командата за инсталиране ./waf, ще се използва префиксът /опция/местен.

Отбор ./waf clean трябва да се използва преди преконфигуриране на проекта, ако инсталацията ще използва Waf под различен префикс.

По този начин, за да използвате ns-3, няма нужда да се обаждате ./waf install. Повечето потребители няма да имат нужда от тази команда, защото Waf ще вземе текущите библиотеки от директорията за изграждане, но някои потребители може да намерят това полезно, ако дейностите им включват работа с програми извън директорията ns-3.

Waf сингъл

На най-горното ниво на дървото на източника ns-3 има само един Waf скрипт. След като започнете работа, ще прекарате много време в директорията scratch/ или по-дълбоко вsrc/... и в същото време трябва да бягате Waf. Можете просто да си спомните къде се намирате и да избягате Waf както следва:

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

но това ще бъде досадно и податливо на грешки, така че има по-добри решения. Един често срещан начин е да използвате текстов редактор като напр Emacs или Vim, в който се отварят две терминални сесии, едната се използва за изграждане на ns-3, а втората се използва за редактиране на изходния код. Ако имате само тарбол, тогава променлива на средата може да помогне:

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

$ cd scratch 
$ waff build

В директорията на модула може да е изкушаващо да добавите тривиален waf скрипт като exec ../../waf. Моля те не прави това. Това е объркващо за начинаещите и, когато е направено лошо, води до трудни за откриване грешки при изграждането. Решенията, показани по-горе, са пътя, който трябва да се използва.

3.5 Тестване на ns-3

Можете да изпълните единичните тестове на дистрибуцията ns-3, като изпълните скрипта ./test.py:

$ ./test.py

Тези тестове се провеждат успоредно с Waf. В крайна сметка трябва да видите съобщение, което казва:

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

Това е важно съобщение за идентифициране на сривове, сривове или грешки на valgrind, което показва проблеми с кода или несъвместимост между инструменти и код.

Ще видите и крайния резултат от Waf и тестер, изпълняващ всеки тест, който ще изглежда по следния начин:

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)

Тази команда обикновено се изпълнява от потребители, за да се провери бързо дали дистрибуцията ns-3 е изградена правилно. (Имайте предвид, че редът на редовете „PASS: ...“ може да е различен, това е нормално. Важното е, че обобщаващият ред в края на отчета показва, че всички тестове са преминали; няма тестове, които са се провалили или са се сбили.) И WafИ test.py ще паралелизира работата в наличните процесорни ядра на машината.

3.6 Изпълнение на скрипта

Обикновено изпълняваме скриптове под контрол Waf. Това позволява на системата за изграждане да гарантира, че пътищата на споделената библиотека са зададени правилно и че библиотеките са налични по време на изпълнение. За да стартирате програмата, просто използвайте Waf с параметър - -run. Нека изпълним ns-3 еквивалента на повсеместната програма здравей святкато напишете следното:

$ ./waf --run hello-simulator

Waf първо ще провери дали програмата е изградена правилно и ще изгради, ако е необходимо. Тогава Waf ще изпълни програма, която произвежда следния изход.

Hello Simulator

Честито! Вече сте потребител на ns-3!

Какво трябва да направя, ако не виждам резултати?

Ако видите съобщения Wafкоето показва, че изграждането е завършило успешно, но не виждате резултата „Здравей симулатор“, тогава има възможност в секцията [Build-with-Waf] да сте превключили режима на изграждане на оптимизирани, но пропусна превключването обратно към режима отстраняване на грешки. Целият изход на конзолата, използван в този урок, използва специален компонент ns-3, който извършва регистриране и се използва за отпечатване на персонализирани съобщения към конзолата. Изходът от този компонент се дезактивира автоматично, когато се компилира оптимизиран код - той е "оптимизиран". Ако не виждате изхода „Hello Simulator“, въведете следното:

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

за конфигуриране Waf за изграждане на версии за отстраняване на грешки на програми ns-3, които включват примери и тестове. След това трябва да възстановите текущата версия за отстраняване на грешки на кода, като напишете

$ ./waf

Сега, ако стартирате програмата здравей-симулатор, трябва да видите очаквания резултат.

3.6.1 Аргументи на командния ред

За да предадете аргументи на командния ред към програмата ns-3, използвайте следния модел:

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

Сменете към името на вашата програма и към аргументите. Аргумент - -command-template за Waf е по същество рецепта за изграждане на действителния команден ред Waf използвани за изпълнение на програмата. Waf проверява дали компилацията е завършена, задава пътищата на споделената библиотека, след това използва предоставения шаблон на командния ред и замества името на програмата за контейнера %s, за да извика изпълнимия файл. Ако намирате този синтаксис за сложен, има по-проста версия, която включва програмата ns-3 и нейните аргументи, оградени в единични кавички:

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

Друг особено полезен пример е селективното изпълнение на тестови пакети. Да приемем, че има тестов пакет, наречен mytest (всъщност няма). По-горе използвахме скрипта ./test.py, за да изпълним редица тестове паралелно, което многократно извиква тестовата програма тест-бегач. Обадете се тест-бегач директно за провеждане на един тест:

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

Аргументите ще бъдат предадени на програмата тест-бегач. Тъй като mytest не съществува, ще се генерира съобщение за грешка. За да отпечатате наличните опции за тестване, въведете:

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

3.6.2 Отстраняване на грешки

За да стартирате ns-3 програми под друга помощна програма, като програма за отстраняване на грешки (напр. GDB) или инструмент за тестване на паметта (напр. valgrind), използвайте подобна форма - -command-template = "…". Например, за да стартирате в дебъгера GDB вашата програма hello-simulator ns-3 с аргументи:

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

Имайте предвид, че името на програмата ns-3 идва с аргумента - -run, и помощната програма за управление (тук GDB) е първата лексема в аргумента - -command-template. опция - -args доклади GDBче останалата част от командния ред принадлежи на "долната" програма. (Някои версии GDB не разбирам варианта - -args. В този случай премахнете аргументите на програмата от - -command-template и използвайте набора от команди GDB аргументи.) Можем да комбинираме тази рецепта и предишната, за да изпълним теста под дебъгера:

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

3.6.3 Работна директория

Waf трябва да се стартира от местоположението му в горната част на дървото ns-3. Тази папка става работната директория, където ще бъдат записани изходните файлове. Но какво ще стане, ако искате да запазите тези файлове извън дървото на източника на ns-3? Използвайте аргумент - -cwd:

$ ./waf --cwd=...

Може да ви е по-удобно да получите изходните файлове във вашата работна директория. В този случай може да помогне следното непряко действие:

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

Тази украса на предишната версия на командата запазва текущата работна директория, отива в директорията Wafи след това инструктира Waf за да промените работната директория обратно към текущата работна директория, запазена преди стартиране на програмата. Споменаваме отбора - -cwd За пълнота повечето потребители просто стартират Waf от директорията от най-високо ниво и генерират изходни файлове там.

Продължение: Глава 4

Източник: www.habr.com

Добавяне на нов коментар