Condividi tramite


Scaricamento delle operazioni di checksum

NDIS supporta l'offload delle attività di checksum TCP/IP durante l'esecuzione.

Nota

 I dati di offload out-of-band (OOB) del checksum vengono archiviati nell'array di informazioni NET_BUFFER_LIST. Per altre informazioni sui dati OOB, vedere Accesso all'offload TCP/IP NET_BUFFER_LIST Informazioni.

Prima di passare al driver miniport una struttura NET_BUFFER_LIST per un pacchetto in cui il driver miniport eseguirà attività di checksum, il trasporto TCP/IP specifica le informazioni di checksum associate alla struttura NET_BUFFER_LIST. Queste informazioni vengono specificate da una struttura NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO, che fa parte delle informazioni NET_BUFFER_LIST (dati fuori banda) associati alla struttura NET_BUFFER_LIST.

Prima di eseguire l'offload del calcolo del checksum per un pacchetto TCP, il trasporto TCP/IP calcola la somma del complemento per lo pseudoheader TCP. Il trasporto TCP/IP calcola la somma del complemento di uno in tutti i campi nello pseudoheader, inclusi l'indirizzo IP di origine, l'indirizzo IP di destinazione, il protocollo e la lunghezza TCP per i pacchetti TCP. Il trasporto TCP/IP immette la somma del complemento per lo pseudoheader nel campo Checksum dell'intestazione TCP.

La somma del complemento per lo pseudoheader fornito dal trasporto TCP/IP fornisce alla scheda di interfaccia di rete un inizio anticipato nel calcolo del checksum TCP reale per il pacchetto di invio. Per calcolare il checksum TCP effettivo, la NIC calcola la parte variabile del checksum TCP (per l'intestazione TCP e il payload), aggiunge questo checksum alla somma del complemento a uno calcolata per lo pseudoheader dal trasporto TCP/IP e calcola il complemento a uno a 16 bit per il checksum. Per altre informazioni sul calcolo di tali checksum, vedere RFC 793 e RFC 1122.

Nota

Il trasporto TCP/IP calcola la somma del complemento per lo pseudoheader di un pacchetto UDP usando gli stessi passaggi di un pacchetto TCP e archivia il valore nel campo Checksum dell'intestazione UDP.

Si noti che il trasporto TCP/IP garantisce sempre che il campo checksum nell'intestazione IP di un pacchetto sia impostato su zero prima di passare il pacchetto a un driver miniport sottostante. Il driver miniport deve ignorare il campo checksum nell'intestazione IP. Il driver miniport non deve verificare che il campo checksum sia impostato su zero e che non sia necessario impostare questo campo su zero.

Dopo aver ricevuto la struttura di NET_BUFFER_LIST nella relativa funzione MiniportSendNetBufferLists o MiniportCoSendNetBufferLists, un driver miniport esegue in genere l'elaborazione checksum seguente:

  1. Il driver miniport chiama la macro NET_BUFFER_LIST_INFO con un _Id di TcpIpChecksumNetBufferListInfo per ottenere una struttura NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO.

  2. Il driver miniport testa i flag IsIPv4 e IsIPv6 nella struttura NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO. Se i flag di IsIPv4 e IsIPv6 non sono impostati, la scheda di interfaccia di rete non deve eseguire alcuna operazione di checksum sul pacchetto.

  3. Se il flag IsIPv4 o IsIPv6 è impostato, il driver miniport testa i flag TcpChecksum, UdpChecksume IpHeaderChecksum per determinare quali checksum il NIC dovrebbe calcolare per il pacchetto.

  4. Il driver miniport passa il pacchetto alla scheda di interfaccia di rete, che calcola i checksum appropriati per il pacchetto. Se un pacchetto ha sia un'intestazione IP del tunnel che un'intestazione IP di trasporto, una scheda di interfaccia di rete che supporta l'offload di checksum IP esegue attività di checksum IP solo nell'intestazione del tunnel. Il trasporto TCP/IP esegue attività di checksum IP nell'intestazione IP di trasporto.

Prima di indicare una struttura di NET_BUFFER_LIST per un pacchetto di ricezione in cui esegue attività di checksum, il driver miniport convalida i checksum appropriati e imposta i XxxChecksumFailed o XxxChecksumSucceeded flag nella struttura NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO.

La disattivazione del checksum offload degli indirizzi quando l'opzione LSO (Large Send Offload) è abilitata non impedisce al driver miniport di calcolare e inserire i checksum nei pacchetti generati dalla funzione LSO. Per disabilitare gli offload di checksum degli indirizzi, in questo caso, l'utente deve anche disabilitare LSO.