Descarga de suma de comprobación

NetAdapterCx admite la descarga de tareas de suma de comprobación tcp/IP en tiempo de ejecución.

Antes de que el transporte TCP/IP pase una estructura de NET_PACKET al controlador cliente, especifica la información de suma de comprobación asociada al NET_PACKET en una extensión de paquete de NET_PACKET_CHECKSUM .

El transporte TCP/IP calcula la suma de complemento del pseudoheader TCP/UDP antes de descargar el cálculo de suma de comprobación de un paquete TCP/UDP, como se describe en Offloading Checksum Tasks.

Desactivar las descargas de suma de comprobación cuando la descarga de segmentación genérica (GSO) está habilitada no impide que el controlador de cliente calcule e inserte sumas de comprobación en paquetes generados por la característica GSO. Para deshabilitar completamente las descargas de suma de comprobación, también debe deshabilitar el inicio de sesión único.

Palabras clave INF para controlar la descarga de suma de comprobación

NetAdapterCx comprueba las palabras clave del Registro y las respeta al habilitar las funcionalidades de descarga activas. El controlador no necesita realizar ninguna otra acción.

Las palabras clave de suma de comprobación especificadas en Usar valores del Registro para habilitar y deshabilitar la descarga de tareas se pueden usar para habilitar o deshabilitar la descarga de suma de comprobación con una configuración de clave del Registro. No se admiten palabras clave agrupadas.

Los valores de palabra clave deben ser de tipo REG_SZ.

Configuración de la descarga de suma de comprobación

Los controladores de cliente anuncian primero las funcionalidades de descarga de suma de comprobación de su hardware durante la inicialización del adaptador neto. Esto puede ocurrir dentro de su devolución de llamada EvtDevicePrepareHardware antes de iniciar un adaptador net.

Para configurar la descarga de suma de comprobación de transmisión (Tx), el controlador cliente:

  1. Asigna una estructura de NET_ADAPTER_OFFLOAD_TX_CHECKSUM_CAPABILITIES .

  2. Llama a NET_ADAPTER_OFFLOAD_TX_CHECKSUM_CAPABILITIES_INIT para inicializar la estructura.

  3. Llama a NetAdapterOffloadSetTxChecksumCapabilities para registrar la estructura con NetAdapterCx.

Durante la llamada a NET_ADAPTER_OFFLOAD_TX_CHECKSUM_CAPABILITIES_INIT el controlador cliente proporciona un puntero a la devolución de llamada EVT_NET_ADAPTER_OFFLOAD_SET_TX_CHECKSUM . El sistema invoca esta devolución de llamada más adelante si cambian las funcionalidades de descarga activas.

Para configurar la descarga de suma de comprobación de recepción (Rx), el controlador cliente:

  1. Asigna una estructura NET_ADAPTER_OFFLOAD_RX_CHECKSUM_CAPABILITIES .

  2. Llama a NET_ADAPTER_OFFLOAD_RX_CHECKSUM_CAPABILITIES_INIT para inicializar la estructura.

  3. Llama a NetAdapterOffloadSetRxChecksumCapabilities para registrar la estructura con NetAdapterCx.

Durante la llamada a NET_ADAPTER_OFFLOAD_RX_CHECKSUM_CAPABILITIES_INIT el controlador cliente proporciona un puntero a la devolución de llamada EVT_NET_ADAPTER_OFFLOAD_SET_RX_CHECKSUM . El sistema invoca esta devolución de llamada más adelante si cambian las funcionalidades de descarga activas.

Reglas para indicar las funcionalidades de suma de comprobación de transmisión de hardware

  1. Se deben establecer los Layer3Flags de la estructura NET_ADAPTER_OFFLOAD_TX_CHECKSUM_CAPABILITIES . El establecimiento de Layer4Flags es opcional. Si se establece Layer3Flags y Layer4Flags, se indican los paquetes en los que la NIC es capaz de realizar la descarga de suma de comprobación.

  2. Layer3HeaderOffsetLimit y Layer4HeaderOffsetLimit en NET_ADAPTER_OFFLOAD_TX_CHECKSUM_CAPABILITIES son opcionales. Si el sistema operativo envía un paquete con un desplazamiento de encabezado mayor que el límite especificado, no solicitará a la NIC que calcule la suma de comprobación de esa capa.

  3. Se deben admitir paquetes IP/TCP sin opciones o extensiones si se admiten opciones o extensiones.

Reglas para indicar las funcionalidades de suma de comprobación de recepción de hardware

NetAdapterCx no requiere que el controlador anuncie las funcionalidades de suma de comprobación de recepción de hardware. Si la descarga de suma de comprobación está habilitada, la NIC debe realizar la descarga de suma de comprobación en todos los paquetes que puede controlar. Si la NIC no puede realizar la descarga de suma de comprobación en un paquete, NetAdapterCx lo descargará en software.

En este ejemplo se muestra cómo un controlador de cliente puede configurar sus funcionalidades de descarga de suma de comprobación de hardware:

VOID
MyAdapterSetOffloadCapabilities(
    NETADAPTER NetAdapter
)
{
    // Configure the hardware's Tx checksum offload capabilities
    NET_ADAPTER_OFFLOAD_TX_CHECKSUM_CAPABILITIES txChecksumOffloadCapabilities;

    auto const layer3Flags = NetAdapterOffloadLayer3FlagIPv4NoOptions |
        NetAdapterOffloadLayer3FlagIPv4WithOptions |
        NetAdapterOffloadLayer3FlagIPv6NoExtensions |
        NetAdapterOffloadLayer3FlagIPv6WithExtensions;

    auto const layer4Flags = NetAdapterOffloadLayer4FlagTcpNoOptions |
        NetAdapterOffloadLayer4FlagTcpWithOptions |
        NetAdapterOffloadLayer4FlagUdp;

    NET_ADAPTER_OFFLOAD_TX_CHECKSUM_CAPABILITIES_INIT(
        &txChecksumOffloadCapabilities,
        layer3Flags,
        EvtAdapterOffloadSetTxChecksum);

    txChecksumOffloadCapabilities.Layer4Flags = layer4Flags;

    txChecksumOffloadCapabilities.Layer4HeaderOffsetLimit = 127;

    // Set the current Tx checksum offload capabilities and register the callback for future changes in active capabilities
    NetAdapterOffloadSetTxChecksumCapabilities(NetAdapter,
        &txChecksumOffloadCapabilities);

    // Configure the hardware's Rx checksum offload capabilities
    NET_ADAPTER_OFFLOAD_RX_CHECKSUM_CAPABILITIES rxChecksumOffloadCapabilities;

    NET_ADAPTER_OFFLOAD_RX_CHECKSUM_CAPABILITIES_INIT(
        &rxChecksumOffloadCapabilities,
        EvtAdapterOffloadSetRxChecksum);

    // Set the current Rx checksum offload capabilities and register the callback for future changes in active capabilities
    NetAdapterOffloadSetRxChecksumCapabilities(NetAdapter,
        &rxChecksumOffloadCapabilities);
}

Actualización de descargas de hardware

Si la pila TCP/IP o un controlador de protocolo excesivamente solicita un cambio en las funcionalidades activas del adaptador de red, NetAdapterCx invoca el EVT_NET_ADAPTER_OFFLOAD_SET_TX_CHECKSUM del controlador cliente o EVT_NET_ADAPTER_OFFLOAD_SET_RX_CHECKSUM devolución de llamada que se registró durante la inicialización del adaptador. En estas funciones, el sistema proporciona funcionalidades actualizadas en el objeto NETOFFLOAD que el controlador cliente consulta para actualizar sus funcionalidades de descarga.

Los controladores de cliente pueden llamar a las siguientes funciones para determinar qué descargas de suma de comprobación están habilitadas:

En el ejemplo siguiente se muestra cómo un controlador de cliente puede actualizar sus funcionalidades de descarga de suma de comprobación Tx/Rx:

VOID
MyEvtAdapterOffloadSetTxChecksum(
    NETADAPTER  NetAdapter,
    NETOFFLOAD  Offload
)
{
    PMY_NET_ADAPTER_CONTEXT adapterContext = MyGetNetAdapterContext(NetAdapter);

    // Store the updated information in the context
    adapterContext->TxHardwareIpChecksum = NetOffloadIsTxChecksumIPv4Enabled(Offload);
    adapterContext->TxHardwareTcpChecksum = NetOffloadIsTxChecksumTcpEnabled(Offload);
    adapterContext->TxHardwareUdpChecksum = NetOffloadIsTxChecksumUdpEnabled(Offload);

    // Update the new hardware Tx checksum offload capabilities
    MyUpdateHardwareChecksum(adapterContext);
}

VOID
MyEvtAdapterOffloadSetRxChecksum(
    NETADAPTER  NetAdapter,
    NETOFFLOAD  Offload
)
{
    PMY_NET_ADAPTER_CONTEXT adapterContext = MyGetNetAdapterContext(NetAdapter);

    // Store the updated information in the context
    adapterContext->RxHardwareIpChecksum = NetOffloadIsRxChecksumIPv4Enabled(Offload);
    adapterContext->RxHardwareTcpChecksum = NetOffloadIsRxChecksumTcpEnabled(Offload);
    adapterContext->RxHardwareUdpChecksum = NetOffloadIsRxChecksumUdpEnabled(Offload);

    // Update the new hardware Rx checksum offload capabilities
    MyUpdateHardwareChecksum(adapterContext);
}

Transmisión del procesamiento de suma de comprobación

Normalmente, un controlador de cliente realiza el siguiente procesamiento de suma de comprobación en la ruta de acceso de transmisión:

  1. El controlador cliente llama a la función NetExtensionGetPacketChecksum con el índice de paquetes para obtener una estructura de NET_PACKET_CHECKSUM .

  2. El controlador cliente prueba las marcas específicas de la capa en la estructura NET_PACKET_CHECKSUM.

    • Si la marca es NetPacketTxChecksumActionPassthrough, la NIC no debe realizar operaciones de suma de comprobación en esa capa.

    • Si la marca es NetPacketTxChecksumActionRequired, el controlador de cliente debe determinar el protocolo que se usa en esa capa de ese paquete específico mediante la estructura NET_PACKET_LAYOUT e indicar a la NIC la suma de comprobación que debe calcular para el paquete.

  3. El controlador de cliente pasa el paquete a la NIC, que calcula las sumas de comprobación adecuadas para el paquete.

Recepción del procesamiento de suma de comprobación

Antes de indicar una estructura de NET_PACKET para un paquete de recepción en el que realiza tareas de suma de comprobación, el controlador cliente valida las sumas de comprobación y establece las marcas adecuadas en la estructura de NET_PACKET_CHECKSUM .

Las marcas pueden ser una de las siguientes:

Marca Descripción
NetPacketRxChecksumEvaluationNotChecked La NIC no pudo validar la suma de comprobación del paquete.
NetPacketRxChecksumEvaluationValid La suma de comprobación del paquete es válida
NetPacketRxChecksumEvaluationInvalid La suma de comprobación del paquete no es válida.