Підручник із симулятора мережі 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, редактор вихідного коду (наприклад, натиск, emacs або Затемнення) і якщо використовуються репозиторії розробки, системи контролю версій Git. Більшість початківців не потрібно турбуватися, якщо їх конфігурація повідомляє про деякі відсутні додаткові функції ns‑3, але для тих, хто бажає повної установки, проект надає вікі, яка включає сторінки з безліччю корисних порад і підказок. Однією з таких сторінок є сторінка «Установка» з інструкціями з інсталяції для різних систем, доступних за адресою: https://www.nsnam.org/wiki/Installation.

Розділ «Попередні умови» цієї вікі-сторінки пояснює, які пакети потрібні для підтримки загальних опцій ns‑3, а також надає команди, які використовуються для їх встановлення у найпоширеніших варіантах Linux або macOS.

Ви можете скористатися такою можливістю, як вивчення вікі-сторінки ns‑3 або основного веб-сайту: https://www.nsnam.orgтому що там багато інформації. Починаючи з останньої версії ns‑3 (ns‑3.29), для запуску ns‑3 необхідні такі інструменти:

Інструмент Пакет/версія

  • Компілятор C++
    clang++ або g++ (g++ версія 4.9 або більше)
  • Python
    python2 версія >= 2.7.10, або python3 версія >=3.4
  • Git
    будь-яка остання версія (для доступу до ns‑3 на GitLab.com)
  • дьоготь
    будь-яка остання версія (для розпакування релізу ns‑3)
  • bunzip2
    будь-яка свіжа версія (для розпакування релізу ns‑3)

Щоб перевірити стандартну версію Python, введіть python -V. Щоб перевірити версію g++, введіть g++ -v. Якщо якісь інструменти відсутні або занадто старі, зверніться до посібника зі встановлення на вікі-сторінці 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/. Група нснам поєднує різні репозиторії, які використовуються проектом з відкритим вихідним кодом.

Найпростіший спосіб почати використовувати репозиторії Git – це зробити форк або клонувати оточення ns‑3-allinone. Це набір скриптів, який керує завантаженням і складанням найчастіше використовуваних підсистем 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-allinone трохи відрізняється від описаної вище директорії з архівом релізу. Вона має виглядати приблизно так:

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

Зверніть увагу на наявність скрипту download.py, який додатково витягне ns‑3 та супутній вихідний код. Тут у вас є вибір: або завантажити останній снапшот розробки ns‑3:

$ python download.py

або віддати перевагу релізу ns‑3, використовуючи прапор -n для вказівки номера релізу:

$ python download.py -n ns-3.29

Після цього кроку до директорії ns‑3-allinone будуть завантажені додаткові репозиторії ns‑3, піч, pybindgen и netanim.

Примітка
На машині з чистою Ubuntu16.04 мені потрібно змінити команду до такого виду: $ sudo python3 download.py -n ns-3.29 (Тут і далі примітки перекладача).

3.3.1 Завантаження ns-3 за допомогою Bake

Два вищезазначені методи (архів вихідників або репозиторій ns‑3-allinone через Git) корисні для отримання найпростішої установки ns‑3 з кількома аддонами(pybindgen для генерації прив'язок Python і netanim для анімації мережі). Третій репозиторій, що надається за умовчанням у ns‑3-allinone, називається піч.

Випікати — це інструмент для скоординованого складання програмного забезпечення з кількох репозиторіїв, розроблений для проекту ns‑3. Випікати може використовуватися для отримання девелоперських версій ns‑3, а також для завантаження та складання розширень базової версії дистрибутива ns‑3, таких як середовище Direct Code Execution, CradleNetwork Simulation Cradle, можливість створення нових прив'язок 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. нс-алінон-3.29: модуль, який включає інші додаткові функції, такі як Click маршрутизація і Network Simulation Cradle, Openflow для ns-3.

  4. ns‑3-allinone: аналогічно релізній версії модуля 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). Перейдіть до директорії «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

Це означатиме, що було завантажено три вихідні джерела. Тепер перейдіть до директорії source і введіть ls; ви повинні побачити:

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

Тепер ви готові зібрати дистрибутив ns-3.

3.4 Складання ns-3

Як і під час завантаження ns‑3, є кілька способів зібрати ns‑3. Головне, ми хочемо наголосити, що ns‑3 зібраний за допомогою інструменту збирання під назвою Ваф, описаного нижче. Більшість користувачів будуть працювати з Ваф, але є кілька зручних сценаріїв, які допоможуть вам почати або організувати складніші зборки. Тому, будь ласка, перш ніж читати про Ваф, погляньте на build.py та складання з піч.

