共用方式為


設定 VMQ 篩選準則

配置接收佇列之後,過度分配的驅動程式可以在接收佇列上設定篩選。 只有配置接收佇列的驅動程式可以設定該佇列的篩選。

注意 因為預設接收佇列 (NDIS_DEFAULT_RECEIVE_QUEUE_ID) 一 律存在,所以過度處理驅動程式一律可以在預設佇列上設定接收篩選。 過度處理驅動程式不會擁有預設佇列。 因此,系結至網路介面卡的所有通訊協定驅動程式都可以使用預設佇列。

在接收佇列上設定篩選

若要使用初始組態參數在接收佇列上設定篩選,過度處理驅動程式會發出 OID_RECEIVE_FILTER_SET_FILTER 方法物件識別碼 (OID) 要求。 NDIS_OID_REQUEST結構的InformationBuffer成員一開始包含NDIS_RECEIVE_FILTER_PARAMETERS結構的指標。 從 OID 方法要求成功傳回之後,NDIS_OID_REQUEST結構的InformationBuffer成員會包含具有新篩選識別碼之NDIS_RECEIVE_FILTER_PARAMETERS結構的指標。

過度配置驅動程式會使用接收佇列的下列篩選組態參數,初始化 NDIS_RECEIVE_FILTER_PARAMETERS 結構:

  • 透過 NDIS_RECEIVE_FILTER_TYPE 列舉值指定的篩選類型。

    注意 從 NDIS 6.20 開始,虛擬機器佇列 (VMQ) 介面僅支援 NdisReceiveFilterTypeVMQueue 篩選類型。

  • 佇列識別碼。

  • 格式化為 NDIS_RECEIVE_FILTER_FIELD_PARAMETERS 結構的一或多個欄位測試參數。 針對 VMQ,會定義下欄欄位測試參數。

    • 目的地媒體存取控制 (MAC) 位址,封包中的位址等於指定的 MAC 位址。

    • 封包中的虛擬 LAN (VLAN) 識別碼等於指定的 VLAN 識別碼。

NDIS_RECEIVE_FILTER_PARAMETERS結構會與OID_RECEIVE_FILTER_PARAMETERS OID 和OID_RECEIVE_FILTER_SET_FILTER OID 搭配使用,以指定篩選的組態參數。

FieldParametersArrayOffsetFieldParametersArrayNumElementsFieldParametersArrayElementSize NDIS_RECEIVE_FILTER_PARAMETERS結構的成員會定義NDIS_RECEIVE_FILTER_FIELD_PARAMETERS結構的陣列。 陣列中的每個 NDIS_RECEIVE_FILTER_FIELD_PARAMETERS 結構都會為網路標頭中的一個欄位設定篩選測試準則。

NDIS_RECEIVE_FILTER_FIELD_PARAMETERS結構的Flags成員會指定要針對接收篩選準則執行的動作。 下列幾點適用于 NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO 旗標:

  • 如果NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO旗標是在NDIS_RECEIVE_FILTER_FIELD_PARAMETERS結構的Flags成員中設定,則網路介面卡必須只指出符合下列所有測試準則的已接收封包:

    • 具有相符 MAC 位址的封包。

    • 沒有 VLAN 標籤或 VLAN 識別碼為零的封包。

    如果 已設定NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO 旗標,網路介面卡不得指出具有相符 MAC 位址和非零 VLAN 識別碼的封包。

    注意 如果 Hyper-V 可延伸交換器設定 MAC 位址篩選器,且未在 OID_RECEIVE_FILTER_SET_FILTER中設定 VLAN 識別碼篩選器,交換器也會設定 NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO 旗標。

  • 如果未設定 NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO 旗標,而且 OID 集合要求OID_RECEIVE_FILTER_SET_FILTER沒有 VLAN 識別碼 篩選,迷你埠驅動程式必須執行下列其中一項:

    • 如果迷你埠驅動程式支援 NDIS 6.20,它必須針對 OID_RECEIVE_FILTER_SET_FILTER的 OID 要求傳回失敗狀態。

    • 如果迷你埠驅動程式支援 NDIS 6.30 或更新版本的 NDIS,則必須設定網路介面卡來檢查及篩選指定的 MAC 位址欄位。 如果接收的封包中有 VLAN 標籤,網路介面卡必須將其從封包資料中移除。 迷你埠驅動程式必須將 VLAN 標籤放在與封包NET_BUFFER_LIST結構相關聯的NDIS_NET_BUFFER_LIST_8021Q_INFO中。

  • 如果通訊協定驅動程式使用 OID_RECEIVE_FILTER_SET_FILTER OID 設定 MAC 位址篩選和 VLAN 識別碼篩選,則不會在任一篩選欄位中設定 NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO 旗標。 在此情況下,迷你埠驅動程式應該指出符合指定 MAC 位址和 VLAN 識別碼的封包。 也就是說,迷你埠驅動程式不應該指出具有零 VLAN 識別碼或未標記封包之相符 MAC 位址的封包。

