Langage de programmation P4

Langage de programmation P4
P4 est un langage de programmation conçu pour programmer des règles de routage de paquets. Contrairement à un langage généraliste tel que C ou Python, P4 est un langage spécifique à un domaine avec un certain nombre de conceptions optimisées pour le routage réseau.

P4 est un langage open source sous licence et maintenu par une organisation à but non lucratif appelée P4 Language Consortium. Il est également soutenu par l'Open Networking Foundation (ONF) et la Linux Foundation (LF), deux des plus grandes organisations faîtières de projets de réseau open source.
Le langage a été inventé à l'origine en 2013 et décrit dans un article SIGCOMM CCR de 2014 intitulé «Protocol Independent, Packet Routing Processor Programming».

Depuis sa création, P4 a connu une croissance et une évolution exponentielle, devenant rapidement une norme pour décrire la transmission de paquets par les périphériques réseau, notamment les adaptateurs réseau, les commutateurs et les routeurs.

« Le SDN a transformé le secteur des réseaux, et P4 fait passer le SDN à un niveau supérieur en apportant la programmabilité au routage », a déclaré Guru Parulkar, directeur exécutif de l'Open Networking Foundation.

Le langage P4 a été créé à l'origine par un groupe d'ingénieurs et de chercheurs de Google, Intel, Microsoft Research, Barefoot, Princeton et Stanford. L'objectif était simple : créer un langage facile à utiliser qu'un développeur de logiciels pourrait apprendre en une journée et utiliser pour décrire avec précision la manière dont les paquets sont envoyés sur les réseaux.

Dès le début, P4 a été conçu pour être indépendant de la cible (c'est-à-dire qu'un programme écrit en P4 pouvait être compilé sans modification pour fonctionner sur diverses cibles telles que les ASIC, les FPGA, les CPU, les NPU et les GPU).

