RSS ハッシュの種類

概要

RSS ハッシュの種類は、NIC が RSS ハッシュ値の計算に使用する必要がある受信ネットワーク データの部分を指定します。

上位ドライバーは、ハッシュの種類、関数、および間接参照テーブルを設定します。 上位ドライバーセットのハッシュの種類は、ミニポート ドライバーがサポートできる種類のサブセットにすることができます。 詳細については、「RSS の構成」を参照してください。

ハッシュの種類は、次のフラグの有効な組み合わせの OR です。

  • NDIS_HASH_IPV4
  • NDIS_HASH_TCP_IPV4
  • NDIS_HASH_UDP_IPV4
  • NDIS_HASH_IPV6
  • NDIS_HASH_TCP_IPV6
  • NDIS_HASH_UDP_IPV6
  • NDIS_HASH_IPV6_EX
  • NDIS_HASH_TCP_IPV6_EX
  • NDIS_HASH_UDP_IPV6_EX

有効なフラグの組み合わせのセットを次に示します。

  • IPv4 (NDIS_HASH_IPV4、NDIS_HASH_TCP_IPV4、NDIS_HASH_UDP_IPV4 の組み合わせ)
  • IPv6 (NDIS_HASH_IPV6、NDIS_HASH_TCP_IPV6、NDIS_HASH_UDP_IPV6 の組み合わせ)
  • IPv6 と拡張ヘッダー (NDIS_HASH_IPV6_EX、NDIS_HASH_TCP_IPV6_EX、NDIS_HASH_UDP_IPV6_EX の組み合わせ)

NIC は、IPv4 セットの組み合わせのいずれかをサポートする必要があります。 その他のセットと組み合わせはオプションです。 NIC は一度に複数のセットをサポートできます。 この場合、受信したデータの種類によって、NIC が使用するハッシュの種類が決まります。

一般に、NIC が受信したデータを正しく解釈できない場合は、ハッシュ値を計算してはいけません。 たとえば、NIC が IPv4 のみをサポートし、正しく解釈できない IPv6 パケットを受信する場合、ハッシュ値を計算してはいけません。 NIC がサポートしていないトランスポートの種類のパケットを受信する場合は、ハッシュ値を計算してはいけません。 たとえば、TCP パケットのハッシュ値を計算する場合に、NIC が UDP パケットを受信する場合は、ハッシュ値を計算しないでください。 この場合、パケットは非 RSS の場合と同様に処理されます。 RSS 以外の受信処理の詳細については、「非 RSS 受信処理」を参照してください。

IPv4 ハッシュの種類の組み合わせ

IPv4 セットの有効なハッシュの種類の組み合わせは次のとおりです。

NDIS_HASH_IPV4

このフラグのみを設定した場合、NIC は次の IPv4 ヘッダー フィールドでハッシュ値を計算する必要があります。

  • Source-IPv4-Address
  • Destination-IPv4-Address

Note

NIC が IP ヘッダーと TCP ヘッダーの両方を持つパケットを受信する場合、NDIS_HASH_TCP_IPV4 は必ずしも使用する必要はありません。 フラグメント化された IP パケットの場合は、NDIS_HASH_IPV4 を使用する必要があります。 これには、IP ヘッダーと TCP ヘッダーの両方を含む最初のフラグメントが含まれます。

NDIS_HASH_TCP_IPV4

このフラグだけを設定した場合、NIC は受信したデータを解析して、TCP セグメントを含む IPv4 パケットを識別する必要があります。

NIC は、存在する IP オプションを識別してスキップする必要があります。 NIC が IP オプションをスキップできない場合は、ハッシュ値を計算しないでください。

NIC は、次のフィールドに対してハッシュ値を計算する必要があります。

  • Source-IPv4-Address
  • Destination-IPv4-Address
  • 発信元 TCP ポート
  • 宛先 TCP ポート

NDIS_HASH_UDP_IPV4

このフラグだけを設定した場合、NIC は受信したデータを解析して、UDP データグラムを含む IPv4 パケットを識別する必要があります。

NIC は、存在する IP オプションを識別してスキップする必要があります。 NIC が IP オプションをスキップできない場合は、ハッシュ値を計算しないでください。

NIC は、次のフィールドに対してハッシュ値を計算する必要があります。

  • Source-IPv4-Address
  • Destination-IPv4-Address
  • 発信元 UDP ポート
  • 宛先 UDP ポート

NDIS_HASH_TCP_IPV4 | NDIS_HASH_IPV4

