MINIPORT_SEND_NET_BUFFER_LISTS回调函数 (ndis.h)

NDIS 调用 MiniportSendNetBufferLists 函数以传输包含在 NET_BUFFER_LIST 结构链接列表中的网络数据。

注意 必须使用 MINIPORT_SEND_NET_BUFFER_LISTS 类型声明函数。 有关详细信息,请参阅以下示例部分。
 

语法

MINIPORT_SEND_NET_BUFFER_LISTS MiniportSendNetBufferLists;

void MiniportSendNetBufferLists(
  [in] NDIS_HANDLE MiniportAdapterContext,
  [in] PNET_BUFFER_LIST NetBufferList,
  [in] NDIS_PORT_NUMBER PortNumber,
  [in] ULONG SendFlags
)
{...}

参数

[in] MiniportAdapterContext

微型端口驱动程序在其 MiniportInitializeEx 函数中分配的上下文区域的句柄。 微型端口驱动程序使用此上下文区域来维护有关适配器的状态信息。

[in] NetBufferList

指向 NET_BUFFER_LIST 结构链接列表中的第一个NET_BUFFER_LIST结构的指针。 列表中的每个NET_BUFFER_LIST结构都描述了 NET_BUFFER 结构的列表。 列表中的每个NET_BUFFER结构都映射到一个 MDL 链。 MDL 包含网络数据。

[in] PortNumber

标识微型端口适配器端口的端口号。 若要分配微型端口适配器端口号,请调用 NdisMAllocatePort 函数。 零值标识微型端口适配器的默认端口。

[in] SendFlags

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

NDIS_SEND_FLAGS_DISPATCH_LEVEL

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

NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK

指定 NDIS 应检查环回。 默认情况下,NDIS 不会将数据循环回提交发送请求的驱动程序。 过度覆盖的驱动程序可以通过设置此标志来替代此行为。 设置此标志后,NDIS 将标识包含与绑定的接收条件匹配的所有NET_BUFFER结构。 NDIS 指示NET_BUFFER结构,这些结构与超载驱动程序的条件匹配。 此标志不会影响检查其他绑定上的环回或循环回。

返回值

备注

MiniportSendNetBufferLists 是微型端口驱动程序所需的函数。 当覆盖驱动程序调用 NdisSendNetBufferLists 函数时,NDIS 会调用绑定微型端口驱动程序的 MiniportSendNetBufferLists 函数。

传输 NDIS 在 NetBufferLists 参数中传递的网络数据时,微型端口驱动程序必须使用以下准则:

  1. 必须保留每个 NET_BUFFER_LIST 结构中 NET_BUFFER 结构的顺序。
  2. 如果要在同一连接上传输 结构, 应保留NET_BUFFER_LIST结构的顺序。
  3. 如果要在不同的连接上传输 NET_BUFFER_LIST 结构,则可以在使用以下功能时将其拆分为多个传输队列。 在这种情况下,应保留每个连接的 NET_BUFFER_LIST 结构的顺序。
    • 接收方缩放 (RSS) (NET_BUFFER_LIST 结构中的 RSS 哈希值可用作 RSS 间接表的索引。)
    • 虚拟机队列 (VMQ) (传出队列的队列标识符在 NetBufferListFilteringInfo OOB 信息中设置。有关详细信息,请参阅 VMQ 传输路径.)
    • IEEE 802.1 数据中心桥接 (DCB) (可以关闭流量类 (TC) .)
    • IEEE 802.1p (可以在没有 DCB.) 的情况下关闭 802.1p 标记

微型端口驱动程序接受 NDIS 通过调用 MiniportSendNetBufferLists 函数发出的所有发送请求。 如果微型端口驱动程序无法立即完成发送请求,则驱动程序必须将请求保存在队列中,直到它可以完成请求。 当发送请求处于挂起状态时,微型端口驱动程序将保留NET_BUFFER_LIST结构和与NET_BUFFER_LIST结构关联的所有协议分配资源的所有权。

微型端口驱动程序必须调用 NdisMSendNetBufferListsComplete 函数,用于完成所有NET_BUFFER_LIST结构的发送请求。 为了提高系统性能,驱动程序可以创建一个链接列表,其中包含来自多个发送请求的NET_BUFFER_LIST结构。 然后,驱动程序可以在对 NdisMSendNetBufferListsComplete 的单个调用中传递此类链接列表.NET_BUFFER_LIST结构和其他关联的资源应在驱动程序调用 NdisMSendNetBufferListsComplete 后立即被微型端口驱动程序视为不可访问。

MiniportSendNetBufferLists 函数必须将对其内部网络数据队列的访问与驱动程序的其他访问相同队列的 MiniportXxx 函数同步。 微型端口驱动程序可以使用旋转锁来同步对队列的访问。

协议驱动程序负责根据绑定微型端口驱动程序选择的介质类型确定所需的网络数据。 但是,协议驱动程序可以提供网络数据,以指定小于所选介质的最小数据包大小的数据包。 在这种情况下,如果所选介质对传输数据包大小施加最小长度要求, MiniportSendNetBufferLists 必须使用零填充数据包。

如果微型端口驱动程序在 NDIS 查询OID_GEN_MAC_OPTIONS OID 时设置了 NDIS_MAC_OPTION_NO_LOOPBACK 标志,则微型端口驱动程序不得尝试循环回任何网络数据。 NDIS 为此类驱动程序提供软件环回支持。

NDIS 在 IRQL<= DISPATCH_LEVEL调用 MiniportSendNetBufferLists

示例

若要定义 MiniportSendNetBufferLists 函数,必须首先提供一个函数声明来标识要定义的函数类型。 Windows 为驱动程序提供一组函数类型。 使用函数类型声明函数可帮助 驱动程序的代码分析静态驱动程序验证程序 (SDV) 和其他验证工具查找错误,并且这是编写 Windows 操作系统驱动程序的要求。

例如,若要定义名为“ MySendNetBufferLists ”的 MiniportSendNetBufferLists 函数,请使用 MINIPORT_SEND_NET_BUFFER_LISTS 类型,如以下代码示例所示:

MINIPORT_SEND_NET_BUFFER_LISTS MySendNetBufferLists;

然后,按如下所示实现函数:

_Use_decl_annotations_
VOID
 MySendNetBufferLists(
    NDIS_HANDLE  MiniportAdapterContext,
    PNET_BUFFER_LIST  NetBufferList,
    NDIS_PORT_NUMBER  PortNumber,
    ULONG  SendFlags
    )
  {...}

MINIPORT_SEND_NET_BUFFER_LISTS函数类型在 Ndis.h 头文件中定义。 若要在运行代码分析工具时更准确地识别错误,请务必将 Use_decl_annotations 注释添加到函数定义。 Use_decl_annotations批注可确保使用应用于头文件中MINIPORT_SEND_NET_BUFFER_LISTS函数类型的注释。 有关函数声明要求的详细信息,请参阅 使用 NDIS 驱动程序的函数角色类型声明函数

有关 Use_decl_annotations的信息,请参阅 批注函数行为

要求

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

另请参阅

MiniportInitializeEx

NET_BUFFER

NET_BUFFER_LIST

NdisMAllocatePort

NdisMSendNetBufferListsComplete

NdisSendNetBufferLists

OID_GEN_MAC_OPTIONS