LLTR Parte 1: Primeiras etapas no OMNeT ++ e INET

OMNeT ++ (Trabalho de Módulo Objetivo testado em C ++ ) O Discrete Event Simulator é uma biblioteca e estrutura C ++ modular e orientada a componentes para modelagem de eventos discretos , usada principalmente para criar simuladores de rede . Simplificando, este é um "simulador de eventos discretos", incluindo: um IDE para criar modelos e o próprio simulador (GUI).


O INET Framework é uma "biblioteca" de modelos de rede para o OMNeT ++ .


KDPV: LLTR Parte 1 - OMNeT ++ 5 o Open Simulator :: Modelo LLTR :: para uso em liberdade


GIF completo (15,7 MiB)


Nas partes anteriores ...


0. Detecção automática de topologia de rede e comutadores não gerenciados. Missão impossível? (+ clássico Habrahabr UserCSS )


Nesta parte:


  • crie o “seu primeiro” protocolo (usando o LLTR Basic como exemplo);
  • escolha o simulador de cidade apropriado para depurar o protocolo (e criar seu modelo);
  • aprendemos as sutilezas da configuração do ambiente para o simulador e seu IDE (configuração, compilação, vinculação, ajuste, aplicação de patches, ignorando a documentação desatualizada; e outros inglés em grande número);
  • encontraremos tudo o que você pode encontrar ao criar seu primeiro modelo de seu primeiro protocolo em um simulador de rede desconhecido;
  • vamos juntos:
    • da felicidade trazida pela compilação bem-sucedida (finalmente!) do primeiro projeto com uma rede vazia,
    • até completamente imerso em experimentos com um modelo de protocolo funcional;
  • tutorial , tudo é descrito como um tutorial - vamos aprender com os erros - vamos cometê-los e entendê-los (natureza) para lidar com eles de maneira elegante e eficiente;
  • repositório (git ), nas confirmações e tags das quais todas as etapas ( "Adicionar ..." , "Corrigir ..." , "Corrigir ..." , "Modificar ..." , "Corrigir ..." , ...) são salvas, do começo ao fim.


Nota : informações adicionais para os leitores do hub "Mesh-network".


{volume de imagens: 2.2+ (2.1) MiB; Texto: 484 KiB; Emoticons: 22 pcs. }


Nota : [sobre a estrutura de partição usada] a estrutura das seções de tutorial / instruções geralmente é diferente da estrutura de seção no diretório: no diretório, a estrutura de seção permite alcançar as informações necessárias em um número mínimo de etapas (árvore balanceada); no tutorial / instruções, onde as seções estão fortemente conectadas logicamente, e uma seção separada, de fato, é uma das etapas na sequência de etapas, a estrutura é uma hierarquia de indicadores (âncoras), que permite lembrar (consulte ) sobre o fragmento descrito anteriormente.


off - topic: sobre a tag <section> html5 e as tags de cabeçalho <h #>

É bom que a tag <section> apareça no HTML5. Com essa ajuda, foi possível definir diretamente o nível de aninhamento da seção (manipulando o aninhamento das tags <section> entre si). A estrutura do texto agora pode ser refletida explicitamente no aninhamento (hierarquia) de tags.


Isso também afetou as tags de cabeçalho <h#> , como Como o aninhamento de seções é determinado pelo aninhamento da <section> , para indicar o nome da seção, basta usar apenas uma <h1> no formato: " <section><h1> </h1> </section> ".


Uso isso há muito tempo (desde a aparência de <section> ), mas ao criar este artigo, vi outra vantagem em usar <section> .


Um bom título de seção deve refletir com precisão sua essência; no entanto, há momentos em que você precisa manter (não divulgar) a essência até o meio da seção. Ou seja, essa seção deve primeiro se tornar "rotina" e no meio criar um "efeito wow / wtf". Logicamente, isso é tudo - uma seção, mas se você revelar seu nome no início da seção, o próprio nome será um spoiler . Imagine um livro (história de detetive) na capa, com todas as informações sobre o "assassino".


É aqui que a tag <section> "entra em cena". Permite determinar o nome da seção em qualquer lugar dentro de si, ou seja, não necessariamente no começo. Exemplo: " <section> <h1> </h1> </section> ". Acontece que podemos salvar simultaneamente a estrutura lógica do texto e mostrar o nome da seção no momento certo. Você pode até fazer com que o título da seção apareça visualmente no início, depois que o leitor atingir um determinado ponto (a <h1> em html).


