基于虚拟端口的数据包流
默认 NIC 交换机是网络适配器的组件,它支持单根 I/O 虚拟化 (SR-IOV) 接口。 交换机始终将默认虚拟端口 (VPort) 附加到 PCI Express (PCIe) 物理功能 (PF) 。 开关可以将一个或多个非默认 VPort 附加到 PF。 有关详细信息,请参阅 创建虚拟端口。
以下几点适用于在附加到 PF 的 VPort 上发送或接收的数据包:
通过默认 VPort 发送或接收的数据包使用 VPort 标识符值 DEFAULT_VPORT_ID指定。
通过非默认 VPort 发送或接收的数据包使用 VPort 标识符指定,该标识符是在通过 OID_NIC_SWITCH_CREATE_VPORT 的 OID 方法请求创建 VPort 时返回的。 当驱动程序处理此 OID 请求时,它会从与 OID 请求关联的NDIS_NIC_SWITCH_VPORT_PARAMETERS结构的 VPortId 成员获取 VPort 标识符。
注意 删除 VPort 时,微型端口驱动程序可能会收到包含无效 VPortId 值的 NBL。 如果发生这种情况,微型端口应忽略无效的 VPort ID,并改用 DEFAULT_VPORT_ID 。 VPortId 位于 NBL 的 OOB 数据的 NetBufferListFilteringInfo 部分,并使用 NET_BUFFER_LIST_RECEIVE_FILTER_VPORT_ID 宏进行检索。
PF 微型端口驱动程序调用 NdisMIndicateReceiveNetBufferLists 来指示从 VPort 接收的数据包。 在 PF 微型端口驱动程序调用 NdisMIndicateReceiveNetBufferLists 之前,它必须在带外 (OOB) 数据包 NET_BUFFER_LIST 结构中的数据中设置 VPort 标识符。 驱动程序通过使用 NET_BUFFER_LIST_RECEIVE_FILTER_VPORT_ID 宏执行此操作。
虚拟化堆栈调用 NdisSendNetBufferLists 将数据包传输到 VPort。 在虚拟化堆栈调用 NdisSendNetBufferLists 之前,它会在数据包 NET_BUFFER_LIST 结构的 OOB 数据中设置 VPort 标识符。
微型端口驱动程序使用 NET_BUFFER_LIST_RECEIVE_FILTER_VPORT_ID 宏获取 VPort 标识符。
微型端口驱动程序必须将传输数据包排在指定 VPort 的硬件传输队列中。
注意 PCIe 虚拟函数 (VF) 的微型端口驱动程序不会在数据包 NET_BUFFER_LIST 结构的 OOB 数据中设置或查询 VPort 标识符。 当 VF 微型端口驱动程序发送数据包时,它会为附加到 VF 的单个非默认 VPort 的硬件传输队列中的数据包排队。