Condividi tramite


Offload RSC (Receive Segment Coalescing)

Quando si ricevono dati, la maggior parte dei livelli nello stack TCP/IP deve esaminare separatamente le informazioni di intestazione di ogni segmento. Ciò crea una grande quantità di sovraccarico quando vengono ricevuti grandi quantità di dati.

L'unione del segmento di ricezione riduce questo sovraccarico fondendo una sequenza di segmenti ricevuti e indicandoli fino allo stack TCP/IP in un singolo segmento unito. I livelli superiori nello stack TCP/IP devono solo esaminare un'intestazione per l'intera sequenza.

Una scheda di interfaccia di rete (NIC) che supporta RSC nell'hardware può migliorare notevolmente le prestazioni del percorso di ricezione. Può anche ridurre l'utilizzo della CPU host perché libera il livello di protocollo dall'eseguire RSC nel software.

Per altre informazioni su RSC, vedere Panoramica della coalescenza del segmento di ricezione.

NetAdapterCX supporta anche UDP RSC (URO) a partire dalla versione 2.5. Per altri dettagli, vedere UDP RSC Offload (URO).For more details, see UDP RSC Offload (URO).

Parole chiave INF per il controllo dell'offload RSC

NetAdapterCx controlla le parole chiave del Registro di sistema e le rispetta quando si abilitano le funzionalità di offload attive. Il driver non deve eseguire ulteriori azioni.

Le parole chiave RSC specificate in Parole chiave INF standardizzate per RSC possono essere usate per abilitare/disabilitare l'offload RSC con un'impostazione di chiave del Registro di sistema.

I valori delle parole chiave devono essere di tipo REG_SZ.

Configurazione dell'offload RSC

I driver client annunciano prima le funzionalità RSC dell'hardware durante l'inizializzazione dell'adattatore net. Questo problema può verificarsi all'interno del callback EvtDevicePrepareHardware prima di avviare una scheda net.

Per configurare le funzionalità RSC, il driver client:

  1. Alloca una struttura NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES.

  2. Chiama NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES_INIT per inizializzare la struttura.

  3. Chiama NetAdapterOffloadSetRscCapabilities per registrare la struttura con NetAdapterCx.

Durante la chiamata a NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES_INIT il driver client fornisce un puntatore al callback EVT_NET_ADAPTER_OFFLOAD_edizione Standard T_RSC. Il sistema richiama questo callback in un secondo momento se le funzionalità di offload attive cambiano.

Regole per indicare le funzionalità RSC hardware

  1. I driver client non devono eseguire software RSC su qualsiasi tipo di traffico che non dispone del supporto hardware nella scheda di interfaccia di rete.

Le regole seguenti si applicano alla struttura NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES:

  1. NetAdapterOffloadLayer3FlagIPv4NoOptions e NetAdapterOffloadLayer3FlagIPv6NoExtensions sono gli unici valori validi per il campo Layer3Flags . Questi flag indicano rispettivamente il supporto IPv4 e IPv6.

  2. NetAdapterOffloadLayer4FlagTcpNoOptions e NetAdapterOffloadLayer4FlagUdp sono gli unici valori validi per il campo Layer4Flags . Questi flag indicano rispettivamente il supporto TCP e UDP.

  3. I flag di livello 3 devono essere impostati se il NetAdapterOffloadLayer4FlagTcpNoOptions flag è impostato.

  4. Il campo TcpTimestampOption è facoltativo. I driver client impostano questo campo dopo aver chiamato NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES_INIT e prima di chiamare NetAdapterOffloadSetRscCapabilities per indicare se la scheda di interfaccia di rete supporta l'opzione timestamp TCP.

L'esempio seguente mostra come un driver client potrebbe configurare le funzionalità di offload 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);
}

Aggiornamento degli offload hardware RSC

Se lo stack TCP/IP o un driver di protocollo overlying richiede una modifica alle funzionalità RSC attive dell'adattatore net, NetAdapterCx richiama il callback del driver client EVT_NET_ADAPTER_OFFLOAD_edizione Standard T_RSC registrato in NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES. In questo callback il sistema fornisce funzionalità aggiornate nell'oggetto NETOFFLOAD su cui il driver client può eseguire query per aggiornare le funzionalità di offload.

I driver client possono chiamare le funzioni seguenti per determinare quali offload RSC sono abilitati:

L'esempio seguente mostra come un driver client potrebbe aggiornare le funzionalità di offload 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);
}

Offload RSC UDP (URO)

L'URO consente l'unione dei segmenti UDP ricevuti. Le schede di interfaccia di rete possono combinare datagrammi UDP dello stesso flusso che corrispondono a un set di regole in un buffer logicamente contiguo. Questi datagrammi combinati vengono quindi indicati allo stack di rete di Windows come singolo pacchetto di grandi dimensioni. Per informazioni sulle regole URO, vedere Regole per l'unione di pacchetti UDP.

La parola chiave URO specificata nella parola chiave INF per il controllo dell'URO può essere usata per abilitare/disabilitare l'URO con un'impostazione della chiave del Registro di sistema.

I driver client NetAdapterCx possono usare le strutture RSC esistenti e l'API RSC per URO. Per configurare l'URO, i driver client devono impostare il campo Layer4Flags nella struttura NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES su NetAdapterOffloadLayer4FlagUdp.

Il comportamento dell'URO rispecchia RSC con un'eccezione. Quando il callback EVT_NET_ADAPTER_OFFLOAD_edizione Standard T_RSC disabilita l'URO, il driver deve indicare segmenti uniti esistenti e attendere il completamento di tutte le indicazioni URO in sospeso. Questo approccio garantisce che non vi siano indicazioni URO attive al termine del callback.