3.4.1 Складання за допомогою build.py

Увага! Цей крок складання доступний лише з версії вихідного архіву, отриманої як описаної вище; а не завантажені через git або bake.

Працюючи з релізним архівом тарбол, в ns‑3‑allinone є зручний сценарій, який може спростити складання компонентів. Він називається build.py. Ця програма налаштує проект для вас найкориснішим способом. Тим не менш, зверніть увагу, що більш складні налаштування та робота з ns-3 зазвичай включають використання власної системи збирання ns-3, Waf, яка буде представлена ​​пізніше в цьому посібнику.

Якщо ви зробили завантаження за допомогою тарбол, то у вашій директорії ~/робоча область має з'явитися директорія з ім'ям щось на зразок нс-алінон-3.29. Введіть наступне:

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

при виклику build.py ми застосували аргументи командного рядка для того, щоб зібрати приклади та тести, які використовуються в цьому посібнику, які в ns‑3 за замовчуванням не збираються. За промовчанням програма також будує всі доступні модулі. Потім, якщо забажаєте, Ви можете зібрати ns‑3 без прикладів та тестів або виключити модулі, які не потрібні для роботи.

Ви побачите багато вихідних повідомлень компілятора, що відображаються скриптом при складанні різних завантажених частин. Спочатку скрипт спробує зібрати аніматор. netanim, потім генератор прив'язок 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 та підтримки бібліотек. Фактично, для збирання вони запускають інструмент збирання Ваф із директорії ns‑3. Ваф встановлюється разом із вихідним кодом ns‑3. Більшість користувачів для налаштування та складання ns‑3 швидко переходять до прямого використання. Ваф. Отже, для продовження, будь ласка, перейдіть до директорії ns‑3, який ви спочатку створили.

На даний момент це не потрібно, але буде корисно зробити невеликий відступ і подивитися, як вносити зміни в конфігурацію проекту. Ймовірно, найбільш корисною зміною конфігурації, яку ви можете зробити, буде створення оптимізованої версії коду. За замовчуванням, ви налаштували свій проект на складання налагоджувальної версії. Давайте розглянемо проект для створення оптимізованого збирання. Щоб пояснити Waf, що він повинен зробити оптимізовані збірки, які включають приклади та тести, вам потрібно буде виконати такі команди:

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

Це запустить Ваф поза локальною директорією (для вашої зручності). Перша команда виконує очищення від попереднього складання, вона зазвичай не є необхідною, але це хороша практика (також див. профілі складання нижче); це видалить раніше створені бібліотеки та об'єктні файли, що знаходяться в директорії побудувати /. Коли проект переналаштовано і система складання виконує перевірку різних залежностей, ви повинні побачити висновок, схожий на наступний:

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 не була б увімкнена, буде відображено повідомлення. Також зверніть увагу, що є можливість використовувати команду Суду для встановлення біта suid «установлення ID групи під час виконання» у певних програм. Він не включений за промовчанням, і тому ця функція відображається як «не включена» («not enabled»). Нарешті, щоб отримати список увімкнених опцій, використовуйте Ваф з параметром --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, але інші опції Ваф він не підтримує безпосередньо. Наприклад, це не працюватиме:

$ ./build.py --disable-python

реакція буде такою:

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

Тим не менш, спеціальний оператор - може використовуватися для передачі додаткових параметрів через WAF, тому замість вищезгаданого працюватиме наступна команда:

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

оскільки вона генерує основну команду ./waf configure -disable-python. Ось ще кілька вступних порад про Ваф.

Обробка помилок збирання

Релізи ns-3 протестовані на останніх компіляторах C++, доступних в момент релізу на поширених дистрибутивах Linux і MacOS. Однак, з часом, випускаються нові дистрибутиви з новими компіляторами, і ці нові компілятори, як правило, більш педантичні щодо попереджень. ns‑3 налаштовує своє складання для обробки всіх попереджень як помилок, тому іноді, якщо ви використовуєте старішу версію в новій системі, попередження компілятора може зупинити складання.

