将 OID 请求转发到物理网络适配器

本主题讨论 Hyper-V 可扩展交换机扩展如何通过 Hyper-V 可扩展交换机控制路径转发对象标识符 (OID) 基础物理适配器的请求。 该扩展还可以按照本主题中所述的方法向基础物理网络适配器发出 OID 请求。

例如,外部网络适配器可以绑定到 NDIS 多路复用器 (MUX 的虚拟微型端口边缘) 中间驱动程序。 MUX 驱动程序绑定到主机上的一个或多个物理网络团队。 此配置称为 可扩展交换机团队

在此配置中,可扩展交换机扩展将公开给团队中的每个网络适配器。 这样,扩展就可以管理团队中单个网络适配器的配置和使用。 例如,转发扩展可以通过将传出数据包转发到单个适配器, (LBFO) 解决方案来支持团队上的负载均衡故障转移。 管理可扩展交换机团队的转发扩展称为 组合提供程序。 有关组合提供程序的详细信息,请参阅 Teaming Provider Extensions

下图显示了适用于 NDIS 6.40 (Windows Server 2012 R2) 及更高版本的可扩展交换机团队的示例。

ndis 6.40 的 oid 控制路径示意图。

下图显示了适用于 NDIS 6.30 (Windows Server 2012) 的可扩展交换机团队的示例。

ndis 6.30 可扩展交换机团队示意图。

注意 在 Hyper-V 可扩展交换机接口中,NDIS 筛选器驱动程序称为 可扩展交换机扩展 ,驱动程序堆栈称为 可扩展交换机驱动程序堆栈

必须封装 OID 请求才能将请求转发到基础物理网络适配器。 OID 请求首先封装在 NDIS_SWITCH_NIC_OID_REQUEST 结构中。 然后,OID_SWITCH_NIC_REQUEST的 OID 集请求通过可扩展交换机控制路径转发 OID 请求。

对基础物理适配器的 OID 请求由以下项发出:

可扩展交换机接口。
OID 请求(例如硬件卸载请求)通过以下其中一项运行的过度协议或筛选器驱动程序发出:

  • 在 Hyper-V 父分区中运行的管理操作系统。

  • 在 Hyper-V 子分区中运行的来宾操作系统。

当可扩展交换机接收这些 OID 请求时,它们将被封装并通过可扩展交换机控制路径转发。 当转发扩展收到封装的 OID 请求时,它可以将请求转发到基础物理适配器。 此功能对于为硬件卸载配置可扩展交换机团队特别有用。

例如,MUX 驱动程序播发整个可扩展交换机团队的常见功能。 但是,转发扩展可以发出 OID 请求来查询或设置团队中适配器的单独功能。 然后,转发扩展可以从外部网络适配器发出 NDIS 状态指示,以通知过度的驱动程序适用于整个团队的功能。 有关此过程的详细信息,请参阅 从物理网络适配器发起 NDIS 状态指示

当转发扩展通过控制路径转发 OID 请求时,外部网络适配器会收到该请求。 此时,OID 请求将被解封并转发到指定的物理网络适配器。

注意从Windows Server 2012开始,仅以这种方式封装和转发硬件卸载 OID 请求。 例如,卸载虚拟机队列 (VMQ) 或 Internet 协议安全 (IPsec) 的 OID 请求通过可扩展交换机控制路径进行封装和转发。 有关详细信息,请参阅 管理硬件将 OID 请求卸载到物理网络适配器

转发扩展。
转发扩展可以源自其自己的封装 OID 请求,并将其转发到基础物理网络适配器。 转发扩展可以封装标准 NDIS OID 请求。 转发扩展还可以封装由独立硬件供应商为物理网络适配器定义的专用 OID 请求 (IHV) 。 这允许 IHV 开发的转发扩展在团队中的单个物理适配器上启用或禁用专有属性。

此外,转发扩展可以源自封装的硬件卸载 OID 请求,以为指定的 Hyper-V 子分区分配资源。 例如,转发扩展可以源自 OID_RECEIVE_FILTER_ALLOCATE_QUEUE 的封装 OID 请求,为指定的子分区分配 VMQ。 在这种情况下,扩展会将请求封装为源自与分区关联的可扩展交换机端口和网络适配器连接。

注意 仅当转发扩展筛选由过度分配驱动程序发出的相同 OID 请求时,转发扩展才能产生其自己的封装硬件卸载 OID 请求。 在这种情况下,扩展不得转发原始 OID 请求。 相反,当 NDIS 调用其 FilterOidRequestComplete 以完成原始 OID 请求时,扩展必须调用 NdisFOidRequestComplete 来完成此请求。

筛选或捕获扩展
筛选或捕获扩展可以源自其自己的封装 OID 查询请求,并将其转发到基础物理网络适配器。 这些扩展可以封装由独立硬件供应商为物理网络适配器定义的标准 NDIS OID 查询请求或专用 OID 查询请求 (IHV) 。

注意 只有将扩展转发到基础物理适配器的封装 OID 集请求。

