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:
Aloca uma estrutura de NET_ADAPTER_OFFLOAD_GSO_CAPABILITIES .
Chama NET_ADAPTER_OFFLOAD_GSO_CAPABILITIES_INIT para inicializar a estrutura.
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 :
O driver deve definir Layer3Flags e Layer4Flags.
Se a NIC der suporte a LSO, o driver deverá preencher o campo Layer4Flags com o
NetAdapterOffloadLayer4FlagTcpWithoutOptions
sinalizador TCP.Se a NIC der suporte ao USO, o driver deverá preencher o campo Layer4Flags com o
NetAdapterOffloadLayer4FlagUdp
sinalizador UDP.MaximumOffloadSize e MinimumSegmentCount são campos obrigatórios.
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.
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:
- NetOffloadIsLsoIPv4Enabled
- NetOffloadIsLsoIPv6Enabled
- NetOffloadIsUsoIPv4Enabled
- NetOffloadIsUsoIPv6Enabled
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);
}