poradnik dotyczący symulatora sieci ns-3. Rozdział 3

poradnik dotyczący symulatora sieci ns-3. Rozdział 3
Rozdział 1,2

3 Pierwsze kroki
3.1 Przegląd
3.2 Warunki wstępne
3.2.1 Pobieranie wersji ns-3 jako archiwum źródłowego
3.3 Pobieranie ns-3 przy użyciu Gita
3.3.1 Ładowanie ns-3 za pomocą Bake
3.4 Montaż ns-3
3.4.1 Budowanie za pomocą build.py
3.4.2 Budowanie za pomocą Bake
3.4.3 Kompiluj za pomocą Wafa
3.5 Testowanie ns-3
3.6 Uruchamianie skryptu
3.6.1 Argumenty wiersza poleceń
3.6.2 Debugowanie
3.6.3 Katalog roboczy

Rozdział 3

Pierwsze kroki

Celem tego rozdziału jest przygotowanie czytelnika do rozpoczęcia korzystania z komputera, na którym być może nigdy nie instalowano ns-3. Omówiono obsługiwane platformy, wymagania wstępne, sposób uzyskania ns-3, budowanie ns-3 oraz testowanie kompilacji i uruchamiania prostych programów.

3.1 Przegląd

Symulator ns-3 jest zbudowany jako system współpracujących bibliotek oprogramowania. Podczas montażu kod programów użytkownika jest łączony z tymi bibliotekami. Do pisania niestandardowych programów wykorzystywane są języki programowania C++ lub Python.

Ns-3 jest dystrybuowany jako kod źródłowy, co oznacza, że ​​system docelowy musi posiadać środowisko programistyczne, aby najpierw zbudować biblioteki, a następnie zbudować program użytkownika. W zasadzie ns-3 można dystrybuować jako gotowe biblioteki dla konkretnego systemu i w przyszłości można je w ten sposób dystrybuować. Ale obecnie wielu użytkowników faktycznie wykonuje swoją pracę, edytując sam ns-3, więc przydatne jest posiadanie kodu źródłowego do budowania bibliotek. Jeśli ktoś chciałby podjąć się pracy nad tworzeniem gotowych bibliotek i pakietów dla systemów operacyjnych, prosimy o kontakt z listą mailingową ns-programiści.

Następnie przyjrzymy się trzem sposobom pobrania i zbudowania ns-3. Pierwszym z nich jest pobranie i skompilowanie oficjalnej wersji ze strony głównej. Drugi to wybór i montaż kopii wersji rozwojowych podstawowej instalacji ns-3. Trzecim jest użycie dodatkowych narzędzi do kompilacji, aby załadować więcej rozszerzeń dla ns-3. Omówimy każdy z nich, ponieważ narzędzia są nieco inne.

Doświadczeni użytkownicy Linuksa mogą się zastanawiać, dlaczego ns-3 nie jest dostarczany jako pakiet, jak większość innych bibliotek korzystających z menedżera pakietów? Chociaż istnieją pakiety binarne dla różnych dystrybucji Linuksa (np. Debian), większość użytkowników kończy na edytowaniu bibliotek i konieczności samodzielnego przebudowywania ns-3, więc posiadanie kodu źródłowego jest przydatne. Z tego powodu skupimy się na instalacji ze źródła.

Dla większości zastosowań prawa ns-3 korzeń nie są potrzebne, zaleca się korzystanie z konta użytkownika nieuprzywilejowanego.

3.2 Warunki wstępne

Cały zestaw dostępnych bibliotek ns-3 ma wiele zależności od bibliotek innych firm, ale w większości ns-3 można zbudować i używać z obsługą kilku popularnych (często instalowanych domyślnie) komponentów: kompilatora C++, Python, edytor kodu źródłowego (na przykład vim, emacs lub Zaćmienie) oraz, jeśli używane są repozytoria programistyczne, systemy kontroli wersji Git. Większość początkujących użytkowników nie będzie musiała się martwić, jeśli ich konfiguracja zgłosi brak niektórych zaawansowanych funkcji ns-3, ale dla tych, którzy chcą pełnej instalacji, projekt udostępnia wiki zawierającą strony z mnóstwem przydatnych porad i trików. Jedną z takich stron jest strona Instalacja zawierająca instrukcje dotyczące instalacji dla różnych systemów, dostępna pod adresem: https://www.nsnam.org/wiki/Installation.

Sekcja Wymagania wstępne tej wiki wyjaśnia, które pakiety są wymagane do obsługi popularnych opcji ns-3, a także zawiera polecenia używane do ich instalowania w popularnych wersjach systemu Linux lub macOS.

