Bagikan melalui


UDP Menerima Offload Coalescing Segmen (URO)

Mulai Windows 11, versi 24H2, UDP Receive Segment Coalescing Offload (URO) memungkinkan kartu antarmuka jaringan (NIC) untuk menyatukan segmen penerima UDP. NIC dapat menggabungkan datagram UDP dari alur yang sama yang cocok dengan sekumpulan aturan ke dalam buffer yang berdampingan secara logis. Datagram gabungan ini kemudian ditunjukkan ke tumpukan jaringan Windows sebagai satu paket besar.

Datagram UDP coalescing mengurangi biaya CPU untuk memproses paket dalam aliran bandwidth tinggi, menghasilkan throughput yang lebih tinggi dan lebih sedikit siklus per byte.

Bagian berikut menjelaskan aturan untuk menyatukan paket UDP dan cara menulis driver miniport URO.

Aturan untuk menyaring paket UDP

Coalescing URO hanya dapat dicoba pada paket yang memenuhi semua kriteria berikut:

  • IpHeader.Version identik untuk semua paket.
  • IpHeader.SourceAddress dan IpHeader.DestinationAddress identik untuk semua paket.
  • UdpHeader.SourcePort dan UdpHeader.DestinationPort identik untuk semua paket.
  • UdpHeader.Length identik untuk semua paket, kecuali paket terakhir, yang mungkin kurang.
  • UdpHeader.Length harus nonzero.
  • UdpHeader.Checksum, jika bukan nol, harus benar pada semua paket. Ini berarti bahwa menerima offload checksum harus memvalidasi paket.
  • Header Lapisan 2 harus identik untuk semua paket.

Jika paket adalah IPv4, paket tersebut juga harus memenuhi kriteria berikut:

  • IPv4Header.Protocol == 17 (UDP) untuk semua paket.
  • EthernetHeader.EtherType == 0x0800 untuk semua paket.
  • IPv4Header.HeaderChecksum pada paket yang diterima harus benar. Ini berarti bahwa menerima offload checksum harus memvalidasi header.
  • IPv4Header.HeaderLength == 5 (tanpa Header Opsi IPv4) untuk semua paket.
  • IPv4Header.ToS identik untuk semua paket.
  • IPv4Header.ECN identik untuk semua paket.
  • IPv4Header.DontFragment identik untuk semua paket.
  • IPv4Header.TTL identik untuk semua paket.
  • IPv4Header.TotalLength == UdpHeader.Length + length(IPv4Header) untuk semua paket.

Jika paket adalah IPv6, paket tersebut juga harus memenuhi kriteria berikut:

  • IPv6Header.NextHeader == 17 (UDP) untuk semua paket (tanpa header ekstensi).
  • EthernetHeader.EtherType == 0x86dd (IPv6) untuk semua paket.
  • IPv6Header.TrafficClass dan IPv6Header.ECN identik untuk semua paket.
  • IPv6Header.FlowLabel identik untuk semua paket.
  • IPv6Header.HopLimit identik untuk semua paket.
  • IPv6Header.PayloadLength == UdpHeader.Length untuk semua paket.

Struktur paket URO

Single Coalesced Unit (SCU) yang dihasilkan harus memiliki satu header IP dan header UDP, diikuti dengan payload UDP untuk semua datagram yang digabungkan bersama-sama.

Indikasi URO harus mengatur bidang IPv4Header.TotalLength ke panjang total bidang SCU, atau IPv6Header.PayloadLength ke panjang payload UDP dan bidang UdpHeader.Length ke panjang payload yang dikoalesced.

Jika header Layer 2 (L2) ada dalam datagram coalesced, SCU harus berisi header L2 yang valid. Header L2 di SCU harus menyerupai header L2 dari datagram yang di-coalesced.

Validasi dan indikasi checksum

Indikasi URO harus mengatur bidang IPv4Header.HeaderChecksum dan UdpHeader.Checksum ke nol dan mengisi informasi out-of-band offload checksum pada SCU yang menunjukkan keberhasilan checksum IPv4 dan UDP.

