确定网络适配器的 VMQ 功能
NDIS 提供接口来确定网络适配器的 VMQ 功能,例如:
网络适配器的通用筛选功能。
支持的 VM 队列功能。
支持将网络数据内存拆分为两个单独的缓冲区。
注意 从 NDIS 6.30 开始,不再支持将数据包拆分为单独的观察缓冲区。
微型端口驱动程序在网络适配器初始化期间向 NDIS 提供以下信息:
网络适配器可以支持的 VMQ 硬件功能。
当前已启用的 VMQ 功能。
在网络适配器上启用或禁用的全局接收筛选功能。
过分的驱动程序和应用程序可以使用以下 OID 查询请求来获取网络适配器功能。
OID_RECEIVE_FILTER_HARDWARE_CAPABILITIES
OID_RECEIVE_FILTER_CURRENT_CAPABILITIES
OID_RECEIVE_FILTER_GLOBAL_PARAMETERS
NDIS 处理微型端口驱动程序的这些 OID 查询请求。 因此,不会为微型端口驱动程序请求查询。 NDIS 报告初始化期间网络适配器当前启用的接收 VMQ 功能。 因此,过度覆盖的驱动程序不必查询这些 OID。
NDIS_RECEIVE_FILTER_CAPABILITIES结构指定网络适配器的筛选功能。 此结构按以下方式使用:
当 NDIS 调用 MiniportInitializeEx 函数时,微型端口驱动程序通过初始化 NDIS_RECEIVE_FILTER_CAPABILITIES 结构来注册其筛选功能。 然后,驱动程序将 NDIS_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES 结构的 HardwareReceiveFilterCapabilities 成员设置为指向 NDIS_RECEIVE_FILTER_CAPABILITIES 结构。 接下来,驱动程序调用 NdisMSetMiniportAttributes 函数,然后将 MiniportAttributes 参数设置为指向 NDIS_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES 结构的指针。
当 NDIS 调用驱动程序的 ProtocolBindAdapterEx 函数时,覆盖协议驱动程序接收NDIS_BIND_PARAMETERS结构中的NDIS_RECEIVE_FILTER_CAPABILITIES结构。
当 NDIS 调用驱动程序的 FilterAttach 函数时,覆盖筛选器驱动程序接收NDIS_FILTER_ATTACH_PARAMETERS结构中的NDIS_RECEIVE_FILTER_CAPABILITIES结构。
过分驱动程序通过发出OID_RECEIVE_FILTER_CURRENT_CAPABILITIES或OID_RECEIVE_FILTER_HARDWARE_CAPABILITIES的 OID 查询请求来接收NDIS_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES结构。 HardwareReceiveFilterCapabilities 和 CurrentReceiveFilterCapabilities 成员指向NDIS_RECEIVE_FILTER_CAPABILITIES结构。
NDIS_RECEIVE_FILTER_CAPABILITIES 结构包括以下信息:
EnabledFilterTypes
支持的接收筛选器的类型。 NDIS_RECEIVE_FILTER_VMQ_FILTERS_ENABLED标志指定启用虚拟机队列 (VMQ) 筛选器。
EnabledQueueTypes
支持的接收队列的类型。 NDIS_RECEIVE_FILTER_VM_QUEUES_ENABLED标志指定启用虚拟机 (VM) 队列。
NumQueues
网络适配器支持的接收队列数。 若要支持 VMQ,此数字必须等于或小于 NIC 支持的单播 MAC 地址数。 此数字不得包含默认队列。
注意 网络适配器支持的单播 MAC 地址或 VM 队列数不包括关联 NIC 的 MAC 地址。
SupportedQueueProperties
网络适配器支持的队列属性。 NDIS_RECEIVE_FILTER_VM_QUEUE_SUPPORTED标志指定网络适配器提供支持 VMQ 筛选的最低要求。 支持 VMQ 的 NIC 必须为每个接收队列提供 MSI-X 表条目。 因此,VMQ 微型端口驱动程序必须设置NDIS_RECEIVE_FILTER_MSI_X_SUPPORTED标志。
SupportedFilterTests
微型端口驱动程序支持的筛选器测试操作。 例如,网络适配器支持测试所选标头字段以确定它是否等于给定值。 VMQ 微型端口驱动程序必须设置NDIS_RECEIVE_FILTER_TEST_HEADER_FIELD_EQUAL_SUPPORTED标志。
SupportedHeaders
微型端口驱动程序可以检查的网络数据包标头的类型。 例如,网络适配器可以检查网络数据包的 MAC 标头。 MAC 标头包括数据包类型、目标和源 MAC 地址、VLAN 标识符以及优先级标记字段。 VMQ 微型端口驱动程序必须设置NDIS_RECEIVE_FILTER_MAC_HEADER_SUPPORTED标志。
SupportedMacHeaderFields
微型端口驱动程序可以检查的 MAC 标头字段的类型。 VMQ 微型端口驱动程序必须设置NDIS_RECEIVE_FILTER_MAC_HEADER_DEST_ADDR_SUPPORTED标志。
MaxMacHeaderFilters
微型端口驱动程序支持的 MAC 标头筛选器的最大数目。 标头筛选器数量至少应与 VM 队列数量一样多。
MaxQueueGroups
此成员是为 NDIS 保留的。
MaxQueuesPerQueueGroup
此成员是为 NDIS 保留的。
MinLookaheadSplitSize
网络适配器支持查找数据包段的最小大小(以字节为单位)。
注意 从 NDIS 6.30 开始,不再支持将数据包拆分为单独的观察缓冲区。 支持 NDIS 6.30 或更高版本的微型端口驱动程序必须将此成员设置为零。
MaxLookaheadSplitSize
网络适配器支持用于查找数据包段的最大大小(以字节为单位)。
注意 从 NDIS 6.30 开始,不再支持将数据包拆分为单独的观察缓冲区。 支持 NDIS 6.30 或更高版本的微型端口驱动程序必须将此成员设置为零。
从 OID_RECEIVE_FILTER_HARDWARE_CAPABILITIES OID 查询成功返回后,NDIS_OID_REQUEST 结构的 InformationBuffer 成员包含指向 NDIS_RECEIVE_FILTER_CAPABILITIES 结构的指针。 这些功能可能包括当前由 INF 文件设置或通过 “高级 属性”页禁用的 VMQ 硬件功能。 有关 VMQ INF 文件设置的详细信息,请参阅 VMQ 标准 INF 条目。
NDIS 微型端口驱动程序在 NDIS_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES 结构的 HardwareReceiveFilterCapabilities 成员中提供初始化期间接收筛选硬件功能。
从 OID_RECEIVE_FILTER_CURRENT_CAPABILITIES OID 查询成功返回后,NDIS_OID_REQUEST 结构的 InformationBuffer 成员包含指向 NDIS_RECEIVE_FILTER_CAPABILITIES 结构的指针。 这些功能包括当前启用的 VMQ 功能。
NDIS 微型端口驱动程序在 NDIS_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES 结构的 CurrentReceiveFilterCapabilities 成员中提供初始化期间当前启用的接收筛选功能。
在绑定操作期间,NDIS 将基础网络适配器当前启用的接收筛选功能报告给 NDIS_BIND_PARAMETERS 结构的 ReceiveFilterCapabilities 成员中的过度协议驱动程序。
NDIS_RECEIVE_FILTER_GLOBAL_PARAMETERS 结构用于OID_RECEIVE_FILTER_GLOBAL_PARAMETERS查询 OID 以获取当前的全局接收筛选器设置。
NDIS_RECEIVE_FILTER_GLOBAL_PARAMETERS包括以下信息:
EnabledFilterTypes
已启用的接收筛选器的类型。 NDIS_RECEIVE_FILTER_VMQ_FILTERS_ENABLED标志指定启用虚拟机队列 (VMQ) 筛选器。
EnabledQueueTypes
已启用的接收队列的类型。 NDIS_RECEIVE_FILTER_VM_QUEUES_ENABLED标志指定启用虚拟机 (VM) 队列。
从 OID_RECEIVE_FILTER_GLOBAL_PARAMETERS OID 查询成功返回后,NDIS_OID_REQUEST 结构的 InformationBuffer 成员包含指向 NDIS_RECEIVE_FILTER_GLOBAL_PARAMETERS 结构的指针。 NDIS_RECEIVE_FILTER_GLOBAL_PARAMETERS结构指定在网络适配器上启用或禁用的接收筛选功能。
NDIS 协议驱动程序使用 OID_RECEIVE_FILTER_GLOBAL_PARAMETERS 查询当前全局配置参数,以便在网络适配器上接收筛选。 例如,协议驱动程序可以使用此 OID 来确定是启用或禁用接收筛选器或接收队列的类型。