克隆数据包流量

本主题介绍 Hyper-V 可扩展交换机扩展如何克隆或复制数据包并将其注入可扩展交换机数据路径。 有关克隆数据包的详细信息,请参阅 克隆NET_BUFFER_LIST结构

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

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

可扩展交换机筛选和转发扩展可以按照以下准则将克隆的数据包注入可扩展交换机入口或出口数据路径:

  • 扩展必须首先为克隆的数据包分配 NET_BUFFER_LIST 结构。 然后,扩展必须将数据包数据从原始数据包复制到克隆的数据包。 有关如何克隆数据包的详细信息,请参阅 派生NET_BUFFER_LIST结构

  • 扩展分配 NET_BUFFER_LIST 结构后,必须调用 AllocateNetBufferListForwardingContext 处理程序函数来为数据包分配可扩展的交换机转发上下文。

    转发上下文驻留在带外 (OOB) 数据包的数据中。 它包含数据包的转发信息,例如其源端口和一个或多个目标端口的数组。

    有关转发上下文的详细信息,请参阅 Hyper-V 可扩展交换机转发上下文

  • 扩展必须通过调用 CopyNetBufferListInfo 将 OOB 数据(包括现有源端口)从原始数据包复制到克隆的数据包。 如果扩展计划将数据包注入入口数据路径,则还必须从原始数据包的 OOB 数据复制目标端口。

    复制 OOB 数据时,扩展必须遵循以下准则:

    • 如果筛选扩展计划将数据包注入入口数据路径,则必须调用未指定NDIS_SWITCH_COPY_NBL_INFO_FLAGS_PRESERVE_DESTINATIONS标志的 CopyNetBufferListInfo 。 这会导致原始数据包的目标端口不会复制到克隆的数据包。 当筛选扩展将此数据包注入入口数据路径时,目标端口将通过基础转发扩展 (添加到数据包(如果在驱动程序堆栈) 或可扩展交换机的微型端口边缘中启用)。

    • 如果筛选扩展计划将数据包注入出口数据路径,则必须使用指定的NDIS_SWITCH_COPY_NBL_INFO_FLAGS_PRESERVE_DESTINATIONS标志调用 CopyNetBufferListInfo 。 这会导致原始数据包的目标端口复制到克隆的数据包。

  • 如果筛选扩展正在克隆或复制从出口数据路径获取的数据包,则可以在调用 CopyNetBufferListInfo 并指定NDIS_SWITCH_COPY_NBL_INFO_FLAGS_PRESERVE_DESTINATIONS标志后更改数据包的目标端口。 有关此过程的详细信息,请参阅 修改数据包的可扩展交换机源端口数据

  • 如果转发扩展正在克隆或复制从入口数据路径获取的数据包,则必须在将数据包注入入口数据路径之前为数据包添加新的目标端口。 有关此过程的详细信息,请参阅 将可扩展交换机目标端口数据添加到数据包

  • 扩展调用 CopyNetBufferListInfo 后,将为数据包分配原始数据包中包含的相同源端口信息。

    该扩展可以调用 SetNetBufferListSource 来更改数据包的带外 (OOB) 数据的源端口信息。

    扩展可能希望将数据包视为来自特定端口的数据包。 这样,该端口的策略就可以应用于数据包。 扩展调用 SetNetBufferListSource 来更改数据包的源端口。

    但是,在某些情况下,扩展可能需要将数据包的源端口标识符分配给 NDIS_SWITCH_DEFAULT_PORT_ID。 例如,扩展可能希望将源端口标识符设置为 NDIS_SWITCH_DEFAULT_PORT_ID 发送到外部网络上设备的专有控制数据包。

  • 在标准 NDIS 数据路径中,非可扩展交换机 OOB 数据通常具有不同的值,具体取决于数据包是被指示为发送还是接收。 例如, NDIS_IPSEC_OFFLOAD_V2_HEADER_NET_BUFFER_LIST_INFO OOB 数据是特定于发送和接收结构的联合

    在可扩展交换机数据路径中,所有数据包在发送和接收时都通过扩展驱动程序堆栈。 因此,数据包 NET_BUFFER_LIST 结构中的非可扩展交换机 OOB 数据在流经驱动程序堆栈的持续时间内将采用发送或接收格式。

    此 OOB 数据的格式取决于数据包到达可扩展交换机的源可扩展交换机端口。 如果源端口连接到外部网络适配器,则非可扩展交换机 OOB 数据将采用接收格式。 对于其他端口,此 OOB 数据将采用发送格式。

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

    注意 如果扩展克隆数据包的 NET_BUFFER_LIST 结构,则必须在添加或修改 OOB 数据时考虑非可扩展交换机 OOB 数据。 该扩展可以调用 CopyNetBufferListInfo ,将所有 OOB 数据从源数据包复制到克隆的数据包。 将数据复制到数据包时,此函数将保持 OOB 发送或接收格式。

  • 当扩展克隆数据包时,克隆的数据包数据位于 Hyper-V 父分区的父操作系统的本地或 受信任的内存中。 子分区无法访问此内存。 因此,该分区中运行的来宾操作系统认为它对于非同步更新是“安全的”。

    克隆原始数据包后,扩展必须使用 NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL 宏获取克隆数据包中的 NDIS_SWITCH_FORWARDING_DETAIL_NET_BUFFER_LIST_INFO 联合。 该扩展必须将 IsPacketDataSafe 成员设置为 TRUE。 这指定所有数据包数据都位于受信任的内存中。

