
P4 is een programmeertaal bedoeld voor het programmeren van pakketrouteringsregels. In tegenstelling tot een algemene programmeertaal zoals C of Python, is P4 een domeinspecifieke taal met een reeks constructies die geoptimaliseerd zijn voor netwerkrouting.
P4 is een open-source programmeertaal, gelicentieerd en ondersteund door een non-profitorganisatie, het P4 Language Consortium. Het wordt ook ondersteund door de Open Networking Foundation (ONF) en de Linux Foundation (LF) — twee van de grootste overkoepelende organisaties in open-source netwerktechnologieprojecten.
De taal werd oorspronkelijk bedacht in 2013 en beschreven in 2014 in een document van SIGCOMM CCR met de titel "Protocolonafhankelijk programmeren van pakketrouteringsprocessoren."
Sinds de oprichting groeit en evolueert P4 exponentieel en wordt het snel de standaard voor het beschrijven van pakketoverdracht door netwerkapparaten, waaronder netwerkadapters, switches en routers.
“SDN heeft de netwerkindustrie getransformeerd, en P4 tilt SDN naar een hoger niveau door programmeerbaarheid in de routering te bieden,” zei Guru Parulkar, de uitvoerend directeur van de Open Networking Foundation.
De P4-taal werd oorspronkelijk gemaakt door een groep ingenieurs en onderzoekers van Google, Intel, Microsoft Research, Barefoot, Princeton en Stanford. Het doel was eenvoudig: een gebruiksvriendelijke taal creëren die een softwareontwikkelaar in één dag kan leren en gebruiken voor een nauwkeurige beschrijving van hoe pakketten door het netwerk worden doorgestuurd.
Vanaf het begin is P4 ontwikkeld als doelonafhankelijk (d.w.z. een programma geschreven in P4 kan worden gecompileerd zonder wijzigingen voor uitvoering op verschillende doelen, zoals ASIC, FPGA, CPU, NPU en GPU).
De taal is ook protocolonafhankelijk (d.w.z. een P4-programma kan bestaande standaardprotocollen beschrijven of worden gebruikt om nieuwe configureerbare adresseringsschema's aan te geven).
In de industrie wordt P4 gebruikt voor het programmeren van apparaten. Het is mogelijk dat in de toekomst ook Internet-RFC's en IEEE-normen de specificatie van P4 zullen bevatten.
P4 kan worden gebruikt voor zowel programmeerbare als vaste functie-apparaten. Het wordt bijvoorbeeld gebruikt voor het nauwkeurig vastleggen van het gedrag van de switch-pijplijn in de API-interface van de Switch Abstraction Interface (SAI), die wordt gebruikt door de open-source switch OS SONiC. P4 wordt ook gebruikt in het ONF Stratum-project om het schakelen van meerdere vaste en programmeerbare apparaten te beschrijven.
De beschrijving van het gedrag van switches en netwerkadapters maakt het voor het eerst mogelijk om een nauwkeurig uitvoeringsmodel van het hele netwerk te creëren voordat het wordt uitgerold. Grote cloudproviders kunnen hun netwerk volledig testen en debuggen met software, wat de tijd en kosten voor het testen van interacties in het laboratorium aanzienlijk vermindert, zonder dure hardware.
Door P4 te gebruiken, kunnen netwerkhardwareleveranciers rekenen op een gemeenschappelijk basisgedrag van routering in al hun producten, wat hergebruik van testinfrastructuur mogelijk maakt, de ontwikkeling van beheersoftware vereenvoudigt en uiteindelijk compatibiliteit garandeert.
Natuurlijk kan P4 worden gebruikt om programma's te schrijven die volledig nieuwe manieren van routeren beschrijven. P4 wordt bijvoorbeeld veel gebruikt voor telemetrie en metingen in datacenters, bedrijfsnetwerken en bij dienstverleners.
De onderzoeksgemeenschap is ook actiever geworden. Verschillende vooraanstaande academische onderzoeksgroepen op het gebied van netwerktechnologie hebben interessante nieuwe toepassingen op basis van P4-programma's gepubliceerd, waaronder load balancing, consensusprotocollen en key-value caching. Er ontstaat een nieuwe programmeerparadigma, waarbij innovaties van hardware naar software verschuiven, waardoor een overvloed aan onverwachte, nieuwe en geniale ideeën ontstaat.
De ontwikkelaarsgemeenschap heeft een aanzienlijke bijdrage geleverd aan de ontwikkeling van code, waaronder compilers, pipelineprogramma's, gedragsmodellen, API's, testomgevingen, applicaties en nog veel meer. Toegewijde ontwikkelaars werken bij bedrijven zoals Alibaba, AT&T, Barefoot, Cisco, Fox Networks, Google, Intel, IXIA, Juniper Networks, Mellanox, Microsoft, Netcope, Netronome, VMware, Xilinx en ZTE; van universiteiten, waaronder BUPT, Cornell, Harvard, MIT, NCTU, Princeton, Stanford, Technion, Tsinghua, UMass en USI; en projecten met open source zoals CORD, FD.io, OpenDaylight, ONOS, OvS, SAI en Stratum, benadrukken het feit dat P4 een onafhankelijk publiek project is.
Typische controllergeneratie voor de P4-taal:

Toepassingsperspectieven

Aangezien de taal is ontworpen voor routeringsapplicaties, verschilt de lijst van vereisten en ontwerpmogelijkheden van die van algemene programmeertalen. De belangrijkste kenmerken van de taal zijn:
- Onafhankelijkheid van de doelimplementatie;
- Onafhankelijkheid van het gebruikte protocol(-en);
- Heraanpasbaarheid van velden.
Onafhankelijkheid van de doelimplementatie
P4-programma's zijn zo ontwikkeld dat ze onafhankelijk zijn van de implementatie, dat wil zeggen dat ze gecompileerd kunnen worden voor verschillende soorten uitvoeringsmachines, zoals algemene processoren, FPGA's, systemen op een chip, netwerkprocessoren en ASIC's. Deze verschillende soorten machines worden P4-doelen genoemd, en voor elk doel is een compiler nodig om de P4-broncode om te zetten in het model van de doel-switch. De compiler kan ingebouwd zijn in het doelapparaat, externe software of zelfs een cloudservice. Aangezien veel van de oorspronkelijke doelen voor P4-programma's werden gebruikt voor eenvoudige pakketdoorschakeling, hoort men vaak de term 'P4-switch', ook al is het gebruik van 'P4-doel' nauwkeuriger.
Onafhankelijkheid van het gebruikte protocol(-en)
P4 is onafhankelijk van protocollen. Dit betekent dat de taal geen ingebouwde ondersteuning heeft voor gangbare protocollen zoals IP, Ethernet, TCP, VxLAN of MPLS. In plaats daarvan beschrijft de P4-programmeur de headerformaten en de veldnamen van de vereiste protocollen in het programma, die op hun beurt worden geïnterpreteerd en verwerkt door het gecompileerde programma en het doelapparaat.
Heraanpasbaarheid van velden
Protocolonafhankelijkheid en het model van een abstracte taal stellen reconfigurabiliteit mogelijk — P4-doelen moeten in staat zijn om de verwerking van pakketten aan te passen na de implementatie van het systeem. Deze mogelijkheid is traditioneel verbonden met routing via algemene processors of netwerkprocessors, en niet met geïntegreerde circuits met vaste functies.
Hoewel er in de taal niets is dat het optimaliseren van specifieke protocollen zou kunnen belemmeren, zijn deze optimalisaties onzichtbaar voor de auteur van de taal en kunnen zij uiteindelijk de flexibiliteit van het systeem en zijn doelen en reconfigurabiliteit verminderen.
Deze kenmerken van de taal zijn oorspronkelijk door de makers ervan ontworpen met het oog op wijdverbreid gebruik in netwerkinfrastructuur.
De taal wordt al door veel bedrijven gebruikt:
1) Hyperscale datacenters;
Het Chinese bedrijf Tencent is het grootste investeringsbedrijf ter wereld en een van de grootste durfkapitaalbedrijven. Dochterondernemingen van Tencent, zowel in China als in andere delen van de wereld, zijn gespecialiseerd in verschillende gebieden van de high-tech industrie, waaronder diverse internetdiensten, ontwikkelingen op het gebied van kunstmatige intelligentie en elektronische entertainment.
P4 en programmeerbare routing zijn geavanceerde technologieën die worden gebruikt in de netwerkarchitectuur van het bedrijf.
Als een van de oprichters, is Google trots op de snelle adoptie van P4 in de netwerkindustrie en, in het bijzonder, in het gebied van architectonisch ontwerp van datacenters.
2) Commerciële bedrijven;
Goldman Sachs brengt nu al innovaties in netwerkinfrastructuur en biedt de beste oplossingen voor klanten door gebruik te maken van de voordelen van het werken met open source-gemeenschappen en het ontwikkelen van gemeenschappelijke standaarden en oplossingen.
3) Productie;
De hele netwerkindustrie profiteert van een taal zoals P4, die het gedrag van forwarding ondubbelzinnig definieert. Dit wordt ook gesteund door Cisco, dat zijn productlijnen migreert naar het gebruik van deze taal.
Juniper Networks heeft P4 en P4 Runtime geïntegreerd in een aantal producten en biedt programmeerbare toegang tot de ingebouwde processor van Juniper en zijn programmatuur.
Ruijie Networks is an active supporter of P4 and the advantages it brings to networks. With P4, the company can create and deliver best-in-class solutions for a wide range of clients.
4) Telecom providers;
AT&T was one of the first supporters of P4, one of the first to use P4 to define the behavior it wanted to see in networks, and uses P4 programmable forwarding devices in its network.
In Deutsche Telekom, the language is used to prototype key network functions within the Access 4.0 program.
5) Semiconductor industry;
The language enabled Barefoot to implement a new paradigm of transmitting software capabilities into the networking routing plane.
Xilinx was one of the founders of P4.org and actively participated in the development of the P4 language, deploying it in programmable FPGA-based platforms for SmartNIC and NFV equipment, releasing one of the first P416 compilers as part of the SDNet design.
6) Software.
At VMware, it is believed that P4 creates immense energy, innovation, and community, leading to significant and necessary transformations in networking. VMware was initially part of this industry movement, as a new wave of innovation is driven by software approaches that enhance infrastructure capabilities and implement them in the latest products.
Thus, P4 is a target-independent and protocol-independent programming language used by industry and academia to unambiguously define the behavior of packet routing as a program that can in turn be compiled for multiple targets. Today, the targets include hardware and software switches, hypervisor switches, NPUs, GPUs, FPGAs, SmartNICs, and ASICs.
The main features of the language significantly expand its application areas and ensure its rapid implementation in network architectures.
Getting Started
P4 is an open project, all relevant information is available on the website
Link to repository , where you can obtain source codes of examples and training materials.
for Eclipse with P4 support, but we can recommend by Barefoot.

