Język programowania P4

Język programowania P4
P4 to język programowania przeznaczony do programowania reguł routingu pakietów. W przeciwieństwie do języków ogólnego przeznaczenia, takich jak C lub Python, P4 jest językiem specyficznym dla domeny z wieloma projektami zoptymalizowanymi pod kątem routingu sieciowego.

P4 to język typu open source, licencjonowany i utrzymywany przez organizację non-profit o nazwie P4 Language Consortium. Jest także wspierany przez Open Networking Foundation (ONF) i Linux Foundation (LF), dwie z największych organizacji patronackich zajmujących się projektami sieciowymi typu open source.
Język ten został pierwotnie wymyślony w 2013 roku i opisany w artykule SIGCOMM CCR z 2014 roku zatytułowanym „Protocol Independent, Packet Routing Processor Programming”.

Od momentu powstania P4 rozwijał się i ewoluował wykładniczo, szybko stając się standardem opisującym transmisję pakietów przez urządzenia sieciowe, w tym karty sieciowe, przełączniki i routery.

„SDN przekształciło branżę sieciową, a P4 przenosi SDN na wyższy poziom, wprowadzając programowalność do routingu” – powiedział Guru Parulkar, dyrektor wykonawczy Open Networking Foundation.

Język P4 został pierwotnie stworzony przez grupę inżynierów i badaczy z Google, Intel, Microsoft Research, Barefoot, Princeton i Stanford. Cel był prosty: stworzyć łatwy w użyciu język, którego programista mógłby się nauczyć w jeden dzień i używać go do dokładnego opisu sposobu przesyłania pakietów w sieciach.

Od samego początku P4 został zaprojektowany tak, aby był niezależny od celu (tj. program napisany w P4 można było skompilować w niezmienionej postaci do działania na różnych układach docelowych, takich jak układy ASIC, FPGA, procesory, NPU i procesory graficzne).

Język jest również niezależny od protokołu (tj. program P4 może opisywać istniejące standardowe protokoły lub być używany do określania nowych, niestandardowych trybów adresowania).

W przemyśle P4 służy do programowania urządzeń. Być może w przyszłości standardy Internet-RFC i IEEE uwzględnią także specyfikację P4.

P4 można używać zarówno w urządzeniach programowalnych, jak i o stałych funkcjach. Na przykład służy do dokładnego rejestrowania zachowania potoku przełącznika w interfejsach API interfejsu abstrakcji przełączania (SAI) używanych przez system operacyjny przełącznika SONiC o otwartym kodzie źródłowym. P4 jest również używany w projekcie ONF Stratum do opisu zachowania przełączania w różnych urządzeniach stacjonarnych i programowalnych.

Po raz pierwszy opisanie zachowania przełącznika i kart sieciowych pozwala na utworzenie dokładnego, wykonywalnego modelu całej sieci przed wdrożeniem. Duzi dostawcy usług w chmurze mogą testować i debugować sieć całkowicie za pomocą oprogramowania, znacznie skracając czas i koszty testowania interoperacyjności w laboratorium bez konieczności stosowania drogiego sprzętu.

Korzystając z P4, dostawcy sprzętu sieciowego mogą oczekiwać wspólnego zachowania routingu we wszystkich produktach, umożliwiając ponowne wykorzystanie infrastruktury testowej, upraszczając tworzenie oprogramowania zarządzającego i ostatecznie zapewniając interoperacyjność.

Oczywiście w P4 można pisać programy opisujące zupełnie nowe sposoby routingu. Na przykład P4 jest szeroko stosowany do telemetrii i pomiarów w centrach danych, sieciach przedsiębiorstw i dostawców usług.

Wzrosła także aktywność społeczności badawczej. Kilka wiodących akademickich grup badawczych zajmujących się sieciami badawczymi opublikowało nowe, ekscytujące aplikacje oparte na programach P4, obejmujące równoważenie obciążenia, protokoły konsensusu i buforowanie wartości kluczy. Tworzy się nowy paradygmat programowania, innowacje przenoszą się ze sprzętu do oprogramowania, pozwalając na pojawienie się wielu nieoczekiwanych, nowych i genialnych pomysłów.