Наприклад, раніше був реліз ns‑3.28 Fedora 28, яка включала нову мажорну версію ПКУ (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, Ваф доступна опція для вирішення цих проблем. Вона відключає встановлення прапора "-Werror" в g++ і clang++. Це опція «disable-werror», вона повинна застосовуватися під час конфігурування:

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

Конфігурувати чи збирати

Деякі команди Ваф мають сенс лише у фазі конфігурування, а деякі діють лише у фазі складання. Наприклад, якщо ви хочете використовувати функції емуляції ns‑3, то можете увімкнути установку біта SUID використовуючи Суду, як описано вище. Це скасує команди етапу конфігурації, і таким чином ви зможете змінити конфігурацію, використовуючи наступну команду, яка також включає приклади і тести.

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

Якщо ви зробите це, Ваф запустить Суду, щоб змінити програми створення сокетів коду емуляції для запуску з правами корінь. У Ваф доступно безліч інших опцій для етапів конфігурації та складання. Щоб вивчити варіанти, введіть:

$ ./waf --help

У наступному розділі ми будемо використовувати деякі опції, пов'язані із тестуванням.

Профілі складання

Ми вже бачили, як можна налаштувати Ваф для складання відлагоджувати и оптимізований:

$ ./waf --build-profile=debug

Також є проміжний профіль складання, звільнити. Опція -d є синонімом --build-profile. Профіль збирання керує використанням журналування, тверджень (assertions) та ключів оптимізації компілятора:

Підручник із симулятора мережі ns-3. Розділ 3

Як можна бачити, журналування та затвердження доступні лише у налагоджувальних зборках. Рекомендована практика полягає в розробці вашого сценарію в режимі налагодження, потім виконання повторних прогонів (для статистики або зміни параметрів) в оптимізованому профілі складання.

Якщо у вас є код, який має виконуватися лише у певних профілях збирання, використовуйте макрос 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;)

За замовчуванням, Ваф поміщає артефакти збирання в директорію збирання. Ви можете вказати іншу вихідну директорію за допомогою опції - -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
...

Що дозволяє вам працювати з кількома збірками, не переписуючи щоразу останню збірку. Коли ви переключаєтеся на інший профіль, Ваф компілюватиме тільки його, без повної перекомпіляції всього.

Коли ви подібним чином перемикаєте профілі збірки, потрібно дбати про те, щоб кожного разу надавати однакові параметри конфігурації. Вам допоможе уникнути помилок визначення кількох змінних середовища:

$ 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

Компілятори та прапори

У наведених вище прикладах Ваф для складання ns‑3 використовує C++ компілятор із GCC ( г ++). Тим не менш, можна змінити використовуваний Ваф C++ компілятор шляхом визначення змінного середовища CXX. Наприклад, щоб використовувати C++ компілятор Clang, clang++,

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

Аналогічно можна налаштувати Ваф для використання розподіленої компіляції за допомогою distcc:

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

Більш детальну інформацію про distcc та розподілену компіляцію можна знайти на сторінці проекту у розділі «Документація». Щоб конфігурувати ns‑3, додати прапори компілятора, використовуйте змінне середовище CXXFLAGS_EXTRA .

Встановлення

Ваф може використовуватися для встановлення бібліотек у різні місця системи. За замовчуванням, зібрані бібліотеки та файли, що виконуються, знаходиться в директорії будувати, і оскільки Waf знає розташування цих бібліотек і виконуваних файлів, не потрібно встановлювати бібліотеки куди чи ще.

Якщо користувачі віддають перевагу установці поза директорією збирання, вони можуть виконати команду ./waf встановити. За замовчуванням префікс для встановлення / usr / local, Тому ./waf встановити буде встановлювати програми в / usr / local / bin, бібліотеки в / usr / local / lib та заголовні файли в /usr/local/include. Права суперкористувача зазвичай необхідно встановлювати з префіксом за умовчанням, тому типова команда буде sudo ./waf install. При запуску, Waf спочатку віддасть перевагу використанню спільних бібліотек у директорії збірки, потім шукатиме бібліотеки на шляху до бібліотек, налаштованих у локальному оточенні. Так що при встановленні бібліотек в систему хороша практика перевірити, що використовуються потрібні бібліотеки. Користувачі можуть вибрати інсталяцію з іншим префіксом, передавши під час конфігурування опцію --prefix, Наприклад:

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

Якщо пізніше, після збирання, користувач введе команду установки ./waf, буде використано префікс / opt / local.

Команда ./waf clean повинна використовуватися до переналаштування проекту, якщо для установки буде використовуватись Ваф під іншим префіксом.

Таким чином, для використання ns‑3 немає необхідності викликати ./waf install. Більшості користувачів ця команда не знадобиться, оскільки Ваф підхопить поточні бібліотеки з директорії складання, але деякі користувачі можуть знайти це корисним, якщо їхня діяльність включає роботу з програмами поза директорією ns‑3.

Waf єдиний

На верхньому рівні дерева вихідного коду ns‑3 існує лише один Waf-скрипт. Почавши працювати, ви проводитимете багато часу в директорії scratch/ або глибше, вsrc/... і при цьому мати потребу запускати Ваф. Ви можете просто пам'ятати, де ви, і запустити Ваф наступним чином:

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

