Tutorial do simulador de rede ns-3. Capítulo 3

Tutorial do simulador de rede ns-3. Capítulo 3
Capítulo 1,2

3 Primeiros passos
3.1 Visão geral
3.2 Pré-requisitos
3.2.1 Baixando a versão do ns-3 como arquivo fonte
3.3 Baixando o ns-3 usando Git
3.3.1 Carregando o ns-3 usando Bake
3.4 Montagem ns-3
3.4.1 Construindo com build.py
3.4.2 Construindo com Bake
3.4.3 Construir com Waf
3.5 Testando ns-3
3.6 Executando o script
3.6.1 Argumentos de linha de comando
3.6.2 Depuração
3.6.3 Diretório de trabalho

Capítulo 3

Introdução

Este capítulo pretende preparar o leitor para começar com um computador que talvez nunca tenha instalado o ns-3. Ele cobre plataformas suportadas, pré-requisitos, como obter o ns-3, como construir o ns-3 e como testar sua construção e executar programas simples.

3.1 Visão geral

O simulador ns-3 é construído como um sistema de bibliotecas de software colaborativas. Durante a montagem, o código dos programas do usuário é vinculado a essas bibliotecas. As linguagens de programação C++ ou Python são usadas para escrever programas personalizados.

O Ns-3 é distribuído como código-fonte, o que significa que o sistema alvo deve ter um ambiente de desenvolvimento de software para primeiro construir as bibliotecas e depois construir o programa do usuário. Em princípio, o ns-3 poderia ser distribuído como bibliotecas prontas para um sistema específico e, no futuro, poderá ser distribuído desta forma. Mas hoje em dia muitos usuários realmente fazem seu trabalho editando o próprio ns-3, então é útil ter o código fonte para construir as bibliotecas. Se alguém quiser assumir o trabalho de criação de bibliotecas e pacotes prontos para sistemas operacionais, entre em contato com a lista de discussão ns-desenvolvedores.

A seguir, veremos três maneiras de baixar e construir o ns-3. A primeira é baixar e construir o lançamento oficial no site principal. A segunda é a seleção e montagem de cópias das versões de desenvolvimento da instalação básica do ns-3. A terceira é usar ferramentas de construção adicionais para carregar mais extensões para o ns-3. Analisaremos cada um deles, pois as ferramentas são ligeiramente diferentes.

Usuários experientes do Linux podem se perguntar por que o ns-3 não é fornecido como um pacote como a maioria das outras bibliotecas que usam um gerenciador de pacotes. Embora existam pacotes binários para várias distribuições Linux (por exemplo, Debian), a maioria dos usuários acaba editando as bibliotecas e tendo que reconstruir o ns-3 por conta própria, portanto, ter o código-fonte disponível é útil. Por esse motivo, vamos nos concentrar na instalação a partir do código-fonte.

Para a maioria das aplicações, direitos ns-3 raiz não são necessários, é recomendado usar uma conta de usuário sem privilégios.

3.2 Pré-requisitos

Todo o conjunto de bibliotecas ns-3 disponíveis tem diversas dependências de bibliotecas de terceiros, mas na maior parte o ns-3 pode ser construído e usado com suporte para vários componentes comuns (geralmente instalados por padrão): um compilador C++, Python, um editor de código-fonte (por exemplo, vitalidade, emacs ou Eclipse) e, se forem usados ​​repositórios de desenvolvimento, sistemas de controle de versão Git. A maioria dos usuários iniciantes não precisará se preocupar se sua configuração relatar a falta de alguns recursos avançados do ns-3, mas para aqueles que desejam uma instalação completa, o projeto fornece um wiki que inclui páginas com muitas dicas e truques úteis. Uma dessas páginas é a página Instalação, com instruções de instalação para vários sistemas, disponível em: https://www.nsnam.org/wiki/Installation.

A seção Pré-requisitos deste wiki explica quais pacotes são necessários para suportar opções comuns do ns-3 e também fornece os comandos usados ​​para instalá-los em versões comuns do Linux ou macOS.