Le langage est également indépendant du protocole (c'est-à-dire qu'un programme P4 peut décrire des protocoles standard existants ou être utilisé pour spécifier de nouveaux modes d'adressage personnalisés).

Dans l'industrie, P4 est utilisé pour la programmation des appareils. Peut-être qu'à l'avenir, les normes Internet-RFC et IEEE incluront également la spécification P4.

P4 peut être utilisé pour les appareils à fonction programmable et fixe. Par exemple, il est utilisé pour enregistrer avec précision le comportement du pipeline de commutation dans les API Switch Abstraction Interface (SAI) utilisées par le système d'exploitation du commutateur open source SONiC. P4 est également utilisé dans le projet ONF Stratum pour décrire le comportement de commutation sur une variété d'appareils fixes et programmables.

Pour la première fois, décrire le comportement du commutateur et des adaptateurs réseau vous permet de créer un modèle exécutable précis de l'ensemble du réseau avant le déploiement. Les grands fournisseurs de cloud peuvent tester et déboguer le réseau entièrement à l'aide d'un logiciel, réduisant ainsi considérablement le temps et le coût des tests d'interopérabilité en laboratoire sans nécessiter de matériel coûteux.

En utilisant P4, les fournisseurs d'équipements réseau peuvent s'attendre à un comportement de routage sous-jacent commun à tous les produits, permettant la réutilisation de l'infrastructure de test, simplifiant le développement de logiciels de gestion et, à terme, garantissant l'interopérabilité.

Bien entendu, P4 peut être utilisé pour écrire des programmes décrivant des méthodes de routage complètement nouvelles. Par exemple, P4 est largement utilisé pour la télémétrie et les mesures dans les centres de données, les réseaux d'entreprises et de fournisseurs de services.

La communauté des chercheurs s’est également mobilisée. Plusieurs groupes de recherche universitaires de premier plan sur les réseaux ont publié de nouvelles applications passionnantes basées sur des programmes P4, notamment l'équilibrage de charge, les protocoles de consensus et la mise en cache des valeurs clés. Un nouveau paradigme de programmation est en train de se créer, l'innovation passe du matériel au logiciel, permettant l'émergence de nombreuses idées inattendues, nouvelles et ingénieuses.

La communauté des développeurs a apporté d'importantes contributions au développement de code, notamment des compilateurs, des pipelines, des modèles comportementaux, des API, des frameworks de test, des applications, etc. Des entreprises telles que Alibaba, AT&T, Barefoot, Cisco, Fox Networks, Google, Intel, IXIA, Juniper Networks, Mellanox, Microsoft, Netcope, Netronome, VMware, Xilinx et ZTE ont des développeurs dédiés ; d'universités telles que BUPT, Cornell, Harvard, MIT, NCTU, Princeton, Stanford, Technion, Tsinghua, UMass et USI ; et des projets open source tels que CORD, FD.io, OpenDaylight, ONOS, OvS, SAI et Stratum soulignent le fait que P4 est un projet communautaire indépendant.

Génération typique de contrôleurs pour le langage P4 :

Langage de programmation P4

Perspectives d'application

Langage de programmation P4
Étant donné que le langage est destiné aux applications de routage, la liste des exigences et des options de conception est différente de celle des langages de programmation à usage général. Les principales caractéristiques du langage sont :

  1. Indépendance par rapport à la mise en œuvre des objectifs ;
  2. Indépendance du ou des protocoles utilisés ;
  3. Reconfigurabilité sur le terrain.

Indépendance par rapport à la mise en œuvre des objectifs

Les programmes P4 sont conçus pour être indépendants de l'implémentation, ce qui signifie qu'ils peuvent être compilés pour de nombreux types différents de moteurs d'exécution, tels que les processeurs à usage général, les FPGA, les systèmes sur puces, les processeurs réseau et les ASIC. Ces différents types de machines sont appelés cibles P4, et chaque cible nécessite un compilateur pour convertir le code source P4 en un modèle de commutateur cible. Le compilateur peut être intégré à l'appareil cible, à un logiciel externe ou même à un service cloud. Étant donné que la plupart des cibles originales des programmes P4 étaient destinées à une simple commutation de paquets, il est très courant d'entendre le terme « commutateur P4 », même si « cible P4 » est plus précis.

Indépendance du ou des protocoles utilisés

P4 est indépendant du protocole. Cela signifie que le langage ne prend pas en charge nativement les protocoles courants tels que IP, Ethernet, TCP, VxLAN ou MPLS. Au lieu de cela, le programmeur P4 décrit les formats d'en-tête et les noms de champs des protocoles requis dans le programme, qui à leur tour sont interprétés et traités par le programme compilé et le périphérique cible.

Reconfigurabilité sur le terrain

L'indépendance du protocole et le modèle de langage abstrait permettent une reconfigurabilité : les cibles P4 devraient pouvoir modifier le traitement des paquets une fois le système déployé. Cette capacité est traditionnellement associée au routage via des processeurs à usage général ou des processeurs réseau plutôt que des circuits intégrés à fonction fixe.

Bien qu'il n'y ait rien dans le langage qui empêcherait l'optimisation des performances d'un ensemble particulier de protocoles, ces optimisations sont invisibles pour l'auteur du langage et peuvent finalement réduire la flexibilité du système et des objectifs ainsi que leur reconfigurabilité.

Ces caractéristiques du langage ont été initialement définies par ses créateurs en mettant l'accent sur son utilisation généralisée dans les infrastructures de réseau.

Le langage est déjà utilisé dans de nombreuses entreprises :

1) Centres de données hyperscale ;

La société chinoise Tencent est la plus grande société d’investissement au monde et l’une des plus grandes sociétés de capital-risque. Les filiales de Tencent, tant en Chine que dans d'autres pays du monde, se spécialisent dans divers domaines de haute technologie, notamment divers services Internet, les développements dans le domaine de l'intelligence artificielle et du divertissement électronique.

