Bagikan melalui


Menerima offload Segment Coalescing (RSC)

Saat menerima data, sebagian besar lapisan dalam tumpukan TCP/IP harus melihat informasi header setiap segmen secara terpisah. Ini membuat sejumlah besar overhead ketika sejumlah besar data diterima.

Menerima coalescing segmen (RSC) mengurangi overhead ini dengan menyatukan urutan segmen yang diterima dan menunjukkannya meningkatkan tumpukan TCP/IP dalam satu segmen yang dikoaleskan. Lapisan atas dalam tumpukan TCP/IP hanya perlu melihat satu header untuk seluruh urutan.

Kartu antarmuka jaringan (NIC) yang mendukung RSC dalam perangkat keras dapat sangat meningkatkan performa jalur penerimaan. Ini juga dapat mengurangi pemanfaatan CPU host karena membebaskan lapisan protokol dari melakukan RSC dalam perangkat lunak.

Untuk detail selengkapnya tentang RSC, lihat Gambaran Umum Penerimaan Coalescing Segmen.

NetAdapterCX juga mendukung UDP RSC (URO) mulai versi 2.5. Untuk detail selengkapnya, lihat Offload RSC UDP (URO).

Kata kunci INF untuk mengontrol offload RSC

NetAdapterCx memeriksa kata kunci registri dan menghormatinya saat mengaktifkan kemampuan offload aktif. Driver tidak perlu mengambil tindakan lebih lanjut.

Kata kunci RSC yang ditentukan dalam Kata Kunci INF Standar untuk RSC dapat digunakan untuk mengaktifkan/menonaktifkan offload RSC dengan pengaturan kunci registri.

Nilai kata kunci harus berjenis REG_SZ.

Mengonfigurasi offload RSC

Driver klien terlebih dahulu mengiklankan kemampuan RSC perangkat keras mereka selama inisialisasi adaptor bersih. Ini mungkin terjadi dalam panggilan balik EvtDevicePrepareHardware mereka sebelum memulai adaptor bersih.

Untuk mengonfigurasi kemampuan RSC, driver klien:

  1. Mengalokasikan struktur NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES .

  2. Memanggil NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES_INIT untuk menginisialisasi struktur.

  3. Memanggil NetAdapterOffloadSetRscCapabilities untuk mendaftarkan struktur dengan NetAdapterCx.

Selama panggilan ke NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES_INIT driver klien menyediakan pointer ke panggilan balik EVT_NET_ADAPTER_OFFLOAD_SET_RSC. Sistem memanggil panggilan balik ini nanti jika kemampuan offload aktif berubah.

Aturan untuk menunjukkan kemampuan RSC perangkat keras

  1. Driver klien TIDAK boleh melakukan RSC perangkat lunak pada semua jenis lalu lintas yang tidak memiliki dukungan perangkat keras di NIC.

Aturan berikut berlaku untuk struktur NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES:

  1. NetAdapterOffloadLayer3FlagIPv4NoOptions dan NetAdapterOffloadLayer3FlagIPv6NoExtensions merupakan satu-satunya nilai yang valid untuk bidang Layer3Flags . Bendera ini menunjukkan dukungan IPv4 dan IPv6 masing-masing.

  2. NetAdapterOffloadLayer4FlagTcpNoOptions dan NetAdapterOffloadLayer4FlagUdp merupakan satu-satunya nilai yang valid untuk bidang Layer4Flags . Bendera ini menunjukkan dukungan TCP dan UDP masing-masing.

  3. Bendera Lapisan 3 harus diatur jika NetAdapterOffloadLayer4FlagTcpNoOptions bendera diatur.

  4. Bidang TcpTimestampOption bersifat opsional. Driver klien mengatur bidang ini setelah memanggil NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES_INIT dan sebelum memanggil NetAdapterOffloadSetRscCapabilities untuk menunjukkan apakah NIC mendukung opsi tanda waktu TCP.

Contoh berikut menunjukkan bagaimana driver klien dapat menyiapkan kemampuan offload perangkat keras RSC-nya.

VOID
MyAdapterSetRscOffloadCapabilities(
    NETADAPTER NetAdapter
)
{
    // Configure the hardware's RSC offload capabilities
    NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES rscOffloadCapabilities;
    NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES_INIT(
        &rscOffloadCapabilities,
        NetAdapterOffloadLayer3FlagIPv4NoOptions | NetAdapterOffloadLayer3FlagIPv6NoExtensions,
        NetAdapterOffloadLayer4FlagTcpNoOptions,
        MyEvtAdapterOffloadSetRsc);
    rscOffloadCapabilities.TcpTimestampOption = FALSE;

    // Set the current RSC offload capabilities and register the callback for future changes in active capabilities
    NetAdapterOffloadSetRscCapabilities(NetAdapter, &rscOffloadCapabilities);
}

Memperbarui offload perangkat keras RSC

Jika tumpukan TCP/IP atau driver protokol yang terlalu besar meminta perubahan pada kemampuan RSC aktif adaptor bersih, NetAdapterCx memanggil panggilan balik EVT_NET_ADAPTER_OFFLOAD_SET_RSC driver klien yang terdaftar di NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES. Dalam panggilan balik ini, sistem menyediakan kemampuan yang diperbarui di objek NETOFFLOAD yang dapat dikueri driver klien untuk memperbarui kemampuan offload-nya.

Driver klien dapat memanggil fungsi berikut untuk menentukan offload RSC mana yang diaktifkan:

Contoh berikut menunjukkan bagaimana driver klien mungkin memperbarui kemampuan offload RSC-nya:

VOID
MyEvtAdapterOffloadSetRsc(
    NETADAPTER NetAdapter,
    NETOFFLOAD Offload
)
{
    PMY_NET_ADAPTER_CONTEXT adapterContext = NetvAdapterGetContext(NetAdapter);

    // Store the updated information in the context
    adapterContext->IsRscIPv4Enabled = NetOffloadIsTcpRscIPv4Enabled(Offload);
    adapterContext->IsRscIPv6Enabled = NetOffloadIsTcpRscIPv6Enabled(Offload);
    adapterContext->IsRscTcpTimestampOptionEnabled = NetOffloadIsRscTcpTimestampOptionEnabled(Offload);
}

Offload RSC UDP (URO)

URO memungkinkan coalescing segmen UDP yang diterima. 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. Untuk informasi tentang aturan URO, lihat Aturan untuk menyaring paket UDP .

Kata kunci URO yang ditentukan dalam kata kunci INF untuk mengontrol URO dapat digunakan untuk mengaktifkan/menonaktifkan URO dengan pengaturan kunci registri.

Driver klien NetAdapterCx dapat menggunakan struktur RSC dan API RSC yang ada untuk URO. Untuk mengonfigurasi URO, driver klien harus mengatur bidang Layer4Flags di struktur NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES ke NetAdapterOffloadLayer4FlagUdp.

Perilaku URO mencerminkan RSC dengan satu pengecualian. Ketika panggilan balik EVT_NET_ADAPTER_OFFLOAD_SET_RSC menonaktifkan URO, driver harus menunjukkan segmen coalesced yang ada dan menunggu sampai semua indikasi URO yang beredar selesai. Pendekatan ini memastikan bahwa tidak ada indikasi URO yang aktif setelah panggilan balik kembali.