Você pode aproveitar esta oportunidade para explorar a página wiki do ns-3 ou o site principal: https://www.nsnam.org, porque há muita informação lá. Começando com a versão mais recente do ns-3 (ns-3.29), as seguintes ferramentas são necessárias para executar o ns-3:

Pacote/versão de ferramentas

  • Compilador C++
    clang++ ou g++ (g++ versão 4.9 ou superior)
  • Python
    versão python2 >= 2.7.10 ou versão python3 >=3.4
  • Git
    qualquer versão mais recente (para acessar o ns-3 em GitLab.com)
  • alcatrão
    qualquer versão mais recente (para descompactar a versão ns‑3)
  • Bunzip2
    qualquer versão mais recente (para descompactar a versão ns‑3)

Para verificar a versão padrão do Python, digite python -V. Para verificar a versão g++, digite g++ -v. Se alguma ferramenta estiver faltando ou for muito antiga, consulte o guia de instalação na página wiki do ns-3.

A partir deste ponto, presumimos que o leitor esteja executando Linux, MacOS ou um emulador de Linux e possua pelo menos as ferramentas acima.

3.2.1 Baixando a versão do ns-3 como arquivo fonte

Este é o curso de ação para um novo usuário que deseja baixar e experimentar as versões mais recentes e de pacotes do ns-3. As versões do ns-3 são publicadas como arquivos de origem compactados, às vezes chamados tarball. tarball é um formato especial de arquivo de software no qual vários arquivos são combinados. O arquivo geralmente é compactado. Processo de inicialização do ns-3 via tarball é simples, você só precisa selecionar uma versão, baixá-la e descompactá-la.

Vamos supor que você, como usuário, queira compilar o ns-3 em um diretório local chamado área de trabalho. Você pode obter uma cópia de trabalho do lançamento digitando o seguinte no console do Linux (substituindo os números de versão apropriados, é claro)

$ 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 

Preste atenção ao utilitário usado acima wget, que é uma ferramenta de linha de comando para baixar objetos da Internet. Se ainda não o instalou, você pode usar seu navegador para isso.

Seguir essas etapas o levará ao diretório ns-allinone-3.29, onde você deverá ver vários arquivos e diretórios

$ 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

Agora você está pronto para construir a distribuição base do ns-3 e pode passar para a seção sobre construção do ns-3.

3.3 Baixando o ns-3 usando Git

O código ns-3 está disponível nos repositórios Git em GitLab.com em https://gitlab.com/nsnam/. Grupo nsnam reúne os vários repositórios usados ​​por um projeto de código aberto.

A maneira mais fácil de começar a usar repositórios Git é bifurcar ou clonar o ambiente ns-3-alinona. Este é um conjunto de scripts que gerencia o carregamento e a montagem dos subsistemas ns-3 mais comumente usados. Se você é novo no Git, os termos “fork” e “clone” podem não ser familiares para você; nesse caso, recomendamos que você simplesmente clone (faça sua própria cópia) o repositório localizado em GitLab.com assim:

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

Nesta fase, a visualização do seu diretório ns-3-alinona ligeiramente diferente do diretório de arquivo de lançamento descrito acima. Deve ser algo assim:

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

Observe que existe um script baixar.py, que extrairá adicionalmente o ns-3 e o código-fonte que o acompanha. Aqui você tem uma escolha: baixar o snapshot de desenvolvimento mais recente do ns-3:

$ python download.py

ou prefira a versão ns-3 usando a flag -n para indicar o número da versão:

$ python download.py -n ns-3.29

Após esta etapa para o diretório ns-3-alinona repositórios adicionais serão baixados ns-3, assar, pybindgen и netanim.

Nota
Em uma máquina com Ubuntu16.04 limpo, precisei alterar o comando para este: $ sudo python3 download.py -n ns-3.29 (doravante notas do tradutor).

3.3.1 Carregando o ns-3 usando Bake

