次の方法で共有


VMQ 受信パス

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

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

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を設定し、受信バッファーを返す場合、NdisReturnNetBufferLists 関数の NetBufferLists パラメーター内のすべてのNET_BUFFER_LIST構造体は、同じ VM キューに属している必要があります。 ただし、プロトコル ドライバーは、NdisReturnNetBufferLists への 1 回の呼び出しで ProtocolReceiveNetBufferLists 関数の 1 回の呼び出しで示されたすべてのNET_BUFFER_LIST構造体を返す必要はありません。 また、返される一覧には、同じ VM キュー 属している場合に、複数の受信インジケーターからNET_BUFFER_LIST構造を含めることができます。

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

VMQ 受信通知は、NET_BUFFER_LIST構造体のNetBufferListInfo メンバーに次の帯域外 (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 受信通知では、NET_BUFFER構造体の SharedMemoryInfo メンバーで共有メモリ情報を定義する必要があります。

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

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

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

NextSharedMemorySegment
このような構造体の NULL で終わるリンク リスト内の次のNET_BUFFER_SHARED_MEMORY構造体へのポインター。

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

SharedMemoryOffset
データの先頭が共有メモリ バッファーの先頭からバイト単位で何バイト離れているかを示すオフセットです。

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

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

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

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

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

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

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

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