Dela via


Kontrollsummeavlastning

NetAdapterCx stöder avlastning av TCP/IP-kontrollsummor under körning av programmet.

Innan TCP/IP-transporten skickar en NET_PACKET struktur till klientdrivrutinen anger den kontrollsummainformation som är associerad med NET_PACKET i ett NET_PACKET_CHECKSUM pakettillägg.

TCP/IP-transporten beräknar ettkomplementsumman för TCP/UDP-pseudohuvudet innan avlastning av beräkning av kontrollsumman för ett TCP/UDP-paket, som beskrivs i Avlastning av kontrollsummauppgifter.

Om du inaktiverar checksummor när Generic Segmentation Offload (GSO) är aktiverat hindrar det inte klientdrivrutinen från att beräkna och infoga kontrollsummor i paket som genereras av GSO-funktionen. Om du vill inaktivera checksum-offloads helt måste du också inaktivera GSO.

INF-nyckelord för att kontrollera kontrollsummaavlastning

NetAdapterCx kontrollerar registernyckelorden och respekterar dem när du aktiverar de aktiva avlastningsfunktionerna. Drivrutinen behöver inte vidta några ytterligare åtgärder.

Kontrollsumnyckelorden som anges i Använda registervärden för att aktivera och inaktivera avlastning av uppgifter kan användas för att aktivera/inaktivera kontrollsummers avlastning med en registernyckelinställning. Grupperade nyckelord stöds inte.

Nyckelordsvärdena måste vara av typen REG_SZ.

Konfigurera kontrollsummaavlastning

Klientdrivrutiner annonserar först sina funktioner för avlastning av kontrollsummor under nätadapterns initiering. Detta kan inträffa inom deras EvtDevicePrepareHardware callback innan en nätadapter startas.

Så här konfigurerar du avlastning av överföringschecksumma (Tx) med klientdrivrutinen:

  1. Allokerar en NET_ADAPTER_OFFLOAD_TX_CHECKSUM_CAPABILITIES struktur.

  2. Anropar NET_ADAPTER_OFFLOAD_TX_CHECKSUM_CAPABILITIES_INIT för att initiera strukturen.

  3. Anropar NetAdapterOffloadSetTxChecksumCapabilities för att registrera strukturen med NetAdapterCx.

Under anropet till NET_ADAPTER_OFFLOAD_TX_CHECKSUM_CAPABILITIES_INIT tillhandahåller klientdrivrutinen en pekare till EVT_NET_ADAPTER_OFFLOAD_SET_TX_CHECKSUM återuppringning. Systemet anropar denna callback senare om de aktiva avlastningsfunktionerna ändras.

Så här konfigurerar du avlastning av mottagningskontrollsumma (Rx) med klientdrivrutinen:

  1. Allokerar en NET_ADAPTER_OFFLOAD_RX_CHECKSUM_CAPABILITIES struktur.

  2. Anropar NET_ADAPTER_OFFLOAD_RX_CHECKSUM_CAPABILITIES_INIT för att initialisera strukturen.

  3. Anropar NetAdapterOffloadSetRxChecksumCapabilities för att registrera strukturen med NetAdapterCx.

Under anropet till NET_ADAPTER_OFFLOAD_RX_CHECKSUM_CAPABILITIES_INIT tillhandahåller klientdrivrutinen en pekare till EVT_NET_ADAPTER_OFFLOAD_SET_RX_CHECKSUM callback-funktion. Systemet anropar återkallningsfunktionen senare om funktionerna för aktiv avlastning ändras.

Regler för att ange funktioner för överföring av kontrollsummor för maskinvara

  1. Layer3Flags i NET_ADAPTER_OFFLOAD_TX_CHECKSUM_CAPABILITIES-strukturen måste ställas in. Det är valfritt att ange Layer4Flags. Genom att ställa in Layer3Flags och Layer4Flags anger du vilka paket nätverkskortet kan utföra kontrollsumsavlastning på.

  2. Layer3HeaderOffsetLimit och Layer4HeaderOffsetLimit i NET_ADAPTER_OFFLOAD_TX_CHECKSUM_CAPABILITIES är valfria. Om operativsystemet skickar ett paket med en rubrikförskjutning som är större än den angivna gränsen begär det inte att nätverkskortet beräknar kontrollsumman för det lagret.

  3. IP-/TCP-paket utan alternativ/tillägg måste stödjas om alternativ/tillägg stöds.

Regler för att ange maskinvarans förmåga att ta emot kontrollsummor

NetAdapterCx kräver inte att drivrutinen specificerar maskinvarans förmåga att hantera kontrollsummor vid mottagning. Om kontrollsummeavlastning är aktiverad bör nätverksgränssnittskortet utföra kontrollsummeavlastning på alla paket det kan hantera. Om nätverkskortet inte kan utföra avlastning av kontrollsumman på ett paket avlastar NetAdapterCx det i mjukvara.

Det här exemplet visar hur en kunddrivrutin kan konfigurera maskinvarans kontrollsummeavlastning:

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

Uppdaterar maskinvaruavlastningar

Om TCP/IP-stacken eller en överliggande protokolldrivrutin begär en ändring av nätverkskortets aktiva funktioner anropar NetAdapterCx klientdrivrutinens EVT_NET_ADAPTER_OFFLOAD_SET_TX_CHECKSUM eller EVT_NET_ADAPTER_OFFLOAD_SET_RX_CHECKSUM återanrop som registrerades under kortinitiering. I dessa funktioner tillhandahåller systemet uppdaterade funktioner i NETOFFLOAD-objektet som klientdrivrutinen efterfrågar för att uppdatera avlastningsfunktionerna.

Klientdrivrutiner kan anropa följande funktioner för att avgöra vilka kontrollsummaavlastningar som är aktiverade:

I följande exempel visas hur en klientdrivrutin kan uppdatera sina möjligheter för att avlasta Tx/Rx-kontrollsumman:

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

Överföra kontrollsummabearbetning

En klientdrivrutin utför vanligtvis följande kontrollsummabearbetning på överföringsvägen:

  1. Klientdrivrutinen anropar funktionen NetExtensionGetPacketChecksum med paketindexet för att hämta en NET_PACKET_CHECKSUM struktur.

  2. Klientdrivrutinen testar de lagerspecifika flaggorna i NET_PACKET_CHECKSUM struktur.

    • Om flaggan är NetPacketTxChecksumActionPassthroughbör nätverkskortet inte utföra kontrollsummor i det lagret.

    • Om flaggan är NetPacketTxChecksumActionRequiredska klientdrivrutinen bestämma vilket protokoll som används på det lagret i det specifika paketet med hjälp av NET_PACKET_LAYOUT-strukturen och indikera för nätverkskortet vilken kontrollsumma det ska beräkna för paketet.

  3. Klientdrivrutinen skickar paketet till nätverkskortet, som beräknar lämpliga kontrollsummor för paketet.

Ta emot kontrollsummabearbetning

Innan du anger en NET_PACKET struktur för ett mottagningspaket där det utför kontrollsummor validerar klientdrivrutinen kontrollsummorna och anger lämpliga flaggor i NET_PACKET_CHECKSUM struktur.

Flaggorna kan vara något av följande:

Flagga Beskrivning
NetPacketRxChecksumEvaluationNotChecked Nätverkskortet kunde inte verifiera kontrollsumman för datapaketet
NetPacketRxChecksumEvaluationValid Checksumman för paketet är giltig
NetPacketRxChecksumEvaluationInvalid Kontrollsumman för paketet är ogiltig