Os dois métodos acima (arquivo fonte ou repositório ns-3-alinona via Git) são úteis para obter a instalação mais simples do ns-3 com vários addons(pybindgen para gerar ligações Python e netanim para animação em rede). O terceiro repositório fornecido por padrão no ns-3-allinone é chamado assar.

assar é uma ferramenta para construção coordenada de software a partir de múltiplos repositórios, desenvolvida para o projeto ns-3. assar pode ser usado para obter versões de desenvolvimento do ns-3, bem como para baixar e construir extensões da versão base da distribuição ns-3, como o ambiente Execução Direta de Código, Berço de simulação CradleNetwork, a capacidade de criar novas ligações Python e vários “aplicativos” ns-3.

Nota
CradleNetwork Simulation Cradle é uma estrutura que permite usar pilhas de rede TCP/IP reais dentro de um simulador de rede.

Se você espera que sua instalação do ns-3 tenha recursos avançados ou adicionais, você pode seguir este caminho de instalação.

Nos últimos lançamentos do ns-3 assar foi adicionado à versão tar. A versão inclui um arquivo de configuração que permite baixar as versões atuais do software no momento da versão. Isto é, por exemplo, versão assar, que é distribuído com a versão ns-3.29, pode ser usado para recuperar componentes para aquela versão do ns-3 ou anterior, mas não pode ser usado para recuperar componentes para versões posteriores (se o arquivo de descrição do pacote Bakeconf.xml não atualizado).

Você também pode obter a cópia mais recente assardigitando o seguinte comando em seu console Linux (supondo que você tenha o Git instalado):

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

Ao executar o comando git, você deverá ver algo como o seguinte:

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.

Depois que o comando for concluído clonar você deve ter um diretório chamado assar, cujo conteúdo deve ser parecido com isto:

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

Observe que você carregou vários scripts Python, um módulo Python chamado assar e um arquivo de configuração XML. O próximo passo é usar esses scripts para baixar e construir a distribuição ns-3 de sua escolha. Vários alvos de personalização estão disponíveis:

  1. ns-3.29: módulo correspondente ao release; ele baixará componentes semelhantes ao lançamento no tarball;

  2. ns-3-dev: um módulo semelhante, mas usando código da árvore de desenvolvimento;

  3. ns-alinona-3.29: Um módulo que inclui outros recursos adicionais, como roteamento de clique e suporte de simulação de rede, Openflow para ns-3.

  4. ns-3-alinona: semelhante à versão de lançamento do módulo allinone, mas para código de desenvolvimento.

Nota
Clique — arquitetura modular de software para criação de roteadores.

Openflow é um protocolo para gerenciar o processo de processamento de dados transmitidos em uma rede de dados por roteadores e switches, implementando tecnologia de rede definida por software.

O snapshot de desenvolvimento atual (sem lançamento) do ns-3 pode ser encontrado em:https://gitlab.com/nsnam/ns-3-dev.git.

Os desenvolvedores tentam manter esses repositórios em um funcionamento consistente, mas eles estão na área de desenvolvimento e contêm código não lançado, portanto, se você não planeja usar novos recursos, selecione o lançamento oficial.

Você pode encontrar a versão mais recente do código navegando na lista de repositórios ou acessando a página de lançamentos do ns-3:https://www.nsnam.org/releases/ e clicando no link da versão mais recente. Neste exemplo continuaremos com o ns-3.29.

Agora, para obter os componentes do ns-3 que precisamos, usaremos a ferramenta assar. Digamos algumas palavras introdutórias sobre o trabalho assar.

Bake funciona carregando fontes de pacotes em um diretório fonte e instalando as bibliotecas no diretório de construção. assar pode ser executado referenciando o binário, mas se você quiser executar assar não do diretório em que foi baixado, é aconselhável adicionar o caminho para assar ao seu caminho (variável de ambiente PATH), por exemplo como segue (exemplo para Linux bash shell). Vá para o diretório "bake" e defina as seguintes variáveis ​​de ambiente:

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

