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.
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.
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:
Aloca uma estrutura de NET_ADAPTER_OFFLOAD_TX_CHECKSUM_CAPABILITIES .
Chama NET_ADAPTER_OFFLOAD_TX_CHECKSUM_CAPABILITIES_INIT para inicializar a estrutura.
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:
Aloca uma estrutura de NET_ADAPTER_OFFLOAD_RX_CHECKSUM_CAPABILITIES .
Chama NET_ADAPTER_OFFLOAD_RX_CHECKSUM_CAPABILITIES_INIT para inicializar a estrutura.
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.
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.
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.
Pacotes IP/TCP sem opções/extensões devem ter suporte se houver suporte para opções/extensões.
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);
}
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:
- NetOffloadIsTxChecksumIPv4Enabled
- NetOffloadIsTxChecksumTcpEnabled
- NetOffloadIsTxChecksumUdpEnabled
- NetOffloadIsRxChecksumIPv4Enabled
- NetOffloadIsRxChecksumTcpEnabled
- NetOffloadIsRxChecksumUdpEnabled
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);
}
Um driver cliente normalmente faz o seguinte processamento de soma de verificação no caminho de transmissão:
O driver do cliente chama a função NetExtensionGetPacketChecksum com o índice de pacotes para obter uma estrutura NET_PACKET_CHECKSUM .
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á
NetPacketTxChecksumActionRequired
sendo 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.
O driver do cliente passa o pacote para a NIC, que calcula as somas de verificação apropriadas para o pacote.
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 |