Le P4 et le routage programmable sont des technologies avancées utilisées dans l'architecture réseau de l'entreprise.

En tant que l'un des initiateurs, Google est fier de constater l'adoption rapide du P4 dans le secteur des réseaux et dans la conception architecturale des centres de données en particulier.

2) Sociétés commerciales ;

Goldman Sachs profite de sa collaboration avec la communauté open source et du développement de normes et de solutions communes pour innover dans l'infrastructure réseau et fournir de meilleures solutions aux clients.

3) Production ;

L’ensemble du secteur des réseaux bénéficierait d’un langage tel que P4 qui définit de manière unique le comportement de transfert. Cisco croit également au transfert de ses gammes de produits pour utiliser ce langage.

Juniper Networks a inclus P4 et P4 Runtime dans un certain nombre de produits et fournit un accès programmatique au processeur intégré Juniper et à son code logiciel.

Ruijie Networks est un fervent partisan du P4 et des avantages qu'il apporte aux réseaux. Avec P4, l'entreprise peut créer et fournir les meilleures solutions de sa catégorie à un large éventail de clients.

4) Fournisseurs de télécommunications ;

AT&T a été l'un des premiers à adopter P4, l'un des premiers à utiliser P4 pour définir le comportement qu'il souhaitait voir dans ses réseaux et à utiliser des dispositifs de transfert programmables P4 sur son réseau.

Chez Deutsche Telekom, le langage est utilisé pour prototyper les fonctions réseau clés dans le cadre du programme Access 4.0.

5) Industrie des semi-conducteurs ;

Le langage a permis à Barefoot de mettre en œuvre un nouveau paradigme pour fournir des fonctionnalités logicielles au plan de routage du réseau.

Xilinx a été l'un des fondateurs de P4.org et a été activement impliqué dans le développement du langage P4 et l'a implémenté dans des plates-formes programmables basées sur FPGA pour le matériel SmartNIC et NFV, en lançant l'un des premiers compilateurs P416 dans le cadre de la conception SDNet.

6) Logiciel.

VMware estime que P4 crée une énergie, une innovation et une communauté formidables qui conduisent à une transformation significative et nécessaire du réseau. VMware fait partie de ce mouvement industriel depuis le début, alors qu'une nouvelle vague d'innovation est motivée par des approches logicielles qui étendent les capacités de l'infrastructure et les implémentent dans les derniers produits.

Ainsi, P4 est un langage de programmation indépendant de la cible et du protocole utilisé par l'industrie et le monde universitaire pour définir de manière unique le comportement de routage des paquets en tant que programme, qui à son tour peut être compilé pour plusieurs cibles. Aujourd'hui, les cibles incluent les commutateurs matériels et logiciels, les commutateurs hyperviseur, les NPU, les GPU, les FPGA, les SmartNIC et les ASIC.

Les principales fonctionnalités du langage élargissent considérablement le champ de son application et assurent sa mise en œuvre rapide dans les architectures réseau.

Mise en route

P4 est un projet ouvert, toutes les informations pertinentes sont sur le site P4.org

Lien vers le référentiel https://github.com/p4lang, où vous pouvez obtenir des exemples de code source et des didacticiels.

Plugin pour Eclipse avec support P4, mais nous pouvons recommander Studio P4 de Pieds nus.

Langage de programmation P4

Regardons les principales abstractions du noyau :

Définir les en-têtes — avec leur aide, les en-têtes de protocole sont déterminés.

La définition d'en-tête spécifie :

  • description des formats de paquets et des noms de champs d'en-tête
  • champs autorisés fixes et variables

Par exemple

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

Analyseurs — leur tâche est d'analyser les gros titres.

L'exemple d'analyseur suivant déterminera la transition de l'état final de la machine d'un état initial à l'un des deux états finaux :

Langage de programmation 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;
        }
    }…
}