Isto colocará o programa assar.py para o caminho do shell e permitirá que outros programas encontrem os executáveis ​​​​e bibliotecas que ele criou assar. Em alguns casos de uso assar, a configuração PATH e PYTHONPATH descrita acima não é necessária, mas uma compilação completa do ns-3-allinone (com pacotes adicionais) geralmente a requer.

Vá para o seu diretório de trabalho e digite o seguinte no console:

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

A seguir vamos perguntar assar verifique se temos ferramentas suficientes para carregar os vários componentes. Disque:

$ ./bake.py check

Você deverá ver algo como o seguinte:

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

Em particular, ferramentas de upload como Mercurial, CVS, Git e Bazaar são essenciais nesta etapa, pois nos permitem obter o código. Nesta fase, instale as ferramentas que faltam da maneira usual para o seu sistema (se você souber como) ou entre em contato com o administrador do sistema para obter ajuda.

Em seguida, tente baixar o software:

$ ./bake.py download

o resultado deve ser algo como:

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

Isso significará que três fontes foram baixadas. Agora vá para o diretório de origem e digite ls; Você deveria ver:

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

Agora você está pronto para construir a distribuição ns-3.

3.4 Montagem ns-3

Assim como acontece com o download do ns-3, existem várias maneiras de construir o ns-3. A principal coisa que queremos enfatizar é que o ns-3 é construído usando uma ferramenta de construção chamada WafDescrito abaixo. A maioria dos usuários trabalhará com Waf, mas existem alguns scripts úteis para ajudá-lo a começar ou organizar compilações mais complexas. Então, por favor, antes de ler sobre Waf, dê uma olhada construir.py e montagem com assar.

3.4.1 Construindo com build.py

Atenção! Esta etapa de construção está disponível apenas na versão do arquivo fonte obtida conforme descrito acima; e não baixado via git ou bake.

Ao trabalhar com um arquivo de lançamento tarballEm ns-3-alinona Existe um script útil que pode facilitar a montagem dos componentes. Chama-se build.py. Este programa configurará o projeto para você da maneira mais útil. Entretanto, observe que a configuração mais avançada e o trabalho com o ns-3 geralmente envolvem o uso do próprio sistema de compilação do ns-3, o Waf, que será apresentado posteriormente neste tutorial.

Se você baixou usando tarball, então no seu diretório ~ / espaço de trabalho um diretório com um nome parecido com ns-alinona-3.29. Digite o seguinte:

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

Mediante chamada construir.py Usamos argumentos de linha de comando para construir os exemplos e testes usados ​​neste tutorial, que não são construídos por padrão no ns-3. Por padrão, o programa também cria todos os módulos disponíveis. Então, se desejar, você pode construir o ns-3 sem exemplos e testes, ou excluir módulos que não são necessários para o seu trabalho.

Você verá muitas mensagens de saída do compilador exibidas pelo script à medida que ele constrói as diversas partes que você carregou. Primeiro o script tentará construir o animador netanim, então o gerador de ligação pybindgen e finalmente ns-3. Quando o processo for concluído, você deverá ver o seguinte:

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

Nas últimas três linhas da listagem vemos uma mensagem sobre módulos que não foram construídos:

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

Isto significa simplesmente que alguns módulos do ns-3 que dependem de bibliotecas externas podem não ter sido construídos, ou que não é necessário compilá-los para esta configuração. Isso não significa que o simulador não esteja montado ou que os módulos montados não funcionarão corretamente.

3.4.2 Construindo com Bake

Se você usou o Bake acima para obter o código-fonte dos repositórios do projeto, você pode continuar a usá-lo para construir o ns-3. Disque:

$ ./bake.py build

e você deverá ver algo como:

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

Sugestão: você também pode executar as etapas de download e compilação ao mesmo tempo chamando "bake.py deploy".

