过度的驱动程序发出OID_RECEIVE_FILTER_SET_FILTER的 OID 方法请求,以在网络适配器上设置筛选器。
InformationBufferNDIS_OID_REQUEST 结构的成员包含指向调用方分配的缓冲区的指针。 此缓冲区的格式设置为包含以下内容:
指定 NDIS 接收筛选器的参数的 NDIS_RECEIVE_FILTER_PARAMETERS 结构。
一个由 NDIS_RECEIVE_FILTER_FIELD_PARAMETERS 结构构成的数组,该数组指定网络数据包标头中字段的筛选器测试条件。
从 OID 方法请求成功返回后,NDIS_OID_REQUEST 结构的 InformationBuffer 成员包含指向 NDIS_RECEIVE_FILTER_PARAMETERS 结构的指针。 如果过度部署的驱动程序正在创建新的接收筛选器,NDIS 会使用新的筛选器标识符更新此结构。
言论
NDIS 接收筛选器用于以下 NDIS 接口:
NDIS 数据包合并。 有关如何在此接口中使用接收筛选器的详细信息,请参阅 管理数据包合并接收筛选器。
单根 I/O 虚拟化(SR-IOV)。 有关如何在此接口中使用接收筛选器的详细信息,请参阅 在虚拟端口上设置接收筛选器。
虚拟机队列(VMQ)。 有关如何在此接口中使用接收筛选器的详细信息,请参阅 设置和清除 VMQ 筛选器。
OID_RECEIVE_FILTER_SET_FILTER的 OID 方法请求对于支持 NDIS 数据包合并、SR-IOV 或 VMQ 接口的微型端口驱动程序是必需的。
过度分配的驱动程序使用请求的筛选器配置初始化 NDIS_RECEIVE_FILTER_PARAMETERS 结构。 NDIS 在NDIS_RECEIVE_FILTER_PARAMETERS结构的 FilterId 成员中分配筛选器标识符,并将方法请求传递给基础微型端口驱动程序。
在接收队列上设置的每个筛选器都具有网络适配器的唯一筛选器标识符。 也就是说,筛选器标识符不会在网络适配器管理的不同队列上重复。 当 NDIS 收到 OID 请求以在接收队列上设置筛选器时,它会验证筛选器参数。 NDIS 分配必要的资源和筛选器标识符后,它会将 OID 请求提交到基础网络适配器。 如果网络适配器可以成功分配筛选器所需的软件和硬件资源,它将完成 OID 请求并返回状态为NDIS_STATUS_SUCCESS。
注意 从 NDIS 6.30 开始,数据包合并接收筛选器仅在网络适配器的默认接收队列上受支持。 此接收队列的标识符为NDIS_DEFAULT_RECEIVE_QUEUE_ID。
微型端口驱动程序必须保留已分配接收筛选器的筛选器标识符。 NDIS 在后面的 OID 请求中使用筛选器的标识符来更改接收筛选器参数或清除接收筛选器。
微型端口驱动程序收到 OID_RECEIVE_FILTER_QUEUE_ALLOCATION_COMPLETE 请求,并在队列上设置了筛选器后,队列处于 运行 状态。 在此状态下,微型端口驱动程序可以通过调用 NdisMIndicateReceiveNetBufferLists来启动队列中的数据包指示。
SR-IOV 接口的其他准则
以下几点适用于支持 SR-IOV 接口的微型端口驱动程序:
对于 SR-IOV 接口,在默认或非默认虚拟端口(VPort)上创建接收队列。
注意 从 Windows Server 2012 开始,SR-IOV 接口仅支持 VPort 的默认接收队列。
通过 OID_NIC_SWITCH_CREATE_VPORT的 OID 集请求分配 SR-IOV VPort 后,过度分配驱动程序可以使用 OID_RECEIVE_FILTER_SET_FILTER 的 OID 请求在 VPort 上设置筛选器。
注意 只有分配 VPort 的过度驱动程序才能在该 VPort 上设置筛选器。
由于默认 VPort 始终存在,因此过度应用驱动程序始终可以在默认 VPort 上设置筛选器。
创建 VPort 时,不会为其设置任何接收筛选器。 在这种情况下,微型端口驱动程序在微型端口驱动程序收到 VPort OID_RECEIVE_FILTER_SET_FILTER的 OID 请求之前,不得指示该 VPort 上的任何接收数据包。 发出此 OID 请求后,微型端口驱动程序可以指示该 VPort 上的数据包。
注意 如果微型端口驱动程序在处理 OID_RECEIVE_FILTER_SET_FILTER 的 OID 请求时指示 VPort 上的数据包,则必须完成 OID 请求并返回NDIS_STATUS_SUCCESS状态代码。
VMQ 接口的其他准则
以下几点适用于支持 VMQ 接口的微型端口驱动程序:
分配 VMQ 接收队列后,过度分配驱动程序可以在接收队列上设置筛选器,并发出 OID 请求OID_RECEIVE_FILTER_SET_FILTER。
注意 只有分配接收队列的协议驱动程序才能在该队列上设置筛选器。
由于默认队列始终存在,因此过度配置驱动程序始终可以在默认队列上设置筛选器。 如果网络适配器支持放置队列,过度放置驱动程序可以在放置队列上设置筛选器。
过度放置驱动程序不拥有默认队列或删除队列。 因此,绑定到网络适配器的所有协议驱动程序都使用默认队列或删除队列。
创建接收队列时,不会为其设置接收筛选器。 在这种情况下,微型端口驱动程序在微型端口驱动程序收到接收队列OID_RECEIVE_FILTER_SET_FILTER的 OID 请求之前,不得指示该接收队列上的任何接收数据包。 发出此 OID 请求后,微型端口驱动程序可以指示该接收队列上的数据包。
注意 如果微型端口驱动程序在处理 OID_RECEIVE_FILTER_SET_FILTER 的 OID 请求时指示队列上的数据包,则它必须完成 OID 请求并返回NDIS_STATUS_SUCCESS状态代码。
返回状态代码
微型端口驱动程序为 OID_RECEIVE_FILTER_SET_FILTER 的 OID 方法请求返回以下状态代码之一:
NDIS_STATUS_SUCCESS
筛选器已成功在队列上设置。 信息缓冲区包含更新 NDIS_RECEIVE_FILTER_PARAMETERS 结构。
NDIS_STATUS_PENDING
请求正在等待完成。 最终状态代码和结果将传递给调用方 OID 请求完成处理程序。
NDIS_STATUS_INVALID_PARAMETER
提供过度驱动程序的一个或多个参数无效。
NDIS_STATUS_INVALID_LENGTH
信息缓冲区太短。 NDIS 设置 数据。METHOD_INFORMATION。NDIS_OID_REQUEST 结构中的 BytesNeeded 成员达到所需的最小缓冲区大小。
NDIS_STATUS_NOT_SUPPORTED
微型端口驱动程序的 NDIS 版本低于 6.20。
NDIS_STATUS_FAILURE
由于其他原因,请求失败。
要求
版本 |
NDIS 6.20 及更高版本中受支持。 |
页眉 |
Ntddndis.h (包括 Ndis.h) |
另请参阅
NdisMIndicateReceiveNetBufferLists
NDIS_RECEIVE_FILTER_PARAMETERS
NET_BUFFER_LIST_RECEIVE_FILTER_ID