共用方式為


複製封包流量

本主題描述如何 Hyper-V 可延伸交換器延伸模組複製或複製封包,並將其插入可延伸交換器數據路徑中。 如需有關複製封包的更多資訊,請參閱 複製NET_BUFFER_LIST結構

注意 此頁面假設您已熟悉 Hyper-V Extensible Switch 概觀和 混合式轉送中的資訊和圖表。

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

可延伸交換器篩選和轉送延伸模組可以遵循下列指導方針,將複製的封包插入可延伸交換器輸入或輸出數據路徑:

  • 延伸模組必須先為複製的封包配置 NET_BUFFER_LIST 結構。 延伸模組接著必須將封包數據從原始封包複製到複製的封包。 如需有關如何克隆封包的詳細資訊,請參閱 衍生的 NET_BUFFER_LIST 結構

  • 延伸模組配置 NET_BUFFER_LIST 結構之後,它必須呼叫 AllocateNetBufferListForwardingContext handler 函式,以配置封包的可延伸交換器轉送內容。

    轉送內容位於封包的頻外 (OOB) 數據中。 它包含封包的轉送資訊,例如其來源埠和一或多個目的地埠的陣列。

    如需轉送內容的詳細資訊,請參閱 Hyper-V 可延伸交換器轉送內容

  • 擴充元件必須藉由呼叫 CopyNetBufferListInfo,將 OOB 數據,包括現有的來源埠,從原始封包複製到複製的封包。 如果擴充功能計劃將封包插入輸入數據路徑,它也必須從原始封包的 OOB 資料中複製目標端口。

    當它複製 OOB 數據時,延伸模組必須遵循下列指導方針:

    • 如果篩選擴充功能計劃將封包插入輸入資料路徑,則必須呼叫 CopyNetBufferListInfo 並且不指定 NDIS_SWITCH_COPY_NBL_INFO_FLAGS_PRESERVE_DESTINATIONS 標誌。 這會導致原始封包的目的地埠不會複製到複製的封包。 當篩選延伸模組將此封包注入到輸入資料路徑時,目的地端口會由基礎轉送延伸模組(如果在驅動程式堆疊中啟用)或可延伸交換器的小埠邊緣新增至封包。

    • 如果篩選延伸模組計劃將封包插入輸出數據路徑,則必須呼叫 CopyNetBufferListInfo,並指定 NDIS_SWITCH_COPY_NBL_INFO_FLAGS_PRESERVE_DESTINATIONS 旗標。 這會導致原始封包的目標端口被複製到複製的封包中。

  • 如果篩選擴充模組正在複製或複製從匯出資料路徑取得的封包,則在呼叫CopyNetBufferListInfo並指定NDIS_SWITCH_COPY_NBL_INFO_FLAGS_PRESERVE_DESTINATIONS旗標後,它可以變更封包的目的地埠。 如需此程序的詳細資訊,請參閱 修改封包的擴展交換器來源埠資料

  • 如果轉送延伸模組正在克隆或複製從輸入數據路徑取得的封包,它必須先為封包添加新的目的地埠,才能將封包注入輸入數據路徑。 如需此程式的詳細資訊,請參閱 將可延伸交換器目的地埠資料新增至封包

  • 擴充功能呼叫 CopyNetBufferListInfo之後,封包將會指派原始封包中包含的相同來源埠資訊。

    擴充功能可以呼叫 SetNetBufferListSource,以變更封包頻外 (OOB) 數據中的來源埠資訊。

    擴充功能可能會希望封包被視為源自特定埠。 這可讓該埠的原則套用至封包。 擴充功能會呼叫 SetNetBufferListSource 來變更封包的來源埠。

    不過,在某些情況下,擴充功能可能會想要將封包的來源埠標識碼指派給 NDIS_SWITCH_DEFAULT_PORT_ID。 例如,擴充功能可能會想要將來源埠標識符設定為 NDIS_SWITCH_DEFAULT_PORT_ID,以取得傳送至外部網路上裝置的專屬控制封包。

  • 在標準 NDIS 數據路徑中,非可延伸的交換器 OOB 數據通常有不同的值,視封包是否表示為傳送或接收而定。 例如,NDIS_IPSEC_OFFLOAD_V2_HEADER_NET_BUFFER_LIST_INFO OOB 數據是具備傳送和接收特定結構的聯合體

    在可延伸交換器的數據路徑中,所有封包在傳送和接收過程中皆會透過延展驅動程式堆疊移動。 因此,封包 NET_BUFFER_LIST 結構內的非可延伸交換器 OOB 資料,會在通過驅動程式堆疊的流程中,以傳送或接收格式存在。

    此 OOB 資料的格式取決於封包抵達可延伸交換器的來源可延伸交換器埠。 如果來源埠連接到外部網路介面卡,則非可延伸交換器的 OOB 數據將會是接收格式。 對於其他埠,此 OOB 資料會以傳送格式表示。

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

    附註 如果延伸模組複製封包的 NET_BUFFER_LIST 結構,如果擴充功能新增或修改 OOB 數據,則必須將不可延伸的交換器 OOB 數據納入考慮。 擴充功能可以呼叫 CopyNetBufferListInfo,將所有 OOB 數據從來源封包複製到複製的封包。 當數據複製到封包時,此函式會維護 OOB 傳送或接收格式。

  • 當擴充功能複製封包時,複製的封包數據會被放置在本機或在 Hyper-V 父分割區的父操作系統中的 信任記憶體中。 子分割區無法存取此記憶體。 因此,該分割區被在其中運行的客體作業系統視為「安全」,以避免非同步更新。

    複製原始封包之後,擴充套件必須透過使用 NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL 巨集,來取得複製封包中的 NDIS_SWITCH_FORWARDING_DETAIL_NET_BUFFER_LIST_INFO 聯合體。 延伸模組必須將isPacketDataSafe 成員 設為TRUE。 這會指定所有封包數據都位於信任的記憶體中。

