Linguagem de programação P4


P4 é uma linguagem de programação projetada para programar regras de roteamento de pacotes. Ao contrário de uma linguagem de uso geral, como C ou Python, P4 é uma linguagem específica de domínio com várias construções otimizadas para roteamento de rede.

O P4 é um idioma de código aberto licenciado e suportado por uma organização sem fins lucrativos chamada P4 Language Consortium. Também é suportado pela Open Networking Foundation (ONF) e Linux Foundation (LF), as duas maiores organizações guarda-chuva em projetos de rede de código aberto.
O idioma foi originalmente cunhado em 2013 e descrito em 2014 em um documento SIGCOMM CCR intitulado “Independente de protocolo, programação de processador de roteamento de pacotes”.

Desde a sua criação, o P4 cresceu exponencialmente e evoluiu, tornando-se rapidamente o padrão para descrever a transmissão de pacotes por dispositivos de rede, incluindo adaptadores, comutadores e roteadores de rede.

“A SDN transformou o setor de redes e a P4 leva a SDN para o próximo nível, fornecendo programabilidade no campo do roteamento”, disse Guru Parulkar, diretor executivo da Open Networking Foundation.

A linguagem P4 foi criada originalmente por um grupo de engenheiros e pesquisadores do Google, Intel, Microsoft Research, Barefoot, Princeton e Stanford. O objetivo era simples: criar uma linguagem fácil de usar que um desenvolvedor de software possa aprender em um dia e usá-la para descrever com precisão como os pacotes são enviados pela rede.

Desde o início, o P4 foi projetado para ser independente da meta (ou seja, um programa escrito em P4 poderia ser compilado inalterado para vários propósitos, como ASIC, FPGA, CPU, NPU e GPU).

Além disso, o idioma é independente de protocolo (ou seja, o programa P4 pode descrever protocolos padrão existentes ou pode ser usado para indicar novos modos de endereçamento personalizados).

Na indústria, o P4 é usado para programar dispositivos. Talvez no futuro, os padrões Internet-RFC e IEEE também incluam a especificação P4.

P4 pode ser usado para dispositivos programáveis ​​e de função fixa. Por exemplo, ele é usado para registrar com precisão o comportamento do pipeline do switch nas APIs da Interface de Abstração do Switch (SAI) usadas pelo OS SONiC do switch de código aberto. O P4 também é usado no projeto ONF Stratum para descrever o comportamento de comutação em uma variedade de dispositivos fixos e programáveis.

A descrição do comportamento dos comutadores e dos adaptadores de rede pela primeira vez permite criar um modelo executável preciso de toda a rede antes da implantação. Os grandes provedores de nuvem podem testar e depurar completamente a rede usando software, o que reduz significativamente o tempo e o custo de testar as interações do laboratório sem exigir equipamentos caros.

Usando o P4, os fornecedores de equipamentos de rede podem confiar no comportamento de roteamento básico e comum em todos os produtos, o que permite a reutilização da infraestrutura de teste, simplifica o desenvolvimento de software de gerenciamento e, finalmente, garante a interoperabilidade.

Obviamente, o P4 pode ser usado para escrever programas que descrevem métodos de roteamento completamente novos. Por exemplo, o P4 é amplamente usado para telemetria e medições em data centers, redes corporativas e provedores de serviços.

A comunidade de pesquisa também se intensificou. Vários grupos acadêmicos líderes em pesquisa de tecnologia de rede publicaram novos aplicativos interessantes baseados em programas P4, incluindo balanceamento de carga, protocolos consistentes e cache de valores-chave. Um novo paradigma de programação está sendo criado, as inovações estão passando do hardware para o software, o que permite que muitas idéias inesperadas, novas e brilhantes apareçam.

