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 函数。 If preposted receive requests (buffers supplied by the client application) are available for the connection, the offload target should transfer the receive data by calling the NdisTcpOffloadReceiveComplete 函数。 有关详细信息,请参阅 传递算法

卸载目标 (必须完成所有接收请求,即使这些请求是零字节接收请求) 也是如此。

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

  • 普通接收请求

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

  • 零字节接收请求

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

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

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

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

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

  • 如果主机堆栈返回NDIS_STATUS_SUCCESS,指示客户端应用程序接受和使用接收数据,则主机堆栈会将NET_BUFFER_LIST结构返回到卸载目标的 MiniportTcpOffloadReceiveReturn 函数。 主机堆栈会将 BytesConsumed 参数指定的变量设置为卸载目标指示的字节数。
  • 如果主机堆栈返回NDIS_STATUS_NOT_ACCEPTED,指示客户端应用程序拒绝接收数据,则卸载目标会在 返回 NdisTcpOffloadReceiveHandler 函数时恢复所指示NET_BUFFER_LIST结构的所有权。 卸载目标必须缓冲接收数据,预计客户端应用程序将在连接上发布接收缓冲区。 After the client application posts receive buffers, the offload target copies the buffered receive data into the posted buffers and completes the posted buffers by calling the NdisTcpOffloadReceiveComplete 函数。 有关详细信息,请参阅 传递算法。 主机堆栈会将 BytesConsumed 参数指定的变量设置为零。
  • 如果主机堆栈返回NDIS_STATUS_OFFLOAD_DATA_PARTIALLY_ACCEPTED,指示客户端应用程序使用接收数据的子集,则卸载目标在 NdisTcpOffloadReceiveHandler 函数返回时恢复所指示NET_BUFFER_LIST结构的所有权。 主机堆栈会将 BytesConsumed 参数指定的变量设置为非零值,该值指定客户端应用程序使用的数据量(以字节为单位)。 卸载目标必须缓冲剩余的接收数据,预计客户端应用程序将在连接上发布接收缓冲区。
请注意,卸载目标在调用 NdisTcpOffloadReceiveHandler 函数时永远不会提供状态值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