
P4 este un limbaj de programare destinat programării regulilor de rutare a pachetelor. Spre deosebire de un limbaj de programare general, cum ar fi C sau Python, P4 este un limbaj orientat pe domeniu, cu o serie de construcții optimizate pentru rutarea rețelelor.
P4 este un limbaj cu sursă deschisă, licențiat și susținut de o organizație non-profit numită P4 Language Consortium. De asemenea, este susținut de Open Networking Foundation (ONF) și Linux Foundation (LF) — două dintre cele mai mari organizații umbrelă în proiectele cu sursă deschisă în domeniul tehnologiilor de rețea.
Limbajul a fost inițial conceput în 2013 și descris în 2014 în documentul SIGCOMM CCR intitulat „Programarea procesorului de rutare a pachetelor, independent de protocoale”.
De la crearea sa, P4 a crescut și s-a dezvoltat exponențial, devenind rapid standardul pentru descrierea transferului de pachete de către dispozitivele de rețea, inclusiv adaptoare de rețea, switch-uri și routere.
„SDN a transformat industria rețelelor, iar P4 duce SDN la un nou nivel, oferind programabilitate în domeniul rutării”, a declarat Guru Parulkar, director executiv al Open Networking Foundation.
Limbajul P4 a fost inițial creat de o echipă de ingineri și cercetători de la Google, Intel, Microsoft Research, Barefoot, Princeton și Stanford. Scopul a fost simplu: de a crea un limbaj ușor de utilizat, pe care un dezvoltator de software să poată să-l învețe într-o zi și să-l folosească pentru a descrie cu precizie cum sunt trimise pachetele în rețea.
De la bun început, P4 a fost dezvoltat ca fiind independent de țintă (adică un program scris în P4 putea fi compilat fără modificări pentru a rula pe diverse ținte, cum ar fi ASIC, FPGA, CPU, NPU și GPU).
De asemenea, limbajul este independent de protocol (adică un program P4 poate descrie protocoale standard existente sau poate fi folosit pentru a indica noi moduri personalizate de adresare).
În industrie, P4 este utilizat pentru programarea dispozitivelor. Este posibil ca în viitor Internet-RFC și standardele IEEE să includă de asemenea specificația P4.
P4 poate fi utilizat atât pentru dispozitive programabile, cât și pentru cele cu funcții fixe. De exemplu, este folosit pentru a înregistra cu precizie comportamentul conductei comutatorului în API-urile interfeței de abstracție a comutatorului (SAI), utilizate de sistemele de operare ale comutatoarelor cu sursă deschisă SONiC. P4 este, de asemenea, utilizat în proiectul ONF Stratum pentru a descrie comportamentul de comutare printr-o varietate de dispozitive fixe și programabile.
Descrierea comportamentului comutatorului și al adaptoarelor de rețea permite pentru prima dată crearea unui model executabil precis al întregii rețele înainte de desfășurarea acesteia. Marii furnizori de cloud pot testa și depana complet rețeaua folosind software, reducând semnificativ timpul și costurile asociate testării interacțiunii în laborator, fără a necesita echipamente costisitoare.
Folosind P4, furnizorii de echipamente de rețea pot anticipa un comportament de bază unificat al rutării în toate produsele, ceea ce permite reutilizarea infrastructurii de testare, simplifică dezvoltarea software-ului pentru gestionare și, în cele din urmă, garantează compatibilitatea.
Desigur, P4 poate fi utilizat pentru a scrie programe care descriu moduri complet noi de rutare. De exemplu, P4 este utilizat pe scară largă pentru telemetrie și măsurători în centre de date, rețele de întreprindere și furnizori de servicii.
Comunitatea de cercetare s-a mobilizat, de asemenea. Mai multe grupuri de cercetare academice de frunte în tehnologia rețelilor au publicat aplicații noi interesante bazate pe programele P4, inclusiv balansarea încărcăturii, protocoale coerente și caching-ul valorilor cheie. Se creează o nouă paradigmă de programare, inovațiile trec de la hardware la software, permițând apariția unei multitudini de idei neașteptate, noi și geniale.
Comunitatea dezvoltatorilor a adus o contribuție semnificativă la dezvoltarea codului, inclusiv compilatoare, programe de procesare în pipeline, modele de comportament, interfețe API, medii de testare, aplicații și multe altele. Dezvoltatori dedicați există în companii precum Alibaba, AT&T, Barefoot, Cisco, Fox Networks, Google, Intel, IXIA, Juniper Networks, Mellanox, Microsoft, Netcope, Netronome, VMware, Xilinx și ZTE; din universități, inclusiv BUPT, Cornell, Harvard, MIT, NCTU, Princeton, Stanford, Technion, Tsinghua, UMass și USI; și proiecte open-source, inclusiv CORD, FD.io, OpenDaylight, ONOS, OvS, SAI și Stratum, subliniază faptul că P4 este un proiect public independent.
Generarea tipică de controlere pentru limbajul P4:

Perspectivele de aplicare

Deoarece limbajul este destinat aplicațiilor de rutare, lista cerințelor și opțiunilor de design este diferită în comparație cu limbajele de programare de uz general. Caracteristicile principale ale limbajului sunt:
- Independența de implementarea țintă;
- Independența de protocol(-ele) utilizate;
- Reconfigurabilitatea câmpurilor.
Independența de implementarea țintă
Programele P4 sunt dezvoltate astfel încât să nu depindă de implementare, adică pot fi compilate pentru diverse tipuri de mașini executive, cum ar fi procesoare de uz general, FPGA, sisteme pe cip, procesoare de rețea și ASIC. Aceste tipuri diferite de mașini sunt cunoscute sub numele de ținte P4, iar pentru fiecare țintă este necesar un compilator pentru a transforma codul sursă P4 într-un model de switch țintă. Compilatorul poate fi integrat în dispozitivul țintă, software extern sau chiar un serviciu de cloud. Deoarece multe dintre țintele originale pentru programele P4 au fost utilizate pentru comutarea simplă a pachetelor, adesea se aude termenul „switch P4”, chiar dacă utilizarea termenului „țintă P4” este mai corectă.
Independența de protocol(-ele) utilizate
P4 este independent de protocoale. Asta înseamnă că limbajul nu are suport încorporat pentru protocoalele comune, cum ar fi IP, Ethernet, TCP, VxLAN sau MPLS. În schimb, programatorul P4 descrie formatele de antete și numele câmpurilor protocoalelor necesare în program, care sunt interpretate și procesate de programul compilat și de dispozitivul țintă.
Reconfigurabilitatea câmpurilor
Independența față de protocol și modelul de limbaj abstract permite reconfigurabilitatea — obiectivele P4 trebuie să aibă capacitatea de a modifica procesarea pachetelor după implementarea sistemului. Această capacitate este tradițional asociată cu rutarea prin procesori generali sau procesoare de rețea, nu prin cipuri integrate cu funcții fixe.
Deși în limbaj nu există nimic care să împiedice optimizarea funcționării unui set specific de protocoale, aceste optimizări sunt invizibile pentru autorul limbajului și pot, în cele din urmă, să reducă flexibilitatea sistemului și obiectivele și reconfigurabilitatea acestora.
Aceste caracteristici ale limbajului au fost inițial încorporate de creatorii săi cu orientarea spre utilizarea sa pe scară largă în infrastructura de rețea.
Chiar acum, limbajul este utilizat de multe companii:
1) Centre de date hipermascule;
Compania chineză Tencent este cea mai mare companie de investiții din lume și una dintre cele mai mari companii de capital de risc. Subsidiarii Tencent, atât în China, cât și în alte țări din lume, se specializează în diverse domenii ale afacerilor high-tech, inclusiv diferite servicii de internet, dezvoltări în domeniul inteligenței artificiale și divertisment electronic.
P4 și rutarea programabilă sunt tehnologii avansate folosite în arhitectura rețelei companiei.
Fiind unul dintre creatorii săi, Google subliniază cu mândrie adoptarea rapidă a P4 în industria de rețea și, în special, în domeniul proiectării arhitecturale a centrelor de date.
2) Companii comerciale;
Goldman Sachs profită de avantajele colaborării cu comunitatea open-source și dezvoltării standardelor comune și soluțiilor, aducând deja inovații în infrastructura de rețea și oferind cele mai bune soluții pentru clienți.
3) Producție;
Întreaga industrie de rețea va beneficia de un limbaj precum P4, care definește clar comportamentul redirecționării. Aceasta este perspectiva și la Cisco, care își transferă liniile de produse pentru a utiliza acest limbaj.
Juniper Networks a inclus P4 și P4 Runtime în mai multe produse, oferind acces programatic la procesorul încorporat Juniper și codul său.
Ruijie Networks este un susținător activ al P4 și al avantajelor pe care acesta le aduce rețelelor. Cu ajutorul P4, compania poate crea și oferi soluții de clasă superioară pentru o gamă largă de clienți.
4) Furnizori de telecomunicații;
AT&T a fost unul dintre primii susținători ai P4, fiind printre primii care au utilizat P4 pentru a defini comportamentul pe care doreau să-l vadă în rețele și care folosesc dispozitive de redirecționare programabile P4 în rețeaua lor.
În Deutsche Telekom, limbajul este utilizat pentru a crea prototipuri ale funcțiilor cheie ale rețelei în cadrul programului Access 4.0.
5) Industria semiconductorilor;
Limbajul a permis realizarea unei noi paradigme de transfer a capacităților software în domeniul rutării rețelei de către Barefoot.
Xilinx a fost unul dintre fondatorii P4.org și a participat activ la dezvoltarea limbajului P4, implementându-l pe platformele programabile bazate pe FPGA pentru echipamente SmartNIC și NFV, lansând unul dintre primele compilatoare P416 ca parte a designului SDNet.
6) Software.
La VMware, se consideră că P4 generează o energie uriașă, inovații și o comunitate care conduc la transformări semnificative și necesare în rețea. VMware a fost, inițial, parte a acestui demers industrial, deoarece noua eră a inovațiilor este provocată de abordările software care extind capacitățile infrastructurii și le implementează în cele mai recente produse.
Astfel, P4 este un limbaj de programare independent de scop și protocol, utilizat de industrie și comunitatea științifică pentru a defini în mod clar comportamentul rutării pachetelor ca un program, care, la rândul său, poate fi compilat pentru mai multe scopuri. Astăzi, scopurile includ comutatoare hardware și software, comutatoare de hipervizoare, NPU, GPU-uri, FPGA-uri, SmartNIC-uri și ASIC-uri.
Caracteristicile principale ale limbajului extind semnificativ domeniile sale de aplicare și asigură implementarea rapidă în arhitecturile rețelelor.
Cu ce să începem
P4 este un proiect open-source, toate informațiile actuale se găsesc pe site-ul
Link către repository , unde puteți obține codurile sursă pentru exemple și materiale de învățare.
pentru Eclipse cu suport P4, dar putem recomanda de la Barefoot.