A montagem de todos os componentes poderá falhar, mas a montagem continuará se um componente não for necessário. Por exemplo, um problema recente de portabilidade foi que castxml pode ser montado por ferramenta assar não em todas as plataformas. Neste caso, aparecerá uma mensagem como esta:

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

contudo castxml necessário apenas se você quiser criar ligações Python atualizadas. Para a maioria dos usuários não há necessidade disso (pelo menos até que eles mudem o ns-3), então tais avisos podem ser ignorados com segurança por enquanto.

Se falhar, o comando a seguir lhe dará uma dica sobre dependências ausentes:

$ ./bake.py show

As diversas dependências dos pacotes que você está tentando construir serão listadas.

3.4.3 Construir com Waf

Até este ponto, para começar a construir o ns-3, usamos o script construir.pyou ferramenta assar. Essas ferramentas são úteis para construir o ns-3 e manter bibliotecas. Na verdade, para construir eles executam a ferramenta de construção Waf do diretório ns-3. Waf instalado com o código fonte do ns-3. A maioria dos usuários passa rapidamente para o uso direto para configurar e montar o ns‑3 Waf. Então, para continuar, vá para o diretório ns-3 que você criou originalmente.

Isto não é estritamente necessário neste momento, mas será útil voltar um pouco e ver como fazer alterações na configuração do projeto. Provavelmente, a alteração de configuração mais útil que você pode fazer é criar uma versão otimizada do código. Por padrão, você configurou seu projeto para construir uma versão de depuração. Vamos dar uma olhada em um projeto para criar uma compilação otimizada. Para explicar ao Waf que ele deve fazer compilações otimizadas que incluam exemplos e testes, você precisará executar os seguintes comandos:

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

Isso vai lançar Waf fora do diretório local (para sua conveniência). O primeiro comando limpa a compilação anterior, isso geralmente não é estritamente necessário, mas é uma boa prática (veja também os perfis de compilação abaixo); isso excluirá bibliotecas e arquivos de objetos criados anteriormente localizados no diretório Construir/. Quando o projeto for reconfigurado e o sistema de compilação verificar as diversas dependências, você deverá ver uma saída semelhante a esta:

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)

Observe a última parte da listagem acima. Algumas opções do ns-3 não estão habilitadas por padrão ou requerem suporte do sistema para funcionar corretamente. Por exemplo, para habilitar XmlTo, a biblioteca deve estar presente no sistema libxml-2.0. Se esta biblioteca não for encontrada e a função ns-3 correspondente não estiver habilitada, uma mensagem será exibida. Observe também que é possível usar o comando sudo para definir o bit suid “definir ID do grupo em tempo de execução” para determinados programas. Não está habilitado por padrão e portanto este recurso aparece como “não habilitado”. Finalmente, para obter uma lista de opções habilitadas, use Waf com parâmetro --check-config.

Agora vamos voltar para a compilação de depuração contendo exemplos e testes.

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

O sistema de compilação agora está configurado e você pode criar versões de depuração de programas ns-3 simplesmente digitando:

$ ./waf

As etapas acima podem ter forçado você a construir parte do sistema ns-3 duas vezes, mas agora você sabe como alterar a configuração e construir código otimizado.

Para verificar qual perfil está ativo para uma determinada configuração de projeto, existe um comando:

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

O cenário acima construir.py também apoia argumentos --enable-examples и --enable-tests, mas outras opções Waf não suporta diretamente. Por exemplo, isso não funcionará:

$ ./build.py --disable-python

a reação será assim:

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

Entretanto, o operador especial - - pode ser usado para passar parâmetros adicionais via WAFentão, em vez do acima, o seguinte comando funcionará:

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

porque gera o comando principal ./waf configure --disable-python. Aqui estão mais algumas dicas introdutórias sobre Waf.

Lidando com erros de compilação

