Resumen

  • Presto ofrece una capa de interposición POSIX con la que programas conocidos pueden ejecutarse sin recompilarse y comunicarse con extremos TCP basados en Linux o TAS.
  • Esa continuidad termina antes de la tarjeta y del cable: el repositorio exige gestionar la validación iCRC en ConnectX y que toda pila par añada relleno Ethernet suficiente. La aplicación permanece igual; el entorno que la hace funcionar, no necesariamente.

Una aplicación que arranca sin cambios es una prueba importante, pero incompleta. Dice algo sobre la frontera entre el programa y los sockets. No dice todavía si un servidor corriente, conectado con su configuración corriente, puede situarse al otro extremo del enlace.

El artículo invitado del blog de APNIC presenta precisamente la ventaja visible: memcached, nginx y FlexKVS pueden usar Presto sin modificar su código, mientras el prototipo intercambia TCP con Linux y TAS. La página atribuye el texto a Rajath Shashidhara e incluye el aviso habitual de que las opiniones son de los autores. Publicarlo no convierte los resultados en una posición institucional de APNIC.

El repositorio permite ubicar la promesa. En el commit a6c1ceec447c27a7b77035cc7d4a1868a4f7fcc1, la biblioteca libpresto_interpose.so emula sockets POSIX y se carga con LD_PRELOAD. Ahí está el camino para aplicaciones intactas. El proyecto también incluye una interfaz de copia cero de nivel inferior que sí requiere adaptación. Por tanto, “sin cambios” describe el camino interpuesto, no todas las formas de utilizar Presto.

El mismo commit delimita el banco de pruebas: conmutador Intel Tofino 2, adaptadores ConnectX, versiones concretas del SDK y del soporte de placa, y una versión mínima de MLNX OFED. Son coordenadas útiles para repetir la experiencia. También impiden tratar un resultado de esa combinación como garantía para una combinación sin probar.

La condición más reveladora figura en el README de despliegue. El plano de datos no genera el iCRC de RDMA. Para ConnectX, las instrucciones piden desactivar la validación; en ConnectX-6 y ConnectX-7, remiten a NVIDIA para obtener el procedimiento equivalente. Además, toda pila TCP que actúe como par debe añadir al final de cada segmento el relleno Ethernet necesario para alojar ese iCRC. El repositorio aporta una variante de TAS preparada para hacerlo.

El paper de Presto, publicado en SIGCOMM 2026, sitúa esta salvedad bajo “restricciones del banco de pruebas”. El motor de checksum de Tofino 2 empleado por el prototipo no cubre las sumas de payload y el iCRC; los autores prevén unidades de checksum en una versión de producción. La cautela es doble: no hay que ocultar la condición actual, ni proyectarla sobre toda implementación futura.

Tampoco debe presentarse como una norma de TCP. La RFC 9293 especifica el flujo fiable y ordenado de bytes, el procesamiento de segmentos y el checksum de TCP. Reservar espacio de trama para un iCRC de RDMA y cambiar su validación en una NIC son decisiones del camino de DMA y del prototipo. Un par puede cumplir TCP y, aun así, no producir de fábrica la forma de trama que este montaje espera.

Por eso conviene dividir la palabra interoperabilidad. Hay compatibilidad de aplicación, de API, semántica TCP, construcción de paquetes, estado de dispositivo y recuperación. Ejecutar el mismo binario cubre las dos primeras. Una captura de tráfico y una lectura de registros cubren otras. Ninguna evidencia debe suplir a la que falta.

El script disable-icrc.sh ofrece un buen punto de partida para el registro. Advierte que presupone ConnectX-5, lee cuatro campos de registro, escribe ceros y vuelve a leer. En otro modelo, pide restaurar los valores y modificar el procedimiento. El operador debería guardar modelo, firmware, valores previos y posteriores, y el método comprobado de reversión.

Un recibo de aceptación podría unir esos datos con el hash del binario, el commit de Presto, las versiones del programa P4 y del plano de control, el SDK, el driver y el MTU. Una captura mostraría el final de trama. Los resultados distinguirían un par TAS modificado de un Linux ordinario y de cualquier Linux preparado expresamente. Así, “interoperó” tendría sujeto, versión y condición.

El repositorio también ofrece switchconf_reset, que borra tablas de flujo, hosts conectados, contextos de aplicación y estado de ejecución, conservando la configuración de puertos. Es útil para reponer el lado del conmutador, pero no prueba que los registros de la NIC ni el comportamiento del par hayan vuelto atrás. La reversión solo termina cuando el tráfico TCP normal vuelve a pasar tras restaurar todos los cambios.

La contribución de Presto no se reduce por exigir ese registro. Lograr que un programa conserve su interfaz mientras el transporte se ejecuta en un pipeline programable es una separación potente. Precisamente por eso importa describir con honestidad dónde se han concentrado las modificaciones: fuera de la aplicación, en un perímetro de operación más especializado.

Fuentes