
P4 je programovací jazyk určený pro programování pravidel pro směrování paketů. Na rozdíl od jazyků obecného účelu, jako je C nebo Python, je P4 jazyk zaměřený na konkrétní obor, který obsahuje řadu konstrukcí optimalizovaných pro síťové směrování.
P4 je jazyk s otevřeným zdrojovým kódem, licencovaný a podporovaný neziskovou organizací známou jako P4 Language Consortium. Je také podporován Open Networking Foundation (ONF) a Linux Foundation (LF) – dvěma největšími zastřešujícími organizacemi v projektech s otevřeným zdrojovým kódem v oblasti síťových technologií.
Jazyk byl původně vymyšlen v roce 2013 a popsán v roce 2014 v dokumentu SIGCOMM CCR s názvem „Protokolově nezávislé programování procesoru pro směrování paketů“.
Od svého vzniku P4 exponenciálně roste a vyvíjí se, rychle se stává standardem pro popis přenosu paketů síťovými zařízeními, včetně síťových adaptérů, přepínačů a směrovačů.
„SDN proměnila síťový průmysl a P4 posouvá SDN na novou úroveň tím, že poskytuje programovatelnost v oblasti směrování,“ řekl Guru Parulkar, výkonný ředitel Open Networking Foundation.
Jazyk P4 byl původně vytvořen skupinou inženýrů a výzkumníků z Google, Intel, Microsoft Research, Barefoot, Princeton a Stanfordu. Cíl byl jednoduchý: vytvořit snadno použitelný jazyk, který se softwarem může naučit za den, a používat jej k přesnému popisu toho, jak jsou pakety směrovány v síti.
Od samého počátku byl P4 vyvíjen jako nezávislý na účelu (tj. program napsaný v P4 mohl být zkompilován bez změn pro běh na různých cílech, jako jsou ASIC, FPGA, CPU, NPU a GPU).
Jazyk je také protokolově nezávislý (tj. program P4 může popisovat existující standardní protokoly nebo se používat k určení nových přizpůsobených adresovacích režimů).
V průmyslu se P4 používá k programování zařízení. Možná v budoucnu budou Internet-RFC a standardy IEEE také zahrnovat specifikaci P4.
P4 lze používat jak pro programovatelné, tak i pro zařízení s pevnou funkcí. Například se používá pro přesné zaznamenávání chování přepínačového potrubí v API rozhraních abstrakce přepínače (SAI), které využívají operační systémy přepínačů s otevřeným zdrojovým kódem SONiC. P4 je také využíván v projektu ONF Stratum pro popis chování přepínání mezi různými pevnými a programovatelnými zařízeními.
Popis chování přepínače a síťových adaptérů poprvé umožňuje vytvořit přesný spustitelný model celé sítě před nasazením. Velcí poskytovatelé cloudu mohou plně testovat a ladit síť pomocí softwaru, což výrazně zkracuje čas a náklady na testování interakce v laboratoři, aniž by bylo nutné drahé vybavení.
Díky P4 mohou dodavatelé síťového vybavení počítat se stejným základním chováním směrování ve všech produktech, což umožňuje opětovné využití zkušební infrastruktury, zjednodušuje vývoj softwaru pro správu a nakonec zaručuje kompatibilitu.
Samozřejmě, že P4 lze použít k psaní programů, které popisují zcela nové způsoby směrování. Například se P4 široce používá pro telemetrii a měření v datových centrech, podnikových sítích a u poskytovatelů služeb.
Výzkumná komunita se také aktivně zapojila. Několik předních akademických výzkumných skupin v oblasti síťových technologií publikovalo zajímavé nové aplikace založené na programech P4, včetně vyvažování zátěže, koherentních protokolů a caching hodnoty klíče. Vytváří se nová paradigma programování, inovace se přesouvají z hardwaru do softwaru, což umožňuje vznik mnoha neočekávaných, nových a geniálních nápadů.
Komunita vývojářů významně přispěla k vývoji kódu, včetně kompilátorů, pipeline programů, behaviorálních modelů, API rozhraní, testovacích prostředí, aplikací a mnoha dalšího. Oddaní vývojáři pracují ve společnosti jako Alibaba, AT&T, Barefoot, Cisco, Fox Networks, Google, Intel, IXIA, Juniper Networks, Mellanox, Microsoft, Netcope, Netronome, VMware, Xilinx a ZTE; na univerzitách jako BUPT, Cornell, Harvard, MIT, NCTU, Princeton, Stanford, Technion, Tsinghua, UMass a USI; a v projektech s otevřeným zdrojovým kódem, včetně CORD, FD.io, OpenDaylight, ONOS, OvS, SAI a Stratum, což podtrhuje, že P4 je nezávislý veřejný projekt.
Typická generace řadičů pro jazyk P4:

Možnosti aplikace

Jelikož je jazyk určen pro aplikace směrování, je seznam požadavků a designových možností odlišný ve srovnání s jazyky obecného účelu. Hlavními charakteristikami jazyka jsou:
- Nezávislost na cílové implementaci;
- Nezávislost na používaném protokolu(-ch);
- Znovu konfigurovatelnost polí.
Nezávislost na cílové implementaci
Programy P4 jsou navrženy tak, aby nebyly závislé na implementaci, což znamená, že mohou být zkompilovány pro mnoho různých typů výkonných strojů, jako jsou procesory obecného určení, FPGA, systémy na čipu, síťové procesory a ASIC. Tyto různé typy strojů jsou známé jako cíle P4, a pro každý cíl je potřeba kompilátor, který převede zdrojový kód P4 do modelu cílového switche. Kompilátor může být integrovaný do cílového zařízení, externího softwaru nebo dokonce cloudové služby. Jelikož mnoho z původních cílů pro programy P4 bylo používáno pro jednoduché spínání paketů, velmi často uslyšíte termín „P4 switch“, i když použití „cíl P4“ je přesnější.
Nezávislost na používaném protokolu(-ch)
P4 je nezávislý na protokolech. To znamená, že jazyk nemá vestavěnou podporu pro běžné protokoly, jako jsou IP, Ethernet, TCP, VxLAN nebo MPLS. Místo toho programátor P4 popisuje formáty záhlaví a názvy polí požadovaných protokolů v programu, které jsou následně interpretovány a zpracovávány zkompilovaným programem a cílovým zařízením.
Znovu konfigurovatelnost polí
Nezávislost na protokolu a model abstraktního jazyka umožňují rekonfigurovatelnost — cíle P4 by měly mít možnost měnit zpracování paketů po nasazení systému. Tato schopnost je tradičně spojena s routováním pomocí procesorů obecného určení nebo síťových procesorů, nikoliv integrovaných obvodů s pevně danými funkcemi.
Ačkoli jazyk neobsahuje žádné překážky, které by bránily optimalizaci pro konkrétní sadu protokolů, tyto optimalizace jsou neviditelné pro autora jazyka a mohou nakonec snížit flexibilitu systému a jeho cíle a rekonfigurovatelnost.
Tyto charakteristiky jazyka byly původně zavedeny jeho tvůrci s orientací na široké využití v síťové infrastruktuře.
Již nyní se jazyk používá v mnoha společnostech:
1) Hyperškálové datové centra;
Čínská společnost Tencent je největší investiční společností na světě a jednou z největších rizikových firem. Dceřiné společnosti Tencent, jak v Číně, tak i v dalších zemích, se specializují na různé oblasti vysoce technologického byznysu, včetně různých internetových služeb, vývoje v oblasti umělé inteligence a elektronické zábavy.
P4 a programovatelná routování jsou pokročilé technologie, které se využívají v architektuře sítě společnosti.
Jako jeden z tvůrců, Google s hrdostí zaznamenává rychlé zavádění P4 v síťovém průmyslu a zejména v oblasti architektonického návrhu datových center.
2) Komerční společnosti;
Goldman Sachs využívá výhod spolupráce s komunitou otevřeného zdroje a vývoje společných standardů a řešení, čímž už nyní přináší inovace do síťové infrastruktury a poskytuje nejlepší řešení pro klienty.
3) Výroba;
Celý síťový průmysl má prospěch z takového jazyka, jako je P4, který jednoznačně určuje chování přesměrování. Také v Cisco se to domnívají a přenášejí své produktové řady na používání tohoto jazyka.
Juniper Networks zahrnul P4 a P4 Runtime do řady produktů a zajišťuje programový přístup k vestavěnému procesoru Juniper a jeho programovému kódu.
Ruijie Networks je aktivním zastáncem P4 a výhod, které přináší sítím. Díky P4 může společnost vytvářet a dodávat špičková řešení pro široké spektrum zákazníků.
4) Telekomunikační poskytovatelé;
AT&T byla jedním z prvních zastánců P4, jako jedna z prvních, která využila P4 k definici chování, které chtěla vidět v sítích, a využívá zařízení pro programovatelné přesměrování P4 ve své síti.
V Deutsche Telekom se jazyk používá k prototypování klíčových síťových funkcí v rámci programu Access 4.0.
5) Polovodičový průmysl;
Jazyk umožnil realizovat novou paradigmu přenosu schopností softwaru na úroveň směrování sítí společností Barefoot.
Xilinx byl jedním ze zakladatelů P4.org a aktivně se podílel na vývoji jazyka P4 a jeho implementaci do programovatelných platforem založených na FPGA pro zařízení SmartNIC a NFV, vydal jeden z prvních kompilátorů P416 jako součást designu SDNet.
6) Software.
Ve společnosti VMware věří, že P4 vytváří obrovskou energii, inovace a komunitu, která vede k významným a nezbytným přeměnám v síti. VMware byla původně součástí tohoto průmyslového hnutí, protože nová vlna inovací je vyvolána softwarovými přístupy, které rozšiřují možnosti infrastruktury a realizuje je v nejnovějších produktech.
Tím pádem je P4 jazyk programování nezávislý na cíli a protokolu, který je používán průmyslem a akademickou obcí k jednoznačnému určení chování směrování paketů jako programu, který může být následně kompilován pro různé cíle. Dnes cíle zahrnují hardwarové a softwarové přepínače, hypervizorové přepínače, NPU, grafické procesory, FPGA, SmartNIC a ASIC.
Hlavní rysy jazyka výrazně rozšiřují jeho oblasti použití a zajišťují jeho rychlou implementaci do architektur sítí.
Jak začít
P4 je otevřený projekt, všechny aktuální informace se nacházejí na stránkách
Odkaz na repozitář , kde můžete získat zdrojové kódy příkladů a vzdělávací materiály.
pro Eclipse s podporou P4, ale můžeme doporučit od společnosti Barefoot.

