Tarefas de soma de verificação de descarregamento
O NDIS dá suporte ao descarregamento de tarefas de soma de verificação TCP/IP em tempo de execução.
Observação
Os dados OOB (descarregamento fora de banda) de soma de verificação são armazenados na matriz de informações NET_BUFFER_LIST . Para obter mais informações sobre dados OOB, consulte Acessando informações de NET_BUFFER_LIST de descarregamento de TCP/IP.
Antes de passar para o driver de miniporto uma estrutura NET_BUFFER_LIST para um pacote no qual o driver de miniporto executará tarefas de soma de verificação, o transporte TCP/IP especifica as informações de soma de verificação associadas à estrutura NET_BUFFER_LIST. Essas informações são especificadas por uma estrutura NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO , que faz parte das informações de NET_BUFFER_LIST (dados fora de banda) associadas à estrutura NET_BUFFER_LIST.
Antes de descarregar o cálculo de soma de verificação de um pacote TCP, o transporte TCP/IP calcula a soma complementar de um para o pseudoheader TCP. O transporte TCP/IP calcula a soma complementar de todos os campos no pseudoheader, incluindo Endereço IP de Origem, Endereço IP de Destino, Protocolo e o comprimento TCP para pacotes TCP. O transporte TCP/IP insere a soma complementar do pseudoheader no campo Soma de verificação do cabeçalho TCP.
A soma complementar do pseudoheader fornecido pelo transporte TCP/IP fornece à NIC um início antecipado no cálculo da soma de verificação TCP real para o pacote de envio. Para calcular a soma de verificação TCP real, a NIC calcula a parte variável da soma de verificação TCP (para o cabeçalho TCP e a carga), adiciona essa soma de verificação à soma complementar do pseudoheader calculado pelo transporte TCP/IP e calcula o complemento de 16 bits para a soma de verificação. Para obter mais informações sobre como calcular essas somas de verificação, consulte RFC 793 e RFC 1122.
Observação
O transporte TCP/IP calcula a soma complementar do pseudoheader de um pacote UDP usando as mesmas etapas de um pacote TCP e armazena o valor no campo Soma de verificação do cabeçalho UDP.
Observe que o transporte TCP/IP sempre garante que o campo de soma de verificação no cabeçalho IP de um pacote seja definido como zero antes de passar o pacote para um driver de miniporto subjacente. O driver de miniporte deve ignorar o campo soma de verificação em um cabeçalho IP. O driver de miniporte não precisa verificar se o campo de soma de verificação está definido como zero e não precisa definir esse campo como zero.
Depois de receber a estrutura NET_BUFFER_LIST em sua função MiniportSendNetBufferLists ou MiniportCoSendNetBufferLists , um driver de miniporto normalmente faz o seguinte processamento de soma de verificação:
O driver de miniporto chama a macro NET_BUFFER_LIST_INFO com uma _Id de TcpIpChecksumNetBufferListInfo para obter uma estrutura NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO .
O driver de miniporto testa os sinalizadores IsIPv4 e IsIPv6 na estrutura NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO. Se os sinalizadores IsIPv4 e IsIPv6 não estiverem definidos, a NIC não deverá executar nenhuma operação de soma de verificação no pacote.
Se o sinalizador IsIPv4 ou IsIPv6 estiver definido, o driver de miniporto testará os sinalizadores TcpChecksum, UdpChecksum e IpHeaderChecksum para determinar quais somas de verificação a NIC deve calcular para o pacote.
O driver de miniporto passa o pacote para a NIC, que calcula as somas de verificação apropriadas para o pacote. Se um pacote tiver um cabeçalho IP de túnel e um cabeçalho IP de transporte, uma NIC que dá suporte a descarregamentos de soma de verificação de IP executará tarefas de soma de verificação de IP somente no cabeçalho do túnel. O transporte TCP/IP executa tarefas de soma de verificação de IP no cabeçalho ip de transporte.
Antes de indicar uma estrutura NET_BUFFER_LIST para um pacote de recebimento no qual executa tarefas de soma de verificação, o driver de miniporto valida as somas de verificação apropriadas e define os sinalizadores xxxchecksumfailed ou xxxchecksumSucceeded apropriados na estrutura NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO.
Desativar descarregamentos de soma de verificação de endereço quando o LSO (descarregamento de envio grande) está habilitado não impede que o driver de miniporte compute e insira somas de verificação nos pacotes gerados pelo recurso LSO. Para desabilitar descarregamentos de soma de verificação de endereço, nesse caso, o usuário também deve desabilitar o LSO.