このフラグの組み合わせが設定されている場合、NIC は、NDIS_HASH_TCP_IPV4 の場合に指定されたハッシュ計算を実行する必要があります。 ただし、パケットに TCP ヘッダーが含まれていない場合、NIC は、NDIS_HASH_IPV4 の場合に指定されたハッシュ値を計算する必要があります。

NDIS_HASH_UDP_IPV4 | NDIS_HASH_IPV4

このフラグの組み合わせが設定されている場合、NIC は、NDIS_HASH_UDP_IPV4 の場合に指定されたハッシュ計算を実行する必要があります。 ただし、パケットに UDP ヘッダーが含まれていない場合、NIC は、NDIS_HASH_IPV4 の場合に指定されたハッシュ値を計算する必要があります。

NDIS_HASH_TCP_IPV4 | NDIS_HASH_UDP_IPV4 | NDIS_HASH_IPV4

このフラグの組み合わせが設定されている場合、NIC はパケット内のトランスポートで指定されたハッシュ計算を実行する必要があります。 ただし、パケットに TCP ヘッダーも UDP ヘッダーも含まれていない場合、NIC は、NDIS_HASH_IPV4 の場合に指定されたハッシュ値を計算する必要があります。

IPv6 ハッシュの種類の組み合わせ

IPv6 セットの有効なハッシュの種類の組み合わせは次のとおりです。

NDIS_HASH_IPV6

このフラグだけを設定した場合、NIC は次のフィールドに対してハッシュを計算する必要があります。

  • Source-IPv6-Address
  • Destination-IPv6-Address

NDIS_HASH_TCP_IPV6

このフラグだけを設定した場合、NIC は受信したデータを解析して、TCP セグメントを含む IPv6 パケットを識別する必要があります。 NIC は、パケットに存在する IPv6 拡張ヘッダーを識別してスキップする必要があります。 NIC が IPv6 拡張ヘッダーをスキップできない場合は、ハッシュ値を計算しないでください。

NIC は、次のフィールドに対してハッシュ値を計算する必要があります。

  • Source-IPv6 -Address
  • Destination-IPv6 -Address
  • 発信元 TCP ポート
  • 宛先 TCP ポート

NDIS_HASH_UDP_IPV6

このフラグだけを設定した場合、NIC は受信したデータを解析して、UDP データグラムを含む IPv6 パケットを識別する必要があります。 NIC は、パケットに存在する IPv6 拡張ヘッダーを識別してスキップする必要があります。 NIC が IPv6 拡張ヘッダーをスキップできない場合は、ハッシュ値を計算しないでください。

NIC は、次のフィールドに対してハッシュ値を計算する必要があります。

  • Source-IPv6-Address
  • Destination-IPv6-Address
  • 発信元 UDP ポート
  • 宛先 UDP ポート

NDIS_HASH_TCP_IPV6 | NDIS_HASH_IPV6

このフラグの組み合わせが設定されている場合、NIC は、NDIS_HASH_TCP_IPV6 の場合に指定されたハッシュ計算を実行する必要があります。 ただし、パケットに TCP ヘッダーが含まれていない場合、NIC は、NDIS_HASH_IPV6 の場合に指定されたハッシュ値を計算する必要があります。

たとえば、パケットがフラグメント化されている場合、TCP ヘッダーが含まれていない可能性があります。 その場合、NIC は IP ヘッダー経由でのみハッシュを計算する必要があります。

NDIS_HASH_UDP_IPV6 | NDIS_HASH_IPV6

このフラグの組み合わせが設定されている場合、NIC は、NDIS_HASH_UDP_IPV6 の場合に指定されたハッシュ計算を実行する必要があります。 ただし、パケットに UDP ヘッダーが含まれていない場合、NIC は、NDIS_HASH_IPV6 の場合に指定されたハッシュ値を計算する必要があります。

たとえば、パケットがフラグメント化されている場合、UDP ヘッダーが含まれていない可能性があります。 その場合、NIC は IP ヘッダー経由でのみハッシュを計算する必要があります。

NDIS_HASH_TCP_IPV6 | NDIS_HASH_UDP_IPV6 | NDIS_HASH_IPV6

このフラグの組み合わせが設定されている場合、NIC はパケット内のトランスポートで指定されたハッシュ計算を実行する必要があります。 ただし、パケットに TCP ヘッダーも UDP ヘッダーも含まれていない場合、NIC は、NDIS_HASH_IPV6 の場合に指定されたハッシュ値を計算する必要があります。