але це буде стомливо і схильна до помилок, тому є найкращі рішення. Одним із найпоширеніших способів є використання текстового редактора, такого як emacs або натиск, В якому відкриваються дві термінальні сесії, одна використовується для складання 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

Ці тести виконуються паралельно з Ваф. Зрештою ви повинні побачити повідомлення про те, що

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

Це важливе повідомлення для виявлення збоїв, крахів або помилок valgrind, вказує на проблеми з кодом або несумісність між інструментами та кодом.

Ви також побачите підсумковий висновок від Ваф і тестера, що виконує кожен тест, який виглядатиме приблизно так:

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: …» може відрізнятися, це нормально. Важливо те, що у підсумковому рядку наприкінці звіту всі перевірки пройдені; жоден тест не закінчився невдачею чи зазнав краху.) І Ваф, І test.py будуть розпаралелювати роботу по доступним ядрам процесора машини.

3.6 Запуск скрипту

Зазвичай ми запускаємо скрипти під контролем Ваф. Це дозволяє системі збирання гарантувати, що шляхи до спільної бібліотеки встановлені правильно і що бібліотеки доступні під час виконання. Щоб запустити програму, просто використовуйте Ваф з параметром - -run. Запустимо для ns‑3 еквівалент всюдисущої програми привіт світ, набравши таке:

$ ./waf --run hello-simulator

Waf спочатку перевірить, що програма зібрана правильно, і при необхідності виконує збирання. Потім Ваф виконає програму, яка виконає наступний висновок.

Hello Simulator

Вітаємо! Тепер ви користувач ns-3!

Що робити, якщо я не бачу результату?

Якщо ви бачите повідомлення Ваф, що вказують, що збірка була успішно завершена, але не бачите висновок "Hello Simulator", тобто ймовірність, що ви в розділі [Збірка-з-Waf] переключили свій режим збирання на оптимізований, але пропустили зворотне перемикання в режим відлагоджувати. Весь вивід консолі, що використовується в цьому посібнику, використовує спеціальний компонент ns‑3, який виконує запис лога, і застосовується для друку повідомлень користувача в консоль. Висновок з цього компонента автоматично вимкнено при компіляції оптимізованого коду – його «оптимізовано». Якщо ви не бачите висновок Hello Simulator, введіть наступне:

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

щоб налаштувати Ваф на складання налагоджувальних версій програм ns‑3, які включають приклади та тести. Потім Ви повинні перезбирати актуальну налагоджувальну версію коду, набравши

$ ./waf

Тепер, якщо ви запустите програму привіт-симулятор, Ви повинні побачити очікуваний результат.

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

Щоб передати аргументи командного рядка до програми ns‑3, використовуйте такий шаблон:

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

Замініть на ім'я вашої програми та на аргументи. Аргумент - -command-template для Ваф - це, по суті, рецепт для побудови фактичного командного рядка Ваф використовується для виконання програми. Waf перевіряє, що збірка завершена, встановлює шляхи до загальної бібліотеки, потім використовуючи наданий шаблон командного рядка та підставляючи ім'я програми замість заповнювача %s, викликає файл, що виконується. Якщо вам такий синтаксис здасться складним, існує більш простий варіант, який включає програму ns‑3 і її аргументи укладені в одинарні лапки:

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

Іншим, особливо корисним прикладом є вибірковий запуск наборів тестів. Припустимо, що існує тестовий набір (suite) mytest (насправді його немає). Вище ми використовували скрипт ./test.py для паралельного запуску цілого ряду тестів, який багаторазово викликає програму тестування бігун-випробувач. Виклик бігун-випробувач безпосередньо для виконання одного тесту:

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

Аргументи будуть передані програмі бігун-випробувач. Оскільки mytest немає, буде генеруватися повідомлення про помилку. Щоб надрукувати доступні параметри test-runner, введіть:

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

3.6.2 Налагодження

Для запуску програм ns‑3 під керуванням іншої утиліти, такої як відладчик (наприклад, gdb) або інструмент перевірки пам'яті (наприклад, валгринд), використовуйте аналогічну форму - -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 
}

Таке декорування попередньої версії команди зберігає поточну робочу директорію, переходить у директорію Ваф, а потім інструктує Ваф для зміни робочої директорії назад у збережену перед запуском програми поточну робочу директорію. Ми згадуємо команду - -cwd Для повноти викладу більшість користувачів просто запускають Waf з директорії верхнього рівня і там генерують файли вихідних даних.

Продовження: розділ 4

Джерело: habr.com

Додати коментар або відгук