Sign inSign up

dnredson/p4d

By dnredson

Updated over 2 years ago

Image
0

1.6K

dnredson/p4d repository overview

O Script abaixo permite a criação de um ambiente de testes com dois containers com imagens ubuntu instaladas e ferramentas de teste de redes:

#######################################
#!/bin/bash
#Cria os hosts
docker run -itd --name h1 dnredson/hostup
docker run -itd --name h2 dnredson/hostup
docker run -itd --name sw1 dnredson/p4d

#Adiciona as interfaces Veth
sudo ip link add veth1 type veth peer name veth2
sudo ip link add veth3 type veth peer name veth4

#salva as informações de estado de cada container para criar os namespaces
PID1=$(docker inspect -f '{{.State.Pid}}' h1)
PID2=$(docker inspect -f '{{.State.Pid}}' sw1)
PID3=$(docker inspect -f '{{.State.Pid}}' h2)

#adiciona cada interface para o namespace correspondente
sudo ip link set veth1 netns $PID1
sudo ip link set veth2 netns $PID2
sudo ip link set veth3 netns $PID2
sudo ip link set veth4 netns $PID3

#Configura cada uma das interfaces
#Configura a veth1 com endereço IP, MAC e incia
sudo nsenter -t $PID1 -n ip addr add 192.168.1.1/24 dev veth1
sudo nsenter -t $PID1 -n ip link set dev veth1 address 00:00:00:00:01:01
sudo nsenter -t $PID1 -n ip link set veth1 up

#Configura a veth2 com endereço IP, MAC e incia
sudo nsenter -t $PID2 -n ip addr add 192.168.1.2/24 dev veth2
sudo nsenter -t $PID2 -n ip link set dev veth2 address 00:00:00:00:01:02
sudo nsenter -t $PID2 -n ip link set veth2 up

#Configura a veth3 com endereço IP, MAC e incia
sudo nsenter -t $PID2 -n ip addr add 192.168.2.2/24 dev veth3
sudo nsenter -t $PID2 -n ip link set dev veth3 address 00:00:00:00:02:01
sudo nsenter -t $PID2 -n ip link set veth3 up

#Configura a veth4 com endereço IP, MAC e incia
sudo nsenter -t $PID3 -n ip addr add 192.168.2.3/24 dev veth4
sudo nsenter -t $PID3 -n ip link set dev veth4 address 00:00:00:00:02:02
sudo nsenter -t $PID3 -n ip link set veth4 up

#######################################

Configuração e start no switch:

Uma vez configurados, acessar o terminal de cada um dos hosts para configuração de rotas, forçando o tráfego a passar pelo container switch.
Seguindo o exemplo do script acima: No switch 1:
route add -net 192.168.2.3 netmask 255.255.255.255 gw 192.168.1.2


No switch 2:
route add -net 192.168.1.1 netmask 255.255.255.255 gw 192.168.2.2


No switch:
Acessar o container para execução do switch bmv2 com o código p4 compilado. Para o exemplo acima, iniciar como:
simple_switch --log-console -i 1@veth2 -i 2@veth3 standard.json

O arquivo standard.json é um exemplo de um programa p4 compilado simples, está disponível em:
https://github.com/dnredson/geradoresDeTrafego/blob/main/standard.json
Para compilar seu próprio código P4, utilize o container p4c https://hub.docker.com/r/p4lang/p4c . Em breve, o compilador será incorporado ao P4D.

Caso deseje adicionar entradas na tabela de roteamento através do controlador do switch, acesse o terminal do container e inicie o client do bmv2:
simple_switch_CLI

adicionar as entradas, no scrip acima, o exemplo seria:
table_add MyIngress.ipv4_lpm ipv4_forward 192.168.2.3 => 00:00:00:00:02:02 2
table_add MyIngress.ipv4_lpm ipv4_forward 192.168.1.1 => 00:00:00:00:01:01 1

Desta forma, o ambiente está configurado.

Script para limpeza do ambiente conforme o exemplo dado acima:

##################################
#!/bin/bash

containers=("h1" "h2" "sw1" "sw2" )
for container in "${containers[@]}"; do
if [ $(docker ps -a -q -f name=^/${container}$) ]; then
echo "Removendo o contêiner $container..."
docker stop $container
docker rm $container
fi
done

veths=("veth1" "veth2" "veth3" "veth4" "veth5" "veth6")
for veth in "${veths[@]}"; do
if ip link show | grep -q $veth; then
echo "Removendo a interface $veth..."
sudo ip link delete $veth
fi
done

echo "Ambiente limpo com sucesso!"

#################################

Tag summary

Content type

Image

Digest

sha256:9cd2aea36

Size

442 MB

Last updated

over 2 years ago

docker pull dnredson/p4d