Linguagem de programação P4

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 de domínio específico com vários designs otimizados para roteamento de rede.

P4 é uma linguagem de código aberto licenciada e mantida por uma organização sem fins lucrativos chamada P4 Language Consortium. Também é apoiado pela Open Networking Foundation (ONF) e pela Linux Foundation (LF), duas das maiores organizações guarda-chuva para projetos de rede de código aberto.
A linguagem foi originalmente cunhada em 2013 e descrita em um artigo SIGCOMM CCR de 2014 intitulado “Protocol Independent, Packet Routing Processor Programming”.

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

“O SDN transformou o setor de redes e o P4 leva o SDN ao próximo nível, trazendo programabilidade ao roteamento”, disse Guru Parulkar, diretor executivo da Open Networking Foundation.

A linguagem P4 foi originalmente criada 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 pudesse aprender em um dia e usar para descrever com precisão como os pacotes são enviados pelas redes.

Desde o início, o P4 foi projetado para ser independente do alvo (ou seja, um programa escrito em P4 poderia ser compilado inalterado para ser executado em uma variedade de alvos, como ASICs, FPGAs, CPUs, NPUs e GPUs).

A linguagem também é independente de protocolo (ou seja, um programa P4 pode descrever protocolos padrão existentes ou ser usado para especificar novos modos de endereçamento personalizados).

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

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

Pela primeira vez, descrever o comportamento do switch e dos adaptadores de rede permite criar um modelo executável preciso de toda a rede antes da implantação. Grandes provedores de nuvem podem testar e depurar a rede inteiramente usando software, reduzindo significativamente o tempo e o custo dos testes de interoperabilidade no laboratório sem a necessidade de hardware caro.

Ao usar o P4, os fornecedores de equipamentos de rede podem esperar um comportamento de roteamento subjacente comum em todos os produtos, permitindo a reutilização da infraestrutura de teste, simplificando o desenvolvimento de software de gerenciamento e, em última análise, garantindo a interoperabilidade.

É claro que P4 pode ser usado para escrever programas que descrevam formas completamente novas de roteamento. Por exemplo, o P4 é amplamente utilizado para telemetria e medições em data centers, redes empresariais e de provedores de serviços.

A comunidade de pesquisa também se intensificou. Vários grupos líderes de pesquisa acadêmica em redes publicaram novos aplicativos interessantes baseados em programas P4, incluindo balanceamento de carga, protocolos de consenso e cache de valores-chave. Está a ser criado um novo paradigma de programação, a inovação está a passar do hardware para o software, permitindo o surgimento de muitas ideias inesperadas, novas e engenhosas.

A comunidade de desenvolvedores fez contribuições significativas para o desenvolvimento de código, incluindo compiladores, pipelines, modelos comportamentais, APIs, estruturas de teste, aplicativos e muito mais. Empresas como Alibaba, AT&T, Barefoot, Cisco, Fox Networks, Google, Intel, IXIA, Juniper Networks, Mellanox, Microsoft, Netcope, Netronome, VMware, Xilinx e ZTE têm desenvolvedores dedicados; 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 que P4 é um projeto comunitário independente.

Geração típica de controladores para a linguagem P4:

Linguagem de programação P4

Candidatos em potencial

Linguagem de programação P4
Como a linguagem se destina a aplicações de roteamento, a lista de requisitos e opções de design é diferente em comparação com linguagens de programação de uso geral. As principais características da linguagem são:

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

Independência da implementação alvo

Os programas P4 são projetados para serem independentes de implementação, o que significa que podem ser compilados para muitos tipos diferentes de mecanismos de execução, como processadores de uso geral, FPGAs, sistemas em chips, processadores de rede e ASICs. Esses diferentes tipos de máquinas são conhecidos como alvos P4, e cada alvo requer um compilador para converter o código-fonte P4 em um modelo de switch de destino. O compilador pode ser integrado ao dispositivo de destino, software externo ou até mesmo um serviço em nuvem. Como muitos dos alvos originais dos programas P4 eram para comutação simples de pacotes, é muito comum ouvir o termo "comutador P4", embora "alvo P4" seja mais preciso.

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

P4 é independente de protocolo. Isso significa que a linguagem não possui suporte nativo 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 alvos P4 devem ser capazes de alterar o processamento de pacotes após a implantação do sistema. Esta capacidade tem sido tradicionalmente associada ao roteamento através de processadores de uso geral ou processadores de rede, em vez de circuitos integrados de função fixa.

Embora não haja nada na linguagem que impeça a otimização do desempenho de um conjunto específico de protocolos, essas otimizações são invisíveis para o autor da linguagem e podem, em última análise, reduzir a flexibilidade do sistema e dos objetivos e sua reconfigurabilidade.

Essas características da linguagem foram inicialmente estabelecidas por seus criadores com foco em seu amplo uso em infraestrutura de redes.

A linguagem já é utilizada em muitas empresas:

1) Data centers em hiperescala;

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, tanto na China como em outros países ao redor do mundo, são especializadas em diversas áreas de negócios de alta tecnologia, incluindo diversos serviços de Internet, desenvolvimentos na área de inteligência artificial e entretenimento eletrônico.

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