Paket yang cocok dengan semua kondisi untuk di-coalesced tetapi validasi checksum gagal harus ditunjukkan secara terpisah. Paket yang diterima setelah itu tidak boleh dikoalesced dengan paket yang diterima sebelum itu.

Misalnya, paket 1, 2, 3, 4, dan 5 diterima dari alur yang sama, tetapi paket 3 gagal validasi checksum. Paket 1 dan 2 dapat dikoaleskasi bersama-sama, dan paket 4 dan 5 dapat dikoaleskasi bersama-sama, tetapi paket 3 tidak boleh dikoaleskasi dengan salah satu SCU. Paket 1 dan 2 tidak boleh dikoaleskasi bersama dengan paket 4 dan 5. Paket 2 adalah paket terakhir dalam SCU dan paket 4 memulai SCU baru. Selain itu, SCU yang berisi paket 1 dan 2 harus ditunjukkan sebelum paket 3 ditunjukkan dan paket 3 harus ditunjukkan sebelum SCU yang berisi paket 4 dan 5.

Coalescing paket dan pemisahan aliran

Paket dari beberapa alur dapat dikoaleskan secara paralel, karena perangkat keras dan memori mengizinkan. Paket dari alur yang berbeda tidak boleh digabungkan bersama-sama.

Paket dari beberapa penerimaan yang diselingi dapat dipisahkan dan dikoalesced dengan alur masing-masing. Misalnya, alur yang diberikan A, B, dan C, jika paket tiba dalam urutan A, A, B, C, B, A, paket dari aliran A dapat dikoaleskan ke AAA, dan paket dari aliran B dikoalesk ke dalam BB, sementara paket dari aliran C dapat ditunjukkan secara normal atau dikoaleskan dengan SCU yang tertunda dari aliran C.

Paket dalam alur tertentu tidak boleh diurutkan ulang sehubungan satu sama lain. Misalnya, paket dari alur A harus digabungkan dalam urutan yang diterima, terlepas dari paket dari alur B dan C yang diterima di antaranya.

Kata kunci INF untuk mengontrol URO

Kata kunci berikut dapat digunakan untuk mengaktifkan/menonaktifkan URO dengan pengaturan kunci registri.

*UdpRsc

Kata kunci INF standar enumerasi memiliki atribut berikut:

SubkeyName
Nama kata kunci yang harus Anda tentukan dalam file INF dan yang muncul di registri.

ParamDesc
Teks tampilan yang terkait dengan SubkeyName.

Nilai
Nilai bilangan bulat enumerasi yang terkait dengan setiap opsi dalam daftar. Nilai ini disimpan dalam NDI\params\ SubkeyName\Value.

EnumDesc
Teks tampilan yang terkait dengan setiap nilai yang muncul di menu.

Default
Nilai default untuk menu.

SubkeyName ParamDesc Nilai EnumDesc
*UdpRsc URO 0 Nonaktif
1 (Default) Diaktifkan

Untuk informasi selengkapnya tentang menggunakan kata kunci enumerasi, lihat Kata Kunci Enumerasi.

Menulis driver miniport URO

Mulai dari NDIS 6.89, antarmuka NDIS untuk URO memfasilitasi komunikasi antara TCP/IP dan driver miniport NDIS.

Laporkan kemampuan URO

Driver miniport mengiklankan dukungan untuk URO di anggota UdpRsc dari struktur NDIS_OFFLOAD, yang diteruskannya ke fungsi NdisMSetMiniportAttributes.

Kemampuan URO kueri

Untuk memeriksa apakah driver miniport mendukung URO, driver NDIS, dan aplikasi lain dapat meminta OID_TCP_OFFLOAD_HARDWARE_CAPABILITIES OID, yang mengembalikan struktur NDIS_OFFLOAD .

Status URO kueri

Untuk menentukan status URO saat ini, driver NDIS dan aplikasi lain dapat meminta permintaan OID OID_TCP_OFFLOAD_CURRENT_CONFIG . NDIS menangani OID ini dan tidak meneruskannya ke miniport.

