lenguaje de programación p4

lenguaje de programación p4
P4 es un lenguaje de programación diseñado para programar reglas de enrutamiento de paquetes. A diferencia de un lenguaje de propósito general como C o Python, P4 es un lenguaje de dominio específico con varios diseños optimizados para el enrutamiento de red.

P4 es un lenguaje de código abierto bajo licencia y mantenido por una organización sin fines de lucro llamada P4 Language Consortium. También cuenta con el apoyo de la Open Networking Foundation (ONF) y la Linux Foundation (LF), dos de las organizaciones coordinadoras más grandes para proyectos de redes de código abierto.
El lenguaje se acuñó originalmente en 2013 y se describe en un artículo SIGCOMM CCR de 2014 titulado "Programación de procesador de enrutamiento de paquetes independiente de protocolo".

Desde sus inicios, P4 ha crecido y evolucionado exponencialmente, convirtiéndose rápidamente en un estándar para describir la transmisión de paquetes mediante dispositivos de red, incluidos adaptadores de red, conmutadores y enrutadores.

"SDN ha transformado la industria de las redes y P4 lleva SDN al siguiente nivel al brindar programabilidad al enrutamiento", dijo Guru Parulkar, director ejecutivo de Open Networking Foundation.

El lenguaje P4 fue creado originalmente por un grupo de ingenieros e investigadores de Google, Intel, Microsoft Research, Barefoot, Princeton y Stanford. El objetivo era simple: crear un lenguaje fácil de usar que un desarrollador de software pudiera aprender en un día y utilizar para describir con precisión cómo se envían los paquetes a través de las redes.

Desde el principio, P4 fue diseñado para ser independiente del objetivo (es decir, un programa escrito en P4 podría compilarse sin cambios para ejecutarse en una variedad de objetivos como ASIC, FPGA, CPU, NPU y GPU).

El lenguaje también es independiente del protocolo (es decir, un programa P4 puede describir protocolos estándar existentes o usarse para especificar nuevos modos de direccionamiento personalizados).

En la industria, P4 se utiliza para la programación de dispositivos. Quizás en el futuro los estándares Internet-RFC e IEEE también incluyan la especificación P4.

P4 se puede utilizar tanto para dispositivos de función fija como programables. Por ejemplo, se utiliza para registrar con precisión el comportamiento de la canalización del conmutador en las API de la interfaz de abstracción del conmutador (SAI) utilizadas por el sistema operativo del conmutador SONiC de código abierto. P4 también se utiliza en el proyecto ONF Stratum para describir el comportamiento de conmutación en una variedad de dispositivos fijos y programables.

Por primera vez, describir el comportamiento del conmutador y los adaptadores de red le permite crear un modelo ejecutable preciso de toda la red antes de la implementación. Los grandes proveedores de nube pueden probar y depurar la red completamente utilizando software, lo que reduce significativamente el tiempo y el costo de las pruebas de interoperabilidad en el laboratorio sin requerir hardware costoso.

Al utilizar P4, los proveedores de equipos de red pueden esperar un comportamiento de enrutamiento subyacente común en todos los productos, lo que permite la reutilización de la infraestructura de prueba, simplifica el desarrollo de software de gestión y, en última instancia, garantiza la interoperabilidad.

Por supuesto, P4 se puede utilizar para escribir programas que describan formas de enrutamiento completamente nuevas. Por ejemplo, P4 se utiliza ampliamente para telemetría y mediciones en centros de datos, redes empresariales y de proveedores de servicios.

La comunidad investigadora también ha dado un paso al frente. Varios grupos de investigación de redes académicas líderes han publicado nuevas e interesantes aplicaciones basadas en programas P4, incluido el equilibrio de carga, protocolos de consenso y almacenamiento en caché de valores clave. Se está creando un nuevo paradigma de programación, la innovación está pasando del hardware al software, lo que permite que surjan muchas ideas inesperadas, nuevas e ingeniosas.

La comunidad de desarrolladores ha realizado importantes contribuciones al desarrollo de código, incluidos compiladores, canalizaciones, modelos de comportamiento, API, marcos de prueba, aplicaciones y más. Empresas como Alibaba, AT&T, Barefoot, Cisco, Fox Networks, Google, Intel, IXIA, Juniper Networks, Mellanox, Microsoft, Netcope, Netronome, VMware, Xilinx y ZTE cuentan con desarrolladores dedicados; de universidades como BUPT, Cornell, Harvard, MIT, NCTU, Princeton, Stanford, Technion, Tsinghua, UMass y USI; y proyectos de código abierto que incluyen CORD, FD.io, OpenDaylight, ONOS, OvS, SAI y Stratum resaltan el hecho de que P4 es un proyecto comunitario independiente.

Generación típica de controladores para el lenguaje P4:

lenguaje de programación p4

Perspectivas de aplicación

lenguaje de programación p4
Dado que el lenguaje está destinado a enrutar aplicaciones, la lista de requisitos y opciones de diseño es diferente en comparación con los lenguajes de programación de propósito general. Las principales características del idioma son:

  1. Independencia de la implementación de objetivos;
  2. Independencia de los protocolos utilizados;
  3. Reconfigurabilidad de campo.