Como um dos criadores, o Google tem orgulho de observar a rápida adoção do P4 no setor de redes e, em particular, no projeto arquitetônico de data centers.

2) Sociedades comerciais;

A Goldman Sachs aproveita o trabalho com a comunidade de código aberto e o desenvolvimento de padrões e soluções comuns para inovar a infraestrutura de rede e fornecer melhores soluções aos clientes.

3) Produção;

Todo o setor de redes se beneficiaria com uma linguagem como a P4, que define exclusivamente o comportamento de encaminhamento. A Cisco também acredita na transferência de suas linhas de produtos para utilizar esta linguagem.

A Juniper Networks incluiu P4 e P4 Runtime em vários produtos e fornece acesso programático ao processador integrado Juniper e seu código de software.

A Ruijie Networks é uma forte defensora do P4 e dos benefícios que ele traz para as redes. Com o P4, a empresa pode criar e fornecer as melhores soluções para uma ampla gama de clientes.

4) Provedores de telecomunicações;

A AT&T foi uma das primeiras a adotar o P4, uma das primeiras a usar o P4 para definir o comportamento que queria ver em suas redes e a usar dispositivos de encaminhamento programáveis ​​P4 em sua rede.

Na Deutsche Telekom, a linguagem é usada para criar protótipos de funções-chave de rede como parte do programa Access 4.0.

5) Indústria de semicondutores;

A linguagem permitiu que a Barefoot implementasse um novo paradigma para fornecer recursos de software ao plano de roteamento da rede.

Xilinx foi um dos fundadores do P4.org e esteve ativamente envolvido no desenvolvimento da linguagem P4 e a implementou em plataformas programáveis ​​baseadas em FPGA para hardware SmartNIC e NFV, lançando um dos primeiros compiladores P416 como parte do design SDNet.

6) Programas.

A VMware acredita que o P4 cria uma tremenda energia, inovação e comunidade que está impulsionando uma transformação significativa e necessária na rede. A VMware faz parte desse movimento do setor desde o início, à medida que uma nova onda de inovação é impulsionada por abordagens baseadas em software que ampliam os recursos da infraestrutura e os implementam nos produtos mais recentes.

Assim, P4 é uma linguagem de programação independente de alvo e de protocolo que é usada pela indústria e pela academia para definir exclusivamente o comportamento de roteamento de pacotes como um programa, que por sua vez pode ser compilado para múltiplos alvos. Hoje, os alvos incluem switches de hardware e software, switches de hipervisor, NPUs, GPUs, FPGAs, SmartNICs e ASICs.

As principais características da linguagem ampliam significativamente o escopo de sua aplicação e garantem sua rápida implementação em arquiteturas de rede.

Onde começar

P4 é um projeto aberto, todas as informações relevantes estão no site P4.org

Link do repositório https://github.com/p4lang, onde você pode obter exemplos de código-fonte e tutoriais.

Plugar para Eclipse com suporte P4, mas podemos recomendar Estúdio P4 de Descalço.

Linguagem de programação P4

Vejamos as principais abstrações do kernel:

Definição de cabeçalhos — com a ajuda deles, os cabeçalhos do protocolo são determinados.

A definição do cabeçalho especifica:

  • descrição dos formatos de pacotes e 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 – sua tarefa é analisar as manchetes.

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

Linguagem de programação P4

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 estados de máquina vinculando chaves de usuário a ações. Atividade — uma descrição de como a embalagem deve ser manipulada.

As tabelas contêm estados (definidos no nível de gerenciamento) para encaminhamento de pacotes, descrevem a unidade Match-Action

Os pacotes são combinados por:

  • Combinação exata
  • Correspondência de prefixo mais longa (LPM)
  • Correspondência tripla (mascaramento)

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

Todas as ações possíveis devem ser definidas previamente em tabelas.

As ações consistem em código e dados. Os dados vêm do nível de gerenciamento (por exemplo, endereços IP/números de porta). Certas primitivas sem loop podem ser especificadas diretamente na ação, mas o número de instruções 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:

Linguagem de programação P4

Controle de fluxo — indica a ordem em que os módulos Match-Action são usados. Este é um programa imperativo que define a lógica de alto nível e a sequência Match-Action. O fluxo de controle vincula todos os objetos definindo o nível de controle.

Objetos externos são objetos específicos com arquitetura e interfaces API 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 — estruturas de dados associadas a cada pacote.

Existem 2 tipos de metadados:

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

  Metadados internos – fornecidos pela arquitetura
    Porta de entrada e porta de saída são definidas aqui
    Carimbo de data e hora em que o pacote foi enfileirado, profundidade da fila
    hash multicast / fila 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 gerenciar o estado da máquina no plano de dados

Linguagem de programação P4

Exemplo de troca de software na linguagem P4

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

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

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

Linguagem de programação P4

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

  • 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 de switch de software.

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

Linguagem de programação P4

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

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

Membro oficial da comunidade P4 - empresa Grupo de fatores.

Fonte: habr.com

Adicionar um comentário