Let's discuss the main abstractions of the core:
Definitie van headers — hiermee worden de protocolheaders gedefinieerd.
In de definitie van headers wordt vastgelegd:
- de beschrijving van pakketformaten en de namen van headervelden
- de vaste en variabele toegestane velden
Bijvoorbeeld
kop Ethernet_h{
bitdstAddr;
bitsrcAddr;
bitetherType;
}
kop IPv4_h{
bitversie;
bitihl;
bitdiffserv;
bittotalLen;
bitidentificatie;
bitvlaggen;
bitfragOffset;
bitttl;
bitprotocol;
bithdrChecksum;
bitsrcAddr;
bitdstAddr;
varbitopties;
}
Parsers — hun taak is het ontleden van headers.
De volgende parservoorbeeld bepaalt de overgang van de eindtoestand van de machine van een initiële toestand naar een van de twee eindtoestanden:

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;
}
}…
}
Tabellen — bevatten de toestanden van de machine die gebruikerssleutels verbindt met acties. Acties — een beschrijving van hoe het pakket moet worden gemanipuleerd.
Tabellen bevatten toestanden (bepaald op bestuuringsniveau) voor het doorsturen van pakketten en beschrijven de actie-eenheid Match-Action.
Pakketsynchronisatie gebeurt op:
- Nauwkeurige overeenstemming
- De langste match met een prefix (LPM)
- Drievoudige vergelijking (maskeren)
table ipv4_lpm{
leest{
ipv4.dstAddr: lpm;
} acties {
doorgaan();
}
}
Alle mogelijke acties moeten vooraf in de tabellen worden gedefinieerd.
Acties bestaan uit code en data. De gegevens komen van het bestuursniveau (bijvoorbeeld IP-adressen / poortnummers). Bepaalde, niet-cyclische primitieve kunnen direct in de actie worden opgegeven, maar het aantal instructies moet voorspelbaar zijn. Daarom kunnen acties geen cycli of voorwaardelijke operatoren bevatten.
actie 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;
}
Match-Action-modules — acties voor het creëren van een zoeksleutel, zoeken in de tabel en uitvoeren van acties.
Een typisch voorbeeld van een module is weergegeven in de afbeelding:

Besturingsstroom — geeft de volgorde aan waarin Match-Action-modules worden toegepast. Dit is een imperatieve procedure die de logica van hoog niveau en de volgorde van Match-Action definieert. De besturingsstroom verbindt alle objecten en bepaalt het controle-niveau.
Externe objecten — dit zijn specifieke objecten met een duidelijk gedefinieerde architectuur en API-interfaces. Bijvoorbeeld de berekening van een controlegetal, registers, telwerken, etc.
extern register{
register(bit size);
void read(out T result, in bit index);
void write(in bit index, in T value);
}
extern Checksum16{
Checksum16(); //constructor
void clear(); //bereid eenheid voor computatie
void update(in T data); //voeg gegevens toe aan checksum
void remove(in T data); //verwijder gegevens uit bestaande checksum
bitget(); //krijg de checksum voor de gegevens die zijn toegevoegd sinds de laatste clear
}
Metadata — datastructuren die aan elk pakket zijn gekoppeld.
Er zijn 2 soorten metadata:
Gebruikersondersteunde metadata (lege structuur voor alle pakketten)
Je kunt hier alles plaatsen wat je wilt
Beschikbaar gedurende de volledige pipeline
handig voor eigen doeleinden, bijvoorbeeld voor het opslaan van de hash van het pakket
Interne metadata — wordt geleverd door de architectuur
De invoerpoort en uitvoerpoort worden hier bepaald
Tijdstempel wanneer het pakket in de wachtrij werd geplaatst, diepte van de wachtrij
multicast hash / multicast queue
Pakketprioriteit, belang van het pakket
Specificatie van de uitgangspoort (bijvoorbeeld outputqueue)
P4-compiler
De P4-compiler (P4C) genereert:
- Runtime van het dataplane
- API voor het beheren van de status van de machine in het dataplane