Em pouco mais de 9 anos da existência da <section> , os navegadores não aprenderam como criar adequadamente um "esboço de documento HTML5" para garantir a acessibilidade .


Por que você não aprendeu? Em um documento com uma estrutura complexa, é difícil * determinar a partir de qual tag (seção, artigo, ...) a numeração dos títulos (h1, h2, h3, ...) deve começar. Agora imagine que o próprio documento é colocado em uma página como esta (com muitos blocos adicionais que não estão relacionados ao documento em si, mas têm cabeçalhos), e h1 é usado em todos os lugares para cabeçalhos. E se em uma página não um documento, mas vários? No entanto, visualmente tudo parece bom ( documento de exemplo ).


* - na verdade, não é difícil, tudo está descrito no padrão , mas, na realidade, não funciona (explicação abaixo).


Por que tudo parece bom visualmente? Aqui, graças aos estilos , surgiram informações adicionais - a correspondência entre a hierarquia da seção e os níveis do cabeçalho (h #). Então, talvez, ao criar o "esboço do documento HTML5", você deva usar as informações do CSS? Para fazer isso, você precisa adicionar uma propriedade adicional ao elemento CSS para o elemento title indicando seu nível, por exemplo:


 body>section>h2                                 { heading-level: 1; font-size: 1.8em;  } body>section>section>h2                         { heading-level: 2; font-size: 1.4em;  } body>section>section>section>h2                 { heading-level: 3; font-size: 1.17em; } body>section>section>section>section>h2        { heading-level: 4; font-size: 1em;   } body>section>section>section>section>section>h2 { heading-level: 5; font-size: 0.83em; } 


Ou uma opção mais rigorosa - apenas um cabeçalho é permitido em uma seção. Nesse caso, o nível do cabeçalho é definido pela própria seção:


 body>section                                { heading-level: 1; } body>section>section                        { heading-level: 2; } body>section>section>section                { heading-level: 3; } body>section>section>section>section        { heading-level: 4; } body>section>section>section>section>section { heading-level: 5; } 


, e não importa qual tag de cabeçalho será usada no final: h1 ou h5.


No entanto, se antes para criar um " esboço no nível do cabeçalho " era suficiente ter apenas marcação (HTML), agora também precisamos de estilos (CSS). Talvez você possa se limitar a apenas marcação (HTML)? Com essa pergunta, chegamos perto do problema do algoritmo de construção "esboço no nível da rubrica" ​​descrito no padrão. Portanto, o problema não está no próprio algoritmo, mas no fato de que apenas um conjunto limitado (fixo) de tags pode atuar como um elemento de " raiz de corte ". Mas as pessoas geralmente têm “desejos não padronizados”: “Quero que a tag do artigo seja o elemento 'raiz de seção' 'na minha página de lista de artigos,“ e quero que a seção arbitrária se torne o elemento' raiz de seção '”. Anteriormente, bastava usar várias tags h1 em uma página (e usaram). Portanto, certifique-se de que qualquer seção (tags: section, article, ...) se torne um elemento de "raiz de seção" se o título for definido usando a tag h1?



# Primeiros passos: “antes da modelagem” / “brainstorming”


Folheto

OVNI voou e deixou essa lacuna aqui ? O verso do folheto do artigo anterior .


# Detalhes do protocolo


No começo, definimos o que precisamos incluir no protocolo. No exemplo do LLTR Basic.


A base do LLTR são as iterações da coleta de estatísticas em vários hosts durante a varredura em rede. Existem muitas iterações no LLTR (> 1) , portanto, a primeira coisa a incluir no protocolo é controlar o início e a parada de cada iteração. Se considerarmos que existem muitos hosts (> 1) , o controle consistirá em informar todos os hosts de uma certa maneira sobre o horário de início da iteração e o horário de término da iteração. Ou seja, sincronize todos os hosts.


Cada iteração possui seu próprio host unicast src e host dst unicast, portanto, a próxima coisa a ser habilitada é a maneira de atribuir unicast src e dst para cada iteração. Ou seja, em cada iteração, um dos hosts deve "estar ciente" de si mesmo como um host unicast src, cujo objetivo é enviar tráfego para o host unicst dst.


E o último. Após a conclusão de todas as iterações, todas as estatísticas coletadas de todos os hosts devem ser enviadas para um host para processamento. Este host analisará as estatísticas coletadas e criará a topologia de rede.


Além disso, nesta etapa, você pode pensar em alguns detalhes de implementação (limitações) do protocolo. Por exemplo, queremos que um programa usando LLTR seja capaz de trabalhar sem direitos de root e do espaço do usuário (ou seja, sem instalar um driver especial no sistema), o que significa que o LLTR deve funcionar, por exemplo, em TCP e UDP.


Todos os outros fizeram a implementação, eles decidirão por si mesmos no processo de criação do modelo. Isto é, é claro, você pode pensar imediatamente em tudo, nos mínimos detalhes, mas ao mesmo tempo, corre-se o risco de "cair no local ideal" e não perceber uma opção de implementação "melhor". É bom quando haverá vários modelos - se houver um modelo para cada opção de implementação, será possível combinar modelos e, passo a passo, chegar a uma implementação melhor. Lembrando o algoritmo genético ;). Por exemplo, em uma implementação / modelo, pode haver gerenciamento centralizado, em outra - descentralizada, na terceira - uma combinação das melhores partes das duas opções anteriores.


