Fungsi Hashing RSS

Gambaran Umum

NIC atau driver miniport-nya menggunakan fungsi hashing RSS untuk menghitung nilai hash RSS.

Driver yang terlalu berlebihan mengatur jenis hash, fungsi, dan tabel untuk menetapkan koneksi ke CPU. Untuk informasi selengkapnya, lihat Konfigurasi RSS.

Fungsi hashing dapat berupa salah satu hal berikut:

  • NdisHashFunctionToeplitz
  • NdisHashFunctionReserved1
  • NdisHashFunctionReserved2
  • NdisHashFunctionReserved3

Catatan

Saat ini, NdisHashFunctionToeplitz adalah satu-satunya fungsi hashing yang tersedia untuk driver miniport. Fungsi hashing lainnya disediakan untuk NDIS. 

Driver miniport harus mengidentifikasi fungsi hashing dan nilai yang digunakannya di setiap struktur NET_BUFFER_LIST sebelum driver menunjukkan data yang diterima. Untuk informasi selengkapnya, lihat Menunjukkan RSS Menerima Data.

Contoh

Empat contoh pseudocode berikut menunjukkan cara menghitung nilai hash NdisHashFunctionToeplitz . Contoh-contoh ini mewakili empat jenis hash yang mungkin tersedia untuk NdisHashFunctionToeplitz. Untuk informasi selengkapnya tentang jenis hash, lihat Jenis Hashing RSS.

Untuk menyederhanakan contoh, algoritma umum yang memproses aliran byte input diperlukan. Format khusus untuk aliran byte ditentukan nanti dalam empat contoh.

Driver yang terlalu berlebihan menyediakan kunci rahasia (K) ke driver miniport untuk digunakan dalam perhitungan hash. Kuncinya panjangnya 40 byte (320 bit). Untuk informasi selengkapnya tentang kunci, lihat Konfigurasi RSS.

Mengingat array input yang berisi n byte, aliran byte didefinisikan sebagai berikut:

input[0] input[1] input[2] ... input[n-1]

Byte paling kiri adalah input[0], dan bit input yang paling signifikan[0] adalah bit paling kiri. Byte paling kanan adalah input[n-1], dan bit input paling tidak signifikan[n-1] adalah bit paling kanan.

Mengingat definisi sebelumnya, pseudocode untuk memproses aliran byte input umum didefinisikan sebagai berikut:

ComputeHash(input[], n)

result = 0
For each bit b in input[] from left to right
{
if (b == 1) result ^= (left-most 32 bits of K)
shift K left 1 bit position
}

return result

Pseudocode berisi entri formulir @n-m. Entri ini mengidentifikasi rentang byte dari setiap elemen dalam paket TCP.

Contoh Perhitungan Hash untuk IPv4 dengan Header TCP

Gabungkan bidang SourceAddress, DestinationAddress, SourcePort, dan DestinationPort dari paket ke dalam array byte, mempertahankan urutan terjadinya dalam paket:

Input[12] = @12-15, @16-19, @20-21, @22-23
Result = ComputeHash(Input, 12)

Contoh Perhitungan Hash untuk IPv4 Saja

Gabungkan bidang SourceAddress dan DestinationAddress paket ke dalam array byte.

Input[8] = @12-15, @16-19
Result = ComputeHash(Input, 8) 

Contoh Perhitungan Hash untuk IPv6 dengan Header TCP

Gabungkan bidang SourceAddress, DestinationAddress, SourcePort, dan DestinationPort dari paket ke dalam array byte, mempertahankan urutan terjadinya dalam paket.

Input[36] = @8-23, @24-39, @40-41, @42-43
Result = ComputeHash(Input, 36)

Contoh Perhitungan Hash untuk IPv6 Saja

Gabungkan bidang SourceAddress dan DestinationAddress paket ke dalam array byte.

Input[32] = @8-23, @24-39
Result = ComputeHash(Input, 32)