虚拟端口 (VPorts)

虚拟端口(VPort)是一个数据对象,表示支持单根 I/O 虚拟化(SR-IOV)的网络适配器的 NIC 交换机上的内部端口。 每个 NIC 交换机都有以下用于网络连接的端口:

  • 一个外部物理端口,用于连接到外部物理网络。

  • 连接到 PCI Express 物理功能 (PF) 或虚拟功能 (VF) 的一个或多个内部 VPort。

    • PF 附加到 Hyper-V 父分区,并作为在该分区中运行的管理操作系统中的虚拟网络适配器公开。
    • VF 连接到 Hyper-V 子分区,并在该分区中运行的来宾操作系统中作为虚拟网络适配器显示。

NIC 交换机将网络流量从物理端口连接到一个或多个虚拟端口。 这提供对基础物理网络接口的虚拟化访问。

每个 VPort 都有一个唯一标识符(VPortId),该标识符对于网络适配器上的 NIC 交换机是唯一的。 默认 VPort 始终存在于默认 NIC 交换机上,永远无法删除。 默认 VPort 的 VPortId 为 NDIS_DEFAULT_VPORT_ID

当 PF 微型端口驱动程序处理 OID_NIC_SWITCH_CREATE_SWITCH的对象标识符(OID)方法请求时,它将为该交换机创建 NIC 开关和默认 VPort。 默认 VPort 始终附加到 PF,并且始终处于运行状态。

非默认 VPorts 是通过 OID_NIC_SWITCH_CREATE_VPORT 的 OID 方法请求创建的。 VF 只能连接一个非默认 VPort。 附加后,默认值处于操作状态。 也可以创建一个或多个非默认 VPorts 并将其附加到 PF。 这些 VPort 在创建时处于不可运行状态,可以通过 OID_NIC_SWITCH_VPORT_PARAMETERS 的 OID set 请求变为可运行状态。

注意

VPort 变为可运行状态后,只有当通过 OID_NIC_SWITCH_DELETE_VPORT 的 OID 请求删除它时,它才能变为不可运行状态。

每个 VPort 都有一个或多个与它关联的硬件队列对,用于接收和传输数据包。 网络适配器上的默认队列对保留供默认 VPort 使用。 当通过 OID_NIC_SWITCH_CREATE_VPORT 请求创建 VPort 时,会分配和指定非默认 VPort 的队列对。

非默认 VPort 是通过 OID_NIC_SWITCH_CREATE_VPORT 的 OID 方法请求创建和配置的。 默认 VPort 和非默认 VPort 是通过 OID_NIC_SWITCH_VPORT_PARAMETERS 的 OID 集请求重新配置的。 每个 OID 请求都包含一个 NDIS_NIC_SWITCH_VPORT_PARAMETERS 结构,该结构指定以下配置参数:

  • 连接 VPort 的 PCIe 函数。

    每个 VPort 都可以随时连接到 PF 或 VF。 创建 VPort 并将其附加到 PCIe 函数后,附件无法动态更改为另一个 PCIe 函数。

    注意

    默认 VPort 始终连接到网络适配器上的 PF。

    从 NDIS 6.30 开始,在 Windows Server 2012 中,只能将一个非默认 VPort 附加到 VF。 但是,多个非默认 VPort 以及默认 VPort 可以连接到 PF。

  • 分配给 VPort 的硬件队列对数。

    每个 VPort 都有一组可供其使用的硬件队列对。 每个队列对都由网络适配器上的一个单独的传输和接收队列组成。

    队列对是网络适配器上的有限资源。 创建 NIC 交换机时,指定了保留供默认和非默认 VPort 使用的队列对总数。 这允许分配给默认 VPort 的队列对数与非默认 VPort 不同。

    可将每个非默认 VPort 配置为具有不同数量的队列对。 这称为队列对的非对称分配。 如果 NIC 不允许进行此类非对称分配,则每个非默认 VPort 配置为具有相同的队列对数。 这称为队列对的对称分配。 有关详细信息,请参阅队列对的对称和非对称分配

    注意

    PF 微型端口驱动程序报告在 MiniportInitializeEx 期间是否支持队列对的非对称分配。 有关详细信息,请参阅初始化 PF 微型端口驱动程序

    分配给每个 VPort 的队列对数不会动态更改。 创建 VPort 后,无法更改分配给 VPort 的队列对数。

    注意

    分配给非默认 VPort 的一个或多个队列对可由在来宾操作系统中运行的 VF 微型端口驱动程序用于接收方缩放 (RSS)。

  • VPort 的中断审查参数。

    可以为不同的 VPort 指定不同的中断审查类型。 这样,虚拟化堆栈就可以控制特定 VPort 生成的中断数。

除了配置参数外,上层驱动程序还可以通过发出 OID_RECEIVE_FILTER_SET_FILTER的 OID 方法请求来配置每个 VPort 的接收筛选器。 NIC 交换机在 VPort 的基础上执行指定的接收过滤操作。

接收 VPort 的筛选器参数包括数据包筛选条件,例如媒体访问控制(MAC)地址列表和虚拟 LAN(VLAN)标识符。 MAC 地址和 VLAN 标识符的筛选器始终在与 OID_RECEIVE_FILTER_SET_FILTER 请求关联的 NDIS_RECEIVE_FILTER_PARAMETERS 中一起指定。 NIC 交换机必须筛选传入数据包,以确保其目标 MAC 地址和 VLAN 标识符符合在 VPort 上设置的任何接收筛选器条件。 NIC 交换机筛选从另一个 VPort 或外部物理端口接收到的数据包。 如果数据包与筛选器匹配,NIC 交换机必须将它转发到 VPort。

可以在 VPort 上设置多个 MAC 地址和 VLAN 标识符对。 如果仅设置 MAC 地址,则接收筛选器指定 VPort 应接收与以下条件匹配的数据包:

  • 数据包的目标 MAC 地址与筛选器的 MAC 地址匹配。

  • 数据包具有 VLAN 标记,或者(如果存在 VLAN 标记),VLAN 标识符为零。

通过 OID_NIC_SWITCH_DELETE_VPORT 的 OID 集请求删除非默认 VPort。 仅当通过 OID_NIC_SWITCH_DELETE_SWITCH 的 OID 设置请求删除 NIC 交换机时,才会删除默认 VPort。