# Escolhendo um simulador de rede


Agora é hora de decidir sobre um simulador de rede no qual criaremos modelos e faremos experimentos.


Basicamente, a partir de um simulador de rede, precisamos implementar o "nosso" protocolo. Nem todos os simuladores facilitam.


Mas a presença de emuladores de sistemas operacionais de equipamentos de rede reais de "marcas mundiais", pelo contrário, não é necessária. Muito provavelmente, os emuladores criarão muitas limitações que só interferirão nos experimentos.


Com a escolha do simulador, o artigo Avaliando as ferramentas de simulação de rede (meus requisitos para o simulador em muitos aspectos coincidiram) e a simulação geral de 'rede' do OMNeT ++ me ajudaram.


# Instale OMNeT ++ e INET


Faça o download do OMNeT ++ 5.0 .


E como o OMNeT ++ é apenas um “simulador de eventos discretos”, você também precisará do INET , uma biblioteca de modelos de rede (protocolos e dispositivos). Faça o download do INET 3.4.0 . Na verdade, ele pode ser instalado a partir do IDE , mas eu recomendo instalá- lo manualmente (mais tarde ficará claro o porquê).


A instalação no * nix e no Windows não é muito diferente. Vou continuar no exemplo do Windows.


Descompacte o OMNeT ++ em% ProgramData% (C: \ ProgramData \) e abra o arquivo INSTALL.txt (C: \ ProgramData \ omnetpp-5.0 \ INSTALL.txt). Ele diz que as instruções detalhadas estão em "doc / InstallGuide.pdf", e está escrito que, se você não quiser ler, simplesmente faça:

$. setenv
$ ./configure
$ make

Mas não se apresse!


Primeiro, preste atenção ao primeiro comando . setenv . setenv . " Não há arquivo “ setenv ” no diretório “omnetpp-5.0” (estava na versão 5.0b1). Não é necessário (para Windows), então apenas execute “mingwenv.bat” (eu aconselho você a ver o que ele faz antes de iniciar ... para evitar rm ). No final, o terminal irá se romper (menta).


