Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
GSO (descarregamento de segmentação genérica) representa coletivamente LSO (descarregamento de envio grande) e USO (descarregamento de envio de UDP).
Os drivers de cliente podem descarregar a segmentação de pacotes TCP/UDP que são maiores que a unidade máxima de transmissão (MTU) 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 respeita ao habilitar os recursos de offload ativos. O driver não precisa executar nenhuma ação adicional.
As palavras-chave LSO especificadas no uso de 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 em UDP Segmentation Offload (USO) podem ser usadas para habilitar/desabilitar o descarregamento de USO com uma configuração de chave do Registro.
Os valores da 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 de rede. Isso pode ocorrer na callback EvtDevicePrepareHardware antes de iniciar um adaptador de rede.
Para configurar o GSO, o driver cliente:
Aloca uma estrutura 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 mais tarde se os recursos de descarregamento ativo forem alterados.
Regras para indicar recursos de GSO de hardware
As regras a seguir se aplicam à estrutura de 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
NetAdapterOffloadLayer4FlagTcpWithoutOptionssinalizador TCP.Se a NIC der suporte ao USO, o driver deverá preencher o campo Layer4Flags com o
NetAdapterOffloadLayer4FlagUdpsinalizador 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 descargas de hardware
Se a pilha TCP/IP ou um driver de protocolo subjacente solicitar uma alteração nos recursos ativos do adaptador de rede, o NetAdapterCx aciona a callback EVT_NET_ADAPTER_OFFLOAD_SET_GSO do driver cliente, que foi registrada 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 seguinte exemplo 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);
}