Offload Segmentasi UDP (USO)

UDP Segmentation Offload (USO), yang didukung dalam Windows 10, versi 2004 dan yang lebih baru, adalah fitur yang memungkinkan kartu antarmuka jaringan (NIC) untuk membongkar segmentasi datagram UDP yang lebih besar dari unit transmisi maksimum (MTU) media jaringan. Dengan demikian, Windows mengurangi pemanfaatan CPU yang terkait dengan pemrosesan TCP/IP per paket. Persyaratan untuk USO mirip dengan LSOv2, yang untuk protokol transportasi TCP.

Persyaratan untuk USO

Bagian ini terutama mengacu pada protokol NDIS dan driver miniport. Driver filter ringan (LWF) NDIS harus mengikuti persyaratan driver protokol saat memodifikasi atau mengirim paket, dan juga dapat mengasumsikan bahwa paket apa pun yang disediakan untuk handler FilterSendNetBufferLists memenuhi persyaratan driver protokol.

Driver Miniport dapat membongkar segmentasi paket UDP besar yang lebih besar dari MTU media jaringan. NIC yang mendukung segmentasi paket UDP besar juga harus dapat melakukan hal berikut:

  • Menghitung checksum IP untuk paket terkirim yang berisi opsi IPv4
  • Menghitung checksum UDP untuk paket terkirim

Driver miniport yang mendukung USO harus menentukan jenis offload dari informasi out of band (OOB) struktur NET_BUFFER_LIST . Jika nilai struktur NDIS_UDP_SEGMENTATION_OFFLOAD_NET_BUFFER_LIST_INFO bukan nol, maka driver miniport harus melakukan USO. Setiap NET_BUFFER_LIST yang berisi data OOB USO juga berisi struktur NET_BUFFER tunggal. Namun, dalam kasus di mana driver miniport telah menerima OID_TCP_OFFLOAD_PARAMETERS untuk mematikan USO, setelah driver miniport berhasil menyelesaikan OID, driver tersebut harus menolak dan mengembalikan NET_BUFFER_LIST apa pun yang memiliki set bidang OOB USO.

Transportasi TCP/IP hanya membongkar paket UDP yang memenuhi kriteria berikut:

  • Paket adalah paket UDP.
  • Panjang paket harus lebih besar dari ukuran segmen maksimum (MSS) * (MinSegmentCount - 1).
  • Jika driver miniport tidak mengatur kemampuan SubMssFinalSegmentSupported , maka setiap paket UDP besar yang dilepaskan oleh transportasi harus memiliki Panjang % MSS == 0. Artinya, paket besar dapat dibagi menjadi paket N dengan setiap segmen paket yang berisi byte pengguna MSS persis. Jika driver miniport mengatur kemampuan SubMssFinalSegmentSupported , maka kondisi pembagibilitas panjang paket pada transportasi ini tidak berlaku. Dengan kata lain, segmen akhir bisa kurang dari MSS.
  • Paket ini bukan paket loopback.
  • Bit MF di header IP paket UDP besar yang dilepaskan transportasi TCP/IP tidak akan diatur, dan Offset Fragmen di header IP akan menjadi nol.
  • Aplikasi telah menentukan UDP_SEND_MSG_SIZE/WSASetUdpSendMessageSize.

Sebelum membongkar paket UDP besar untuk segmentasi, transportasi TCP/IP melakukan hal berikut:

  • Updates informasi segmentasi paket besar yang terkait dengan struktur NET_BUFFER_LIST. Informasi ini adalah struktur NDIS_UDP_SEGMENTATION_OFFLOAD_NET_BUFFER_LIST_INFO yang merupakan bagian dari informasi OOB struktur NET_BUFFER_LIST . Transportasi TCP/IP menetapkan nilai MSS ke MSS yang diinginkan.
  • Menghitung jumlah pelengkap seseorang untuk pseudoheader UDP dan menulis jumlah ini ke bidang Checksum header UDP. Transportasi TCP/IP menghitung jumlah pelengkap seseorang di atas bidang berikut di pseudoheader: Alamat IP Sumber, Alamat IP Tujuan, dan Protokol.

Jumlah pelengkap seseorang untuk pseudoheader yang disediakan oleh transportasi TCP/IP memberi NIC awal dalam menghitung checksum UDP nyata untuk setiap paket yang diperoleh NIC dari paket UDP besar, tanpa harus memeriksa header IP.