Em segundo lugar, aconselho a corrigir um pouco o arquivo “configure.user” (se o parâmetro mencionado for comentado no arquivo, será necessário descomentá-lo):


  • Se você deseja usar o Clang (por padrão), deixe
    PREFER_CLANG=yes
    e configure:
    • CFLAGS_RELEASE (opções do compilador):
      CFLAGS_RELEASE='-O2 -march=native -DNDEBUG=1'
  • Se você deseja usar o GCC em vez do Clang (e provavelmente deseja usar o GCC depois de ver o que está escrito na linha 398 do arquivo “configure.in”), instale
    PREFER_CLANG=no
    e configure:
    • CFLAGS_RELEASE (opções do compilador). Pode escolher ou
      CFLAGS_RELEASE='-O2 -mfpmath=sse,387 -ffast-math -fpredictive-commoning -ftree-vectorize -march=native -freorder-blocks-and-partition -pipe -DNDEBUG=1'
      ou
      CFLAGS_RELEASE='-O2 -fpredictive-commoning -march=native -freorder-blocks-and-partition -pipe -DNDEBUG=1'
      ou
      CFLAGS_RELEASE='-O2 -march=native -freorder-blocks-and-partition -pipe -DNDEBUG=1'
      (localizado em ordem decrescente de ocorrência de falhas).
    • Também vale a pena adicionar CXXFLAGS como ' -std=c++11 ' + CFLAGS_RELEASE. Por exemplo:
      CXXFLAGS='-std=c++11 -O2 -fpredictive-commoning -march=native -freorder-blocks-and-partition -pipe -DNDEBUG=1'
    • JAVA_CFLAGS (apenas descomente):
      JAVA_CFLAGS=-fno-strict-aliasing
  • PREFER_QTENV=yes
  • Desative a visualização 3D:
    WITH_OSG=no
    Ela é certamente linda , mas não precisamos disso.
  • Infelizmente, a execução paralela da simulação (WITH_PARSIM) também deve ser desativada, mas sem o vinculador falhar, deixamos a opção ativada:
    WITH_PARSIM=yes

Por que você deveria desligá-lo?

Se não for usado explicitamente, não será necessário (em teoria). Mais detalhes nas seções 16.1, 16.3 e 16.3.2 "Exemplo de simulação paralela" em "doc / InstallGuide.pdf" ou aqui .



Agora no terminal (mintty) você pode fazer:


 ./configure && make clean MODE=release make MODE=release –j17 


Nota :17 ” deve ser substituído pelo número de núcleos da CPU + 1 ou por 1,5 × núcleos.


Cuidado para os curiosos (build 64bit)

O diretório “tools / win32” contém o MSYS2, seus pacotes do compilador podem ser atualizados:



E o OMNeT ++ pode ser construído em 64 bits .


Mas o OMNeT ++ pode simplesmente não ser compilado com uma versão mais recente do GCC (esse foi o caso da primeira versão beta da quinta versão do OMNeT ++ - sem editar o código-fonte, ele normalmente foi criado apenas com o GCC 4.x). E a transição para 64 bits exigirá ainda mais esforço. Primeiro, você precisa revisar as opções de compilação ( fPIC , não é necessário? ). Então, se você rolar pelo código- fonte do OMNeT ++ , verá que o tipo long é frequentemente usado lá em vez de int32_t, size_t e ptrdiff_t (assim como uintptr_t e intptr_t) . O que isso ameaça? No * nix no conjunto de 64 bits (LP64), o tamanho longo será de 64 bits e no Windows (LLP64) será de 32 bits (consulte os modelos de dados ). Teremos que substituir long por size_t e ptrdiff_t, mas aqui você encontrará armadilhas. Por exemplo, você pode abrir “src / utils / opp_lcg32_seedtool.cc” e olhar para a linha 231 - index ou pode deixar 32 bits (substitua por int32_t) ou fazer 64 bits e modificar todas as máscaras de descrição + descrições + (possivelmente) um pouco de lógica. Portanto, parte das variáveis ​​longas precisará ser deixada em 32 bits e a outra parte será em 64 bits. Em geral, para a operação correta, você precisa fazer todos os pontos de:



E o mesmo precisa ser feito com várias bibliotecas para o OMNeT ++ , por exemplo, com o INET.


Em geral, eu o aviso contra a tentativa de criar um assembly OMNeT ++ de 64 bits.


No * nix, eu também recomendo usar uma compilação de 32 bits (pelo menos na versão 5.0 e menos).


Talvez um dia o Andrey2008 se comprometa a verificar o código OMNeT ++ e INET ... Enquanto isso, sugiro apenas encontrar e visualizar todos os " FIXME " / " Fix " no código ;).


O PS menciona que o código OMNeT ++ foi verificado por um analisador de código estático está ausente, mas nos arquivos INET 3.4.0 “ChangeLog”, é possível encontrar 70 menções sobre a correção de defeitos após a digitalização no Coverity.



O OMNeT ++ usa o Eclipse como um IDE. Por conveniência, você pode criar um atalho no IDE "% ProgramData% \ omnetpp-5.0 \ ide \ omnetpp.exe" e colocá-lo em um local facilmente acessível. O diretório "ide / jre /" contém o JRE v1.8.0_66-b18. Se um JRE / JDK compatível já estiver instalado no sistema, o diretório ide / jre / poderá ser excluído com segurança, substituindo-o por um link simbólico para o local do JRE do sistema.


