Condividi tramite


Scarico calcolo checksum

NetAdapterCx supporta l'offload delle attività di 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 che sono associate al NET_PACKET nell'estensione del pacchetto NET_PACKET_CHECKSUM.

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

La disattivazione degli offload checksum quando 'offload segmentazione generica (GSO) è abilitata 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 la gestione dell'offload di checksum

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 checksum specificate in Uso dei valori del Registro di sistema per abilitare e disabilitare l'offload delle attività possono essere usate per abilitare/disabilitare l'offload del 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 innanzitutto le funzionalità di offload checksum dell'hardware durante l'inizializzazione dell'adattatore net. Questo problema può verificarsi all'interno del callback EvtDevicePrepareHardware prima di avviare un adattatore di rete.

Per configurare l'offload del checksum di trasmissione (Tx), il driver del cliente:

  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 NetAdapterOffloadSetTxChecksumCapabilities 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 questo callback in un secondo momento se le funzionalità di offload attive cambiano.

Per configurare l'offload checksum di ricezione (Rx), 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 questo callback in un secondo momento se le funzionalità di offload attive cambiano.

Regole per indicare le funzionalità di checksum di trasmissione hardware

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

  2. "I '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 di ricezione hardware

NetAdapterCx non richiede al driver di dichiarare le capacità di checksum di ricezione hardware. Se il checksum offload è abilitato, la scheda di interfaccia di rete deve eseguire il checksum offload su tutti i pacchetti che può gestire. Se la scheda di interfaccia di rete non è in grado di eseguire l'offload del checksum su un pacchetto, NetAdapterCx lo gestirà con il software.

Questo esempio mostra come un driver client potrebbe configurare le funzionalità di offload del checksum hardware:

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 scarichi hardware

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

I driver client possono chiamare le seguenti funzioni per determinare quali scarichi del checksum sono abilitati.

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

Trasmettere l'elaborazione del checksum

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 del pacchetto per ottenere una struttura NET_PACKET_CHECKSUM.

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

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

    • Se il flag è NetPacketTxChecksumActionRequired, il driver client deve determinare il protocollo usato in tale livello in tale pacchetto specifico usando la struttura di NET_PACKET_LAYOUT e indicare alla scheda di interfaccia di rete quale checksum 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.

Ricezione dell'elaborazione checksum

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

Le bandiere possono essere una delle seguenti:

Bandiera Descrizione
NetPacketRxChecksumEvaluationNotChecked Impossibile per la NIC convalidare il checksum del pacchetto
NetPacketRxChecksumEvaluationValid Il checksum del pacchetto è valido
NetPacketRxChecksumEvaluationInvalid Il checksum del pacchetto non è valido