指定数据包合并接收筛选器

过度分配的驱动程序可以在支持 NDIS 数据包合并的微型端口驱动程序上设置一个或多个接收筛选器。 超载驱动程序最多可以指定在 NDIS_RECEIVE_FILTER_CAPABILITIES 结构的 MaxPacketCoalescingFilters 成员中指定的微型端口驱动程序的最大接收筛选器数。

注意 覆盖协议驱动程序获取 NDIS_BIND_PARAMETERS 结构中的 NDIS_RECEIVE_FILTER_CAPABILITIES 结构。 过度筛选驱动程序获取 NDIS_FILTER_ATTACH_PARAMETERS 结构中的 NDIS_RECEIVE_FILTER_CAPABILITIES 结构。

过度使用的驱动程序通过发出 OID_RECEIVE_FILTER_SET_FILTER 的 OID 方法请求,将筛选器下载到微型端口驱动程序。 此 OID 请求的 NDIS_OID_REQUEST 结构的 InformationBuffer 成员包含指向调用方分配的缓冲区的指针。 此缓冲区的格式设置为包含以下内容:

指定接收筛选器

过度分配驱动程序通过使用筛选器的配置参数初始化 NDIS_RECEIVE_FILTER_PARAMETERS 结构来指定数据包合并接收筛选器。 初始化 NDIS_RECEIVE_FILTER_PARAMETERS 结构时,过度的驱动程序必须遵循以下规则:

  • FilterType 成员必须设置为 NdisReceiveFilterTypePacketCoalescing的 NDIS_RECEIVE_FILTER_TYPE 枚举值。

  • QueueId 成员必须设置为 NDIS_DEFAULT_RECEIVE_QUEUE_ID。

    注意 从 NDIS 6.30 开始,数据包合并接收筛选器仅在网络适配器的默认接收队列上受支持。 此接收队列的标识符为 NDIS_DEFAULT_RECEIVE_QUEUE_ID。

  • 如果覆盖驱动程序正在创建新的接收筛选器,则必须将 FilterId 成员设置为 NDIS_DEFAULT_RECEIVE_FILTER_ID。

    注意 在将OID_RECEIVE_FILTER_SET_FILTER的 OID 方法请求转发到微型端口驱动程序之前,NDIS 将为接收筛选器生成唯一的筛选器标识符 (ID) 。  

  • 如果覆盖驱动程序正在修改现有接收筛选器,则必须将 FilterId 成员设置为接收筛选器的非零筛选器 ID。 过度分配驱动程序在发出 OID_RECEIVE_FILTER_ENUM_FILTERS 的 OID 方法请求时获取接收筛选器的筛选器 ID。 有关如何修改接收筛选器的详细信息,请参阅 修改数据包合并接收筛选器

  • 必须设置 NDIS_RECEIVE_FILTER_PARAMETERS 结构的 FieldParametersArrayOffsetFieldParametersArrayNumElementsFieldParametersArrayElementSize 成员来定义字段参数的数组。 数组中的每个元素都是 一个NDIS_RECEIVE_FILTER_FIELD_PARAMETERS 结构,用于指定接收筛选器的标头字段测试的参数。

  • RequestedFilterIdBitCount 成员必须设置为零。

  • MaxCoalescingDelay 必须设置为与接收筛选器匹配的第一个数据包在网络适配器上保存并合并的最长时间(以毫秒为单位)。 一旦收到与筛选器匹配的第一个数据包,网络适配器就会合并数据包并启动硬件计时器,其过期时间设置为 MaxCoalescingDelay 成员的值。

过度分配驱动程序必须将字段参数数组中的标头字段测试排序为与数据包中关联的 MAC 和协议标头存在的相同顺序。

例如,在超载驱动程序指定 IP 版本 4 (IPv4) 协议字段的筛选器参数之前,它必须先 (NdisMacHeaderFieldProtocol) 指定 MAC 标头协议字段的筛选器参数。 通过这种方式,驱动程序指定标头字段测试,用于验证字段是否设置为正确的 EtherType 值, (0x0800) IPv4 数据包。 如果测试失败,适配器不必执行 IPV4 协议字段的测试。

指定标头字段测试

每个接收筛选器可以指定一个或多个测试条件 (标头字段测试) 。 网络适配器执行这些测试以确定收到的数据包是否应合并到适配器上的硬件合并缓冲区中。 此外,超载驱动程序可以为各种媒体访问控制指定单独的筛选器测试, (MAC) 、IP 版本 4 (IPv4) 和 IP 版本 6 (IPv6) 标头字段。

为了优化对网络适配器的筛选,标头字段测试基于标准化标头字段名称,而不是数据包数据中的字节偏移/长度规范。 通过使用标头/字段名称,网络适配器的硬件或固件可以优化对收到的数据包执行多个标头字段测试的方式。

每个接收筛选器可以包含由 NDIS_RECEIVE_FILTER_FIELD_PARAMETERS 结构指定的一个或多个标头字段测试。 每个NDIS_RECEIVE_FILTER_FIELD_PARAMETERS结构都是字段参数数组的一个元素,由NDIS_RECEIVE_FILTER_PARAMETERS结构的 FieldParametersArrayOffsetFieldParametersArrayNumElementsFieldParametersArrayElementSize 成员引用。

微型端口驱动程序在处理 OID_RECEIVE_FILTER_SET_FILTER的 OID 方法请求时必须遵循以下准则:

  • 如果在 NDIS_RECEIVE_FILTER_FIELD_PARAMETERS 结构的 Flags 成员中设置了 NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO 标志,则网络适配器必须仅指示接收的具有匹配 MAC 地址的数据包和未标记的数据包或 VLAN 标识符为零的数据包。 也就是说,网络适配器不得指示具有匹配 MAC 地址和非零 VLAN 标识符的数据包。

  • 如果未设置 NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO 标志,并且没有通过 OID_RECEIVE_FILTER_SET_FILTER 的 OID 集请求配置的 VLAN 标识符筛选器,微型端口驱动程序必须执行以下操作之一:

    • 如果微型端口驱动程序支持 NDIS 6.20,则它必须为 OID_RECEIVE_FILTER_SET_FILTER的 OID 请求返回失败状态。

    • 如果微型端口驱动程序支持 NDIS 6.30 或更高版本的 NDIS,则必须配置网络适配器以检查和筛选指定的 MAC 地址字段。 如果接收的数据包中存在 VLAN 标记,则网络适配器必须将其从数据包数据中删除。 微型端口驱动程序必须将 VLAN 标记放在与数据包 NET_BUFFER_LIST 结构关联的 NDIS_NET_BUFFER_LIST_8021Q_INFO 中。

  • 如果覆盖驱动程序在 NDIS_RECEIVE_FILTER_PARAMETERS 结构中设置 MAC 地址筛选器和 VLAN 标识符筛选器,则它不会在任一筛选器字段中设置 NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO 标志。 在这种情况下,微型端口驱动程序应指示与指定的 MAC 地址和 VLAN 标识符匹配的数据包。 也就是说,微型端口驱动程序不应指示具有零 VLAN 标识符或未标记数据包的匹配 MAC 地址的数据包。