A comunidade de desenvolvimento fez contribuições significativas para o desenvolvimento de código, incluindo compiladores, pipelines, modelos comportamentais, APIs, ambientes de teste, aplicativos e muito mais. Existem desenvolvedores dedicados em empresas como Alibaba, AT&T, Barefoot, Cisco, Fox Networks, Google, Intel, IXIA, Juniper Networks, Mellanox, Microsoft, Netcope, Netronome, VMware, Xilinx e ZTE; de universidades, incluindo BUPT, Cornell, Harvard, MIT, NCTU, Princeton, Stanford, Technion, Tsinghua, UMass e USI; e projetos de código aberto, incluindo CORD, FD.io, OpenDaylight, ONOS, OvS, SAI e Stratum, destacam o fato de o P4 ser um projeto comunitário independente.

Geração típica do controlador P4:



Perspectivas de aplicação



Como o idioma é destinado aos aplicativos de roteamento, a lista de requisitos e opções de design é diferente em comparação às linguagens de programação de uso geral. As principais características do idioma são:

  1. Independência da implementação do objetivo;
  2. Independência do (s) protocolo (s) utilizado (s);
  3. Reconfigurabilidade de campo.

Independência da implementação de destino

Os programas P4 são projetados para serem independentes da implementação, o que significa que podem ser compilados para muitos tipos diferentes de máquinas executivas, como processadores de uso geral, FPGAs, sistemas on-chip, processadores de rede e ASICs. Esses vários tipos de máquinas são conhecidos como destinos P4 e é necessário um compilador para que cada destino converta o código-fonte P4 no modelo de chave de destino. O compilador pode ser incorporado no dispositivo de destino, software externo ou mesmo um serviço em nuvem. Como muitos dos objetivos originais dos programas P4 foram usados ​​para a troca simples de pacotes, é possível ouvir o termo "switch P4", mesmo que o uso do "target P4" seja mais correto.

Independência do (s) protocolo (s) usado (s)

P4 é independente de protocolo. Isso significa que o idioma não possui suporte interno para protocolos comuns, como IP, Ethernet, TCP, VxLAN ou MPLS. Em vez disso, o programador P4 descreve os formatos de cabeçalho e os nomes dos campos dos protocolos necessários no programa, que por sua vez são interpretados e processados ​​pelo programa compilado e pelo dispositivo de destino.

Reconfigurabilidade de campo

A independência do protocolo e o modelo de linguagem abstrata permitem a reconfigurabilidade - os destinos P4 devem poder alterar o processamento de pacotes após a implantação do sistema. Tradicionalmente, esse recurso é associado ao roteamento através de processadores de uso geral ou de rede, em vez de circuitos integrados com funções fixas.

Embora não exista uma linguagem que possa impedir a otimização de um determinado conjunto de protocolos, essas otimizações são invisíveis para o autor da linguagem e podem, em última instância, reduzir a flexibilidade do sistema e do objetivo e sua reconfigurabilidade.

Essas características do idioma foram originalmente estabelecidas por seus criadores, com uma orientação para seu amplo uso na infraestrutura de rede.

O idioma já é usado em muitas empresas:

1) datacenters em escala superior;

A empresa chinesa Tencent é a maior empresa de investimentos do mundo e uma das maiores empresas de capital de risco. As subsidiárias da Tencent, na China e em outros países do mundo, são especializadas em várias áreas de negócios de alta tecnologia, incluindo vários serviços de Internet, desenvolvimentos no campo da inteligência artificial e entretenimento eletrônico.

P4 e roteamento programável são tecnologias avançadas usadas na arquitetura de rede da empresa.

Como um dos criadores, o Google se orgulha de observar a rápida introdução do P4 no setor de redes e, em particular, no campo do design arquitetônico de data centers.

2) empresas comerciais;

A Goldman Sachs, aproveitando o trabalho com a comunidade de código aberto e desenvolvendo padrões e soluções comuns, já está trazendo inovação para a infraestrutura de rede e fornecendo as melhores soluções para os clientes.

3) produção;

Todo o setor de rede se beneficiará de um idioma como o P4, que define exclusivamente o comportamento de desvio de chamadas. Considere também na Cisco a transferência de suas linhas de produtos para usar esse idioma.

A Juniper Networks incluiu o tempo de execução P4 e P4 em vários produtos e fornece acesso programático ao processador incorporado Juniper e seu código de programa.

