共用方式為


在虛擬埠上設定接收篩選

在網路適配器的 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_RECEIVE_FILTER_SET_FILTER的物件識別碼(OID)方法要求。 InformationBufferNDIS_OID_REQUEST 結構中的成員,最初包含了一個指向 NDIS_RECEIVE_FILTER_PARAMETERS 結構的指標。

在上層驅動程式發送該 OID 方法要求之前,它必須初始化 NDIS_RECEIVE_FILTER_PARAMETERS 結構體。 驅動程式必須以下列方式設定此結構的成員:

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

    注意 從 NDIS 6.30 開始,單根 I/O 虛擬化(SR-IOV)介面僅支持 NdisReceiveFilterTypeVMQueue 篩選類型。

  • QueueId 成員必須設定為 NDIS_DEFAULT_RECEIVE_QUEUE_ID。

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

  • FilterId 成員必須設定為 NDIS_DEFAULT_RECEIVE_FILTER_ID。

    Note 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 結構的一部分,指定要針對接收篩選執行的動作。 下列幾點適用於 NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO 旗標:

  • 如果在 旗標 成員中設定了 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 識別碼的封包。 那就是,迷你埠驅動程式不應該標示那些具有相符 MAC 位址且 VLAN 標識碼為零或未標記的封包。

使用篩選標識碼

NDIS 會在 FilterIdNDIS_RECEIVE_FILTER_PARAMETERS 結構的成員中指派篩選標識碼,並將 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 結構中的任何欄位測試失敗,則網路封包不符合指定的篩選準則。

當網路適配器根據這些篩選準則測試接收的封包時,它必須忽略封包中沒有指定測試準則的所有欄位。