Independencia de la implementación del objetivo

Los programas P4 están diseñados para ser independientes de la implementación, lo que significa que pueden compilarse para muchos tipos diferentes de motores de ejecución, como procesadores de propósito general, FPGA, sistemas en chips, procesadores de red y ASIC. Estos diferentes tipos de máquinas se conocen como destinos P4, y cada destino requiere un compilador para convertir el código fuente P4 en un modelo de conmutador de destino. El compilador puede integrarse en el dispositivo de destino, en software externo o incluso en un servicio en la nube. Debido a que muchos de los objetivos originales de los programas P4 eran para una simple conmutación de paquetes, es muy común escuchar el término "conmutador P4", aunque "objetivo P4" es más preciso.

Independencia de los protocolos utilizados

P4 es independiente del protocolo. Esto significa que el lenguaje no tiene soporte nativo para protocolos comunes como IP, Ethernet, TCP, VxLAN o MPLS. En cambio, el programador P4 describe los formatos de encabezado y nombres de campo de los protocolos requeridos en el programa, que a su vez son interpretados y procesados ​​por el programa compilado y el dispositivo de destino.

Reconfigurabilidad de campo

La independencia del protocolo y el modelo de lenguaje abstracto permiten la reconfigurabilidad: los objetivos P4 deberían poder cambiar el procesamiento de paquetes después de implementar el sistema. Esta capacidad se ha asociado tradicionalmente con el enrutamiento a través de procesadores de propósito general o procesadores de red en lugar de circuitos integrados de función fija.

Aunque no hay nada en el lenguaje que impida la optimización del rendimiento de un conjunto particular de protocolos, estas optimizaciones son invisibles para el autor del lenguaje y, en última instancia, pueden reducir la flexibilidad del sistema, los objetivos y su reconfigurabilidad.

Estas características del lenguaje fueron establecidas inicialmente por sus creadores centrándose en su uso generalizado en la infraestructura de red.

El idioma ya se utiliza en muchas empresas:

1) Centros de datos de hiperescala;

La empresa china Tencent es la mayor sociedad de inversión del mundo y una de las mayores firmas de capital riesgo. Las filiales de Tencent, tanto en China como en otros países del mundo, se especializan en diversas áreas de negocios de alta tecnología, incluidos diversos servicios de Internet, desarrollos en el campo de la inteligencia artificial y el entretenimiento electrónico.

P4 y el enrutamiento programable son tecnologías avanzadas que se utilizan en la arquitectura de red de la empresa.

Como uno de los creadores, Google se enorgullece de observar la rápida adopción de P4 en la industria de redes y en el diseño arquitectónico de centros de datos en particular.

2) Sociedades comerciales;

Goldman Sachs aprovecha el trabajo con la comunidad de código abierto y el desarrollo de estándares y soluciones comunes para innovar la infraestructura de red y brindar mejores soluciones a los clientes.

3) Producción;

Toda la industria de las redes se beneficiaría de un lenguaje como P4 que defina de manera única el comportamiento de reenvío. Cisco también apuesta por trasladar sus líneas de productos al uso de este lenguaje.

Juniper Networks ha incluido P4 y P4 Runtime en varios productos y proporciona acceso programático al procesador integrado Juniper y su código de software.

Ruijie Networks es un firme defensor de P4 y los beneficios que aporta a las redes. Con P4, la empresa puede crear y ofrecer las mejores soluciones a una amplia gama de clientes.

4) Proveedores de telecomunicaciones;

AT&T fue uno de los primeros en adoptar P4, uno de los primeros en utilizar P4 para definir el comportamiento que quería ver en sus redes y en utilizar dispositivos de reenvío programables P4 en su red.

En Deutsche Telekom, el lenguaje se utiliza para crear prototipos de funciones clave de red como parte del programa Access 4.0.

5) Industria de semiconductores;

El lenguaje permitió a Barefoot implementar un nuevo paradigma para entregar capacidades de software al plano de enrutamiento de la red.

Xilinx fue uno de los fundadores de P4.org y participó activamente en el desarrollo del lenguaje P4 y lo implementó en plataformas programables basadas en FPGA para hardware SmartNIC y NFV, lanzando uno de los primeros compiladores P416 como parte del diseño de SDNet.

6) Software.

VMware cree que P4 crea una tremenda energía, innovación y comunidad que está impulsando una transformación significativa y necesaria en la red. VMware ha sido parte de este movimiento industrial desde el principio, a medida que una nueva ola de innovación está impulsada por enfoques basados ​​en software que amplían las capacidades de la infraestructura y las implementan en los productos más recientes.

Por lo tanto, P4 es un lenguaje de programación independiente del objetivo y del protocolo que utiliza la industria y el mundo académico para definir de forma única el comportamiento de enrutamiento de paquetes como un programa, que a su vez se puede compilar para múltiples objetivos. Hoy en día, los objetivos incluyen conmutadores de hardware y software, conmutadores de hipervisor, NPU, GPU, FPGA, SmartNIC y ASIC.

