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:

  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 Funktionen für die aktive Auslagerung ändern.

Um die Abladung der Empfangsprüfsumme (Rx) zu konfigurieren, führt der Clienttreiber folgendes aus:

  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 Funktionen für die aktive Auslagerung ändern.

Regeln zum Angeben von Hardwareübertragungsprüfsummenfunktionen

  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 die Prüfsummenauslagerung durchfü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 an, 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 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:

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:

  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 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.

  3. 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.