Partilhar via


Delegar tarefas de soma de verificação

O NDIS suporta o descarregamento das tarefas de verificação de soma TCP/IP em tempo de execução.

Observação

 Os dados de descarregamento de checksum fora de banda (OOB) são armazenados na matriz de informações NET_BUFFER_LIST. Para obter mais informações sobre dados OOB, consulte Como acessar informações de NET_BUFFER_LIST de descarregamento de TCP/IP.

Antes de passar para o driver de miniporta uma estrutura de NET_BUFFER_LIST para um pacote no qual o driver de miniporta 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 da soma de verificação para um pacote TCP, o transporte TCP/IP calcula a soma do complemento para o pseudocabeçalho TCP. O transporte TCP/IP calcula a soma do complemento em todos os campos no pseudocabeçalho, 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 do complemento para o pseudocabeçalho no campo Soma de verificação do cabeçalho TCP.

A soma do complemento para um pseudocabeçalho oferecido pelo transporte TCP/IP dá à NIC um início antecipado no cálculo da soma de verificação TCP real para o pacote enviado. 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 útil), adiciona essa soma de verificação à soma do complemento de um para o pseudocabeçalho calculado pelo transporte TCP/IP, e calcula o complemento de um bit para a soma de verificação de 16 bits. 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 do complemento para o pseudocabeçalho de um pacote UDP usando as mesmas etapas que para 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 miniporta subjacente. O driver da miniporta deve ignorar o campo de soma de verificação num cabeçalho IP. O driver de miniporta 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 nas suas funções MiniportSendNetBufferLists ou MiniportCoSendNetBufferLists, um driver de miniporta normalmente faz o seguinte processamento de checksum:

  1. O driver de miniporta chama a macro NET_BUFFER_LIST_INFO com uma _Id de TcpIpChecksumNetBufferListInfo para obter uma estrutura NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO.

  2. O driver de miniporta 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.

  3. Se o sinalizador de IsIPv4 ou o sinalizador de IsIPv6 estiver definido, o driver de miniporta testará os sinalizadores de TcpChecksum, UdpChecksume IpHeaderChecksum para determinar quais somas de verificação a NIC deve calcular para o pacote.

  4. O miniport driver 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 ofereça suporte a descarregamentos de soma de verificação IP executará tarefas de soma de verificação IP somente no cabeçalho do túnel. O transporte TCP/IP executa tarefas de soma de verificação IP no cabeçalho IP do transporte.

Antes de indicar uma estrutura NET_BUFFER_LIST para um pacote de receção sobre o qual executa tarefas de soma de verificação, o driver de miniporta valida as somas de verificação apropriadas e define os sinalizadores apropriados XxxChecksumFailed ou XxxChecksumSucceeded na estrutura NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO.

Desativar os descarregamentos de soma de verificação de endereço quando o LSO (Large Send Offload) está ativado não impede que o driver de miniporta calcule e insira somas de verificação nos pacotes gerados pelo recurso LSO. Para desativar os descarregamentos de soma de verificação de endereço, neste caso, o usuário também deve desativar o LSO.