たとえば、パケットがフラグメント化されている場合、TCP ヘッダーまたは UDP ヘッダーが含まれていない可能性があります。 その場合、NIC は IP ヘッダー経由でのみハッシュを計算する必要があります。

拡張ヘッダー ハッシュ タイプの組み合わせがある IPv6

IPv6 と拡張ヘッダーセットの有効な組み合わせは次のとおりです。

NDIS_HASH_IPV6_EX

このフラグだけを設定した場合、NIC は次のフィールドに対してハッシュを計算する必要があります。

  • IPv6 宛先オプション ヘッダーのホーム アドレス オプションからのホーム アドレス。 拡張ヘッダーが存在しない場合は、ソース IPv6 アドレスを使用します。
  • 関連付けられた拡張ヘッダーの Routing-Header-Type-2 に含まれる IPv6 アドレス。 拡張ヘッダーが存在しない場合は、宛先 IPv6 アドレスを使用します。

NDIS_HASH_TCP_IPV6_EX

このフラグだけを設定した場合、NIC は次のフィールドに対してハッシュを計算する必要があります。

  • IPv6 宛先オプション ヘッダーのホーム アドレス オプションからのホーム アドレス。 拡張ヘッダーが存在しない場合は、ソース IPv6 アドレスを使用します。
  • 関連付けられた拡張ヘッダーの Routing-Header-Type-2 に含まれる IPv6 アドレス。 拡張ヘッダーが存在しない場合は、宛先 IPv6 アドレスを使用します。
  • 発信元 TCP ポート
  • 宛先 TCP ポート

NDIS_HASH_UDP_IPV6_EX

このフラグだけを設定した場合、NIC は次のフィールドに対してハッシュを計算する必要があります。

  • IPv6 宛先オプション ヘッダーのホーム アドレス オプションからのホーム アドレス。 拡張ヘッダーが存在しない場合は、ソース IPv6 アドレスを使用します。
  • 関連付けられた拡張ヘッダーの Routing-Header-Type-2 に含まれる IPv6 アドレス。 拡張ヘッダーが存在しない場合は、宛先 IPv6 アドレスを使用します。
  • 発信元 UDP ポート
  • 宛先 UDP ポート

NDIS_HASH_TCP_IPV6_EX | NDIS_HASH_IPV6_EX

このフラグの組み合わせが設定されている場合、NIC は、NDIS_HASH_TCP_IPV6_EX の場合に指定されたハッシュ計算を実行する必要があります。 ただし、パケットに TCP ヘッダーが含まれていない場合、NIC は、NDIS_HASH_IPV6_EX の場合に指定されたハッシュ値を計算する必要があります。

NDIS_HASH_UDP_IPV6_EX | NDIS_HASH_IPV6_EX

このフラグの組み合わせが設定されている場合、NIC は、NDIS_HASH_UDP_IPV6_EX の場合に指定されたハッシュ計算を実行する必要があります。 ただし、パケットに UDP ヘッダーが含まれていない場合、NIC は、NDIS_HASH_IPV6_EX の場合に指定されたハッシュ値を計算する必要があります。

NDIS_HASH_TCP_IPV6_EX | NDIS_HASH_UDP_IPV6_EX | NDIS_HASH_IPV6_EX

このフラグの組み合わせが設定されている場合、NIC はパケット内のトランスポートで指定されたハッシュ計算を実行する必要があります。 ただし、パケットに TCP ヘッダーも UDP ヘッダーも含まれていない場合、NIC は、NDIS_HASH_IPV6_EX の場合に指定されたハッシュ値を計算する必要があります。

Note

ミニポート ドライバーが NIC の NDIS_RSS_CAPS_HASH_TYPE_TCP_IPV6_EX や NDIS_RSS_CAPS_HASH_TYPE_UDP_IPV6_EX 機能を報告する場合、NIC は、プロトコル ドライバーが設定した IPv6 拡張ハッシュの種類に従って (IPv6 拡張ヘッダー内のフィールドを介して) ハッシュ値を計算する必要があります。 NIC は、ハッシュ値が計算される IPv6 パケットの NET_BUFFER_LIST 構造体に拡張ハッシュ タイプまたは通常のハッシュ タイプを格納できます。

ミニポート ドライバーは、受信したデータを示す前に、NET_BUFFER_LIST 構造体のハッシュ タイプを設定します。 詳細については、「RSS 受信データの表示」を参照してください。