NDIS_RECEIVE_FILTER_FIELD_PARAMETERS 结构 (ntddndis.h)

NDIS_RECEIVE_FILTER_FIELD_PARAMETERS 结构指定网络数据包标头中字段的筛选器测试条件。

NDIS 接收筛选器用于以下 NDIS 接口:

语法

typedef struct _NDIS_RECEIVE_FILTER_FIELD_PARAMETERS {
  NDIS_OBJECT_HEADER       Header;
  ULONG                    Flags;
  NDIS_FRAME_HEADER        FrameHeader;
  NDIS_RECEIVE_FILTER_TEST ReceiveFilterTest;
  union {
    NDIS_MAC_HEADER_FIELD  MacHeaderField;
    NDIS_ARP_HEADER_FIELD  ArpHeaderField;
    NDIS_IPV4_HEADER_FIELD IPv4HeaderField;
    NDIS_IPV6_HEADER_FIELD IPv6HeaderField;
    NDIS_UDP_HEADER_FIELD  UdpHeaderField;
  } HeaderField;
  _HEADER_FIELD            _HEADER_FIELD;
  union {
    UCHAR   FieldByteValue;
    USHORT  FieldShortValue;
    ULONG   FieldLongValue;
    ULONG64 FieldLong64Value;
    UCHAR   FieldByteArrayValue[16];
  } FieldValue;
  _FIELD_VALUE             _FIELD_VALUE;
  union {
    UCHAR   ResultByteValue;
    USHORT  ResultShortValue;
    ULONG   ResultLongValue;
    ULONG64 ResultLong64Value;
    UCHAR   ResultByteArrayValue[16];
  } ResultValue;
  _RESULT_VALUE            _RESULT_VALUE;
} NDIS_RECEIVE_FILTER_FIELD_PARAMETERS, *PNDIS_RECEIVE_FILTER_FIELD_PARAMETERS;

成员

Header

NDIS_RECEIVE_FILTER_FIELD_PARAMETERS 结构的NDIS_OBJECT_HEADER结构。 驱动程序将 Header 指定的结构的 Type 成员设置为NDIS_OBJECT_TYPE_DEFAULT。

为了指示 NDIS_RECEIVE_FILTER_FIELD_PARAMETERS 结构的版本,驱动程序将 Revision 成员设置为以下值之一:

含义
NDIS_RECEIVE_FILTER_FIELD_PARAMETERS_REVISION_2
2
向 NDIS 6.30 的 HeaderField 联合添加了其他成员。

驱动程序将 Size 成员设置为 NDIS_SIZEOF_RECEIVE_FILTER_FIELD_PARAMETERS_REVISION_2

NDIS_RECEIVE_FILTER_FIELD_PARAMETERS_REVISION_1
1
NDIS 6.20 的原始版本。

驱动程序将 Size 成员设置为 NDIS_SIZEOF_RECEIVE_FILTER_FIELD_PARAMETERS_REVISION_1

Flags

标志的按位 OR。 以下标志对 OID_RECEIVE_FILTER_SET_FILTER 老。

含义
NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO
0x00000001
如果设置了此标志,则网络适配器必须仅指示通过以下条件的已接收数据包:
  • 数据包的媒体访问控制 (MAC) 地址与指定的 MAC 标头字段测试匹配。
  • 数据包不包含 VLAN 标记,或者具有 ID 为零的 VLAN 标记。
有关此标志的详细信息,请参阅“备注”部分。
注意 如果覆盖驱动程序设置了 MAC 地址筛选器和 VLAN 标识符筛选器,且 OID 请求 为 OID_RECEIVE_FILTER_SET_FILTER,则不会在任一筛选器字段中设置此标志。 在这种情况下,微型端口驱动程序应指示与指定的 MAC 地址和 VLAN 标识符匹配的数据包。 也就是说,微型端口驱动程序不应指示具有匹配 MAC 地址的数据包,这些数据包具有零 VLAN 标识符或未标记的数据包。
 

FrameHeader

网络数据帧中标头的类型。

ReceiveFilterTest

要对接收筛选器执行的测试类型。

HeaderField

标头中的字段类型。 字段类型 (例如, NDIS_MAC_HEADER_FIELD) 对应于 FrameHeader 成员中指定的标头类型。

此联合包含以下成员:

HeaderField.MacHeaderField

MAC 标头中的字段类型。

HeaderField.ArpHeaderField

地址解析协议 (ARP) 标头中的字段类型。

HeaderField.IPv4HeaderField

一个 NDIS_IPV4_HEADER_FIELD 枚举值,该值指定 IP 版本 4 (IPv4) 标头中的字段类型。

HeaderField.IPv6HeaderField

一个 NDIS_IPV6_HEADER_FIELD 枚举值,该值指定 IP 版本 6 (IPv6) 标头中的字段类型。

