在虚拟端口上设置接收筛选器
在网络适配器的 NIC 交换机上创建虚拟端口 (VPort) 后,过分的驱动程序可以在 VPort 上设置接收筛选器。 只有创建 VPort 的驱动程序才能在该 VPort 上设置接收筛选器
本主题包含以下信息:
使用NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO标志
有关如何创建 VPort 的详细信息,请参阅 创建虚拟端口。
注意 由于默认 VPort 始终存在并且永远不会显式创建,因此任何过度的驱动程序都可以在默认 VPort 上设置接收筛选器。 过度覆盖的驱动程序不拥有默认的 VPort。 因此,绑定到网络适配器的所有协议驱动程序都可以使用默认 VPort。 默认 VPort 的标识符值为 NDIS_DEFAULT_VPORT_ID。
在 VPort 上设置接收筛选器
若要在 VPort 上设置和配置筛选器,过分驱动程序会发出对象标识符 (OID) 方法请求OID_RECEIVE_FILTER_SET_FILTER。 NDIS_OID_REQUEST 结构的 InformationBuffer 成员最初包含指向NDIS_RECEIVE_FILTER_PARAMETERS结构的指针。
在上行驱动程序发出此 OID 方法请求之前,它必须初始化 NDIS_RECEIVE_FILTER_PARAMETERS 结构。 驱动程序必须按以下方式设置此结构的成员:
FilterType 成员必须设置为NDIS_RECEIVE_FILTER_TYPE枚举值。
注意 从 NDIS 6.30 开始,单根 I/O 虚拟化 (SR-IOV) 接口仅支持 NdisReceiveFilterTypeVMQueue 筛选器类型。
QueueId 成员必须设置为 NDIS_DEFAULT_RECEIVE_QUEUE_ID。
必须将 VPortId 成员设置为与 VPort 关联的标识符。 覆盖驱动程序通过以下方法之一获取 VPort 标识符:
从以前的 OID 方法请求 OID_NIC_SWITCH_CREATE_VPORT。
从以前的 OID 方法请求 OID_NIC_SWITCH_ENUM_VPORTS。
FilterId 成员必须设置为 NDIS_DEFAULT_RECEIVE_FILTER_ID。
注意 在将 OID 请求转发到微型端口驱动程序进行处理之前,NDIS 在此成员中分配唯一筛选器标识符。
必须正确设置 NDIS_RECEIVE_FILTER_PARAMETERS 结构的 FieldParametersArrayOffset、FieldParametersArrayNumElements 和 FieldParametersArrayElementSize 成员才能定义NDIS_RECEIVE_FILTER_FIELD_PARAMETERS结构的数组。 数组中的每个 NDIS_RECEIVE_FILTER_FIELD_PARAMETERS 结构为网络标头中的一个字段设置筛选器测试条件。
对于 SR-IOV 接口,定义了以下字段测试参数:
数据包中的目标媒体访问控制 (MAC) 地址等于指定的 MAC 地址。
数据包中的虚拟 LAN (VLAN) 标识符等于指定的 VLAN 标识符。
从 OID 方法请求成功返回后,NDIS_OID_REQUEST 结构的 InformationBuffer 成员包含指向具有新筛选器标识符的 NDIS_RECEIVE_FILTER_PARAMETERS 结构的指针。
使用NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO标志
NDIS_RECEIVE_FILTER_FIELD_PARAMETERS 结构的 Flags 成员指定要对接收筛选器执行的操作。 以下几点适用于 NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO 标志:
如果在 Flags 成员中设置了 NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO 标志,则网络适配器必须仅指示与以下所有测试条件匹配的已接收数据包:
具有匹配 MAC 地址的数据包。
没有 VLAN 标记或 VLAN 标识符为零的数据包。
如果设置了 NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO 标志,则网络适配器不得指示具有匹配 MAC 地址和非零 VLAN 标识符的数据包。
注意 如果虚拟化堆栈设置 MAC 地址筛选器,并且 OID_RECEIVE_FILTER_SET_FILTER 集请求未配置 VLAN 标识符筛选器,则交换机还会设置 NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO 标志。
从 NDIS 6.30 开始,如果未设置 NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO 标志,并且 OID_RECEIVE_FILTER_SET_FILTER 方法请求未配置 VLAN 标识符筛选器,则微型端口驱动程序必须执行以下操作之一:
微型端口驱动程序必须返回 OID_RECEIVE_FILTER_SET_FILTER 方法请求的失败状态。
微型端口驱动程序必须将网络适配器配置为检查和筛选指定的 MAC 地址字段。 如果收到的数据包中存在 VLAN 标记,则网络适配器必须将其从数据包数据中删除。 微型端口驱动程序必须将 VLAN 标记放在与数据包 NET_BUFFER_LIST 结构关联的 NDIS_NET_BUFFER_LIST_8021Q_INFO 中。
如果协议驱动程序使用 OID_RECEIVE_FILTER_SET_FILTER 方法请求设置 MAC 地址筛选器和 VLAN 标识符筛选器,则不会在任一筛选器字段中设置 NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO 标志。 在这种情况下,微型端口驱动程序应指示与指定的 MAC 地址和 VLAN 标识符匹配的数据包。 也就是说,微型端口驱动程序不应指示具有匹配 MAC 地址的数据包,这些数据包具有零 VLAN 标识符或未标记的数据包。
使用筛选器标识符
NDIS 在 NDIS_RECEIVE_FILTER_PARAMETERS 结构的 FilterId 成员中分配筛选器标识符,并将OID_RECEIVE_FILTER_SET_FILTER的 OID 方法请求传递给基础微型端口驱动程序。 在 VPort 上设置的每个筛选器都有网络适配器的唯一筛选器标识符。 也就是说,筛选器标识符不会在网络适配器管理的不同队列上重复。
覆盖驱动程序必须使用 NDIS 在以后的 OID 请求中提供的筛选器标识符来更改筛选器参数或释放筛选器。
当 NDIS 收到在 VPort 上设置筛选器的 OID 请求时,它会验证筛选器参数。 NDIS 分配必要的资源和筛选器标识符后,会将 OID 请求提交到基础网络适配器。 如果网络适配器可以成功为筛选器分配必要的软件和硬件资源,则会使用 NDIS_STATUS_SUCCESS完成 OID 请求。
微型端口驱动程序必须保留分配的接收筛选器的筛选器标识符。 NDIS 使用筛选器的筛选器标识符以及以后的 OID 请求来更改接收筛选器参数或清除接收筛选器。 有关如何更改参数和清除筛选器的详细信息,请参阅 获取和更新 VM 队列参数 和 清除 VMQ 筛选器。
处理 VPort 上的接收筛选器
微型端口驱动程序按以下方式基于筛选器对网络适配器进行程序设置:
特定筛选器的所有字段测试参数必须匹配,才能将数据包分配给 VPort。
可以在 VPort 上设置多个筛选器。
如果任何筛选器通过,则必须将数据包分配给 VPort。
网络适配器将所有现场测试的结果与逻辑 AND 操作组合在一起。 也就是说,如果 NDIS_RECEIVE_FILTER_FIELD_PARAMETERS 结构数组中包含的任何现场测试失败,则网络数据包不符合指定的筛选条件。
当网络适配器根据这些筛选条件测试收到的数据包时,它必须忽略数据包中没有指定测试条件的所有字段。