删除虚拟端口
上层驱动程序发出 OID_NIC_SWITCH_DELETE_VPORT 的对象标识符 (OID) 集请求,以删除网络适配器 NIC 交换机上的非默认虚拟端口 (VPort)。 上层驱动程序只能通过发出 OID_NIC_SWITCH_CREATE_VPORT 的 OID 方法请求来删除之前创建的 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 请求进行移动。
上层驱动程序会将 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 分配的硬件和软件资源。
驱动程序必须从 PF 或 PCIe 虚拟功能 (VF) 中分离指定的 VPort。
如果 VPort 连接到 VF,虚拟化堆栈会确保在来宾操作系统中运行的 VF 微型端口驱动程序之前已暂停和停止。 因此,VPort 先前显示的所有接收数据包都应返回到 VF 微型端口驱动程序。
如果 VPort 连接到 PF,则 PF 微型端口驱动程序必须停止向与 VPort 相关联的共享内存发送任何额外的 DMA。 PF 微型端口驱动程序必须确保所有先前指定的来自 VPort 的接收数据包都返回到微型端口。 PF 微型端口驱动程序不得向 NDIS 发出任何额外的接收指示,在数据包的 NET_BUFFER_LIST 结构中指定 VPort 的标识符。 从 VPort 返回所有指示的接收数据包后,PF 微型端口驱动程序必须调用 NdisFreeSharedMemory 来释放与 VPort 相关的共享内存。
以下几点适用于删除 VPort:
上层协议驱动程序必须在调用 NdisCloseAdapterEx 之前删除其创建的所有非默认 VPort。
上层过滤器驱动程序必须删除它在 FilterDetach 函数中创建的所有非默认 VPort。
在 NDIS 发出 OID_NIC_SWITCH_DELETE_SWITCH 的设置请求以删除网络适配器上的 NIC 交换机之前,它将保证删除该交换机上的所有非默认 VPort。
只有非默认 VPort 才能通过 OID_NIC_SWITCH_DELETE_SWITCH 的 OID 请求显式删除。 当 PF 微型端口驱动程序删除默认 NIC 交换机时,默认 VPort 将被隐式删除。 有关详细信息,请参阅删除 NIC 交换机。