透過虛擬埠的封包流程
預設的 NIC 交換器是網路介面卡的元件,可支援單一根目錄 I/O 虛擬化 (SR-IOV) 介面。 交換器一律會將預設虛擬埠 (VPort) 附加至 PCI Express (PCIe) 實體函式 (PF) 。 參數可以將一或多個非預設 VPorts 連結至 PF。 如需詳細資訊,請參閱 建立虛擬埠。
下列幾點適用于附加至 PF 之 VPort 上傳送或接收的封包:
透過預設 VPort 傳送或接收的封包會指定為 DEFAULT_VPORT_ID的 VPort 識別碼值。
透過非預設 VPort 傳送或接收的封包會指定為透過 OID_NIC_SWITCH_CREATE_VPORT的 OID 方法要求建立 VPort 時所傳回的 VPort 識別碼。 當驅動程式處理這個 OID 要求時,它會從與 OID 要求相關聯的NDIS_NIC_SWITCH_VPORT_PARAMETERS結構VPortId 成員取得 VPort識別碼。
注意 刪除 VPort 時,迷你埠驅動程式可以接收包含無效 VPortId 值的 NBL。 如果發生這種情況,迷你埠應該忽略不正確 VPort 識別碼,並改用 DEFAULT_VPORT_ID 。 VPortId位於 NBL OOB 資料的NetBufferListFilteringInfo部分,並使用NET_BUFFER_LIST_RECEIVE_FILTER_VPORT_ID宏來擷取。
PF 迷你埠驅動程式會呼叫 NdisMIndicateReceiveNetBufferLists 來指出從 VPort 接收的封包。 在 PF 迷你埠驅動程式呼叫 NdisMIndicateReceiveNetBufferLists之前,它必須在封包的 NET_BUFFER_LIST結構中 設定頻外 (OOB) 資料的 VPort 識別碼。 驅動程式會使用 NET_BUFFER_LIST_RECEIVE_FILTER_VPORT_ID 宏執行此 動作 。
虛擬化堆疊會呼叫 NdisSendNetBufferLists ,以將封包傳輸至 VPort。 在虛擬化堆疊呼叫 NdisSendNetBufferLists之前,它會在封包的 NET_BUFFER_LIST 結構中設定 OOB 資料的 VPort 識別碼。
迷你埠驅動程式會使用 NET_BUFFER_LIST_RECEIVE_FILTER_VPORT_ID 宏來取得 VPort 識別碼。
迷你埠驅動程式必須在指定 VPort 的硬體傳輸佇列上,將傳輸封包排入佇列。
注意 PCIe 虛擬函式的迷你埠驅動程式 (VF) 不會在 封 包NET_BUFFER_LIST結構的 OOB 資料中設定或查詢 VPort 識別碼。 當 VF 迷你埠驅動程式傳送封包時,它會將硬體傳輸佇列上的封包排入連結至 VF 的單一非預設 VPort。