在 VPort 上启用、禁用和更新 VMMQ

创建 VPort 后,上层驱动程序可以启用、禁用或更新 VPort 的 RSS 参数。

驱动程序可以更新 VPort 的 RSS 间接寻址表,以 更改 VPort 的数字队列。 但是,VPort 的 RSS 哈希类型、哈希函数和哈希密钥被视为静态参数,在 VPort 的生存期内不会由超载驱动程序更改。 如果上层驱动程序希望更改任何 RSS 静态参数,则必须删除并重新创建 VPort。

上层驱动程序通过发出 OID_GEN_RECEIVE_SCALE_PARAMETERS OID 请求来启用、禁用或更改 VPort 的 RSS 参数。 上层驱动程序将NDIS_OID_REQUEST结构中的 VPortId 字段设置为新配置的目标 VPort 的 ID。

上层驱动程序还会设置 OID 请求中使用的 NDIS_RECEIVE_SCALE_PARAMETERS 结构,如下所示。 请注意,根据基础微型端口适配器播发的 VMMQ 功能,对于所有 PF VPort,某些字段可能会设置为相同的值。

  • HeaderRevision 成员设置为NDIS_RECEIVE_SCALE_PARAMETERS_REVISION_3

  • 设置NDIS_RSS_PARAM_FLAG_DEFAULT_PROCESSOR_UNCHANGED标志以指定 DefaultProcessorNumber 成员未更改。

  • BaseCpuNumber 设置为

  • 设置 DefaultProcessorNumber 以指定此 VPort 的默认 RSS 处理器。 微型端口可以假定默认处理器是 RSS 处理器列表的一部分,但不能假定默认 RSS 处理器位于当前间接表。

  • 设置 HashInformation 以指示 NIC 应用于计算为此 VPort 接收的数据包的哈希值的哈希类型和哈希函数。 上层驱动程序可能会为每个 VPort 将此字段设置为不同的值。

  • 设置 IndirectionTableSize 以指定间接寻址表的大小(以字节为单位)。 将此字段设置为所有 PF VPort 的相同值。 上层驱动程序必须确保间接寻址表中的条目数为 2 的幂。

  • 设置 IndirectionTableOffset 以指定间接寻址表从 NDIS_RECEIVE_SCALE_PARAMETERS 结构开头的偏移量。

  • 设置 HashSecretKeySize 以指定哈希密钥的大小(以字节为单位)。 如果微型端口适配器支持,则上层驱动程序可能会为每个 VPort 设置不同的密钥。 有关详细信息,请参阅 播发 VMMQ 功能

  • 设置 HashSecretKeyOffset 以指定哈希密钥从 NDIS_RECEIVE_SCALE_PARAMETERS 结构开头的偏移量。 如果微型端口适配器支持,则上层驱动程序可能会为每个 VPort 设置不同的密钥。 有关详细信息,请参阅 播发 VMMQ 功能

  • 适当设置 ProcessorMaskOffsetNumberOfProcessorMasksProcessorMasksEntrySize

当微型端口驱动程序收到禁用 VPort 的 VMMQ 的 OID 请求时,它应还原指示在OID_NIC_SWITCH_CREATE_VPORT OID 请求中使用的 NDIS_NIC_SWITCH_VPORT_PARAMETERS处理器上由 processorAffinity 字段指定的处理器上为该 VPort 接收的所有数据包。

更改 VPort 的队列数

在 VPort 的间接表中使用的唯一处理器数不能超过上次发出的OID_NIC_SWITCH_CREATE_VPORT OID 请求中指定的NDIS_NIC_SWITCH_VPORT_PARAMETERS结构的 NumQueuePairs 字段的值。 这些处理器将是调用 NdisGetRssProcessorInformation 返回的 RSS 处理器集的子集。 有关详细信息,请参阅为 VMMQ 分配 VPort。 但是,不同 VPort 上的间接寻址表可能包含相同的处理器。

若要减少 PF VPort 的队列数,上层驱动程序必须:

  1. 发送具有原始间接表大小的 OID_GEN_RECEIVE_SCALE_PARAMETERS OID。 但是,此步骤中的间接寻址表只能引用不同处理器的数量,直到新的队列数。 如果由于 NDIS_NIC_SWITCH_PARAMETERS 结构的NDIS_NIC_SWITCH_CAPS_RSS_PER_PF_VPORT_INDIRECTION_TABLE_SIZE_RESTRICTED标志,新的间接表需要小于原始表,颁发者必须保证此步骤中的间接表将包含根据需要多次复制的新间接表,以满足原始队列数的 RESTRICTED 标志要求。

  2. 使用新队列数发送 OID_NIC_SWITCH_VPORT_PARAMETERS OID。

  3. 发送具有新间接表大小的OID_GEN_RECEIVE_SCALE_PARAMETERS(如果已更改)。

若要增加 PF VPort 的队列数,上层驱动程序必须:

  1. 驱动程序不需要在步骤 2 之前更新当前间接寻址表,因为该表仅引用到当前队列数的不同处理器数。

  2. 使用新队列数发送 OID_NIC_SWITCH_VPORT_PARAMETERS OID。 如果设置了 RESTRICTED 标志,微型端口驱动程序应在内部根据需要多次复制原始间接表,以匹配新队列数的间接表大小要求。

  3. 发送具有新间接表大小的 OID_GEN_RECEIVE_SCALE_PARAMETERS OID(如果已更改)。