W_TCP_OFFLOAD_RECEIVE_HANDLER回调函数 (ndischimney.h)
[TCP 烟囱卸载功能已弃用,不应使用。
NDIS 调用 MiniportTcpOffloadReceive 函数,以在卸载的 TCP 连接上发布接收请求(接收缓冲区)。
语法
W_TCP_OFFLOAD_RECEIVE_HANDLER WTcpOffloadReceiveHandler;
NDIS_STATUS WTcpOffloadReceiveHandler(
[in] IN NDIS_HANDLE MiniportAdapterContext,
[in] IN PVOID MiniportOffloadContext,
[in] IN PNET_BUFFER_LIST NetBufferList
)
{...}
参数
[in] MiniportAdapterContext
卸载目标分配的上下文区域的句柄,卸载目标在其中维护有关此适配器实例的状态信息。 微型端口驱动程序在调用 NDIS 时向 NDIS 提供了此句柄 NdisMSetMiniportAttributes MiniportInitializeEx 函数。
[in] MiniportOffloadContext
指向包含 PVOID 值的内存位置的指针。 此 PVOID 值引用微型端口卸载上下文,其中包含要向其发布接收请求的 TCP 连接的状态对象。 卸载目标卸载 TCP 连接状态对象时提供了此 PVOID 值。
[in] NetBufferList
指向 NET_BUFFER_LIST 结构的指针。 此结构可以是独立结构,也可以是NET_BUFFER_LIST结构链接列表中的第一个结构。 列表中的每个NET_BUFFER_LIST结构都描述了一个 NET_BUFFER 结构。 NET_BUFFER结构映射到内存描述符列表链(MDL)。 NET_BUFFER_LIST和相关结构被锁定,以便它们仍驻留在物理内存中。 但是,它们不会映射到系统内存中。
返回值
NDIS_STATUS_PENDING是唯一允许的返回值。 卸载目标始终通过调用异步完成(返回)发布的接收请求 NdisTcpOffloadReceiveComplete。
言论
客户端应用程序可以在卸载的 TCP 连接上发布接收请求。 卸载目标使用这些请求来传输在与客户端应用程序的连接上收到的数据。 如果在连接上发布接收请求,卸载目标应始终使用它们来传输连接上收到的数据。 有关详细信息,请参阅 传递算法。
卸载目标将发布的NET_BUFFER_LIST结构排入先出(FIFO)顺序。 卸载目标使用每个NET_BUFFER_LIST结构的 MiniportReserved 成员对结构进行排队。
传递给 MiniportTcpOffloadReceive 函数的每个NET_BUFFER_LIST结构只有一个与之关联的NET_BUFFER结构。
卸载目标应按 FIFO 顺序将接收数据放入发布的接收请求中。 也就是说,首先收到的数据应置于第一个发布的接收请求中,依此等。
主机堆栈根据每个连接序列化对 MiniportTcpOffloadReceive 函数的调用。 主机堆栈不会在该连接上调用 MiniportTcpOffloadReceive 函数,同时调用该连接上的 MiniportTcpOffloadReceive 函数。 这可确保接收请求始终按正确的顺序发布到卸载目标的 MiniportTcpOffloadReceive 函数。
但是,请注意,主机堆栈可以在连接上调用 MiniportTcpOffloadReceive 函数,然后卸载目标已完成对同一连接上 MiniportTcpOffloadReceive 函数的一个或多个以前的调用。 另请注意,主机堆栈可以在一个连接上调用卸载目标的 MiniportTcpOffloadReceive 函数,同时对 MiniportTcpOffloadReceive 函数的一个或多个调用正在进行另一个连接。
已发布的接收请求可以选择采用以下两种模式之一:
- 推送模式
- 非push 模式
若要确定缓冲区所在的模式,卸载目标调用 NET_BUFFER_LIST_INFO 宏以获取 TcpReceiveNoPush的值。 如果值为 TRUE ,则接收请求处于非push 模式。
如果接收请求处于推送模式,则卸载目标通过调用 NET_BUFFER_LIST_INFO 宏来检索 TcpReceiveBytesTransferred 的值。 如果此值不为零,卸载目标会立即启动连接的 推送计时器。 如果此值为零,卸载目标会在卸载目标将第一个接收数据字节放入接收请求后立即启动连接的推送计时器。 卸载目标始终会立即完成已填充的接收请求。 卸载目标完成一个部分填充的接收请求,如果出现以下任一情况,该请求处于推送模式:
- 推送计时器过期。
- 卸载目标在设置了 PSH 位的连接上接收 TCP 段。
如果在推送计时器运行时在卸载连接上收到数据,卸载目标必须重新启动该连接的推送计时器。
要求
要求 | 价值 |
---|---|
目标平台 | 窗户 |
标头 | ndischimney.h (包括 Ndischimney.h) |
IRQL | 任何级别 |