# Instalação: pc4 / bmv2 / STRATUM / Docker
:::info
Esta é uma breve demonstração de preparo de um ambiente de desenvolvimento para programação de um Network Interface Controller (NIC) Ethernet/Wi-Fi.
:::
:::warning
Pré-requisitos:
:grey_exclamation: Xubuntu ou Ubuntu (18.04LTS)
:grey_exclamation: Memória RAM >= 4GB
:::
### OS: Linux Xubuntu & Ubuntu (18.04LTS)
### Hardware utilizado
:::warning
Processor: Intel (R) Celeron (R) CPU N3050 @ 1.60GHz
Architecture: amd64 - Memory: 4GB - HD SSD: 120GB
:::
### Objetivo:
Preparar um ambiente de desenvolvimento para programação de NIC (Ethernet / Wi-Fi), utilizando o compilador da linguagem P4, um switch Bmv2 e o sistema Stratum em um ambiente de hardware físico.
![](https://i.imgur.com/pXLu1TZ.jpg)
<br>
![](https://i.imgur.com/P6Ill5Z.jpg)
### O que é Compilador P4?
O compilador P4 é um software que faz a tradução de um programa descrito na linguagem P4 - liguagem esta que possui a capacidade de superar as limitações do OpenFlow e aumentar a programabilidade das Redes Definidas por Software. No processo de tradução da linguagem P4 pelo compilador é possível descrever o plano de dados e o encaminhamento em dispositivos programáveis, tais como: software switches, Smart NICs1, FPGAs (Field Programmable Gate Array), switches bare metal e demais dispositivos baseados em ASIC. Com o P4 é possível fazer a recuperação do controle do plano de dados, considerando funções otimizadas para uma rede específica, trazendo 3 principais objetivos, são eles:
**Reconfigurabilidade:** funcionalidade técnica aplicada a habilidade do programador ou engenheiro de redes, poder redefinir o processamento dos pacotes em dispositivos de rede;
**Independência do Protocolo:** suporte a vários dispositivos de rede que não utilizam padrões de determinados protocolos "proprietários" e a formatos de pacotes específicos;
**Independência de programação:** aplica-se ao compilador p4c, onde possui total liberdade de programação de redes e dispositivos, gerando novas funcionalidades independente do dispositivo, conforme a capacidade do hardware específico para o projeto.
### O que é Behavioral Model version 2 (Bmv2)?
É um software que atua como um switch de software P4 de referência, denominado de Behavioral Model version 2(para a versão 2 do modelo comportamental), ou Bmv2, o software é escrito em C ++. Seu funcionamento é simples: o bmv2 recebe como entrada um arquivo JSON gerado a partir de seu programa P4 por um compilador P4 e o interpreta para implementar o comportamento de processamento de pacotes especificado por esse programa P4. O bmv2 não se destina a ser um switch de software de nível de produção, mas se comporta muito bem em ambientes de testes e o mesmo deve ser usado como uma ferramenta para desenvolver projetos baseado em depurar planos de dados P4 e software de plano de controle. O desempenho do bmv2, em termos de taxa de transferência e latência é significativamente menor do que o de um switch de software de nível de produção como o OpenvSwitch ou Stratum por exemplo.
### O que é STRATUM?
Trata-se de um um sistema operacional de switch independente de código aberto, aplicado a redes definidas por software, onde é possível construir uma distribuição aberta e mínima pronta para produção para equipamentos do tipo white box. O Stratum expõe um conjunto de interfaces SDN de próxima geração, incluindo P4Runtime e OpenConfig, permitindo a intercambialidade de dispositivos de encaminhamento e a programação de comportamentos de encaminhamento.
O Stratum evita o bloqueio do fornecedor dos planos de dados de hoje (ou seja, interfaces proprietárias e APIs de software fechadas), permitindo uma fácil integração de dispositivos em redes de grandes operadoras. O Stratum oferece uma solução completa de switch white box para cumprir a promessa de novas atuais e novas tecnologias SDN.
### Repositórios:
Você precisa rodar os seguintes comandos para ter acesso aos repositórios necessários:
sudo add-apt-repository ppa:frederic-loui/p4lang-3rd-party
sudo add-apt-repository ppa:frederic-loui/p4lang-master-bionic-nightly
### Atualização do sistema & Instalação de pacotes
Depois, é necessário que faça a atualização do sistema e instalação de pacotes com:
sudo apt update && sudo apt upgrade -y
sudo apt install p4c bmv2 p4lang-3rd-party scapy -y
### Verificando instalação do compilador p4c:
Após a atualização do sistema e instalação, execute a verificação da instalação do compilador com:
dpkg -l | grep p4lang
- Retorno do comando anterior:
```
root@feec:~# dpkg -l | grep p4lang
ii bmv2 1.13.0-202012050317-4b9a2ec~ubuntu18.04.1 amd64 p4lang behavioral-model
ii p4c 1.1.0-rc1-202104060403-ca4915d41~ubuntu18.04.1 amd64 p4c p4lang project compiler
ii p4lang-3rd-party 1.1~bionic-1 all This package installs 3rd party software needed by p4lang software
ii p4lang-pi 0.8-202102050217-c65fe2e~ubuntu18.04.1 amd64 Implementation framework of a P4Runtime server
```
### Instalação do STRATUM no container Docker
### Atualização do sistema, pacotes e removação de pacotes não essenciais
sudo apt upgrade && sudo apt upgrade -y && sudo apt autoremove -y
### Instalação do Docker e verificação do serviço
sudo apt install docker.io -y && systemctl status docker
### Retorno do comando:
``systemctl status docker``
![](https://i.imgur.com/gSvG70X.png)
### Instalação do STRATUM
cd /home && sudo docker pull stratumproject/stratum-bcm:sdklt
sudo git clone https://github.com/stratum/stratum.git
### Procedimento para corrigir erros de permissão
Erros de permissão da **imagem Docker** podem surgir, eventualmente. Tais erros podem ser corrigidos com os comandos abaixo onde não devem ser executados como "root"
sudo usermod -aG docker ${USER}
su - ${USER}
### Procedimento de instalação do STRATUM
:::danger
Não utilize o usuário root neste procedimento!
:::
cd /home/stratum/
./setup_dev_env.sh
bazel build //stratum/hal/bin/bcm/standalone:stratum_bcm_sdklt_deb
### Observação:
Dependendo do seu hardware, o procedimento acima levará muitos minutos ou horas.
### Em outra janela do terminal, verifique as imagens do STRATUM no Docker
docker images && docker ps -a
- Retorno do comando anterior:
```
REPOSITORY TAG IMAGE ID CREATED SIZE
stratum-dev latest bbff94b6b445 43 hours ago 2.19GB
stratumproject/build build 1692722f8265 45 hours ago 2.18GB
stratumproject/stratum-bcm sdklt efac4591d8a6 45 hours ago 148MB
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d1296f40d543 efac4591d8a6 "start-stratum.sh" 44 hours ago Exited (1) 44 hours ago charming_swanson
```
---
### Fontes:
https://wiki.geant.org/pages/viewpage.action?pageId=148087125
https://github.com/stratum/stratum/blob/main/stratum/hal/bin/bcm/standalone/README.md
https://p4.org/p4/getting-started-with-p4.html
https://www.youtube.com/watch?v=XfZvKLNXC9M
https://github.com/p4lang/behavioral-model
https://opennetworking.org/stratum/
### Autor:
Fernando Henrique Santorsula
E-mail: f208918@dac.unicamp.br
### Coautor:
Alan Teixeira da Silva
E-mail: a265560@dac.unicamp.br
FEEC/UNICAMP - Campinas/SP/BR
https://www.fee.unicamp.br