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
- NDIS_HASH_TCP_IPV4
- NDIS_HASH_UDP_IPV4
- NDIS_HASH_TCP_IPV4 | NDIS_HASH_IPV4
- NDIS_HASH_UDP_IPV4 | NDIS_HASH_IPV4
- NDIS_HASH_TCP_IPV4 | NDIS_HASH_UDP_IPV4 | NDIS_HASH_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
- NDIS_HASH_TCP_IPV6
- NDIS_HASH_UDP_IPV6
- NDIS_HASH_TCP_IPV6 | NDIS_HASH_IPV6
- NDIS_HASH_UDP_IPV6 | NDIS_HASH_IPV6
- NDIS_HASH_TCP_IPV6 | NDIS_HASH_UDP_IPV6 | NDIS_HASH_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
- NDIS_HASH_TCP_IPV6_EX
- NDIS_HASH_UDP_IPV6_EX
- NDIS_HASH_TCP_IPV6_EX | NDIS_HASH_IPV6_EX
- NDIS_HASH_UDP_IPV6_EX | NDIS_HASH_IPV6_EX
- NDIS_HASH_TCP_IPV6_EX | NDIS_HASH_UDP_IPV6_EX | NDIS_HASH_IPV6_EX
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 受信データの表示」を参照してください。