发起数据包流量

本主题介绍 Hyper-V 扩展如何产生新数据包并将其注入到可扩展的交换机数据路径中。

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

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

可扩展交换机扩展只能将新数据包注入到可扩展交换机入口数据路径中。 这可确保可扩展交换机接口可以正确筛选和转发这些数据包。 扩展必须遵循以下准则将新数据包注入入口数据路径:

  • 该扩展必须首先为新数据包分配 NET_BUFFER_LIST 结构。

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

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

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

  • 扩展调用 AllocateNetBufferListForwardingContext 后,数据包的源端口将设置为 NDIS_SWITCH_DEFAULT_PORT_ID。 源端口标识符为 NDIS_SWITCH_DEFAULT_PORT_ID 的数据包受信任,会绕过可扩展的交换机端口策略,例如访问控制列表 (ACL) 和服务质量 (QoS) 。

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

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

  • 如果转发扩展在入口数据路径上发送新数据包,则必须确定数据包的目标端口。 有关此过程的详细信息,请参阅 向数据包添加可扩展交换机目标端口数据

    注意 捕获或筛选扩展无法向新数据包添加新的目标端口。

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

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

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

  • 当 NDIS 调用扩展的 FilterSendNetBufferListsComplete 函数来完成新数据包的发送请求时,扩展必须调用 FreeNetBufferListForwardingContext 来释放分配的转发上下文。 扩展必须在释放或重用数据包的 NET_BUFFER_LIST 结构之前执行此操作。

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