Na primeira inicialização, o Eclipse sugere colocar a área de trabalho no diretório "samples", no entanto, é melhor colocá-la em qualquer outro diretório conveniente para você fora de "% ProgramData%". O principal é que apenas letras latinas (caracteres +) são usadas no caminho para o novo diretório e não há espaços.


Após fechar o Welcome, o IDE oferecerá a instalação do INET (como descrito acima) e a importação dos exemplos - descarte os dois pontos.


Configurações do Eclipse, opções de JVM, plug-ins e temas adicionais

Opções de JVM . Adicione “ide / omnetpp.ini” ao arquivo (qualquer editor que entenda os feeds de linha LF é adequado para edição; o bloco de notas não funcionará), salvando a última linha vazia:


 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+AggressiveOpts -XX:+TieredCompilation -XX:CompileThreshold=100 

Ajuste do Eclipse (un [7z] me)


Para tornar o Eclipse como o da figura, olhe dentro da figura.



É hora de instalar o INET. O diretório "inet" do arquivo baixado anteriormente (inet-3.4.0-src.tgz) deve ser transferido para a área de trabalho. Há um arquivo “INSTALL” no diretório com uma descrição passo a passo da instalação. Você pode usá-lo (seção “Se você estiver usando o IDE”), mas simplesmente não crie um projeto (Compilar)!


Importar INET:


  1. No Eclipse, abra: Arquivo> Importar.
  2. Selecione: Projetos gerais / existentes na área de trabalho.
  3. Como o "diretório raiz", selecione o local da área de trabalho.
  4. Verifique se a opção "Copiar projetos no espaço de trabalho" está desativada.
  5. Após clicar no botão "Concluir", aguarde até que a indexação do projeto esteja concluída (% de conclusão, veja abaixo, na barra de status - "Indexador C / C ++ ").


Configure o projeto:


  • A. desabilitar componentes desnecessários para LLTR;
  • B. mude a montagem para liberar;
  • C. livrar-se das falhas do OMNeT ++ Make Builder (opp_makemake) - anteriormente, quando ele era selecionado, o Makefile era frequentemente regenerado, mesmo quando não era necessário;
  • D. habilitar a compilação paralela ;
  • E. ativar otimizações;
  • F. ative o destaque de sintaxe para o c ++ 11 , em vários lugares;
  • G. corrija o erro relacionado a " #include " (isso acontece se você alterar o "Construtor atual" várias vezes; isso pode acontecer em outros casos).


Antes de configurar o {A}, você precisa corrigir um dos arquivos do projeto. No arquivo "inet / .oppfeatures", há uma linha " inet.examples.visualization "; você precisa adicionar uma linha vazia na qual escrever " inet.tutorials.visualization ", mantendo preferencialmente o recuo à esquerda (por analogia com outros parâmetros " nedPackages " no arquivo ) Se isso não for feito, nada de ruim acontecerá; logo após definir em "Problemas" (Alt + Shift + Q, X) sempre haverá erros associados ao " inet.tutorials.visualization ". Você pode primeiro criar {A} , analisar os erros e, em seguida, corrigir o arquivo “inet / .oppfeatures” - ao mesmo tempo, o Eclipse avisa sobre a violação da integridade nas configurações e se oferece para corrigi-las (concordamos com isso).