Możesz skorzystać z tej okazji i zajrzeć na stronę wiki ns-3 lub na stronę główną: https://www.nsnam.org, bo jest tam mnóstwo informacji. Począwszy od najnowszej wersji ns-3 (ns-3.29), do uruchomienia ns-3 wymagane są następujące narzędzia:

Pakiet narzędzi/wersja

  • Kompilator C++
    clang++ lub g++ (g++ wersja 4.9 lub wyższa)
  • Python
    wersja Pythona2 >= 2.7.10 lub wersja Pythona3 >=3.4
  • git
    dowolna najnowsza wersja (aby uzyskać dostęp do ns-3 na GitLab.com)
  • smoła
    dowolna najnowsza wersja (do rozpakowania wydania ns-3)
  • bunzip2
    dowolna najnowsza wersja (do rozpakowania wydania ns-3)

Aby sprawdzić domyślną wersję Pythona, wpisz python -V. Aby sprawdzić wersję g++, wpisz g++ -v. Jeśli brakuje jakichkolwiek narzędzi lub są one zbyt stare, zapoznaj się z instrukcją instalacji na stronie wiki dotyczącej ns-3.

Od tego momentu zakładamy, że czytnik posiada system Linux, MacOS lub emulator Linuksa i posiada przynajmniej powyższe narzędzia.

3.2.1 Pobieranie wersji ns-3 jako archiwum źródłowego

Jest to sposób postępowania dla nowego użytkownika, który chce pobrać i poeksperymentować z najnowszymi wersjami i wersjami pakietowymi ns-3. Wersje ns-3 są publikowane jako skompresowane archiwa źródłowe, czasami nazywane Archiwum tar. Archiwum tar to specjalny format archiwum oprogramowania, w którym kilka plików jest łączonych razem. Archiwum jest zwykle skompresowane. Proces rozruchu ns-3 przez Archiwum tar jest proste, wystarczy wybrać wersję, pobrać ją i rozpakować.

Załóżmy, że jako użytkownik chcesz zbudować ns-3 w lokalnym katalogu o nazwie obszar roboczy. Możesz uzyskać roboczą kopię wydania, wprowadzając następujące polecenie w konsoli Linux (oczywiście zastępując odpowiednie numery wersji):

$ 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 

Zwróć uwagę na narzędzie użyte powyżej wget, które jest narzędziem wiersza poleceń służącym do pobierania obiektów z Internetu. Jeżeli jeszcze go nie zainstalowałeś, możesz w tym celu użyć swojej przeglądarki.

Wykonanie tych kroków przeniesie Cię do katalogu ns-allinone-3.29, tam powinieneś zobaczyć kilka plików i katalogów

$ 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

Jesteś teraz gotowy do zbudowania podstawowej dystrybucji ns-3 i możesz przejść do sekcji poświęconej budowaniu ns-3.

3.3 Pobieranie ns-3 przy użyciu Gita

Kod ns-3 jest dostępny w repozytoriach Git na GitLab.com pod adresem https://gitlab.com/nsnam/. Grupa nsnam skupia różne repozytoria używane przez projekt open source.

Najprostszym sposobem na rozpoczęcie korzystania z repozytoriów Git jest rozwidlenie lub sklonowanie środowiska ns-3-allinon. Jest to zestaw skryptów zarządzający ładowaniem i montażem najczęściej używanych podsystemów ns-3. Jeśli jesteś nowy w Git, terminy „fork” i „klon” mogą być ci obce; jeśli tak, zalecamy po prostu sklonować (utworzyć własną kopię) repozytorium znajdującego się na GitLab.com w następujący sposób:

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

Na tym etapie widok Twojego katalogu ns-3-allinon różni się nieco od katalogu archiwum wydania opisanego powyżej. Powinno to wyglądać mniej więcej tak:

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

Pamiętaj, że istnieje skrypt pobierz.py, który dodatkowo wyodrębni ns-3 i towarzyszący mu kod źródłowy. Tutaj masz wybór: albo pobierz najnowszą migawkę rozwojową ns-3:

$ python download.py

lub preferuj wersję ns-3 przy użyciu flagi -n aby wskazać numer wydania:

$ python download.py -n ns-3.29

Po tym kroku do katalogu ns-3-allinon zostaną pobrane dodatkowe repozytoria ns-3, piec, pybindgen и netanim.

Operacja
Na komputerze z czystym Ubuntu 16.04 musiałem zmienić polecenie na to: $ sudo python3 download.py -n ns-3.29 (dalej notatki tłumacza).

3.3.1 Ładowanie ns-3 za pomocą Bake

Powyższe dwie metody (archiwum źródłowe lub repozytorium ns-3-allinon za pośrednictwem Git) są przydatne do uzyskania najprostszej instalacji ns-3 z wieloma dodatkami (pybindgen do generowania powiązań Pythona i netanim do animacji sieci). Wywoływane jest trzecie repozytorium udostępniane domyślnie w ns-3-allinone piec.

