次の方法で共有


VMQ 受信パス

ネットワーク アダプターは、そのキューに設定されているフィルターのすべてのフィルター フィールド テストに合格した場合にのみ、キューで受信したパケットを示します。 フィルター テストの詳細については、「VMQ フィルター操作」を参照してください。

上位プロトコル ドライバーが NDIS_RECEIVE_QUEUE_PARAMETERS_PER_QUEUE_RECEIVE_INDICATION フラグを Flags メンバー ( NDIS_RECEIVE_QUEUE_PARAMETERS 構造体のメンバー) で設定した場合、ミニポート ドライバーは他の受信キューの NET_BUFFER_LIST 構造体をこのキューの NET_BUFFER_LIST 構造体と混合して 1 回の呼び出しで NdisMIndicateReceiveNetBufferLists 関数を呼び出してはなりません。 また、ドライバーは、NDIS_RECEIVE_FLAGS_SINGLE_QUEUE fフラグを ReceiveFlags パラメーター (NdisMIndicateReceiveNetBufferLists 関数のパラメーター) で設定するツ用があります。.

NDIS_RECEIVE_QUEUE_PARAMETERS_PER_QUEUE_RECEIVE_INDICATION が設定されていない場合、ミニポート ドライバーは、異なる VM キューからフレームの NET_BUFFER_LIST 構造体をリンクし、NdisMIndicateReceiveNetBufferLists への 1 回の呼び出しでそれらを示すことができます。 この場合、NET_BUFFER_LIST 構造体の指定されたリンク リストをキュー番号で並べ替える必要はありません。 異なるキューの NET_BUFFER_LIST 構造体をグループ化する必要はありません。

プロトコル ドライバーが NDIS_RETURN_FLAGS_SINGLE_QUEUE を設定し、受信バッファーを返す場合、すべての NET_BUFFER_LIST構造体は NetBufferListパラメーター (NdisReturnNetBufferLists 関数のパラメーター) 内で同じ VM キューに属する必要があります。 ただし、プロトコル ドライバーは、すべての NET_BUFFER_LIST構造体を返す必要はなく、構造体は ProtocolReceiveNetBufferLists 関数への 1 回の呼び出し(NdisReturnNetBufferListsへの 1 回の呼び出し内) で示されます。 また、返されるリストには、同じ VM キューに属している場合、複数の受信インジケーターからのNET_BUFFER_LIST 構造体を含めることができます。

プロトコル ドライバーは、NDIS_RETURN_FLAGS_SINGLE_QUEUE のビットを ReturnFlagsパラメーター (NdisReturnNetBufferLists のパラメーター) で設定し、返されたすべてのNET_BUFFER_LIST 構造体が同じ VM キューに属していることを示します。

VMQ 受信通知には、NetBufferListInfo メンバー (NET_BUFFER_LIST 構造体のメンバー) に次の帯域外 (OOB) 情報を含める必要があります。

  • NetBufferListFilteringInfo 情報でキュー識別子を指定します。

  • NetBufferListFilteringInfo 情報のフィルター識別子を 0 に設定します。

NetBufferListFilteringInfo 情報は、NDIS_NET_BUFFER_LIST_FILTERING_INFO 構造体で指定されます。 NET_BUFFER_LIST OOB データ内の NDIS_NET_BUFFER_LIST_FILTERING_INFO 構造体にアクセスするには、NDIS ドライバーは、NET_BUFFER_LIST_INFO マクロを呼び出し、NetBufferListFilteringInfo 情報型を指定します。

フィルター識別子とキュー識別子に直接アクセスするには、NET_BUFFER_LIST_RECEIVE_FILTER_ID マクロと NET_BUFFER_LIST_RECEIVE_QUEUE_ID マクロを使用します。

VMQ 受信通知では、SharedMemoryInfo メンバー (NET_BUFFER 構造体のメンバー) で共有メモリ情報を定義する必要があります。

: VMQ が削除されると (たとえば、VM のライブ移行中)、ミニポート ドライバーが無効な QueueId 値を含む NBL を受け取る可能性があります。 この場合、ミニポートは無効なキュー ID を無視し、代わりに 0 (既定のキュー) を使用する必要があります。 QueueId は、NBL の OOB データの NetBufferListFilteringInfo 部分にあり、NET_BUFFER_LIST_RECEIVE_QUEUE_ID マクロを使用して取得されます。

NET_BUFFER_SHARED_MEMORY ポインターがSharedMemoryInfo で有効であることを示すには、ミニポート ドライバーが ReceiveFlags パラメーター (NdisMIndicateReceiveNetBufferLists 関数のパラメーター) で NDIS_RECEIVE_FLAGS_SHARED_MEMORY_INFO_VALID フラグを設定する必要があります。 VMQ 受信バッファーの共有メモリ バッファーのレイアウトの詳細については、「受信バッファーの共有メモリ」を参照してください。

受信指示は、NET_BUFFER_SHARED_MEMORY 構造体に次の情報を含める必要があります。

NextSharedMemorySegment
次の NET_BUFFER_SHARED_MEMORY構造体を指すポインターであり、このような構造体の NULL で終わるリンク リスト内にあるもの。

SharedMemoryHandle
NdisAllocateSharedMemory から返された NDIS 共有メモリ ハンドル。

SharedMemoryOffset
共有メモリ バッファーの先頭からデータの先頭までのオフセット (バイト単位)。

SharedMemoryLength
共有メモリ セグメントの長さ (バイト単位)。

上位プロトコル ドライバーが、NDIS_RECEIVE_QUEUE_PARAMETERS構造体の NDIS_RECEIVE_QUEUE_PARAMETERS_LOOKAHEAD_SPLIT_REQUIRED フラグを Flags メンバー (NDIS_RECEIVE_QUEUE_PARAMETERS 構造体のメンバー) でフラグを設定した場合、各 NET_BUFFER に以下のものが含まれます。

  • 2 つの MDL と対応する SharedMemoryInfo 構造体。

  • バックフィル領域を持つ先読み後バッファー。

必要に応じて、プロトコル ドライバーは、バックフィル領域に先読みバッファーの内容をコピーします。 ただし、パケットが完全に先読みバッファー内にある場合でも、バックフィル領域が存在する必要があります。

上位ドライバーで NDIS_RECEIVE_QUEUE_PARAMETERS_LOOKAHEAD_SPLIT_REQUIRED フラグが設定されていない場合、各 NET_BUFFER 構造体には、1 つの MDL と 1 つの SharedMemoryInfo 構造体が含まれます。

MDL のバイト数とバイト オフセット、および DataLengthDataOffset (NET_BUFFER_DATA 構造体のメンバー) は、VMQ を使用しないドライバーについて設定されるのと同じ方法で設定されます。 初期化中に SharedMemoryLengthSharedMemoryOffset (SharedMemoryInfo 構造体のメンバー) を1 回割り当てることができます。 ミニポート ドライバーは、 SharedMemoryLength および SharedMemoryOffset のメンバーを、受信したすべてのパケットに対して更新する必要はありません。これは、上にあるドライバーと NDIS は、 NET_BUFFER DataLength メンバーと MDL バイト数を使用してパケットの開始とサイズを決定できるためです。

: NDIS 6.30 および Windows Server 2012 以降では、ネットワーク データを個別の先読みバッファーに分割するサポートはなくなりました。 上位プロトコル ドライバーは、NDIS_RECEIVE_QUEUE_PARAMETERS_LOOKAHEAD_SPLIT_REQUIRED フラグを設定しません。