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。 有关此标志的详细信息,请参阅 调度 IRQL 跟踪。
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 的每个数据包,从而提高性能。 从不需要微型端口驱动程序来设置此标志。
轻型筛选器(LFS)
当指示小说接收时,如果确定 NBL 链中的所有 NBL 具有相同的 EtherType,则轻型筛选器(LWF)也可以选择设置NDIS_RECEIVE_FLAGS_SINGLE_ETHER_TYPE。 但是,与微型端口驱动程序一样,在这种情况下,从不需要 LDF 来设置此标志,并且始终可以选择清除标志。
当从下层传递接收时,如果 LWF 更改 NBL 的 EtherType,则 LWF 必须 清除标志(如果 NBL 不再具有相同的 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
指定 NetBufferList s 列表中的所有 NET_BUFFER_LIST 结构都属于同一 VLAN。
NDIS_RECEIVE_FLAGS_PERFECT_FILTERED
指定 NetBufferLists 列表中的所有 NET_BUFFER_LIST 结构 仅包含与分配给微型端口适配器的数据包筛选器和多播地址列表匹配的数据。
NDIS_RECEIVE_FLAGS_SINGLE_QUEUE
指定 NetBufferLists 列表中的所有 NET_BUFFER_LIST 结构 都属于同一 VM 队列。 如果 NDIS_RECEIVE_QUEUE_PARAMETERS_PER_QUEUE_RECEIVE_INDICATION 标志在 标志 成员中设置了 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 函数。 在这种情况下,微型端口驱动程序不得回收 NET_BUFFER_LIST 结构,直到 NDIS 将 NET_BUFFER_LIST 结构返回到微型端口驱动程序的 MiniportReturnNetBufferLists 函数。
如果微型端口驱动程序调用 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) |
库 | Ndis.lib |
IRQL | <= DISPATCH_LEVEL |
DDI 符合性规则 | Irql_SendRcv_Function(ndis) |