Piec to narzędzie do skoordynowanego budowania oprogramowania z wielu repozytoriów, opracowane na potrzeby projektu ns-3. Piec można wykorzystać do uzyskania wersji deweloperskich ns-3, a także do pobrania i zbudowania rozszerzeń podstawowej wersji dystrybucji ns-3, takich jak środowisko Bezpośrednie wykonanie kodu, Stacja dokująca do symulacji sieci CradleNetwork, możliwość tworzenia nowych powiązań w Pythonie i różnych „aplikacji” ns-3.

Operacja
CradleNetwork Simulation Cradle to framework, który pozwala na wykorzystanie prawdziwych stosów sieciowych TCP/IP w symulatorze sieci.

Jeśli oczekujesz, że Twoja instalacja ns-3 będzie zawierała zaawansowane lub dodatkowe funkcje, możesz skorzystać z tej ścieżki instalacji.

W najnowszych wydaniach ns-3 Piec został dodany do wydania tar. Wydanie zawiera plik konfiguracyjny, który umożliwia pobranie aktualnych wersji oprogramowania w momencie wydania. Czyli na przykład wersja Piec, który jest dystrybuowany z wersją ns-3.29, może być używany do pobierania komponentów dla tej wersji ns-3 lub wcześniejszej, ale nie może być używany do pobierania komponentów dla późniejszych wydań (jeśli plik opisu pakietu Bakeconf.xml nie są aktualizowane).

Możesz także otrzymać najnowszą kopię piecwpisując następującą komendę w konsoli Linux (zakładając, że masz zainstalowany Git):

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

Po uruchomieniu polecenia git powinieneś zobaczyć coś takiego:

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 wykonaniu polecenia klonować powinieneś mieć katalog o nazwie piec, którego zawartość powinna wyglądać mniej więcej tak:

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

Zauważ, że załadowałeś kilka skryptów Pythona, moduł Pythona o nazwie piec oraz plik konfiguracyjny XML. Następnym krokiem jest użycie tych skryptów do pobrania i zbudowania wybranej dystrybucji ns-3. Dostępnych jest kilka celów dostosowywania:

  1. ns-3.29: moduł odpowiadający wydaniu; pobierze komponenty podobne do wersji z archiwum tar;

  2. ns-3-dev: podobny moduł, ale wykorzystujący kod z drzewa deweloperskiego;

  3. ns-allinon-3.29: Moduł zawierający inne dodatkowe funkcje, takie jak routing Click i stacja dokująca do symulacji sieci, Openflow dla ns-3.

  4. ns-3-allinon: podobny do wersji modułu allinone, ale dla kodu programistycznego.

Operacja
Kliknij — modułowa architektura oprogramowania do tworzenia routerów.

Openflow to protokół zarządzający procesem przetwarzania danych przesyłanych siecią danych przez routery i przełączniki, realizujący technologię sieci definiowaną programowo.

Bieżącą wersję rozwojową (niepublikowaną) ns-3 można znaleźć pod adresem:https://gitlab.com/nsnam/ns-3-dev.git.

Programiści starają się utrzymać te repozytoria w stałym działaniu, ale znajdują się one w obszarze rozwoju i zawierają niepublikowany kod, więc jeśli nie planujesz korzystać z nowych funkcji, wybierz oficjalną wersję.

Najnowszą wersję kodu możesz znaleźć przeglądając listę repozytoriów lub wchodząc na stronę internetową ns-3 Releases:https://www.nsnam.org/releases/ i kliknięcie łącza do najnowszej wersji. W tym przykładzie będziemy kontynuować ns-3.29.

Teraz, aby zdobyć potrzebne komponenty ns-3, użyjemy tego narzędzia Piec. Powiedzmy kilka słów wprowadzających o pracy Piec.

Bake działa poprzez ładowanie źródeł pakietów do katalogu źródło i instalowanie bibliotek w katalogu kompilacji. Piec można uruchomić, odwołując się do pliku binarnego, ale jeśli chcesz uruchomić Piec nie z katalogu, w którym został pobrany, zaleca się dodanie ścieżki do piec do swojej ścieżki (zmienna środowiskowa PATH), na przykład w następujący sposób (przykład powłoki bash w systemie Linux). Przejdź do katalogu „bake”, a następnie ustaw następujące zmienne środowiskowe:

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

Spowoduje to umieszczenie programu piec.py do ścieżki powłoki i pozwoli innym programom znaleźć utworzone pliki wykonywalne i biblioteki piec. W niektórych przypadkach użycia piec, opisane powyżej ustawienia PATH i PYTHONPATH nie są wymagane, ale zwykle wymaga tego pełna kompilacja ns-3-allinone (z dodatkowymi pakietami).

