共用方式為


排除封包傳遞至可延伸交換器目的地埠

本主題描述 Hyper-V 可延伸交換器擴充功能如何排除封包傳送到可延伸交換器埠的過程。 封包的目的地埠是在封包 NET_BUFFER_LIST 結構內的頻外轉送內容內指定。 如需此上下文的詳細資訊,請參閱 Hyper-V 可延伸交換器轉送上下文

注意 此頁面假設您已熟悉 Hyper-V Extensible Switch 的概覽,以及 Hybrid Forwarding所提供的資訊和圖表。

注意 在可延伸交換器介面中,NDIS 篩選驅動程式稱為 可延伸交換器擴充功能,而驅動程式堆疊稱為 可延伸交換器驅動程式堆疊。 如需延伸模組的詳細資訊,請參閱 Hyper-V Extensible Switch Extensions

篩選和轉送延伸模組可以排除在可延伸交換器輸入或輸出數據路徑上取得的封包傳遞。 您可以透過下列方式排除封包傳遞:

  • 擴充套件可以透過完成封包要求或指示,來丟棄封包。 這不包括將封包傳遞至任何可延伸交換器埠。 這個方法可用於具有一或多個目的地埠的封包。

    針對在可延伸交換器輸入數據路徑上取得的封包,延伸模組會呼叫 NdisFSendNetBufferListsComplete來完成封包傳送要求。

    針對在可延伸交換器輸出數據路徑上取得的封包,延伸模組會呼叫 NdisFReturnNetBufferLists來完成封包接收指示。

  • 針對使用多個目的地埠在輸出數據路徑上取得的封包,延伸模組可以藉由修改一或多個目的地埠的數據來排除封包傳遞。 擴充功能會藉由將目的地埠 NDIS_SWITCH_PORT_DESTINATION 結構的 IsExcluded 成員設定為一個值來執行此作業。 這個方法可讓封包傳遞至 IsExcluded 值設定為零的埠。

    注意 在輸入數據路徑上獲得的封包不包含目標埠。 只有在可延伸交換器將封包轉送至輸出數據路徑之後,才能使用此數據。

在延伸模組修改了目的地埠的 IsExcluded 值之後,它必須將封包在流出數據路徑中轉送至上層延伸模組。 不過,如果所有封包目的地埠的 IsExcluded 資料設定為「啟用」,擴充功能應完成封包接收指示以卸除封包,而不是轉送封包。

注意 延伸模組將目的地埠的 IsExcluded 值設定為 1 之後,輸出數據路徑上的過度延伸無法將此值變更為零。

注意 封包擷取擴充功能無法阻止封包被傳送到可擴展交換器埠。

篩選和轉送延伸模組必須遵循下列指導方針,以排除封包傳遞至可延伸交換器埠:

  • 在可延伸交換器的入口數據路徑上,篩選和轉送擴充功能可以根據封包來源埠或數據的政策標準來排除封包傳遞。

    來源埠資訊儲存在封包的 NET_BUFFER_LIST 結構的 OOB 數據中的 NDIS_SWITCH_FORWARDING_DETAIL_NET_BUFFER_LIST_INFO 聯集中。 擴充套件使用 NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL 巨集來獲取數據。

    如果擴充功能排除從輸入數據路徑取得的封包傳遞,則必須透過完成封包傳送要求來丟棄封包。

  • 在可延伸交換器輸入數據路徑上,轉送延伸模組會決定封包的目的地埠,並將此資訊新增至封包的 OOB 數據。 根據延伸套件所執行的策略準則,它可以排除封包傳送到某個埠,方法是不將目的埠資訊新增至 OOB 資料。

    如需此程式的詳細資訊,請參閱 將可延伸交換器目的地埠數據新增至封包

  • 在可延伸的交換器輸出數據路徑上,篩選和轉送延伸模組可以根據原則準則排除封包的傳遞。 例如,篩選延伸模組可以根據封包來源埠或目的地埠的原則準則排除封包傳遞。

    擴充功能會遵循下列步驟,防止封包傳送到目標端口:

    1. 延伸模組會藉由呼叫 getNetBufferListDestinations 來取得封包的目的地埠。 如果呼叫返回 NDIS_STATUS_SUCCESS,則 Destinations 參數會指向一個 NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY 結構。 此結構會指定封包的可延伸交換器目的地埠。 每個目的地埠都會格式化為 NDIS_SWITCH_PORT_DESTINATION 結構。

      注意 如果 NumDestinationsNDIS_SWITCH_FORWARDING_DESTINATION_ARRAY 結構中的成員且值為零,則該封包沒有任何目的地埠的數據。

  1. 擴充功能會將目的地埠 NDIS_SWITCH_PORT_DESTINATION 結構的 IsExcluded 成員設定為一個值,以排除封包傳遞至可延伸交換器埠。

    注意 如果擴充功能排除將封包傳遞至其所有目的地埠,擴充功能必須通過完成封包的接收指示來丟棄封包。

  2. 如果延伸模組排除對封包中一或所有目的地埠的傳遞,則必須執行下列動作:

    • 擴充功能必須呼叫 UpdateNetBufferListDestinations,將這些變更提交至封包的非同步數據。

    • 延伸模組必須呼叫 ReportFilteredNetBufferLists。 當此功能被呼叫時,可擴充交換器介面會遞增計數器並為排除的封包記錄事件。 延伸模組必須先進行此呼叫,才能在取得封包的可延伸交換器數據路徑中轉送封包。

    同樣地,如果擴展完成封包傳送要求或指示以排除將封包傳遞至所有埠,它也必須呼叫 ReportFilteredNetBufferLists

    附註 延伸模組可以針對延伸模組排除的封包建立 NET_BUFFER_LIST 結構的連結清單。 當擴充功能呼叫 ReportFilteredNetBufferLists時,會將 NetBufferLists 參數設定為指向連結清單的指標。

如需可延伸交換器輸入和輸出資料路徑的詳細資訊,請參閱 Hyper-V 可延伸交換器資料路徑