篩選與轉送延伸模組必須遵循下列指導方針,將複製的封包插入輸入或輸出資料路徑:

  • 延伸模組必須呼叫 NdisFSendNetBufferLists,將複製的封包插入輸入數據路徑。 擴充功能必須設定具有適當可延伸切換旗標設定的 SendFlags 參數。 如需這些旗標設定的詳細資訊,請參閱 Hyper-V 可延伸交換器傳送和接收旗標

    當 NDIS 呼叫延伸模組的 FilterSendNetBufferListsComplete 函式以完成複製封包的傳送要求時,延伸模組必須呼叫 FreeNetBufferListForwardingContext 來釋放分配的轉送內容。 延伸模組必須先執行這項操作,才能釋放或重複使用封包的 NET_BUFFER_LIST 結構。

    注意 如果擴充功能修改從輸出數據路徑取得封包的封包數據或來源埠,則必須將複製的封包插入輸入數據路徑。 如果封包的目的地埠未保留,它也必須將複製的封包插入輸入數據路徑。

  • 延伸模組必須呼叫 NdisFIndicateReceiveNetBufferLists,以將複製的封包插入輸出數據路徑。 延伸模組必須使用適當的可延伸交換器旗標設定來設定 ReceiveFlags 參數。

    當 NDIS 呼叫擴充模組的 FilterReturnNetBufferLists 函式以完成克隆封包的接收要求時,擴充功能必須先呼叫 FreeNetBufferListForwardingContext,再釋放或重複使用封包的 NET_BUFFER_LIST 結構。

    注意 在轉送延伸模組呼叫 NdisFIndicateReceiveNetBufferLists之前,它必須已判斷複製的數據包目的地埠,並將此數據新增至數據包的 OOB 數據。

  • 如果延伸模組複製封包的 NET_BUFFER_LIST 結構,它必須保留原始封包 NET_BUFFER_LIST 結構的擁有權,直到複製封包的傳送或接收要求完成為止。 延伸模組必須使用 ParentNetBufferList 複製封包 NET_BUFFER_LIST 結構的成員,連結至原始封包的 NET_BUFFER_LIST 結構。

    附註 在NDIS 6.30(Windows Server 2012)中,擴展功能可以使用 ParentNetBufferList 成員來連結到原始封包,但不是必須這麼做。 在 NDIS 6.40(Windows Server 2012 R2)及之後的版本中,必須使用 ParentNetBufferList 成員連結至原始封包。

    複製封包的傳送或接收要求完成後,擴充功能必須完成原始封包的傳送或接收要求。

    注意 如果延伸模組已複製封包的 NET_BUFFER_LIST 結構,它可以在複製封包之後完成原始封包的傳送或接收要求。

  • 如果擴充功能複製封包,只要複製封包,就可以完成原始封包的傳送或接收要求。

如果轉送或篩選延伸模組取得輸出數據路徑中的封包,如果延伸模組修改封包數據或變更來源埠,就無法在此數據路徑中插入複製的封包版本。 不過,延伸模組可以將這些封包插入輸入數據路徑。 這可讓封包透過可延伸的交換器數據路徑正確轉送和篩選。

注意 篩選延伸模組只有在封包的目的地埠未保留時,才能將複製的封包插入輸入數據路徑。

例如,假設在可延伸交換器輸出數據路徑中取得具有多個目的地埠的封包。 如果一個目的地埠需要特殊處理,例如數據封裝,轉送或篩選延伸模組會遵循下列步驟來處理這項作業:

  1. 排除在外需要特殊處理的埠的封包傳遞。 擴充功能會藉由將目的地埠 NDIS_SWITCH_PORT_DESTINATION 結構的 IsExcluded 成員設定為一個值來執行此作業。 如需此程序的詳細資訊,請參閱 排除傳送封包至可延伸交換器目的地埠

  2. 複製原始封包,並執行封包數據的必要處理。

    附注 篩選延伸模組不得新增複製封包的目的地埠。 此數據稍後會由可延伸交換器的轉送延伸模組或迷你埠端新增。

  3. 呼叫 NdisMIndicateReceiveNetBufferLists,在輸出數據路徑上轉送原始封包。

  4. 呼叫 NdisFSendNetBufferLists,在輸入數據路徑上插入複製的封包。

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

注意 擷取擴充功能無法複製封包流量。 不過,它們可以產生封包流量。 如需詳細資訊,請參閱 原始封包流量