Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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:
Weist eine NET_ADAPTER_OFFLOAD_GSO_CAPABILITIES Struktur zu.
Ruft NET_ADAPTER_OFFLOAD_GSO_CAPABILITIES_INIT auf, um die Struktur zu initialisieren.
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 :
Der Treiber muss die Layer3Flags und Layer4Flags festlegen.
Wenn die NIC LSO unterstützt, muss der Treiber das Layer4Flags-Feld mit dem
NetAdapterOffloadLayer4FlagTcpWithoutOptionsTCP-Flag auffüllen.Wenn die NIC USO unterstützt, muss der Treiber das Layer4Flags-Feld mit dem
NetAdapterOffloadLayer4FlagUdpUDP-Flag auffüllen.MaximumOffloadSize und MinimumSegmentCount sind Pflichtfelder.
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.
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:
- NetOffloadIsLsoIPv4Enabled
- NetOffloadIsLsoIPv6Enabled
- NetOffloadIsUsoIPv4Enabled
- NetOffloadIsUsoIPv6Enabled
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);
}