Freigeben über


Receive Segment Coalescing (RSC) Offload

Beim Empfangen von Daten müssen die meisten Ebenen im TCP/IP-Stack die Kopfzeileninformationen der einzelnen Segmente separat betrachten. Dadurch entsteht ein großer Aufwand, wenn große Datenmengen empfangen werden.

Mit Receive Segment Coalescing (RSC) wird dieser Aufwand reduziert, indem eine Abfolge von empfangenen Segmenten kombiniert wird und der TCP/IP-Stack in einem einzigen zusammengefassten Segment angegeben wird. Die oberen Ebenen im TCP/IP-Stack müssen nur einen Header für die gesamte Sequenz betrachten.

Eine Netzwerkschnittstellenkarte (NIC), die RSC in der Hardware unterstützt, kann die Leistung des Empfangspfads erheblich verbessern. Es kann auch die CPU-Auslastung des Hosts reduzieren, da es die Protokollschicht von der RSC in Software befreit.

Weitere Informationen zu RSC finden Sie in der Übersicht zu Receive Segment Coalescing.

NetAdapterCX unterstützt ab Version 2.5 auch UDP RSC (URO). Weitere Informationen finden Sie unter UDP RSC-Offload (URO).

INF-Schlüsselwörter zur Steuerung des RSC-Offloads

NetAdapterCx überprüft die Registrierungsschlüsselwörter und berücksichtigt diese, wenn die Funktionen für den aktiven Offload aktiviert werden. Der Treiber muss keine weiteren Maßnahmen ergreifen.

Die unter Standardisierte INF-Schlüsselwörter für RSC angegebenen RSC-Schlüsselwörter können zum Aktivieren/Deaktivieren des RSC-Offloads mit einer Registrierungsschlüsseleinstellung verwendet werden.

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

Konfigurieren des RSC-Offloads

Clienttreiber kündigen zunächst die RSC-Funktionen ihrer Hardware während der Netzadapterinitialisierung an. Dies kann innerhalb ihres EvtDevicePrepareHardware-Rückrufs auftreten, bevor ein Netzadapter gestartet wird.

Um RSC-Funktionen zu konfigurieren, verwenden Sie den Clienttreiber:

  1. Weist eine NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES-Struktur zu.

  2. Ruft NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES_INIT auf, um die Struktur zu initialisieren.

  3. Ruft NetAdapterOffloadSetRscCapabilities auf, um die Struktur bei NetAdapterCx zu registrieren.

Während des Aufrufs von NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES_INIT stellt der Clienttreiber einen Zeiger auf den EVT_NET_ADAPTER_OFFLOAD_SET_RSC-Rückruf bereit. Das System ruft diesen Rückruf später auf, wenn sich die aktiven Offload-Funktionen ändern.

Regeln für die Angabe von Hardware-RSC-Funktionen

  1. Clienttreiber dürfen KEINE Software-RSC für einen Datenverkehrstyp ausführen, der keine Hardwareunterstützung in der NIC hat.

Die folgenden Regeln gelten für die NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES-Struktur:

  1. NetAdapterOffloadLayer3FlagIPv4NoOptions und NetAdapterOffloadLayer3FlagIPv6NoExtensions sind die einzigen gültigen Werte für das Layer3Flags-Feld. Diese Flags geben die IPv4- bzw. IPv6-Unterstützung an.

  2. NetAdapterOffloadLayer4FlagTcpNoOptions und NetAdapterOffloadLayer4FlagUdp sind die einzigen gültigen Werte für das Layer4Flags-Feld. Diese Flags geben die TCP- bzw. UDP-Unterstützung an.

  3. Layer 3-Flags müssen festgelegt werden, wenn das Flag NetAdapterOffloadLayer4FlagTcpNoOptions festgelegt ist.

  4. Das Feld TcpTimestampOption ist optional. Clienttreiber legen dieses Feld nach dem Aufrufen von NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES_INIT und vor dem Aufrufen von NetAdapterOffloadSetRscCapabilities fest, um anzugeben, ob die NIC die TCP-Zeitstempeloption unterstützt.

