Compartir a través de


Descriptores y extensiones de paquetes

En NetAdapterCx, los descriptores de paquetes son estructuras pequeñas, compactas y extensibles en tiempo de ejecución que describen un paquete de red. Cada paquete requiere lo siguiente:

  • Un descriptor principal
  • Uno o varios descriptores de fragmento
  • Cero o más extensiones de paquete

El descriptor principal del paquete es la estructura NET_PACKET . Contiene solo los metadatos más básicos aplicables a todos los paquetes, como el diseño de marco de un paquete determinado y el índice al primer descriptor de fragmento del paquete.

Cada paquete también debe tener uno o varios descriptores de fragmentos, o NET_FRAGMENT estructuras, que describen la ubicación dentro de la memoria del sistema donde residen los datos del paquete.

Las extensiones son opcionales y contienen metadatos por paquete o por fragmento para características específicas del escenario. Por ejemplo, las extensiones de paquetes pueden contener información de descarga para la suma de comprobación, la descarga de envío grande (LSO) y la fusión del segmento de recepción (RSC) o pueden contener detalles específicos de la aplicación. Las extensiones de fragmento pueden contener información de direcciones virtuales, información de direcciones DMA lógicas u otra información para el fragmento.

Juntos, estos descriptores y extensiones contienen todos los metadatos sobre un paquete de red. Estos son dos ejemplos de cómo describen un paquete. La primera figura muestra un escenario en el que todo el paquete se almacena dentro de un único fragmento de memoria y se ha activado la descarga de checksum.

Diagrama que muestra un diseño de paquete con 1 fragmento y 1 extensión.

En la segunda ilustración se muestra un paquete almacenado en dos fragmentos de memoria, con la descarga de RSC y suma de comprobación habilitada.

Diagrama que muestra un diseño de paquete con 2 fragmentos y 2 extensiones.

Almacenamiento y acceso del descriptor de paquetes

Los descriptores de paquetes y los descriptores de fragmentos se almacenan en estructuras de NET_RING . Un controlador de cliente NIC accede a los anillos de red y realiza operaciones en ellos llamando a la Interfaz de Iterador de Anillo de Red, lo que permite al controlador trabajar con NetAdapterCx para transferir datos de red al hardware y extraer los datos completados de nuevo al sistema operativo.

Para obtener más información sobre los anillos netos y la interfaz iterador de anillos netos, vea Introducción a los anillos netos.

Extensibilidad del descriptor de paquetes

La extensibilidad es una característica principal del descriptor de paquetes NetAdapterCx, que forma la base para la capacidad de versiones y el rendimiento del descriptor. En tiempo de ejecución, el sistema operativo asigna todos los descriptores de paquetes para cada cola de paquetes en un bloque contiguo, junto con las extensiones disponibles. Cada bloque de extensión está inmediatamente detrás del descriptor principal, como se muestra en la ilustración siguiente:

Diagrama que muestra el diseño del descriptor de paquetes netAdapterCx con 3 bloques de extensión.

Los controladores de cliente NIC no pueden codificar de forma dura el desplazamiento en ningún bloque de extensión. En su lugar, deben consultar en tiempo de ejecución para obtener el desplazamiento de cualquier extensión determinada. Por ejemplo, un controlador podría consultar el desplazamiento a la extensión B y recuperar 70 bytes como en la ilustración siguiente:

Diagrama que muestra la consulta del desplazamiento a una extensión del descriptor de paquetes principal.

Una vez que se crea una cola de paquetes y sus descriptores, el sistema garantiza que los desplazamientos de todas sus extensiones sean constantes, por lo que los drivers no tienen que volver a consultar los desplazamientos a menudo. Además, dado que el sistema asigna previamente todas las extensiones en un bloque en el momento en que se inicializa la cola de paquetes, no es necesario asignar bloques en tiempo de ejecución, buscar una lista para un descriptor específico o tener que almacenar punteros a cada extensión de paquete.

