处理数据包合并接收筛选器

多个接收筛选器通过 OID_RECEIVE_FILTER_SET_FILTER的 OID 方法请求下载到微型端口驱动程序。 每个筛选器可以指定一个或多个测试, (标头字段测试) 网络适配器使用该测试来确定接收的数据包是否应合并到适配器上的硬件合并缓冲区中。

在微型端口驱动程序使用接收筛选器配置网络适配器之前,驱动程序应根据适配器的硬件功能优化接收筛选器。 例如,所有接收筛选器都需要 MAC 标头的标头字段测试。 因此,驱动程序可以根据此测试结果优化筛选规则。 这允许适配器确定哪个开放系统互连 (OSI) 第 3 层 (L3) 和第 4 层 (L4) 标头字段测试。

一旦网络适配器配置了接收筛选器,它必须执行以下操作:

  • 特定筛选器的所有标头字段测试参数都必须在接收的数据包上匹配,以便合并合并缓冲区中的数据包。

    网络适配器将接收筛选器的所有标头字段测试的结果与逻辑 AND 操作相结合。 也就是说,如果接收筛选器的 NDIS_RECEIVE_FILTER_FIELD_PARAMETERS 结构数组中包含的任何标头字段测试失败,则接收的数据包不符合指定的筛选条件,并且不得合并。

  • 网络适配器仅根据指定的标头字段测试参数检查数据包数据。 适配器必须忽略数据包中未指定标头字段测试的所有标头字段。

  • 如果收到的数据包与任何接收筛选器的所有标头字段测试匹配,则网络适配器必须在硬件合并缓冲区内合并数据包。 合并第一个数据包后,网络适配器必须启动硬件计时器,并且必须将过期时间设置为匹配接收筛选器NDIS_RECEIVE_FILTER_PARAMETERS结构的 MaxCoalescingDelay 成员的值。

  • 随着收到与数据包合并接收筛选器匹配的数据包越来越多,网络适配器会将这些数据包放入合并缓冲区。

    如果硬件计时器已在运行,则适配器不得停止或重启匹配接收筛选器的计时器。 但是,适配器可以使用匹配接收筛选器的最小过期值配置硬件计时器。 例如,当驱动程序收到与接收筛选器 X 匹配的数据包时,适配器将使用该接收筛选器的指定过期值启动计时器。 如果适配器随后收到与接收筛选器 Y 匹配的数据包,则适配器可以使用该接收筛选器的指定过期值重新配置硬件计时器。

    注意 如果计时器上剩余的时间小于接收筛选器的过期时间,则网络适配器不得重新配置硬件计时器。

  • 一旦收到的数据包被合并,如果发生以下任何事件,网络适配器就会生成中断:

    • 如果硬件合并缓冲区中的可用空间达到特定于硬件的低水位线,则网络适配器必须生成接收中断,以便微型端口驱动程序可以处理合并的接收数据包。

    • 如果用于硬件合并缓冲区的硬件计时器过期,网络适配器必须生成接收中断,以便微型端口驱动程序可以处理合并的接收数据包。

    • 如果清除了接收筛选器,并且已合并与该筛选器匹配的数据包,则网络适配器必须生成接收中断,以便微型端口驱动程序可以处理合并的接收数据包。

    • 如果收到的数据包与任何接收筛选器都不匹配,则网络适配器必须生成接收中断,以便微型端口驱动程序可以处理接收的数据包。 如果已合并任何数据包,微型端口驱动程序还必须处理这些数据包。

    • 如果网络适配器为接收中断以外的任何其他中断状态生成中断,则网络适配器还必须发出接收中断状态的信号,以便微型端口驱动程序可以处理合并的已接收数据包。

    一旦生成中断,网络适配器必须停止硬件计时器(如果它尚未过期),并且必须清除硬件合并缓冲区。

微型端口驱动程序必须维护合并的数据包计数器,该计数器包含与数据包合并筛选器匹配的已接收数据包数的值。 NDIS 通过 OID_PACKET_COALESCING_FILTER_MATCH_COUNT 的 OID 查询请求查询此计数器。

当硬件处于全功率状态时,网络适配器仅执行数据包合并。 当硬件处于低功耗状态时,适配器必须仅根据已通过 OID_PNP_ENABLE_WAKE_UP的 OID 集请求卸载到适配器的唤醒模式筛选收到的数据包。

当网络适配器转换为全功率状态时,微型端口驱动程序必须遵循以下步骤:

  • 微型端口驱动程序必须将网络适配器配置为放弃硬件合并缓冲区内的任何合并数据包。 网络适配器在转换为低功耗状态时可能合并了这些数据包。

  • 微型端口驱动程序必须使用在低功耗转换之前下载到驱动程序的数据包合并接收筛选器集来配置网络适配器。

  • 微型端口驱动程序必须清除合并的数据包计数器。