队列状态和操作
对于每个队列,网络适配器必须支持以下一组操作状态:
定义
未分配队列。 为了分配队列,过分驱动程序会发送 OID_RECEIVE_FILTER_ALLOCATE_QUEUE OID 请求。
已分配
“已分配”状态是队列的初始状态。 当队列处于“已分配”状态时,overlying 驱动程序通常会使用 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) 时,驱动程序将进入“正在释放”状态。
释放
在 “正在释放 ”状态下,微型端口驱动程序完成停止队列的发送和接收操作所需的操作,并释放关联的资源。 完成所有未完成的接收指示后,队列将被删除,队列为“未定义”。
在下表中,标题是队列状态。 主要事件列在第一列中。 表中的其余条目指定在某个状态内发生事件后队列进入的下一个状态。 空条目表示无效的事件/状态组合。
事件 \ 状态 | Undefined | 已分配 | 设置 | 正在运行 | 已暂停 | 停止 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 可能已处于已分配或已暂停状态) |
释放 |
||||||
所有接收指示都已完成,队列资源已释放 |
Undefined |
注意 上表中列出的事件包括一些不会导致状态更改的辅助事件。 表中包含这些辅助事件,用于指定这些事件的有效状态。
主要队列事件的定义如下:
OID_RECEIVE_FILTER_ALLOCATE_QUEUE - 方法 (设置) 请求
过度分配的驱动程序分配了一个队列。 有关分配队列的详细信息,请参阅 分配和释放 VM 队列。
OID_RECEIVE_FILTER_SET_FILTER - 方法 (设置) 请求
过度覆盖的驱动程序在队列上设置筛选器。 如果覆盖驱动程序尚未发送 OID_RECEIVE_FILTER_QUEUE_ALLOCATION_COMPLETE OID,则队列处于“设置”状态。 否则,队列处于“正在运行”状态。 有关在队列上设置筛选器的详细信息,请参阅 设置和清除 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) ,驱动程序进入释放状态。 完成所有未完成的接收指示并释放队列资源时,队列未定义。