Delen via


Checksum offload

NetAdapterCx ondersteunt offloading van TCP/IP-controlesomtaken tijdens runtime.

Voordat het TCP/IP-transport een NET_PACKET structuur doorgeeft aan het clientstuurprogramma, geeft het de controlesominformatie op die is gekoppeld aan de NET_PACKET in een NET_PACKET_CHECKSUM pakketextensie.

Het TCP/IP-transport berekent de ééncomplementsom van de TCP/UDP pseudoheader zodat de controlesomberekening voor een TCP/UDP-pakket wordt uitbesteed, zoals beschreven in Offloading Checksum Tasks.

Het uitschakelen van checksum-offloads wanneer Generic Segmentation Offload (GSO) is ingeschakeld, voorkomt niet dat het clientstuurprogramma rekent en controlesommen invoegt in pakketten die zijn gegenereerd door de GSO-functie. Als u checksum-offloads volledig wilt uitschakelen, moet u ook GSO uitschakelen.

INF-trefwoorden voor het beheren van checksum-offload

NetAdapterCx controleert de registertrefwoorden en respecteert deze bij het activeren van de actieve offloadmogelijkheden. De bestuurder hoeft geen verdere actie te ondernemen.

De controlesomtrefwoorden die zijn opgegeven in Registerwaarden gebruiken om taak offloading in en uit te schakelen kunnen worden gebruikt om de checksum-offload in of uit te schakelen met een registersleutelinstelling. Gegroepeerde trefwoorden worden niet ondersteund.

De trefwoordwaarden moeten van het type REG_SZzijn.

Het configureren van checksum offload

Clientstuurprogramma's adverteren eerst de checksum-offloadmogelijkheden van hun hardware tijdens de initialisatie van netadapters. Dit kan gebeuren binnen de EvtDevicePrepareHardware callback voordat je een netadapter start.

Het clientstuurprogramma voor het configureren van de checksum -offload (Tx):

  1. Wijst een NET_ADAPTER_OFFLOAD_TX_CHECKSUM_CAPABILITIES structuur toe.

  2. Roept NET_ADAPTER_OFFLOAD_TX_CHECKSUM_CAPABILITIES_INIT aan om de structuur te initialiseren.

  3. Roept NetAdapterOffloadSetTxChecksumCapabilities aan om de structuur te registreren bij NetAdapterCx.

Tijdens het aanroepen naar NET_ADAPTER_OFFLOAD_TX_CHECKSUM_CAPABILITIES_INIT geeft het clientstuurprogramma een aanwijzer naar de EVT_NET_ADAPTER_OFFLOAD_SET_TX_CHECKSUM callback. Het systeem roept deze callback later aan als de actieve offloadmogelijkheden veranderen.

Het clientstuurprogramma voor het configureren van receive (Rx) checksum offload:

  1. Wijs een NET_ADAPTER_OFFLOAD_RX_CHECKSUM_CAPABILITIES-structuur toe.

  2. Roept NET_ADAPTER_OFFLOAD_RX_CHECKSUM_CAPABILITIES_INIT aan om de structuur te initialiseren.

  3. Roept NetAdapterOffloadSetRxChecksumCapabilities aan om de structuur te registreren bij NetAdapterCx.

Tijdens het aanroepen naar NET_ADAPTER_OFFLOAD_RX_CHECKSUM_CAPABILITIES_INIT geeft het clientstuurprogramma een aanwijzer naar de EVT_NET_ADAPTER_OFFLOAD_SET_RX_CHECKSUM callback. Het systeem roept deze callback later aan als de actieve offloadmogelijkheden veranderen.

