複製封包流量
本主題描述 Hyper-V 可延伸交換器延伸模組如何複製或複製封包,並將其插入可延伸交換器資料路徑。 如需複製封包的詳細資訊,請參閱 複製NET_BUFFER_LIST結構。
注意 此頁面假設您已熟悉 Hyper-V 可延伸交換 器和 混合式轉送概觀中的資訊和圖表。
注意 在可延伸交換器介面中,NDIS 篩選驅動程式稱為可延伸 交換器延伸模組 ,而驅動程式堆疊稱為 可延伸交換器驅動程式堆疊。 如需擴充功能的詳細資訊,請參閱 Hyper-V 可延伸交換器擴充功能。
可延伸交換器篩選和轉送延伸模組可以遵循下列指導方針,將複製的封包插入可延伸交換器輸入或輸出資料路徑:
擴充功能必須先為複製的封包配置 NET_BUFFER_LIST 結構。 延伸模組接著必須將封包資料從原始封包複製到複製的封包。 如需如何複製封包的詳細資訊,請參閱 衍生NET_BUFFER_LIST結構。
擴充功能配置 NET_BUFFER_LIST 結構之後,它必須呼叫 AllocateNetBufferListForwardingCoNtext 處理常式函式來配置封包的可延伸交換器轉送內容。
轉送內容位於封包的頻外 (OOB) 資料中。 它包含封包的轉送資訊,例如其來源埠和一或多個目的地埠的陣列。
如需轉送內容的詳細資訊,請參閱 Hyper-V 可延伸交換器轉送內容。
擴充功能必須藉由呼叫 CopyNetBufferListInfo,將 OOB 資料從原始封包複製到複製的封包,包括現有的來源埠。 如果延伸模組計畫將封包插入輸入資料路徑,它也必須從原始封包的 OOB 資料複製目的地埠。
當它複製 OOB 資料時,延伸模組必須遵循下列指導方針:
如果篩選延伸模組計畫將封包插入輸入資料路徑中,則必須使用未指定的NDIS_SWITCH_COPY_NBL_INFO_FLAGS_PRESERVE_DESTINATIONS旗標呼叫 CopyNetBufferListInfo 。 這會導致原始封包的目的地埠不會複製到複製的封包。 當篩選延伸模組將此封包插入輸入資料路徑時,如果驅動程式堆疊中已啟用) 或可延伸交換器的迷你埠邊緣,目的地埠將會透過基礎轉送延伸模組 (新增至封包。
如果篩選延伸模組計畫將封包插入輸出資料路徑中,則必須呼叫 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 結構的擁有權,直到複製的封包的傳送或接收要求完成為止。 擴充功能必須使用所複製封包NET_BUFFER_LIST結構的ParentNetBufferList成員,連結至原始封包的NET_BUFFER_LIST結構。
注意在 NDIS 6.30 (Windows Server 2012) 中,延伸模組可以使用ParentNetBufferList成員連結至原始封包,但不需要這麼做。 在 NDIS 6.40 (Windows Server 2012 R2) 和更新版本中,必須使用ParentNetBufferList成員連結至原始封包。
複製的封包傳送或接收要求完成後,延伸模組必須完成原始封包的傳送或接收要求。
注意 如果延伸模組已複製封包 的NET_BUFFER_LIST 結構,則可以在複製封包之後完成原始封包的傳送或接收要求。
如果擴充功能複製封包,只要複製原始封包,就可以完成原始封包的傳送或接收要求。
如果轉送或篩選延伸模組在輸出資料路徑中取得封包,則如果延伸模組修改了封包資料或變更來源埠,就無法在此資料路徑中插入複製的封包版本。 不過,延伸模組可以將這些封包插入輸入資料路徑。 這可讓封包透過可延伸交換器資料路徑正確轉送和篩選。
注意 如果封包的目的地埠未保留,篩選延伸模組只能將複製的封包插入輸入資料路徑。
例如,假設在可延伸交換器輸出資料路徑中取得具有多個目的地埠的封包。 如果一個目的地埠需要特殊處理,例如資料封裝,轉送或篩選延伸模組會遵循下列步驟來處理此問題:
排除封包傳遞至需要特殊處理的埠。 擴充功能會藉由將目的地埠NDIS_SWITCH_PORT_DESTINATION結構的IsExcluded成員設定為一個值來執行此動作。 如需此程式的詳細資訊,請參閱 排除封包傳遞至可延伸交換器目的地埠。
複製原始封包,並執行封包資料的必要處理。
注意 篩選延伸模組不得為複製的封包新增目的地埠。 此資料稍後會由可延伸交換器的轉送延伸模組或迷你埠邊緣新增。
呼叫 NdisMIndicateReceiveNetBufferLists,在輸出資料路徑上轉送原始封包。
呼叫 NdisFSendNetBufferLists,在輸入資料路徑上插入複製的封包。
如需可延伸交換器輸入和輸出資料路徑的詳細資訊,請參閱 Hyper-V 可延伸交換器資料路徑。
注意 擷取延伸模組無法複製封包流量。 不過,它們可以產生封包流量。 如需詳細資訊,請參閱 原始封包流量。