Versionabilidad del descriptor de paquetes

El descriptor de paquetes principal de NetAdapterCx se puede ampliar fácilmente en versiones futuras agregando nuevos campos al final, como en la ilustración siguiente:

Diagrama que muestra el control de versiones del descriptor de paquetes principal de NetAdapterCx.

Los clientes más recientes que conocen los campos V2 pueden acceder a ellos, mientras que los antiguos controladores que solo son compatibles con V1 usarán desplazamientos de extensión para saltar los campos V2 y así poder acceder a los campos que comprenden. Además, cada extensión se puede versionar de la misma manera, como se muestra en la ilustración siguiente:

Diagrama que muestra el control de versiones de la extensión de paquetes NetAdapterCx.

Un controlador cliente que comprenda la nueva extensión puede usarla. Otros controladores de cliente pueden omitir los nuevos campos. Esto permite que distintas partes del descriptor de paquete se versionen de manera independiente.

Descriptores de paquetes y rendimiento de datapath

La característica de extensibilidad descrita anteriormente proporciona ventajas para ayudar a los controladores de clientes a cumplir los requisitos de rendimiento de las NIC que son capaces de manejar cientos de gigabits por segundo, con miles de colas.

  1. Los descriptores de paquetes se mantienen lo más compactos posible para mejorar los aciertos de caché de CPU, ya que las características y extensiones que no se usan ocupan 0 bytes de espacio en los descriptores.
  2. No hay ninguna desreferencia de puntero, solo aritmética de desplazamiento porque las extensiones están en línea, lo que no solo ahorra espacio, sino que también ayuda con accesos al caché de la CPU.
  3. Las extensiones se asignan al momento de la creación de la cola, por lo que los controladores no necesitan asignar y liberar memoria en el camino de datos activo ni lidiar con listas de referencia de bloques de contexto.

Uso de extensiones de paquete

Importante

Actualmente, los controladores de cliente se limitan a las extensiones de paquetes preexistentes definidas por el sistema operativo.

Registro de extensiones de paquete

El primer paso para trabajar con extensiones de paquete en el controlador cliente NIC es declarar las descargas de hardware admitidas. Cuando anuncias la compatibilidad con descargas como checksum y LSO, NetAdapterCx registra automáticamente las extensiones de paquetes asociadas en tu nombre.

Para obtener un ejemplo de código de las descargas de hardware de publicidad, consulte Introducción a las descargas de hardware.

Consultar desplazamientos de extensión de paquete para colas de datapath

Después de registrar extensiones de paquete declarando su soporte de descarga de hardware, necesitará los desplazamientos de extensión para acceder a cada una de ellas mientras procesa sus paquetes. Para reducir las llamadas del controlador y mejorar el rendimiento, puede consultar los desplazamientos de las extensiones durante la función de devolución de llamada EvtNetAdapterCreateTx(Rx)Queue y almacenar la información de desplazamiento en el contexto de la cola.

Para obtener un ejemplo de cómo consultar desplazamientos de extensión y guardarlos en el contexto de la cola, consulte Transmisión y recepción de colas.

Obtención de extensiones de paquetes en tiempo de ejecución

Una vez que haya almacenado los desplazamientos de extensión en el contexto de la cola, puede usarlos en cualquier momento que necesite información en una extensión. Por ejemplo, podría llamar al método NetExtensionGetPacketChecksum mientras programa descriptores en hardware para una cola de transmisión:

    // Get the extension offset from the device context
    PMY_TX_QUEUE_CONTEXT queueContext = GetMyTxQueueContext(txQueue);
    NET_EXTENSION checksumExtension = queueContext->ChecksumExtension;

    // Get the checksum info for this packet
    NET_PACKET_CHECKSUM* checksumInfo = NetExtensionGetPacketChecksum(checksumExtension, packetIndex);

    // Do work with the checksum info
    if (packet->Layout.Layer3Type == NET_PACKET_LAYER3_TYPE_IPV4_NO_OPTIONS ||
        packet->Layout.Layer3Type == NET_PACKET_LAYER3_TYPE_IPV4_WITH_OPTIONS ||
        packet->Layout.Layer3Type == NET_PACKET_LAYER3_TYPE_IPV4_UNSPECIFIED_OPTIONS)
    {
        if(checksumInfo->Layer4 == NET_PACKET_TX_CHECKSUM_REQUIRED)
        {
            ...
        }
    }
    ...

