配置接收佇列之後,覆蓋驅動程式可以在接收佇列上設定篩選。 只有配置接收佇列的驅動程式可以設定該佇列的篩選。
注意 因為預設接收隊列(NDIS_DEFAULT_RECEIVE_QUEUE_ID)始終存在,因此上層驅動程式始終可以在預設隊列上設定接收篩選器。 上層驅動程式不會擁有默認佇列。 因此,系結至網路適配器的所有通訊協定驅動程式都可以使用預設佇列。
在接收佇列上設定篩選
若要使用初始設定參數集合在接收佇列上設定篩選,上層驅動程式會發出OID_RECEIVE_FILTER_SET_FILTER 方法對象識別碼(OID)請求。 InformationBuffer 是 NDIS_OID_REQUEST 結構中的成員,最初包含了一個指向 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 搭配使用,以指定篩選的組態參數。
FieldParametersArrayOffset、FieldParametersArrayNumElements 和 FieldParametersArrayElementSizeNDIS_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 識別碼的封包。 也就是說,迷你埠驅動程式不應指示那些具有相符 MAC 位址且 VLAN 標識符為零或未加標記的封包。
使用篩選標識碼
NDIS 會在 FilterIdNDIS_RECEIVE_FILTER_PARAMETERS 結構的成員中指派篩選標識碼,並將 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 要求。