在虛擬埠上設定接收篩選

在網路介面卡的 NIC 交換器上建立虛擬埠 (VPort) 之後,過度配置驅動程式可以在 VPort 上設定接收篩選器。 只有建立 VPort 的驅動程式可以在該 VPort 上設定接收篩選

本主題包含下列資訊:

在 VPort 上設定接收篩選

使用 NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO 旗標

使用篩選識別碼

處理 VPort 上的接收篩選

如需如何建立 VPort 的詳細資訊,請參閱 建立虛擬埠

注意 因為預設 VPort 一律存在,而且永遠不會明確建立,所以任何過度處理驅動程式都可以在預設 VPort 上設定接收篩選。 過度處理驅動程式不會擁有預設的 VPort。 因此,系結至網路介面卡的所有通訊協定驅動程式都可以使用預設的 VPort。 預設 VPort 的識別碼值為 NDIS_DEFAULT_VPORT_ID。

在 VPort 上設定接收篩選

若要在 VPort 上設定篩選,過度配置驅動程式會發出物件識別碼, (OID) 方法要求 OID_RECEIVE_FILTER_SET_FILTERNDIS_OID_REQUEST結構的InformationBuffer成員一開始包含NDIS_RECEIVE_FILTER_PARAMETERS結構的指標。

在過度配置驅動程式發出這個 OID 方法要求之前,它必須初始化 NDIS_RECEIVE_FILTER_PARAMETERS 結構。 驅動程式必須以下列方式設定此結構的成員:

  • FilterType成員必須設定為NDIS_RECEIVE_FILTER_TYPE列舉值。

    注意 從 NDIS 6.30 開始,只有 NdisReceiveFilterTypeVMQueue 篩選類型支援單一根目錄 I/O 虛擬化 (SR-IOV) 介面。

  • QueueId成員必須設定為 NDIS_DEFAULT_RECEIVE_QUEUE_ID。

  • VPortId成員必須設定為與 VPort 相關聯的識別碼。 過度處理驅動程式會透過下列其中一種方式取得 VPort 識別碼:

  • FilterId成員必須設定為 NDIS_DEFAULT_RECEIVE_FILTER_ID。

    注意 NDIS 會在將 OID 要求轉送到迷你埠驅動程式進行處理之前,在此成員中指派唯一篩選識別碼。

  • 必須適當地設定 FieldParametersArrayOffsetFieldParametersArrayNumElementsFieldParametersArrayElementSizeNDIS_RECEIVE_FILTER_PARAMETERS 結構的成員 ,才能定義 NDIS_RECEIVE_FILTER_FIELD_PARAMETERS 結構的陣列。 陣列中的每個 NDIS_RECEIVE_FILTER_FIELD_PARAMETERS 結構都會為網路標頭中的一個欄位設定篩選測試準則。

    針對 SR-IOV 介面,會定義下欄欄位測試參數:

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

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

從 OID 方法要求成功傳回之後,NDIS_OID_REQUEST結構的InformationBuffer成員會包含具有新篩選識別碼之NDIS_RECEIVE_FILTER_PARAMETERS結構的指標。

使用 NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO 旗標

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

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

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

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

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

    注意 如果虛擬化堆疊設定 MAC 位址篩選,而且 OID_RECEIVE_FILTER_SET_FILTER 集要求未設定 VLAN 識別碼篩選,交換器也會設定 NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO 旗標。

  • 從 NDIS 6.30 開始,如果未設定 NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO 旗標,而且 OID_RECEIVE_FILTER_SET_FILTER方法要求 未設定 VLAN 識別碼篩選,迷你埠驅動程式必須執行下列其中一項:

    • 迷你埠驅動程式必須傳回 OID_RECEIVE_FILTER_SET_FILTER 方法要求的失敗狀態。

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

  • 如果通訊協定驅動程式使用 OID_RECEIVE_FILTER_SET_FILTER 方法要求設定 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 方法要求傳遞至基礎迷你埠驅動程式。 在 VPort 上設定的每個篩選都有網路介面卡的唯一篩選識別碼。 也就是說,篩選識別碼不會在網路介面卡管理的不同佇列上重複。

過度顯示驅動程式必須使用 NDIS 在稍後的 OID 要求中提供的篩選識別碼,以變更篩選參數或釋放篩選。

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

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

處理 VPort 上的接收篩選

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

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

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

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

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

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