Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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:
Mengalokasikan sebuah struktur NET_ADAPTER_OFFLOAD_TX_CHECKSUM_CAPABILITIES.
Memanggil NET_ADAPTER_OFFLOAD_TX_CHECKSUM_CAPABILITIES_INIT untuk menginisialisasi struktur.
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:
Mengalokasikan struktur NET_ADAPTER_OFFLOAD_RX_CHECKSUM_CAPABILITIES.
Memanggil NET_ADAPTER_OFFLOAD_RX_CHECKSUM_CAPABILITIES_INIT untuk menginisialisasi struktur.
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
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.
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.
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:
- NetOffloadIsTxChecksumIPv4Enabled
- NetOffloadIsTxChecksumTcpEnabled
- NetOffloadIsTxChecksumUdpEnabled
- NetOffloadIsRxChecksumIPv4Enabled
- NetOffloadIsRxChecksumTcpEnabled
- NetOffloadIsRxChecksumUdpEnabled
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:
Driver klien memanggil fungsi NetExtensionGetPacketChecksum dengan indeks paket untuk mendapatkan struktur NET_PACKET_CHECKSUM .
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.
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 |