虛擬埠(VPort)是一個資料物件,代表支援 SR-IOV 的網路介面卡(NIC)交換器上的一個內部埠。 每個 NIC 交換器都有下列網路連線埠:
一個外部實體埠,用於連線到外部實體網路。
一個或多個連線到 PCI Express(PCIe)實體功能(PF)或虛擬功能(VF)的內部 VPort。
PF 會附加至 Hyper-V 父分割區,並在該分割區中執行的管理作業系統中顯示為虛擬網路介面卡。
VF 附加至 Hyper-V 子分割區,並顯示為該分割區中運行的虛擬作業系統中的虛擬網路介面卡。
VPorts 有兩種類型:
默認 VPort
預設 VPort 會提供對執行於管理作業系統中的網路元件的網路連接。 默認 VPort 的識別碼為 NDIS_DEFAULT_VPORT_ID。
當 PF 迷你埠驅動程式建立並設定預設 NIC 參數時,驅動程式會隱含地建立預設 VPort 並將它附加至 PF。 預設 VPort 無法附加至 VF。
默認 VPort 一律處於啟動狀態,且無法明確刪除。 只有在刪除預設 NIC 交換器時,PF 迷你埠驅動程式才會隱含刪除預設 VPort。
如需有關如何在交換器上建立 NIC 交換器和預設 VPort 的詳細資訊,請參閱 建立 NIC 交換器。
非預設 VPort
建立 NIC 交換器時,不會隱式建立非預設的 VPorts。 上層驅動程式,例如虛擬化堆疊,藉由發出 OID_NIC_SWITCH_CREATE_VPORT 的 OID 方法要求來明確建立這些埠。 非預設 VPorts 可以附加至 PF 或 VF,而且只能在建立 NIC 交換器之後建立。
連結至 VF 的非預設 VPort 會提供網路連線能力給在客體作業系統中執行的網路元件。 非預設 VPort 在建立後並附加至 VF,會處於啟動狀態。
連結至 PF 的非預設 VPort,可為管理作系統中執行的網路元件提供額外的網路卸載功能。 例如,PF 上的非預設 VPorts 可用來提供類似於虛擬機佇列 (VMQ) 介面的卸載功能。
注意 只有在建立 NIC 交換器之後,才能建立非預設 VPorts。
上層驅動程式發出方法請求,要求物件識別碼(OID)OID_NIC_SWITCH_CREATE_VPORT,以在指定的 NIC 交換器上建立非預設 VPort。 此 OID 要求也會將建立的 VPort 附加至網路適配器的 PF 或先前配置的 VF。
NDIS_OID_REQUEST 結構的 InformationBuffer 成員包含NDIS_NIC_SWITCH_VPORT_PARAMETERS結構的指標。 從OID_NIC_SWITCH_CREATE_VPORT要求成功傳回之後,NDIS_NIC_SWITCH_VPORT_PARAMETERS 結構的 VPortId 成員具有在 NIC 交換器上 VPorts 中唯一的 VPort 識別符。
上層驅動程式使用有關欲建立之非預設 VPort 的組態資訊,初始化 NDIS_NIC_SWITCH_VPORT_PARAMETERS 結構。 組態資訊包括附加非預設 VPort 的 PCIe 函式,以及非預設 VPort 的佇列配對數目。
當它初始化 NDIS_NIC_SWITCH_VPORT_PARAMETERS 結構時,上層驅動程式必須執行下列動作:
SwitchId 成員必須設定為先前透過 OID_NIC_SWITCH_CREATE_SWITCH 的 OID 方法要求在網路適配器上建立的 NIC 交換器標識碼。
注意 從 Windows Server 2012 開始,SR-IOV 介面僅支援網路適配器上的一個 NIC 交換器。 這個切換器稱為 預設 NIC 切換器。 建立非預設 VPort 時,上層驅動程式必須將 SwitchId 成員設定為 NDIS_DEFAULT_SWITCH_ID 識別碼。
VPortId 成員必須設定為 NDIS_DEFAULT_VPORT_ID。
AttachedFunctionId 成員必須設定為非預設 VPort 要附加到的 VF 或 PF 的標識符。
NDIS_PF_FUNCTION_ID 的值會指定 PF。 否則,此值必須設定為 VF 的標識碼,其資源先前是透過 OID_NIC_SWITCH_ALLOCATE_VF 的 OID 方法要求來配置。
注意 非預設 VPort 建立後,其與 VF 或 PF 的附接關係無法變更。
上層驅動程式也可以指定指派給 VPort 的佇列對數目。 佇列配對是指派給 VPort 的網路適配器上的發送與接收佇列。 如果網路適配器支援非預設 VPorts 的非對稱佇列配對,上層驅動程式可能會為其創建的每個 VPort 指定不同的佇列配對數量。 如需詳細資訊,請參閱 對稱和非對稱佇列配對指派。
上層驅動程式呼叫 NdisOidRequest,向底層 PF 迷你埠驅動程式發出 OID_NIC_SWITCH_CREATE_VPORT 請求。 在 NDIS 將 OID 方法要求轉送至迷你埠驅動程式之前,它會執行下列動作:
NDIS 會驗證 NDIS_NIC_SWITCH_VPORT_PARAMETERS 結構內的參數。 如果參數發生錯誤,NDIS 會失敗 OID 方法要求,而且不會將要求傳遞至 PF 迷你埠驅動程式。
NDIS 會在範圍中指派非預設 VPort 的標識碼,從一到 (NumVPorts– 1),其中 NumVPorts 是迷你埠驅動程式在網路適配器上設定的 VPort 數目。 驅動程式會在 NDIS_NIC_SWITCH_INFO 結構的 NumVPorts 成員中指定這個數位。 驅動程式會透過 OID_NIC_SWITCH_ENUM_SWITCHES的 OID 查詢要求傳回此結構。
注意 NDIS_DEFAULT_VPORT_ID 的 VPort 識別符,會保留給連結至預設 NIC 交換器上的 PF 的預設 VPort。
指派的 VPort 識別碼可唯一識別網路適配器 NIC 交換器上的非預設 VPort。
- NDIS 會使用指派的 VPort 識別符,設定NDIS_NIC_SWITCH_VPORT_PARAMETERS結構的 VPortId 成員。
當 PF 迷你埠驅動程式發出 OID 要求時,驅動程式會配置與指定之非預設 VPort 相關聯的硬體和軟體資源。 成功配置所有資源之後,PF 迷你埠驅動程式會從 MiniportOidRequest傳回NDIS_STATUS_SUCCESS,以順利完成OID。
如果 OID_NIC_SWITCH_CREATE_VPORT 要求順利完成,則 PF 迷你埠驅動程式和重疊的驅動程式必須保留非預設 VPort 的 VPortId 值,以便進行後續作業。 這些作業期間會使用 VPortId 值:
NDIS 和上層驅動程式會使用 VPortId 值來識別與此 VPort 相關的後續 OID 要求中的非預設 VPort,例如 OID_NIC_SWITCH_VPORT_PARAMETERS 和 OID_NIC_SWITCH_DELETE_VPORT。
在傳送作業期間,NDIS 會指定 VPortId 值,以識別封包從中傳送的 VPort。 在 NET_BUFFER_LIST 結構的頻外 (OOB) NDIS_NET_BUFFER_LIST_FILTERING_INFO 數據中指定此值。
在接收作業期間,PF 迷你埠驅動程式會指定要轉送封包的 VPortId 值。 這個值也會在 NET_BUFFER_LIST 結構的 OOB NDIS_NET_BUFFER_LIST_FILTERING_INFO 數據中指定。
下列幾點適用於建立非預設 VPorts:
在 VPort 建立後,會在該 VPort 上配置媒體存取控制(MAC)和虛擬區域網路(VLAN)識別碼的接收篩選器。 上層驅動程式透過發出 OID_RECEIVE_FILTER_SET_FILTER 的 OID 方法請求,動態設定這些接收過濾器。 接收篩選也可以透過 OID_RECEIVE_FILTER_MOVE_FILTER 的 OID 集合要求,從一個 VPort 移至另一個 VPort。
新建的非預設 VPort 連結至 VF 時會處於啟動狀態。 如果 VPort 已連接至 VF,則無法停用 VPort。
連結至 PF 的非預設 VPort 在建立時處於停用狀態。 上層驅動程式,例如 Hyper-V 可延伸交換器模組,會在成功建立 VPort 之後,明確啟動連結至 PF 的非預設的 VPort。 這是藉由向 PF 迷你埠驅動程式發出 OID_NIC_SWITCH_VPORT_PARAMETERS 的 OID 方法要求來完成。
當上層驅動程式發出此 OID 要求時,它會傳遞 NDIS_NIC_SWITCH_VPORT_PARAMETERS 結構,並將 VPortState 成員設定為 NdisNicSwitchVPortStateActivated。
在非預設 VPort 處於啟動狀態之後,PF 迷你埠驅動程式可以呼叫 NdisAllocateSharedMemory 來配置 VPort 的共用記憶體。 驅動程式必須將 NDIS_SHARED_MEMORY_PARAMETERS 結構中的 VPortId 成員設定為 VPort 的識別碼值。
注意 當非預設 VPort 處於啟動狀態時,它只會在透過 OID_NIC_SWITCH_DELETE_VPORT 的 OID 集合要求刪除時設定為停用狀態。