Las características principales del lenguaje amplían significativamente el alcance de su aplicación y garantizan su rápida implementación en arquitecturas de red.

Por dónde empezar

P4 es un proyecto abierto, toda la información relevante está en el sitio web P4.org

Enlace al repositorio https://github.com/p4lang, donde puede obtener códigos fuente de ejemplo y tutoriales.

Complemento para Eclipse con soporte P4, pero podemos recomendar Estudio P4 de Descalzo.

lenguaje de programación p4

Veamos las principales abstracciones del kernel:

Definición de encabezados — con su ayuda se determinan los encabezados de los protocolos.

La definición del encabezado especifica:

  • descripción de formatos de paquetes y nombres de campos de encabezado
  • campos permitidos fijos y variables

Por ejemplo

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

Analizadores — su tarea es analizar los titulares.

El siguiente ejemplo de analizador determinará la transición del estado final de la máquina desde un estado inicial a uno de dos estados finales:

lenguaje de programación 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;
        }
    }…
}

Mesas — contienen estados de máquina que vinculan claves de usuario con acciones. Actividad — una descripción de cómo debe manipularse el paquete.

Las tablas contienen estados (definidos a nivel de gestión) para el reenvío de paquetes, describen la unidad Match-Action

Los paquetes coinciden con:

  • Coincidencia exacta
  • Coincidencia de prefijo más largo (LPM)
  • Triple coincidencia (enmascaramiento)

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

Todas las acciones posibles deben definirse previamente en tablas.

Las acciones constan de código y datos. Los datos provienen del nivel de gestión (por ejemplo, direcciones IP/números de puerto). Ciertas primitivas sin bucles se pueden especificar directamente en la acción, pero el número de instrucciones debe ser predecible. Por lo tanto, las acciones no pueden contener bucles ni declaraciones condicionales.

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

Módulos de acción de partido — acciones para crear una clave de búsqueda, buscar en una tabla, realizar acciones.

En la figura se muestra un ejemplo típico de un módulo:

lenguaje de programación p4

Flujo de control — indica el orden en el que se utilizan los módulos Match-Action. Este es un programa imperativo que define la lógica de alto nivel y la secuencia Match-Action. El flujo de control vincula todos los objetos definiendo el nivel de control.

Objetos externos Son objetos específicos con una arquitectura e interfaces API claramente definidas. Por ejemplo, cálculo de suma de comprobación, registros, contadores, contadores, 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
}

Metadatos — estructuras de datos asociadas con cada paquete.

Hay 2 tipos de metadatos:

  Metadatos personalizados (estructura vacía para todos los paquetes)
    Puedes poner lo que quieras aquí.
    Disponible en todo el oleoducto
    conveniente para usar para sus propios fines, por ejemplo, para almacenar un hash de paquete

  Metadatos internos: proporcionados por la arquitectura.
    El puerto de entrada y el puerto de salida se definen aquí
    Marca de tiempo cuando el paquete estaba en cola, profundidad de la cola
    hash de multidifusión/cola de multidifusión
    Prioridad del paquete, importancia del paquete
    Especificación del puerto de salida (por ejemplo, cola de salida)

compilador p4

El compilador P4 (P4C) genera:

  1. Tiempo de ejecución del plano de datos
  2. API para gestionar el estado de la máquina en el plano de datos

lenguaje de programación p4

Ejemplo de un cambio de software en lenguaje P4

Los códigos fuente se pueden descargar desde el repositorio.

p4lang/p4c-bm: crea la configuración JSON para bmv2
p4lang/bmv2: un conmutador de software que comprende las configuraciones JSON de la versión bmv2

La figura muestra el diagrama de compilación del proyecto:

lenguaje de programación p4

Manipulaciones con tablas, registros de lectura, contadores:

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


El código fuente contiene el programa simple_switch_CLI para un uso conveniente de la API de cambio de software.

Puede descargar este y otros ejemplos del repositorio.

lenguaje de programación p4

PS A principios de este verano, Intel firmó un acuerdo para adquirir Barefoot Networks en un esfuerzo por satisfacer rápidamente las necesidades de los usuarios de Hyperscale Cloud. Como dijo Navin Shenoy (vicepresidente ejecutivo y director general del grupo de centros de datos de Intel Corporation), esto permitirá a Intel ofrecer mayores cargas de trabajo y más oportunidades para los clientes de centros de datos.

En mi opinión personal, no debemos olvidar que Intel es líder en la producción de chips FPGA y cuenta con un excelente entorno Quartus. Esto significa que podemos esperar que con la llegada de Intel, Barefoot no solo expanda su línea de productos, sino que también Quartus y P4 Studio reciban importantes actualizaciones y adiciones a la línea Toffino y Toffino 2.

Miembro oficial de la comunidad P4 - empresa grupo de factores.

Fuente: habr.com

Añadir un comentario