Descarregamento de segmentação genérica

O GSO (Descarregamento de Segmentação Genérica) representa coletivamente O LSO (Descarregamento de Envio Grande) e o USO (descarregamento de envio de UDP).

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

Palavras-chave INF para controlar o GSO

NetAdapterCx verifica as palavras-chave do Registro e as honra ao habilitar os recursos de descarregamento ativos. O driver não precisa executar nenhuma ação adicional.

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

As palavras-chave USO especificadas no USO (descarregamento de segmentação UDP) podem ser usadas para habilitar/desabilitar o descarregamento uso com uma configuração de chave do Registro.

Os valores de palavra-chave devem ser do tipo REG_SZ.

Configurando o GSO

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

Para configurar o GSO, o driver do cliente:

  1. Aloca uma estrutura de 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 cliente fornece um ponteiro para o retorno de chamada EVT_NET_ADAPTER_OFFLOAD_SET_GSO . O sistema invocará esse retorno de chamada posteriormente se os recursos de descarregamento ativo forem alterados.

Regras para indicar recursos de GSO de hardware

As seguintes regras se aplicam à estrutura NET_ADAPTER_OFFLOAD_GSO_CAPABILITIES :

  1. O driver deve definir Layer3Flags e Layer4Flags.

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

  3. Se a NIC der suporte ao USO, o driver deverá preencher o campo Layer4Flags com o NetAdapterOffloadLayer4FlagUdp sinalizador UDP.

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

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

  6. Pacotes IP/TCP sem opções/extensões devem ter suporte se houver suporte para opções/extensões.

Este exemplo mostra como um driver 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 nos recursos ativos do adaptador líquido, NetAdapterCx invocará o retorno de chamada EVT_NET_ADAPTER_OFFLOAD_SET_GSO do driver cliente que foi registrado durante a inicialização do adaptador. Nessa função, o sistema fornece recursos atualizados no objeto NETOFFLOAD que o driver cliente consulta para atualizar seus recursos de descarregamento.

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

O exemplo a seguir mostra como um driver 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);
}