分配 VM 队列

若要使用一组初始配置参数分配队列,过度分配驱动程序会发出 OID_RECEIVE_FILTER_ALLOCATE_QUEUE 方法 OID 请求。 NDIS_OID_REQUEST 结构的 InformationBuffer 成员最初包含指向NDIS_RECEIVE_QUEUE_PARAMETERS结构的指针。 从 OID 方法请求成功返回后,NDIS_OID_REQUEST 结构的 InformationBuffer 成员包含指向具有新队列标识符和 MSI-X 表条目的NDIS_RECEIVE_QUEUE_PARAMETERS结构的指针。

NDIS_RECEIVE_QUEUE_PARAMETERS 结构用于 OID_RECEIVE_FILTER_ALLOCATE_QUEUE OID 和 OID_RECEIVE_FILTER_QUEUE_PARAMETERS OID。 有关 VM 队列参数的详细信息,请参阅 获取和更新 VM 队列参数

覆盖驱动程序使用以下队列配置参数初始化 NDIS_RECEIVE_QUEUE_PARAMETERS 结构:

  • 队列类型从 NDIS_RECEIVE_QUEUE_TYPE enumeration. (NdisReceiveQueueTypeVMQueue.)

  • 队列的处理器相关性。

  • 队列名称和虚拟机名称。

  • lookahead-split 参数。

    注意 从 NDIS 6.30 开始,不再支持将数据包数据拆分到单独的观察头缓冲区。

注意 覆盖驱动程序可以在 NDIS_RECEIVE_QUEUE_PARAMETERS 结构的 Flags 成员中设置 NDIS_RECEIVE_QUEUE_PARAMETERS_PER_QUEUE_RECEIVE_INDICATION和NDIS_RECEIVE_QUEUE_PARAMETERS_LOOKAHEAD_SPLIT_REQUIRED标志 。 其他标志不用于队列分配。

当 NDIS 收到分配接收队列的 OID 请求时,它会验证队列参数。 NDIS 分配必要的资源和队列标识符后,会将 OID 请求提交到基础微型端口驱动程序。 队列标识符对于关联的网络适配器是唯一的。

如果微型端口驱动程序可以成功为接收队列分配必要的软件和硬件资源,它将以成功状态完成 OID 请求。

在 NDIS 将 OID 请求发送到微型端口驱动程序之前,NDIS 在 NDIS_RECEIVE_QUEUE_PARAMETERS 结构的 QueueId 成员中分配队列标识符,并将方法请求传递给微型端口驱动程序。 微型端口驱动程序在 MSIXTableEntry 成员中提供 MSI-X 表条目。

微型端口驱动程序必须保留分配的接收队列的队列标识符。 NDIS 使用接收队列的队列标识符进行对微型端口驱动程序的后续调用,以在接收队列上设置接收筛选器、更改接收队列参数或释放接收队列。

注意 默认队列 (队列标识符零) 始终分配,无法释放。

过度驱动程序必须使用 NDIS 在后续 OID 请求中提供的队列标识符,例如,修改队列参数或释放队列。 队列标识符还包含在与队列关联的所有 NET_BUFFER_LIST 结构的 OOB 数据中。 驱动程序使用 NET_BUFFER_LIST_RECEIVE_QUEUE_ID 宏检索NET_BUFFER_LIST结构中的队列标识符。

注意 协议驱动程序可以在成功分配队列之后和删除队列之前随时设置 VMQ 筛选器。

协议驱动程序发出 OID_RECEIVE_FILTER_QUEUE_ALLOCATION_COMPLETE 方法 OID 请求来完成队列分配。 分配完成后,微型端口驱动程序可以分配共享内存和其他资源。 有关分配共享内存资源的详细信息,请参阅 共享内存资源分配

微型端口驱动程序收到OID_RECEIVE_FILTER_QUEUE_ALLOCATION OID 请求并成功处理后,队列将处于 “已分配” 状态。 有关队列状态的详细信息,请参阅 队列状态和操作

在过度分配的驱动程序 (分配一个或多个接收队列并选择性地设置初始筛选器) 后,它必须发出 OID_RECEIVE_FILTER_QUEUE_ALLOCATION_COMPLETE 设置 OID 请求,以通知微型端口驱动程序当前一批接收队列的分配已完成。

如果没有在该队列上设置筛选器,微型端口驱动程序不得在接收队列中保留任何数据包。 如果队列从未设置过任何筛选器或清除了所有筛选器,则队列应为空,并且应丢弃任何数据包。 也就是说,它们不会在驱动程序堆栈上指示或保留在队列中。

过度分配驱动程序使用 OID_RECEIVE_FILTER_FREE_QUEUE OID 释放其分配的队列。 有关释放队列的详细信息,请参阅 释放 VM 队列