
P4 è un linguaggio di programmazione progettato per programmare le regole di instradamento dei pacchetti. A differenza di un linguaggio di uso generale come C o Python, P4 è un linguaggio specifico per il dominio, con una serie di costrutti ottimizzati per l'instradamento di rete.
P4 è un linguaggio open source, con licenza e supportato da un'organizzazione non profit chiamata P4 Language Consortium. È supportato anche da Open Networking Foundation (ONF) e Linux Foundation (LF), le due maggiori organizzazioni ombrello nei progetti open source nel settore delle tecnologie di rete.
Il linguaggio è stato inizialmente ideato nel 2013 e descritto nel 2014 in un documento SIGCOMM CCR intitolato "Programmazione del processore di instradamento dei pacchetti indipendente dal protocollo".
Sin dalla sua creazione, P4 è cresciuto e si è sviluppato esponenzialmente, diventando rapidamente lo standard per la descrizione del trasferimento dei pacchetti da parte dei dispositivi di rete, inclusi adattatori di rete, switch e router.
«SDN ha trasformato l'industria della rete e P4 porta SDN a un livello superiore, offrendo programmabilità nell'ambito dell'instradamento», ha dichiarato Guru Parulkar, amministratore delegato di 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 con precisione come i pacchetti vengono instradati nella rete.
Fin dall'inizio, P4 è stato sviluppato come indipendente dall'hardware (cioè, un programma scritto in P4 poteva essere compilato senza modifiche per funzionare su diverse piattaforme, come ASIC, FPGA, CPU, NPU e GPU).
Il linguaggio è anche indipendente dal protocollo (cioè, un programma P4 può descrivere protocolli standard esistenti o essere utilizzato per specificare nuovi modi personalizzati di indirizzamento).
Nell'industria, P4 viene utilizzato per programmare dispositivi. È possibile che in futuro anche Internet-RFC e gli standard IEEE includano la specifica P4.
P4 può essere utilizzato sia per dispositivi programmabili che per dispositivi a funzione fissa. Ad esempio, viene utilizzato per registrare con precisione il comportamento della pipeline di uno switch nelle interfacce API del Switch Abstraction Interface (SAI), utilizzate dai sistemi operativi degli switch open source SONiC. P4 è anche utilizzato nel progetto ONF Stratum per descrivere il comportamento di commutazione attraverso vari dispositivi fissi e programmabili.
La descrizione del comportamento degli switch e degli adattatori di rete consente per la prima volta di creare un modello eseguibile accurato dell'intera rete prima del dispiegamento. I grandi fornitori di cloud possono testare e debugare completamente la rete tramite software, il che riduce notevolmente i tempi e i costi per il test dell'interazione in laboratorio, senza richiedere costoso hardware.
Utilizzando P4, i fornitori di hardware di rete possono contare su un comportamento di instradamento di base comune in tutti i prodotti, consentendo il riutilizzo dell'infrastruttura di test, semplificando lo sviluppo del software di gestione e, in ultima analisi, garantendo la compatibilità.
Certo, P4 può essere utilizzato per scrivere programmi che descrivono modi completamente nuovi di instradamento. Ad esempio, P4 è ampiamente utilizzato per la telemetria e la misurazione nei data center, nelle reti aziendali e nei fornitori di servizi.
La comunità di ricerca si è anche attivata. Diverse importanti gruppi di ricerca accademica nel campo delle tecnologie di rete hanno pubblicato nuove applicazioni interessanti basate su programmi P4, inclusi bilanciamento del carico, protocolli coerenti e caching di valore chiave. Si sta creando una nuova парадигма di programmazione, portando l'innovazione dall'hardware al software e permettendo l'emergere di molte idee nuove, inaspettate e geniali.
La comunità degli sviluppatori ha dato un contributo significativo allo sviluppo del codice, inclusi compilatori, programmi di pipeline, modelli comportamentali, API, ambienti di test, applicazioni e molto altro. Sviluppatori dedicati provengono da aziende come Alibaba, AT&T, Barefoot, Cisco, Fox Networks, Google, Intel, IXIA, Juniper Networks, Mellanox, Microsoft, Netcope, Netronome, VMware, Xilinx e ZTE; da università come BUPT, Cornell, Harvard, MIT, NCTU, Princeton, Stanford, Technion, Tsinghua, UMass e USI; e progetti open source come CORD, FD.io, OpenDaylight, ONOS, OvS, SAI e Stratum, sottolineando che P4 è un progetto pubblico indipendente.
Generazione tipica dei controllori per il linguaggio P4:

