Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
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:
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 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:
O driver deve definir o Layer3Flags e Layer4Flags.
Se a NIC suportar LSO, o driver deverá preencher o campo Layer4Flags com o sinalizador TCP
NetAdapterOffloadLayer4FlagTcpWithoutOptions.Se a NIC suportar USO, o driver deverá preencher o campo Layer4Flags com o flag UDP
NetAdapterOffloadLayer4FlagUdp.MaximumOffloadSize e MinimumSegmentCount são campos obrigatórios.
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.
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);
}