Voorbeeld van een software-switch in P4-taal
De broncode is te downloaden uit de repository.
p4lang/p4c-bm: genereert een JSON-configuratie voor bmv2
p4lang/bmv2: een software-switch die JSON-configuraties van bmv2 begrijpt
De afbeelding toont het compilatieproces van het project:

Handelingen met tabellen, registers voor lezen, tellers:
- standaard_tabel_instellen <table name> <action name> <action parameters>
- tafel_toevoegen <table name> <action name> <match fields> => <actie
parameters> [prioriteit] - tabel_verwijderen <table name> <entry handle>
In de broncodes is een programma simple_switch_CLI opgenomen voor gebruiksgemak van de API van de software-switch.
Deze en andere voorbeelden kunt u downloaden uit de repository.

P.S. Begin deze zomer heeft Intel een overeenkomst getekend voor de overname van Barefoot Networks, met het oog op een snelle vervulling van de behoeften van Hyperscale Cloud-gebruikers. Zoals Navin Shenoy (executive vice president en general manager van de Data Center Group bij Intel Corporation) heeft verklaard — zal dit Intel in staat stellen om grotere workloads en meer mogelijkheden voor datacenters te bieden.
Naar mijn mening is het belangrijk om niet te vergeten dat Intel een leider is in de productie van FPGA-chips en dat ze een uitstekende omgeving, Quartus, hebben. Dit betekent dat met de komst van Barefoot naar Intel, niet alleen het productassortiment zal uitbreiden, maar ook Quartus en P4 Studio waarschijnlijk serieuze updates en een uitbreiding met de Toffino en Toffino 2-lijn kunnen verwachten.
Officiële deelnemer aan de P4-gemeenschap — het bedrijf .
Bron: habr.com