Prospettive di applicazione

Poiché il linguaggio è destinato ad applicazioni di routing, l'elenco delle esigenze e delle opzioni di design è diverso rispetto ai linguaggi di programmazione generali. Le principali caratteristiche del linguaggio sono:
- Indipendenza dall'implementazione target;
- Indipendenza dai protocolli utilizzati;
- Configurabilità dei campi.
Indipendenza dall'implementazione target
I programmi P4 sono progettati per non dipendere dall'implementazione, il che significa che possono essere compilati per molti tipi diversi di macchine esecutive, come processori generali, FPGA, sistemi su chip, processori di rete e ASIC. Questi diversi tipi di macchine sono noti come obiettivi P4, e per ogni obiettivo è necessario un compilatore per convertire il codice sorgente P4 in un modello di switch target. Il compilatore può essere incorporato nel dispositivo target, un software esterno o anche un servizio cloud. Poiché molte delle prime destinazioni per i programmi P4 sono state utilizzate per la semplice commutazione dei pacchetti, è molto comune sentire il termine "switch P4", anche se l'uso di "obiettivo P4" è più corretto.
Indipendenza dai protocolli utilizzati
P4 è indipendente dai protocolli. Ciò significa che il linguaggio non ha supporto incorporato per protocolli comuni come IP, Ethernet, TCP, VxLAN o MPLS. Invece, il programmatore P4 descrive i formati degli header e i nomi dei campi dei protocolli richiesti nel programma, che a loro volta vengono interpretati e gestiti dal programma compilato e dal dispositivo target.
Configurabilità dei campi
L'indipendenza dal protocollo e il modello del linguaggio astratto consentono la configurabilità: gli obiettivi P4 devono avere la possibilità di modificare l'elaborazione dei pacchetti dopo il dispiegamento del sistema. Questa possibilità è tradizionalmente associata al routing tramite processori generali o processori di rete, piuttosto che circuiti integrati a funzione fissa.
Sebbene nel linguaggio non ci sia nulla che possa ostacolare l'ottimizzazione per un determinato insieme di protocolli, queste ottimizzazioni sono invisibili all'autore del linguaggio e possono, in ultima analisi, ridurre la flessibilità del sistema e degli obiettivi e la loro configurabilità.
Queste caratteristiche del linguaggio sono state inizialmente incorporate dai suoi creatori con l'intenzione di un utilizzo ampio nell'infrastruttura di rete.
Già adesso il linguaggio è utilizzato in molte aziende:
1) Data center iperscalabili;
La società cinese Tencent è la più grande società di investimento al mondo e una delle più grandi aziende di venture capital. Le sussidiarie di Tencent, sia in Cina che in altri paesi, sono specializzate in vari settori dell'alta tecnologia, inclusi servizi internet, sviluppi nell'intelligenza artificiale e intrattenimento elettronico.
P4 e il routing programmabile sono tecnologie all'avanguardia utilizzate nell'architettura della rete dell'azienda.
Essendo uno dei creatori, Google si compiace di notare la rapida adozione di P4 nell'industria delle reti e, in particolare, nel campo della progettazione delle architetture dei data center.
2) Aziende commerciali;
Goldman Sachs, sfruttando i vantaggi della collaborazione con la comunità open source e dello sviluppo di standard e soluzioni comuni, sta già innovando l'infrastruttura di rete e offrendo le migliori soluzioni ai clienti.
3) Manifattura;
L'intera industria della rete trarrà vantaggio da un linguaggio come P4, che definisce chiaramente il comportamento di instradamento. Questo è anche il punto di vista di Cisco, che sta adattando le proprie linee di prodotto per utilizzare questo linguaggio.
Juniper Networks ha integrato P4 e P4 Runtime in una serie di prodotti, fornendo accesso software al processore integrato Juniper e al suo codice.
Ruijie Networks è un attivo sostenitore di P4 e dei benefici che essa porta alle reti. Con P4, l'azienda può creare e fornire soluzioni di livello superiore per una vasta gamma di clienti.
4) Fornitori di telecomunicazioni;
AT&T è stata una delle prime sostenitrici di P4, una delle prime a utilizzare P4 per definire il comportamento che voleva vedere nelle reti e ad utilizzare dispositivi di instradamento programmabili P4 nella propria rete.
In Deutsche Telekom, il linguaggio è utilizzato per la prototipazione di funzionalità di rete chiave nell'ambito del programma Access 4.0.
5) Industria dei semiconduttori;
Il linguaggio ha consentito di realizzare una nuova paradigma per la trasmissione delle capacità software nella sfera del routing di rete da parte dell'azienda Barefoot.
Xilinx è stata una delle fondatrici di P4.org e ha partecipato attivamente allo sviluppo del linguaggio P4, implementandolo su piattaforme programmabili basate su FPGA per hardware SmartNIC e NFV, rilasciando uno dei primi compilatori P416 come parte del design di SDNet.
6) Software.
In VMware si ritiene che P4 generi una grande energia, innovazione e comunità, portando a trasformazioni significative e necessarie nella rete. VMware è stata inizialmente parte di questo movimento industriale, poiché una nuova onda di innovazioni è provocata da approcci software che ampliano le capacità dell'infrastruttura e le realizzano nei prodotti più recenti.
Così, P4 è un linguaggio di programmazione indipendente dall'obiettivo e dal protocollo, utilizzato dall'industria e dalla comunità scientifica per definire in modo univoco il comportamento del routing dei pacchetti come programma, che a sua volta può essere compilato per diversi obiettivi. Oggi, gli obiettivi includono switch hardware e software, switch hypervisor, NPU, GPU, FPGA, SmartNIC e ASIC.
Le principali caratteristiche del linguaggio ampliamo significativamente i suoi ambiti di applicazione e garantiscono una rapida implementazione nelle architetture di rete.
Da dove iniziare
P4 è un progetto open source, tutte le informazioni attuali sono disponibili su
Link al repository , dove puoi ottenere il codice sorgente degli esempi e materiali didattici.
per Eclipse con supporto P4, ma possiamo raccomandare di Barefoot.

