将数据包转发到 Hyper-V 可扩展交换机端口

本页介绍 Hyper-V 可扩展交换机转发扩展如何将数据包转发到一个或多个端口。 这种类型的扩展还可以将数据包转发到连接到可扩展交换机外部网络适配器的单个网络适配器。

注意 只有可扩展交换机转发扩展或可扩展交换机本身才能将数据包转发到可扩展交换机端口。

注意 本页假定你熟悉 Hyper-V 可扩展交换机混合转发概述中的信息和关系图。

注意 在可扩展交换机接口中,NDIS 筛选器驱动程序称为 可扩展交换机扩展 ,驱动程序堆栈称为 可扩展交换机驱动程序堆栈。 有关扩展的详细信息,请参阅 Hyper-V 可扩展交换机扩展

如果在可扩展交换机驱动程序堆栈中安装并启用了转发扩展,则它负责为在可扩展交换机入口数据路径上获取的每个数据包做出转发决策。 根据这些转发决策,扩展会将目标端口添加到带外 (OOB) 数据包 NET_BUFFER_LIST 结构数据的目标端口数组中。 数据包完成对可扩展交换机数据路径的遍历后,可扩展交换机接口会将数据包传送到指定的目标端口。

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

注意 如果数据包是 NVGRE 数据包,则转发扩展可以将目标端口添加到目标端口数组。 但是,可扩展交换机的 Hyper-V 网络虚拟化 (HNV) 组件负责确定目标端口和转发数据包。 有关详细信息,请参阅 混合转发

转发扩展只能将端口目标添加到从入口数据路径获取的数据包。 将数据包转发到出口数据路径后,筛选和转发扩展插件可以排除数据包传递到可扩展交换机端口。 有关详细信息,请参阅 排除到可扩展交换机目标端口的数据包传送

在数据包 NET_BUFFER_LIST 结构的 OOB 数据中,目标端口的数据包含在 NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY 结构中。 数组中的每个元素定义一个目标端口,并格式化为 NDIS_SWITCH_PORT_DESTINATION 结构。

转发扩展可以调用以下 Hyper-V 可扩展交换机处理程序函数来管理 NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY 结构及其 NDIS_SWITCH_PORT_DESTINATION 元素:

AddNetBufferListDestination
此函数将单个目标端口添加到数据包的 OOB 数据中的 NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY 结构。

GetNetBufferListDestinations
此函数返回指向数据包的 OOB 数据中 NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY 结构的指针。

GrowNetBufferListDestinations
此函数将更多目标端口元素添加到数据包的 OOB 数据的 NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY 结构。

UpdateNetBufferListDestinations
此函数提交扩展为添加或排除数据包的一个或多个目标端口所做的修改。 这些更改将提交到数据包的 OOB 数据中的 NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY 结构。

当调用转发扩展的 FilterSendNetBufferLists 函数时, NetBufferList 参数包含指向 NET_BUFFER_LIST 结构的链接列表的指针。 其中每个结构都指定从入口数据路径获取的数据包。

对于此列表中的每个 NET_BUFFER_LIST 结构,转发扩展会按照以下步骤添加数据包的目标端口:

  1. 扩展根据各种类型的条件为数据包做出转发决策。 这些条件包括:

    • 基于数据包的源端口和网络适配器连接的策略条件。 转发扩展使用 NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL 宏获取此信息。

    • 基于数据包的有效负载数据的可扩展交换机端口的策略条件。 例如,可扩展交换机端口的策略可能包含一个筛选器,以仅允许传递 IP 版本 4 (IPv4) 数据包。

    注意 如果数据包是 NVGRE 数据包,则可扩展交换机的 HNV 组件负责转发数据包。 但是,转发扩展可以在入口和出口路径中应用自己的策略条件。 有关详细信息,请参阅 混合转发

  2. 如果扩展确定数据包可以转发到一个或多个可扩展交换机端口,则必须将目标端口添加到数据包的 OOB 数据。 有关此过程的详细信息,请参阅 将可扩展交换机目标端口数据添加到数据包

    注意 如果数据包是 NVGRE 数据包,则不需要转发扩展来添加目标端口。 有关详细信息,请参阅 混合转发

  3. 如果扩展确定数据包无法转发到任何可扩展交换机端口,则必须删除数据包。

    注意 如果数据包是 NVGRE 数据包,则不是这样。 有关详细信息,请参阅 混合转发

  4. 如果扩展为数据包添加了一个或多个目标端口,则必须调用 NdisFSendNetBufferLists 以转发出口数据路径上的数据包。

    注意 如果数据包是 NVGRE 数据包,则可扩展交换机的 HNV 组件负责转发数据包。 有关详细信息,请参阅 混合转发

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