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

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

要求

要求 价值
目标平台 普遍
标头 ndischimney.h (包括 Ndischimney.h)
IRQL DISPATCH_LEVEL

另请参阅

MDL

MiniportInitializeEx

MiniportTcpOffloadReceive

MiniportTcpOffloadReceiveReturn

NET_BUFFER

NET_BUFFER_LIST

NdisMRegisterMiniportDriver