Vamos começar (painel "Project Explorer"> projeto "inet"> menu de contexto> Propriedades ):


  1. Seção OMNeT ++> Subseção de Recursos do Projeto
    1. {A} remova tudo, exceto:
      • TCP Comum
      • TCP (INET)
      • Protocolo IPv4
      • Protocolo UDP
      • Ethernet
    2. Botão "Aplicar".
  2. Seção “Compilação C / C ++”:
    1. Botão "Gerenciar configurações ..."> ativa o "gcc-release" {B} ;
    2. selecione a configuração “gcc-release [Active]” {B} .
    3. Subseção “Editor de cadeias de ferramentas”:
      1. como "Construtor atual", selecione "GNU Make Builder" para as duas configurações: "gcc-debug" e "gcc-release" {C} , observe : se você mudar o "Construtor atual" no futuro, terá que reconfigurar tudo!
      2. Botão "Aplicar".
    4. Guia "Comportamento" (retorne à raiz da seção "Construção de C / C ++"):
      1. defina “Usar trabalhos paralelos” como N (N é o número de núcleos da CPU + 1 ou 1,5 × núcleos) - isso permitirá que todos os núcleos da CPU sejam usados ​​para compilar {D} (configure para “gcc-debug” e “gcc- lançamento ”).
    5. Guia Configurações de compilação:
      1. desativar "Usar comando de construção padrão";
      2. substitua a linha "Comando de compilação" por " make MODE=release CONFIGNAME=${ConfigName} -j17 " (substitua " 17 " pelo valor anterior na linha, ou seja, com o N selecionado) {E} , você pode fazer o mesmo para a configuração "gcc-debug", substituindo " MODE=release " por " MODE=debug " na linha, depois disso, não esqueça de voltar para "gcc-release [Active]".
    6. Botão "Aplicar".
  3. Seção “C / C ++ Geral”:
    1. Subseção “Caminhos e Símbolos”:
      1. Guia "Inclui":
        1. Botão Adicionar: adicione o diretório " ../src " com os ../src "Adicionar a todas as configurações" e "Adicionar a todos os idiomas" {G} - inicialmente " ../src " está no idioma "GNU C ++ ", mas em um momento incerto , pode ser excluído da lista;
        2. Botão "Aplicar" e verifique se " ../src " apareceu em todos os idiomas e configurações.
      2. Guia Símbolos:
        1. Botão Adicionar: adicione o símbolo “ __cplusplus ” com o valor “ 201103L ” e o 201103L “Adicionar a todas as configurações” e “Adicionar a todas as configurações” e “Adicionar a todos os idiomas” - mais {F} ;
        2. Botão "Aplicar" e verifique se, na configuração "gcc-debug", " __cplusplus " tem o valor " 201103L ".
      3. Guia Local da Origem:
        1. Verifique se há um item na lista e ele aponta para “ /inet/src{G} , se houver algo mais (por exemplo, apenas “ /inet ”), exclua o que é e adicione (“Adicionar pasta ... ")" /inet/src ". Depois, clique no botão "Aplicar" e retorne a {A} , porque todos os filtros foram excluídos durante a exclusão. A propósito, " /inet " pode realmente ser deixado - tudo está indo bem com isso também, mas é melhor reduzi-lo ao original " /inet/src ".
    2. Subseção “Pré-processador inclui caminhos, Marcos etc.” > Guia "Provedores":
      1. Selecione "Configurações do compilador incorporado do CDT GCC":
        1. No grupo "Opções de provedor de configurações de idioma", clique no link "Configurações da área de trabalho":
          1. Guia "Descoberta": selecione novamente "Configurações do compilador -std=c++11 CDT GCC" e adicione " -std=c++11 " antes de " ${FLAGS} " em "Comando para obter especificações do compilador", deve ser algo como ` ${COMMAND} -std=c++11 ${FLAGS} -E -P -v -dD "${INPUTS}" ` {F} , mais detalhes aqui e aqui ;
          2. botão "Aplicar", "Ok" (fechar a janela).
        2. mova “Configurações do compilador interno do CDT GCC” acima de “Entradas do sistema de compilação gerenciada pelo CDT” (para ambas as configurações: “gcc-release” e “gcc-debug”) {F} , mais detalhes - depois disso perderemos a capacidade de redefinir os caracteres “CDT Configurações do compilador incorporado do GCC ”por meio de“ Entradas do sistema de compilação gerenciada pelo CDT ”( “ C / C ++ General ”> “ Caminhos e símbolos ”> “ Símbolos ”), você só pode substituí-lo adicionando valores às“ Entradas de configurações do usuário do CDT ” “Entries” (: , .. “CDT Managed Build System Entries” “ __cplusplus ”; , “ __cplusplus __cplusplus ” “CDT Managed Build System Entries”, , );
        3. “Apply”, , “Entries” “GNU C++ ” “CDT GCC Build-in Compiler Settings” ( [ ] “Show build-in values” ) “ __cplusplus=201103L ” ( ).
    3. “Indexer”:
      1. “Build configuration for indexer” “gcc-release” {B} ;
      2. “Apply”.


{E} . Eu vou explicar , Eclipse , “configure.user” OMNeT++ (./configure). Eclipse g++ make. , , , . , “Build command” {E}--just-print ” “ --trace ”, , ( “Project Explorer” > “inet” > > “Clean Project” “Build Project”), “Console” (Alt+Shift+Q,C), ‑ “ g++ -c -std=c++11 -O2 -fpredictive-commoning -march=native -freorder-blocks-and-partition -pipe -DNDEBUG=1 … ”. , .



( “Project Explorer” > “inet” > > Properties ):


  1. “/++ Build”:
    1. “Build Variables” (, “gcc-release [ Active ]”):
      1. “Add…”, “ CFLAGS ”, “String”, “ -O2 -fpredictive-commoning -march=native -freorder-blocks-and-partition -pipe ”;
      2. “Add…”, “ CXXFLAGS ”, “String”, “ -std=c++11 -O2 -fpredictive-commoning -march=native -freorder-blocks-and-partition -pipe ”;
      3. “Apply”.
    2. “Environment”:
      1. “Add…”, “ CFLAGS ”, “ ${CFLAGS} ”;
      2. “Add…”, “ CXXFLAGS ”, “ ${CXXFLAGS} ”;
      3. “Apply”.


, , g++ , “ --just-print ” “ --trace ”, Process Explorer . Process Explorer , “ -march=native ” “cc1plus.exe”.


, , INET! , “gcc-release” {B} , “ --just-print ” “ --trace{E} , . ( “Project Explorer” > “inet” > > “Clean Project” “Build Project”), “Console” (Alt+Shift+Q,C).


, Eclipse, “.cproject” “.settings” {BG} , : “.oppfeatures”, “.oppfeaturestate”, “.nedexclusions” – {A} .


, , .


#


Note : , – “doc” OMNeT++ INET. Simulation Manual User Guide, Stack Overflow ( stackoverflow.com, ). , , , , “” .


Note : , OMNeT++ INET, , INET GitHub. 3.4.0 ( , INET ).


INET, , . , ?


INET “Project Explorer”, “inet/src/inet/applications”, “ udpapp ” (UDP Application). UDP broadcast . , , , , “ UDPEchoApp ”. “UDPBasicApp”, “Basic”. “.cc”, “.h” “.ned” . , “.ned” , ( “parameters: ) .


. , ( inet/examples ) INET. , “broadcast” ( inet/examples/inet/broadcast )! “.cc”, “.h” “.ned”, “.ini” “.xml” . , :



, (“broadcast”) , .. . , , .


Note : Simulation Manual . , , ( RAM) . JSbookmark let . , Simulation Manual, ( ), ( target Simulation Manual). Bookmarklet . , , Simulation Manual , bookmarklet .


bookmarklet , ?

bookmarklet . . 5- . bookmarklet , .
⇒ bookmarklet – ; bookmarklet , ( 5- ) – .



#


“LLTR”, “src” “simulations”, “gcc-release” (File → New → OMNeT++ Project…):


Novo assistente de projeto do OMNeT ++


“inet”, . , “gcc-debug” (.. “LLTR”), “inet”. : {A,B,G} “Project References”, “inet”.


#


, Wizard, , “package.ned” : “src”, “simulations”. – “ package lltr; ” “ package lltr.simulations; ” . .


INET, “inet/src” – “LLTR/src”, “inet/examples” – “LLTR/simulations”. “LLTR/simulations” “.ned” c Network , “LLTR/src” – ().


– INET , INET, , INET. , – INET.


, “.ned” “LLTR/src” ( “inet/src”), “ package lltr.simulations; ” “LLTR/simulations”. “package.ned” “LLTR/src” “LLTR/simulations”.


#


LLTR. “LLTR/simulations/omnetpp.ini”, ( Run > Run As > 1 OMNeT++ Simulation):


Executar simulação na barra de ferramentas


Eclipse “simulations” . , : “LLTR/src/LLTR.exe” . , “LLTR.exe” , ( Project → Build Project), ( ).


“No network specified in the configuration.”, , “ network = lltr. Network ” “ [General] ” “omnetpp .ini ”, “ network Network {} ” “package .ned ”. ( “.ned” ), ( “.ini” ) ( Network – ) .


( Run > Run As > 1 OMNeT++ Simulation), () Network .


Note : ( Run > Run As > 1 OMNeT++ Simulation), ( Run > 1 simulations): , .. , , Eclipse .


Note : ( – a1_v0.1.0 (“a” – article) “ git checkout -b ‹my_branch› tags/a1_v0.1.0 ”)


#


, :


  • tutorial git;
  • tutorial – ;
  • () , (article) – ( : “article_#”), / ;
  • , “” tutorial.


Note : “article_#” , , , ( ), /.


“ ”? , GitHub , :



, , “ git checkout -b ‹ my_branch › tags/‹tag_name› ”.


, .. ? Pull Request, >:-), , , , ):


