VMQ 接收路徑
只有在網路適配器通過該佇列上設定之篩選條件的所有篩選欄位測試時,網路適配器才會指出佇列上收到的封包。 如需篩選測試的詳細資訊,請參閱 VMQ 篩選作業。
如果過度配置通訊協定驅動程式在 NDIS_RECEIVE_QUEUE_PARAMETERS 結構的 Flags 成員中設定NDIS_RECEIVE_QUEUE_PARAMETERS_PER_QUEUE_RECEIVE_INDICATION旗標,則迷你埠驅動程式不得將其他接收佇列的NET_BUFFER_LIST結構與其他接收佇列的NET_BUFFER_LIST結構混合在 NdisMIndicateReceiveNetBufferLists 函式的單一呼叫中。 此外,驅動程式必須在 NdisMIndicateReceiveNetBufferLists 函式的 ReceiveFlags 參數中設定NDIS_RECEIVE_FLAGS_SINGLE_QUEUE旗標。
如果未設定NDIS_RECEIVE_QUEUE_PARAMETERS_PER_QUEUE_RECEIVE_INDICATION,迷你埠驅動程式可以連結來自不同 VM 佇列之畫面的NET_BUFFER_LIST結構,並在對 NdisMIndicateReceiveNetBufferLists 的單一呼叫中指出這些結構。 在此情況下,NET_BUFFER_LIST結構的指示連結清單不需要依佇列編號排序。 NET_BUFFER_LIST不同佇列的結構不需要分組在一起。
當通訊協定驅動程式設定NDIS_RETURN_FLAGS_SINGLE_QUEUE並傳回接收緩衝區時,NdisReturnNetBufferLists 函式 NetBufferLists 參數中的所有NET_BUFFER_LIST結構都必須屬於相同的 VM 佇列。 不過,通訊協定驅動程式不需要在單一呼叫 NdisReturnNetBufferLists 的單一呼叫中傳回 ProtocolReceiveNetBufferLists 函式中所指示的所有NET_BUFFER_LIST結構。 此外,如果傳回的清單屬於相同的 VM 佇列,可以包含 多個接收指示中的NET_BUFFER_LIST 結構。
通訊協議驅動程式會在 NdisReturnNetBufferLists 的 ReturnFlags 參數上設定NDIS_RETURN_FLAGS_SINGLE_QUEUE位,表示所有傳回NET_BUFFER_LIST結構都屬於相同的 VM 佇列。
VMQ 接收指示必須在NET_BUFFER_LIST結構的 NetBufferListInfo 成員中包含下列頻外 (OOB) 資訊。
在 NetBufferListFilteringInfo 資訊中指定佇列識別碼。
將 NetBufferListFilteringInfo 資訊中的篩選標識碼設定為零。
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。 如果發生這種情況,迷你埠應該忽略無效的佇列標識碼,並改用 0 (預設佇列)。 QueueId 位於 NBL OOB 數據的 NetBufferListFilteringInfo 部分中,並使用 NET_BUFFER_LIST_RECEIVE_QUEUE_ID 宏來擷取。
若要指出 SharedMemoryInfo 上的NET_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
共用記憶體區段的長度,以位元組為單位。
如果過度配置通訊協定驅動程式在 NDIS_RECEIVE_QUEUE_PARAMETERS 結構的 Flags 成員中設定NDIS_RECEIVE_QUEUE_PARAMETERS_LOOKAHEAD_SPLIT_REQUIRED旗標,則每個NET_BUFFER都包含:
兩個 MDL 和對應的 SharedMemoryInfo 結構。
具有回填空間的後置緩衝區。
如有必要,通訊協定驅動程式會將 lookahead 緩衝區的內容複製到回填區域。 不過,即使封包完全位於 lookahead 緩衝區中,仍必須存在回填空間。
如果過度配置驅動程式未設定 NDIS_RECEIVE_QUEUE_PARAMETERS_LOOKAHEAD_SPLIT_REQUIRED 旗標,則每個 NET_BUFFER 結構都包含單一 MDL 和單 一 SharedMemoryInfo 結構。
MDL 中的位元組計數和位元移,以及NET_BUFFER_DATA結構中 DataLength 和 DataOffset 成員的設定方式,與未使用 VMQ 的驅動程式設定相同。 SharedMemoryLength 和 SharedMemoryOffset 成員在初始化期間可以設定一次。 迷你埠驅動程式不需要更新每個收到的封包的 SharedMemoryLength 和 SharedMemoryOffset 成員,因為過度裝載的驅動程式和 NDIS 可以使用 NET_BUFFER DataLength 成員和 MDL 位元組計數來判斷封包開始和大小。
注意 從 NDIS 6.30 和 Windows Server 2012 開始,不再支援將封包數據分割成個別的外觀緩衝區。 過度配置通訊協定驅動程式不會設定 NDIS_RECEIVE_QUEUE_PARAMETERS_LOOKAHEAD_SPLIT_REQUIRED 旗標。