As versões do ns-3 são testadas nos compiladores C++ mais recentes disponíveis no momento do lançamento em distribuições comuns de Linux e MacOS. No entanto, com o tempo, novas distribuições são lançadas com novos compiladores, e esses compiladores mais novos tendem a ser mais pedantes quanto aos avisos. O ns-3 configura sua compilação para tratar todos os avisos como erros; portanto, às vezes, se você estiver executando uma versão mais antiga em um sistema mais recente, um aviso do compilador poderá interromper a compilação.

Por exemplo, houve anteriormente um lançamento do ns‑3.28 para o Fedora 28, que incluía uma nova versão principal gcc (gcc-8). Construindo a versão ns-3.28 ou versões anteriores no Fedora 28, com Gtk2+ instalado, ocorrerá o seguinte erro:

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

Nas versões a partir de ns-3.28.1, em Waf uma opção está disponível para resolver esses problemas. Ele desativa a configuração do sinalizador "-Werror" em g++ e clang++. Esta é a opção "--disable-werror" e deve ser aplicada durante a configuração:

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

Configurar ou montar

Alguns comandos Waf têm significado apenas na fase de configuração e alguns são válidos apenas na fase de construção. Por exemplo, se quiser usar os recursos de emulação do ns-3, você pode ativar a configuração de bits suid usando sudo, como descrito acima. Isso substituirá os comandos da etapa de configuração e, portanto, você poderá alterar a configuração usando o comando a seguir, que também inclui exemplos e testes.

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

Se você fizer isto Waf vai lançar sudopara alterar os programas de criação de soquete de código de emulação para serem executados com permissões raiz. Em Waf Existem muitas outras opções disponíveis para as etapas de configuração e construção. Para explorar suas opções, digite:

$ ./waf --help

Na próxima seção usaremos algumas opções relacionadas a testes.

Perfis de montagem

Já vimos como você pode configurar Waf para montagens depurar и otimizado:

$ ./waf --build-profile=debug

Há também um perfil de montagem intermediário, liberar. Opção -d é sinônimo --build-profile. O perfil de construção controla o uso de log, asserções e opções de otimização do compilador:

Tutorial do simulador de rede ns-3. Capítulo 3

Como você pode ver, o registro em log e as asserções estão disponíveis apenas em compilações de depuração. A prática recomendada é desenvolver seu script no modo de depuração e, em seguida, executar execuções repetidas (para estatísticas ou alterações de parâmetros) em um perfil de construção otimizado.

Se você tiver código que deve ser executado apenas em determinados perfis de construção, use a macro 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;)

Por padrão Waf coloca artefatos de construção no diretório de construção. Você pode especificar um diretório de saída diferente usando a opção - -out, Por exemplo:

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

Ao combinar isso com perfis de construção, você pode alternar facilmente entre diferentes opções de compilação:

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

O que permite trabalhar com vários assemblies sem ter que reescrever o último a cada vez. Quando você muda para outro perfil, Waf irá compilar apenas ele, sem recompilar tudo completamente.

Ao alternar perfis de construção dessa maneira, você precisa ter cuidado para fornecer sempre as mesmas opções de configuração. Definir diversas variáveis ​​de ambiente ajudará você a evitar erros:

$ 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

Compiladores e sinalizadores

Nos exemplos acima Waf para construir o ns-3 usa o compilador C++ do GCC ( g ++). No entanto, você pode alterar aquele que usa Waf Compilador C++, definindo a variável de ambiente CXX. Por exemplo, para usar o compilador C++ Clang, clang++,

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

Da mesma forma você pode configurar Waf usar compilação distribuída usando distcc:

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

Mais informações sobre distcc e compilação distribuída podem ser encontradas na página do projeto na seção Documentação. Para adicionar flags do compilador ao configurar o ns-3, use a variável de ambiente CXXFLAGS_EXTRA.

Instalação

Waf pode ser usado para instalar bibliotecas em diferentes locais do sistema. Por padrão, as bibliotecas e executáveis ​​compilados estão localizados no diretório construir, e como o Waf conhece a localização dessas bibliotecas e executáveis, não há necessidade de instalar as bibliotecas em nenhum outro lugar.

