环回 NDIS 数据包

如果设置了 NET_BUFFER_LIST 结构的 NblFlags 成员中的 NDIS_NBL_FLAGS_IS_LOOPBACK_PACKET 标志,则数据包是环回数据包。 协议驱动程序和筛选器驱动程序可以检查此标志来确定数据包是否为环回数据包。

如果满足以下三个条件,则 NDIS 会循环回数据包:

  1. 基础微型端口适配器媒体类型为 NdisMedium802_3NdisMedium802_5

  2. 满足以下三个条件中的任何一个:

    1. 协议绑定使用 OID_GEN_CURRENT_PACKET_FILTER OID 设置NDIS_PACKET_TYPE_PROMISCUOUS设置,以指定其数据包筛选器 (并且对于 Windows 8 及更高版本,未在同一 OID) 中设置NDIS_PACKET_TYPE_NO_LOCAL,以下任一情况为 true:

      • 微型端口适配器有多个绑定。
      • 有一个筛选器模块附加到微型端口适配器,筛选器模块注册了接收处理程序。
    2. 协议绑定使用 OID_GEN_CURRENT_PACKET_FILTER OID 设置NDIS_PACKET_TYPE_ALL_LOCAL设置以指定其数据包筛选器,并且以下任一情况为 true。

      • 微型端口适配器有多个绑定。
      • 有一个筛选器模块附加到微型端口适配器,筛选器模块注册了接收处理程序。
    3. 调用方在 NdisSendNetBufferLists 函数的 SendFlags 参数中设置NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK标志。

  3. 数据包是可接受的,由使用微型端口适配器的 OID_GEN_CURRENT_PACKET_FILTER OID 设置的数据包筛选器决定。 下面是一些示例:

    • 如果数据包是直接数据包,则数据包中的目标地址必须与微型端口适配器的 MAC 地址匹配。
    • 如果数据包是多播数据包,则数据包筛选器必须设置NDIS_PACKET_TYPE_ALL_MULTICAST,或者目标地址与微型端口适配器的多播地址列表中的其中一个多播地址匹配,并且数据包筛选器NDIS_PACKET_TYPE_MULTICAST设置。
    • 如果数据包是广播数据包,则必须设置微型端口适配器的数据包筛选器NDIS_PACKET_TYPE_BROADCAST。
    • 微型端口适配器的数据包筛选器已设置NDIS_PACKET_TYPE_PROMISCUOUS或NDIS_PACKET_TYPE_ALL_LOCAL。

如果以下任一情况成立,协议绑定将接收环回数据包:

  1. 协议绑定是数据包的原始发送方,并设置了NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK。

  2. 协议绑定不会在数据包筛选器中设置NDIS_PACKET_TYPE_NO_LOCAL。

如果以下任一情况成立,协议绑定将不会接收环回数据包:

  1. 协议绑定在数据包筛选器中设置NDIS_PACKET_TYPE_NO_LOCAL,它不是数据包的原始发送方。

  2. 协议绑定是原始发送方,但在调用 NdisSendNetBufferLists 函数时,未在 SendFlags 参数中设置NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK。

下图显示了环回算法逻辑流。

显示环回算法逻辑流的流程图。