Społeczność programistów wniosła znaczący wkład w rozwój kodu, włączając w to kompilatory, potoki, modele behawioralne, interfejsy API, platformy testowe, aplikacje i nie tylko. Firmy takie jak Alibaba, AT&T, Barefoot, Cisco, Fox Networks, Google, Intel, IXIA, Juniper Networks, Mellanox, Microsoft, Netcope, Netronome, VMware, Xilinx i ZTE mają dedykowanych programistów; z uniwersytetów, w tym BUPT, Cornell, Harvard, MIT, NCTU, Princeton, Stanford, Technion, Tsinghua, UMass i USI; oraz projekty open source, w tym CORD, FD.io, OpenDaylight, ONOS, OvS, SAI i Stratum podkreślają fakt, że P4 jest niezależnym projektem społecznościowym.

Typowa generacja sterowników dla języka P4:

Język programowania P4

Perspektywy aplikacji

Język programowania P4
Ponieważ język ten jest przeznaczony do aplikacji routingowych, lista wymagań i opcji projektowych jest inna niż w przypadku języków programowania ogólnego przeznaczenia. Główne cechy języka to:

  1. Niezależność od realizacji celów;
  2. Niezależność od stosowanych protokołów;
  3. Możliwość rekonfiguracji pola.

Niezależność od realizacji celów

Programy P4 zaprojektowano tak, aby były niezależne od implementacji, co oznacza, że ​​można je kompilować dla wielu różnych typów silników wykonawczych, takich jak procesory ogólnego przeznaczenia, układy FPGA, układy typu system-on-chip, procesory sieciowe i układy ASIC. Te różne typy maszyn są znane jako cele P4, a każdy cel wymaga kompilatora do konwersji kodu źródłowego P4 na docelowy model przełącznika. Kompilator można wbudować w urządzenie docelowe, oprogramowanie zewnętrzne, a nawet usługę w chmurze. Ponieważ wiele pierwotnych celów programów P4 dotyczyło prostego przełączania pakietów, bardzo często słyszy się termin „przełącznik P4”, mimo że „cel P4” jest dokładniejszy.

Niezależność od używanych protokołów

P4 jest niezależny od protokołu. Oznacza to, że język nie ma natywnej obsługi popularnych protokołów, takich jak IP, Ethernet, TCP, VxLAN czy MPLS. Zamiast tego programista P4 opisuje formaty nagłówków i nazwy pól wymaganych protokołów w programie, które z kolei są interpretowane i przetwarzane przez skompilowany program i urządzenie docelowe.

Możliwość rekonfiguracji pola

Niezależność protokołu i model języka abstrakcyjnego umożliwiają rekonfigurację — cele P4 powinny mieć możliwość zmiany przetwarzania pakietów po wdrożeniu systemu. Możliwość tę tradycyjnie kojarzono z routingiem przez procesory ogólnego przeznaczenia lub procesory sieciowe, a nie z układami scalonymi o ustalonych funkcjach.

Chociaż w języku nie ma nic, co uniemożliwiałoby optymalizację wydajności określonego zestawu protokołów, optymalizacje te są niewidoczne dla autora języka i mogą ostatecznie zmniejszyć elastyczność systemu i celów oraz ich rekonfigurowalność.

Te cechy języka zostały początkowo określone przez jego twórców, skupiając się na jego powszechnym zastosowaniu w infrastrukturze sieciowej.

Język ten jest już używany w wielu firmach:

1) Hiperskalowe centra danych;

Chińska firma Tencent jest największą firmą inwestycyjną na świecie i jedną z największych firm venture capital. Spółki zależne Tencent, zarówno w Chinach, jak i w innych krajach na całym świecie, specjalizują się w różnych obszarach biznesu high-tech, w tym w różnorodnych usługach internetowych, rozwoju w obszarze sztucznej inteligencji i rozrywki elektronicznej.

P4 i programowalny routing to zaawansowane technologie, które są wykorzystywane w architekturze sieciowej firmy.

