删除虚拟端口

覆盖驱动程序发出对象标识符 (OID) 设置 OID_NIC_SWITCH_DELETE_VPORT 请求,以删除网络适配器的 NIC 交换机上的非默认虚拟端口 (VPort) 。 覆盖驱动程序只能删除它之前通过发出 OID 方法请求 OID_NIC_SWITCH_CREATE_VPORT 创建的 VPort。

NDIS_OID_REQUEST 结构的 InformationBuffer 成员包含指向 NDIS_NIC_SWITCH_DELETE_VPORT_PARAMETERS 结构的指针。

过度分配的驱动程序(如虚拟化堆栈)可以删除它之前创建的非默认 VPort。 覆盖驱动程序通过发出 OID_NIC_SWITCH_CREATE_VPORT 的 OID 方法请求来创建 VPort。

在发出 OID_NIC_SWITCH_DELETE_VPORT 的 OID 集请求之前,过度分配驱动程序必须执行以下操作:

  • 在删除 VPort 之前,过度分配的驱动程序必须清除或移动驱动程序之前在 VPort 上设置的所有接收筛选器。 接收筛选器通过 OID_RECEIVE_FILTER_SET_FILTER 的 OID 请求设置,并通过 OID_RECEIVE_FILTER_MOVE_FILTER 的 OID 请求移动。

  • overlying 驱动程序将 NDIS_NIC_SWITCH_DELETE_VPORT_PARAMETERS 结构的 VPortId 成员设置为要删除的非默认 VPort 的标识符。

    注意 过度覆盖的驱动程序不得将 VPortId 成员设置为 NDIS_DEFAULT_PORT_NUMBER。 此 VPort 标识符保留给连接到网络适配器上的 PCI Express (PCIe) 物理功能 (PF) 的默认 VPort。 默认 VPort 始终存在,并且不会通过 OID_NIC_SWITCH_DELETE_VPORT的 OID 集请求显式删除。

覆盖驱动程序调用 NdisOidRequest 向基础 PF 微型端口驱动程序发出 OID_NIC_SWITCH_DELETE_VPORT 请求。 当微型端口驱动程序收到OID_NIC_SWITCH_DELETE_VPORT请求时,驱动程序必须执行以下操作:

  • 驱动程序必须释放为指定的 VPort 分配的硬件和软件资源。

  • 驱动程序必须将指定的 VPort 与 PF 或 PCIe 虚拟函数分离 (VF) 。

    如果 VPort 附加到 VF,则虚拟化堆栈可确保在来宾操作系统中运行的 VF 微型端口驱动程序之前已暂停和停止。 因此,以前从 VPort 输入的所有接收数据包都应返回到 VF 微型端口驱动程序。

    如果 VPort 附加到 PF,则 PF 微型端口驱动程序必须停止与 VPort 关联的共享内存的任何其他 DMA。 PF 微型端口驱动程序必须确保以前从 VPort 输入的所有接收数据包都返回到微型端口。 PF 微型端口驱动程序不得向在数据包的 NET_BUFFER_LIST 结构中指定 VPort 标识符的 NDIS 发出任何其他接收指示。 将来自 VPort 的所有指示的接收数据包返回到 PF 微型端口驱动程序后,它必须通过调用 NdisFreeSharedMemory 释放与 VPort 关联的共享内存。

以下几点适用于删除 VPort:

  • Overlying 协议驱动程序必须删除在调用 NdisCloseAdapterEx 之前创建的所有非默认 VPort。

  • 覆盖筛选器驱动程序必须删除在其 FilterDetach 函数中创建的所有非默认 VPort。

  • 在 NDIS 发出 OID_NIC_SWITCH_DELETE_SWITCH 请求以删除网络适配器上的 NIC 交换机之前,它保证从该交换机中删除所有非默认 VPort。

  • 只有非默认 VPort 可以通过 OID_NIC_SWITCH_DELETE_SWITCH 的 OID 请求显式删除。 当 PF 微型端口驱动程序删除默认 NIC 开关时,默认 VPort 将隐式删除。 有关详细信息,请参阅 删除 NIC 开关