NDIS 虚拟机队列状态

本主题概述了 NDIS 虚拟机队列(VMQs)的作状态。 有关队列状态的详细信息,请参阅编写 VMQ 驱动程序部分中的“队列状态和操作”主题。

对于每个队列,网络适配器必须支持以下一组操作状态:

  • 未定义

  • 已分配

  • 设置

  • 已暂停

  • 跑步

  • 停止 DMA

  • 释放

下图显示了这些状态之间的关系。

说明 NDIS VM 队列状态及其关系的示意图。

下面定义了适配器状态:

未定义
未定义 是队列的初始状态。 在此状态下,队列未被分配。 在微型端口驱动程序收到队列分配请求之前,队列(始终存在的默认队列除外)未定义。 此外,在释放操作完成后,该项未定义,并且所有已启动的接收指示均已完成。

分配
在分配请求之后以及队列上设置了任何筛选器之前,队列处于 “已分配 ”状态。 当队列处于“设置”状态,且最后一个筛选器在队列上被清除时,筛选器也可以进入“已分配”状态。 如果微型端口驱动程序在微型端口驱动程序处于“已分配”状态时收到分配完成请求,队列将进入暂停状态。 如果微型端口驱动程序收到释放队列的请求,队列将进入 Stop DMA 状态。

设置
“设置” 状态中,已分配队列,并在队列上设置至少一个筛选器,但微型端口驱动程序尚未收到分配完整的 OID。 如果队列收到分配完成请求,则进入“正在运行”状态。 如果清除队列上的最后一个筛选器,则队列将进入“已分配”状态。 请注意,在队列上设置了筛选器时,无法释放队列。

已暂停
暂停 状态下,将分配队列,但其微型端口驱动程序不会指示收到的数据包,因为队列上没有设置筛选器。 微型端口驱动程序可以从“已分配”状态或“正在运行”状态进入暂停状态。 队列在收到筛选器集请求时进入“正在运行”状态。 队列在收到释放队列请求时进入停止 DMA 状态。

运行
“正在运行 ”状态下,队列设置了筛选器,队列分配已完成,网络适配器指示接收数据包。 如果清除队列上的最后一个筛选器,队列将进入暂停状态。 请注意,在队列上设置了筛选器时,无法释放队列。 此外,如果清除最后一个筛选器,微型端口驱动程序可以停止 DMA。 但是,微型端口驱动程序在这种情况下不应发送 DMA 停止状态指示。

停止 DMA
Stop DMA 状态中,微型端口驱动程序收到免费队列请求,并且必须停止 DMA 活动。 微型端口驱动程序必须发送 DMA 停止状态指示。 微型端口驱动程序发送状态指示后,队列处于释放状态。 请注意,在清除最后一个筛选器时,DMA 可能已停止。 但是,微型端口驱动程序应仅在收到免费队列请求时发送状态指示。

释放
释放 状态下,微型端口驱动程序正在等待队列上所有未完成的接收指示完成,然后释放与队列关联的资源。 释放所有资源后,队列将进入“未定义”状态。