A Ruijie Networks apoia ativamente o P4 e os benefícios que ele traz para as redes. Com o P4, uma empresa pode criar e fornecer as melhores soluções da categoria para uma ampla gama de clientes.

4) provedores de telecomunicações;

A AT&T foi um dos primeiros apoiadores do P4, um dos primeiros a usar o P4 para determinar o comportamento que queria ver nas redes e a usar dispositivos de encaminhamento programáveis ​​do P4 em sua rede.

A Deutsche Telekom usa o idioma para prototipar as principais funções da rede como parte do Access 4.0.

5) indústria de semicondutores;

A linguagem tornou possível implementar um novo paradigma para transferir recursos de software para o plano de roteamento de rede pela Barefoot.

A Xilinx foi um dos fundadores da P4.org e participou ativamente do desenvolvimento da linguagem P4 e a implementou em plataformas programáveis ​​baseadas em FPGA para equipamentos SmartNIC e NFV, lançando um dos primeiros compiladores P4 16 como parte do projeto SDNet.

6) Software.

A VMware acredita que o P4 cria uma tremenda energia, inovação e uma comunidade que leva à transformação significativa e necessária na rede. A VMware foi originalmente parte desse movimento do setor, pois uma nova onda de inovação é impulsionada por abordagens de software que expandem os recursos da infraestrutura e os implementam nos produtos mais recentes.

Portanto, P4 é uma linguagem de programação independente de objetivo e independente de protocolo usada pela indústria e pela comunidade científica para determinar exclusivamente o comportamento do roteamento de pacotes como um programa que, por sua vez, pode ser compilado para vários propósitos. Os objetivos de hoje incluem comutadores de hardware e software, comutadores de hipervisor, NPUs, GPUs, FPGAs, SmartNICs e ASICs.

Os principais recursos do idioma expandem significativamente o escopo de seu aplicativo e fornecem sua rápida implementação na arquitetura de rede.

Por onde começar


P4 é um projeto de código aberto; todas as informações atuais estão no site P4.org

Link para o repositório https://github.com/p4lang , onde você pode obter o código fonte dos exemplos e materiais de treinamento.

Plug-in para Eclipse com suporte para P4, mas podemos recomendar o P4 Studio da Barefoot.



Vamos analisar as principais abstrações do kernel:

Definição de cabeçalhos - com sua ajuda, os cabeçalhos do protocolo são definidos.

A definição de conjuntos de cabeçalhos:

  • descrição dos formatos dos pacotes e dos nomes dos campos de cabeçalho
  • campos permitidos fixos e variáveis

Por exemplo

header Ethernet_h{
bit <48> dstAddr;
bit <48> srcAddr;
bit <16> etherType;
}


header IPv4_h{
bit <4> version;
bit <4> ihl;
bit <8> diffserv;
bit <16> totalLen;
bit <16> identification;
bit <3> flags;
bit <13> fragOffset;
bit <8> ttl;
bit <8> protocol;
bit <16> hdrChecksum;
bit <32> srcAddr;
bit <32> dstAddr;
varbit <320> options;
}


Analisadores são sua tarefa de analisar cabeçalhos.

O exemplo de analisador a seguir determinará a transição do estado final de uma máquina de um estado inicial para um dos dois finais:



parser MyParser(){
state start{transition parse_ethernet;}
state parse_ethernet{
packet.extract(hdr.ethernet);
transition select(hdr.ethernet.etherType){
TYPE_IPV4: parse_ipv4;
default: accept;
}
}…
}


Tabelas - contêm o estado da máquina que associa as chaves do usuário às ações. Ações - Uma descrição de como o pacote deve ser manipulado.

As tabelas contêm estados (definidos no nível gerencial) para encaminhamento de pacotes, descrevem a unidade de ação de correspondência

A correspondência de pacotes é feita por:

  • Correspondência exata
  • Correspondência mais longa com um prefixo (LPM)
  • Correspondência tripla (mascaramento)

table ipv4_lpm{
reads {
ipv4.dstAddr: lpm;
} actions {
forward();
}
}


Todas as ações possíveis devem ser definidas nas tabelas com antecedência.

