Pengurangan beban checksum

NetAdapterCx mendukung offloading tugas checksum TCP/IP pada saat run time.

Sebelum transportasi TCP/IP meneruskan struktur NET_PACKET ke driver klien, itu menentukan informasi checksum yang terkait dengan NET_PACKET dalam ekstensi paket NET_PACKET_CHECKSUM .

Transport TCP/IP menghitung jumlah pelengkap satu untuk pseudoheader TCP/UDP sebelum menyerahkan perhitungan checksum untuk paket TCP/UDP, seperti yang dijelaskan dalam Tugas Offloading Checksum.

Menonaktifkan checksum offload saat Generic Segmentation Offload (GSO) diaktifkan tidak mencegah driver klien menghitung dan memasukkan checksum dalam paket yang dihasilkan oleh GSO. Untuk menonaktifkan offload checksum sepenuhnya, Anda juga harus menonaktifkan GSO.

Kata kunci INF untuk mengontrol offload checksum

NetAdapterCx memeriksa kata kunci registri dan menghormatinya saat mengaktifkan kemampuan offload aktif. Driver tidak perlu mengambil tindakan lebih lanjut.

Kata kunci checksum yang ditentukan dalam Menggunakan Nilai Registri untuk Mengaktifkan dan Menonaktifkan Offloading Tugas dapat digunakan untuk mengaktifkan/menonaktifkan checksum offload dengan pengaturan kunci registri. Kata kunci yang dikelompokkan tidak didukung.

Nilai kata kunci harus berjenis REG_SZ.

Mengonfigurasi checksum offload

Driver klien mengumumkan pertama kali kemampuan offload checksum perangkat keras mereka pada inisialisasi adaptor jaringan. Hal ini mungkin terjadi saat callback EvtDevicePrepareHardware sebelum memulai adaptor jaringan.

Untuk mengonfigurasi pengalihan checksum transmisi (Tx), driver klien:

  1. Mengalokasikan sebuah struktur NET_ADAPTER_OFFLOAD_TX_CHECKSUM_CAPABILITIES.

  2. Memanggil NET_ADAPTER_OFFLOAD_TX_CHECKSUM_CAPABILITIES_INIT untuk menginisialisasi struktur.

  3. Memanggil NetAdapterOffloadSetTxChecksumCapabilities untuk mendaftarkan struktur dengan NetAdapterCx.

Selama panggilan ke NET_ADAPTER_OFFLOAD_TX_CHECKSUM_CAPABILITIES_INIT, driver klien menyediakan pointer ke panggilan balik EVT_NET_ADAPTER_OFFLOAD_SET_TX_CHECKSUM. Sistem memanggil panggilan balik ini nanti jika kemampuan offload aktif berubah.

Untuk mengonfigurasi offload checksum penerima (Rx), driver klien:

  1. Mengalokasikan struktur NET_ADAPTER_OFFLOAD_RX_CHECKSUM_CAPABILITIES.

  2. Memanggil NET_ADAPTER_OFFLOAD_RX_CHECKSUM_CAPABILITIES_INIT untuk menginisialisasi struktur.

  3. Memanggil NetAdapterOffloadSetRxChecksumCapabilities untuk mendaftarkan struktur dengan NetAdapterCx.

Selama panggilan ke NET_ADAPTER_OFFLOAD_RX_CHECKSUM_CAPABILITIES_INIT, driver klien menyediakan penunjuk ke callback EVT_NET_ADAPTER_OFFLOAD_SET_RX_CHECKSUM. Sistem memanggil panggilan balik ini nanti jika kemampuan offload aktif berubah.

Aturan dalam Menyatakan Kemampuan Checksum Transmisi Perangkat Keras

  1. Layer3Flags dalam struktur NET_ADAPTER_OFFLOAD_TX_CHECKSUM_CAPABILITIES harus disetel. Mengatur Layer4Flags bersifat opsional. Mengatur Layer3Flags dan Layer4Flags menunjukkan paket di mana NIC mampu melakukan offload checksum.

  2. Layer3HeaderOffsetLimit dan Layer4HeaderOffsetLimit di NET_ADAPTER_OFFLOAD_TX_CHECKSUM_CAPABILITIES bersifat opsional. Jika OS mengirim paket dengan offset header yang lebih besar dari batas yang ditentukan, OS tidak akan meminta NIC untuk menghitung checksum untuk lapisan tersebut.

  3. Paket IP/TCP tanpa opsi/ekstensi harus didukung jika opsi/ekstensi didukung.

Aturan untuk menyatakan kemampuan pemeriksaan penerimaan perangkat keras

NetAdapterCx tidak mengharuskan driver untuk menyatakan kemampuan checksum penerimaan perangkat keras. Jika offload checksum diaktifkan, NIC harus melakukan offload checksum pada semua paket yang dapat diprosesnya. Jika NIC tidak dapat melakukan offload untuk checksum pada paket, NetAdapterCx akan menanganinya dalam perangkat lunak.

Contoh ini menunjukkan bagaimana driver klien dapat menyiapkan kemampuan offload checksum perangkat kerasnya:

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

Memperbarui pengurangan beban perangkat keras

Jika stack TCP/IP atau driver protokol yang berada di atasnya meminta perubahan pada kemampuan aktif adapter jaringan, NetAdapterCx menghubungi fungsi callback EVT_NET_ADAPTER_OFFLOAD_SET_TX_CHECKSUM driver klien atau EVT_NET_ADAPTER_OFFLOAD_SET_RX_CHECKSUM yang didaftarkan selama inisialisasi adapter. Dalam fungsi-fungsi ini, sistem menyediakan kemampuan yang diperbarui di objek NETOFFLOAD yang dikueri driver klien untuk memperbarui kemampuan offload-nya.

Driver klien dapat memanggil fungsi berikut untuk menentukan offload checksum mana yang diaktifkan:

Berikut ini adalah contoh bagaimana driver klien dapat memperbarui kemampuan offload 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);
}

Mengirimkan pemrosesan checksum

Driver klien biasanya melakukan pemrosesan checksum berikut pada jalur transmisi:

  1. Driver klien memanggil fungsi NetExtensionGetPacketChecksum dengan indeks paket untuk mendapatkan struktur NET_PACKET_CHECKSUM .

  2. Driver klien menguji bendera khusus lapisan dalam struktur NET_PACKET_CHECKSUM.

    • Jika bendera adalah NetPacketTxChecksumActionPassthrough, NIC tidak boleh melakukan operasi checksum di lapisan tersebut.

    • Jika bendera adalah NetPacketTxChecksumActionRequired, driver klien harus menentukan protokol yang digunakan pada lapisan tersebut dalam paket tertentu menggunakan struktur NET_PACKET_LAYOUT dan menunjukkan ke NIC checksum mana yang harus dihitung untuk paket.

  3. Driver klien meneruskan paket ke NIC, yang menghitung checksum yang sesuai untuk paket.

Menerima pemrosesan checksum

Sebelum menunjukkan struktur NET_PACKET untuk paket penerima tempatnya melakukan tugas checksum, driver klien memvalidasi checksum dan mengatur bendera yang sesuai dalam struktur NET_PACKET_CHECKSUM .

Bendera dapat berupa salah satu hal berikut:

Bendera Deskripsi
NetPacketRxChecksumEvaluationNotChecked NIC tidak dapat memvalidasi checksum paket
NetPacketRxChecksumEvaluationValid Checksum dari paket tersebut adalah valid.
NetPacketRxChecksumEvaluationInvalid Checksum dari paket tidak valid