Mengubah status URO

URO dapat diaktifkan atau dinonaktifkan dengan mengeluarkan permintaan OID OID_TCP_OFFLOAD_PARAMETERS. OID ini menggunakan struktur NDIS_OFFLOAD_PARAMETERS. Dalam struktur ini, anggota UdpRsc.Enabled dapat memiliki nilai berikut:

Nilai Makna
NDIS_OFFLOAD_PARAMETERS_UDP_RSC_NO_CHANGE
0
Driver miniport tidak boleh mengubah pengaturan saat ini.
NDIS_OFFLOAD_PARAMETERS_UDP_RSC_DISABLED
1
URO dinonaktifkan.
NDIS_OFFLOAD_PARAMETERS_UDP_RSC_ENABLED
2
URO diaktifkan.

Ketika driver memproses permintaan OID OID_TCP_OFFLOAD_PARAMETERS dengan NDIS_OFFLOAD_PARAMETERS_UDP_RSC_DISABLED set bendera, NIC harus menunggu untuk menyelesaikan permintaan sampai semua segmen bersatu yang ada dan indikasi URO yang beredar ditunjukkan. Ini memastikan sinkronisasi URO mengaktifkan/menonaktifkan peristiwa di seluruh komponen NDIS.

Setelah driver miniport memproses permintaan OID OID_TCP_OFFLOAD_PARAMETERS , driver miniport harus mengeluarkan indikasi status NDIS_STATUS_TASK_OFFLOAD_CURRENT_CONFIG dengan status offload yang diperbarui.

NDIS_OFFLOAD_PARAMETERS_SKIP_REGISTRY_UPDATE Bendera di NDIS_OFFLOAD_PARAMETERS memungkinkan penonaktifan URO khusus runtime. Perubahan yang dilakukan dengan bendera ini tidak disimpan ke registri.

Menolak URO di NDIS 6.89 dan yang lebih baru

Driver yang menargetkan NDIS 6.89 dan yang lebih baru harus memahami paket URO dan menanganinya dengan anggun. Untuk menolak URO:

Pendekatan ini memastikan komponen yang tidak terbiasa dengan URO tidak menerima NBL URO. NDIS menonaktifkan URO pada miniport selama pengikatan jika LWF atau driver protokol yang tidak mendukung URO ada.

Pertimbangan pemrograman untuk driver URO

Pertimbangkan masalah berikut saat menerapkan driver miniport berkemampu URO.

Winsock URO API

Untuk informasi tentang API Winsock URO, lihat opsi soket IPPROTO_UDP. Lihat informasi tentang UDP_RECV_MAX_COALESCED_SIZE dan UDP_COALESCED_INFO.

Pembaruan tumpukan TCP/IP Windows

Transportasi TCP/IP Microsoft memungkinkan URO pada waktu pengikatan dengan NDIS, kecuali konfigurasi mencegahnya melakukannya.

Callout WFP dapat digunakan FWP_CALLOUT_FLAG_ALLOW_URO dalam FWPS_CALLOUT2 untuk mengiklankan dukungan mereka untuk URO. Jika callout WFP yang tidak kompatibel terdaftar di lapisan Sensitif URO, MAKA OS akan menonaktifkan URO saat callout terdaftar.

Jika soket ikut serta ke URO dengan ukuran maksimum yang dikoalesced lebih besar dari atau sama dengan ukuran offload perangkat keras, maka tumpukan akan mengirimkan NBL dari perangkat keras yang tidak dimodifikasi ke soket. Jika soket ikut serta ke ukuran baralesced maks yang lebih kecil, tumpukan akan memecah penerimaan batubara menjadi ukuran yang lebih kecil untuk soket.

Jika soket tidak ikut serta dalam URO, maka tumpukan akan menerima resegmen untuk soket tersebut. Dengan tidak adanya URO perangkat keras, fitur URO perangkat lunak yang ada akan terus tersedia.