共用方式為


指定封包聯合接收篩選

超載驅動程式可以在支援 NDIS 封包聯合的迷你埠驅動程式上設定一或多個接收篩選。 過度配置驅動程式最多可以指定NDIS_RECEIVE_FILTER_CAPABILITIES結構之 MaxPacketCoalescingFilters成員中指定的接收篩選器數目上限。

注意 過度配置通訊協定驅動程式會取得 NDIS_BIND_PARAMETERS 結構內的 NDIS_RECEIVE_FILTER_CAPABILITIES 結構。 過度配置篩選驅動程式會取得NDIS_FILTER_ATTACH_PARAMETERS結構內的NDIS_RECEIVE_FILTER_CAPABILITIES結構。

超載驅動程式會透過發出 OID_RECEIVE_FILTER_SET_FILTER的 OID 方法要求,將篩選下載到迷你埠驅動程式。 這個 OID 要求之NDIS_OID_REQUEST結構的InformationBuffer成員包含呼叫端配置的緩衝區指標。 此緩衝區的格式設定為包含下列內容:

指定接收篩選

過度配置驅動程式會使用篩選的組態參數來初始化 NDIS_RECEIVE_FILTER_PARAMETERS 結構,以指定封包聯合接收篩選。 當它初始化 NDIS_RECEIVE_FILTER_PARAMETERS 結構時,過度配置驅動程式必須遵循下列規則:

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

  • QueueId成員必須設定為 NDIS_DEFAULT_RECEIVE_QUEUE_ID。

    注意 從 NDIS 6.30 開始,只有網路介面卡的預設接收佇列才支援封包聯合接收篩選。 此接收佇列的識別碼為 NDIS_DEFAULT_RECEIVE_QUEUE_ID。

  • 如果過度處理驅動程式正在建立新的接收篩選,則必須將 FilterId 成員設定為NDIS_DEFAULT_RECEIVE_FILTER_ID。

    注意 NDIS 會在將 OID_RECEIVE_FILTER_SET_FILTER 的 OID 方法要求轉送至迷你埠驅動程式之前,產生接收篩選器的唯一篩選識別碼 (識別碼 ) 。  

  • 如果過度處理驅動程式正在修改現有的接收篩選,它必須將 FilterId 成員設定為接收篩選的非零篩選識別碼。 過度處理驅動程式會在發出 OID_RECEIVE_FILTER_ENUM_FILTERS的 OID 方法要求時,取得接收篩選準則的篩選識別碼。 如需如何修改接收篩選的詳細資訊,請參閱 修改封包聯合接收篩選

  • FieldParametersArrayOffsetFieldParametersArrayNumElementsFieldParametersArrayElementSizeNDIS_RECEIVE_FILTER_PARAMETERS 結構的成員必須設定為定義欄位參數的陣列。 陣列中的每個元素都是 NDIS_RECEIVE_FILTER_FIELD_PARAMETERS 結構,可指定接收篩選之標頭欄位測試的參數。

  • RequestedFilterIdBitCount成員必須設定為零。

  • MaxCoalescingDelay必須設定為最大時間,以毫秒為單位,符合接收篩選的第一個封包會儲存並聯合在網路介面卡上。 一旦收到符合篩選準則的第一個封包,網路介面卡就會聯合封包,並啟動到期時間設定為 MaxCoalescingDelay 成員的值的硬體計時器。

過度配置驅動程式必須排序欄位參數陣列中的標頭欄位測試,順序與相關聯的 MAC 和通訊協定標頭存在於封包中的順序相同。

例如,在過度配置驅動程式指定 IP 版本 4 (IPv4) 通訊協定欄位的篩選準則參數之前,必須先指定 MAC 標頭通訊協定欄位的篩選參數, (NdisMacHeaderFieldProtocol) 。 如此一來,驅動程式會指定標頭欄位測試,以驗證欄位設定為 IPv4 封包的正確 EtherType 值 (0x0800) 。 如果測試失敗,配接器就不需要執行 IPV4 通訊協定欄位的測試。

指定標頭欄位測試

每個接收篩選可以指定一或多個測試準則, (標頭欄位測試) 。 網路介面卡會執行這些測試,以判斷接收的封包是否應該在介面卡的硬體聯合緩衝區中聯合。 此外,過度配置驅動程式可以針對各種媒體存取控制指定個別篩選測試, (MAC) 、IP 第 4 版 (IPv4) ,以及 IP 第 6 版 (IPv6) 標頭欄位。

若要優化網路介面卡的篩選,標頭欄位測試是以標準化標頭功能變數名稱為基礎,而不是封包資料內的位元組位移/長度規格。 藉由使用標頭/功能變數名稱,網路介面卡的硬體或韌體可以優化在接收的封包上執行多個標頭欄位測試的方式。

每個接收篩選可以包含 由 NDIS_RECEIVE_FILTER_FIELD_PARAMETERS 結構指定的一或多個標頭欄位測試。 每個NDIS_RECEIVE_FILTER_FIELD_PARAMETERS結構都是FieldParametersArrayOffset、FieldParametersArrayNumElementsFieldParametersArrayElementSize結構成員所參考之欄位參數陣列NDIS_RECEIVE_FILTER_PARAMETERS的元素。

迷你埠驅動程式在處理 OID_RECEIVE_FILTER_SET_FILTER的 OID 方法要求時,必須遵循下列指導方針:

  • 如果NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO旗標是在NDIS_RECEIVE_FILTER_FIELD_PARAMETERS結構的Flags成員中設定,則網路介面卡必須只指出具有相符 MAC 位址的已接收封包,以及具有零個 VLAN 識別碼的未標記封包或封包。 也就是說,網路介面卡不得指出具有相符 MAC 位址和非零 VLAN 識別碼的封包。

  • 如果未設定 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中。

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