NDIS 虚拟机队列状态

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

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

  • Undefined

  • 已分配

  • 设置

  • 已暂停

  • 运行

  • 停止 DMA

  • 释放

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

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

下面定义了适配器状态:

定义
“未定义 ”是队列的初始状态。 在此状态下,不会分配队列。 队列 (,除非默认队列始终存在,) 未定义,直到微型端口驱动程序收到队列分配请求。 此外,在自由操作完成后,它未定义,并且已启动的任何接收指示都已完成。

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

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

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

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

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

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