Bagikan melalui


Offload checksum

NetAdapterCx mendukung pembongkaran tugas checksum TCP/IP pada durasi.

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

Transportasi TCP/IP menghitung jumlah pelengkap seseorang untuk pseudoheader TCP/UDP sebelum membongkar perhitungan checksum untuk paket TCP/UDP, seperti yang dijelaskan dalam Tugas Offloading Checksum.

Menonaktifkan offload checksum saat Generic Segmentation Offload (GSO) diaktifkan tidak mencegah driver klien menghitung dan memasukkan checksum dalam paket yang dihasilkan oleh fitur GSO. Untuk sepenuhnya menonaktifkan offload checksum, 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 offload checksum dengan pengaturan kunci registri. Kata kunci yang dikelompokkan tidak didukung.

Nilai kata kunci harus berjenis REG_SZ.

Mengonfigurasi offload checksum

Driver klien pertama kali mengiklankan kemampuan offload checksum perangkat keras mereka selama inisialisasi adaptor bersih. Ini mungkin terjadi dalam panggilan balik EvtDevicePrepareHardware mereka sebelum memulai adaptor net.

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

  1. Mengalokasikan 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 penunjuk 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 terima (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 panggilan balik EVT_NET_ADAPTER_OFFLOAD_SET_RX_CHECKSUM . Sistem memanggil panggilan balik ini nanti jika kemampuan offload aktif berubah.

Aturan untuk menunjukkan kemampuan checksum pengiriman perangkat keras

  1. Layer3Flags dalam struktur NET_ADAPTER_OFFLOAD_TX_CHECKSUM_CAPABILITIES harus diatur. Mengatur Layer4Flags bersifat opsional. Mengatur Layer3Flags dan Layer4Flags menunjukkan paket tempat 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 menunjukkan kemampuan checksum terima perangkat keras

NetAdapterCx tidak mengharuskan driver untuk mengiklankan kemampuan checksum penerima perangkat keras. Jika offload checksum diaktifkan, NIC harus melakukan offload checksum pada semua paket yang dapat ditanganinya. Jika NIC tidak dapat melakukan offload checksum pada paket, NetAdapterCx akan membongkarnya dalam perangkat lunak.

Contoh ini menunjukkan bagaimana driver klien dapat mengatur 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 offload perangkat keras

Jika tumpukan TCP/IP atau driver protokol yang terlalu berlebihan meminta perubahan pada kemampuan aktif adaptor bersih, NetAdapterCx memanggil panggilan balik EVT_NET_ADAPTER_OFFLOAD_SET_TX_CHECKSUM atau EVT_NET_ADAPTER_OFFLOAD_SET_RX_CHECKSUM driver klien yang terdaftar selama inisialisasi adaptor. 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:

Contoh berikut menunjukkan bagaimana driver klien mungkin 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 tempat ia melakukan tugas checksum, driver klien memvalidasi checksum dan mengatur bendera yang sesuai dalam struktur NET_PACKET_CHECKSUM .

Bendera dapat berupa salah satu dari yang berikut ini:

Bendera Deskripsi
NetPacketRxChecksumEvaluationNotChecked NIC tidak dapat memvalidasi checksum paket
NetPacketRxChecksumEvaluationValid Checksum paket valid
NetPacketRxChecksumEvaluationInvalid Checksum paket tidak valid