Se os usuários preferirem instalar fora do diretório de construção, eles podem executar o comando ./waf instalar. O prefixo padrão para instalação é / usr / localé por isso ./waf instalar irá instalar programas em / usr / local / bin, bibliotecas em / usr / local / lib e arquivos de cabeçalho em / usr / local / include. Os direitos de superusuário geralmente precisam ser definidos com um prefixo padrão, portanto, um comando típico seria sudo ./waf instalar. Quando iniciado, o Waf escolherá primeiro usar as bibliotecas compartilhadas no diretório de construção e, em seguida, procurará as bibliotecas ao longo do caminho para as bibliotecas configuradas no ambiente local. Portanto, ao instalar bibliotecas em um sistema, é uma boa prática verificar se as bibliotecas corretas estão sendo utilizadas. Os usuários podem optar por instalar com um prefixo diferente, passando a opção durante a configuração --prefix, Por exemplo:

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

Se mais tarde, após a construção, o usuário inserir o comando de instalação ./waf, o prefixo será usado / opt / local.

Equipe ./waf clean deve ser usado antes de reconfigurar o projeto se a instalação usar Waf sob um prefixo diferente.

Assim, para usar o ns-3 não há necessidade de chamar ./waf install. A maioria dos usuários não precisará deste comando porque Waf irá selecionar as bibliotecas atuais do diretório build, mas alguns usuários podem achar isso útil se suas atividades envolverem trabalhar com programas fora do diretório ns-3.

Waf solteiro

No nível superior da árvore de origem do ns-3, existe apenas um script Waf. Depois de começar a trabalhar, você passará muito tempo no diretório scratch/ ou mais profundamentesrc/... e ao mesmo tempo tem que correr Waf. Você pode apenas lembrar onde você está e correr Waf da seguinte maneira:

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

mas isso será tedioso e sujeito a erros, portanto, existem soluções melhores. Uma maneira comum é usar um editor de texto como emacs ou vitalidade, no qual duas sessões de terminal são abertas, uma é usada para construir o ns-3 e a segunda é usada para editar o código-fonte. Se você só tiver tarball, então uma variável de ambiente pode ajudar:

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

$ cd scratch 
$ waff build

No diretório do módulo pode ser tentador adicionar um script waf trivial como exec ../../waf. Por favor, não faça isso. Isso é confuso para iniciantes e, quando mal feito, leva a erros de compilação difíceis de detectar. As soluções mostradas acima são o caminho que deve ser utilizado.

3.5 Testando ns-3

Você pode executar os testes unitários da distribuição ns-3 executando o script ./teste.py:

$ ./test.py

Esses testes são executados em paralelo com Waf. Eventualmente você deverá ver uma mensagem dizendo:

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

Esta é uma mensagem importante para identificar travamentos, travamentos ou erros do valgrind, indicando problemas no código ou incompatibilidade entre ferramentas e código.

Você também verá o resultado final de Waf e um testador executando cada teste, que será mais ou menos assim:

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)

Este comando geralmente é executado pelos usuários para verificar rapidamente se a distribuição do ns-3 foi construída corretamente. (Observe que a ordem das linhas "PASS: ..." pode ser diferente, isso é normal. O importante é que a linha de resumo no final do relatório mostra que todos os testes foram aprovados; nenhum teste falhou ou travou.) E WafE teste.py paralelizará o trabalho nos núcleos de processador disponíveis da máquina.

3.6 Executando o script

Geralmente executamos scripts sob controle Waf. Isso permite que o sistema de compilação garanta que os caminhos das bibliotecas compartilhadas sejam configurados corretamente e que as bibliotecas estejam disponíveis em tempo de execução. Para executar o programa, basta usar Waf com parâmetro - -run. Vamos executar o equivalente ns-3 do programa onipresente Olá mundodigitando o seguinte:

$ ./waf --run hello-simulator

O Waf primeiro verificará se o programa foi compilado corretamente e compilará se necessário. Então Waf executará um programa que produz a seguinte saída.