Git: Fluxo do sistema de controle de histórico


, , Pull Request .


Note : , : , ( “ ” () , ). “ -u ” , . , “a1_v0.1. 0 ”, “a1_v0.2. 0 ”, … – “a1_v0.1. 1 ”, “a1_v0.2. 1 ”, … , : “a1_v0.1. 2 ”, “a1_v0.2. 2 ”, …


Note : tutorial , “”, git ícone de marcação git diff , git tag.


Note : git diff , , ( , / ) ( AST ), Java .


# (Link Layer Topology Reveal)



# −1:


“package.ned” ( “Design” ), :


Editor de rede


, broadcast :


  • – StandardHost;
  • – EtherSwitch.


“” ( ) Eth100M (: 100 Mbps; : 10 ). , 10 , , ? ( )


( “Source” ), (git tag a1_v0.2.0) diff . :


 package ‹<a href="https://omnetpp.org/doc/omnetpp/manual/#sec:ned-ref:packages"> </a>›; //<a href="https://omnetpp.org/doc/omnetpp/manual/#sec:ned-ref:directory-structure"> </a> import ‹<a href="https://omnetpp.org/doc/omnetpp/manual/#sec:ned-lang:imports-and-name-resolution">  </a>›; network ‹<a href="https://omnetpp.org/doc/omnetpp/manual/#sec:ned-lang:warmup:network">  </a>› {   @display(‹  , ,  ›);   <a href="https://omnetpp.org/doc/omnetpp/manual/#sec:ned-ref:submodules">submodules</a>:       ‹<a href="https://omnetpp.org/doc/omnetpp/manual/#sec:ned-lang:submodules"> </a>›: ‹ › { @display(‹  , , ›); }   <a href="https://omnetpp.org/doc/omnetpp/manual/#sec:ned-ref:connections">connections</a>:       ‹ ›.‹<a href="https://omnetpp.org/doc/omnetpp/manual/#sec:ned-lang:gates"> </a>› <--> ‹  › <--> ‹ ›.‹ ›; } 


