Offload delle attività checksum
NDIS supporta l'offload delle attività di checksum TCP/IP in fase di esecuzione.
Nota
I dati di offload out-of-band (OOB) del checksum vengono archiviati nella matrice 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 sul 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 tra 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 iniziale nel calcolo del checksum TCP reale per il pacchetto di invio. Per calcolare il checksum TCP effettivo, la scheda di interfaccia di rete calcola la parte variabile del checksum TCP (per l'intestazione TCP e il payload), aggiunge questo checksum alla somma di complemento per lo pseudoheader calcolato dal trasporto TCP/IP e calcola il complemento di 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 in un'intestazione IP. Il driver miniport non deve verificare che il campo checksum sia impostato su zero e non sia necessario impostare questo campo su zero.
Dopo aver ricevuto la struttura NET_BUFFER_LIST nella relativa funzione MiniportSendNetBufferLists o MiniportCoSendNetBufferLists , un driver miniport esegue in genere l'elaborazione checksum seguente:
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 .
Il driver miniport testa i flag IsIPv4 e IsIPv6 nella struttura NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO. Se i flag IsIPv4 e IsIPv6 non sono impostati, la scheda di interfaccia di rete non deve eseguire alcuna operazione di checksum sul pacchetto.
Se è impostato il flag IsIPv4 o IsIPv6 , il driver miniport testa i flag TcpChecksum, UdpChecksum e IpHeaderChecksum per determinare quali checksum devono essere calcolati per il pacchetto.
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 flag XxxChecksumFailed o XxxChecksumSucceeded appropriati nella struttura NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO.
La disattivazione dell'offload checksum degli indirizzi quando l'offload di invio di grandi dimensioni (LSO) è abilitato non impedisce al driver miniport di calcolare e inserire checksum nei pacchetti generati dalla funzionalità LSO. Per disabilitare Gli offload checksum degli indirizzi in questo caso, l'utente deve anche disabilitare LSO.