Offload checksum

NetAdapterCx supporta l'offload delle attività checksum TCP/IP in fase di esecuzione.

Prima che il trasporto TCP/IP passi una struttura NET_PACKET al driver client, specifica le informazioni di checksum associate all'NET_PACKET in un'estensione del pacchetto NET_PACKET_CHECKSUM .

Il trasporto TCP/IP calcola la somma di complemento per lo pseudoheader TCP/UDP prima di offload del calcolo checksum per un pacchetto TCP/UDP, come descritto in Offloading Checksum Tasks.

La disattivazione del checksum offload quando l'offload di segmentazione generica (GSO) non impedisce al driver client di calcolare e inserire checksum nei pacchetti generati dalla funzionalità GSO. Per disabilitare completamente gli offload checksum, è necessario disabilitare anche GSO.

Parole chiave INF per il controllo dell'offload checksum

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

Le parole chiave checksum specificate in Uso dei valori del Registro di sistema per abilitare e disabilitare l'offload attività possono essere usate per abilitare/disabilitare il offload checksum con un'impostazione della chiave del Registro di sistema. Le parole chiave raggruppate non sono supportate.

I valori delle parole chiave devono essere di tipo REG_SZ.

Configurazione dell'offload checksum

I driver client annunciano prima le funzionalità di offload checksum dell'hardware durante l'inizializzazione di net adapter. Ciò potrebbe verificarsi all'interno del callback evtDevicePrepareHardware prima di avviare una scheda net.

Per configurare il checksum di trasmissione (Tx) offload, il driver client:

  1. Alloca una struttura NET_ADAPTER_OFFLOAD_TX_CHECKSUM_CAPABILITIES .

  2. Chiama NET_ADAPTER_OFFLOAD_TX_CHECKSUM_CAPABILITIES_INIT per inizializzare la struttura.

  3. Chiama NetAdapterOffloadSetTxCheckcheckCapabilities per registrare la struttura con NetAdapterCx.

Durante la chiamata a NET_ADAPTER_OFFLOAD_TX_CHECKSUM_CAPABILITIES_INIT il driver client fornisce un puntatore al callback EVT_NET_ADAPTER_OFFLOAD_SET_TX_CHECKSUM . Il sistema richiama il callback in un secondo momento se le funzionalità di offload attive cambiano.

Per configurare il checksum (Rx) checksum offload, il driver client:

  1. Alloca una struttura NET_ADAPTER_OFFLOAD_RX_CHECKSUM_CAPABILITIES .

  2. Chiama NET_ADAPTER_OFFLOAD_RX_CHECKSUM_CAPABILITIES_INIT per inizializzare la struttura.

  3. Chiama NetAdapterOffloadSetRxChecksumCapabilities per registrare la struttura con NetAdapterCx.

Durante la chiamata a NET_ADAPTER_OFFLOAD_RX_CHECKSUM_CAPABILITIES_INIT il driver client fornisce un puntatore al callback EVT_NET_ADAPTER_OFFLOAD_SET_RX_CHECKSUM . Il sistema richiama il callback in un secondo momento se le funzionalità di offload attive cambiano.

Regole per indicare le funzionalità di checksum della trasmissione hardware

  1. È necessario impostare Layer3Flags nella struttura NET_ADAPTER_OFFLOAD_TX_CHECKSUM_CAPABILITIES . L'impostazione di Layer4Flags è facoltativa. L'impostazione di Layer3Flags e Layer4Flags indica i pacchetti in cui la scheda di interfaccia di rete è in grado di eseguire il offload checksum.

  2. Layer3HeaderOffsetLimit e Layer4HeaderOffsetLimit in NET_ADAPTER_OFFLOAD_TX_CHECKSUM_CAPABILITIES sono facoltativi. Se il sistema operativo invia un pacchetto con un offset di intestazione maggiore del limite specificato, non richiederà alla scheda di interfaccia di rete di calcolare il checksum per tale livello.

  3. I pacchetti IP/TCP senza opzioni/estensioni devono essere supportati se sono supportate opzioni/estensioni.

Regole per indicare le funzionalità di checksum della ricezione hardware

NetAdapterCx non richiede al driver di annunciare le funzionalità di checksum di ricezione hardware. Se checksum offload è abilitato, la scheda di interfaccia di rete deve eseguire l'offload checksum in tutti i pacchetti che può gestire. Se la scheda di interfaccia di rete non può eseguire l'offload checksum in un pacchetto, NetAdapterCx lo offloadrà nel software.

In questo esempio viene illustrato come un driver client potrebbe configurare le funzionalità di offload hardware checksum:

VOID
MyAdapterSetOffloadCapabilities(
    NETADAPTER NetAdapter
)
{
    // Configure the hardware's Tx checksum offload capabilities
    NET_ADAPTER_OFFLOAD_TX_CHECKSUM_CAPABILITIES txChecksumOffloadCapabilities;

    auto const layer3Flags = NetAdapterOffloadLayer3FlagIPv4NoOptions |
        NetAdapterOffloadLayer3FlagIPv4WithOptions |
        NetAdapterOffloadLayer3FlagIPv6NoExtensions |
        NetAdapterOffloadLayer3FlagIPv6WithExtensions;

    auto const layer4Flags = NetAdapterOffloadLayer4FlagTcpNoOptions |
        NetAdapterOffloadLayer4FlagTcpWithOptions |
        NetAdapterOffloadLayer4FlagUdp;

    NET_ADAPTER_OFFLOAD_TX_CHECKSUM_CAPABILITIES_INIT(
        &txChecksumOffloadCapabilities,
        layer3Flags,
        EvtAdapterOffloadSetTxChecksum);

    txChecksumOffloadCapabilities.Layer4Flags = layer4Flags;

    txChecksumOffloadCapabilities.Layer4HeaderOffsetLimit = 127;

    // Set the current Tx checksum offload capabilities and register the callback for future changes in active capabilities
    NetAdapterOffloadSetTxChecksumCapabilities(NetAdapter,
        &txChecksumOffloadCapabilities);

    // Configure the hardware's Rx checksum offload capabilities
    NET_ADAPTER_OFFLOAD_RX_CHECKSUM_CAPABILITIES rxChecksumOffloadCapabilities;

    NET_ADAPTER_OFFLOAD_RX_CHECKSUM_CAPABILITIES_INIT(
        &rxChecksumOffloadCapabilities,
        EvtAdapterOffloadSetRxChecksum);

    // Set the current Rx checksum offload capabilities and register the callback for future changes in active capabilities
    NetAdapterOffloadSetRxChecksumCapabilities(NetAdapter,
        &rxChecksumOffloadCapabilities);
}

Aggiornamento degli offload hardware

Se lo stack TCP/IP o un driver del protocollo overlying richiede una modifica alle funzionalità attive dell'adattatore net, NetAdapterCx richiama l'EVT_NET_ADAPTER_OFFLOAD_SET_TX_CHECKSUM del driver client o EVT_NET_ADAPTER_OFFLOAD_SET_RX_CHECKSUM callback registrato durante l'inizializzazione della scheda. In queste funzioni il sistema fornisce funzionalità aggiornate nell'oggetto NETOFFLOAD che il driver client esegue query per aggiornare le funzionalità di offload.

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

Nell'esempio seguente viene illustrato come un driver client potrebbe aggiornare le funzionalità di offload del checksum Tx/Rx:

VOID
MyEvtAdapterOffloadSetTxChecksum(
    NETADAPTER  NetAdapter,
    NETOFFLOAD  Offload
)
{
    PMY_NET_ADAPTER_CONTEXT adapterContext = MyGetNetAdapterContext(NetAdapter);

    // Store the updated information in the context
    adapterContext->TxHardwareIpChecksum = NetOffloadIsTxChecksumIPv4Enabled(Offload);
    adapterContext->TxHardwareTcpChecksum = NetOffloadIsTxChecksumTcpEnabled(Offload);
    adapterContext->TxHardwareUdpChecksum = NetOffloadIsTxChecksumUdpEnabled(Offload);

    // Update the new hardware Tx checksum offload capabilities
    MyUpdateHardwareChecksum(adapterContext);
}

VOID
MyEvtAdapterOffloadSetRxChecksum(
    NETADAPTER  NetAdapter,
    NETOFFLOAD  Offload
)
{
    PMY_NET_ADAPTER_CONTEXT adapterContext = MyGetNetAdapterContext(NetAdapter);

    // Store the updated information in the context
    adapterContext->RxHardwareIpChecksum = NetOffloadIsRxChecksumIPv4Enabled(Offload);
    adapterContext->RxHardwareTcpChecksum = NetOffloadIsRxChecksumTcpEnabled(Offload);
    adapterContext->RxHardwareUdpChecksum = NetOffloadIsRxChecksumUdpEnabled(Offload);

    // Update the new hardware Rx checksum offload capabilities
    MyUpdateHardwareChecksum(adapterContext);
}

Elaborazione del checksum di trasmissione

Un driver client esegue in genere l'elaborazione checksum seguente nel percorso di trasmissione:

  1. Il driver client chiama la funzione NetExtensionGetPacketChecksum con l'indice di pacchetto per ottenere una struttura NET_PACKET_CHECKSUM .

  2. Il driver client testa i flag specifici del livello nella struttura NET_PACKET_CHECKSUM.

    • Se il flag è NetPacketTxChecksumActionPassthrough, la scheda di interfaccia di rete non deve eseguire operazioni checksum in tale livello.

    • Se il flag è NetPacketTxChecksumActionRequired, il driver client deve determinare il protocollo usato a tale livello in tale pacchetto specifico usando la struttura di NET_PACKET_LAYOUT e indicare alla scheda di interfaccia di rete il checksum che deve calcolare per il pacchetto.

  3. Il driver client passa il pacchetto alla scheda di interfaccia di rete, che calcola i checksum appropriati per il pacchetto.

Elaborazione checksum di ricezione

Prima di indicare una struttura NET_PACKET per un pacchetto di ricezione in cui esegue attività checksum, il driver client convalida i checksum e imposta i flag appropriati nella struttura NET_PACKET_CHECKSUM .

I flag possono essere uno dei seguenti:

Flag Descrizione
NetPacketRxChecksumEvaluationNotChecked Impossibile convalidare il checksum del pacchetto
NetPacketRxChecksumEvaluationValid Il checksum del pacchetto è valido
NetPacketRxChecksumEvaluationInvalid Il checksum del pacchetto non è valido