Linguaggio di programmazione P4

Linguaggio di programmazione P4
P4 è un linguaggio di programmazione progettato per programmare le regole di instradamento dei pacchetti. A differenza di un linguaggio generico come C o Python, P4 è un linguaggio specifico del dominio con una serie di progetti ottimizzati per il routing di rete.

P4 è un linguaggio open source concesso in licenza e gestito da un'organizzazione senza scopo di lucro chiamata P4 Language Consortium. È inoltre supportato dalla Open Networking Foundation (ONF) e dalla Linux Foundation (LF), due delle più grandi organizzazioni ombrello per progetti di rete open source.
Il linguaggio è stato originariamente coniato nel 2013 e descritto in un documento SIGCOMM CCR del 2014 intitolato "Protocol Independent, Packet Routing Processor Programming".

Sin dal suo inizio, P4 è cresciuto e si è evoluto in modo esponenziale, diventando rapidamente uno standard per descrivere la trasmissione di pacchetti da parte di dispositivi di rete, inclusi adattatori di rete, switch e router.

"SDN ha trasformato il settore del networking e P4 porta SDN a un livello superiore apportando programmabilità al routing", ha affermato Guru Parulkar, direttore esecutivo della Open Networking Foundation.

Il linguaggio P4 è stato originariamente creato da un gruppo di ingegneri e ricercatori di Google, Intel, Microsoft Research, Barefoot, Princeton e Stanford. L'obiettivo era semplice: creare un linguaggio facile da usare che uno sviluppatore di software potesse imparare in un giorno e utilizzare per descrivere accuratamente il modo in cui i pacchetti vengono inviati attraverso le reti.

Fin dall'inizio, P4 è stato progettato per essere indipendente dal target (ovvero un programma scritto in P4 potrebbe essere compilato senza modifiche per essere eseguito su una varietà di target come ASIC, FPGA, CPU, NPU e GPU).

Il linguaggio è anche indipendente dal protocollo (ovvero, un programma P4 può descrivere protocolli standard esistenti o essere utilizzato per specificare nuove modalità di indirizzamento personalizzate).

Nell'industria, P4 viene utilizzato per la programmazione del dispositivo. Forse in futuro gli standard Internet-RFC e IEEE includeranno anche la specifica P4.

P4 può essere utilizzato sia per dispositivi a funzione programmabile che fissa. Ad esempio, viene utilizzato per registrare accuratamente il comportamento della pipeline dello switch nelle API Switch Abstraction Interface (SAI) utilizzate dal sistema operativo dello switch open source SONiC. P4 viene utilizzato anche nel progetto ONF Stratum per descrivere il comportamento di commutazione su una varietà di dispositivi fissi e programmabili.

Per la prima volta, la descrizione del comportamento dello switch e degli adattatori di rete consente di creare un modello eseguibile accurato dell'intera rete prima della distribuzione. I grandi fornitori di servizi cloud possono testare ed eseguire il debug della rete interamente utilizzando il software, riducendo significativamente i tempi e i costi dei test di interoperabilità in laboratorio senza richiedere hardware costoso.

Utilizzando P4, i fornitori di apparecchiature di rete possono aspettarsi un comportamento di routing comune a tutti i prodotti, consentendo il riutilizzo dell'infrastruttura di test, semplificando lo sviluppo del software di gestione e, in definitiva, garantendo l'interoperabilità.

Naturalmente, P4 può essere utilizzato per scrivere programmi che descrivono modi di routing completamente nuovi. Ad esempio, P4 è ampiamente utilizzato per la telemetria e le misurazioni nei data center, nelle reti aziendali e dei fornitori di servizi.

Anche la comunità della ricerca si è intensificata. Diversi importanti gruppi di ricerca accademica sulle reti hanno pubblicato nuove interessanti applicazioni basate sui programmi P4, tra cui bilanciamento del carico, protocolli di consenso e memorizzazione nella cache dei valori chiave. Si sta creando un nuovo paradigma di programmazione, l’innovazione si sta spostando dall’hardware al software, permettendo a molte idee inaspettate, nuove e ingegnose di emergere.

