本主題描述 Hyper-V 可延伸交換器延伸模組的儲存和還原作業。 這些作業可讓擴充功能儲存及還原個別可延伸交換器網路適配器(NIC)的運行時間數據。 當具有連接至可延伸交換器埠的網路介面卡的 Hyper-V 子分割區正被停止或啟動時,將執行這些操作。
儲存 Hyper-V 可擴充交換器 Run-Time 資料
本節說明 Hyper-V 可延伸交換器擴充功能如何儲存個別網路適配器(NIC)執行時數據的作業。 當具有網路適配器連接到可延伸交換器埠的子分割區 Hyper-V 停止或其狀態被儲存時,就會執行此操作。
處理OID_SWITCH_NIC_SAVE請求
當 Hyper-V 具有可延伸交換器埠之網路適配器連線的子分割區停止或儲存其狀態時,會通知 Hyper-V 可延伸交換器介面。 這會導致可延伸開關的通訊協定邊緣向可延伸開關驅動程式堆疊發出 OID_SWITCH_NIC_SAVE 的物件識別碼 (OID) 方法請求。 當可延伸交換器擴充功能收到此 OID 要求時,它可以為附加至子分割區的指定網路適配器連線儲存其運行時間數據。
NDIS_OID_REQUEST 結構中針對 OID_SWITCH_NIC_SAVE 要求的 InformationBuffer 成員包含一個指向 NDIS_SWITCH_NIC_SAVE_STATE 結構的指標。 此結構是由可延伸交換器的通訊協定邊緣所配置,並以下列方式初始化:
Header 成員會被初始化以包含目前類型和修訂的 NDIS_SWITCH_NIC_SAVE_STATE 結構。 大小會設定為完整緩衝區大小。
PortId 成員包含執行儲存作業之可延伸交換器埠的唯一標識符。
當它收到 OID_SWITCH_NIC_SAVE 方法要求時,擴充功能會執行下列動作:
延伸模組會讀取 NDIS_SWITCH_NIC_SAVE_STATE 結構的 PortId 成員。
如果延伸模組針對指定的 NIC 有需儲存的運行時數據,它會將數據儲存在 NDIS_SWITCH_NIC_SAVE_STATE 結構中,從該結構開頭的 SaveDataOffset 個字節開始。 接著,擴充套件會使用 NDIS_STATUS_SUCCESS 來完成 OID 方法請求。
如果 NDIS_SWITCH_NIC_SAVE_STATE 結構沒有提供足夠的緩衝區來保存運行時間狀態,擴充功能會將方法結構的 BytesNeeded 字段設定為 NDIS_SIZEOF_NDIS_SWITCH_NIC_SAVE_STATE_REVISION_1 加上保存數據所需的緩衝區數量,並使用 NDIS_STATUS_BUFFER_TOO_SHORT完成 OID。 OID 識別碼將會以所需的大小重新發出。
如果延伸模組沒有執行時間資料來儲存指定的 NIC,則必須呼叫 NdisFOidRequest。 這會將 OID 方法要求轉送至可延伸交換器驅動程式堆疊中的基礎驅動程式。 如需瞭解此程序的詳細資訊,請參閱 NDIS 篩選驅動程式中的 OID 請求。
如果擴充功能有埠運行時資料需要儲存,當在 NDIS_SWITCH_NIC_SAVE_STATE 結構中儲存埠運行時資料時,它必須遵循下列指導方針:
擴充功能會將 ExtensionId 成員設定為可唯一識別驅動程式的 GUID 值。
擴充功能會將 ExtensionFriendlyName 成員設定為驅動程式的名稱。
Note NDIS_SWITCH_EXTENSION_FRIENDLYNAME 資料類型是由 IF_COUNTED_STRING 結構所定義。 這個結構所定義的字串不必以 Null 結尾。 不過,字串的長度必須在這個 結構的 Length 成員中設定。 如果字串為 NULL 終止,則 長度 成員不得包含終止的 NULL 字元。
如果功能類別與儲存的運行時間數據相關聯,擴充功能會使用可唯一識別類別的 GUID 來設定 FeatureClassId。
注意 如果功能類別與儲存的運行時間數據沒有關聯,擴充功能會將featureClassId 設定為零。
延伸模組會將運行時間數據複製到 SaveData 成員,並將 SaveDataSize 成員設定為運行時間數據的大小,以位元組為單位。
注意 延伸模組不得變更 標頭 或 PortIdNDIS_SWITCH_NIC_SAVE_STATE 結構的成員。
OID_SWITCH_NIC_SAVE 的 OID 方法要求最終會由可延伸交換器的基礎迷你埠邊緣處理。 一旦這個 OID 方法要求透過可延伸交換器驅動程式堆疊轉送至迷你埠驅動程序之後,迷你埠驅動程式就會使用 NDIS_STATUS_SUCCESS完成 OID 要求。 這會通知可延伸交換器的協定邊界,指出已查詢可延伸交換器驅動程式堆疊中的所有延伸模組,以取得埠運行時數據。 可擴充交換器的協定邊緣接著發出 OID 設定要求,OID_SWITCH_NIC_SAVE_COMPLETE 以完成儲存作業。
處理OID_SWITCH_NIC_SAVE_COMPLETE請求
當 Hyper-V 子分割區具有連接至可延伸交換器埠的網路適配器時,若該子分割區被暫停或其狀態正在儲存,系統會通知 Hyper-V 可延伸交換器介面。 這會導致可延伸開關的通訊協定邊緣向可延伸開關驅動程式堆疊發出 OID_SWITCH_NIC_SAVE 的物件識別碼 (OID) 方法請求。
當每個 Hyper-V 可擴展交換器擴充元件已儲存其運行時數據後,可擴展交換器的通訊協定邊緣會通知底層擴充元件儲存操作已完成。 通訊協定邊緣會藉由在擴充交換器驅動程式堆疊下發出OID_SWITCH_NIC_SAVE_COMPLETE的 OID 集合要求來執行這項作業。
注意 當可延伸交換器網路適配器連線啟動運行時間儲存作業時,在發出 OID_SWITCH_NIC_SAVE_COMPLETE 要求之前,將不會執行相同網路適配器連線的另一個儲存作業。 不過,在此期間可能會進行其他網路介面卡連線的儲存作業。
InformationBuffer 成員在 NDIS_OID_REQUEST 結構中,對於 OID_SWITCH_NIC_SAVE_COMPLETE 要求,包含一個指向 NDIS_SWITCH_NIC_SAVE_STATE 結構的指標。 此結構是由可延伸交換器的通訊協定邊緣所配置。
當它收到 OID_SWITCH_NIC_SAVE_COMPLETE的 OID 集合要求時,擴充功能必須遵循下列指導方針:
延伸模組不得修改與 OID 要求相關聯的 NDIS_SWITCH_NIC_SAVE_STATE 結構。
延伸模組必須呼叫 NdisFOidRequest,以透過可延伸交換器擴充堆疊轉送此 OID 要求。 擴充功能不得導致 OID 請求失敗。
注意 延伸模組應該監視此 OID 要求的完成狀態。 延伸模組會執行此動作來偵測儲存作業是否已順利完成。
OID_SWITCH_NIC_SAVE_COMPLETE 的 OID 方法要求最終會由可延伸交換器的基礎迷你埠邊緣處理。 一旦迷你埠邊緣收到這個 OID 方法要求之後,它會使用 NDIS_STATUS_SUCCESS 完成 OID 要求。 這會通知可延伸交換器通訊協定邊緣,可延伸交換器驅動程式堆疊中的所有延伸模組都已完成儲存作業。
還原 Hyper-V 可延伸交換器運行時期資料
當具有網路卡連接至可延伸交換器埠的 Hyper-V 子分割區從暫停恢復時,將通知 Hyper-V 可延伸交換器介面。 這會導致可延伸交換器的通訊協定邊緣向可延伸交換器驅動程式堆疊發出物件識別碼(OID)為 OID_SWITCH_NIC_RESTORE 的設置要求。 當擴充功能收到此 OID 要求時,它可以針對子分割區所使用的可延伸交換器埠還原其運行時間數據。
InformationBuffer 成員在 NDIS_OID_REQUEST 結構中,針對 OID_SWITCH_NIC_RESTORE 要求,包含指向 NDIS_SWITCH_NIC_SAVE_STATE 結構的指標。 此結構是由可延伸交換器的通訊協定邊緣所配置。
當它收到 OID_SWITCH_NIC_RESTORE的 OID 集合要求時,可延伸交換器擴充功能必須先判斷它是否擁有運行時間數據。 擴充功能藉由比較 NDIS_SWITCH_NIC_SAVE_STATE 結構中 ExtensionId 成員的值和擴充功能用來識別其本身的 GUID 值,以達成此任務。
如果延伸模組擁有可延伸交換器 NIC 的執行時間數據,它會以下列方式還原此資料:
延伸模組會將 SaveData 成員中的運行時期資料複製到驅動程式配置的儲存空間。
NotePortId 成員 NDIS_SWITCH_NIC_SAVE_STATE 結構的值可能與儲存執行期資料時 PortId 值不同。 如果在從一部主機即時移轉至另一個主機期間儲存運行時間數據,就可能發生此情況。 不過,即時移轉期間會保留可延伸交換器 NIC 的設定。 這可讓擴充功能使用新的 PortId 值,將執行時資料還原至可擴充交換器 NIC。
延伸模組會使用 NDIS_STATUS_SUCCESS完成 OID 集合要求。
如果擴充功能沒有要儲存的指定執行時間資料,擴充功能會呼叫 NdisFOidRequest。 這會將 OID 集合要求轉送至可延伸交換器驅動程式堆疊中的基礎驅動程式。 在此情況下,延伸模組不得修改與 OID 要求相關聯的 NDIS_SWITCH_NIC_SAVE_STATE 結構。 如需如何轉送 OID 要求的詳細資訊,請參閱 NDIS 篩選驅動程式中的 OID 要求。
如果 OID_SWITCH_NIC_RESTORE 的 OID 集合要求以 NDIS_STATUS_SUCCESS 成功完成,則可延伸交換器的通訊協定邊緣會再次發出 OID 集合要求。 當它收到這個新的 OID 集合要求時,擴充功能可以執行下列其中一項:
如果它擁有新 OID 要求中的運行時間數據,擴充功能會還原 NDIS_SWITCH_NIC_SAVE_STATE 結構中的其他運行時間數據。 接著,擴充元件會以 NDIS_STATUS_SUCCESS 完成 OID 要求。
如果它沒有在新 OID 要求中擁有運行時間數據,擴充功能會呼叫 NdisFOidRequest,將這個 OID 集合要求轉送至基礎驅動程式。
OID_SWITCH_NIC_RESTORE_COMPLETE
可延伸交換器介面會在完成可延伸交換器網路適配器的運行時數據還原作業後,向通訊協議邊界發出這個 OID。
此 OID 要求會通知延伸模組,還原作業只針對指定的可延伸交換器 NIC 完成。
如需此 OID 要求的詳細資訊,請參閱 OID_SWITCH_NIC_RESTORE_COMPLETE。
注意 如果可延伸交換器的小埠邊緣接收到 OID_SWITCH_NIC_RESTORE 設置請求,則會使用 NDIS_STATUS_SUCCESS 完成 OID 請求。 這通知可延伸交換器的協定邊緣,表示沒有任何延伸模組擁有執行時期的數據。 如果發生這種情況,可延伸交換器介面會記錄一個事件,該事件記載了原本儲存運行時埠數據的擴充功能的 ExtensionId 和 PortId 成員值。