Delen via


Algemene segmentatie-offload

Algemene segmentatie-offload (GSO) vertegenwoordigt gezamenlijk LSO- (Large Send Offload) en UDP Send Offload (USO).

Clientstuurprogramma's kunnen de segmentatie van TCP/UDP-pakketten die groter zijn dan de maximale transmissie-eenheid (MTU) van het netwerkmedium offloaden. Stuurprogramma's moeten deze mogelijkheid aangeven voor NetAdapterCx met behulp van de GSO-API's.

INF-trefwoorden voor het beheren van GSO

NetAdapterCx controleert de registertrefwoorden en respecteert deze bij het inschakelen van de actieve offload-functionaliteiten. De bestuurder hoeft geen verdere actie te ondernemen.

De LSO-trefwoorden die zijn opgegeven in Registerwaarden gebruiken om taakoffloading in en uit te schakelen kunnen worden gebruikt om de LSO-offload in of uit te schakelen met een registerinstelling.

De USO-trefwoorden die zijn opgegeven in UDP Segmentation Offload (USO) kunnen worden gebruikt om de USO-offload in of uit te schakelen met een registersleutelinstelling.

De trefwoordwaarden moeten van het type REG_SZzijn.

GSO configureren

Clientstuurprogramma's adverteren eerst de GSO-mogelijkheden van hun hardware tijdens de initialisatie van de netadapter. Dit kan gebeuren binnen de EvtDevicePrepareHardware callback voordat men een netwerkadapter start.

Om GSO te configureren, moet het clientstuurprogramma:

  1. Wijst een NET_ADAPTER_OFFLOAD_GSO_CAPABILITIES structuur toe.

  2. Roept NET_ADAPTER_OFFLOAD_GSO_CAPABILITIES_INIT aan om de structuur te initialiseren.

  3. Roept NetAdapterOffloadSetGsoCapabilities aan om de structuur te registreren bij NetAdapterCx.

Tijdens het aanroepen van NET_ADAPTER_OFFLOAD_GSO_CAPABILITIES_INIT geeft het clientstuurprogramma een aanwijzer naar de EVT_NET_ADAPTER_OFFLOAD_SET_GSO callback. Het systeem roept deze callback later aan als de actieve offloadmogelijkheden veranderen.

Regels voor het aangeven van hardware GSO-mogelijkheden

De volgende regels zijn van toepassing op de NET_ADAPTER_OFFLOAD_GSO_CAPABILITIES structuur:

  1. Het stuurprogramma moet de Layer3Flags- en Layer4Flags-instellen.

  2. Als de NIC LSO ondersteunt, moet het stuurprogramma het veld Layer4Flags vullen met de NetAdapterOffloadLayer4FlagTcpWithoutOptions TCP-vlag.

  3. Als de NIC USO ondersteunt, moet het stuurprogramma het veld Layer4Flags vullen met de NetAdapterOffloadLayer4FlagUdp UDP-vlag.

  4. MaximumOffloadSize en MinimumSegmentCount zijn verplichte velden.

  5. Het veld Layer4OffsetLimit is optioneel. Als het besturingssysteem een pakket verzendt met een header-offset die groter is dan de opgegeven limiet, wordt niet gevraagd om GSO uit te voeren.

  6. IP-/TCP-pakketten zonder opties/extensies moeten worden ondersteund als opties/extensies worden ondersteund.

In dit voorbeeld ziet u hoe een clientstuurprogramma de hardware-offloadmogelijkheden kan instellen.

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);
}

Bijwerken van hardware-offloadmogelijkheden

Als de TCP/IP-stack of een overliggend protocolstuurprogramma een wijziging aanvraagt in de actieve mogelijkheden van de netadapter, roept NetAdapterCx de EVT_NET_ADAPTER_OFFLOAD_SET_GSO callback van het clientstuurprogramma aan die is geregistreerd tijdens de initialisatie van de adapter. In deze functie levert het systeem bijgewerkte mogelijkheden in het NETOFFLOAD-object waarop het clientstuurprogramma query's uitvoert om de offloadmogelijkheden bij te werken.

Clientstuurprogramma's kunnen de volgende functies aanroepen om te bepalen welke offloads zijn ingeschakeld:

In het volgende voorbeeld ziet u hoe een clientstuurprogramma de GSO-offloadmogelijkheden kan bijwerken:

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);
}