Jako jeden z pomysłodawców, Google z dumą odnotowuje szybkie przyjęcie P4 w branży sieciowej, a zwłaszcza w projektowaniu architektury centrów danych.

2) Spółki handlowe;

Goldman Sachs korzysta ze współpracy ze społecznością open source i opracowywania wspólnych standardów i rozwiązań w celu wprowadzania innowacji w infrastrukturze sieciowej i zapewniania lepszych rozwiązań dla klientów.

3) Produkcja;

Cała branża sieciowa skorzystałaby na języku takim jak P4, który w unikalny sposób definiuje zachowanie przekazywania. Cisco wierzy również w przeniesienie swoich linii produktów do używania tego języka.

Firma Juniper Networks włączyła środowisko wykonawcze P4 i P4 do wielu produktów i zapewnia programowy dostęp do wbudowanego procesora Juniper i jego kodu oprogramowania.

Ruijie Networks jest zdecydowanym zwolennikiem P4 i korzyści, jakie przynosi on sieciom. Dzięki P4 firma może tworzyć i dostarczać najlepsze w swojej klasie rozwiązania szerokiemu gronu klientów.

4) Dostawcy telekomunikacyjni;

Firma AT&T jako pierwsza przyjęła P4 i jako jedna z pierwszych zastosowała P4 do definiowania pożądanego zachowania w swoich sieciach oraz zastosowała w swojej sieci programowalne urządzenia przesyłające P4.

W Deutsche Telekom język ten służy do prototypowania kluczowych funkcji sieciowych w ramach programu Access 4.0.

5) Przemysł półprzewodników;

Język umożliwił Barefoot wdrożenie nowego paradygmatu dostarczania możliwości oprogramowania na płaszczyźnie routingu sieci.

Xilinx był jednym z założycieli P4.org i był aktywnie zaangażowany w rozwój języka P4 oraz wdrożył go w programowalne platformy oparte na FPGA dla sprzętu SmartNIC i NFV, wypuszczając jeden z pierwszych kompilatorów P416 w ramach projektu SDNet.

6) Oprogramowanie.

VMware wierzy, że P4 tworzy ogromną energię, innowacje i społeczność, która napędza znaczącą i niezbędną transformację w sieci. Firma VMware od początku była częścią tego ruchu branżowego, ponieważ nowa fala innowacji napędzana jest podejściami opartymi na oprogramowaniu, które rozszerzają możliwości infrastruktury i wdrażają je w najnowszych produktach.

Zatem P4 jest językiem programowania niezależnym od celu i protokołu, używanym w przemyśle i środowisku akademickim do jednoznacznego definiowania zachowania routingu pakietów jako programu, który z kolei można skompilować dla wielu celów. Obecnie cele obejmują przełączniki sprzętowe i programowe, przełączniki hypervisorów, jednostki NPU, procesory graficzne, FPGA, SmartNIC i ASIC.

Główne cechy języka znacznie rozszerzają zakres jego zastosowań i zapewniają jego szybką implementację w architekturach sieciowych.

Pierwsze kroki

P4 jest projektem otwartym, wszystkie istotne informacje znajdują się na stronie internetowej P4.org

Link do repozytorium https://github.com/p4lang, gdzie można uzyskać przykładowy kod źródłowy i tutoriale.

Wtyczka dla Eclipse z obsługą P4, ale możemy polecić Studio P4 z Boso.

Język programowania P4

Spójrzmy na główne abstrakcje jądra:

Definiowanie nagłówków — za ich pomocą wyznaczane są nagłówki protokołu.

Definicja nagłówka określa:

  • opis formatów pakietów i nazw pól nagłówka
  • dozwolone pola stałe i zmienne

na przykład

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

Parsery — ich zadaniem jest analizowanie nagłówków.

Poniższy przykład parsera określi przejście stanu końcowego maszyny z jednego stanu początkowego do jednego z dwóch stanów końcowych:

Język programowania 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;
        }
    }…
}

Tabele — zawierają stany maszyny łączące klucze użytkownika z akcjami. Działalność — opis sposobu manipulacji z przesyłką.

