將可延伸交換器目的地埠資料新增至封包
本主題描述 Hyper-V 可延伸交換器轉送延伸模組如何指定封包傳遞至一或多個目的地埠。 這些延伸模組也可以將封包轉送至系結至可延伸交換器外部網路介面卡的個別實體網路介面卡。
注意 只有轉送延伸模組或交換器本身可以將封包轉送至可延伸交換器埠或個別網路介面卡。
下圖顯示透過 NDIS 6.40 (Windows Server 2012 R2) 和更新版本的可延伸交換器驅動程式堆疊,封包流量的資料路徑。 這兩個圖也會顯示連線至可延伸交換器埠之網路介面卡的封包流量資料路徑。
下圖顯示透過 NDIS 6.30 (Windows Server 2012) 可延伸交換器驅動程式堆疊的封包流量資料路徑。
每個可延伸交換器目的地埠都是由NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY結構內的NDIS_SWITCH_PORT_DESTINATION元素指定。 這個陣列包含在封包 NET_BUFFER_LIST結構的頻 外 (OOB) 轉送內容中。 如需此內容的詳細資訊,請參閱 Hyper-V 可延伸交換器轉送內容。
如果在可延伸交換器驅動程式堆疊中系結並啟用轉送延伸模組,它會負責判斷從可延伸交換器輸入資料路徑取得之每個封包的目的地埠,除非封包是 NVGRE 封包。 如需此資料路徑的詳細資訊,請參閱 Hyper-V 可延伸交換器資料路徑的概觀。 如需 NVGRE 封包的詳細資訊,請參閱 混合式轉送。
注意 如果未在驅動程式堆疊中系結或啟用轉送延伸模組,可延伸交換器會決定其從輸入資料路徑取得之封包的目的地埠。
當轉送延伸模組決定在輸入資料路徑上取得之封包的目的地埠時,必須遵循下列指導方針:
延伸模組必須在具有目的地埠資訊的 NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY 結構內初始化 NDIS_SWITCH_PORT_DESTINATION 結構。
如果目的地埠未連線到外部網路介面卡,擴充功能必須將NDIS_SWITCH_PORT_DESTINATION結構的NicIndex成員設定為NDIS_SWITCH_DEFAULT_NIC_INDEX。
如果目的地埠連線到可延伸交換器外部網路介面卡,擴充功能可以指定基礎實體網路介面卡的索引,以便轉送傳送要求。 擴充功能會藉由將 NicIndex 成員設定為系結至外部網路介面卡之目的地網路介面卡的非零NDIS_SWITCH_NIC_INDEX值來執行此動作。
如需詳細資訊,請參閱 將封包轉送至實體網路介面卡。
延伸模組必須針對具有作用中網路介面卡連線的埠,將目的地埠新增至封包的 OOB 資料。 如果延伸模組已轉送 OID_SWITCH_NIC_DISCONNECT 要求,它不得新增與已中斷連線網路介面卡相關聯的目的地埠。
若要改善效能,擴充功能必須新增對封包傳遞有效的埠目的地。 在此情況下,延伸模組必須將目的地埠NDIS_SWITCH_PORT_DESTINATION結構的IsExcluded成員設定為 FALSE。
若要在傳遞至埠之前,保留 802.1Q 虛擬區域網路絡 (VLAN) 資料,擴充功能會將 PreserveVLAN 成員設定為 TRUE。
若要在封包中將 802.1Q 虛擬區域網路絡 (VLAN) 資料傳遞至埠之前,擴充功能會將 PreserveVLAN 成員設定為 FALSE。
若要在封包中保留 802.1Q 優先順序資料再傳遞至埠,延伸模組會將 PreservePriority 成員設定為 TRUE。
若要先移除封包中的 802.1Q 優先順序資料,再將其傳遞至埠,延伸模組會將 PreservePriority 成員設定為 FALSE。
如果轉送延伸模組為封包新增多個目的地埠,則必須遵循下列步驟:
延伸模組會先使用NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL宏來存取封包的NDIS_SWITCH_FORWARDING_DETAIL_NET_BUFFER_LIST_INFO結構。 然後延伸模組會讀取 NumAvailableDestinations 成員,以判斷目的地埠陣列中有多少未使用的目的地埠元素可用。 如果擴充功能需要比陣列中可用的更多目的地埠,則必須呼叫 GrowNetBufferListDestinations 函式來配置陣列中其他目的地埠的空間。
當擴充功能呼叫 GrowNetBufferListDestinations時,它會將 NumberOfNewDestinations 參數設定為要新增至封包的新目的地埠數目。
延伸模組也會將 NetBufferLists 參數設定為封包 NET_BUFFER_LIST 結構的指標。
注意 如果陣列中有可用的目的地埠,擴充功能不應該呼叫 GrowNetBufferListDestinations。
如果 GrowNetBufferListDestinations 函式成功傳回,它已將其他目的地埠新增至 NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY 結構中目的地陣列的結尾。 此結構的指標會在 Destinations 參數中傳回。
注意 如果 GrowNetBufferListDestinations 函式無法配置要求的目的地埠數目,則會傳回NDIS_STATUS_RESOURCES。
延伸模組會指定 NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY 結構中的新目的地埠元素。 擴充功能會將每個新的目的地埠初始化為 NDIS_SWITCH_PORT_DESTINATION 結構。
擴充功能會從 NumDestinations 位移開始,初始化陣列的新目的地埠。 NumDestinations 是 NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY 結構的成員。
擴充功能完成新增或修改目的地埠元素之後,必須呼叫 UpdateNetBufferListDestinations 來認可這些變更。
如果擴充功能為封包新增單一目的地埠,則必須遵循下列步驟:
擴充功能會初始化延伸模組配置 NDIS_SWITCH_PORT_DESTINATION 結構中封包的目的地埠資訊。
擴充功能會呼叫 AddNetBufferListDestination ,以認可封包 NET_BUFFER_LIST 結構的變更。 延伸模組會在Destination參數中傳遞NDIS_SWITCH_PORT_DESTINATION結構的位址。
注意 擴充功能不應該呼叫 UpdateNetBufferListDestinations 函式,將變更認可至只有一個目的地埠的封包。
當轉送延伸模組呼叫 AddNetBufferListDestination 或 UpdateNetBufferListDestinations 來認可目的地埠的變更時,可延伸交換器介面將不會刪除 NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY 結構元素中指定的可延伸交換器埠。 封包傳送或接收作業完成之後,如果有必要,介面就可以刪除埠。
注意轉送延伸模組認可目的地埠變更至轉送內容之後,就無法移除目的地埠,而且只能變更目的地埠NDIS_SWITCH_PORT_DESTINATION結構的IsExcluded成員。 如需詳細資訊,請參閱 排除封包傳遞至可延伸交換器目的地埠。
轉送延伸模組必須同步處理其物件識別碼 (OID) 設定 OID_SWITCH_NIC_DISCONNECT 的要求,以及其程式碼,以新增已中斷連線網路介面卡的目的地埠。
如果針對OID_SWITCH_NIC_DISCONNECT要求呼叫轉送延伸模組的FilterOidRequest,擴充功能可以執行下列其中一項:
如果稱為 NdisFOidRequest 的擴充功能轉送此 OID 要求,則它不得將具有已中斷連線網路介面卡的埠指定為封包的目的地埠。
注意 如果封包的唯一目的地埠是具有已中斷連線網路介面卡的埠,擴充功能必須卸載封包。
延伸模組可以傳回NDIS_STATUS_PENDING以非同步方式完成要求。 這可讓擴充功能新增具有已中斷連線網路介面卡的埠作為封包的目的地埠。 這也允許擴充功能呼叫 AddNetBufferListDestination 或 UpdateNetBufferListDestinations ,並完成將目的地埠新增至封包。
擴充功能可能會想要針對必須轉送至埠的封包執行這項操作,然後再將其損毀。
注意 如果擴充功能傳回NDIS_STATUS_PENDING,它也可以呼叫 ReferenceSwitchPort ,以使用中斷連線網路介面卡來遞增埠的參考計數器。 不過,延伸模組在呼叫 DereferenceSwitchPort 以遞減埠的參考計數器之前,無法轉送 OID 要求。
如果目的地埠數目為零,轉送延伸模組必須呼叫 NdisMSendNetBufferListsComplete 來卸載封包。 擴充功能也必須呼叫 ReportFilteredNetBufferLists ,以通知可延伸的交換器介面有關已捨棄的封包。
注意 如果轉送延伸模組從輸入資料路徑取得多個封包 之NET_BUFFER_LIST 結構的連結清單,它應該建立個別的已捨棄封包清單。 如此一來,擴充功能就可以呼叫 NdisMSendNetBufferListsComplete 和 ReportFilteredNetBufferLists 一次。
如果目的地埠數目大於零,轉送延伸模組必須呼叫 NdisFSendNetBufferLists ,將封包轉送至可延伸交換器的迷你埠邊緣。
注意 如果轉送延伸模組已從輸入資料路徑取得多個封包 之NET_BUFFER_LIST 結構的連結清單,則應該建立個別的轉送封包清單。 如此一來,擴充功能就可以呼叫 NdisFSendNetBufferLists 一次,以轉送封包清單。 此外,延伸模組應該維護個別的清單,以轉送具有相同目的地埠的封包。 如需詳細資訊,請參閱 Hyper-V 可延伸交換器傳送和接收旗標。