Tugas Checksum Offloading
NDIS mendukung pembongkaran tugas checksum TCP/IP pada durasi.
Catatan
Data offload out-of-band (OOB) checksum disimpan dalam array informasi NET_BUFFER_LIST . Untuk informasi selengkapnya tentang data OOB, lihat Mengakses Informasi NET_BUFFER_LIST Offload TCP/IP.
Sebelum meneruskan ke driver miniport, struktur NET_BUFFER_LIST untuk paket tempat driver miniport akan melakukan tugas checksum, transportasi TCP/IP menentukan informasi checksum yang terkait dengan struktur NET_BUFFER_LIST. Informasi ini ditentukan oleh struktur NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO , yang merupakan bagian dari informasi NET_BUFFER_LIST (data di luar band) yang terkait dengan struktur NET_BUFFER_LIST.
Sebelum membongkar perhitungan checksum untuk paket TCP, transportasi TCP/IP menghitung jumlah pelengkap seseorang untuk pseudoheader TCP. Transportasi TCP/IP menghitung jumlah pelengkap seseorang di semua bidang di pseudoheader, termasuk Alamat IP Sumber, Alamat IP Tujuan, Protokol, dan panjang TCP untuk paket TCP. Transportasi TCP/IP memasuki jumlah pelengkap seseorang untuk pseudoheader di bidang Checksum header TCP.
Jumlah pelengkap seseorang untuk pseudoheader yang disediakan oleh transportasi TCP/IP memberi NIC awal dalam menghitung checksum TCP nyata untuk paket kirim. Untuk menghitung checksum TCP aktual, NIC menghitung bagian variabel dari checksum TCP (untuk header dan payload TCP), menambahkan checksum ini ke jumlah pelengkap seseorang untuk pseudoheader yang dihitung oleh transportasi TCP/IP, dan menghitung pelengkap 16-bit satu untuk checksum. Untuk informasi selengkapnya tentang menghitung checksum tersebut, lihat RFC 793 dan RFC 1122.
Catatan
Transportasi TCP/IP menghitung jumlah pelengkap seseorang untuk pseudoheader paket UDP menggunakan langkah yang sama seperti yang dilakukan untuk paket TCP, dan menyimpan nilai di bidang Checksum header UDP.
Perhatikan bahwa transportasi TCP/IP selalu memastikan bahwa bidang checksum di header IP paket diatur ke nol sebelum meneruskan paket ke driver miniport yang mendasar. Driver miniport harus mengabaikan bidang checksum di header IP. Driver miniport tidak perlu memverifikasi bahwa bidang checksum diatur ke nol dan tidak perlu mengatur bidang ini ke nol.
Setelah menerima struktur NET_BUFFER_LIST dalam fungsi MiniportSendNetBufferLists atau MiniportCoSendNetBufferLists , driver miniport biasanya melakukan pemrosesan checksum berikut:
Driver miniport memanggil makro NET_BUFFER_LIST_INFO dengan _IdTcpIpChecksumNetBufferListInfo untuk mendapatkan struktur NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO .
Driver miniport menguji bendera IsIPv4 dan IsIPv6 dalam struktur NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO. Jika bendera IsIPv4 dan IsIPv6 tidak diatur, NIC tidak boleh melakukan operasi checksum pada paket.
Jika bendera IsIPv4 atau IsIPv6 diatur, driver miniport menguji bendera TcpChecksum, UdpChecksum, dan IpHeaderChecksum untuk menentukan checksum mana yang harus dihitung NIC untuk paket.
Driver miniport meneruskan paket ke NIC, yang menghitung checksum yang sesuai untuk paket. Jika paket memiliki header IP terowongan dan header IP transportasi, NIC yang mendukung offload checksum IP melakukan tugas checksum IP hanya pada header terowongan. Transportasi TCP/IP melakukan tugas checksum IP pada header IP transportasi.
Sebelum menunjukkan struktur NET_BUFFER_LIST untuk paket penerima tempatnya melakukan tugas checksum, driver miniport memvalidasi checksum yang sesuai dan mengatur bendera XxxChecksumFailed atau XxxChecksumSucceeded yang sesuai dalam struktur NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO.
Menonaktifkan Offload Checksum Alamat saat Offload Kirim Besar (LSO) diaktifkan tidak mencegah driver miniport menghitung dan menyisipkan checksum dalam paket yang dihasilkan oleh fitur LSO. Untuk menonaktifkan Offload Address Checksum dalam hal ini, pengguna juga harus menonaktifkan LSO.