Condividi tramite


Offload segmentazione generica

Generic Segmentation Offload (GSO) rappresenta collettivamente LSO (Large Send Offload) e UDP Send Offload (USO).

I driver client possono eseguire l'offload della segmentazione dei pacchetti TCP/UDP maggiori dell'unità di trasmissione massima (MTU) del supporto di rete. I driver devono indicare questa funzionalità a NetAdapterCx usando le API GSO.

Parole chiave INF per controllare GSO

NetAdapterCx controlla le parole chiave del Registro di sistema e le rispetta quando abilita le funzionalità di offload attive. Il conducente non deve eseguire ulteriori azioni.

Le parole chiave LSO specificate in Uso dei valori del Registro di sistema per abilitare e disabilitare l'offload attività possono essere usate per abilitare/disabilitare l'offload LSO con un'impostazione di chiave del Registro di sistema.

Le parole chiave USO specificate in UDP Segmentation Offload (USO) possono essere usate per abilitare/disabilitare l'offload USO con un'impostazione di chiave del Registro di sistema.

I valori delle parole chiave devono essere di tipo REG_SZ.

Configurazione di GSO

I driver client annunciano prima le funzionalità GSO dell'hardware durante l'inizializzazione dell'adattatore net. Questo problema può verificarsi all'interno del callback EvtDevicePrepareHardware prima di avviare una scheda Net.

Per configurare GSO, il driver client:

  1. Alloca una struttura NET_ADAPTER_OFFLOAD_GSO_CAPABILITIES .

  2. Chiama NET_ADAPTER_OFFLOAD_GSO_CAPABILITIES_INIT per inizializzare la struttura.

  3. Chiama NetAdapterOffloadSetGsoCapabilities per registrare la struttura con NetAdapterCx.

Durante la chiamata a NET_ADAPTER_OFFLOAD_GSO_CAPABILITIES_INIT il driver client fornisce un puntatore al callback EVT_NET_ADAPTER_OFFLOAD_SET_GSO . Il sistema richiama questo callback in un secondo momento se le funzionalità di offload attivo cambiano.

Regole per indicare le funzionalità GSO hardware

Le regole seguenti si applicano alla struttura NET_ADAPTER_OFFLOAD_GSO_CAPABILITIES :

  1. Il driver deve impostare layer3Flags e Layer4Flags.

  2. Se la scheda di interfaccia di rete supporta LSO, il driver deve popolare il campo Layer4Flags con il NetAdapterOffloadLayer4FlagTcpWithoutOptions flag TCP.

  3. Se la scheda di interfaccia di rete supporta USO, il driver deve popolare il campo Layer4Flags con il NetAdapterOffloadLayer4FlagUdp flag UDP.

  4. MaximumOffloadSize e MinimumSegmentCount sono campi obbligatori.

  5. Il campo Layer4OffsetLimit è facoltativo. Se il sistema operativo invia un pacchetto con un offset di intestazione maggiore del limite specificato, non richiederà l'esecuzione di GSO.

  6. I pacchetti IP/TCP senza opzioni/estensioni devono essere supportati se sono supportate opzioni/estensioni.

In questo esempio viene illustrato come un driver client potrebbe configurare le funzionalità di offload hardware.

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

Aggiornamento degli offload hardware

Se lo stack TCP/IP o un driver di protocollo overlying richiede una modifica alle funzionalità attive dell'adattatore net, NetAdapterCx richiama il callback del driver client EVT_NET_ADAPTER_OFFLOAD_SET_GSO registrato durante l'inizializzazione dell'adapter. In questa funzione il sistema fornisce funzionalità aggiornate nell'oggetto NETOFFLOAD su cui il driver client esegue una query per aggiornare le funzionalità di offload.

I driver client possono chiamare le funzioni seguenti per determinare quali offload sono abilitati:

Nell'esempio seguente viene illustrato come un driver client potrebbe aggiornare le funzionalità di offload GSO:

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