Auslagern von Prüfsummentasks
NDIS unterstützt das Ausladen von TCP/IP-Prüfsummentasks zur Laufzeit.
Hinweis
Prüfsummenauslagerungsdaten (Out-of-Band, OOB) werden im NET_BUFFER_LIST-Informationsarray gespeichert. Weitere Informationen zu OOB-Daten finden Sie unter Zugreifen auf TCP/IP-Auslagerung NET_BUFFER_LIST Informationen.
Bevor eine NET_BUFFER_LIST-Struktur für ein Paket an den Miniporttreiber übergeben wird, für das der Miniporttreiber Prüfsummentasks ausführt, gibt der TCP/IP-Transport die Prüfsummeninformationen an, die der NET_BUFFER_LIST-Struktur zugeordnet sind. Diese Informationen werden durch eine NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO-Struktur angegeben, die Teil der NET_BUFFER_LIST Informationen (Out-of-Band-Daten) ist, die der NET_BUFFER_LIST-Struktur zugeordnet sind.
Vor dem Auslagern der Prüfsummenberechnung für ein TCP-Paket berechnet der TCP/IP-Transport die Komplementsumme für den TCP-Pseudoheader. Der TCP/IP-Transport berechnet die Komplementsumme für alle Felder im Pseudoheader, einschließlich Quell-IP-Adresse, Ziel-IP-Adresse, Protokoll und TCP-Länge für TCP-Pakete. Der TCP/IP-Transport gibt die Komplementsumme für den Pseudoheader im Feld Prüfsumme des TCP-Headers ein.
Die Komplementsumme für den vom TCP/IP-Transport bereitgestellten Pseudoheader gibt der NIC einen frühen Start in die Berechnung der tatsächlichen TCP-Prüfsumme für das Sendepaket. Um die tatsächliche TCP-Prüfsumme zu berechnen, berechnet die NIC den variablen Teil der TCP-Prüfsumme (für den TCP-Header und die Nutzlast), fügt diese Prüfsumme der Komplementsumme des 16-Bit-Elements für den vom TCP/IP-Transport berechneten Pseudoheader hinzu und berechnet das 16-Bit-Komplement für die Prüfsumme. Weitere Informationen zum Berechnen solcher Prüfsummen finden Sie unter RFC 793 und RFC 1122.
Hinweis
Der TCP/IP-Transport berechnet die Komplementsumme für den Pseudoheader eines UDP-Pakets mithilfe der gleichen Schritte wie bei einem TCP-Paket und speichert den Wert im Feld Prüfsumme des UDP-Headers.
Beachten Sie, dass der TCP/IP-Transport immer sicherstellt, dass das Prüfsummenfeld im IP-Header eines Pakets auf Null festgelegt wird, bevor das Paket an einen zugrunde liegenden Miniporttreiber übergeben wird. Der Miniporttreiber sollte das Prüfsummenfeld in einem IP-Header ignorieren. Der Miniporttreiber muss nicht überprüfen, ob das Prüfsummenfeld auf 0 festgelegt ist, und muss dieses Feld nicht auf 0 festlegen.
Nachdem die NET_BUFFER_LIST-Struktur in der Funktion "MiniportSendNetBufferLists " oder " MiniportCoSendNetBufferLists " empfangen wurde, führt ein Miniporttreiber in der Regel die folgende Prüfsummenverarbeitung durch:
Der Miniporttreiber ruft das makro NET_BUFFER_LIST_INFO mit einem _IdtcpIpChecksumNetBufferListInfo auf, um eine NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO-Struktur zu erhalten.
Der Miniporttreiber testet die Flags IsIPv4 und IsIPv6 in der NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO-Struktur. Wenn sowohl das IsIPv4- als auch das IsIPv6-Flag nicht festgelegt sind, sollte die NIC keine Prüfsummenvorgänge für das Paket ausführen.
Wenn das Flag IsIPv4 oder IsIPv6 festgelegt ist, testet der Miniporttreiber die Flags TcpChecksum, UdpChecksum und IpHeaderChecksum , um zu bestimmen, welche Prüfsummen die NIC für das Paket berechnen soll.
Der Miniporttreiber übergibt das Paket an die NIC, die die entsprechenden Prüfsummen für das Paket berechnet. Wenn ein Paket sowohl über einen Tunnel-IP-Header als auch über einen Transport-IP-Header verfügt, führt eine NIC, die IP-Prüfsummenauslagerungen unterstützt, IP-Prüfsummentasks nur für den Tunnelheader aus. Der TCP/IP-Transport führt IP-Prüfsummentasks für den IP-Transportheader aus.
Bevor eine NET_BUFFER_LIST-Struktur für ein Empfangspaket angegeben wird, für das Prüfsummentasks ausgeführt werden, überprüft der Miniporttreiber die entsprechenden Prüfsummen und legt die entsprechenden XxxChecksumFailed - oder XxxChecksumSucceeded-Flags in der NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO-Struktur fest.
Das Deaktivieren von Adressprüfsummenausladungen, wenn große Sendeauslagerung (Large Send Offload, LSO) aktiviert ist, hindert den Miniporttreiber nicht daran, Prüfsummen zu berechnen und in die vom LSO-Feature generierten Pakete einzufügen. Um Die Auslagerungen der Adressprüfsumme in diesem Fall zu deaktivieren, muss der Benutzer auch LSO deaktivieren.