将数据包转发到物理网络适配器

注意 本页假定你熟悉以下页面中的信息和关系图:

本页介绍 Hyper-V 可扩展交换机转发扩展如何将数据包的发送请求转发到基础物理适配器。 一个或多个物理网络适配器可以绑定到可扩展交换机外部网络适配器。

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

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

如果在可扩展交换机驱动程序堆栈中安装并启用了转发扩展,则它负责为在可扩展交换机入口数据路径上获取的每个数据包做出转发决策,除非该数据包是 NVGRE 数据包。 (有关 NVGRE 数据包的详细信息,请参阅 混合转发。) 基于这些转发决策,扩展可以将目标端口添加到带外 (OOB) 数据包 NET_BUFFER_LIST 结构的数据。 数据包完成对可扩展交换机数据路径的遍历后,可扩展交换机接口会将数据包传送到指定的目标端口。

注意 如果未安装或启用转发扩展,可扩展交换机本身会为其从入口数据路径获取的数据包做出转发决策。 交换机先将目标端口添加到数据包 NET_BUFFER_LIST 结构的 OOB 数据中,然后再将数据包转发到可扩展交换机出口数据路径。

当调用转发扩展的 FilterSendNetBufferLists 函数时, NetBufferList 参数包含指向 NET_BUFFER_LIST 结构的链接列表的指针。 其中每个结构都指定从入口数据路径获取的数据包。 在每个数据包 NET_BUFFER_LIST 结构的 OOB 数据中,目标端口的数据包含在 NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY 结构中。 扩展通过调用 GetNetBufferListDestinations 获取NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY结构及其元素。

注意 为了提高性能,转发扩展可以调用 GrowNetBufferListDestinations 函数而不是 GetNetBufferListDestinations 来获取指向 NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY 结构的指针。 如果扩展确定目标端口的数据包的 OOB 数据中需要其他数组元素,则会执行此操作。 有关详细信息,请参阅 将可扩展交换机目标端口数据添加到数据包

NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY数组中的每个元素都定义一个目标端口,并格式化为NDIS_SWITCH_PORT_DESTINATION结构。 此结构包含以下成员:

  • PortId 成员包含一个值,该值指定可扩展交换机上的目标端口。

  • NicIndex 成员指定连接到 PortId 成员指定的可扩展交换机端口的网络适配器的索引。

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

如果转发扩展添加连接到外部网络适配器的目标端口,则扩展可以指定基础物理网络适配器的索引。 例如,扩展可以作为组合提供程序运行,以便通过可扩展交换机团队获得 LBFO 支持。 这使扩展可以通过将发送请求转发到团队的不同适配器来平衡流量开销。

转发扩展在添加或修改 NDIS_SWITCH_PORT_DESTINATION 结构以将发送请求转发到基础物理网络适配器时,必须遵循以下准则:

  • 如果 PortId 成员指定外部网络适配器连接到的可扩展交换机端口,则扩展必须将 NicIndex 成员设置为以下索引值之一:

    • 如果只有一个物理网络适配器绑定到外部网络适配器,则扩展必须将 NicIndex 成员设置为 NDIS_SWITCH_DEFAULT_NIC_INDEX 或一个。

    • 如果多个物理网络适配器绑定到外部网络适配器,则扩展必须将 NicIndex 成员设置为可扩展交换机团队中目标网络适配器的非零索引值。

    注意 如果 PortId 成员未指定外部网络适配器连接到的可扩展交换机端口,则扩展必须将 NicIndex 成员设置为 NDIS_SWITCH_DEFAULT_NIC_INDEX

  • 扩展添加数据包的所有目标端口后,必须调用 NdisFSendNetBufferLists 来转发入口数据路径上的数据包。

有关如何将目标端口添加到数据包的详细信息,请参阅 将数据包转发到 Hyper-V 可扩展交换机端口

有关出口数据路径的详细信息,请参阅 Hyper-V 可扩展交换机数据路径