Prozkoumejme hlavní abstrakce jádra:
Definice hlaviček — pomocí nich se určují hlavičky protokolu.
V definici hlaviček se uvádí:
- popis formátů paketů a názvy polí hlaviček
- pevná a proměnná povolená pole
Například
hlavička Ethernet_h{
bitdstAddr;
bitsrcAddr;
bitetherType;
}
hlavička IPv4_h{
bit verze;
bit ihl;
bit diffserv;
bit celkováDélka;
bit identifikace;
bit vlajky;
bit offsetFragmentu;
bit ttl;
bit protokol;
bit kontrolaHlavičky;
bit zdrojováAdresa;
bit cílováAdresa;
varbit možnosti;
}
Parsery — jejich úkolem je analyzovat hlavičky.
Následující příklad parseru určí přechod koncového stavu stroje z jednoho počátečního stavu do jednoho ze dvou koncových:

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;
}
}…
}
Tabulky — obsahují stavy stroje, které spojují uživatelské klíče s akcemi. Akce — popis toho, jak by se mělo manipulovat s pakety.
Tabulky obsahují stavy (určeno na správní úrovni) pro směrování paketů, popisují jednotku akce Match-Action
Srovnání paketů se provádí podle:
- Přesného shody
- Nejdelšího shody s prefixem (LPM)
- Trojnásobného srovnání (maskování)
table ipv4_lpm{
čte{
ipv4.dstAddr: lpm;
} actions {
přenést();
}
}
Všechny možné akce musí být ve tabulkách definovány předem.
Akce se skládají z kódu a dat. Data pocházejí z řídící úrovně (například IP adresy / čísla portů). Určité, bezcyklové primitivy mohou být přímo uvedeny v akci, ale počet příkazů by měl být předvídatelný. Proto akce nemohou obsahovat žádné cykly nebo podmínková nastavování.
akce 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;
}
Moduly Match-Action — akce pro vytváření vyhledávacího klíče, hledání v tabulce, provádění akcí.
Typický příklad modulu je znázorněn na obrázku:

