Partilhar via


Descarregamento de segmentação genérica

O GSO (Generic Segmentation Offload) representa coletivamente LSO (Large Send Offload) e UDP Send Offload (USO).

Os drivers de cliente podem descarregar a segmentação de pacotes TCP/UDP que são maiores do que a unidade de transmissão máxima (MTU) do meio de rede. Os drivers devem indicar esse recurso para NetAdapterCx usando as APIs GSO.

Palavras-chave INF para controlar GSO

NetAdapterCx verifica as palavras-chave do registo e respeita-as ao ativar as capacidades ativas de offload. O motorista não precisa tomar nenhuma outra medida.

As palavras-chave de LSO especificadas em Usando valores do Registro para ativar e desativar o descarregamento de tarefas podem ser usadas para ativar/desativar o descarregamento de LSO com uma configuração de chave do Registro.

As palavras-chave USO especificadas no UDP Segmentation Offload (USO) em podem ser usadas para ativar/desativar o descarregamento de USO com uma configuração de chave de registo.

Os valores das palavras-chave devem ser do tipo REG_SZ.

Configurando o GSO

Os drivers de cliente primeiro anunciam os recursos GSO de seu hardware durante a inicialização do adaptador de rede. Isso pode ocorrer no seu retorno de chamada EvtDevicePrepareHardware antes de iniciar um adaptador de rede.

Para configurar o GSO, o controlador do cliente:

  1. Aloca uma estrutura NET_ADAPTER_OFFLOAD_GSO_CAPABILITIES.

  2. Chama NET_ADAPTER_OFFLOAD_GSO_CAPABILITIES_INIT para inicializar a estrutura.

  3. Chama NetAdapterOffloadSetGsoCapabilities para registrar a estrutura com NetAdapterCx.

Durante a chamada para NET_ADAPTER_OFFLOAD_GSO_CAPABILITIES_INIT, o driver do cliente fornece um ponteiro para o callback EVT_NET_ADAPTER_OFFLOAD_SET_GSO. O sistema invoca esta função de retorno mais tarde se as capacidades de descarregamento ativas forem alteradas.

Regras para indicar os recursos do GSO de hardware

Aplicam-se à estrutura NET_ADAPTER_OFFLOAD_GSO_CAPABILITIES as seguintes regras:

  1. O driver deve definir o Layer3Flags e Layer4Flags.

  2. Se a NIC suportar LSO, o driver deverá preencher o campo Layer4Flags com o sinalizador TCP NetAdapterOffloadLayer4FlagTcpWithoutOptions.

  3. Se a NIC suportar USO, o driver deverá preencher o campo Layer4Flags com o flag UDP NetAdapterOffloadLayer4FlagUdp.

  4. MaximumOffloadSize e MinimumSegmentCount são campos obrigatórios.

  5. O campo Layer4OffsetLimit é opcional. Se o SO enviar um pacote com um deslocamento de cabeçalho maior do que o limite especificado, ele não solicitará que o GSO seja executado.

  6. Pacotes IP/TCP sem opções/extensões devem ser suportados se opções/extensões forem suportadas.

Este exemplo mostra como um driver de cliente pode configurar seus recursos de descarregamento de 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);
}

Atualizando descarregamentos de hardware

Se a pilha TCP/IP ou um driver de protocolo sobreposto solicitar uma alteração nas capacidades ativas do adaptador de rede, o NetAdapterCx invocará o callback EVT_NET_ADAPTER_OFFLOAD_SET_GSO do driver cliente que foi registado durante a inicialização do adaptador. Nesta função, o sistema fornece recursos atualizados no objeto NETOFFLOAD que o driver cliente consulta para atualizar seus recursos de descarregamento.

Os drivers de cliente podem chamar as seguintes funções para determinar quais descarregamentos estão habilitados:

  • NetOffloadIsLsoIPv4Enabled
  • NetOffloadIsLsoIPv6Enabled
  • NetOffloadIsUsoIPv4Enabled
  • NetOffloadIsUsoIPv6Enabled

O exemplo a seguir mostra como um driver de cliente pode atualizar seus recursos de descarregamento de 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);
}