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 函数可以返回以下值之一:
返回代码 | 描述 |
---|---|
|
客户端应用程序使用所有指示的接收数据。 |
|
客户端应用程序拒绝了所有指示的接收数据。 |
|
客户端应用程序使用了所指示接收数据的子集。 客户端应用程序使用的数据量(以字节为单位)在 BytesConsumed 参数指定的变量中返回。 |
言论
接收缓冲区发布到 卸载目标的 MiniportTcpOffloadReceive 函数。 如果预发布接收请求(客户端应用程序提供的缓冲区)可用于连接,卸载目标应通过调用接收数据来传输接收数据 NdisTcpOffloadReceiveComplete 函数。 有关详细信息,请参阅 传递算法。
所有接收请求都必须由卸载目标完成(即使它们是零字节接收请求)。
卸载目标指示接收数据且数据被拒绝后,卸载目标在主机堆栈发布接收请求之前无法再次指示数据:
-
普通接收请求
如果主机堆栈发布正常接收请求,卸载目标必须在发出任何接收指示之前完成这些请求。 有关详细信息,请参阅 传递算法。
-
零字节接收请求
主机堆栈可以发布零字节接收请求,以便通过卸载目标启用接收指示。 零字节接收请求是 DataLength 成员的值(有关详细信息,请参阅 NET_BUFFER 结构)为零。 零字节接收请求不使用任何缓冲数据。
每个分配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结构的所有权。 卸载目标必须缓冲接收数据,预期客户端应用程序将在连接上发布接收缓冲区。 客户端应用程序发布接收缓冲区后,卸载目标将通过调用
将缓冲接收数据复制到已发布的缓冲区中并完成发布的缓冲区 NdisTcpOffloadReceiveComplete 函数。 有关详细信息,请参阅 传递算法。 主机堆栈会将 BytesConsumed 参数指定的变量设置为零。 - 如果主机堆栈返回NDIS_STATUS_OFFLOAD_DATA_PARTIALLY_ACCEPTED,指示客户端应用程序使用了接收数据的子集,则卸载目标将在 NdisTcpOffloadReceiveHandler 函数返回时恢复所指示NET_BUFFER_LIST结构的所有权。 主机堆栈会将 BytesConsumed 参数指定的变量设置为非零值,该值指定客户端应用程序使用的数据量(以字节为单位)。 卸载目标必须缓冲剩余接收数据,以预期客户端应用程序将在连接上发布接收缓冲区。
在 RcvIndicationSize TCP_OFFLOAD_STATE_CACHED 结构的成员中,主机堆栈可以指定卸载目标应在对 NdisTcpOffloadReceiveHandler 函数的单个调用中提供的最佳数据字节数。 有关详细信息,请参阅 使用指定的接收指示大小。
要求
要求 | 价值 |
---|---|
目标平台 | 普遍 |
标头 | ndischimney.h (包括 Ndischimney.h) |
IRQL | DISPATCH_LEVEL |