OID_RECEIVE_FILTER_SET_FILTER
覆盖驱动程序发出OID_RECEIVE_FILTER_SET_FILTER的 OID 方法请求,以在网络适配器上设置筛选器。
NDIS_OID_REQUEST 结构的 InformationBuffer 成员包含指向调用方分配的缓冲区的指针。 此缓冲区的格式设置为包含以下内容:
一个NDIS_RECEIVE_FILTER_PARAMETERS结构,用于指定 NDIS 接收筛选器的参数。
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 接口的微型端口驱动程序是必需的。
overlying 驱动程序使用其请求的筛选器配置初始化 NDIS_RECEIVE_FILTER_PARAMETERS 结构。 NDIS 在 NDIS_RECEIVE_FILTER_PARAMETERS 结构的 FilterId 成员中分配筛选器标识符,并将方法请求传递给基础微型端口驱动程序。
在接收队列上设置的每个筛选器都具有网络适配器的唯一筛选器标识符。 也就是说,筛选器标识符不会在网络适配器管理的不同队列上重复。 当 NDIS 收到 OID 请求以在接收队列上设置筛选器时,它会验证筛选器参数。 NDIS 分配必要的资源和筛选器标识符后,会将 OID 请求提交到基础网络适配器。 如果网络适配器可以成功为筛选器分配必要的软件和硬件资源,则会以返回状态NDIS_STATUS_SUCCESS完成 OID 请求。
注意 从 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 后,过度分配驱动程序可以在 VPort 上设置筛选器,OID 请求为 OID_RECEIVE_FILTER_SET_FILTER。
注意 只有分配了 VPort 的过度驱动程序才能在该 VPort 上设置筛选器。
由于默认 VPort 始终存在,因此过分的驱动程序始终可以在默认 VPort 上设置筛选器。
创建 VPort 时,不会对它设置任何接收筛选器。 在这种情况下,微型端口驱动程序不得在微型端口驱动程序收到针对 VPort 的 OID 请求OID_RECEIVE_FILTER_SET_FILTER之前指示该 VPort 上的任何接收数据包。 发出此 OID 请求后,微型端口驱动程序可以指示该 VPort 上的数据包。
注意 如果微型端口驱动程序在处理 OID_RECEIVE_FILTER_SET_FILTER 的 OID 请求时指示 VPort 上的数据包,则必须完成 OID 请求并返回NDIS_STATUS_SUCCESS状态代码。
VMQ 接口的其他准则
以下几点适用于支持 VMQ 接口的微型端口驱动程序:
分配 VMQ 接收队列后,过度分配驱动程序可以在接收队列上设置筛选器,OID 请求为 OID_RECEIVE_FILTER_SET_FILTER。
注意 只有分配了接收队列的协议驱动程序才能在该队列上设置筛选器。
由于默认队列始终存在,因此过分的驱动程序始终可以在默认队列上设置筛选器。 如果网络适配器支持放置队列,则过分的驱动程序可以在放置队列上设置筛选器。
过分的驱动程序不拥有默认队列或删除队列。 因此,绑定到网络适配器的所有协议驱动程序都使用默认队列或删除队列。
创建接收队列时,不会对它设置任何接收筛选器。 在这种情况下,微型端口驱动程序在接收接收队列的 OID 请求OID_RECEIVE_FILTER_SET_FILTER之前,不得指示该接收队列上的任何接收数据包。 发出此 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