将接收筛选器移到虚拟端口

覆盖驱动程序发出对象标识符 (OID) OID_RECEIVE_FILTER_MOVE_FILTER 的集合请求,以将接收筛选器从虚拟端口 (VPort) 移动到 NIC 交换机上的另一个 VPort。 通常,如果满足以下任一条件,则过度分配的驱动程序(如虚拟化堆栈)会发出此 OID 请求:

  • 虚拟化堆栈在默认 VPort 上设置接收筛选器。 此筛选器包含针对 Hyper-V 子分区中公开的虚拟机 (VM) 网络适配器的媒体访问控制 (MAC) 地址和虚拟 LAN (VLAN) 参数。 这允许通过基于软件的合成数据路径在 VM 网络适配器和基础网络适配器之间转发数据包。

    分配 PCI Express (PCIe) Virtual Function (VF) 的资源并将 VF 附加到子分区后,虚拟化堆栈将在 VF 上创建一个非默认 VPort。 然后,虚拟化堆栈将 VM 网络适配器的接收筛选器从默认 VPort 移动到附加到 VF 的非默认 VPort。 这允许通过基于硬件的 VF 数据路径在 VM 网络适配器和基础网络适配器之间转发数据包。

    有关这些数据路径的详细信息,请参阅 SR-IOV 数据路径

  • VF 已从来宾操作系统仍在运行的 Hyper-V 子分区分离。 在这种情况下,Overlying 驱动程序会发出 OID 集请求,将 VM 网络适配器的接收筛选器从非默认 VPort 移动到附加到 PF 的默认 VPort。 发生这种情况时,数据包流量将还原到综合数据路径。

若要将接收筛选器从一个 VPort 移动到另一个 VPort,上置驱动程序会发出 OID_RECEIVE_FILTER_MOVE_FILTER的 OID 集请求。 NDIS_OID_REQUEST 结构的 InformationBuffer 成员包含指向NDIS_RECEIVE_FILTER_MOVE_FILTER_PARAMETERS结构的指针。

在过度分配驱动程序发出 OID_RECEIVE_FILTER_MOVE_FILTER 请求之前,它必须通过以下方式初始化 NDIS_RECEIVE_FILTER_MOVE_FILTER_PARAMETERS 结构:

  • 驱动程序将 FilterId 成员设置为以前分配的接收筛选器的标识符。

    注意 覆盖驱动程序从早期的 OID 方法请求 OID_RECEIVE_FILTER_SET_FILTEROID_RECEIVE_FILTER_ENUM_FILTERS获取筛选器标识符。

  • 驱动程序将 SourceQueueId 成员设置为NDIS_DEFAULT_RECEIVE_QUEUE_ID。

  • 驱动程序将 SourceVPortId 成员设置为以前设置此筛选器的 VPort 的标识符。

  • 驱动程序将 DestQueueId 成员设置为 NDIS_DEFAULT_RECEIVE_QUEUE_ID。

  • 驱动程序将 DestVPortId 成员设置为要移动此筛选器的 VPort 的标识符。

NDIS 先验证 NDIS_RECEIVE_FILTER_MOVE_FILTER_PARAMETERS 的成员,然后再将 OID 集请求转发到 PF 微型端口驱动程序。

当 PF 微型端口驱动程序处理此 OID 集请求时,它必须在原子操作中移动接收筛选器。 驱动程序必须能够将网络适配器配置为同时从接收队列和 VPort 中删除筛选器,并将其设置在不同的接收队列和 VPort 上。