排除将数据包传送到可扩展交换机目标端口

本主题介绍 Hyper-V 可扩展交换机扩展如何排除数据包传递到可扩展交换机端口的方式。 数据包的目标端口是在数据包NET_BUFFER_LIST结构中的带外 (OOB ) 转发上下文中指定的。 有关此上下文的详细信息,请参阅 Hyper-V 可扩展交换机转发上下文

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

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

筛选和转发扩展插件可以排除在可扩展交换机入口或出口数据路径上获取的数据包的传递。 可以通过以下方式排除数据包传递:

  • 扩展可以通过完成数据包请求或指示来删除数据包。 这不包括将数据包传送到任何可扩展交换机端口。 此方法可用于具有一个或多个目标端口的数据包。

    对于在可扩展交换机入口数据路径上获取的数据包,扩展通过调用 NdisFSendNetBufferListsComplete 完成数据包发送请求。

    对于在可扩展交换机出口数据路径上获取的数据包,扩展通过调用 NdisFReturnNetBufferLists 完成数据包接收指示。

  • 对于在具有多个目标端口的出口数据路径上获取的数据包,扩展可以通过修改一个或多个目标端口的数据来排除数据包传递。 扩展通过将目标端口NDIS_SWITCH_PORT_DESTINATION结构的 IsExcluded 成员设置为值 1 来执行此操作。 此方法允许将数据包传递到 IsExcluded 值设置为零的那些端口。

    注意 在入口数据路径上获取的数据包不包含目标端口。 仅当可扩展交换机将数据包转发到出口数据路径后,此数据才可用。

扩展修改目标端口的 IsExcluded 值后,必须将出口数据路径中的数据包转发到过度覆盖的扩展。 但是,如果所有数据包的目标端口的 IsExcluded 数据设置为 1,则扩展应通过完成数据包接收指示而不是转发来删除数据包。

注意 扩展将目标端口的 IsExcluded 值设置为 1 后,出口数据路径上的过度扩展无法将此值更改为零。

注意 捕获扩展无法排除将数据包传送到可扩展交换机端口。

筛选和转发扩展必须遵循以下准则,以便将数据包传送排除到可扩展交换机端口:

  • 在可扩展的交换机入口数据路径上,筛选和转发扩展可以根据数据包的源端口或数据的策略条件排除数据包传递。

    源端口信息存储在数据包 NET_BUFFER_LIST 结构的 OOB 数据的 NDIS_SWITCH_FORWARDING_DETAIL_NET_BUFFER_LIST_INFO 联合中。 该扩展使用 NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL 宏获取数据。

    如果扩展排除从入口数据路径获取的数据包的传递,则必须通过完成数据包发送请求来删除数据包。

  • 在可扩展交换机入口数据路径上,转发扩展确定数据包的目标端口,并将此信息添加到数据包的 OOB 数据中。 根据扩展强制实施的策略条件,它可以通过不将其目标端口信息添加到 OOB 数据来排除到端口的数据包传送。

    有关此过程的详细信息,请参阅 向数据包添加可扩展交换机目标端口数据

  • 在可扩展交换机出口数据路径上,筛选和转发扩展可以根据策略条件排除数据包的传递。 例如,筛选扩展可以根据数据包的源端口或目标端口的策略条件排除数据包传递。

    扩展通过执行以下步骤排除将数据包传送到目标端口:

    1. 该扩展通过调用 GetNetBufferListDestinations 获取数据包的目标端口。 如果调用返回NDIS_STATUS_SUCCESS,则 Destinations 参数包含指向 NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY 结构的指针。 此结构指定数据包的可扩展交换机目标端口。 每个目标端口的格式设置为 NDIS_SWITCH_PORT_DESTINATION 结构。

      注意如果 NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY 结构的 NumDestinations 成员包含值零,则数据包没有目标端口的数据。

  1. 该扩展通过将目标端口的 NDIS_SWITCH_PORT_DESTINATION 结构的 IsExcluded 成员设置为值 1 来排除到可扩展交换机端口的数据包传送。

    注意 如果扩展排除将数据包传送到其所有目标端口,则扩展必须通过完成数据包的接收指示来删除数据包。

  2. 如果扩展不包括传递到数据包中的一个或所有目标端口,则必须执行以下操作:

    • 扩展必须调用 UpdateNetBufferListDestinations 才能将这些更改提交到数据包的 OOB 数据。

    • 该扩展必须调用 ReportFilteredNetBufferLists。 调用此函数时,可扩展交换机接口会递增计数器,并记录已排除数据包的事件。 扩展必须在从中获取数据包的可扩展交换机数据路径中转发数据包之前进行此调用。

    同样,如果扩展完成数据包发送请求或指示排除数据包的所有端口的传递,则它还必须调用 ReportFilteredNetBufferLists

    注意 该扩展可以为扩展所排除的数据包创建 NET_BUFFER_LIST 结构的链接列表。 当扩展调用 ReportFilteredNetBufferLists 时,它将 NetBufferLists 参数设置为指向链接列表的指针。

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