RsC-Auslagerung (Receive Segment Coalescing)

Beim Empfangen von Daten müssen die meisten Ebenen im TCP/IP-Stapel die Headerinformationen jedes Segments separat betrachten. Dadurch entsteht ein großer Aufwand, wenn große Datenmengen empfangen werden.

Das Koalescing des Empfangenssegments (Receive Segment Coalescing, RSC) reduziert diesen Mehraufwand, indem eine Sequenz empfangener Segmente zusammengeflechtet und in einem einzigen zusammengeflechteten Segment den TCP/IP-Stapel angezeigt wird. Die oberen Ebenen im TCP/IP-Stapel müssen nur einen Header für die gesamte Sequenz betrachten. Eine Netzwerkschnittstelle Karte (NIC), die RSC in Hardware unterstützt, kann die Leistung des Empfangspfads erheblich verbessern. Es kann auch die CPU-Auslastung des Hosts reduzieren, da die Protokollebene von RSC in Software befreit wird.

Weitere Informationen zu RSC finden Sie unter Übersicht über das Zusammenwachsen von Empfangssegmenten.

INF-Schlüsselwörter zum Steuern der RSC-Auslagerung

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 in Standardized INF Keywords for RSC angegebenen RSC-Schlüsselwörter können verwendet werden, um die RSC-Auslagerung mit einer Registrierungsschlüsseleinstellung zu aktivieren/zu deaktivieren.

Die Schlüsselwort (keyword) Werte müssen vom Typ REG_SZ sein.

Konfigurieren der RSC-Auslagerung

Clienttreiber kündigen zuerst die RSC-Funktionen ihrer Hardware während der Netzadapterinitialisierung an. Dies kann innerhalb des EvtDevicePrepareHardware-Rückrufs vor dem Starten eines Netzadapters auftreten.

Um RSC-Funktionen zu konfigurieren, muss der Clienttreiber folgendes verwenden:

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

Regeln zum Angeben von Hardware-RSC-Funktionen

  1. Clienttreiber dürfen keineSoftware-RSC für jegliche Art von Datenverkehr ausführen, für die keine Hardwareunterstützung in der NIC vorhanden ist.

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 weisen auf IPv4- bzw. IPv6-Unterstützung hin.

  2. NetAdapterOffloadLayer4FlagTcpNoOptions ist der einzige gültige Wert für das Layer4Flags-Feld .

  3. Flags der Ebene 3 müssen festgelegt werden, wenn das NetAdapterOffloadLayer4FlagTcpNoOptions Flag festgelegt ist.

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

Das folgende Beispiel zeigt, wie ein Clienttreiber seine RSC-Hardwareauslagerungsfunktionen 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-Hardwareauslagerungen

Wenn der TCP/IP-Stapel oder ein überlastender Protokolltreiber eine Änderung der aktiven RSC-Funktionen des Netzwerkadapters 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, die der Clienttreiber abfragen kann, um seine Auslagerungsfunktionen zu aktualisieren.

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

Die folgenden Beispiele zeigen, wie ein Clienttreiber seine RSC-Auslagerungsfunktionen 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);
}