Tableaux — contient des états de machine liant les clés utilisateur aux actions. Activité — une description de la façon dont le paquet doit être manipulé.

Les tableaux contiennent des états (définis au niveau de gestion) pour le transfert de paquets, décrivent l'unité Match-Action

Les paquets correspondent à :

  • Correspondance exacte
  • Correspondance de préfixe la plus longue (LPM)
  • Triple correspondance (masquage)

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

Toutes les actions possibles doivent être définies au préalable dans des tableaux.

Les actions sont constituées de code et de données. Les données proviennent du niveau de gestion (par exemple adresses IP/numéros de port). Certaines primitives sans boucle peuvent être spécifiées directement dans l'action, mais le nombre d'instructions doit être prévisible. Par conséquent, les actions ne peuvent contenir aucune boucle ou instruction conditionnelle.

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

Modules Match-Action — actions pour créer une clé de recherche, rechercher dans un tableau, effectuer des actions.

Un exemple typique de module est présenté dans la figure :

Langage de programmation P4

Flux de contrôle — indique l'ordre dans lequel les modules Match-Action sont utilisés. Il s'agit d'un programme impératif qui définit la logique de haut niveau et la séquence Match-Action. Le flux de contrôle relie tous les objets en définissant le niveau de contrôle.

Objets externes sont des objets spécifiques avec une architecture et des interfaces API clairement définies. Par exemple, calcul de la somme de contrôle, registres, compteurs, compteurs, etc.

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
}

Métadonnées — les structures de données associées à chaque package.

Il existe 2 types de métadonnées :

  Métadonnées personnalisées (structure vide pour tous les packages)
    Tu peux mettre ce que tu veux ici
    Disponible tout au long du pipeline
    pratique à utiliser à vos propres fins, par exemple pour stocker un hachage de package

  Métadonnées internes - fournies par l'architecture
    Le port d'entrée et le port de sortie sont définis ici
    Horodatage du moment où le paquet a été mis en file d'attente, profondeur de la file d'attente
    hachage de multidiffusion/file d'attente de multidiffusion
    Priorité du package, importance du package
    Spécification du port de sortie (par exemple, file d'attente de sortie)

Compilateur P4

Le compilateur P4 (P4C) génère :

  1. Exécution du plan de données
  2. API de gestion de l'état de la machine dans le plan de données

Langage de programmation P4

Exemple de switch logiciel en langage P4

Les codes sources peuvent être téléchargés à partir du référentiel.

p4lang/p4c-bm : crée une configuration JSON pour bmv2
p4lang/bmv2 : un commutateur logiciel qui comprend les configurations JSON de la version bmv2

La figure montre le schéma de compilation du projet :

Langage de programmation P4

Manipulations avec tables, registres de lecture, compteurs :

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


Le code source contient le programme simple_switch_CLI pour une utilisation pratique de l'API du commutateur logiciel.

Vous pouvez télécharger ceci et d'autres exemples à partir du référentiel.

Langage de programmation P4

PS Au début de l'été, Intel a signé un accord pour acquérir Barefoot Networks dans le but de répondre rapidement aux besoins des utilisateurs d'Hyperscale Cloud. Comme l'a déclaré Navin Shenoy (vice-président exécutif et directeur général du groupe Data Center chez Intel Corporation), cela permettra à Intel de fournir des charges de travail plus importantes et davantage d'opportunités aux clients des centres de données.

À mon avis, il ne faut pas oublier qu'Intel est un leader dans la production de puces FPGA et qu'il dispose d'un excellent environnement Quartus. Cela signifie que nous pouvons nous attendre à ce qu'avec l'arrivée d'Intel, Barefoot élargisse non seulement sa gamme de produits, mais que Quartus et P4 Studio reçoivent également des mises à jour et des ajouts sérieux à la gamme Toffino et Toffino 2.

Membre officiel de la communauté P4 - entreprise Groupe de facteurs.

Source: habr.com

Ajouter un commentaire