VM キューの割り当て
構成パラメーターの初期セットを使用してキューを割り当てるには、基になるドライバーが OID_RECEIVE_FILTER_ALLOCATE_QUEUE メソッド OID 要求を発行します。 この InformationBuffer は NDIS_OID_REQUEST 構造のメンバー であり、NDIS_RECEIVE_FILTER_PARAMETERS 構造へのポインターを含みます。 OID メソッド要求から正常に戻った後、InformationBuffer メンバー (NDIS_OID_REQUEST 構造のメンバー) には、新しいキュー識別子と MSI-X テーブル エントリを持つ NDIS_RECEIVE_QUEUE_PARAMETERS 構造体へのポインターが含まれます。
NDIS_RECEIVE_QUEUE_PARAMETERS 構造体は、OID_RECEIVE_FILTER_ALLOCATE_QUEUE と OID_RECEIVE_FILTER_QUEUE_PARAMETERS で使用されます。 VM キュー パラメーターの詳細については、「VM キュー パラメーターの取得と更新」を参照してください。
基になるドライバーは、次のキュー構成パラメーターを使用して NDIS_RECEIVE_QUEUE_PARAMETERS 構造を初期化します。
キューの種類 (NdisReceiveQueueTypeVMQueue、NDIS_RECEIVE_QUEUE_TYPE 列挙型より)。
キューのプロセッサ アフィニティ。
キュー名と仮想マシン名。
先読み分割パラメーター。
注: NDIS 6.30 以降では、パケット データの個別の先読みバッファーへの分割はサポートされなくなりました。
注: 上にあるドライバーは、Flags メンバー (NDIS_RECEIVE_QUEUE_PARAMETERS 構造の) に NDIS_RECEIVE_QUEUE_PARAMETERS_PER_QUEUE_RECEIVE_INDICATION と NDIS_RECEIVE_QUEUE_PARAMETERS_LOOKAHEAD_SPLIT_REQUIRED フラグを設定できます。 その他のフラグは、キューの割り当てには使用されません。
NDIS は、受信キューを割り当てるための OID 要求を受信すると、キューのパラメーターを検証します。 NDIS は、必要なリソースとキュー識別子を割り当てた後、基になるミニポート ドライバーに OID 要求を送信します。 キュー識別子は、関連付けられているネットワーク アダプターに対して一意です。
ミニポート ドライバーは、受信キューに必要なソフトウェアとハードウェア リソースを正常に割り当てることができる場合は、成功状態で OID 要求を完了します。
NDIS がミニポート ドライバーに OID 要求を送信する前に、NDIS は、キュー識別子を QueueId メンバー (NDIS_RECEIVE_QUEUE_PARAMETERS 構造) に割り当て、ミニポート ドライバーにメソッド要求を渡します。 ミニポート ドライバーは、MSIXTableEntry メンバーの MSI-X テーブル エントリを提供します。
ミニポート ドライバーは、割り当てられた受信キューのキュー識別子を保持する必要があります。 NDIS は、ミニポート ドライバーへの後続の呼び出しの受信キューのキュー識別子を使用して、受信キューの受信フィルターを設定、受信キューのパラメーターを変更、または受信キューを解放します。
注: 既定のキュー (キュー識別子 0) は常に割り当てられ、解放できません。
上にあるドライバーは、たとえば、キューパラメーターを変更したり、キューを解放したりするために、後続の OID 要求で NDIS が提供するキュー識別子を使用する必要があります。 キュー識別子は、キューに関連付けられているすべての NET_BUFFER_LIST 構造の OOB データにも含まれます。 ドライバーは、NET_BUFFER_LIST_RECEIVE_QUEUE_ID マクロを使用して、NET_BUFFER_LIST 構造のキュー識別子を取得します。
注: プロトコル ドライバーは、キューを正常に割り当てた後、およびキューが削除される前に、いつでも VMQ フィルターを設定できます。
プロトコル ドライバーは、キューの割り当てを完了するために OID_RECEIVE_FILTER_QUEUE_ALLOCATION_COMPLETE メソッド OID 要求を発行します。 ミニポート ドライバーは、割り当てが完了したときに共有メモリーとその他のリソースを割り当てることができます。 共有メモリー リソースの割り当ての詳細については、「共有メモリー リソースの割り当て」を参照してください。
ミニポート ドライバーが OID_RECEIVE_FILTER_QUEUE_ALLOCATION OID 要求を受信し、正常に処理した後、キューは 割り当て済み 状態になります。 キューの状態の詳細については、「キューの状態と操作」を参照してください。
上にあるドライバーが 1 つ以上の受信キューを割り当てた後 (そして必要に応じて初期フィルターを設定)、ミニポート ドライバーに、受信キューの現在のバッチの割り当てが完了したことを通知する OID 要求を設定する OID_RECEIVE_FILTER_QUEUE_ALLOCATION_COMPLETE を発行する必要があります。
ミニポート ドライバーは、そのキューに設定されているフィルターがない場合は、受信キュー内のパケットを保持してはなりません。 キューにフィルターが一度も設定されていない場合、またはすべてのフィルターがクリアされた場合は、キューを空にし、パケットを破棄する必要があります。 つまり、ドライバー スタックが示されたり、キューに保持されたりしません。
上に来るドライバーは、OID_RECEIVE_FILTER_FREE_QUEUE OID を使用して、割り当てるキューを解放します。 キューの解放の詳細については、「VM キューの解放」を参照してください。