Hello Simulator

Parabéns! Agora você é um usuário do ns-3!

O que devo fazer se não ver resultados?

Se você vir mensagens Wafindicando que a compilação foi concluída com sucesso, mas você não vê a saída "Olá Simulador", então existe a possibilidade de que na seção [Build-with-Waf] você tenha mudado seu modo de construção para otimizado, mas não consegui voltar ao modo depurar. Toda a saída do console usada neste tutorial usa um componente especial do ns-3 que realiza registro e é usado para imprimir mensagens personalizadas no console. A saída deste componente é automaticamente desativada quando o código otimizado é compilado - ele é "otimizado". Se você não vir a saída "Hello Simulator", digite o seguinte:

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

para configurar Waf para construir versões de depuração de programas ns-3, que incluem exemplos e testes. Você deve então reconstruir a versão de depuração atual do código digitando

$ ./waf

Agora, se você executar o programa olá-simulador, você deverá ver o resultado esperado.

3.6.1 Argumentos de linha de comando

Para passar argumentos de linha de comando para o programa ns-3, use o seguinte padrão:

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

Substituir ao nome do seu programa e aos argumentos. Argumento - -command-template para Waf é essencialmente uma receita para construir a linha de comando real Waf usado para executar o programa. O Waf verifica se a compilação foi concluída, define os caminhos da biblioteca compartilhada, usa o modelo de linha de comando fornecido e substitui o nome do programa pelo espaço reservado %s para chamar o executável. Se você achar esta sintaxe complicada, existe uma versão mais simples que envolve o programa ns-3 e seus argumentos entre aspas simples:

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

Outro exemplo particularmente útil é a execução seletiva de conjuntos de testes. Vamos supor que exista um conjunto de testes chamado mytest (na verdade não existe). Acima, usamos o script ./test.py para executar vários testes em paralelo, que chama repetidamente o programa de teste corredor de provas. Chamar corredor de provas diretamente para executar um teste:

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

Argumentos serão passados ​​para o programa corredor de provas. Como mytest não existe, uma mensagem de erro será gerada. Para imprimir as opções disponíveis do executor de teste, digite:

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

3.6.2 Depuração

Para executar programas do ns-3 sob outro utilitário, como um depurador (por exemplo, gdb) ou uma ferramenta de teste de memória (por exemplo, Valgrind), use um formulário semelhante - -command-template = "…". Por exemplo, para executar no depurador gdb seu programa hello-simulator ns-3 com argumentos:

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

Observe que o nome do programa ns-3 vem com o argumento - -rune o utilitário de gerenciamento (aqui gdb) é o primeiro token no argumento - -command-template. Opção - -args relatórios gdbque o resto da linha de comando pertence ao programa "inferior". (Algumas versões gdb não entendo a opção - -args. Neste caso, remova os argumentos do programa de - -command-template e use o conjunto de comandos gdb args.) Podemos combinar esta receita e a anterior para executar o teste no depurador:

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

3.6.3 Diretório de trabalho

O Waf deve ser lançado a partir de sua localização no topo da árvore do ns-3. Esta pasta se torna o diretório de trabalho onde os arquivos de saída serão gravados. Mas e se você quiser manter esses arquivos fora da árvore de origem do ns-3? Usar argumento - -cwd:

$ ./waf --cwd=...

Você pode achar mais conveniente obter os arquivos de saída em seu diretório de trabalho. Neste caso, as seguintes ações indiretas podem ajudar:

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

Esta decoração da versão anterior do comando preserva o diretório de trabalho atual, vai para o diretório Wafe então instrui Waf para alterar o diretório de trabalho de volta para o diretório de trabalho atual salvo antes de iniciar o programa. Mencionamos a equipe - -cwd Para completar, a maioria dos usuários simplesmente executa o Waf no diretório de nível superior e gera arquivos de saída lá.

Continuação: Capítulo 4

Fonte: habr.com

Adicionar um comentário