Descarregamento RSC (Receive Segment Coalescing)
Ao receber dados, a maioria das camadas na pilha TCP/IP deve examinar as informações de cabeçalho de cada segmento separadamente. Isso cria uma grande quantidade de sobrecarga quando grandes quantidades de dados estão sendo recebidas.
O recurso RSC (Receive Segment Coalescing) reduz essa sobrecarga fazendo a coalescência de uma sequência de segmentos recebidos e os indicando até a pilha TCP/IP em um único segmento coalescido. As camadas superiores na pilha TCP/IP só precisam examinar um cabeçalho para toda a sequência.
Uma placa de rede (NIC) compatível com RSC no hardware pode melhorar muito o desempenho do caminho de recebimento. Ela também pode reduzir a utilização da CPU do host, pois libera a camada de protocolo de fazer o RSC no software.
Para obter mais detalhes sobre o RSC, consulte Visão geral sobre Receive Segment Coalescing.
NetAdapterCX também é compatível com UDP RSC (URO) a partir da versão 2.5. Para obter mais detalhes, consulte UDP RSC Offload (URO).
Palavras-chave INF para controlar a descarregamento de RSC
O NetAdapterCx verifica as palavras-chave do registro e as considera ao habilitar os recursos de descarregamento ativo. O driver não precisa tomar realizar nenhuma outra ação.
As palavras-chave de RSC especificadas em Palavras-chave INF padronizadas para RSC podem ser usadas para ativar/desabilitar a descarregamento de RSC com uma configuração da chave do registro.
Os valores da palavra-chave devem ser do tipo REG_SZ.
Configurar o descarregamento de RSC
Os drivers de cliente primeiro anunciam os recursos RSC de seu hardware durante a inicialização da placa de rede. Isso pode ocorrer no retorno de chamada do EvtDevicePrepareHardware antes de iniciar uma placa de rede.
Para configurar os recursos de RSC, o driver do cliente:
Aloca uma estrutura NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES.
Chama NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES_INIT para inicializar a estrutura.
Chama NetAdapterOffloadSetRscCapabilities para registrar a estrutura com NetAdapterCx.
Durante a chamada para NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES_INIT, o driver do cliente fornece um ponteiro para o retorno de chamada EVT_NET_ADAPTER_OFFLOAD_SET_RSC. O sistema invocará esse retorno de chamada depois se os recursos de descarregamento ativos forem alterados.
Regras para indicar recursos RSC de hardware
- Os drivers do cliente NÃO devem executar o RSC de software em qualquer tipo de tráfego que não tenha suporte de hardware na NIC.
As seguintes regras se aplicam à estrutura NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES:
NetAdapterOffloadLayer3FlagIPv4NoOptions
eNetAdapterOffloadLayer3FlagIPv6NoExtensions
são os únicos valores válidos para o campo Layer3Flags. Esses sinalizadores indicam suporte a IPv4 e IPv6, respectivamente.NetAdapterOffloadLayer4FlagTcpNoOptions
eNetAdapterOffloadLayer4FlagUdp
são os únicos valores válidos para o campo Layer4Flags. Esses sinalizadores indicam suporte a TCP e UDP, respectivamente.Os Layer3Flags devem ser configurados se o sinalizador
NetAdapterOffloadLayer4FlagTcpNoOptions
estiver definido.O campo TcpTimestampOption é opcional. Os drivers de cliente definem esse campo depois de chamar NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES_INIT e antes de chamar NetAdapterOffloadSetRscCapabilities para indicar se NIC é compatível com a opção de data/hora TCP.
O exemplo a seguir mostra como um driver cliente pode configurar recursos de descarregamento de hardware RSC.
VOID
MyAdapterSetRscOffloadCapabilities(
NETADAPTER NetAdapter
)
{
// Configure the hardware's RSC offload capabilities
NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES rscOffloadCapabilities;
NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES_INIT(
&rscOffloadCapabilities,
NetAdapterOffloadLayer3FlagIPv4NoOptions | NetAdapterOffloadLayer3FlagIPv6NoExtensions,
NetAdapterOffloadLayer4FlagTcpNoOptions,
MyEvtAdapterOffloadSetRsc);
rscOffloadCapabilities.TcpTimestampOption = FALSE;
// Set the current RSC offload capabilities and register the callback for future changes in active capabilities
NetAdapterOffloadSetRscCapabilities(NetAdapter, &rscOffloadCapabilities);
}
Atualizar descarregamentos de hardware RSC
Se a pilha TCP/IP ou um driver de protocolo sobreposto solicitar uma alteração nos recursos RSC ativos da placa de rede, o NetAdapterCx invocará o retorno de chamada EVT_NET_ADAPTER_OFFLOAD_SET_RSC do driver de cliente que foi registrado no NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES. Nesse retorno de chamada, o sistema fornece recursos atualizados no objeto NETOFFLOAD, que o driver cliente pode consultar para atualizar seus recursos de descarregamento.
Os drivers de cliente podem chamar as seguintes funções para determinar quais descarregamentos RSC estão habilitados:
- NetOffloadIsTcpRscIPv4Enabled
- NetOffloadIsTcpRscIPv6Enabled
- NetOffloadIsRscTcpTimestampOptionEnabled
O exemplo a seguir mostra como um driver de cliente pode atualizar os recursos de descarregamento RSC:
VOID
MyEvtAdapterOffloadSetRsc(
NETADAPTER NetAdapter,
NETOFFLOAD Offload
)
{
PMY_NET_ADAPTER_CONTEXT adapterContext = NetvAdapterGetContext(NetAdapter);
// Store the updated information in the context
adapterContext->IsRscIPv4Enabled = NetOffloadIsTcpRscIPv4Enabled(Offload);
adapterContext->IsRscIPv6Enabled = NetOffloadIsTcpRscIPv6Enabled(Offload);
adapterContext->IsRscTcpTimestampOptionEnabled = NetOffloadIsRscTcpTimestampOptionEnabled(Offload);
}
UDP RSC Offload (URO)
O URO permite a coalescência dos segmentos UDP recebidos. As NICs podem combinar datagramas de UDP do mesmo fluxo que correspondem a um conjunto de regras em um buffer logicamente contíguo. Esses datagramas combinados são indicados para a pilha do sistema de rede do Windows como um único pacote grande. Para obter informações sobre as regras URO, consulte as Regras para coalescência de de pacotes UDP.
A palavra-chave URO especificada na palavra-chave INF para controlar URO pode ser usada para ativar/desativar URO com uma configuração de chave do registro.
Os drivers de cliente NetAdapterCx podem usar as estruturas RSC existentes e a API RSC para URO. Para configurar o URO, os drivers de cliente devem definir o campo Layer4Flags na estrutura NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES como NetAdapterOffloadLayer4FlagUdp
.
O comportamento do URO espelha o RSC, com uma exceção. Quando o retorno de chamada EVT_NET_ADAPTER_OFFLOAD_SET_RSC desabilita o URO, o driver deve indicar os segmentos coalescentes existentes e aguardar até que todas as indicações do URO pendentes sejam concluídas. Essa abordagem garante que não haja indicações de URO ativas quando o retorno de chamada retornar.