Przejdź do katalogu roboczego i wpisz w konsoli:

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

Następnie zapytamy Piec sprawdź, czy mamy wystarczającą liczbę narzędzi do załadowania różnych komponentów. Wybierz:

$ ./bake.py check

Powinieneś zobaczyć coś takiego:

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

W szczególności narzędzia do przesyłania, takie jak Mercurial, CVS, Git i Bazaar są niezbędne na tym etapie, ponieważ pozwalają nam uzyskać kod. W tym momencie zainstaluj brakujące narzędzia w zwykły sposób dla swojego systemu (jeśli wiesz, jak) lub skontaktuj się z administratorem systemu w celu uzyskania pomocy.

Następnie spróbuj pobrać oprogramowanie:

$ ./bake.py download

wynik powinien wyglądać mniej więcej tak:

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

Będzie to oznaczać, że pobrano trzy źródła. Teraz przejdź do katalogu źródłowego i wpisz ls; Powinieneś zobaczyć:

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

Teraz możesz już zbudować dystrybucję ns-3.

3.4 Montaż ns-3

Podobnie jak w przypadku pobierania ns-3, istnieje kilka sposobów na zbudowanie ns-3. Najważniejszą rzeczą, którą chcemy podkreślić, jest to, że ns-3 jest zbudowany przy użyciu narzędzia do kompilacji zwanego WafOpisane poniżej. Większość użytkowników będzie pracować z Waf, ale istnieje kilka przydatnych skryptów, które pomogą Ci rozpocząć lub zorganizować bardziej złożone kompilacje. Więc proszę, zanim przeczytasz o Waf, spojrzeć na kompilacja.py i montaż z piec.

3.4.1 Budowanie za pomocą build.py

Ostrzeżenie! Ten etap kompilacji jest dostępny wyłącznie w przypadku wersji archiwum źródłowego uzyskanej w sposób opisany powyżej; i nie są pobierane przez git lub bake.

Podczas pracy z archiwum wydań Archiwum tarw ns-3-allinon Dostępny jest przydatny skrypt, który może ułatwić montaż komponentów. Nazywa się build.py. Ten program skonfiguruje projekt dla Ciebie w najbardziej użyteczny sposób. Należy jednak pamiętać, że bardziej zaawansowana konfiguracja i praca z ns-3 zwykle wiąże się z użyciem własnego systemu kompilacji ns-3, Waf, który zostanie przedstawiony w dalszej części tego samouczka.

Jeśli pobrałeś za pomocą Archiwum tar, a następnie w swoim katalogu ~/obszar roboczy katalog o nazwie podobnej do ns-allinon-3.29. Wprowadź następujące informacje:

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

Kiedy dzwonisz kompilacja.py Użyliśmy argumentów wiersza poleceń do zbudowania przykładów i testów używanych w tym samouczku, które nie są budowane domyślnie w ns-3. Domyślnie program buduje także wszystkie dostępne moduły. Następnie, jeśli chcesz, możesz zbudować ns-3 bez przykładów i testów lub wykluczyć moduły, które nie są potrzebne do Twojej pracy.

Zobaczysz wiele komunikatów wyjściowych kompilatora wyświetlanych przez skrypt podczas tworzenia różnych załadowanych części. Najpierw skrypt spróbuje zbudować animatora netanim, a następnie generator powiązań pybindgen i wreszcie ns-3. Po zakończeniu procesu powinieneś zobaczyć następujące informacje:

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

W ostatnich trzech wierszach zestawienia znajduje się komunikat o modułach, które nie zostały zbudowane:

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

Oznacza to po prostu, że niektóre moduły ns-3 zależne od zewnętrznych bibliotek mogły nie zostać zbudowane lub że nie jest wymagane ich budowanie dla tej konfiguracji. Nie oznacza to, że symulator nie jest zmontowany lub że zmontowane moduły nie będą działać poprawnie.

3.4.2 Budowanie za pomocą Bake

Jeśli użyłeś powyższego programu bake do pobrania kodu źródłowego z repozytoriów projektu, możesz go nadal używać do budowania ns-3. Wybierz:

$ ./bake.py build

i powinieneś zobaczyć coś takiego:

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

Etykietka: Możesz także wykonać kroki pobierania i kompilacji jednocześnie, wywołując „bake.py wdrażanie”.

Montaż wszystkich komponentów może się nie powieść, ale montaż będzie kontynuowany, jeśli komponent nie jest potrzebny. Na przykład niedawno pojawił się problem z przenośnością castxml można zmontować za pomocą narzędzia piec nie na wszystkich platformach. W takim przypadku pojawi się taki komunikat:

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