Tabele zawierają stany (zdefiniowane na poziomie zarządzania) przekazywania pakietów, opisują jednostkę Match-Action

Pakiety są dopasowywane przez:

  • Dokładne dopasowanie
  • Najdłuższe dopasowanie prefiksu (LPM)
  • Potrójne dopasowanie (maskowanie)

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

Wszystkie możliwe działania należy wcześniej zdefiniować w tabelach.

Akcje składają się z kodu i danych. Dane pochodzą z poziomu zarządzania (np. adresy IP/numery portów). Pewne, wolne od pętli operacje podstawowe można określić bezpośrednio w akcji, ale liczba instrukcji musi być przewidywalna. Dlatego akcje nie mogą zawierać żadnych pętli ani instrukcji warunkowych.

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

Moduły Match-Action — akcje umożliwiające utworzenie klucza wyszukiwania, wyszukiwanie w tabeli, wykonywanie akcji.

Typowy przykład modułu pokazano na rysunku:

Język programowania P4

Kontrola przepływu — wskazuje kolejność, w jakiej używane są moduły Match-Action. Jest to niezbędny program, który definiuje logikę wysokiego poziomu i sekwencję Match-Action. Przepływ sterowania łączy wszystkie obiekty poprzez określenie poziomu sterowania.

Obiekty zewnętrzne to specyficzne obiekty o jasno określonej architekturze i interfejsach API. Na przykład obliczanie sumy kontrolnej, rejestry, liczniki, liczniki itp.

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
}

Metadane — struktury danych powiązane z każdym pakietem.

Istnieją 2 typy metadanych:

  Niestandardowe metadane (pusta struktura dla wszystkich pakietów)
    Możesz tu umieścić co chcesz
    Dostępne w całym rurociągu
    wygodny w użyciu do własnych celów, na przykład do przechowywania skrótu pakietu

  Metadane wewnętrzne – dostarczane przez architekturę
    Port wejściowy i port wyjściowy są tutaj zdefiniowane
    Znacznik czasu, kiedy pakiet był w kolejce, głębokość kolejki
    Mieszanie multiemisji/kolejka multiemisji
    Priorytet pakietu, znaczenie pakietu
    Specyfikacja portu wyjściowego (np. kolejka wyjściowa)

Kompilator P4

Kompilator P4 (P4C) generuje:

  1. Środowisko wykonawcze płaszczyzny danych
  2. API do zarządzania stanem maszyny w płaszczyźnie danych

Język programowania P4

Przykład przełącznika programowego w języku P4

Kody źródłowe można pobrać z repozytorium.

p4lang/p4c-bm: tworzy konfigurację JSON dla bmv2
p4lang/bmv2: przełącznik oprogramowania obsługujący konfiguracje JSON w wersji bmv2

Rysunek przedstawia schemat kompilacji projektu:

Język programowania P4

Manipulacje tabelami, odczytem rejestrów, licznikami:

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


Kod źródłowy zawiera program simple_switch_CLI umożliwiający wygodne korzystanie z API przełączania oprogramowania.

Możesz pobrać ten i inne przykłady z repozytorium.

Język programowania P4

PS Na początku tego lata Intel podpisał umowę nabycia Barefoot Networks, aby szybko zaspokoić potrzeby użytkowników Hyperscale Cloud. Jak powiedział Navin Shenoy (wiceprezes wykonawczy i dyrektor generalny Data Center Group w Intel Corporation), umożliwi to firmie Intel zapewnienie większych obciążeń i więcej możliwości klientom korzystającym z centrów danych.

Moim osobistym zdaniem nie powinniśmy zapominać, że Intel jest liderem w produkcji układów FPGA i ma doskonałe środowisko Quartus. Oznacza to, że możemy się spodziewać, że wraz z pojawieniem się Intela Barefoot nie tylko poszerzy swoją linię produktów, ale także Quartus i P4 Studio otrzymają poważne aktualizacje i dodatki do linii Toffino i Toffino 2.

Oficjalny członek społeczności P4 - firma Grupa czynników.

Źródło: www.habr.com

Dodaj komentarz