共用方式為


將可延伸交換器目的地埠數據新增至封包

本主題描述 Hyper-V 可延伸交換器轉送延伸模組如何指定將封包傳遞至一或多個目的地埠。 這些擴充功能也可以將封包轉送至系結至可延伸交換器外部網路適配器的個別實體網路適配器。

注意 只有轉送延伸模組或交換器本身可以將封包轉送至可延伸交換器埠或個別網路適配器。

下圖顯示透過 NDIS 6.40 (Windows Server 2012 R2) 和更新版本之可延伸交換器驅動程式堆疊的封包流量數據路徑。 這兩個圖形也顯示了連接到可延伸交換器埠的網路適配器的封包流量數據路徑。

流程圖,顯示封包流量至或自連接至可延伸交換器埠的網路介面卡的數據路徑,適用於 NDIS 6.40 (Windows Server 2012 R2) 及更新版本。

下圖顯示透過 NDIS 6.30 之可延伸交換器驅動程式堆疊的封包流量數據路徑(Windows Server 2012)。

流程圖,顯示連線至 NDIS 6.30 (Windows Server 2012) 之可延伸交換器埠之網路適配器的封包流量數據路徑。

每個可延伸交換器目的埠是由 NDIS_SWITCH_PORT_DESTINATION 元素指定,位於 NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY 結構內。 此陣列包含在封包 NET_BUFFER_LIST 結構的頻外轉送內容中。 如需此上下文的詳細資訊,請參閱 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。

  • 如果轉送延伸模組為封包新增多個目的地埠,則必須遵循下列步驟:

    1. 擴充套件會先使用 NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL 巨集來存取封包的 NDIS_SWITCH_FORWARDING_DETAIL_NET_BUFFER_LIST_INFO 結構。 延伸模組接著會讀取 NumAvailableDestinations 成員,來確定目的地埠陣列中有多少未使用的目的地埠元素。 如果擴充功能需要比陣列中可用的更多目的地埠,則必須呼叫 GrowNetBufferListDestinations 函式,為數位中的其他目的地埠配置空間。

      當擴充功能呼叫 GrowNetBufferListDestinations時,會將 NumberOfNewDestinations 參數設定為要新增至封包的新目的地埠數目。

      延伸模組也會將 NetBufferLists 參數設定為封包的 NET_BUFFER_LIST 結構的指標。

      注意 如果陣列中有可用的目的地埠,擴充功能不應該呼叫 GrowNetBufferListDestinations

    2. 如果 GrowNetBufferListDestinations 函式成功返回,它已將額外的目的埠新增至 NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY 結構中的目的地陣列末端。 這個結構的指標會在 Destinations 參數中傳回。

      注意 如果 GrowNetBufferListDestinations 函式無法配置要求的目的地埠數目,則會傳回NDIS_STATUS_RESOURCES。

    3. 擴充功能會指定 NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY 結構中的新目的地埠元素。 擴充功能會將每個新的目的地埠初始化為 NDIS_SWITCH_PORT_DESTINATION 結構。

      此延伸模組會將新的目的地埠初始化到陣列,從 NumDestinations 開始偏移NumDestinationsNDIS_SWITCH_FORWARDING_DESTINATION_ARRAY 結構的成員。

    4. 擴充元件完成新增或修改目標埠元素之後,必須呼叫 UpdateNetBufferListDestinations 來提交這些變更。

  • 如果擴充功能新增封包的單一目的地埠,則必須遵循下列步驟:

    1. 延伸模組會初始化延伸模組配置之 NDIS_SWITCH_PORT_DESTINATION 結構中封包的目的地埠資訊。

    2. 擴充功能會呼叫 AddNetBufferListDestination,以認可封包 NET_BUFFER_LIST 結構的變更。 延伸模組會在 Destination 參數中傳遞 NDIS_SWITCH_PORT_DESTINATION 結構的位址。

      注意 擴充功能不應呼叫 UpdateNetBufferListDestinations 函式,以對只有一個目的地埠的封包進行變更認可。

  • 當轉送延伸模組呼叫 AddNetBufferListDestinationUpdateNetBufferListDestinations 認可目的地埠的變更時,可延伸交換器介面將不會刪除 NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY 結構元素中指定的可延伸交換器埠。 封包傳送或接收作業完成後,如有必要,介面即可刪除埠。

    注意 當轉送延伸模組將目的埠的變更認可到轉送內容後,目的埠便無法被移除,且只能變更目的地埠 NDIS_SWITCH_PORT_DESTINATION 結構中的 IsExcluded 成員。 如需詳細資訊,請參閱 忽略封包傳遞至可延伸交換器目的地埠

  • 轉送延伸模組必須同步處理 OID_SWITCH_NIC_DISCONNECT 的物件識別碼 (OID) 集合要求,以及其程式代碼,以新增已中斷連線網路適配器的目的地埠。

    如果針對 OID_SWITCH_NIC_DISCONNECT 要求呼叫轉送擴充套件的 FilterOidRequest,擴充套件可以執行下述任一項:

    • 如果名為 NdisFOidRequest 的擴充功能 轉送此 OID 要求,則不能將已中斷連線網路適配器的埠指定為封包之目的地埠。

      注意 如果封包的唯一目的地埠是具有已中斷連線網路適配器的埠,擴充功能必須卸除封包。

    • 延伸模組可以傳回NDIS_STATUS_PENDING,以異步方式完成要求。 這可讓擴充套件將連接已中斷網路適配器的埠新增為封包的目的地埠。 這也允許擴充功能呼叫 AddNetBufferListDestinationUpdateNetBufferListDestinations,並完成將目的地埠新增至封包。

      擴充功能可能會想要針對它必須轉送至埠的封包執行此動作,然後再將其拆毀。

      注意 如果擴充套件傳回 NDIS_STATUS_PENDING,它也可以呼叫 ReferenceSwitchPort,以遞增具有已卸除網路配接器之埠的參考計數器。 不過,延伸模組在呼叫 DereferenceSwitchPort 之後,才能轉送 OID 要求, 以遞減埠的參考計數器。

  • 如果目的地埠數目為零,轉送延伸模塊必須呼叫 NdisMSendNetBufferListsComplete 以卸除封包。 延伸模組也必須呼叫 ReportFilteredNetBufferLists,以通知可延伸交換器介面關於已丟棄封包的信息。

    注意 如果轉送延伸模組從輸入資料路徑取得多個封包所屬的 NET_BUFFER_LIST 結構連結清單,則應該建立個別的棄置封包清單。 如此一來,擴充功能就可以呼叫 NdisMSendNetBufferListsComplete,並 ReportFilteredNetBufferLists 一次。

  • 如果目的地埠數目大於零,轉送延伸模塊必須呼叫 NdisFSendNetBufferLists,將封包轉送至可延伸交換器之迷你埠邊緣的輸入數據路徑。

    注意 如果轉送擴展模組從輸入資料路徑中獲取了包含多個封包的 NET_BUFFER_LIST 結構鏈表,則應建立一個單獨的清單來管理轉送的封包。 如此一來,擴充功能只需呼叫一次 NdisFSendNetBufferLists,即可轉送封包清單。 此外,延伸模組應該維護個別清單,以轉送具有相同目的地埠的封包。 如需詳細資訊,請參閱 Hyper-V 可延伸交換器傳送和接收旗標