Să analizăm conceptele de bază ale nucleului:
Definirea headerelor — cu ajutorul lor se definesc headerele protocolului.
În definirea headerelor se stabilește:
- descrierea formatelor de pachete și numele câmpurilor headerelor
- câmpurile fixe și variabile permise
De exemplu
antet Ethernet_h{
bitdstAddr;
bitsrcAddr;
bitetherType;
}
antet IPv4_h{
bit versiune;
bit ihl;
bit diffserv;
bit lungimeTotală;
bit identificare;
bit steaguri;
bit offsetFrag;
bit ttl;
bit protocol;
bit verificareHdr;
bit addrSrc;
bit addrDst;
varbit opțiuni;
}
Parseuri — sarcina lor este să analizeze header-urile.
Următorul exemplu de parseur va determina tranziția stării finale a mașinii dintr-o stare inițială într-una dintre cele două stări finale:

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;
}
}…
}
Tabele — conțin stările mașinii care leagă cheile utilizatorului de acțiuni. Acțiuni — descrierea modului în care ar trebui să fie manipulată pachetul.
Tabelele conțin stări (definite la nivelul de management) pentru redirecționarea pachetelor, descriu unitatea de acțiune Match-Action
Potrivirea pachetelor se face pe baza:
- Potrivire exactă
- Potrivirii celei mai lungi cu prefix (LPM)
- Potrivire triplă (mascare)
table ipv4_lpm{
citit{
ipv4.dstAddr: lpm;
} actions {
forward();
}
}
Toate acțiunile posibile trebuie să fie definite în tabele în prealabil.
Acțiunile constau în cod și date. Datele provin din nivelul de management (de exemplu, adrese IP / numere de porturi). Primitivele definite, fără ciclicitate, pot fi specificate direct în acțiune, dar numărul de comenzi trebuie să fie previzibil. Prin urmare, acțiunile nu pot conține bucle sau condiții.
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;
}
Modulele Match-Action — acțiuni pentru crearea unei chei de căutare, căutarea în tabel, executarea acțiunilor.
Un exemplu tipic de modul este ilustrat în figură:

Fluxul de control — indică ordinea aplicării modulelor Match-Action. Aceasta este o programare imperativă, care definește logica de nivel înalt și secvența Match-Action. Fluxul de control leagă toate obiectele, stabilind nivelul de management.
Obiecte externe — acestea sunt obiecte specifice cu o arhitectură și interfețe API clar definite. De exemplu, calculul sumelor de control, registroare, contori, etc.
extern registrare{
registrare(bit dimensiune);
void citește(out T rezultat, in bit index);
void scrie(in bit index, in T valoare);
}
extern Checksum16{
Checksum16(); //constructor
void clear(); //pregătește unitatea pentru calcul
void update(in T data); //adauga date la checksum
void remove(in T data); //șterge date din checksum-ul existent
bitget(); //obține checksum-ul pentru datele adăugate de la ultima curățare
}
Metadatele — structuri de date asociate fiecărui pachet.
Există 2 tipuri de metadate:
Metadate utilizator (structură goală pentru toate pachetele)
Puteți adăuga aici orice doriți
Disponibile pe întreaga lungime a pipeline-ului
convenabil pentru utilizarea în scopuri proprii, de exemplu, pentru stocarea hash-ului pachetului
Metadate interne — asigurate de arhitectură
Portul de intrare, portul de ieșire sunt definite aici
Timpul de stampilare când pachetul a fost pus în coadă, adâncimea cozii
multicast hash / multicast queue
Prioritatea pachetului, importanța pachetului
Specificația portului de ieșire (de exemplu, coada de ieșire)
Compilatorul P4
Compilatorul P4 (P4C) generează:
- Data plane runtime
- API pentru gestionarea stării mașinii în data plane

Exemplu de switch software în limbajul P4
Codurile sursă pot fi descărcate din repository.
p4lang/p4c-bm: creează o configurație JSON pentru bmv2
p4lang/bmv2: switch software care înțelege configurațiile JSON de versiune bmv2
Diagrama arată procesul de compilare a proiectului:

Manipulări cu tabele, registre de citire, contoare:
- setare_tabel_implicita <table name> <action name> <action parameters>
- adăugați tabelul <table name> <action name> <match fields> => <acțiune
parameters> [priority] - șterge_tabelul <table name> <entry handle>
În codurile sursă este inclusă programul simple_switch_CLI pentru utilizarea convenabilă a API-ului switch-ului software.
Acest exemplu și altele pot fi descărcate din repository.

P.S. La începutul verii, compania Intel a semnat un acord pentru achiziționarea Barefoot Networks, cu scopul de a răspunde rapid nevoilor utilizatorilor Hyperscale Cloud. A declarat Navin Shenoy (vicepreședinte executiv și manager general al grupului Data Center la Intel Corporation) - aceasta va permite Intel să ofere încărcături de lucru mai mari și mai multe oportunități pentru clienții datacentrelor.
După părerea mea personală, nu ar trebui să uităm că Intel este lider în producția de cipuri FPGA și are un mediu excelent Quartus. Astfel, se poate aștepta ca, odată cu integrarea în Intel, Barefoot să nu-și îmbogățească doar linia de produse, ci și Quartus și P4 Studio să aștepte actualizări semnificative și extinderi cu linia Toffino și Toffino 2.
Participant oficial în comunitatea P4 - compania .
Sursa: habr.com