Warning : <a>...</a> – “” . , , , ( <strong>...</strong> , <em>...</em> ).



package ‹ ›; //

import ‹ ›;

network ‹
{
@display(‹ , , ›);
submodules :
›: ‹ › { @display(‹ , , ›); }
connections :
‹ ›.‹ › <--> ‹ › <--> ‹ ›.‹ ›;
}


“ ” (Gates) :


  1. Gates , , gate‹ ›.‹gate›[‹›] ”, – ‹ ›.‹gate› ++ ”.
  2. (: “ … <--> { delay = 100ms; } <--> … ”), / , ( broadcast : “ … <--> C <--> … ”), (: “ … <--> FastEthernet {per = 1e-6;} <--> … ”),
  3. Gates ( : output / input ; : --> / <-- ), ( : inout ; : <--> ). , , $i ” “ $o .



Warning : 13 20 ( 504 “Gateway Time-out”). 13 . ( ):


     <a href="#set">: “<code>set: p=1.87548</code></a>      . 


:


     <a href="#set"><code>: “set: p=1.87548</code></a>      . 


, 3‑ . :


   , <a href="https://omnetpp.org/doc/omnetpp/manual/#sec:ned-ref:inout-gates"><strong><code>$i</code></strong>”  “<strong><code>$o</code></strong></a>. 


, . , , GitHub Pages:


Leia mais →


Note : target Simulation Manual – bookmarklet ', . « →» , .


Note : , CSS JS – , 3 , GitHub Pages 2‑ ( HTML, , , , ‑). 3‑ – .


# / To be continued…


  • 2.
  • 3. OMNeT++
  • 4.
  • 5. OMNeT++ 2
  • 6.
  • 7. (‑: “ ”)

DOI: 10.5281 / zenodo.1407029

#


. . – . – .

Source: https://habr.com/ru/post/pt420327/


All Articles