jednak castxml potrzebne tylko, jeśli chcesz utworzyć zaktualizowane powiązania Pythona. Dla większości użytkowników nie ma takiej potrzeby (przynajmniej do czasu zmiany ns-3), więc takie ostrzeżenia można na razie bezpiecznie zignorować.

Jeśli to się nie powiedzie, poniższe polecenie poinformuje Cię o brakujących zależnościach:

$ ./bake.py show

Zostaną wyświetlone różne zależności pakietów, które próbujesz zbudować.

3.4.3 Kompiluj za pomocą Wafa

Do tego momentu, aby rozpocząć budowę ns-3, używaliśmy albo skryptu kompilacja.pylub narzędzie piec. Narzędzia te są przydatne do budowania ns-3 i utrzymywania bibliotek. W rzeczywistości, aby zbudować, uruchamiają narzędzie do budowania Waf z katalogu ns-3. Waf zainstalowany z kodem źródłowym ns-3. Większość użytkowników szybko przechodzi do bezpośredniego użycia, aby skonfigurować i złożyć ns-3 Waf. Aby kontynuować, przejdź do pierwotnie utworzonego katalogu ns-3.

Nie jest to obecnie ściśle wymagane, ale warto cofnąć się nieco i zobaczyć, jak wprowadzić zmiany w konfiguracji projektu. Prawdopodobnie najbardziej przydatną zmianą konfiguracji, jaką możesz wprowadzić, jest utworzenie zoptymalizowanej wersji kodu. Domyślnie skonfigurowałeś swój projekt do tworzenia wersji debugowania. Przyjrzyjmy się projektowi, aby stworzyć zoptymalizowaną kompilację. Aby wyjaśnić Wafowi, że powinien tworzyć zoptymalizowane kompilacje zawierające przykłady i testy, będziesz musiał uruchomić następujące polecenia:

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

To się uruchomi Waf poza katalogiem lokalnym (dla Twojej wygody). Pierwsze polecenie czyści poprzednią kompilację, zwykle nie jest to absolutnie konieczne, ale jest dobrą praktyką (zobacz także profile kompilacji poniżej); spowoduje to usunięcie wcześniej utworzonych bibliotek i plików obiektowych znajdujących się w katalogu budować/. Kiedy projekt zostanie ponownie skonfigurowany, a system kompilacji sprawdzi różne zależności, powinieneś zobaczyć dane wyjściowe podobne do poniższych:

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)

Proszę zwrócić uwagę na ostatnią część powyższej listy. Niektóre opcje ns-3 nie są domyślnie włączone lub wymagają obsługi systemu do prawidłowego działania. Na przykład, aby włączyć XmlTo, biblioteka musi być obecna w systemie libxml-2.0. Jeżeli nie odnaleziono tej biblioteki i nie włączono odpowiadającej jej funkcji ns-3, zostanie wyświetlony komunikat. Należy również pamiętać, że możliwe jest użycie polecenia sudo aby ustawić suid bit „ustaw identyfikator grupy w czasie wykonywania” dla niektórych programów. Nie jest ona domyślnie włączona i dlatego ta funkcja jest wyświetlana jako „niewłączona”. Na koniec, aby uzyskać listę włączonych opcji, użyj Waf z parametrem --check-config.

Wróćmy teraz do kompilacji debugowania zawierającej przykłady i testy.

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

System kompilacji jest teraz skonfigurowany i możesz tworzyć wersje debugowania programów ns-3, po prostu wpisując:

$ ./waf

Powyższe kroki mogły wymagać dwukrotnego zbudowania części systemu ns-3, ale teraz wiesz, jak zmienić konfigurację i zbudować zoptymalizowany kod.

Aby sprawdzić, który profil jest aktywny dla danej konfiguracji projektu, służy komenda:

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

Powyższy scenariusz kompilacja.py również wspiera argumenty --enable-examples и --enable-tests, ale inne opcje Waf nie obsługuje bezpośrednio. Na przykład to nie zadziała:

$ ./build.py --disable-python

reakcja będzie taka:

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

Jednakże operator specjalny - - może zostać użyty do przekazania dodatkowych parametrów WAFwięc zamiast powyższego zadziała następujące polecenie:

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

ponieważ generuje główne polecenie ./waf konfiguracji --disable-python. Oto kilka dodatkowych wskazówek wprowadzających na temat Waf.

Obsługa błędów kompilacji

Wersje ns-3 są testowane na najnowszych kompilatorach C++ dostępnych w momencie wydania w popularnych dystrybucjach Linuksa i MacOS. Jednak z czasem wydawane są nowe dystrybucje z nowymi kompilatorami, a te nowsze kompilatory są bardziej pedantyczne w kwestii ostrzeżeń. ns-3 konfiguruje swoją kompilację tak, aby traktować wszystkie ostrzeżenia jako błędy, więc czasami, jeśli używasz starszej wersji w nowszym systemie, ostrzeżenie kompilatora może zatrzymać kompilację.

