Um pequeno repositório que usarei para armazenar meu progresso e testar programas do DPDK, uma biblioteca de desvio de kernel muito útil para processamento rápido de pacotes.
Este repositório usa meu projeto DPDK Common em um esforço para tornar as coisas mais simples.
AVISO - Ainda estou adicionando mais exemplos com o passar do tempo e preciso testar novas funcionalidades/métodos.
Se você deseja construir o DPDK usando opções padrão, o seguinte deve funcionar, assumindo que você tenha os requisitos como ninja
e meson
.
git clone https://github.com/DPDK/dpdk.git
cd dpdk/
meson build
cd build
ninja
sudo ninja install
sudo ldconfig
Todos os arquivos de cabeçalho necessários do DPDK serão armazenados dentro de /usr/local/include/
.
Você pode receber ninja
e meson
usando o seguinte.
sudo apt update
sudo apt install python3 python3-pip
sudo pip3 install meson # Pip3 is used because 'apt' has an outdated version of Meson usually.
sudo apt install ninja-build
Você pode usar git
e make
para construir os arquivos fonte dentro deste repositório.
git clone --recursive https://github.com/gamemann/The-DPDK-Examples.git
cd The-DPDK-Examples/
make
Os executáveis serão construídos dentro do diretório build/
por padrão.
Todos os aplicativos DPDK neste repositório suportam os parâmetros EAL do DPDK. Eles podem ser encontrados aqui.
Isso é útil para especificar a quantidade de l-cores e portas a serem configuradas, por exemplo.
Neste aplicativo DPDK, todos os pacotes que chegarem na porta de destino UDP 8080 serão descartados. Caso contrário, se o tipo de cabeçalho Ethernet do pacote for IPv4 ou VLAN, ele trocará os endereços MAC e IP de origem/destino junto com as portas de origem/destino UDP e enviará o pacote pelo caminho TX (basicamente encaminhando o pacote de onde ele veio) .
Além dos parâmetros EAL, o seguinte está disponível especificamente para esta aplicação.
-p --portmask => The port mask to configure (e.g. 0xFFFF).
-P --portmap => The port map to configure (in '(x, y),(b,z)' format).
-q --queues => The amount of RX and TX queues to setup per port (default and recommended value is 1).
-x --promisc => Whether to enable promiscuous on all enabled ports.
-s --stats => If specified, will print real-time packet counter stats to stdout.
Aqui está um exemplo:
./dropudp8080 -l 0-1 -n 1 -- -q 1 -p 0xff -s
Neste aplicativo DPDK, uma tabela hash de roteamento simples é criada com a chave sendo o endereço IP de destino e o valor sendo o endereço MAC para o qual encaminhar.
As rotas são lidas no arquivo /etc/l3fwd/routes.txt
no seguinte formato.
<ip address> <mac address in xx:xx:xx:xx:xx:xx>
O seguinte é um exemplo.
10.50.0.4 ae:21:14:4b:3a:6d
10.50.0.5 d6:45:f3:b1:a4:3d
Quando um pacote é processado, garantimos que seja um pacote IPv4 ou VLAN (nesse caso, compensamos os dados do pacote em quatro bytes para que possamos processar o restante do pacote sem problemas). Em seguida, realizamos uma pesquisa sendo o IP de destino a chave na tabela hash da rota. Se a pesquisa for bem-sucedida, o endereço MAC de origem será substituído pelo endereço MAC de destino (os pacotes sairão pela mesma porta em que chegaram, pois criamos um buffer TX e uma fila) e o endereço MAC de destino será substituído pelo endereço MAC do IP foi atribuído a partir do arquivo de rotas mencionado acima. Caso contrário, o pacote será descartado e o contador de pacotes descartados será incrementado.
Além dos parâmetros EAL, o seguinte está disponível especificamente para esta aplicação.
-p --portmask => The port mask to configure (e.g. 0xFFFF).
-P --portmap => The port map to configure (in '(x, y),(b,z)' format).
-q --queues => The amount of RX and TX queues to setup per port (default and recommended value is 1).
-x --promisc => Whether to enable promiscuous on all enabled ports.
-s --stats => If specified, will print real-time packet counter stats to stdout.
Aqui está um exemplo:
./simple_l3fwd -l 0-1 -n 1 -- -q 1 -p 0xff -s
Nesta aplicação, se um IP de origem for igual ou exceder os pacotes por segundo ou bytes por segundo especificados na linha de comando, os pacotes serão descartados. Caso contrário, os endereços Ethernet e IP serão trocados junto com as portas TCP/UDP e o pacote será encaminhado de volta pelo caminho TX.
As estatísticas do pacote também estão incluídas no sinalizador -s
.
As seguintes opções de linha de comando são suportadas.
-p --portmask => The port mask to configure (e.g. 0xFFFF).
-P --portmap => The port map to configure (in '(x, y),(b,z)' format).
-q --queues => The amount of RX and TX queues to setup per port (default and recommended value is 1).
-x --promisc => Whether to enable promiscuous on all enabled ports.
-s --stats => If specified, will print real-time packet counter stats to stdout.
--pps => The packets per second to limit each source IP to.
--bps => The bytes per second to limit each source IP to.
Aqui está um exemplo:
./ratelimit -l 0-1 -n 1 -- -q 1 -p 0xff -s
NOTA - Este aplicativo suporta reciclagem de LRU por meio de uma função personalizada que criei no projeto DPDK Common, check_and_del_lru_from_hash_table()
. Certifique-se de definir USE_HASH_TABLES
antes de incluir o arquivo de cabeçalho comum DPDK ao usar esta função.
Este é um pequeno aplicativo que implementa um método LRU manual para tabelas hash. Há algum tempo venho tentando fazer com que as tabelas LRU funcionem a partir dessas bibliotecas. No entanto, não tive sucesso em realmente inicializar a tabela.
Portanto, decidi continuar usando essas bibliotecas e implementar minha própria funcionalidade LRU. Basicamente, uso a função rte_hash_get_key_with_position()
para recuperar a chave mais antiga a ser excluída. No entanto, parece que a nova entrada é inserida na posição que foi excluída mais recentemente, então você deve continuar incrementando o valor da posição até o máximo de entradas da tabela. Dito isso, quando o valor da posição exceder o máximo de entradas da tabela, será necessário defini-lo novamente como 0.
Nenhuma opção de linha de comando é necessária, mas os parâmetros EAL ainda são suportados. Porém, eles não farão diferença.
Aqui está um exemplo:
./ratelimit