HeaderField.UdpHeaderField

用户数据报协议 (UDP) 标头中的字段类型。

_HEADER_FIELD

FieldValue

微型端口适配器与传入数据包中相应的标头字段值进行比较的值。 标头字段值的位置由 HeaderField 成员中指定的字段类型确定。

有关详细信息,请参见“备注”部分。

此联合包含以下成员:

FieldValue.FieldByteValue

要与网络数据包中的字段进行比较的 UCHAR 值。

注意 如果 MacHeaderField 成员指定 NdisMacHeaderFieldPacketType 枚举值,则此成员包含 NDIS_MAC_PACKET_TYPE 枚举值。
 

FieldValue.FieldShortValue

要与网络数据包中的字段进行比较的 USHORT 值。

FieldValue.FieldLongValue

要与网络数据包中的字段进行比较的 ULONG 值。

FieldValue.FieldLong64Value

要与网络数据包中的字段进行比较 的ULONG64 值。

FieldValue.FieldByteArrayValue[16]

要与网络数据包中的字段进行比较的 UCHAR 数组。

_FIELD_VALUE

ResultValue

包含测试结果值的联合。

如果 ReceiveFilterTest 成员设置为 NdisReceiveFilterTestMaskEqual,则网络适配器首先根据 FieldValue 成员中的值和 HeaderField 成员指定的标头字段值计算结果。 然后,适配器将计算结果与 ResultValue 进行比较。

有关详细信息,请参见“备注”部分。

此联合包含以下成员:

ResultValue.ResultByteValue

要与测试结果进行比较的 UCHAR 值。

ResultValue.ResultShortValue

要与测试结果进行比较的 USHORT 值。

ResultValue.ResultLongValue

要与测试结果进行比较的 ULONG 值。

ResultValue.ResultLong64Value

要与测试结果进行比较 的ULONG64 值。

ResultValue.ResultByteArrayValue[16]

要与测试结果进行比较的 UCHAR 数组。

_RESULT_VALUE

注解

NDIS_RECEIVE_FILTER_FIELD_PARAMETERS结构指定一个字段的筛选测试条件,该条件可用于使用 指定的字段测试数组 NDIS_RECEIVE_FILTER_PARAMETERS 结构。

下表描述了网络适配器如何使用 ReceiveFilterTestFieldValueResultValue 成员对收到的数据包的指定标头字段值执行筛选器测试。

ReceiveFilterTest 网络适配器执行的筛选器测试
NdisReceiveFilterTestEqual (<标头字段值> == FieldValue)
NdisReceiveFilterTestMaskEqual ( (<标头字段值> & FieldValue) == ResultValue)
NdisReceiveFilterTestNotEqual < (标头字段值> != FieldValue)
 
注意 所有多字节字段和结果值(如 FieldShortValueResultLong64Value 成员)都必须以网络字节顺序 (big-endian) 格式指定。
 
如果未设置 NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO 标志,并且没有由 OID_RECEIVE_FILTER_SET_FILTER 的 OID 集请求配置的 VLAN 标识符筛选器,则微型端口驱动程序必须执行以下操作之一:
  • 对于 NDIS 6.20,微型端口驱动程序必须为 OID_RECEIVE_FILTER_SET_FILTER 的 OID 请求返回失败状态。
  • 从 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 中。
从 NDIS 6.30 开始,如果未设置 NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO 标志,并且存在由 OID_RECEIVE_FILTER_SET_FILTER 的 OID 集请求配置的非零 VLAN 标识符筛选器,微型端口驱动程序必须执行以下操作:
  • 微型端口驱动程序必须将网络适配器配置为检查和筛选指定的 MAC 地址和 VLAN 标识符字段。

    如果收到的数据包中存在 VLAN 标记,则网络适配器必须将其从数据包数据中删除。 微型端口驱动程序必须将 VLAN 标记放在与数据包 NET_BUFFER_LIST 结构关联的 NDIS_NET_BUFFER_LIST_8021Q_INFO 中。

要求

要求
最低受支持的客户端 在 NDIS 6.20 及更高版本中受支持。
标头 ntddndis.h (包括 Ndis.h)

另请参阅

NDIS_ARP_HEADER_FIELD

NDIS_FRAME_HEADER

NDIS_IPV4_HEADER_FIELD

NDIS_IPV6_HEADER_FIELD

NDIS_MAC_HEADER_FIELD

NDIS_MAC_PACKET_TYPE

NDIS_OBJECT_HEADER

NDIS_RECEIVE_FILTER_PARAMETERS

NDIS_RECEIVE_FILTER_TEST

NDIS_UDP_HEADER_FIELD

OID_RECEIVE_FILTER_SET_FILTER