Na przykład wcześniej wydano wersję ns-3.28 dla Fedory 28, która zawierała nową wersję główną gcc (gcc-8). Kompilując wersję ns-3.28 lub wcześniejsze wersje pod Fedorą 28, z zainstalowanym Gtk2+, wystąpi następujący błąd:

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

W wydaniach począwszy od ns-3.28.1, w Waf dostępna jest opcja rozwiązania tych problemów. Wyłącza ustawienie flagi „-Werror” w g++ i clang++. To jest opcja „--disable-werror”, którą należy zastosować podczas konfiguracji:

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

Skonfiguruj lub zmontuj

Niektóre polecenia Waf mają sens tylko w fazie konfiguracji, a niektóre są ważne tylko w fazie kompilacji. Na przykład, jeśli chcesz korzystać z funkcji emulacji ns-3, możesz włączyć ustawienie bitu suid za pomocą sudo, jak opisano powyżej. Spowoduje to zastąpienie poleceń kroku konfiguracji, dzięki czemu będziesz mógł zmienić konfigurację za pomocą następującego polecenia, które zawiera również przykłady i testy.

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

Jeśli to zrobisz Waf wystartuje sudoaby zmienić programy do tworzenia gniazd z kodem emulacji, aby działały z uprawnieniami korzeń, Waf Dostępnych jest wiele innych opcji konfiguracji i kompilacji. Aby poznać dostępne opcje, wpisz:

$ ./waf --help

W następnej sekcji użyjemy niektórych opcji związanych z testowaniem.

Profile montażowe

Widzieliśmy już, jak możesz skonfigurować Waf dla zgromadzeń debug и zoptymalizowane:

$ ./waf --build-profile=debug

Dostępny jest również pośredni profil montażowy, zwolnić. Opcja -d jest synonimem --build-profile. Profil kompilacji kontroluje użycie rejestrowania, potwierdzeń i przełączników optymalizacji kompilatora:

poradnik dotyczący symulatora sieci ns-3. Rozdział 3

Jak widać, rejestrowanie i asercje są dostępne tylko w kompilacjach debugowania. Zalecaną praktyką jest opracowanie skryptu w trybie debugowania, a następnie wykonanie wielokrotnych uruchomień (w celu uzyskania statystyk lub zmian parametrów) w zoptymalizowanym profilu kompilacji.

Jeśli masz kod, który powinien działać tylko w określonych profilach kompilacji, użyj makra opakowania kodu:

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

Domyślny, Waf umieszcza artefakty kompilacji w katalogu kompilacji. Za pomocą tej opcji możesz określić inny katalog wyjściowy - -outna przykład:

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

Łącząc to z profilami kompilacji, możesz łatwo przełączać się między różnymi opcjami kompilacji:

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

Pozwala to na pracę z wieloma złożeniami bez konieczności za każdym razem przepisywania najnowszego złożenia. Po przejściu na inny profil, Waf skompiluje tylko to, bez całkowitej ponownej kompilacji wszystkiego.

Kiedy przełączasz profile kompilacji w ten sposób, musisz uważać, aby za każdym razem podać te same opcje konfiguracji. Zdefiniowanie kilku zmiennych środowiskowych pomoże uniknąć błędów:

$ 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

Kompilatory i flagi

W powyższych przykładach Waf do zbudowania ns-3 używa kompilatora C++ z GCC ( g ++). Możesz jednak zmienić ten, którego używasz Waf Kompilator C++, poprzez zdefiniowanie zmiennej środowiskowej CXX. Na przykład, aby użyć kompilatora C++ Clang, clang++,

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

W ten sam sposób możesz skonfigurować Waf aby użyć kompilacji rozproszonej za pomocą odległość:

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

Więcej informacji na temat distcc i kompilacji rozproszonej można znaleźć na stronie projektu w sekcji Dokumentacja. Aby dodać flagi kompilatora podczas konfigurowania ns-3, użyj zmiennej środowiskowej CXXFLAGS_EXTRA.

Instalacja

Waf można wykorzystać do zainstalowania bibliotek w różnych miejscach systemu. Domyślnie skompilowane biblioteki i pliki wykonywalne znajdują się w katalogu budować, a ponieważ Waf zna lokalizację tych bibliotek i plików wykonywalnych, nie ma potrzeby instalowania bibliotek gdziekolwiek indziej.