Analizziamo le principali astrazioni del nucleo:
Definizione degli header — utilizzati per definire gli header di protocollo.
Nella definizione degli header vengono specificati:
- la descrizione dei formati dei pacchetti e i nomi dei campi degli header
- campi fissi e variabili consentiti
Ad esempio
intestazione Ethernet_h{
bitdstAddr;
bitsrcAddr;
bitetherType;
}
intestazione IPv4_h{
bit version;
bit ihl;
bit diffserv;
bit totalLen;
bit identification;
bit flags;
bit fragOffset;
bit ttl;
bit protocol;
bit hdrChecksum;
bit srcAddr;
bit dstAddr;
varbit options;
}
Parser — la loro funzione è analizzare gli header.
Il seguente esempio di parser definirà la transizione dello stato finale della macchina da uno stato iniziale a uno dei due stati finali:

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;
}
}…
}
Tabelle — contengono gli stati della macchina che collegano le chiavi utente con azioni. Azioni — una descrizione di come manipolare il pacchetto.
Le tabelle contengono stati (definiti a livello di gestione) per l'instradamento dei pacchetti, descrivendo l'unità di azione Match-Action.
L'abbinamento dei pacchetti è effettuato tramite:
- Corrispondenza esatta
- Corrispondenza con il prefisso più lungo (LPM)
- Corrispondenza tripla (mascheramento)
table ipv4_lpm{
legge{
ipv4.dstAddr: lpm;
} azioni {
invia();
}
}
Tutte le possibili azioni devono essere definite nelle tabelle in anticipo.
Le azioni consistono in codice e dati. I dati provengono dal livello di gestione (ad esempio, indirizzi IP / numeri di porta). Alcuni primitivi senza cicli possono essere definiti 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-Action — responsabili della creazione della chiave di ricerca, della ricerca nella tabella, dell'esecuzione delle azioni.
Un esempio tipico di modulo è mostrato nell'immagine:

Flusso di controllo — indica l'ordine di applicazione dei moduli Match-Action. È un programma imperativo, che definisce la logica ad alto livello e la sequenza di Match-Action. Il flusso di controllo collega tutti gli oggetti, definendo il livello di gestione.
Oggetti esterni — sono oggetti specifici con architettura e interfacce API chiaramente definite. Ad esempio, calcolo di checksum, registri, contatori, ecc.
esterno registrare{
registrare(bit dimensione);
void leggere(out T risultato, in bit indice);
void scrivere(in bit indice, in T valore);
}
esterno Checksum16{
Checksum16(); //costruttore
void clear(); //preparare l'unità per il calcolo
void update(in T data); //aggiungere dati al checksum
void remove(in T data); //rimuovere dati dal checksum esistente
bitget(); //ottenere il checksum per i dati aggiunti dall'ultimo clear
}
Metadati — strutture dati associate a ciascun pacchetto.
Esistono 2 tipi di metadati:
Metadati utente (struttura vuota per tutti i pacchetti)
Puoi mettere qui tutto quello che vuoi
Disponibile per tutto il pipeline
comodo da utilizzare per i tuoi scopi, ad esempio per archiviare l'hash di un pacchetto
Metadati interni — forniti dall'architettura
La porta di ingresso, la porta di uscita sono definite qui
Timestamp in cui il pacchetto è stato messo in coda, profondità della coda
hash multicast / coda multicast
Priorità del pacchetto, importanza del pacchetto
Specificazione della porta di uscita (ad esempio, coda di output)
Compilatore P4
Il compilatore P4 (P4C) genera:
- Runtime del data plane
- API per gestire lo stato della macchina nel data plane

Esempio di switch software scritto in P4
Il codice sorgente può essere scaricato dal repository.
p4lang/p4c-bm: crea una configurazione JSON per bmv2
p4lang/bmv2: switch software che comprende le configurazioni JSON della versione bmv2
Nell'immagine è mostrato lo schema di compilazione del progetto:

Manipolazioni con tabelle, registri di lettura, contatori:
- imposta_tabella_predefinita <table name> <action name> <action parameters>
- aggiungi_tabella <table name> <action name> <match fields> => <azione
parameters> [priority] - cancellare_tabella <table name> <entry handle>
Il codice sorgente include il programma simple_switch_CLI per un utilizzo comodo dell'API dello switch software.
Questi e altri esempi possono essere scaricati dal repository.

P.S. All'inizio dell'estate, Intel ha firmato un accordo per acquisire Barefoot Networks, con l'obiettivo di soddisfare rapidamente le esigenze degli utenti di Hyperscale Cloud. Come dichiarato da Navin Shenoy (vice presidente esecutivo e general manager del Data Center Group di Intel Corporation) — questo permetterà a Intel di offrire carichi di lavoro più elevati e maggiori possibilità per i clienti dei data center.
A mio avviso, non bisogna dimenticare che Intel è un leader nella produzione di chip FPGA e dispone di un'ottima piattaforma Quartus. Dunque, ci si può aspettare che, con l'arrivo in Intel, Barefoot non solo allargherà la sua gamma di prodotti, ma anche che Quartus e P4 Studio riceveranno aggiornamenti significativi e si arricchiranno con la linea Toffino e Toffino 2.
Membro ufficiale della comunità P4 — azienda .
Fonte: habr.com
