确定接收筛选功能

本主题介绍 NDIS 和过分驱动程序如何确定支持单根 I/O 虚拟化 (SR-IOV) 的网络适配器的接收筛选功能。 本主题包含以下信息:

MiniportInitializeEx 期间的报告接收筛选功能

通过过度覆盖驱动程序来查询接收筛选功能

注意 只有 PCI Express (PCIe) 物理功能 (PF) SR-IOV 网络适配器的微型端口驱动程序才能报告接收筛选功能。 PCIe 虚拟函数的微型端口驱动程序 (VF) 不得报告 SR-IOV 适配器的接收筛选功能。

MiniportInitializeEx 期间的报告接收筛选功能

当 NDIS 调用 PF 微型端口驱动程序的 MiniportInitializeEx 函数时,驱动程序提供以下接收筛选功能:

  • 网络适配器可以支持的完整硬件接收筛选功能。

  • 当前在网络适配器上启用的接口的接收筛选功能。

微型端口驱动程序通过按以下方式初始化的 NDIS_RECEIVE_FILTER_CAPABILITIES 结构报告基础网络适配器的完整硬件接收筛选功能:

  1. 微型端口驱动程序初始化 标头 成员。 驱动程序将 HeaderType 成员设置为 NDIS_OBJECT_TYPE_DEFAULT。

    从 NDIS 6.30 开始,微型端口驱动程序将 HeaderRevision 成员设置为 NDIS_RECEIVE_FILTER_CAPABILITIES_REVISION_2,将 Size 成员设置为 NDIS_SIZEOF_RECEIVE_FILTER_CAPABILITIES_REVISION_2。

  2. 微型端口驱动程序将 NDIS_RECEIVE_FILTER_CAPABILITIES 结构的其他成员设置为 SR-IOV 网络适配器的接收筛选功能的值范围。 例如,微型端口驱动程序在 SupportedFilterTests 中设置相应的标志,以指定微型端口驱动程序支持的筛选器测试操作。

  3. 除了 SR-IOV 外,接收筛选还用于以下接口:

    如果微型端口驱动程序支持其中任何接口,则它还必须将 NDIS_RECEIVE_FILTER_CAPABILITIES 结构的成员设置为特定于接口的接收筛选功能值的范围。 例如,如果驱动程序支持 NDIS 数据包合并和 SR-IOV,则必须在 SupportedQueueProperties 成员中设置NDIS_RECEIVE_FILTER_PACKET_COALESCING_SUPPORTED_ON_DEFAULT_QUEUE标志。

微型端口驱动程序通过按以下方式初始化的 NDIS_RECEIVE_FILTER_CAPABILITIES 结构报告基础网络适配器当前启用的接收筛选功能:

  1. 微型端口驱动程序初始化 标头 成员。 驱动程序将 HeaderType 成员设置为 NDIS_OBJECT_TYPE_DEFAULT。

    从 NDIS 6.30 开始,微型端口驱动程序将 HeaderRevision 成员设置为 NDIS_RECEIVE_FILTER_CAPABILITIES_REVISION_2,将 Size 成员设置为 NDIS_SIZEOF_RECEIVE_FILTER_CAPABILITIES_REVISION_2。

  2. 微型端口驱动程序将 NDIS_RECEIVE_FILTER_CAPABILITIES 结构的其他成员设置为当前启用的接口的接收筛选功能的值范围。 例如,如果启用了 NDIS 数据包合并,则驱动程序必须仅设置特定于此技术的成员。

    使用接收筛选的接口通过标准化 INF 关键字启用或禁用。 有关如何启用 NDIS 数据包合并的详细信息,请参阅 数据包合并的标准化 INF 关键字。 有关如何启用 SR-IOV 和 VMQ 的详细信息,请参阅 处理 SR-IOV、VMQ 和 RSS 标准化 INF 关键字

当 NDIS 调用微型端口驱动程序的 MiniportInitializeEx 函数时,驱动程序会按照以下步骤注册网络适配器的接收筛选功能:

  1. 微型端口驱动程序初始化 NDIS_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES 结构。

    微型端口驱动程序将 HardwareReceiveFilterCapabilities 成员设置为 NDIS_RECEIVE_FILTER_CAPABILITIES 结构的地址。 此结构以前是使用网络适配器的完整硬件接收筛选功能初始化的。

  2. 如果 VMQ、SR-IOV 和 NDIS 数据包合并当前都在网络适配器上禁用,微型端口驱动程序会将 CurrentReceiveFilterCapabilities 成员设置为 NULL。

  3. 如果当前在网络适配器上启用了 VMQ、SR-IOV 或 NDIS 数据包合并,微型端口驱动程序必须执行以下操作:

    • 微型端口驱动程序必须使用当前在网络适配器上启用的接口的当前接收筛选功能初始化另一个 NDIS_RECEIVE_FILTER_CAPABILITIES 结构。

      如果启用了 SR-IOV 接口,则在某些情况下,微型端口驱动程序必须将 NDIS_RECEIVE_FILTER_CAPABILITIES 结构的成员设置为相同或不同的值。 这是因为 SR-IOV 接口提供与 VMQ 类似的排队机制,但使用虚拟端口 (VPorts) 而不是 VM 接收队列。

      例如,如果启用了 VMQ 或 SR-IOV 接口,微型端口驱动程序必须在 EnabledFilterTypes 成员中设置NDIS_RECEIVE_FILTER_VMQ_FILTERS_ENABLED标志。 但是,如果启用了 SR-IOV 接口,微型端口驱动程序必须将 NumQueues 成员设置为零,如果启用了 VMQ 接口,则必须将非零值。

    • 微型端口驱动程序将 CurrentReceiveFilterCapabilities 成员设置为包含当前启用接口的当前接收筛选功能的 NDIS_RECEIVE_FILTER_CAPABILITIES 结构的地址。

  4. 如果当前在网络适配器上启用了 VMQ、SR-IOV 或 NDIS 数据包合并,则微型端口驱动程序会将 HardwareReceiveFilterCapabilities 成员设置为 NDIS_RECEIVE_FILTER_CAPABILITIES 结构的地址。 此结构以前是使用网络适配器当前启用的接收筛选功能初始化的。

  5. 驱动程序调用 NdisMSetMiniportAttributes 并将 MiniportAttributes 参数设置为指向 NDIS_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES 结构的指针。

有关适配器初始化过程的详细信息,请参阅 初始化微型端口适配器

通过过度覆盖驱动程序来查询接收筛选功能

NDIS 通过以下方式将网络适配器当前启用的接收筛选功能传递给绑定到网络适配器的驱动程序:

当 NDIS 处理对象标识符 (OID) 查询OID_RECEIVE_FILTER_CURRENT_CAPABILITIES或筛选器驱动程序发出的OID_RECEIVE_FILTER_CURRENT_CAPABILITIES和OID_RECEIVE_FILTER_HARDWARE_CAPABILITIES的请求时,也会返回NDIS_RECEIVE_FILTER_CAPABILITIES结构。