Regels voor het aangeven van hardware-mogelijkheden voor het verzenden van controlesommen

  1. De Layer3Flags in de NET_ADAPTER_OFFLOAD_TX_CHECKSUM_CAPABILITIES structuur moeten worden ingesteld. Het instellen van de Layer4Flags is optioneel. Als u de Layer3Flags en Layer4Flags instelt, geeft dit aan op welke pakketten de netwerkkaart (NIC) in staat is om controlesom offloaden uit te voeren.

  2. De Layer3HeaderOffsetLimit en Layer4HeaderOffsetLimit in NET_ADAPTER_OFFLOAD_TX_CHECKSUM_CAPABILITIES zijn optioneel. Als het besturingssysteem een pakket verzendt met een header-offset groter dan de opgegeven limiet, zal het de NIC niet vragen om de controlesom voor die laag te berekenen.

  3. IP-/TCP-pakketten zonder opties/extensies moeten worden ondersteund als opties/extensies worden ondersteund.

Regels voor het aangeven van de mogelijkheden van controlesom voor hardware

NetAdapterCx vereist niet dat het stuurprogramma de mogelijkheden voor controlesom voor de hardware adverteert. Als checksum offload is ingeschakeld, moet de NIC checksum offload uitvoeren op alle pakketten die deze kan verwerken. Als de NIC geen checksum-offload op een pakket kan uitvoeren, wordt dit door NetAdapterCx in de software geoffload.

In dit voorbeeld ziet u hoe een clientstuurprogramma de mogelijkheden voor offloading van hardwarecontrolesom kan instellen:

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);
}

Hardware-offloads bijwerken

Als de TCP/IP-stack of een overliggend protocolstuurprogramma een wijziging aanvraagt naar de actieve mogelijkheden van de netadapter, roept NetAdapterCx de EVT_NET_ADAPTER_OFFLOAD_SET_TX_CHECKSUM van het clientstuurprogramma of EVT_NET_ADAPTER_OFFLOAD_SET_RX_CHECKSUM callback aan die is geregistreerd tijdens de initialisatie van de adapter. In deze functies biedt het systeem bijgewerkte mogelijkheden in het NETOFFLOAD-object waarop het clientstuurprogramma query's uitvoert om de offloadmogelijkheden bij te werken.

Clientstuurprogramma's kunnen de volgende functies aanroepen om te bepalen welke checksum-offloads zijn ingeschakeld:

In het volgende voorbeeld ziet u hoe een clientstuurprogramma de mogelijkheden van de Tx/Rx-checksum-offload kan bijwerken:

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);
}

Controlesomverwerking verzenden

Een clientstuurprogramma voert doorgaans de volgende controlesomverwerking uit op het verzendpad:

  1. Het clientstuurprogramma roept de NetExtensionGetPacketChecksum functie aan met de pakketindex om een NET_PACKET_CHECKSUM structuur te verkrijgen.

  2. Het clientstuurprogramma test de laagspecifieke vlaggen in de NET_PACKET_CHECKSUM structuur.

    • Als de vlag is NetPacketTxChecksumActionPassthrough, moet de NIC geen controlesombewerkingen uitvoeren in die laag.

    • Als de vlag is NetPacketTxChecksumActionRequired, moet het clientstuurprogramma het protocol bepalen dat op die laag in dat specifieke pakket wordt gebruikt met behulp van de NET_PACKET_LAYOUT-structuur en aangeven aan de NIC welke controlesom moet worden berekend voor het pakket.

  3. Het clientstuurprogramma geeft het pakket door aan de NIC, waarmee de juiste controlesommen voor het pakket worden berekend.

Ontvang verwerking van controlesom

Voordat u een NET_PACKET structuur aangeeft voor een ontvangstpakket waarop controlesomtaken worden uitgevoerd, valideert het clientstuurprogramma de controlesommen en stelt u de juiste vlaggen in de NET_PACKET_CHECKSUM structuur in.

De vlaggen kunnen een van de volgende zijn:

Vlag Beschrijving
NetPacketRxChecksumEvaluationNotChecked De NIC kan de controlesom van het pakket niet valideren
NetPacketRxChecksumEvaluationValid De controlesom van het pakket is geldig
NetPacketRxChecksumEvaluationInvalid De controlesom van het pakket is ongeldig