建立虛擬埠
虛擬埠 (VPort) 是一個資料物件,代表網路介面卡之 NIC 交換器上的內部埠,其支援單一根目錄 I/O 虛擬化 (SR-IOV) 。 每個 NIC 交換器都有下列網路連線埠:
一個外部實體埠,可連線到外部實體網路。
連線到 PCI Express (PCIe) 實體函式的一或多個內部 VPort (PF) 或虛擬函式 (VFs) 。
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 可提供客體作業系統中執行之網路元件的網路連線能力。 建立並附加至 VF 之後,非預設 VPort 會處於啟動狀態。
附加至 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 的佇列組數目。 佇列配對是指派給 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– 1) ,其中 NumVPorts 是迷你埠驅動程式在網路介面卡上設定的 VPort 數目。 驅動程式會在NDIS_NIC_SWITCH_INFO結構的NumVPorts成員中指定這個數位。 驅動程式會透過 OID_NIC_SWITCH_ENUM_SWITCHES的 OID 查詢要求傳回此結構。
注意 NDIS_DEFAULT_VPORT_ID的 VPort 識別碼會保留給預設 VPort,此 VPort 會附加至預設 NIC 交換器上的 PF。
指派的 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 上設定媒體存取控制 (MAC) 和虛擬 LAN (VLAN) 識別碼的篩選。 透過發出 OID_RECEIVE_FILTER_SET_FILTER的 OID 方法要求,以動態方式設定這些接收篩選。 接收篩選也可以從一個 VPort 移至另一個 VPort,透過 OID_RECEIVE_FILTER_MOVE_FILTER的 OID 集合要求。
附加至 VF 的非預設 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 集合要求刪除 OID_NIC_SWITCH_DELETE_VPORT時設定為已停用的狀態。