Offload Segmentasi UDP (USO)

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

Persyaratan untuk USO

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

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

  • Hitung checksum IP untuk paket terkirim yang berisi opsi IPv4
  • Hitung 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 tidak nol, maka driver miniport harus melakukan USO. Setiap NET_BUFFER_LIST yang berisi data USO OOB juga berisi satu struktur NET_BUFFER . Namun, dalam kasus di mana pengemudi miniport telah menerima OID_TCP_OFFLOAD_PARAMETERS untuk mematikan USO, setelah pengemudi miniport berhasil menyelesaikan OID, ia harus menolak dan mengembalikan NET_BUFFER_LIST yang memiliki set bidang OOB USO.

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

  • Paket tersebut 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 diturunkan oleh transport harus memiliki Length % MSS == 0. Artinya, paket besar dibagi menjadi paket N dengan setiap segmen paket yang berisi byte pengguna MSS persis. Jika driver miniport menetapkan kemampuan SubMssFinalSegmentSupported , maka kondisi tembus pandang panjang paket ini pada transportasi tidak berlaku. Dengan kata lain, segmen akhir bisa kurang dari MSS.
  • Paket ini bukan paket loopback.
  • Bit MF di header IP dari paket UDP besar yang diangkut TCP / IP yang diturunkan tidak akan diatur, dan Fragment Offset 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:

  • Memperbarui 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 komplemen seseorang untuk pseudoheader UDP dan menulis jumlah ini ke bidang Checksum header UDP. Transportasi TCP /IP menghitung jumlah pelengkap seseorang atas bidang berikut di pseudoheader: Alamat IP Sumber, Alamat IP Tujuan, dan Protokol.

Jumlah komplemen seseorang untuk pseudoheader yang disediakan oleh transportasi TCP / IP memberi NIC awal awal dalam menghitung checksum UDP nyata untuk setiap paket yang berasal 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 yang mendasari dan NIC menghasilkan datagram UDP dari paket besar yang diturunkan oleh transportasi TCP / IP, transportasi tidak tahu ukuran payload UDP untuk setiap datagram UDP dan dengan demikian tidak dapat menyertakan Panjang UDP dalam perhitungan pseudoheader. Sebaliknya, seperti yang dijelaskan di bagian berikut, NIC memperluas checksum pseudoheader yang dipasok oleh transportasi TCP / IP untuk menutupi 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 memperoleh NET_BUFFER_LIST dalam fungsi callback MiniportSendNetBufferLists , ia dapat memanggil makro NET_BUFFER_LIST_INFO dengan _IdUdpSegmentationOffloadInfo untuk mendapatkan nilai MSS dan protokol IP.

Driver miniport memperoleh 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 , maka 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 komplemen seseorang untuk pseudoheader yang dihitung oleh transportasi TCP / IP, kemudian menghitung komplemen 16-bit seseorang untuk checksum. Untuk informasi lebih lanjut 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 oleh 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 kirim LSO yang menggunakan nilai MaxOffLoadSize sebelumnya. Sebaliknya, pengemudi harus gagal dalam permintaan kirim. 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 kemampuan mereka berubah.

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

Pengemudi miniport-intermediate yang merespons OID_TCP_OFFLOAD_PARAMETERS untuk mematikan layanan USO harus disiapkan untuk jendela waktu kecil di mana permintaan USO masih bisa mencapai pengemudi miniport.

Jumlah paket segmentasi yang diejek 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 menyegmentasikan 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 diperlukan untuk melakukannya. NBL tidak dapat diselesaikan kembali ke NDIS sampai semua paket tersegmentasi telah ditransmisikan atau gagal.

Pengemudi 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 template untuk menghasilkan header UDP dan IP untuk setiap paket tersegmentasi.
  • Gunakan nilai identifikasi IP (IP ID) dalam rentang dari 0x0000 hingga 0xFFFF. Misalnya, jika header IP template dimulai dengan nilai bidang Identifikasi 0xFFFE, paket datagram UDP pertama harus memiliki nilai 0xFFFE, diikuti oleh 0xFFFF, 0x0000, 0x0001, dan sebagainya.
  • Jika paket UDP besar berisi opsi IP, driver miniport menyalin opsi ini, tidak berubah, 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.
  • Increment 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 pada NDIS 6.83 yang memungkinkan tumpukan driver TCP / IP host untuk memanfaatkan kemampuan USO yang diekspos oleh driver miniport.

NDIS dan pengemudi miniport melakukan hal berikut:

  • Iklankan bahwa NIC mendukung kemampuan USO
  • Mengaktifkan atau menonaktifkan USO
  • Dapatkan status fungsionalitas USO saat ini

Kemampuan USO Iklan

Driver miniport mengiklankan kemampuan USO dengan mengisi bidang UdpSegmentation dari struktur NDIS_OFFLOAD , yang dilewatkan 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 dipertanyakan 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, ia harus mengirim indikasi status NDIS_STATUS_TASK_OFFLOAD_CURRENT_CONFIG dengan status offload yang diperbarui.

Kata kunci USO

Kata kunci pencacahan 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 subkunci Deskripsi parameter Nilai Deskripsi enum
*UsoIPv4 Offload Segmentasi UDP (IPv4) 0 Nonaktif
1 Aktif
*UsoIPv6 Offload Segmentasi UDP (IPV6) 0 Nonaktif
1 Aktif