NdisMIndicateReceiveNetBufferLists 函数 (ndis.h)

微型端口驱动程序调用 NdisMIndicateReceiveNetBufferLists 函数来指示从网络接收数据。

语法

void NdisMIndicateReceiveNetBufferLists(
  [in] NDIS_HANDLE      MiniportAdapterHandle,
       PNET_BUFFER_LIST NetBufferList,
  [in] NDIS_PORT_NUMBER PortNumber,
  [in] ULONG            NumberOfNetBufferLists,
  [in] ULONG            ReceiveFlags
);

参数

[in] MiniportAdapterHandle

NDIS 传递给 的微型端口句柄 MiniportInitializeEx 函数。

NetBufferList

微型端口驱动程序分配的 NET_BUFFER_LIST 结构的链接列表。

[in] PortNumber

标识微型端口适配器端口的端口号。 若要分配微型端口适配器端口号,请调用 NdisMAllocatePort 函数。 零值标识微型端口适配器的默认端口。 如果微型端口驱动程序尚未为指定的适配器分配端口,请使用默认端口。

[in] NumberOfNetBufferLists

NetBufferLists 中的结构链接列表中的NET_BUFFER_LIST结构数。

[in] ReceiveFlags

定义发送操作的属性的标志。 标志可以与 OR 操作结合使用。 若要清除所有标志,请将此成员设置为零。 此函数支持以下标志:

NDIS_RECEIVE_FLAGS_DISPATCH_LEVEL

指定当前 IRQL DISPATCH_LEVEL。 有关此标志的详细信息,请参阅 Dispatch IRQL Tracking

NDIS_RECEIVE_FLAGS_RESOURCES

指定微型端口驱动程序在调用 NdisMIndicateReceiveNetBufferLists 后立即回收NET_BUFFER_LIST结构和任何附加NET_BUFFER结构的所有权。

NDIS_RECEIVE_FLAGS_SINGLE_ETHER_TYPE

指定 NetBufferLists 列表中的所有NET_BUFFER_LIST结构 (EtherType) 具有相同的协议类型。

微型端口驱动程序

NDIS_RECEIVE_FLAGS_SINGLE_ETHER_TYPE由微型端口驱动程序选择性地设置,这些驱动程序确定 NBL 链中的所有 NBL 具有相同的 EtherType。 通过设置此标志,微型端口驱动程序会通知 NDIS 和上层协议,它们不必检查每个数据包的 EtherType,这将提高性能。 从不需要微型端口驱动程序来设置此标志。

轻量级筛选器 (LDF)

当指示新接收时,如果确定 NBL 链中的所有 NBL 具有相同的 EtherType,则轻量级筛选器 (LWF) 也可以选择性地设置NDIS_RECEIVE_FLAGS_SINGLE_ETHER_TYPE。 但是,与微型端口驱动程序一样,在这种情况下,LDF 永远不需要设置此标志,并且始终可以选择清除该标志。

传递来自下层的接收时,如果 LWF 更改了 NBR 的 EtherType,则 LWF 必须 清除标志(如果 NCL 不再具有相同的 EtherType)。

在传递来自下层的接收时,如果 LWF 更改了 NBL 的 EtherType,则 LWF 可以根据需要设置此标志(如果确定 NBL 链中的所有 NBL 都具有相同的 EtherType)。 在这种情况下,LWF 永远不需要设置此标志,并且始终可以选择清除它。

使用来自下层的接收时,如果设置了此标志,LWF 可以假定链中的每个 NBL 具有相同的 EtherType。 LWF 从不需要读取此标志,而是可以选择始终从每个 NBL 中读取 EtherType。

组合多个 NBL 链时,LWF 必须 清除此标志,除非确定新的 NBL 链具有同源 EtherType。

协议驱动程序

使用来自下层的接收时,如果设置了NDIS_RECEIVE_FLAGS_SINGLE_ETHER_TYPE,则协议可以假定链中的每个 NBL 具有相同的 EtherType。 从不需要协议来读取此标志,而是可以选择始终从每个 NBL 读取 EtherType。

NDIS_RECEIVE_FLAGS_SINGLE_VLAN

指定 NetBufferLists 列表中的所有NET_BUFFER_LIST结构都属于同一 VLAN。

NDIS_RECEIVE_FLAGS_PERFECT_FILTERED

指定 NetBufferLists 列表中的所有NET_BUFFER_LIST结构仅包含与分配给微型端口适配器的数据包筛选器和多播地址列表匹配的数据。