La comunità degli sviluppatori ha apportato contributi significativi allo sviluppo del codice, inclusi compilatori, pipeline, modelli comportamentali, API, framework di test, applicazioni e altro ancora. Aziende come Alibaba, AT&T, Barefoot, Cisco, Fox Networks, Google, Intel, IXIA, Juniper Networks, Mellanox, Microsoft, Netcope, Netronome, VMware, Xilinx e ZTE hanno sviluppatori dedicati; da università tra cui BUPT, Cornell, Harvard, MIT, NCTU, Princeton, Stanford, Technion, Tsinghua, UMass e USI; e progetti open source tra cui CORD, FD.io, OpenDaylight, ONOS, OvS, SAI e Stratum evidenziano il fatto che P4 è un progetto comunitario indipendente.

Generazione tipica di controller per il linguaggio P4:

Linguaggio di programmazione P4

Prospettive di applicazione

Linguaggio di programmazione P4
Poiché il linguaggio è destinato alle applicazioni di routing, l'elenco dei requisiti e delle opzioni di progettazione è diverso rispetto ai linguaggi di programmazione generici. Le caratteristiche principali della lingua sono:

  1. Indipendenza dall'implementazione degli obiettivi;
  2. Indipendenza dei protocolli utilizzati;
  3. Riconfigurabilità sul campo.

Indipendenza dall'implementazione degli obiettivi

I programmi P4 sono progettati per essere indipendenti dall'implementazione, il che significa che possono essere compilati per molti tipi diversi di motori di esecuzione, come processori generici, FPGA, system-on-chip, processori di rete e ASIC. Questi diversi tipi di macchine sono noti come target P4 e ciascun target richiede un compilatore per convertire il codice sorgente P4 in un modello di switch di destinazione. Il compilatore può essere integrato nel dispositivo di destinazione, in un software esterno o persino in un servizio cloud. Poiché molti dei target originali dei programmi P4 riguardavano la semplice commutazione di pacchetto, è molto comune sentire il termine "switch P4" anche se "target P4" è più preciso.

Indipendenza dei protocolli utilizzati

P4 è indipendente dal protocollo. Ciò significa che il linguaggio non ha il supporto nativo per protocolli comuni come IP, Ethernet, TCP, VxLAN o MPLS. Invece, il programmatore P4 descrive i formati delle intestazioni e i nomi dei campi dei protocolli richiesti nel programma, che a loro volta vengono interpretati ed elaborati dal programma compilato e dal dispositivo di destinazione.

Riconfigurabilità sul campo

L'indipendenza del protocollo e il modello del linguaggio astratto consentono la riconfigurabilità: i target P4 dovrebbero essere in grado di modificare l'elaborazione dei pacchetti dopo la distribuzione del sistema. Questa capacità è stata tradizionalmente associata all'instradamento attraverso processori generici o processori di rete piuttosto che circuiti integrati a funzione fissa.

Sebbene non ci sia nulla nel linguaggio che impedisca l'ottimizzazione delle prestazioni di un particolare insieme di protocolli, queste ottimizzazioni sono invisibili all'autore del linguaggio e possono in definitiva ridurre la flessibilità del sistema, degli obiettivi e la loro riconfigurabilità.

Queste caratteristiche del linguaggio sono state inizialmente stabilite dai suoi creatori concentrandosi sul suo uso diffuso nell'infrastruttura di rete.

Il linguaggio è già utilizzato in molte aziende:

1) Data center iperscala;

La società cinese Tencent è la più grande società di investimento al mondo e una delle più grandi società di venture capital. Le filiali di Tencent, sia in Cina che in altri paesi del mondo, sono specializzate in varie aree di business high-tech, inclusi vari servizi Internet, sviluppi nel campo dell'intelligenza artificiale e dell'intrattenimento elettronico.