Jeśli użytkownicy wolą instalować poza katalogiem kompilacji, mogą uruchomić tę komendę ./WAF zainstalować. Domyślnym prefiksem instalacji jest / Usr / localTak ./WAF zainstalować zainstaluje programy w / usr / local / bin, biblioteki w / usr / local / lib i pliki nagłówkowe w /usr/local/include. Prawa administratora zwykle muszą być ustawione z domyślnym przedrostkiem, więc typowe polecenie byłoby takie sudo ./waf zainstaluj. Po uruchomieniu Waf najpierw zdecyduje się użyć bibliotek współdzielonych w katalogu kompilacji, a następnie będzie szukać bibliotek wzdłuż ścieżki do bibliotek skonfigurowanych w środowisku lokalnym. Dlatego też podczas instalowania bibliotek w systemie dobrą praktyką jest sprawdzenie, czy używane są właściwe biblioteki. Użytkownicy mogą wybrać instalację z innym prefiksem, przekazując tę ​​opcję podczas konfiguracji --prefixna przykład:

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

Jeśli później, po kompilacji, użytkownik wprowadzi polecenie instalacji ./waf, zostanie użyty przedrostek /opt/lokalny.

Zespół ./waf clean należy użyć przed rekonfiguracją projektu, jeśli instalacja będzie korzystać Waf pod innym prefiksem.

Zatem, aby korzystać z ns-3, nie ma potrzeby dzwonienia ./waf install. Większość użytkowników nie będzie potrzebować tego polecenia, ponieważ Waf pobierze bieżące biblioteki z katalogu kompilacji, ale niektórzy użytkownicy mogą uznać to za przydatne, jeśli ich działania obejmują pracę z programami spoza katalogu ns-3.

Wafel singiel

Na najwyższym poziomie drzewa źródeł ns-3 znajduje się tylko jeden skrypt Waf. Gdy zaczniesz pracować, będziesz spędzać dużo czasu w katalogu scratch/ lub głębiejsrc/... a jednocześnie muszę biec Waf. Możesz po prostu zapamiętać, gdzie jesteś i uciec Waf w następujący sposób:

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

będzie to jednak żmudne i podatne na błędy, dlatego istnieją lepsze rozwiązania. Jednym z powszechnych sposobów jest użycie edytora tekstu, takiego jak emacs lub vim, w którym otwierane są dwie sesje terminalowe, jedna służy do budowania ns-3, a druga do edycji kodu źródłowego. Jeśli tylko masz Archiwum tar, wówczas zmienna środowiskowa może pomóc:

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

$ cd scratch 
$ waff build

W katalogu modułów kuszące może być dodanie trywialnego skryptu waf, takiego jak exec ../../waf. Proszę nie rób tego. Jest to mylące dla początkujących, a źle wykonane prowadzi do trudnych do wykrycia błędów kompilacji. Rozwiązania pokazane powyżej to ścieżka, którą należy zastosować.

3.5 Testowanie ns-3

Możesz uruchomić testy jednostkowe dystrybucji ns-3, uruchamiając skrypt ./test.py:

$ ./test.py

Testy te prowadzone są równolegle z Waf. Ostatecznie powinieneś zobaczyć komunikat o treści:

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

Jest to ważna wiadomość służąca do identyfikacji awarii, awarii lub błędów valgrind, wskazująca problemy z kodem lub niezgodność narzędzi z kodem.

Zobaczysz także końcowy wynik z Waf oraz tester uruchamiający każdy test, który będzie wyglądał mniej więcej tak:

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)

To polecenie jest zwykle uruchamiane przez użytkowników w celu szybkiego sprawdzenia, czy dystrybucja ns-3 jest poprawnie zbudowana. (Zauważ, że kolejność wierszy „PASS: …” może być inna, jest to normalne. Ważne jest, aby wiersz podsumowujący na końcu raportu wskazywał, że wszystkie testy przeszły pomyślnie; żaden z testów nie zakończył się niepowodzeniem ani awarią.) I Wafi test.py zrównolegli pracę na dostępnych rdzeniach procesorów maszyny.

3.6 Uruchamianie skryptu

Zwykle uruchamiamy skrypty pod kontrolą Waf. Dzięki temu system kompilacji może upewnić się, że ścieżki bibliotek współdzielonych są ustawione poprawnie i że biblioteki są dostępne w czasie wykonywania. Aby uruchomić program, wystarczy użyć Waf z parametrem - -run. Uruchommy odpowiednik ns-3 wszechobecnego programu hello worldwpisując następujące polecenie:

$ ./waf --run hello-simulator

Waf najpierw sprawdzi, czy program jest poprawnie zbudowany i w razie potrzeby skompiluje. Następnie Waf wykona program, który wygeneruje następujący wynik.

Hello Simulator

Gratulacje! Jesteś teraz użytkownikiem ns-3!