NDIS_RECEIVE_FLAGS_SINGLE_QUEUE

指定 NetBufferLists 列表中的所有NET_BUFFER_LIST结构都属于同一 VM 队列。 如果在 的 Flags 成员中设置了NDIS_RECEIVE_QUEUE_PARAMETERS_PER_QUEUE_RECEIVE_INDICATION标志,微型端口驱动程序必须为队列上的所有接收指示设置此标志 分配 队列时NDIS_RECEIVE_QUEUE_PARAMETERS结构。

NDIS_RECEIVE_FLAGS_SHARED_MEMORY_INFO_VALID

指定 NetBufferLists 列表中的所有NET_BUFFER_LIST结构都包含有效的共享内存信息。 在接收 的NET_BUFFER_LIST上设置此标志时,NDIS 会将共享内存信息视为有效。 如果未设置此标志,NDIS 和驱动程序将忽略共享内存信息。 例如,修改数据包数据的中间驱动程序可以使用此标志确定是否应复制数据。 微型端口驱动程序可以使用 标志来确定如何在删除队列时释放与 VM 队列关联的内存。

NDIS_RECEIVE_FLAGS_MORE_NBLS

保留。

返回值

备注

微型端口驱动程序通常从其 MiniportInterruptDPC 函数调用 NdisMIndicateReceiveNetBufferLists 函数。 当微型端口驱动程序调用 NdisMIndicateReceiveNetBufferLists 时,它会在 NetBufferLists 参数中指定NET_BUFFER_LIST结构的列表。 NDIS 将 NET_BUFFER_LIST 结构传递给绑定协议驱动程序的 ProtocolReceiveNetBufferLists 函数。

微型端口驱动程序必须将每个NET_BUFFER_LIST结构的 SourceHandle 成员设置为与 MiniportAdapterHandle 参数相同的值。

如果微型端口驱动程序调用 NdisMIndicateReceiveNetBufferLists 并清除 ReceiveFlags 参数中的NDIS_RECEIVE_FLAG_RESOURCES标志,则 NDIS 会将指示的NET_BUFFER_LIST结构返回到微型端口驱动程序的 MiniportReturnNetBufferLists 函数。 在这种情况下,在 NDIS 将NET_BUFFER_LIST结构返回到微型端口驱动程序的 MiniportReturnNetBufferLists 函数之前,微型端口驱动程序不得回收NET_BUFFER_LIST结构。

如果微型端口驱动程序调用 NdisMIndicateReceiveNetBufferLists 并在 ReceiveFlags 参数中设置NDIS_RECEIVE_FLAG_RESOURCES标志,则表示微型端口驱动程序必须立即重新获得NET_BUFFER_LIST结构的所有权。 在这种情况下,NDIS 不会调用微型端口驱动程序的 MiniportReturnNetBufferLists 函数来返回 NET_BUFFER_LIST 结构。 相反,从 NdisMIndicateReceiveNetBufferLists 返回时,NDIS 会将NET_BUFFER_LIST结构返回到微型端口驱动程序。 微型端口驱动程序应在 NdisMIndicateReceiveNetBufferLists 返回后立即回收NET_BUFFER_LIST结构。 若要回收 NET_BUFFER_LIST 结构,微型端口驱动程序可以调用自己的 MiniportReturnNetBufferLists 函数。

ReceiveFlags 参数中设置NDIS_RECEIVE_FLAG_RESOURCES标志会强制协议驱动程序复制网络数据并将NET_BUFFER_LIST结构释放到微型端口驱动程序。 驱动程序编写者应使用足够预分配 的NET_BUFFER_LIST 结构来设计其微型端口驱动程序,以避免不必要的复制。

NdisMIndicateReceiveNetBufferLists 的调用方必须正确初始化NET_BUFFER_LIST结构、附加NET_BUFFER结构以及任何附加的 MDL。

要求

要求
最低受支持的客户端 在 NDIS 6.0 及更高版本中受支持。
目标平台 通用
标头 ndis.h (包括 Ndis.h)
Library Ndis.lib
IRQL <= DISPATCH_LEVEL
DDI 符合性规则 Irql_SendRcv_Function (ndis)

另请参阅

MiniportInitializeEx

MiniportInterruptDPC

MiniportReturnNetBufferLists

NDIS_RECEIVE_QUEUE_PARAMETERS

NET_BUFFER

NET_BUFFER_LIST

NdisMAllocatePort

ProtocolReceiveNetBufferLists