转发扩展在转发、重定向或引发基础物理适配器的封装 OID 请求时,必须遵循以下步骤:

  1. 如果转发扩展发出 OID 请求,则必须使用与请求相关的信息初始化扩展分配 的NDIS_OID_REQUEST 结构。

    如果扩展转发 OID 请求,则不得更改 FilterOidRequest 函数的 OidRequest 参数引用的现有NDIS_OID_REQUEST结构。 相反,扩展必须调用 NdisAllocateCloneOidRequest 为新的 NDIS_OID_REQUEST 结构分配内存,并从现有 NDIS_OID_REQUEST 结构复制所有信息。

  2. 扩展将扩展分配 NDIS_SWITCH_NIC_OID_REQUEST 结构的成员设置为以下值:

    • DestinationPortId 成员必须设置为外部网络适配器连接到的可扩展交换机端口的标识符。

    • DestinationNicIndex 成员必须设置为基础物理网络适配器的非零索引值。

      有关这些索引值的详细信息,请参阅 网络适配器索引值

    • 如果转发扩展发起 Hyper-V 子分区的硬件卸载 OID 请求,则必须将 SourcePortId 成员设置为分区使用的端口的标识符。 此外, 必须将 SourceNicIndex 成员设置为到该端口的网络连接的网络适配器索引。

      如果转发扩展出于自己的目的发出标准或专用 OID 请求,则必须将 SourcePortIdSourceNicIndex 成员设置为零。

      如果转发扩展正在转发或重定向硬件卸载 OID 请求,则必须保留由可扩展交换机接口设置的 SourcePortIdSourceNicIndex 成员的值。

    • 必须将 OidRequest 成员设置为指向封装的 OID 请求的初始化NDIS_OID_REQUEST结构的指针。 转发扩展分配并初始化此结构,或使用结构的克隆副本。

  3. 扩展将扩展分配 NDIS_OID_REQUEST 结构的成员设置为以下值:

    • 必须将 Oid 成员设置为 OID_SWITCH_NIC_REQUEST

    • InformationBuffer 成员必须包含指向包含生成或筛选的 OID 请求数据的缓冲区的指针。

    • InformationBufferLength 成员必须包含包含生成或筛选的 OID 请求数据的缓冲区的长度(以字节为单位)。

    扩展将其他成员设置为对 NDIS_OID_REQUEST 结构有效的值。

  4. 该扩展调用 ReferenceSwitchNic 来递增目标物理网络适配器索引的引用计数器。 这可以保证可扩展交换机接口不会删除物理网络适配器连接,而其引用计数器为非零。

    当扩展调用 ReferenceSwitchNic 时,它将 SwitchPortId 参数设置为为 DestinationPortId 成员指定的值。 该扩展还会将 SwitchNicIndex 参数设置为为 DestinationNicIndex 成员指定的值。

    注意 如果 ReferenceSwitchNic 不返回NDIS_STATUS_SUCCESS,则无法将 OID 请求转发到目标物理网络适配器。

  5. 如果转发扩展发起 Hyper-V 子分区的硬件卸载 OID 请求,则它还调用 ReferenceSwitchNic 来递增与该分区关联的源网络适配器连接的索引的引用计数器。 这可以保证可扩展交换机接口不会删除物理网络适配器连接,而其引用计数器为非零。

    当扩展调用 ReferenceSwitchNic 时,它会将 SwitchPortId 参数设置为为 SourcePortId 成员指定的值。 该扩展还会将 SwitchNicIndex 参数设置为为 SourceNicIndex 成员指定的值。

    注意 如果 ReferenceSwitchNic 不返回NDIS_STATUS_SUCCESS,则无法将 OID 请求转发到目标物理网络适配器。

  6. 扩展调用 NdisFOidRequest 将封装的 OID 请求转发到指定的目标可扩展交换机端口和网络适配器。

    注意 如果扩展转发筛选的 OID 请求,则必须在调用其 FilterOidRequest 函数的上下文中调用 NdisFOidRequest 。 如果扩展正在转发已生成的 OID 请求,则在处于“正在运行”、“正在重启”、“已暂停”和“正在暂停”状态时调用 NdisFIndicateStatus。 有关这些状态的详细信息,请参阅 筛选模块状态和操作

  7. 当 NDIS 调用 FilterOidRequestComplete 函数时,扩展将调用 DereferenceSwitchNic 以清除目标物理网络适配器索引的引用计数器。

    如果转发扩展针对 Hyper-V 子分区发出硬件卸载 OID 请求,则它还调用 DereferenceSwitchNic 以清除适配器的源网络适配器连接索引的引用计数器。

    在这两种情况下,扩展将 SwitchPortIdSwitchNicIndex 参数设置为它在 调用 ReferenceSwitchNic 时使用的相同值。

有关扩展如何发出 OID 请求的详细信息,请参阅 从 NDIS 筛选器驱动程序生成 OID 请求

有关 MUX 驱动程序的详细信息,请参阅 NDIS MUX 中间驱动程序