VPort での VMMQ の有効化、無効化、および更新

VPort を作成した後、上位レイヤー ドライバーは、VPort の RSS パラメーターを有効、無効、または更新できます。

ドライバーは、VPort の番号キューを変更するために、VPort の RSS 間接テーブルを更新できます。 しかし、VPort の RSS ハッシュタイプ、ハッシュ関数、およびハッシュ秘密キーは静的パラメーターとみなされ、VPort の存続期間中に上位のドライバーによって変更されることはありません。 上位レイヤー ドライバーが RSS 静的パラメーターのいずれかを変更する場合は、VPort を削除して再作成する必要があります。

上位レイヤー ドライバーは、OID_GEN_RECEIVE_SCALE_PARAMETERS OID 要求を発行することによって、VPort の RSS パラメーターを有効、無効、または変更します。 上位レイヤー ドライバーは、NDIS_OID_REQUEST 構造体の VPortId フィールドを、新しい構成のターゲット VPort の ID に設定します。

上位レイヤー ドライバーは、OID 要求で使用される NDIS_RECEIVE_SCALE_PARAMETERS 構造体も次のように設定します。 基になるミニポート アダプターによってアドバタイズされた VMMQ 機能に基づいて、一部のフィールドはすべての PF VPort に対して同じ値に設定される場合があることに注意してください。

  • HeaderRevision メンバーを NDIS_RECEIVE_SCALE_PARAMETERS_REVISION_3 に設定します。

  • DefaultProcessorNumber メンバーが変更されていないことを指定するには、NDIS_RSS_PARAM_FLAG_DEFAULT_PROCESSOR_UNCHANGED フラグを設定します。

  • BaseCpuNumber0 に設定します。

  • DefaultProcessorNumber を設定して、この VPort のデフォルトの RSS プロセッサを指定します。 ミニポートは、デフォルトのプロセッサが RSS プロセッサのリストの一部であると前提できますが、デフォルトの RSS プロセッサが現在の間接テーブルに存在することは前提できません。

  • HashInformation を設定して、NIC がこの VPort で受信したパケットのハッシュ値を計算するために使用するハッシュの種類とハッシュ関数を示します。 上位レイヤー ドライバーでは、このフィールドを VPort ごとに異なる値に設定できます。

  • IndirectionTableSize を設定して、間接テーブルのサイズをバイト単位で指定します。 このフィールドをすべての PF VPort に対して同じ値に設定します。 上位レイヤー ドライバーは、間接テーブル内のエントリの数が 2 のべき乗であることを確認する必要があります。

  • IndirectionTableOffset を設定して、NDIS_RECEIVE_SCALE_PARAMETERS 構造体の先頭から間接テーブルのオフセットを指定します。

  • HashSecretKeySize を設定して、ハッシュ秘密キーのサイズをバイト単位で指定します。 上位レイヤー ドライバーは、ミニポート アダプターがこれをサポートしている場合、各 VPort の異なる秘密キーを設定できます。 詳細については、VMMQ 機能のアドバタイズをご覧ください。

  • HashSecretKeyOffset を設定して、NDIS_RECEIVE_SCALE_PARAMETERS 構造体の先頭からハッシュ秘密キーのオフセットを指定します。 上位レイヤー ドライバーは、ミニポート アダプターがこれをサポートしている場合、各 VPort の異なる秘密キーを設定できます。 詳細については、VMMQ 機能のアドバタイズをご覧ください。

  • ProcessorMaskOffsetNumberOfProcessorMasksProcessorMasksEntrySize を適切に設定します。

ミニポート ドライバーが VPort の VMMQ を無効にする OID 要求を受信すると、OID_NIC_SWITCH_CREATE_VPORT OID 要求で使用された NDIS_NIC_SWITCH_VPORT_PARAMETERS 構造体の ProcessorAffinity フィールドで指定されたプロセッサ上で、その VPort に対して受信したすべてのパケットを示すように戻る必要があります。

VPort のキュー数を変更

VPort の間接テーブルで使用される一意のプロセッサの数は、最後に発行された OID_NIC_SWITCH_CREATE_VPORT OID リクエストで指定された NDIS_NIC_SWITCH_VPORT_PARAMETERS 構造体の NumQueuePairs フィールドの値を超えることはできません。 これらのプロセッサは、NdisGetRssProcessorInformation の呼び出しによって返される RSS プロセッサセットのサブセットになります。 詳細については、VMMQ の VPort の割り当てをご覧ください。 ただし、異なる VPort の間接テーブルには、同じプロセッサが含まれている可能性があります。

PF VPort のキューの数を減らすには、上位レイヤー ドライバーで次のことを実行する必要があります:

  1. 元の間接テーブル サイズで OID_GEN_RECEIVE_SCALE_PARAMETERS OID を送信します。 しかし、この段階では、間接テーブルは新しいキューの数までの異なるプロセッサの個数しか参照できません。 NDIS_NIC_SWITCH_PARAMETERS 構造体の NDIS_NIC_SWITCH_CAPS_RSS_PER_PF_VPORT_INDIRECTION_TABLE_SIZE_RESTRICTED フラグにより、新しい間接テーブルを元のテーブルよりも小さくする必要がある場合、発行者は、この段階で間接テーブルが、元のキューの数に対する RESTRICTED フラグの要件を満たすために必要な回数だけレプリケートされた新しい間接テーブルを含むことを保証する必要があります。

  2. 新しい数のキューで OID_NIC_SWITCH_VPORT_PARAMETERS OID を送信します。

  3. 変更された場合は、新しい間接テーブル サイズで OID_GEN_RECEIVE_SCALE_PARAMETERS を送信します。

PF VPort のキューの数を増やすには、上位レイヤー ドライバーで次のことを実行する必要があります:

  1. ドライバーは、手順 2 の前に現在の間接テーブルを更新する必要はありません。なぜなら、そのテーブルは現在のキューの数までの異なるプロセッサの数のみを参照しているからです。

  2. 新しい数のキューで OID_NIC_SWITCH_VPORT_PARAMETERS OID を送信します。 RESTRICTED フラグが設定されている場合、ミニポート ドライバーは、新しいキューの数に対する間接テーブル サイズの要件に一致するために必要な回数だけ、元の間接テーブルを内部的にレプリケートする必要があります。

  3. 変更された場合は、新しい間接テーブル サイズで OID_GEN_RECEIVE_SCALE_PARAMETERS OID を送信します。