Prüfsummenabladung

Warnung

Einige Informationen in diesem Thema beziehen sich auf vorab veröffentlichte Produkte, die vor der kommerziellen Veröffentlichung erheblich geändert werden können. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.

NetAdapterCx ist nur in Windows 10 Version 2004 als Vorschauversion verfügbar.

Derzeit können NetAdapterCx-Clienttreiber nicht zertifiziert werden.

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 vor dem Auslagern der Prüfsummenberechnung für ein TCP/UDP-Paket, wie unter Offloading Checksum Tasks (Auslagern von Prüfsummentasks) beschrieben.

Das Deaktivieren von Prüfsummenabladungen, wenn die generische Segmentierungsabladung (Generic Segmentation Offload , GSO) aktiviert ist, verhindert nicht, dass der Clienttreiber Prüfsummen in Pakete berechnet und einfügt, die von der GSO-Funktion generiert werden. Um Prüfsummenabladungen vollständig zu deaktivieren, müssen Sie auch GSO deaktivieren.

INF-Schlüsselwörter zum Steuern der Prüfsummenabladung

NetAdapterCx überprüft die Registrierungsschlüsselwörter und berücksichtigt sie beim Aktivieren der Aktiven Auslagerungsfunktionen. Der Treiber muss keine weiteren Maßnahmen ergreifen.

Die prüfsummenschlüsselwörter, die unter Verwenden von Registrierungswerten zum Aktivieren und Deaktivieren der Taskabladung angegeben sind, können verwendet werden, um die Prüfsummenabladung mit einer Registrierungsschlüsseleinstellung zu aktivieren/zu deaktivieren. Gruppierte Schlüsselwörter werden nicht unterstützt.

Die Schlüsselwortwerte müssen vom Typ REG_SZ sein.

Konfigurieren der Prüfsummenabladung

Clienttreiber kündigen zunächst die Prüfsummenabladungsfunktionen ihrer Hardware während der Net Adapter-Initialisierung an. Dies kann innerhalb des EvtDevicePrepareHardware-Rückrufs auftreten, bevor ein Netzadapter gestartet wird.

Zum Konfigurieren der Übertragung (Tx)-Prüfsummenabladung hat der Clienttreiber Folgendes:

  1. Ordnet eine NET_ADAPTER_OFFLOAD_TX_CHECKSUM_CAPABILITIES-Struktur zu.

  2. Ruft NET_ADAPTER_OFFLOAD_TX_CHECKSUM_CAPABILITIES_INIT auf, um die -Struktur zu initialisieren.

  3. 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 aktiven Auslagerungsfunktionen ändern.

Um die Empfangsschecksummenabladung (Rx) zu konfigurieren, muss der Clienttreiber Folgendes durchführen:

  1. Ordnet eine NET_ADAPTER_OFFLOAD_RX_CHECKSUM_CAPABILITIES-Struktur zu.

  2. Ruft NET_ADAPTER_OFFLOAD_RX_CHECKSUM_CAPABILITIES_INIT auf, um die -Struktur zu initialisieren.

  3. 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 aktiven Auslagerungsfunktionen ändern.

Regeln zum Angeben von Prüfsummenfunktionen für Hardwareübertragungen

  1. 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 eine Prüfsummenabladung ausführen kann.

  2. 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 auf, die Prüfsumme für diese Ebene zu berechnen.

  3. 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 Prüfsummenfunktionen der Hardware ankündigt. Wenn die Prüfsummenabladung aktiviert ist, sollte die NIC die Prüfsummenabladung für alle Pakete durchführen, die sie verarbeiten kann. Wenn die NIC keine Prüfsummenabladung für ein Paket ausführen kann, wird es von NetAdapterCx in der Software ausgeladen.

Dieses Beispiel zeigt, wie ein Clienttreiber seine Hardwareprüfsummen-Auslagerungsfunktionen 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 Hardwareabladungen

Wenn der TCP/IP-Stapel oder ein Treiber mit zu vielen Protokollen eine Änderung an den aktiven Funktionen des Netzadapters anfordert, ruft NetAdapterCx die EVT_NET_ADAPTER_OFFLOAD_SET_TX_CHECKSUM des Clienttreibers oder EVT_NET_ADAPTER_OFFLOAD_SET_RX_CHECKSUM Rückruf auf, der während der Adapterinitialisierung registriert wurde. In diesen Funktionen stellt das System aktualisierte Funktionen im NETOFFLOAD-Objekt bereit, die der Clienttreiber abfragt, um seine Auslagerungsfunktionen zu aktualisieren.

Clienttreiber können die folgenden Funktionen aufrufen, um zu bestimmen, welche Prüfsummenabladungen aktiviert sind:

Das folgende Beispiel zeigt, wie ein Clienttreiber seine Tx/Rx-Prüfsummenabladungsfunktionen 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);
}

Übertragen der Prüfsummenverarbeitung

Ein Clienttreiber führt in der Regel die folgende Prüfsummenverarbeitung für den Übertragungspfad aus:

  1. Der Clienttreiber ruft die NetExtensionGetPacketChecksum-Funktion mit dem Paketindex auf, um eine NET_PACKET_CHECKSUM Struktur abzurufen.

  2. Der Clienttreiber testet die ebenenspezifischen Flags in der NET_PACKET_CHECKSUM-Struktur.

    • Wenn das Flag ist NetPacketTxChecksumActionPassthrough, sollte die NIC keine Prüfsummenvorgänge auf dieser Ebene ausführen.

    • Wenn das Flag ist NetPacketTxChecksumActionRequired, sollte der Clienttreiber das Protokoll bestimmen, das auf dieser Ebene in diesem bestimmten Paket mithilfe der NET_PACKET_LAYOUT-Struktur verwendet wird, und der NIC angeben, welche Prüfsumme für das Paket berechnet werden soll.

  3. Der Clienttreiber übergibt das Paket an die NIC, die die entsprechenden Prüfsummen für das Paket berechnet.

Empfangen der Prüfsummenverarbeitung

Bevor eine NET_PACKET Struktur für ein Empfangspaket angegeben wird, 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.