Perhatikan bahwa RFC 768 dan RFC 2460 menetapkan bahwa pseudoheader dihitung melalui Alamat IP Sumber, Alamat IP Tujuan, Protokol, dan Panjang UDP (panjang header UDP ditambah panjang payload UDP, tidak termasuk panjang pseudoheader). Namun, karena driver miniport dan NIC yang mendasar menghasilkan datagram UDP dari paket besar yang diturunkan oleh transportasi TCP/IP, transportasi tidak mengetahui ukuran payload UDP untuk setiap datagram UDP dan dengan demikian tidak dapat menyertakan Panjang UDP dalam perhitungan pseudoheader. Sebagai gantinya, seperti yang dijelaskan di bagian berikut, NIC memperluas checksum pseudoheader yang disediakan oleh transportasi TCP/IP untuk mencakup Panjang UDP dari setiap datagram UDP yang dihasilkan.

Penting

Jika bidang checksum header UDP yang disediakan oleh transportasi TCP/IP adalah nol, NIC tidak boleh melakukan perhitungan checksum UDP.

Mengirim paket dengan USO

Setelah driver miniport mendapatkan NET_BUFFER_LIST dalam fungsi panggilan balik MiniportSendNetBufferLists , ia dapat memanggil makro NET_BUFFER_LIST_INFO dengan _IdUdpSegmentationOffloadInfo untuk mendapatkan nilai MSS dan protokol IP.

Driver miniport mendapatkan panjang total paket besar dari panjang struktur NET_BUFFER pertama dan menggunakan nilai MSS untuk membagi paket UDP besar menjadi paket UDP yang lebih kecil. Masing-masing paket yang lebih kecil berisi MSS atau lebih sedikit byte data pengguna. Perhatikan bahwa hanya paket terakhir yang dibuat dari paket besar tersegmentasi yang harus berisi kurang dari byte data pengguna MSS . Semua paket lain yang dibuat dari paket tersegmentasi harus berisi byte data pengguna MSS . Jika driver miniport tidak mematuhi aturan ini, datagram UDP akan salah dikirimkan. Jika driver miniport tidak mengatur kemampuan SubMssFinalSegmentSupported , panjang paket dibagi dengan MSS dan masing-masing paket tersegmentasi berisi byte pengguna MSS .

Driver miniport membubuhkan header MAC, IP, dan UDP ke setiap segmen yang berasal dari paket besar. Driver miniport harus menghitung checksum IP dan UDP untuk paket turunan ini. Untuk menghitung checksum UDP untuk setiap paket yang berasal dari paket UDP besar, NIC menghitung bagian variabel dari checksum UDP (untuk header UDP dan payload UDP), menambahkan checksum ini ke jumlah pelengkap seseorang untuk pseudoheader yang dihitung oleh transportasi TCP/IP, lalu menghitung pelengkap 16-bit satu untuk checksum. Untuk informasi selengkapnya tentang menghitung checksum tersebut, lihat RFC 768 dan RFC 2460.

Panjang data pengguna UDP dalam paket UDP besar harus kurang dari atau sama dengan nilai yang ditetapkan driver miniport ke nilai MaxOffLoadSize .

Setelah driver mengeluarkan indikasi status untuk menunjukkan perubahan pada nilai MaxOffLoadSize , driver tidak boleh menyebabkan pemeriksaan bug jika menerima permintaan pengiriman LSO yang menggunakan nilai MaxOffLoadSize sebelumnya. Sebagai gantinya, driver harus gagal mengirim permintaan. Driver harus gagal setiap permintaan pengiriman yang tidak dapat mereka lakukan, karena alasan apa pun (termasuk ukuran, jumlah segmen minimum, opsi IP, dll.). Driver harus mengirim indikasi status sesegera mungkin jika kemampuannya berubah.

Driver perantara yang secara independen mengeluarkan indikasi status yang melaporkan perubahan nilai MaxOffLoadSize harus memastikan bahwa adaptor miniport yang mendasar yang belum mengeluarkan indikasi status tidak mendapatkan paket apa pun yang lebih besar dari nilai MaxOffLoadSize yang dilaporkan adaptor miniport.

Driver miniport-menengah yang merespons OID_TCP_OFFLOAD_PARAMETERS mematikan layanan USO harus disiapkan untuk jangka waktu yang kecil di mana permintaan USO masih dapat mencapai driver miniport.

Jumlah paket segmentasi yang diturunkan dari paket UDP besar harus sama dengan atau lebih besar dari nilai MinSegmentCount yang ditentukan oleh driver miniport.

