Descarregamento de soma de verificação

O NetAdapterCx dá suporte ao descarregamento de tarefas de soma de verificação TCP/IP em tempo de execução.

Antes que o transporte TCP/IP passe uma estrutura de NET_PACKET para o driver cliente, ele especifica as informações de soma de verificação associadas ao NET_PACKET em uma extensão de pacote NET_PACKET_CHECKSUM .

O transporte TCP/IP calcula a soma complementar do pseudoheader TCP/UDP antes de descarregar o cálculo de soma de verificação de um pacote TCP/UDP, conforme descrito em Tarefas de Soma de Verificação de Descarregamento.

Desativar descarregamentos de soma de verificação quando o GSO ( Descarregamento de Segmentação Genérica ) está habilitado não impede que o driver cliente compute e insira somas de verificação em pacotes gerados pelo recurso GSO. Para desabilitar completamente os descarregamentos de soma de verificação, você também deve desabilitar o GSO.

Palavras-chave INF para controlar o descarregamento de soma de verificação

NetAdapterCx verifica as palavras-chave do Registro e as honra ao habilitar os recursos de descarregamento ativos. O driver não precisa executar nenhuma ação adicional.

As palavras-chave de soma de verificação especificadas em Usando valores do Registro para habilitar e desabilitar o descarregamento de tarefas podem ser usadas para habilitar/desabilitar o descarregamento de soma de verificação com uma configuração de chave do Registro. Não há suporte para palavras-chave agrupadas.

Os valores de palavra-chave devem ser do tipo REG_SZ.

Configurando o descarregamento de soma de verificação

Os drivers de cliente anunciam primeiro os recursos de descarregamento de soma de verificação do hardware durante a inicialização do adaptador líquido. Isso pode ocorrer no retorno de chamada EvtDevicePrepareHardware antes de iniciar um adaptador de rede.

Para configurar o descarregamento de soma de verificação de transmissão (Tx), o driver do cliente:

  1. Aloca uma estrutura de NET_ADAPTER_OFFLOAD_TX_CHECKSUM_CAPABILITIES .

  2. Chama NET_ADAPTER_OFFLOAD_TX_CHECKSUM_CAPABILITIES_INIT para inicializar a estrutura.

  3. Chama NetAdapterOffloadSetTxChecksumCapabilities para registrar a estrutura com NetAdapterCx.

Durante a chamada para NET_ADAPTER_OFFLOAD_TX_CHECKSUM_CAPABILITIES_INIT o driver cliente fornece um ponteiro para o retorno de chamada EVT_NET_ADAPTER_OFFLOAD_SET_TX_CHECKSUM . O sistema invocará esse retorno de chamada posteriormente se os recursos de descarregamento ativo forem alterados.

Para configurar o descarregamento de soma de verificação de recebimento (Rx), o driver do cliente:

  1. Aloca uma estrutura de NET_ADAPTER_OFFLOAD_RX_CHECKSUM_CAPABILITIES .

  2. Chama NET_ADAPTER_OFFLOAD_RX_CHECKSUM_CAPABILITIES_INIT para inicializar a estrutura.

  3. Chama NetAdapterOffloadSetRxChecksumCapabilities para registrar a estrutura com NetAdapterCx.

Durante a chamada para NET_ADAPTER_OFFLOAD_RX_CHECKSUM_CAPABILITIES_INIT o driver cliente fornece um ponteiro para o retorno de chamada EVT_NET_ADAPTER_OFFLOAD_SET_RX_CHECKSUM . O sistema invocará esse retorno de chamada posteriormente se os recursos de descarregamento ativo forem alterados.

Regras para indicar recursos de soma de verificação de transmissão de hardware

  1. As Layer3Flags na estrutura NET_ADAPTER_OFFLOAD_TX_CHECKSUM_CAPABILITIES devem ser definidas. Definir Layer4Flags é opcional. Definir Layer3Flags e Layer4Flags indica os pacotes nos quais a NIC é capaz de executar o descarregamento de soma de verificação.

  2. Layer3HeaderOffsetLimit e Layer4HeaderOffsetLimit em NET_ADAPTER_OFFLOAD_TX_CHECKSUM_CAPABILITIES são opcionais. Se o sistema operacional enviar um pacote com um deslocamento de cabeçalho maior que o limite especificado, ele não solicitará que a NIC calcule a soma de verificação dessa camada.

  3. Pacotes IP/TCP sem opções/extensões devem ter suporte se houver suporte para opções/extensões.

Regras para indicar recursos de soma de verificação de recebimento de hardware

NetAdapterCx não exige que o driver anuncie os recursos de soma de verificação de recebimento de hardware. Se o descarregamento de soma de verificação estiver habilitado, a NIC deverá executar o descarregamento de soma de verificação em todos os pacotes que ele pode manipular. Se a NIC não puder executar o descarregamento de soma de verificação em um pacote, o NetAdapterCx o descarregará no software.

Este exemplo mostra como um driver cliente pode configurar seus recursos de descarregamento de soma de verificação 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);
}

Atualizando descarregamentos de hardware

Se a pilha TCP/IP ou um driver de protocolo sobreposto solicitar uma alteração nos recursos ativos do adaptador de rede, NetAdapterCx invocará o EVT_NET_ADAPTER_OFFLOAD_SET_TX_CHECKSUM do driver cliente ou EVT_NET_ADAPTER_OFFLOAD_SET_RX_CHECKSUM retorno de chamada que foi registrado durante a inicialização do adaptador. Nessas funções, o sistema fornece recursos atualizados no objeto NETOFFLOAD que o driver cliente consulta para atualizar seus recursos de descarregamento.

Os drivers de cliente podem chamar as seguintes funções para determinar quais descarregamentos de soma de verificação estão habilitados:

O exemplo a seguir mostra como um driver cliente pode atualizar seus recursos de descarregamento de soma de verificação 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);
}

Transmitir processamento de soma de verificação

Um driver cliente normalmente faz o seguinte processamento de soma de verificação no caminho de transmissão:

  1. O driver do cliente chama a função NetExtensionGetPacketChecksum com o índice de pacotes para obter uma estrutura NET_PACKET_CHECKSUM .

  2. O driver do cliente testa os sinalizadores específicos da camada na estrutura NET_PACKET_CHECKSUM.

    • Se o sinalizador for NetPacketTxChecksumActionPassthrough, a NIC não deverá executar operações de soma de verificação nessa camada.

    • Se o sinalizador for , o driver do cliente deverá determinar o protocolo que está NetPacketTxChecksumActionRequiredsendo usado nessa camada nesse pacote específico usando a estrutura NET_PACKET_LAYOUT e indicar à NIC qual soma de verificação ele deve calcular para o pacote.

  3. O driver do cliente passa o pacote para a NIC, que calcula as somas de verificação apropriadas para o pacote.

Receber processamento de soma de verificação

Antes de indicar uma estrutura NET_PACKET para um pacote de recebimento no qual executa tarefas de soma de verificação, o driver do cliente valida as somas de verificação e define os sinalizadores apropriados na estrutura NET_PACKET_CHECKSUM .

Os sinalizadores podem ser um dos seguintes:

Sinalizador Descrição
NetPacketRxChecksumEvaluationNotChecked A NIC não pôde validar a soma de verificação do pacote
NetPacketRxChecksumEvaluationValid A soma de verificação do pacote é válida
NetPacketRxChecksumEvaluationInvalid A soma de verificação do pacote é inválida