筛选和转发扩展必须遵循以下准则,以便将克隆的数据包注入入口或出口数据路径:

  • 扩展必须调用 NdisFSendNetBufferLists 将克隆的数据包注入入口数据路径。 该扩展必须使用相应的可扩展交换机标志设置设置 来设置 SendFlags 参数。 有关这些标志设置的详细信息,请参阅 Hyper-V 可扩展交换机发送和接收标志

    当 NDIS 调用扩展的 FilterSendNetBufferListsComplete 函数来完成克隆数据包的发送请求时,扩展必须调用 FreeNetBufferListForwardingContext 以释放分配的转发上下文。 扩展必须先执行此操作,然后才能释放或重用数据包的 NET_BUFFER_LIST 结构。

    注意 如果扩展修改了从出口数据路径获取的数据包的数据包数据或源端口,则必须将克隆的数据包注入入口数据路径。 如果未保留数据包的目标端口,它还必须将克隆的数据包注入入口数据路径。

  • 扩展必须调用 NdisFIndicateReceiveNetBufferLists 将克隆的数据包注入出口数据路径。 该扩展必须使用适当的可扩展交换机标志设置设置 来设置 ReceiveFlags 参数。

    当 NDIS 调用扩展的 FilterReturnNetBufferLists 函数以完成克隆数据包的接收请求时,扩展必须先调用 FreeNetBufferListForwardingContext ,然后才能释放或重用数据包 的 NET_BUFFER_LIST 结构。

    注意 在转发扩展调用 NdisFIndicateReceiveNetBufferLists 之前,它必须已确定克隆数据包的目标端口,并将此数据添加到数据包的 OOB 数据。

  • 如果扩展克隆数据包 的NET_BUFFER_LIST 结构,则必须保留原始数据包 NET_BUFFER_LIST 结构的所有权,直到克隆数据包的发送或接收请求完成。 该扩展必须使用克隆数据包NET_BUFFER_LIST结构的 ParentNetBufferList 成员链接到原始数据包的NET_BUFFER_LIST结构。

    注意在 NDIS 6.30 (Windows Server 2012) 中,扩展可以使用 ParentNetBufferList 成员链接到原始数据包,但不需要这样做。 在 NDIS 6.40 (Windows Server 2012 R2) 及更高版本中,扩展需要使用 ParentNetBufferList 成员链接到原始数据包。

    克隆数据包的发送或接收请求完成后,扩展必须完成原始数据包的发送或接收请求。

    注意 如果扩展克隆了数据包 的NET_BUFFER_LIST 结构,则可以在克隆后完成原始数据包的发送或接收请求。

  • 如果扩展克隆数据包,则可以在克隆原始数据包后立即完成该数据包的发送或接收请求。

如果转发或筛选扩展在出口数据路径中获取数据包,则如果扩展修改了数据包数据或更改了源端口,则无法在此数据路径中注入数据包的克隆版本。 但是,扩展可以将这些数据包注入入口数据路径。 这允许通过可扩展交换机数据路径正确转发和筛选数据包。

注意 筛选扩展只能将克隆的数据包注入入口数据路径(如果未保留数据包的目标端口)。

例如,假设在可扩展交换机出口数据路径中获取了具有多个目标端口的数据包。 如果一个目标端口需要特殊处理(例如数据封装),则转发或筛选扩展会按照以下步骤进行处理:

  1. 排除到需要特殊处理的端口的数据包传送。 扩展通过将目标端口NDIS_SWITCH_PORT_DESTINATION结构的 IsExcluded 成员设置为值 1 来执行此操作。 有关此过程的详细信息,请参阅 排除到可扩展交换机目标端口的数据包传送

  2. 克隆原始数据包,并执行数据包数据所需的处理。

    注意 筛选扩展不得为克隆的数据包添加目标端口。 此数据稍后将由可扩展交换机的转发扩展插件或微型端口边缘添加。

  3. 通过调用 NdisMIndicateReceiveNetBufferLists 转发出口数据路径上的原始数据包。

  4. 通过调用 NdisFSendNetBufferLists,在入口数据路径上注入克隆的数据包。

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

注意 捕获扩展无法克隆数据包流量。 但是,它们可以引发数据包流量。 有关详细信息,请参阅 发起数据包流量