对于每个队列,网络适配器必须支持以下一组操作状态:
未定义
未分配队列。 若要分配队列,上层驱动程序会发送 OID_RECEIVE_FILTER_ALLOCATE_QUEUE OID 请求。
分配
分配的状态是队列的初始状态。 当队列处于“已分配”状态时,上层驱动程序通常会使用 OID_RECEIVE_FILTER_SET_FILTER OID 在队列上设置筛选器,或者使用 OID_RECEIVE_FILTER_QUEUE_ALLOCATION_COMPLETE OID 请求完成队列分配。
设置
在 设置 状态中,队列已分配了至少一个筛选器,但上层驱动程序尚未发送 OID_RECEIVE_FILTER_QUEUE_ALLOCATION_COMPLETE OID。
运行
在 “正在运行 ”状态下,队列设置了筛选器,队列分配已完成,微型端口适配器指示队列的接收数据包。
已暂停
在 暂停 状态下,网络适配器不指示队列收到的网络数据。 在发出 OID_RECEIVE_FILTER_QUEUE_ALLOCATION_COMPLETE OID 请求之前,队列中没有设置筛选器,或者使用 OID_RECEIVE_FILTER_CLEAR_FILTER OID 请求清除了队列上设置的所有筛选器。
DMA 已停止
在 DMA 已停止 状态下,微型端口驱动程序收到了 OID_RECEIVE_FILTER_FREE_QUEUE OID 请求。 当 DMA 停止并且驱动程序已发出 DMA 停止状态指示(带有 NDIS_STATUS_RECEIVE_QUEUE_STATE),驱动程序将进入释放状态。
释放
在 释放 状态下,微型端口驱动程序完成停止队列的发送和接收操作所需的过程,并释放关联的资源。 完成所有待处理的接收指示后,将删除队列,队列处于“未定义”状态。
下表中,标题是队列状态。 主要事件列在第一列中。 表中的其余条目指定队列在某个状态内发生事件后进入的下一个状态。 空白条目表示无效的事件/状态组合。
| 事件 \ 状态 | 未定义 | 已分配 | 设置 | 跑步 | 已暂停 | 停止 DMA | 释放 |
|---|---|---|---|---|---|---|---|
OID_RECEIVE_FILTER_ALLOCATE_QUEUE - 方法(设置) |
已分配 |
||||||
OID_RECEIVE_FILTER_QUEUE_PARAMETERS - 方法(查询)请求 |
已分配 |
设置 |
跑步 |
已暂停 |
|||
OID_RECEIVE_FILTER_QUEUE_PARAMETERS - 设置请求 |
已分配 |
设置 |
跑步 |
已暂停 |
|||
OID_RECEIVE_FILTER_SET_FILTER - 方法设置的请求 |
设置 |
设置 |
跑步 |
跑步 |
|||
OID_RECEIVE_FILTER_CLEAR_FILTER - 设置请求(最后一个筛选器) |
已分配 |
已暂停 |
|||||
OID_RECEIVE_FILTER_CLEAR_FILTER - 设置请求(不是最后一个筛选器) |
设置 |
跑步 |
|||||
OID_RECEIVE_FILTER_ENUM_FILTERS - 方法(查询请求) |
已分配 |
设置 |
跑步 |
已暂停 |
|||
OID_RECEIVE_FILTER_PARAMETERS - 方法(查询)请求 |
设置 |
跑步 |
|||||
OID_RECEIVE_FILTER_QUEUE_ALLOCATION_COMPLETE - 方法(设置)请求 |
已暂停 |
跑步 |
|||||
接收数据包 |
跑步 |
||||||
OID_RECEIVE_FILTER_FREE_QUEUE 设置请求 |
停止 DMA |
停止 DMA |
|||||
DMA 已停止,并已发送 NDIS_STATUS_RECEIVE_QUEUE_STATE 状态指示(注意:DMA 可能早已在“已分配”或“已暂停”状态下停止) |
释放 |
||||||
所有接收指示都已完成,队列资源已释放 |
未定义 |
注意 上表中列出的事件包括一些不会导致状态更改的辅助事件。 这些辅助事件包含在表中,用于指定这些事件有效状态。
主要队列事件的定义如下:
OID_RECEIVE_FILTER_ALLOCATE_QUEUE - 方法(set) 请求
上层驱动程序分配了一个队列。 有关分配队列的详细信息,请参阅 分配和释放 VM 队列。
OID_RECEIVE_FILTER_SET_FILTER - 方法(设置)请求
上层驱动程序在队列上设置一个筛选器。 如果上层驱动程序尚未发送 OID_RECEIVE_FILTER_QUEUE_ALLOCATION_COMPLETE OID,则队列处于 Set 状态。 否则,队列处于“正在运行”状态。 有关在队列上设置筛选器的详细信息,请参阅 “设置和清除 VMQ 筛选器”。
OID_RECEIVE_FILTER_CLEAR_FILTER - 设置请求
叠加驱动程序清除了队列上的筛选器。 如果在正在运行的队列中清除了最后一个筛选器,则可以停止 DMA,接收的指示会被暂停,队列应清除接收到的数据(如果有)。 有关清除队列中的筛选器的详细信息,请参阅 “设置和清除 VMQ 筛选器”。
OID_RECEIVE_FILTER_QUEUE_ALLOCATION_COMPLETE - 方法(设置)请求
上层驱动程序完成了队列分配。 如果队列上设置了筛选器,它就会处于“正在运行”状态,并且可以开始接收指示。 有关完成队列分配的详细信息,请参阅 分配和释放 VM 队列。
接收数据包
微型端口驱动程序只能为处于“正在运行”状态的队列指示接收数据包。 有关指示队列接收数据的详细信息,请参阅 VMQ 发送和接收操作。
OID_RECEIVE_FILTER_FREE_QUEUE设置请求。
上层驱动程序释放了队列。 驱动程序发出 DMA 停止状态指示(NDIS_STATUS_RECEIVE_QUEUE_STATE),然后进入释放状态。 完成所有待处理的接收指示并释放队列资源时,队列处于未定义状态。