使用篩選識別碼

NDIS 會在NDIS_RECEIVE_FILTER_PARAMETERS結構的FilterId成員中指派篩選識別碼,並將OID_RECEIVE_FILTER_SET_FILTER的 OID 方法要求傳遞至基礎迷你埠驅動程式。 在接收佇列上設定的每個篩選,都有網路介面卡的唯一篩選識別碼。 也就是說,篩選識別碼不會在網路介面卡管理的不同佇列上重複。

過度處理驅動程式必須使用 NDIS 在稍後的 OID 要求中提供的篩選識別碼;例如,若要修改篩選參數或釋放篩選準則。

當 NDIS 收到 OID 要求以在接收佇列上設定篩選時,它會驗證篩選參數。 在 NDIS 配置必要的資源和篩選識別碼之後,它會將 OID 要求提交至基礎網路介面卡。 如果網路介面卡可以成功配置篩選所需的軟體和硬體資源,則會使用 NDIS_STATUS_SUCCESS完成 OID 要求。

迷你埠驅動程式必須保留已配置接收篩選準則的篩選識別碼。 NDIS 會使用篩選準則的篩選識別碼搭配後續的 OID 要求,以變更接收篩選參數或清除接收篩選準則。 如需如何變更參數和清除篩選的詳細資訊,請參閱 取得和更新 VM 佇列參數清除 VMQ 篩選

處理接收佇列上的篩選

迷你埠驅動程式會以下列方式根據篩選準則來設定網路介面卡:

  • 特定篩選的所有欄位測試參數都必須相符,才能將封包指派給佇列。

  • 您可以在佇列上設定多個篩選。

  • 如果有任何篩選通過,則必須將封包指派給接收佇列。

網路介面卡會將來自所有欄位測試的結果與邏輯 AND 作業結合。 也就是說,如果 包含在NDIS_RECEIVE_FILTER_FIELD_PARAMETERS 結構陣列中的任何欄位測試失敗,網路封包不符合指定的篩選準則。

當網路介面卡針對這些篩選準則測試收到的封包時,它必須忽略未指定任何測試準則之封包中的所有欄位。

從接收佇列接收封包

迷你埠驅動程式收到 OID_RECEIVE_FILTER_QUEUE_ALLOCATION_COMPLETE 要求,並在佇列上設定篩選準則之後,佇列就會處於 執行中狀態 。 當佇列處於此狀態時,迷你埠驅動程式可以指出佇列上的封包。 如需佇列狀態的詳細資訊,請參閱 佇列狀態和作業

如果迷你埠驅動程式已收到佇列 的OID_RECEIVE_FILTER_QUEUE_ALLOCATION_COMPLETE OID 要求,但佇列上未設定任何篩選,迷你埠驅動程式不得指出該佇列上的任何接收封包。 在此情況下,當迷你埠驅動程式收到 佇列的OID_RECEIVE_FILTER_SET_FILTER OID 要求,而且可能在完成 OID 要求之前,它可以指出該佇列上的封包。 如果迷你埠驅動程式在處理OID_RECEIVE_FILTER_SET_FILTER OID 要求時指出佇列上的封包,迷你埠驅動程式必須完成具有NDIS_STATUS_SUCCESS傳回碼 的OID_RECEIVE_FILTER_SET_FILTER 要求。