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

本主题讨论可扩展交换机转发扩展用于从基础物理适配器转发 NDIS 状态指示的方法。 一个或多个基础物理适配器可以绑定到 Hyper-V 可扩展交换机的外部网络适配器。

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

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

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

此图显示了来自 NDIS 6.40 及更高版本的物理网络适配器的 NDIS 状态指示的 Hyper-V 可扩展交换机控制路径。

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

显示来自 NDIS 6.30 的物理网络适配器的 NDIS 状态指示的 Hyper-V 可扩展交换机控制路径的示意图。

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

可扩展交换机接口转发基础物理适配器生成的 NDIS 状态指示。 如果外部网络适配器绑定到可扩展的交换机团队,则 NDIS 状态指示由 MUX 驱动程序的虚拟适配器边缘发起。 否则,状态指示由绑定到外部网络适配器的单个物理网络适配器发起。

当 NDIS 状态指示到达可扩展开关接口时,它会将指示封装在 NDIS_SWITCH_NIC_STATUS_INDICATION 结构中。 然后,可扩展交换机的微型端口边缘发出包含此结构的 NDIS_STATUS_SWITCH_NIC_STATUS 指示。

转发扩展收到 NDIS 状态指示后,可以在转发指示之前转发原始指示数据或修改数据。

注意 只有转发扩展插件才能在转发状态指示之前修改数据。 有关此类扩展的详细信息,请参阅 转发扩展

转发扩展可以修改和转发绑定到可扩展交换机的外部网络适配器的任何基础物理适配器的状态指示。 通常,扩展会发出这些状态指示,以更改基础物理适配器的播发硬件卸载功能。 例如,扩展可以修改和转发以下类型的硬件卸载的状态指示:

  • Internet 协议安全性 (IPsec)

  • 虚拟机队列 (VMQ)

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

如果转发扩展正在转发 NDIS 状态指示,则必须按以下方式设置 NDIS_SWITCH_NIC_STATUS_INDICATION 结构的成员:

  • 必须将 SourcePortId 成员设置为外部网络适配器连接到的端口的标识符。 外部网络适配器绑定到一个或多个物理适配器。 有关详细信息,请参阅 外部网络适配器

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

  • DestinationPortId 成员必须设置为 NDIS_SWITCH_DEFAULT_PORT_ID

  • DestinationNicIndex 成员必须设置为 NDIS_SWITCH_DEFAULT_NIC_INDEX

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

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

  1. 该扩展调用 ReferenceSwitchNic 来递增外部网络适配器的引用计数器。 这可以保证可扩展交换机接口在引用计数器不为零时不会删除网络适配器连接。

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

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

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

    注意如果扩展转发封装的 NDIS 状态指示,则必须在调用其 FilterStatus 函数的上下文中调用 NdisFIndicateStatus

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

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