NDIS_TCP_OFFLOAD_RECEIVE_INDICATE回调函数 (ndischimney.h)

[TCP 烟囱卸载功能已弃用,不应使用。]

卸载目标调用 NdisTcpOffloadReceiveHandler 函数,以指示接收的网络数据可供客户端应用程序使用。

语法

NDIS_TCP_OFFLOAD_RECEIVE_INDICATE NdisTcpOffloadReceiveIndicate;

NDIS_STATUS NdisTcpOffloadReceiveIndicate(
  [in]  IN NDIS_HANDLE NdisOffloadHandle,
  [in]  IN PNET_BUFFER_LIST NetBufferList,
  [in]  IN NDIS_STATUS Status,
  [out] OUT PULONG BytesConsumed
)
{...}

参数

[in] NdisOffloadHandle

一个句柄,用于标识要进行指示的卸载 TCP 连接。 卸载连接时,此句柄在 的 NdisOffloadHandle 成员中提供 NDIS_MINIPORT_OFFLOAD_BLOCK_LIST 与连接状态关联的结构。

[in] NetBufferList

指向 NET_BUFFER_LIST 结构的指针。 每个 NET_BUFFER_LIST 结构都描述 NET_BUFFER 结构的列表。 列表中的每个 NET_BUFFER 结构映射到 内存描述符列表链, (MDL) 。 MDL 包含收到的数据。 MDL 已锁定,以便它们保持驻留状态,但不会映射到系统内存中。

NetBufferList 指定的NET_BUFFER_LIST结构必须是独立结构,不能是NET_BUFFER_LIST结构链接列表中的第一个结构。 卸载目标可以通过根据需要将尽可能多的 MDL 链接到卸载接收指示中的同一 NET_BUFFER 来绕过此限制。

[in] Status

卸载目标必须提供以下状态值:

NDIS_STATUS_SUCCESS

这表示主机堆栈可以保留NET_BUFFER_LIST结构和关联结构的所有权,直到将这些结构返回到 卸载目标的 MiniportTcpOffloadReceiveReturn 函数。

[out] BytesConsumed

指向 ULONG 类型变量的指针,该变量接收客户端应用程序使用的字节数。

返回值

NdisTcpOffloadReceiveHandler 函数可以返回以下值之一:

返回代码 说明
NDIS_STATUS_SUCCESS
客户端应用程序已使用所有指示的接收数据。
NDIS_STATUS_OFFLOAD_DATA_NOT_ACCEPTED
客户端应用程序拒绝了所有指示的接收数据。
NDIS_STATUS_OFFLOAD_DATA_PARTIALLY_ACCEPTED
客户端应用程序使用指示的接收数据的子集。 客户端应用程序使用的数据量(以字节为单位)在 BytesConsumed 参数指定的变量中返回。

注解

接收缓冲区将发布到 卸载目标的 MiniportTcpOffloadReceive 函数。 如果客户端应用程序) 提供的预发布接收请求 (缓冲区可用于连接,则卸载目标应通过调用 来传输接收数据 NdisTcpOffloadReceiveComplete 函数。 有关详细信息,请参阅 传递算法

所有接收请求都必须由卸载目标 (完成,即使它们是零字节接收请求) 。

卸载目标指示接收数据且数据被拒绝后,在主机堆栈发布接收请求之前,卸载目标无法再次指示该数据:

  • 正常接收请求

    如果主机堆栈发布正常的接收请求,卸载目标必须在发出任何接收指示之前完成这些请求。 有关详细信息,请参阅 传递算法

  • 零字节接收请求

    主机堆栈可以发布零字节接收请求,以启用卸载目标的接收指示。 零字节接收请求是 DataLength 成员的值 (,有关详细信息,请参阅 NET_BUFFER 结构) 为零。 零字节接收请求不使用任何缓冲数据。

在初始化期间,卸载目标应分配两个缓冲区池,每个池包含NET_BUFFER_LIST结构和NET_BUFFER结构。 卸载目标在调用 时使用一个池通过 TCP 烟囱发出接收指示 NdisTcpOffloadReceiveHandler 函数。 卸载目标使用其他池在调用 时通过非卸载 NDIS 接口发出接收指示 NdisMIndicateReceiveNetBufferLists 函数。

每个分配NET_BUFFER_LIST结构只能有一个与之关联的NET_BUFFER结构。 要分配的此类结构的数量由驱动程序编写器决定。 有关分配此类结构的详细信息,请参阅 微型端口驱动程序缓冲区管理

如果卸载目标没有进行延迟确认,则卸载目标应在卸载目标具有可将数据放入的内部缓冲区后立即确认收到的数据。 卸载目标可以在调用 NdisTcpOffloadReceiveHandler 函数之前、期间或之后确认收到的数据。

调用 NdisTcpOffloadReceiveHandler 函数时,卸载目标始终提供 Status 值NDIS_STATUS_SUCCESS。 这表示主机堆栈可以保留NET_BUFFER_LIST结构和关联结构的所有权,直到将这些结构返回到卸载目标。

  • 如果主机堆栈返回NDIS_STATUS_SUCCESS,指示客户端应用程序接受并使用了接收数据,则主机堆栈会将NET_BUFFER_LIST结构返回到 卸载目标的 MiniportTcpOffloadReceiveReturn 函数。 主机堆栈会将 BytesConsumed 参数指定的变量设置为卸载目标所指示的字节数。
  • 如果主机堆栈返回NDIS_STATUS_NOT_ACCEPTED,指示客户端应用程序拒绝了接收数据,则卸载目标将在返回 NdisTcpOffloadReceiveHandler 函数时恢复所指示NET_BUFFER_LIST结构的所有权。 卸载目标必须缓冲接收数据,预期客户端应用程序将在连接上发布接收缓冲区。 客户端应用程序发布接收缓冲区后,卸载目标将缓冲接收数据复制到已发布的缓冲区,并通过调用 完成已发布的缓冲区 NdisTcpOffloadReceiveComplete 函数。 有关详细信息,请参阅 传递算法。 主机堆栈会将 BytesConsumed 参数指定的变量设置为零。
  • 如果主机堆栈返回NDIS_STATUS_OFFLOAD_DATA_PARTIALLY_ACCEPTED,指示客户端应用程序使用接收数据的子集,则卸载目标将在 NdisTcpOffloadReceiveHandler 函数返回时恢复所指示NET_BUFFER_LIST结构的所有权。 主机堆栈会将 BytesConsumed 参数指定的变量设置为非零值,该值指定客户端应用程序使用的数据量(以字节为单位)。 卸载目标必须缓冲剩余的接收数据,预期客户端应用程序将在连接上发布接收缓冲区。
请注意,在调用 NdisTcpOffloadReceiveHandler 函数时,卸载目标永远不会提供 Status 值 NDIS_STATUS_RESOURCES。

在 TCP_OFFLOAD_STATE_CACHED 结构的 RcvIndicationSize 成员中,主机堆栈可以指定卸载目标应在单个调用 NdisTcpOffloadReceiveHandler 函数时提供的最佳数据字节数。 有关详细信息,请参阅 使用指定的接收指示大小

要求

要求
目标平台 通用
标头 ndischimney.h (包括 Ndischimney.h)
IRQL DISPATCH_LEVEL

另请参阅

MDL

MiniportInitializeEx

MiniportTcpOffloadReceive

MiniportTcpOffloadReceiveReturn

NET_BUFFER

NET_BUFFER_LIST

NdisMRegisterMiniportDriver