Compartilhar via


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:

  1. Aloca uma estrutura NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES.

  2. Chama NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES_INIT para inicializar a estrutura.

  3. 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

  1. 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:

  1. NetAdapterOffloadLayer3FlagIPv4NoOptions e NetAdapterOffloadLayer3FlagIPv6NoExtensions são os únicos valores válidos para o campo Layer3Flags. Esses sinalizadores indicam suporte a IPv4 e IPv6, respectivamente.

  2. NetAdapterOffloadLayer4FlagTcpNoOptions e NetAdapterOffloadLayer4FlagUdp são os únicos valores válidos para o campo Layer4Flags. Esses sinalizadores indicam suporte a TCP e UDP, respectivamente.

  3. Os Layer3Flags devem ser configurados se o sinalizador NetAdapterOffloadLayer4FlagTcpNoOptions estiver definido.

  4. 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:

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.