Ações consistem em código e dados. Os dados chegam no nível de gerenciamento (por exemplo, endereços IP / números de porta). Determinadas primitivas sem loop podem ser especificadas diretamente em ação, mas o número de comandos deve ser previsível. Portanto, as ações não podem conter loops ou instruções condicionais.

action ipv4_forward(macAddr_t dstAddr, egressSpec_t port){
standard_metadata.egress_spec = port;
hdr.ethernet.srcAddr = hdr.ethernet.dstAddr;
hdr.ethernet.dstAddr = dstAddr;
hdr.ipv4.ttl = hdr.ipv4.ttl - 1;
}


Módulos Match-Action - ações para criar uma chave de pesquisa, pesquisar em uma tabela, executar ações.

Um exemplo típico de módulo é mostrado na figura:



Controle de fluxo - indica a ordem dos aplicativos dos módulos Match-Action. Este é um programa imperativo que define a lógica de alto nível e a sequência de ação e correspondência. O fluxo de controle vincula todos os objetos, configurando o nível de controle.

Objetos externos são objetos específicos com uma arquitetura e APIs claramente definidas. Por exemplo, cálculo de soma de verificação, registros, contadores, contadores etc.

extern register{
register(bit<32> size);
void read(out T result, in bit<32> index);
void write(in bit<32> index, in T value);
}


extern Checksum16{
Checksum16(); //constructor
void clear(); //prepare unit for computation
void update(in T data); //add data to checksum
void remove(in T data); /remove data from existing checksum
bit <16> get(); //get the checksum for the data added since last clear
}

Metadados é a estrutura de dados associada a cada pacote.

Existem 2 tipos de metadados:

Metadados personalizados (estrutura vazia para todos os pacotes)
Você pode colocar tudo o que quiser aqui
Disponível em todo o pipeline
conveniente para seu próprio uso, por exemplo, para armazenar o hash de um pacote

Metadados internos - fornecidos pela arquitetura
Porta de entrada, porta de saída são definidas aqui
Registro de data e hora quando o pacote estava na fila, profundidade da fila
fila de multicast hash / multicast
Prioridade do pacote, Importância do pacote
Especificação da porta de saída (por exemplo, fila de saída)

Compilador P4


O compilador P4 (P4C) gera:

  1. Tempo de execução do plano de dados
  2. API para controle de estado da máquina no plano de dados


Um exemplo de uma opção de software em P4


Os códigos-fonte podem ser baixados do repositório.

p4lang / p4c-bm: cria uma configuração JSON para bmv2
p4lang / bmv2: um comutador de software que entende as configurações JSON da versão bmv2

A figura mostra o diagrama de compilação do projeto:



Manipulações com tabelas, registros de leitura, contador:

  • table_set_default <table name> <action name> <action parameters> table_add <table name> <action name> <match fields> => <action
    parameters> [priority] table_delete <table name> <entry handle>
  • table_set_default <table name> <action name> <action parameters> table_add <table name> <action name> <match fields> => <action
    parameters> [priority] table_delete <table name> <entry handle>
  • table_set_default <table name> <action name> <action parameters> table_add <table name> <action name> <match fields> => <action
    parameters> [priority] table_delete <table name> <entry handle>

O código fonte contém o programa simple_switch_CLI para uso conveniente da API da chave de software.

Você pode baixar este e outros exemplos no repositório.



PS No início do verão, a Intel assinou um acordo para adquirir a Barefoot Networks, com o objetivo de atender rapidamente às necessidades dos usuários da Hyperscale Cloud. De acordo com Navin Shenoy (vice-presidente executivo e gerente geral do Data Center Group da Intel Corporation) - isso permitirá à Intel fornecer maiores cargas de trabalho e mais oportunidades para os clientes do data center.

Na minha opinião pessoal, não esqueça que a Intel é líder na produção de chips FPGA e possui um excelente ambiente Quartus. Assim, você pode esperar que, com o advento da Intel, o Barefoot não apenas expanda sua linha de produtos, mas o Quartus e o P4 Studio também recebam atualizações e adições sérias à linha Toffino e Toffino 2.

O membro oficial da comunidade P4 é o Factor Group .

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


All Articles