Co powinienem zrobić, jeśli nie widzę wyników?

Jeśli widzisz wiadomości Wafwskazując, że kompilacja zakończyła się pomyślnie, ale nie widzisz wyników „Witajcie, symulatorze”, istnieje możliwość, że w sekcji [Build-with-Waf] przełączyłeś tryb kompilacji zoptymalizowane, ale przegapiłem powrót do trybu debug. Wszystkie dane wyjściowe konsoli użyte w tym samouczku korzystają ze specjalnego komponentu ns-3, który wykonuje rejestrowanie i służy do drukowania niestandardowych komunikatów na konsoli. Dane wyjściowe tego komponentu są automatycznie wyłączane po skompilowaniu zoptymalizowanego kodu - jest to „zoptymalizowany”. Jeśli nie widzisz wyniku „Hello Simulator”, wprowadź następujące dane:

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

konfigurować Waf do budowania wersji debugujących programów ns-3, które zawierają przykłady i testy. Następnie powinieneś odbudować bieżącą wersję debugowania kodu, wpisując

$ ./waf

Teraz, jeśli uruchomisz program hello-symulator, powinieneś zobaczyć oczekiwany wynik.

3.6.1 Argumenty wiersza poleceń

Aby przekazać argumenty wiersza poleceń do programu ns-3, użyj następującego wzorca:

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

Zastępować do nazwy programu i argumentów. Argument - -command-template dla Waf jest zasadniczo przepisem na zbudowanie rzeczywistej linii poleceń Waf użyte do wykonania programu. Waf sprawdza, czy kompilacja została ukończona, ustawia ścieżki bibliotek współdzielonych, następnie korzysta z dostarczonego szablonu wiersza poleceń i zastępuje nazwę programu symbolem zastępczym %s, aby wywołać plik wykonywalny. Jeśli uważasz, że ta składnia jest skomplikowana, istnieje prostsza wersja, która wykorzystuje program ns-3 i jego argumenty ujęte w pojedyncze cudzysłowy:

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

Innym szczególnie przydatnym przykładem jest selektywne uruchamianie zestawów testów. Załóżmy, że istnieje zestaw testów o nazwie mytest (w rzeczywistości go nie ma). Powyżej użyliśmy skryptu ./test.py do równoległego uruchomienia kilku testów, co wielokrotnie wywołuje program testowy biegacz testowy. Dzwonić biegacz testowy bezpośrednio, aby uruchomić jeden test:

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

Argumenty zostaną przekazane do programu biegacz testowy. Ponieważ mytest nie istnieje, zostanie wygenerowany komunikat o błędzie. Aby wydrukować dostępne opcje programu testowego, wpisz:

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

3.6.2 Debugowanie

Aby uruchomić programy ns-3 za pomocą innego narzędzia, takiego jak debuger (na przykład gdb) lub narzędzie do testowania pamięci (na przykład Valgrind), użyj podobnego formularza - -command-template = "…". Na przykład, aby uruchomić w debugerze gdb twój program hello-simulator ns-3 z argumentami:

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

Należy pamiętać, że nazwa programu ns-3 jest dostarczana wraz z argumentem - -runi narzędzie do zarządzania (tutaj gdb) jest pierwszym tokenem w argumencie - -command-template. Opcja - -args informuje gdbże reszta wiersza poleceń należy do „niższego” programu. (Niektóre wersje gdb nie rozumiem tej opcji - -args. W takim przypadku usuń argumenty programu z - -command-template i użyj zestawu poleceń gdb args.) Możemy połączyć ten przepis z poprzednim, aby uruchomić test w debugerze:

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

3.6.3 Katalog roboczy

Waf powinien zostać wystrzelony ze swojego miejsca na szczycie drzewa ns-3. Folder ten staje się katalogiem roboczym, w którym zostaną zapisane pliki wyjściowe. Ale co, jeśli chcesz zachować te pliki poza drzewem źródłowym ns-3? Użyj argumentu - -cwd:

$ ./waf --cwd=...

Może się okazać, że wygodniej będzie umieścić pliki wyjściowe w katalogu roboczym. W takim przypadku pomocne mogą być następujące działania pośrednie:

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

Ta dekoracja poprzedniej wersji polecenia zachowuje bieżący katalog roboczy, przechodzi do katalogu Wafa potem instruuje Waf aby zmienić katalog roboczy z powrotem na bieżący katalog roboczy zapisany przed uruchomieniem programu. Wspominamy o zespole - -cwd Aby zapewnić kompletność, większość użytkowników po prostu uruchamia Waf z katalogu najwyższego poziomu i generuje tam pliki wyjściowe.

Ciąg dalszy: Rozdział 4

Źródło: www.habr.com

Dodaj komentarz