Compartir a través de


Descarga de suma de comprobación

NetAdapterCx admite la descarga de tareas de suma de comprobación TCP/IP durante la ejecución.

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

El transporte TCP/IP calcula la suma del complemento del pseudoheader TCP/UDP antes de descargar el cálculo de la suma de comprobación de un paquete TCP/UDP, tal 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 cliente calcule e inserte sumas de comprobación en los paquetes generados por la característica de GSO. Para deshabilitar completamente las descargas de suma de comprobación, también debe deshabilitar el GSO.

Palabras clave INF para controlar la transferencia 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 acción adicional.

Las palabras clave de suma de comprobación especificadas en Usar valores del Registro para habilitar y deshabilitar la descarga de tareas de suma de comprobación se pueden utilizar para habilitar o deshabilitar la descarga de suma de comprobación mediante 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 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 de red.

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

  1. Asigna una estructura NET_ADAPTER_OFFLOAD_TX_CHECKSUM_CAPABILITIES.

  2. Llama 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 indica un puntero a la devolución de llamada EVT_NET_ADAPTER_OFFLOAD_SET_TX_CHECKSUM. El sistema invoca este callback más adelante si cambian las funcionalidades de descarga activa.

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 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 del cliente proporciona un puntero a la devolución de llamada EVT_NET_ADAPTER_OFFLOAD_SET_RX_CHECKSUM. El sistema invoca este callback más adelante si cambian las capacidades de descarga automática 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. Al establecer Layer3Flags y Layer4Flags, se indican los paquetes en los que la NIC es capaz de realizar la descarga de la suma de verificació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. Los paquetes IP/TCP sin opciones o extensiones deben admitirse 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 tareas de suma de comprobación en un paquete, NetAdapterCx realizará la descarga en el software.

En este ejemplo se muestra cómo un controlador cliente podría 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 subyacente solicita un cambio en las capacidades activas del adaptador de red, NetAdapterCx invoca la devolución de llamada EVT_NET_ADAPTER_OFFLOAD_SET_TX_CHECKSUM o EVT_NET_ADAPTER_OFFLOAD_SET_RX_CHECKSUM registrada 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 cliente pueden llamar a las siguientes funciones para determinar qué descargas de suma de verificación están habilitadas:

En el ejemplo siguiente se muestra cómo un controlador cliente puede actualizar sus capacidades de delegación 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 cliente realiza el siguiente procesamiento de suma de comprobación en la ruta de transmisión:

  1. El controlador cliente llama a la función NetExtensionGetPacketChecksum con el índice del paquete para obtener una estructura 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 en ese paquete específico mediante la estructura NET_PACKET_LAYOUT e indicar a la NIC qué suma de comprobación debe calcular para el paquete.

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

Procesamiento para recibir 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:

Bandera 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