从物理网络适配器发起 NDIS 状态指示

本主题讨论可扩展交换机转发扩展使用的方法,该方法源自连接到交换机的网络适配器的 NDIS 状态指示。 该扩展可针对以下类型的适配器发出 NDIS 状态指示:

  • 绑定到可扩展交换机 的外部网络适配器 的一个或多个基础物理适配器。

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

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

  • 虚拟机 (VM) 在 Hyper-V 子分区中公开并连接到可扩展交换机端口的网络适配器。

下图显示了 NDIS 6.40 (Windows Server 2012 R2) 及更高版本的物理和 VM 网络适配器中 NDIS 状态指示的 Hyper-V 可扩展交换机控制路径。

显示 NDIS 6.40 及更高版本的物理和 VM 网络适配器中 NDIS 状态指示的 Hyper-V 可扩展交换机控制路径的关系图。

下图显示了 NDIS 6.30 (Windows Server 2012) 的物理和 VM 网络适配器中 NDIS 状态指示的 Hyper-V 可扩展交换机控制路径。

显示 NDIS 6.30 物理适配器和 VM 网络适配器中 NDIS 状态指示的 Hyper-V 可扩展交换机控制路径的关系图。

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

转发扩展可以源自封装的硬件卸载状态指示,指示在可扩展交换机驱动程序堆栈中过度分配驱动程序。 这也允许扩展更改绑定到可扩展交换机的外部网络适配器的基础物理适配器组的当前卸载功能。 当适配器组绑定到外部网络适配器时,只有团队的常见功能播发到 NDIS 或过度使用协议和筛选器驱动程序。 该扩展可以通过发起封装状态指示来扩展播发的功能,从而播发团队中某些适配器支持的功能。 例如,扩展可以发出封装 NDIS_STATUS_RECEIVE_FILTER_CURRENT_CAPABILITIES 指示,以更改当前为整个团队启用的接收筛选器功能。

注意 只有转发扩展才能产生封装的状态指示。 有关此类扩展的详细信息,请参阅 转发扩展

通常,转发扩展源自封装的 NDIS 状态指示,以更改基础物理适配器的播发硬件卸载功能。 例如,扩展可以源自以下类型的硬件卸载的状态指示:

  • Internet 协议安全性 (IPsec) 。

  • 虚拟机队列 (VMQ) 。

  • 单根 I/O 虚拟化 (SR-IOV)。

转发扩展还可以源自封装的 NDIS 状态指示,以更改为 Hyper-V 子分区分配的硬件卸载资源。 从 NDIS 6.30 开始,该扩展可以发出封装 NDIS_STATUS_SWITCH_PORT_REMOVE_VF 指示,以删除 VM 网络适配器与 PCI Express (PCIe) 虚拟函数 (VF) 之间的绑定。 VF 由支持 单根 I/O 虚拟化 (SR-IOV) 接口的基础物理网络适配器公开和支持。

如果转发扩展源自基础物理适配器的硬件卸载资源的封装 NDIS 状态指示,则必须按以下方式设置 NDIS_SWITCH_NIC_STATUS_INDICATION 结构的成员:

  • DestinationPortId 成员必须设置为 NDIS_SWITCH_DEFAULT_PORT_ID

  • DestinationNicIndex 成员必须设置为 NDIS_SWITCH_DEFAULT_NIC_INDEX

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

  • SourceNicIndex 成员必须设置为 NDIS_SWITCH_DEFAULT_NIC_INDEX。 这允许将状态指示解释为源自绑定到外部网络适配器的整个可扩展交换机团队。

    注意 如果只有一个物理网络适配器绑定到外部网络适配器,则转发扩展还必须将此成员设置为 NDIS_SWITCH_DEFAULT_NIC_INDEX

  • StatusIndication 成员必须设置为指向NDIS_STATUS_INDICATION结构的指针。 此结构包含封装的 NDIS 状态指示的数据。

如果转发扩展针对 Hyper-V 子分区的硬件卸载资源发出 NDIS 状态指示,则必须按以下方式设置 NDIS_SWITCH_NIC_STATUS_INDICATION 结构的成员:

  • 必须将 DestinationPortIdDestinationNicIndex 成员设置为分区使用的网络连接的端口和网络适配器索引的相应值。

  • SourcePortId 成员必须设置为 NDIS_SWITCH_DEFAULT_PORT_ID

  • SourceNicIndex 成员必须设置为 NDIS_SWITCH_DEFAULT_NIC_INDEX

  • StatusIndication 成员必须设置为指向NDIS_STATUS_INDICATION结构的指针。 此结构包含封装的 NDIS 状态指示的数据。

当扩展发出封装的 NDIS 状态指示时,它必须执行以下步骤:

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

    当扩展调用 ReferenceSwitchNic 时,它会通过以下方式设置参数:

    • 如果转发扩展源自基础物理适配器的封装 NDIS 状态指示,则会将 SwitchPortId 参数设置为为 SourcePortId 成员指定的值。 该扩展还会将 SwitchNicIndex 参数设置为为 SourceNicIndex 成员指定的值。

    • 如果转发扩展源自 Hyper-V 子分区的 NDIS 状态指示,则会将 SwitchPortId 参数设置为为 DestinationPortId 成员指定的值。 该扩展还会将 SwitchNicIndex 参数设置为为 DestinationNicIndex 成员指定的值。

    注意 如果 ReferenceSwitchNic 未返回NDIS_STATUS_SUCCESS,则无法发出封装的 NDIS 状态指示。

  2. 扩展调用 NdisFIndicateStatus 来转发封装的状态通知。

    注意如果扩展转发筛选的 OID 请求,则必须在调用其 FilterStatus 函数的上下文中调用 NdisFIndicateStatus

  3. NdisFIndicateStatus 返回后,扩展调用 DereferenceSwitchNic 以清除源或目标网络适配器连接的引用计数器。 扩展将 SwitchPortIdSwitchNicIndex 参数设置为它在调用 ReferenceSwitchNic 时使用的相同值。