P4 e il routing programmabile sono tecnologie avanzate utilizzate nell'architettura di rete dell'azienda.

Essendo uno dei creatori, Google è orgoglioso di notare la rapida adozione di P4 nel settore delle reti e in particolare nella progettazione architettonica dei data center.

2) Società commerciali;

Goldman Sachs trae vantaggio dalla collaborazione con la comunità open source e dallo sviluppo di standard e soluzioni comuni per innovare l'infrastruttura di rete e fornire soluzioni migliori ai clienti.

3) Produzione;

L'intero settore delle reti trarrebbe vantaggio da un linguaggio come P4 che definisce in modo univoco il comportamento di inoltro. Cisco crede anche nel trasferire le sue linee di prodotti per utilizzare questo linguaggio.

Juniper Networks ha incluso P4 e P4 Runtime in numerosi prodotti e fornisce accesso programmatico al processore embedded Juniper e al relativo codice software.

Ruijie Networks è un forte sostenitore di P4 e dei vantaggi che apporta alle reti. Con P4, l'azienda può creare e fornire soluzioni best-in-class a un'ampia gamma di clienti.

4) Fornitori di telecomunicazioni;

AT&T è stato uno dei primi ad adottare P4, uno dei primi a utilizzare P4 per definire il comportamento che voleva vedere nelle proprie reti e a utilizzare dispositivi di inoltro programmabili P4 sulla propria rete.

Presso Deutsche Telekom, il linguaggio viene utilizzato per prototipare le funzioni chiave della rete come parte del programma Access 4.0.

5) Industria dei semiconduttori;

Il linguaggio ha consentito a Barefoot di implementare un nuovo paradigma per fornire funzionalità software al piano di routing della rete.

Xilinx è stato uno dei fondatori di P4.org ed è stato attivamente coinvolto nello sviluppo del linguaggio P4 e lo ha implementato in piattaforme programmabili basate su FPGA per SmartNIC e hardware NFV, rilasciando uno dei primi compilatori P416 come parte del progetto SDNet.

6)Software.

VMware ritiene che P4 crei un'enorme energia, innovazione e comunità che stanno guidando una trasformazione significativa e necessaria nella rete. VMware ha fatto parte di questo movimento del settore sin dall'inizio, poiché una nuova ondata di innovazione è guidata da approcci basati su software che estendono le capacità dell'infrastruttura e la implementano nei prodotti più recenti.

Pertanto, P4 è un linguaggio di programmazione indipendente dal target e dal protocollo utilizzato dall'industria e dal mondo accademico per definire in modo univoco il comportamento di instradamento dei pacchetti come un programma, che a sua volta può essere compilato per più target. Oggi gli obiettivi includono switch hardware e software, switch hypervisor, NPU, GPU, FPGA, SmartNIC e ASIC.

Le caratteristiche principali del linguaggio ampliano significativamente l'ambito della sua applicazione e ne garantiscono la rapida implementazione nelle architetture di rete.

Guida introduttiva

P4 è un progetto aperto, tutte le informazioni rilevanti sono sul sito web P4.org

Collegamento al repository https://github.com/p4lang, dove è possibile ottenere codice sorgente di esempio ed esercitazioni.

plug-in per Eclipse con supporto P4, ma possiamo consigliarlo Studio P4 da A piedi nudi.

Linguaggio di programmazione P4

Diamo un'occhiata alle principali astrazioni del kernel:

Definizione delle intestazioni — con il loro aiuto vengono determinate le intestazioni del protocollo.

La definizione dell'intestazione specifica:

  • descrizione dei formati dei pacchetti e dei nomi dei campi di intestazione
  • campi consentiti fissi e variabili

Per esempio

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;
}

Parser - il loro compito è analizzare i titoli.

Il seguente esempio di parser determinerà la transizione dello stato finale della macchina da uno stato iniziale a uno dei due stati finali:

Linguaggio di programmazione 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;
        }
    }…
}

