Freigeben über


Generisches Segmentierungsoffload

Generic Segmentation Offload (GSO) stellt gemeinsam Large Send Offload (LSO) und UDP Send Offload (USO) dar.

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

INF-Schlüsselwörter zur Steuerung von GSO

NetAdapterCx überprüft die Registrierungsstichwörter und berücksichtigt diese, wenn die aktiven Offload-Funktionen aktiviert werden. Der Fahrer muss keine weiteren Maßnahmen ergreifen.

Die in Verwendung von Registrierungswerten zum Aktivieren und Deaktivieren von Task Offloading angegebenen LSO-Schlüsselwörter können zum Ein- und Ausschalten des LSO-Offloads mit einer Registrierungseinstellung verwendet werden.

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

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

Konfigurieren von GSO

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

So konfigurieren Sie GSO im Client-Treiber:

  1. Weist 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 Offload-Funktionen ändern.

Regeln für die Angabe 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 NIC USO unterstützt, muss der Treiber das Layer4Flags-Feld mit dem NetAdapterOffloadLayer4FlagUdp UDP-Flag auffüllen.

  4. MaximumOffloadSize und MinimumSegmentCount sind Pflichtfelder.

  5. Das Layer4OffsetLimit-Feld ist optional. Wenn das Betriebssystem ein Paket mit einem Headeroffset sendet, das größer als der angegebene Grenzwert ist, fordert es nicht auf, dass GSO ausgeführt werden soll.

  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 Hardware offload-Funktionen 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);
}

Aktualisierung von Hardware-Offloads

Wenn der TCP/IP-Stapel oder ein übergeordneter Protokolltreiber eine Änderung an den aktiven Fähigkeiten des Netzadapters 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 Offload-Funktionen zu aktualisieren.

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

Das folgende Beispiel zeigt, wie ein Clienttreiber seine GSO-Offloadfunktionen 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);
}