管理 Hyper-V 可扩展交换机运行时数据

本主题介绍 Hyper-V 可扩展交换机扩展的保存和还原操作。 这些操作允许扩展保存和还原单个可扩展交换机网络适配器 (NIC) 的运行时数据。 当已停止或启动与可扩展交换机端口建立网络适配器连接的 Hyper-V 子分区时,将执行这些操作。

保存 Hyper-V 可扩展交换机运行时数据

本部分介绍 Hyper-V 可扩展交换机扩展可以保存单个网络适配器 (NIC) 的运行时数据的操作。 当网络适配器连接到可扩展交换机端口的 Hyper-V 子分区正在停止或保存其状态时,将执行此操作

处理 OID_SWITCH_NIC_SAVE 请求

当具有与可扩展交换机端口的网络适配器连接的 Hyper-V 子分区停止或保存其状态时,会通知 Hyper-V 可扩展交换机接口。 这会导致可扩展交换机的协议边缘沿着可扩展交换机驱动程序堆栈发出对象标识符 OID_SWITCH_NIC_SAVE 的 (OID) 方法请求。 当可扩展交换机扩展收到此 OID 请求时,它可以为附加到子分区的指定网络适配器连接保存其运行时数据。

OID_SWITCH_NIC_SAVE 请求 NDIS_OID_REQUEST 结构的 InformationBuffer 成员包含指向 NDIS_SWITCH_NIC_SAVE_STATE 结构的指针。 此结构由可扩展交换机的协议边缘分配,并通过以下方式进行初始化:

  • 标头成员初始化为包含当前类型、NDIS_SWITCH_NIC_SAVE_STATE 结构的修订。 大小设置为完整缓冲区大小。

  • PortId 成员包含要为其执行保存操作的可扩展交换机端口的唯一标识符。

当它收到 OID_SWITCH_NIC_SAVE 方法请求时,该扩展将执行以下操作:

  1. 该扩展读取 NDIS_SWITCH_NIC_SAVE_STATE 结构的 PortId 成员。

  2. 如果扩展具有为指定 NIC 保存的运行时数据,则它将从结构开头的 SaveDataOffset 字节开始,将其数据保存在 NDIS_SWITCH_NIC_SAVE_STATE 结构中。 然后,该扩展使用 NDIS_STATUS_SUCCESS 完成 OID 方法请求。

  3. 如果 NDIS_SWITCH_NIC_SAVE_STATE 结构没有提供足够的缓冲区来保存运行时状态,则扩展将方法结构的 BytesNeeded 字段设置为NDIS_SIZEOF_NDIS_SWITCH_NIC_SAVE_STATE_REVISION_1加上保存数据所需的缓冲区量,并使用NDIS_STATUS_BUFFER_TOO_SHORT 完成 OID。 OID 将以所需大小重新发布。

  4. 如果扩展没有为指定的 NIC 保存的运行时数据,则必须调用 NdisFOidRequest。 这会将 OID 方法请求转发到可扩展交换机驱动程序堆栈中的基础驱动程序。 有关此过程的详细信息,请参阅 NDIS 筛选器驱动程序中的筛选 OID 请求

如果扩展具有要保存的运行时端口数据,则它必须在 NDIS_SWITCH_NIC_SAVE_STATE 结构中保存运行时端口数据时遵循以下准则:

  1. 该扩展将 ExtensionId 成员设置为唯一标识驱动程序的 GUID 值。

  2. 该扩展将 ExtensionFriendlyName 成员设置为驱动程序的名称。

    请注意NDIS_SWITCH_EXTENSION_FRIENDLYNAME 数据类型是由 IF_COUNTED_STRING 结构定义的类型。 此结构定义的字符串不必以 null 结尾。 但是,字符串的长度必须在此结构的 Length 成员中设置。 如果字符串以 NULL 结尾,则 Length 成员不得包含终止 NULL 字符。

  3. 如果特征类与保存的运行时数据相关联,则扩展会将 FeatureClassId 设置为唯一标识该类的 GUID。

    请注意如果特征类未与保存的运行时数据关联,则扩展会将 FeatureClassId 设置为零。

  4. 该扩展将运行时数据复制到 SaveData 成员,并将 SaveDataSize 成员设置为运行时数据的大小(以字节为单位)。

请注意该扩展不得更改 NDIS_SWITCH_NIC_SAVE_STATE 结构的 HeaderPortId 成员。

OID_SWITCH_NIC_SAVE 的 OID 方法请求最终由可扩展交换机的基础微型端口边缘处理。 一旦该 OID 方法请求通过可扩展交换机驱动程序栈转发给迷你端口驱动程序,迷你端口驱动程序就会通过 NDIS_STATUS_SUCCESS 完成 OID 请求。 这通知可扩展交换机的协议边缘,扩展交换机驱动程序堆栈中的所有扩展都已查询运行时端口数据。 然后,可扩展交换机的协议边缘发出 OID_SWITCH_NIC_SAVE_COMPLETE 的 OID 设置请求来完成保存操作。

处理 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 请求之前,不会对同一网络适配器连接执行另一个保存操作。 但是,在此期间可能会为其他网络适配器连接保存操作。

OID_SWITCH_NIC_SAVE_COMPLETE 请求 NDIS_OID_REQUEST 结构的 InformationBuffer 成员包含指向 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_SWITCH_NIC_RESTORE 的 (OID) 设置请求。 当扩展收到此 OID 请求时,它可以还原子分区使用的可扩展交换机端口的运行时数据。

OID_SWITCH_NIC_RESTORE 请求 NDIS_OID_REQUEST 结构的 InformationBuffer 成员包含指向 NDIS_SWITCH_NIC_SAVE_STATE 结构的指针。 此结构由可扩展交换机的协议边缘分配。

当它收到 OID_SWITCH_NIC_RESTORE 的 OID 设置请求时,可扩展交换机扩展必须首先确定它是否拥有运行时数据。 该扩展通过将 NDIS_SWITCH_NIC_SAVE_STATE 结构的 ExtensionId 成员的值与扩展用于标识自身的 GUID 值进行比较来执行此操作。

如果扩展拥有可扩展交换机 NIC 的运行时数据,它将通过以下方式还原此数据:

  1. 该扩展将 SaveData 成员中的运行时数据复制到驱动程序分配的存储。

    请注意NDIS_SWITCH_NIC_SAVE_STATE 结构的 PortId 成员的值可能与保存运行时数据时的 PortId 值不同。 如果在从一个主机到另一个主机的实时迁移期间保存了运行时数据,则可能会出现这种情况。 但是,在实时迁移期间保留可扩展交换机 NIC 的配置。 这使扩展能够使用新的 PortId 值将运行时数据还原到可扩展交换机 NIC。

  2. 该扩展使用 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 请求。 这会通知可扩展交换机的协议边缘,没有任何扩展拥有运行时数据。 如果发生这种情况,可扩展交换机接口会记录一个事件,该事件记录最初保存运行时端口数据的扩展的 ExtensionIdPortId 成员值。