tavoli — contengono stati macchina che collegano le chiavi utente con le azioni. Attività — una descrizione di come il pacchetto dovrebbe essere manipolato.

Le tabelle contengono gli stati (definiti a livello di gestione) per l'inoltro dei pacchetti, descrivono l'unità Match-Action

I pacchetti vengono abbinati da:

  • Corrispondenza esatta
  • Corrispondenza del prefisso più lunga (LPM)
  • Tripla corrispondenza (mascheramento)

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

Tutte le possibili azioni devono essere definite in anticipo nelle tabelle.

Le azioni sono costituite da codice e dati. I dati provengono dal livello di gestione (ad es. indirizzi IP/numeri di porta). Alcune primitive prive di loop possono essere specificate direttamente nell'azione, ma il numero di istruzioni deve essere prevedibile. Pertanto, le azioni non possono contenere cicli o istruzioni condizionali.

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;
}

Moduli Match-Azione — azioni per creare una chiave di ricerca, cercare in una tabella, eseguire azioni.

Un tipico esempio di modulo è mostrato in figura:

Linguaggio di programmazione P4

Flusso di controllo — indica l'ordine in cui vengono utilizzati i moduli Match-Action. Questo è un programma imperativo che definisce la logica di alto livello e la sequenza Match-Action. Il flusso di controllo collega tutti gli oggetti definendo il livello di controllo.

Oggetti esterni sono oggetti specifici con un'architettura e interfacce API chiaramente definite. Ad esempio, calcolo del checksum, registri, contatori, contatori, ecc.

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
}

metadati — strutture dati associate a ciascun pacchetto.

Esistono 2 tipi di metadati:

  Metadati personalizzati (struttura vuota per tutti i pacchetti)
    Puoi mettere quello che vuoi qui
    Disponibile in tutta la pipeline
    comodo da utilizzare per scopi personali, ad esempio per archiviare l'hash di un pacchetto

  Metadati interni: forniti dall'architettura
    Qui vengono definite la porta di ingresso e la porta di uscita
    Timestamp del momento in cui il pacchetto è stato messo in coda, profondità della coda
    hash multicast/coda multicast
    Priorità del pacchetto, importanza del pacchetto
    Specifica della porta di output (ad esempio coda di output)

Compilatore P4

Il compilatore P4 (P4C) genera:

  1. Runtime del piano dati
  2. API per la gestione dello stato della macchina nel piano dati

Linguaggio di programmazione P4

Esempio di cambio software in linguaggio P4

I codici sorgente possono essere scaricati dal repository.

p4lang/p4c-bm: crea la configurazione JSON per bmv2
p4lang/bmv2: uno switch software che comprende le configurazioni JSON della versione bmv2

In figura è riportato lo schema di compilazione del progetto:

Linguaggio di programmazione P4

Manipolazioni con tabelle, registri di lettura, contatori:

  • 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>


Il codice sorgente contiene il programma simple_switch_CLI per un comodo utilizzo dell'API software switch.

Puoi scaricare questo e altri esempi dal repository.

Linguaggio di programmazione P4

PS All'inizio di questa estate, Intel ha firmato un accordo per acquisire Barefoot Networks nel tentativo di soddisfare rapidamente le esigenze degli utenti di Hyperscale Cloud. Come ha affermato Navin Shenoy (vicepresidente esecutivo e direttore generale del Data Center Group di Intel Corporation), ciò consentirà a Intel di fornire carichi di lavoro più ampi e maggiori opportunità per i clienti dei data center.

A mio parere personale, non bisogna dimenticare che Intel è leader nella produzione di chip FPGA e dispone di un ottimo ambiente Quartus. Ciò significa che possiamo aspettarci che con l'arrivo di Intel, Barefoot non solo espanderà la sua linea di prodotti, ma anche Quartus e P4 Studio riceveranno seri aggiornamenti e aggiunte alla linea Toffino e Toffino 2.

Membro ufficiale della comunità P4 - azienda Gruppo di fattori.

Fonte: habr.com

Aggiungi un commento