Tok řízení — určuje pořadí aplikace modulů Match-Action. Je to imperativní program, který určuje logiku na vysoké úrovni a pořadí Match-Action. Tok řízení spojuje všechny objekty, nastavuje úroveň řízení.
Externí objekty — to jsou specifické objekty s jasně definovanou architekturou a rozhraními API. Například výpočet kontrolního součtu, registry, počítadla a podobně.
externí registrace{
registrace(bit velikost);
void čtení(out T výsledek, in bit index);
void zápis(in bit index, in T hodnota);
}
externí KontrolníSoučet16{
KontrolníSoučet16(); //konstruktor
void vyčistit()); //připravit jednotku pro výpočet
void aktualizovat(in T data); //přidat data do kontrolního součtu
void odebrat(in T data); //odebrat data z existujícího kontrolního součtu
bitzískat(); //získat kontrolní součet pro data přidaná od posledního vyčištění
}
Metadatové údaje — datové struktury spojené s každým pakete.
Existují 2 typy metadat:
Uživatelská metadata (prázdná struktura pro všechny pakety)
Můžete sem vložit cokoliv chcete
Dostupné po celé délce pipeline
užitečné pro vlastní potřeby, například pro uchování hash paketu
Interní metadata — zajišťována architekturou
Vstupní port, výstupní port jsou zde určeny
Časová značka, kdy byl paket zařazen do fronty, hloubka fronty
multicast hash / multicast queue
Priorita paketu, důležitost paketu
Specifikace výstupního portu (například výstupní fronta)
P4 kompilátor
P4 kompilátor (P4C) generuje:
- Runtime datové plane
- API pro správu stavu stroje v datové plane

Příklad programového switche v jazyce P4
Zdrojové kódy si můžete stáhnout z repozitáře.
p4lang/p4c-bm: vytváří JSON konfiguraci pro bmv2
p4lang/bmv2: programový switch, který rozumí JSON konfiguracím verze bmv2
Na obrázku je znázorněna schéma kompilace projektu:

Manipulace s tabulkami, registry čtení, počítadla:
- nastavit_tabulku_jako_výchozí <table name> <action name> <action parameters>
- přidat_stůl <table name> <action name> <match fields> => <akce
parameters> [priority] - smazat_tabulku <table name> <entry handle>
V zdrojových kódech je uveden program simple_switch_CLI pro pohodlné používání API programového switche.
Tento a další příklady si můžete stáhnout v repozitáři.

P.S. Na začátku léta společnost Intel podepsala dohodu o akvizici Barefoot Networks, s cílem rychle reagovat na potřeby uživatelů Hyperscale Cloud. Jak uvedl Navin Shenoy (výkonný viceprezident a generální ředitel skupiny datových center ve společnosti Intel Corporation) – to umožní společnosti Intel poskytovat větší pracovní zátěže a více možností pro zákazníky datových center.
Podle mého osobního názoru bychom neměli zapomínat, že společnost Intel je lídrem v oblasti výroby FPGA čipů a má vynikající prostředí Quartus. To znamená, že s příchodem do Intelu má Barefoot nejen možnost rozšířit svoji výrobní řadu, ale také Quartus a P4 Studio čekají vážné aktualizace a doplnění řadou Toffino a Toffino 2.
Oficiální účastník komunity P4 – společnost .
Zdroj: habr.com
