Prüfsummenauslagerung
NetAdapterCx unterstützt das Auslagern von TCP/IP-Prüfsummentasks zur Laufzeit.
Bevor der TCP/IP-Transport eine NET_PACKET-Struktur an den Clienttreiber übergibt, gibt er die Prüfsummeninformationen an, die dem NET_PACKET in einer NET_PACKET_CHECKSUM Paketerweiterung zugeordnet sind.
Der TCP/IP-Transport berechnet die Komplementsumme für den TCP/UDP-Pseudoheader, bevor die Prüfsummenberechnung für ein TCP/UDP-Paket ausgeladen wird, wie unter Ausladen von Prüfsummentasks beschrieben.
Das Deaktivieren von Prüfsummenausladungen, wenn die generische Segmentierungsausladung (GSO ) aktiviert ist, verhindert nicht, dass der Clienttreiber Prüfsummen in Pakete einfügt, die vom GSO-Feature generiert werden. Um Prüfsummenauslagerungen vollständig zu deaktivieren, müssen Sie auch GSO deaktivieren.
INF-Schlüsselwörter zum Steuern der Prüfsummenauslagerung
NetAdapterCx überprüft die Registrierungsschlüsselwörter und berücksichtigt diese beim Aktivieren der aktiven Auslagerungsfunktionen. Der Treiber muss keine weiteren Maßnahmen ergreifen.
Die unter Verwenden von Registrierungswerten zum Aktivieren und Deaktivieren der Aufgabenauslagerung angegebenen Prüfsummenschlüsselwörter können verwendet werden, um die Prüfsummenauslagerung mit einer Registrierungsschlüsseleinstellung zu aktivieren/zu deaktivieren. Gruppierte Schlüsselwörter werden nicht unterstützt.
Die Schlüsselwort (keyword) Werte müssen vom Typ REG_SZ sein.
Konfigurieren der Prüfsummenauslagerung
Clienttreiber kündigen zuerst die Prüfsummenauslagerungsfunktionen ihrer Hardware während der Netzadapterinitialisierung an. Dies kann innerhalb des EvtDevicePrepareHardware-Rückrufs vor dem Starten eines Netzadapters auftreten.
Um die Tx-Prüfsummenabladung zu konfigurieren, führt der Clienttreiber Folgendes aus:
Ordnet eine NET_ADAPTER_OFFLOAD_TX_CHECKSUM_CAPABILITIES-Struktur zu.
Ruft NET_ADAPTER_OFFLOAD_TX_CHECKSUM_CAPABILITIES_INIT auf, um die Struktur zu initialisieren.
Ruft NetAdapterOffloadSetTxChecksumCapabilities auf, um die Struktur bei NetAdapterCx zu registrieren.
Während des Aufrufs von NET_ADAPTER_OFFLOAD_TX_CHECKSUM_CAPABILITIES_INIT stellt der Clienttreiber einen Zeiger auf den EVT_NET_ADAPTER_OFFLOAD_SET_TX_CHECKSUM Rückruf bereit. Das System ruft diesen Rückruf später auf, wenn sich die Funktionen für die aktive Auslagerung ändern.
Um die Abladung der Empfangsprüfsumme (Rx) zu konfigurieren, führt der Clienttreiber folgendes aus:
Ordnet eine NET_ADAPTER_OFFLOAD_RX_CHECKSUM_CAPABILITIES-Struktur zu.
Ruft NET_ADAPTER_OFFLOAD_RX_CHECKSUM_CAPABILITIES_INIT auf, um die Struktur zu initialisieren.
Ruft NetAdapterOffloadSetRxChecksumCapabilities auf, um die Struktur bei NetAdapterCx zu registrieren.
Während des Aufrufs von NET_ADAPTER_OFFLOAD_RX_CHECKSUM_CAPABILITIES_INIT stellt der Clienttreiber einen Zeiger auf den EVT_NET_ADAPTER_OFFLOAD_SET_RX_CHECKSUM Rückruf bereit. Das System ruft diesen Rückruf später auf, wenn sich die Funktionen für die aktive Auslagerung ändern.
Regeln zum Angeben von Hardwareübertragungsprüfsummenfunktionen
Die Layer3Flags in der NET_ADAPTER_OFFLOAD_TX_CHECKSUM_CAPABILITIES-Struktur müssen festgelegt werden. Das Festlegen von Layer4Flags ist optional. Durch Festlegen von Layer3Flags und Layer4Flags werden die Pakete angegeben, für die die NIC die Prüfsummenauslagerung durchführen kann.
Layer3HeaderOffsetLimit und Layer4HeaderOffsetLimit in NET_ADAPTER_OFFLOAD_TX_CHECKSUM_CAPABILITIES sind optional. Wenn das Betriebssystem ein Paket mit einem Headeroffset sendet, das den angegebenen Grenzwert überschreitet, fordert es die NIC nicht an, die Prüfsumme für diese Ebene zu berechnen.
IP/TCP-Pakete ohne Optionen/Erweiterungen müssen unterstützt werden, wenn Optionen/Erweiterungen unterstützt werden.
Regeln zum Angeben von Hardware-Empfangsprüfsummenfunktionen
NetAdapterCx erfordert nicht, dass der Treiber die Hardware für die Prüfsummenfunktionen ankündigen kann. Wenn die Prüfsummenauslagerung aktiviert ist, sollte die NIC eine Prüfsummenauslagerung für alle Pakete ausführen, die sie verarbeiten kann. Wenn die NIC keine Prüfsummenauslagerung für ein Paket durchführen kann, wird es von NetAdapterCx in Software entladen.
In diesem Beispiel wird gezeigt, wie ein Clienttreiber seine Hardwareprüfsummenauslagerungsfunktionen einrichten kann:
VOID
MyAdapterSetOffloadCapabilities(
NETADAPTER NetAdapter
)
{
// Configure the hardware's Tx checksum offload capabilities
NET_ADAPTER_OFFLOAD_TX_CHECKSUM_CAPABILITIES txChecksumOffloadCapabilities;
auto const layer3Flags = NetAdapterOffloadLayer3FlagIPv4NoOptions |
NetAdapterOffloadLayer3FlagIPv4WithOptions |
NetAdapterOffloadLayer3FlagIPv6NoExtensions |
NetAdapterOffloadLayer3FlagIPv6WithExtensions;
auto const layer4Flags = NetAdapterOffloadLayer4FlagTcpNoOptions |
NetAdapterOffloadLayer4FlagTcpWithOptions |
NetAdapterOffloadLayer4FlagUdp;
NET_ADAPTER_OFFLOAD_TX_CHECKSUM_CAPABILITIES_INIT(
&txChecksumOffloadCapabilities,
layer3Flags,
EvtAdapterOffloadSetTxChecksum);
txChecksumOffloadCapabilities.Layer4Flags = layer4Flags;
txChecksumOffloadCapabilities.Layer4HeaderOffsetLimit = 127;
// Set the current Tx checksum offload capabilities and register the callback for future changes in active capabilities
NetAdapterOffloadSetTxChecksumCapabilities(NetAdapter,
&txChecksumOffloadCapabilities);
// Configure the hardware's Rx checksum offload capabilities
NET_ADAPTER_OFFLOAD_RX_CHECKSUM_CAPABILITIES rxChecksumOffloadCapabilities;
NET_ADAPTER_OFFLOAD_RX_CHECKSUM_CAPABILITIES_INIT(
&rxChecksumOffloadCapabilities,
EvtAdapterOffloadSetRxChecksum);
// Set the current Rx checksum offload capabilities and register the callback for future changes in active capabilities
NetAdapterOffloadSetRxChecksumCapabilities(NetAdapter,
&rxChecksumOffloadCapabilities);
}
Aktualisieren von Hardwareauslagerungen
Wenn der TCP/IP-Stapel oder ein überlastender Protokolltreiber eine Änderung der aktiven Funktionen des Netzwerkadapters anfordert, ruft NetAdapterCx den EVT_NET_ADAPTER_OFFLOAD_SET_TX_CHECKSUM oder EVT_NET_ADAPTER_OFFLOAD_SET_RX_CHECKSUM Rückruf des Clienttreibers auf, der während der Adapterinitialisierung registriert wurde. In diesen Funktionen stellt das System aktualisierte Funktionen im NETOFFLOAD-Objekt bereit, das der Clienttreiber abfragt, um seine Auslagerungsfunktionen zu aktualisieren.
Clienttreiber können die folgenden Funktionen aufrufen, um zu bestimmen, welche Prüfsummenauslagerungen aktiviert sind:
- NetOffloadIsTxChecksumIPv4Enabled
- NetOffloadIsTxChecksumTcpEnabled
- NetOffloadIsTxChecksumUdpEnabled
- NetOffloadIsRxChecksumIPv4Enabled
- NetOffloadIsRxChecksumTcpEnabled
- NetOffloadIsRxChecksumUdpEnabled
Das folgende Beispiel zeigt, wie ein Clienttreiber seine Tx/Rx-Prüfsummenauslagerungsfunktionen aktualisieren kann:
VOID
MyEvtAdapterOffloadSetTxChecksum(
NETADAPTER NetAdapter,
NETOFFLOAD Offload
)
{
PMY_NET_ADAPTER_CONTEXT adapterContext = MyGetNetAdapterContext(NetAdapter);
// Store the updated information in the context
adapterContext->TxHardwareIpChecksum = NetOffloadIsTxChecksumIPv4Enabled(Offload);
adapterContext->TxHardwareTcpChecksum = NetOffloadIsTxChecksumTcpEnabled(Offload);
adapterContext->TxHardwareUdpChecksum = NetOffloadIsTxChecksumUdpEnabled(Offload);
// Update the new hardware Tx checksum offload capabilities
MyUpdateHardwareChecksum(adapterContext);
}
VOID
MyEvtAdapterOffloadSetRxChecksum(
NETADAPTER NetAdapter,
NETOFFLOAD Offload
)
{
PMY_NET_ADAPTER_CONTEXT adapterContext = MyGetNetAdapterContext(NetAdapter);
// Store the updated information in the context
adapterContext->RxHardwareIpChecksum = NetOffloadIsRxChecksumIPv4Enabled(Offload);
adapterContext->RxHardwareTcpChecksum = NetOffloadIsRxChecksumTcpEnabled(Offload);
adapterContext->RxHardwareUdpChecksum = NetOffloadIsRxChecksumUdpEnabled(Offload);
// Update the new hardware Rx checksum offload capabilities
MyUpdateHardwareChecksum(adapterContext);
}
Übertragungsprüfsummenverarbeitung
Ein Clienttreiber führt in der Regel die folgende Prüfsummenverarbeitung für den Übertragungspfad durch:
Der Clienttreiber ruft die NetExtensionGetPacketChecksum-Funktion mit dem Paketindex auf, um eine NET_PACKET_CHECKSUM Struktur abzurufen.
Der Clienttreiber testet die ebenenspezifischen Flags in der NET_PACKET_CHECKSUM-Struktur.
Wenn das Flag lautet
NetPacketTxChecksumActionPassthrough
, sollte die NIC keine Prüfsummenvorgänge auf dieser Ebene ausführen.Wenn das Flag lautet
NetPacketTxChecksumActionRequired
, sollte der Clienttreiber das Protokoll ermitteln, das auf dieser Ebene in diesem spezifischen Paket mithilfe der NET_PACKET_LAYOUT-Struktur verwendet wird, und der NIC angeben, welche Prüfsumme für das Paket berechnet werden soll.
Der Clienttreiber übergibt das Paket an die NIC, die die entsprechenden Prüfsummen für das Paket berechnet.
Empfangen der Prüfsummenverarbeitung
Bevor er eine NET_PACKET Struktur für ein Empfangspaket angibt, für das Prüfsummenaufgaben ausgeführt werden, überprüft der Clienttreiber die Prüfsummen und legt die entsprechenden Flags in der NET_PACKET_CHECKSUM-Struktur fest.
Die Flags können eines der folgenden sein:
Flag | Beschreibung |
---|---|
NetPacketRxChecksumEvaluationNotChecked |
Die NIC konnte die Prüfsumme des Pakets nicht überprüfen. |
NetPacketRxChecksumEvaluationValid |
Die Prüfsumme des Pakets ist gültig. |
NetPacketRxChecksumEvaluationInvalid |
Die Prüfsumme des Pakets ist ungültig. |