Generische Segmentierungsauslagerung

Generic Segmentation Offload (GSO) steht zusammen für Large Send Offload (LSO) und UDP Send Offload (USO).

Clienttreiber können die Segmentierung von TCP/UDP-Paketen auslagern, die größer als die maximale Übertragungseinheit (Maximum Transmission Unit, MTU) des Netzwerkmediums sind. Treiber müssen diese Funktion für NetAdapterCx mithilfe der GSO-APIs angeben.

INF-Schlüsselwörter zum Steuern von GSO

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 unter Verwenden von Registrierungswerten zum Aktivieren und Deaktivieren der Aufgabenauslagerung angegebenen LSO-Schlüsselwörter können verwendet werden, um die LSO-Auslagerung mit einer Registrierungsschlüsseleinstellung zu aktivieren/zu deaktivieren.

Die in UDP Segmentation Offload (USO) angegebenen USO-Schlüsselwörter können verwendet werden, um die USO-Auslagerung mit einer Registrierungsschlüsseleinstellung zu aktivieren/zu deaktivieren.

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

Konfigurieren von GSO

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

Um GSO zu konfigurieren, muss der Clienttreiber folgendes verwenden:

  1. Ordnet eine NET_ADAPTER_OFFLOAD_GSO_CAPABILITIES-Struktur zu.

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

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

Während des Aufrufs von NET_ADAPTER_OFFLOAD_GSO_CAPABILITIES_INIT stellt der Clienttreiber einen Zeiger auf den EVT_NET_ADAPTER_OFFLOAD_SET_GSO Rückruf bereit. Das System ruft diesen Rückruf später auf, wenn sich die Aktiven Auslagerungsfunktionen ändern.

Regeln zum Angeben von Hardware-GSO-Funktionen

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

  1. Der Treiber muss die Layer3Flags und Layer4Flags festlegen.

  2. Wenn die NIC LSO unterstützt, muss der Treiber das Layer4Flags-Feld mit dem NetAdapterOffloadLayer4FlagTcpWithoutOptions TCP-Flag auffüllen.

  3. Wenn die Netzwerkkarte USO unterstützt, muss der Treiber das Layer4Flags-Feld mit dem NetAdapterOffloadLayer4FlagUdp UDP-Flag auffüllen.

  4. MaximumOffloadSize und MinimumSegmentCount sind Pflichtfelder.

  5. Das Feld Layer4OffsetLimit ist optional. Wenn das Betriebssystem ein Paket mit einem Headeroffset sendet, das den angegebenen Grenzwert überschreitet, fordert es keine GSO-Ausführung auf.

  6. IP/TCP-Pakete ohne Optionen/Erweiterungen müssen unterstützt werden, wenn Optionen/Erweiterungen unterstützt werden.

In diesem Beispiel wird gezeigt, wie ein Clienttreiber seine Hardwareauslagerungsfunktionen einrichten kann.

VOID
MyAdapterSetOffloadCapabilities(
    NETADAPTER NetAdapter
)
{
    // Configure the hardware's GSO offload capabilities
    NET_ADAPTER_OFFLOAD_GSO_CAPABILITIES gsoOffloadCapabilities;

    auto const layer3Flags = NetAdapterOffloadLayer3FlagIPv4NoOptions |
        NetAdapterOffloadLayer3FlagIPv4WithOptions |
        NetAdapterOffloadLayer3FlagIPv6NoExtensions |
        NetAdapterOffloadLayer3FlagIPv6WithExtensions;

    auto const layer4Flags = NetAdapterOffloadLayer4FlagTcpNoOptions |
        NetAdapterOffloadLayer4FlagTcpWithOptions;
        NetAdapterOffloadLayer4FlagUdp;

    NET_ADAPTER_OFFLOAD_GSO_CAPABILITIES_INIT(
        &gsoOffloadCapabilities,
        layer3Flags,
        layer4Flags,
        MY_GSO_OFFLOAD_MAX_SIZE,
        MY_GSO_OFFLOAD_MIN_SEGMENT_COUNT,
        EvtAdapterOffloadSetGso);

    gsoOffloadCapabilities.Layer4OffsetLimit = 127;

    // Set the current GSO offload capabilities and register the callback for future changes in active capabilities
    NetAdapterOffloadSetGsoCapabilities(NetAdapter, &gsoOffloadCapabilities);
}

Aktualisieren von Hardwareauslagerungen

Wenn der TCP/IP-Stapel oder ein übersteigender Protokolltreiber eine Änderung der aktiven Funktionen des Netzwerkadapters anfordert, ruft NetAdapterCx den EVT_NET_ADAPTER_OFFLOAD_SET_GSO Rückruf des Clienttreibers auf, der während der Adapterinitialisierung registriert wurde. In dieser Funktion 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 Auslagerungen aktiviert sind:

Das folgende Beispiel zeigt, wie ein Clienttreiber seine GSO-Auslagerungsfunktionen aktualisieren kann:

VOID
MyEvtAdapterOffloadSetGso(
	NETADAPTER NetAdapter,
	NETOFFLOAD Offload
)
{
	PMY_NET_ADAPTER_CONTEXT adapterContext = MyGetNetAdapterContext(NetAdapter);

	// Store the updated information in the context
	adapterContext->LSOv4 = NetOffloadIsLsoIPv4Enabled(Offload) ? 
		GsoOffloadEnabled : GsoOffloadDisabled;
	adapterContext->LSOv6 = NetOffloadIsLsoIPv6Enabled(Offload) ?
		GsoOffloadEnabled : GsoOffloadDisabled;
	adapterContext->USOv4 = NetOffloadIsUsoIPv4Enabled(Offload) ? 
		GsoOffloadEnabled : GsoOffloadDisabled;
	adapterContext->USOv6 = NetOffloadIsUsoIPv6Enabled(Offload) ?
		GsoOffloadEnabled : GsoOffloadDisabled;

	// Enable hardware checksum if LSO/USO is enabled
	MyUpdateHardwareChecksum(adapterContext);
}