Saat memproses paket UDP besar, driver miniport hanya bertanggung jawab untuk mensegmentasi paket dan membubuhkan header MAC, IP, dan UDP ke paket yang berasal dari paket UDP besar. Jika miniport gagal mengirim setidaknya satu paket tersegmentasi, NBL akhirnya harus diselesaikan dengan status kegagalan. Miniport dapat terus mengirim paket berikutnya tetapi tidak diharuskan untuk melakukannya. NBL tidak dapat diselesaikan kembali ke NDIS sampai semua paket tersegmentasi telah dikirimkan atau gagal.

Driver miniport berkemampuan USO juga harus melakukan hal berikut:

  • Mendukung IPv4 dan IPv6.
  • Mendukung replikasi opsi IPv4 dari paket besar di setiap paket tersegmentasi yang dihasilkan NIC.
  • Gunakan header IP dan UDP dalam struktur NET_BUFFER_LIST sebagai templat untuk menghasilkan header UDP dan IP untuk setiap paket tersegmentasi.
  • Gunakan nilai identifikasi IP (ID IP) dalam rentang dari 0x0000 hingga 0xFFFF. Misalnya, jika header IP templat dimulai dengan nilai bidang Identifikasi 0xFFFE, paket datagram UDP pertama harus memiliki nilai 0xFFFE, diikuti dengan 0xFFFF, 0x0000, 0x0001, dan sebagainya.
  • Jika paket UDP besar berisi opsi IP, driver miniport menyalin opsi ini, tidak diubah, ke setiap paket yang berasal dari paket UDP besar.
  • Gunakan offset byte di anggota UdpHeaderOffsetNDIS_UDP_SEGMENTATION_OFFLOAD_NET_BUFFER_LIST_INFO untuk menentukan lokasi header UDP, mulai dari byte pertama paket.
  • Peningkatan mengirimkan statistik berdasarkan paket tersegmentasi. Misalnya, sertakan jumlah byte header Ethernet, IP, dan UDP untuk setiap segmen paket, dan jumlah paket adalah jumlah segmen berukuran MSS, bukan 1.
  • Atur panjang total UDP dan bidang panjang IP berdasarkan setiap ukuran datagram tersegmentasi.

Perubahan antarmuka NDIS

Bagian ini menjelaskan perubahan NDIS 6.83 yang memungkinkan tumpukan driver TCP/IP host untuk memanfaatkan kemampuan USO yang diekspos oleh driver miniport.

NDIS dan driver miniport melakukan hal berikut:

  • Mengiklankan bahwa NIC mendukung kemampuan USO
  • Mengaktifkan atau menonaktifkan USO
  • Mendapatkan status fungsionalitas USO saat ini

Mengiklankan kemampuan USO

Driver Miniport mengiklankan kemampuan USO dengan mengisi bidang UdpSegmentation dari struktur NDIS_OFFLOAD , yang diteruskan dalam parameter NdisMSetMiniportAttributes. Bidang Header.Revision dalam struktur NDIS_OFFLOAD harus diatur ke NDIS_OFFLOAD_REVISION_6 dan bidang Header.Size harus diatur ke NDIS_SIZEOF_NDIS_OFFLOAD_REVISION_6.

Mengkueri status USO

Status USO saat ini dapat dikueri dengan OID_TCP_OFFLOAD_CURRENT_CONFIG. NDIS menangani OID ini dan tidak meneruskannya ke driver miniport.

Mengubah status USO

USO dapat diaktifkan atau dinonaktifkan menggunakan OID_TCP_OFFLOAD_PARAMETERS. Setelah driver miniport memproses OID, driver harus mengirim indikasi status NDIS_STATUS_TASK_OFFLOAD_CURRENT_CONFIG dengan status offload yang diperbarui.

Kata kunci USO

Kata kunci enumerasi USO adalah sebagai berikut:

  • *UsoIPv4
  • *UsoIPv6

Nilai-nilai ini menjelaskan apakah USO diaktifkan atau dinonaktifkan untuk protokol IP tertentu. Pengaturan USO tidak bergantung pada konfigurasi NDIS_TCP_IP_CHECKSUM_OFFLOAD . Misalnya, menonaktifkan *UDPChecksumOffloadIPv4 tidak secara implisit menonaktifkan *UsoIPv4.

Nama sub-kunci Deskripsi parameter Nilai Deskripsi enum
*UsoIPv4 Offload Segmentasi UDP (IPv4) 0 Nonaktif
1 Aktif
*UsoIPv6 Offload Segmentasi UDP (IPV6) 0 Nonaktif
1 Aktif