Constantes y métodos auxiliares de extensión de paquetes predefinidos

NetAdapterCx proporciona definiciones para constantes conocidas de extensión de paquetes.

Constante Definición
NET_PACKET_EXTENSION_INVALID_OFFSET Protege contra tamaños de compensación no válidos.
NET_PACKET_EXTENSION_CHECKSUM_NAME NET_PACKET_EXTENSION_CHECKSUM_VERSION_1 Nombre y versión de la extensión de paquete de suma de comprobación.
NET_PACKET_EXTENSION_LSO_NAME NET_PACKET_EXTENSION_LSO_VERSION_1 Nombre y versión de la extensión del paquete grande de descarga de envío (LSO).
NET_PACKET_EXTENSION_RSC_NAME NET_PACKET_EXTENSION_RSC_VERSION_1 El nombre y la versión de la extensión de paquete de segmento de recepción (RSC).

Además, NetAdapterCx proporciona métodos auxiliares que actúan como contenedores alrededor del método NetExtensionGetData . Cada uno de estos métodos devuelve un puntero al tipo de estructura adecuado.

Método Estructura
NetExtensionGetPacketChecksum NET_PACKET_CHECKSUM
NetExtensionGetGso NET_PACKET_GSO
NetExtensionGetPacketRsc NET_PACKET_RSC

Uso de extensiones de fragmento

Importante

Actualmente, los controladores de cliente se limitan a las extensiones de fragmentos preexistentes definidas por el sistema operativo.

Registro de extensiones de fragmento

NetAdapterCx registra automáticamente la mayoría de las extensiones de fragmento interpretando las funcionalidades expresadas de un controlador. Por ejemplo, si el controlador expresa que admite DMA, el marco agregará automáticamente la extensión NET_FRAGMENT_LOGICAL_ADDRESS necesaria para la programación DMA.

Consulta de desplazamientos de extensión de fragmento para colas de rutas de datos

Para acceder a las extensiones de fragmento, puede seguir el mismo proceso para acceder a las extensiones de paquetes que se describen en Consulta de desplazamientos de extensión de paquetes para colas de rutas de datos.

Constantes de extensión de fragmento predefinidas

NetAdapterCx proporciona definiciones para constantes conocidas de extensión de fragmento.

Constante Definición
NET_FRAGMENT_EXTENSION_DATA_BUFFER_NAME NET_FRAGMENT_EXTENSION_DATA_BUFFER_VERSION_1 Nombre y versión de la extensión de fragmento de búfer de datos.
NET_FRAGMENT_EXTENSION_LOGICAL_ADDRESS_NAME NET_FRAGMENT_EXTENSION_LOGICAL_ADDRESS_VERSION_1 Nombre y versión de la extensión del fragmento de dirección lógica.
NET_FRAGMENT_EXTENSION_MDL_NAME NET_FRAGMENT_EXTENSION_MDL_VERSION_1 Nombre y versión de la extensión de fragmento MDL.
NET_FRAGMENT_EXTENSION_RETURN_CONTEXT_NAME NET_FRAGMENT_EXTENSION_RETURN_CONTEXT_VERSION_1 Nombre y versión de la extensión de fragmento de contexto de retorno.
NET_FRAGMENT_EXTENSION_VIRTUAL_ADDRESS_NAME NET_FRAGMENT_EXTENSION_VIRTUAL_ADDRESS_VERSION_1 Nombre y versión de la extensión de fragmento de dirección virtual.