Das folgende Beispiel zeigt, wie ein Clienttreiber seine RSC-Hardware-Offload-Funktionen einrichten kann.

VOID
MyAdapterSetRscOffloadCapabilities(
    NETADAPTER NetAdapter
)
{
    // Configure the hardware's RSC offload capabilities
    NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES rscOffloadCapabilities;
    NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES_INIT(
        &rscOffloadCapabilities,
        NetAdapterOffloadLayer3FlagIPv4NoOptions | NetAdapterOffloadLayer3FlagIPv6NoExtensions,
        NetAdapterOffloadLayer4FlagTcpNoOptions,
        MyEvtAdapterOffloadSetRsc);
    rscOffloadCapabilities.TcpTimestampOption = FALSE;

    // Set the current RSC offload capabilities and register the callback for future changes in active capabilities
    NetAdapterOffloadSetRscCapabilities(NetAdapter, &rscOffloadCapabilities);
}

Aktualisieren von RSC-Hardware-Offloads

Wenn der TCP/IP-Stack oder ein zugrunde liegender Protokolltreiber eine Änderung an den aktiven RSC-Funktionen des Netzadapters anfordert, ruft NetAdapterCx den EVT_NET_ADAPTER_OFFLOAD_SET_RSC-Rückruf des Clienttreibers auf, der in NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES registriert wurde. In diesem Rückruf stellt das System aktualisierte Funktionen im NETOFFLOAD-Objekt bereit, das der Clienttreiber abfragen kann, um seine Offload-Funktionen zu aktualisieren.

Clienttreiber können die folgenden Funktionen aufrufen, um zu bestimmen, welche RSC-Offloads aktiviert sind:

Das folgende Beispiel zeigt, wie ein Clienttreiber seine RSC-Offloadfunktionen aktualisieren kann:

VOID
MyEvtAdapterOffloadSetRsc(
    NETADAPTER NetAdapter,
    NETOFFLOAD Offload
)
{
    PMY_NET_ADAPTER_CONTEXT adapterContext = NetvAdapterGetContext(NetAdapter);

    // Store the updated information in the context
    adapterContext->IsRscIPv4Enabled = NetOffloadIsTcpRscIPv4Enabled(Offload);
    adapterContext->IsRscIPv6Enabled = NetOffloadIsTcpRscIPv6Enabled(Offload);
    adapterContext->IsRscTcpTimestampOptionEnabled = NetOffloadIsRscTcpTimestampOptionEnabled(Offload);
}

UDP RSC-Offload (URO)

URO ermöglicht die Kopplung von empfangenen UDP-Segmenten. NICs können UDP-Datagramme aus demselben Fluss kombinieren, der mit einer Reihe von Regeln in einem logisch zusammenhängenden Puffer übereinstimmt. Diese kombinierten Datagramme werden dann als einzelnes großes Paket für den Windows-Netzwerkstapel angegeben. Informationen zu URO-Regeln finden Sie unter Regeln zum Zusammensetzen von UDP-Paketen.

Das im INF-Schlüsselwort für die Steuerung von URO angegebene URO-Schlüsselwort kann verwendet werden, um URO mit einer Registrierungsschlüsseleinstellung zu aktivieren/deaktivieren.

NetAdapterCx-Clienttreiber können die vorhandenen RSC-Strukturen und die RSC-API für URO verwenden. Um URO zu konfigurieren, müssen Clienttreiber das Layer4Flags-Feld in der NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES-Struktur auf NetAdapterOffloadLayer4FlagUdp festlegen.

URO-Verhalten spiegelt RSC mit einer Ausnahme. Wenn der EVT_NET_ADAPTER_OFFLOAD_SET_RSC-Rückruf URO deaktiviert, muss der Treiber vorhandene zusammengesetzte Segmente angeben und warten, bis alle ausstehenden URO-Indikationen abgeschlossen sind. Dieser Ansatz stellt sicher, dass es keine URO-Indikationen gibt, die aktiv sind, sobald der Rückruf zurückgegeben wird.