NDIS_TCP_OFFLOAD_EVENT_INDICATE回调函数 (ndischimney.h)
[TCP 烟囱卸载功能已弃用,不应使用。]
卸载目标调用 NdisTcpOffloadEventHandler 函数来指示与卸载的 TCP 连接相关的事件。
语法
NDIS_TCP_OFFLOAD_EVENT_INDICATE NdisTcpOffloadEventIndicate;
void NdisTcpOffloadEventIndicate(
[in] IN NDIS_HANDLE NdisOffloadHandle,
[in] IN ULONG EventType,
[in] IN ULONG EventSpecificInformation
)
{...}
参数
[in] NdisOffloadHandle
一个句柄,用于标识正在其上建立指示的卸载 TCP 连接。 卸载连接时,此句柄在 的 NdisOffloadHandle 成员中提供 NDIS_MINIPORT_OFFLOAD_BLOCK_LIST 与连接状态关联的结构。
[in] EventType
指示为以下 TCP_OFFLOAD_EVENT_TYPE 值之一的事件:
TcpIndicateDisconnect
指示远程主机已通过在连接上发送 FIN 段来启动正常断开连接。
TcpIndicateRetrieve
指示卸载目标正在请求主机堆栈终止 TCP 连接的卸载。
TcpIndicateAbort
指示远程主机已通过在连接上发送可接受的 RST 段来启动中止断开连接。
TcpIndicateSendBacklogChange
指示首选发送积压工作大小的变化。
[in] EventSpecificInformation
指定有关正在指示的事件的其他信息,如下所示:
TcpIndicateDisconnect
没有意义。
TcpIndicateRetrieve
指示上传请求作为 TCP_UPLOAD_REASON 值的原因。 有关详细信息,请参阅备注部分。
TcpIndicateAbort
没有意义。
TcpIndicateSendBacklogChange
指定主机堆栈在卸载目标上应具有未完成的最佳发送数据字节数。
返回值
无
备注
指示正常断开连接
卸载目标应仅在以下情况下指示正常断开连接:- 它已收到来自远程主机的 FIN 段。
- 在接收 FIN 段之前在连接上接收的所有数据已被客户端应用程序使用, (也就是说,连接) 上没有要指示的接收数据。
请注意,正常断开连接仅关闭接收一半的连接。 它不会关闭连接的发送一半。
指示中止断开连接
当卸载目标在 TCP 连接上收到可接受的 RST 段时,它必须:- 在连接的内部状态中,将连接标记为已中止。
-
使用 TcpIndicateAbort 的 EventType 调用 NdisTcpOffloadEventHandler 函数。注意 当微型端口指示 TcpIndicateAbort 事件时,主机 TCP/IP 堆栈将终止连接的卸载。 当 RST 段到达时,卸载目标可以随意指示 TcpIndicateAbort 事件。
- 使用 NDIS_STATUS_REQUEST_ABORTED 完成所有未完成的发送请求并断开连接上的请求。 卸载目标将此状态值写入到它传递给 的链接列表中每个NET_BUFFER_LIST结构的 Status 成员 NdisTcpOffloadSendComplete 函数或 NdisTcpOffloadDisconnectComplete 函数。
请求终止 TCP 连接
卸载目标将终止请求的原因指定为它传递给 NdisTcpOffloadEventHandler 函数的 EventSpecificInformation 参数中的TCP_UPLOAD_REASON值。 作为响应,主机堆栈调用卸载目标的 MiniportTerminateOffload 函数。卸载目标每次调用 NdisTcpOffloadEventHandler 时只能请求终止一个 TCP 连接。 卸载目标无法请求终止相邻状态对象或路径状态对象。 只有主机堆栈可以启动邻居或路径状态对象的终止。
下表描述了可能导致卸载目标请求终止 TCP 连接卸载的事件或情况。
对于每个 TCP_UPLOAD_REASON,最右边的列指示主机堆栈是始终上传连接 (强制) ,还是可能上传连接 (可选) 。 在强制情况下,卸载目标不会继续处理卸载的连接。 在可选情况下,如果主机堆栈未终止该连接的卸载,则卸载目标必须能够继续处理卸载的连接。
事件/环境 | TCP_UPLOAD_REASON | 主机堆栈终止 TCP 连接 |
---|---|---|
用于跟踪连接的硬件状态已损坏。 | HardwareFailure | 必需 |
卸载目标尝试在依赖于失效状态对象的 TCP 连接上发送数据。 | InvalidState | 必需 |
卸载目标接收在 TCP 标头中设置了 URG 位的段。 请注意,卸载目标不会发送 ACK 来确认紧急数据。 | ReceivedUrgentData | 必需 |
TCP 连接超时。 | TimeoutExpiration | 必需 |
卸载目标出于未指定的原因请求上传。 | UploadRequested | 必需 |
卸载目标检测到 TCP 连接上丢弃了过多的传输段。 | HighDropRate | 可选 |
卸载目标检测到 TCP 连接上收到的片段过多。 | HighFragmentation | 可选 |
卸载目标在 TCP 连接上收到了过多的无序段。 | HighOutofOrderPackets | 可选 |
TCP 连接上发送/接收) 的活动 (太低。 | LowActivity | 可选 |
TCP 连接没有预先发布的接收缓冲区。 | NoBufferProposting | 可选 |
为 TCP 连接发布的接收缓冲区太小。 | SmallIO | 可选 |
当连接处于以下状态之一时,卸载目标不得启动半关闭 TCP 连接的终止:
- FIN_WAIT1 - 本地主机堆栈已关闭 TCP 连接,但连接可能仍在从远程终结点接收数据。
- FIN_WAIT2 -- 本地主机已关闭 TCP 连接,并收到了它发送的 FIN 段的 ACK,但卸载的连接可能仍在从远程主机接收数据。
- CLOSE_WAIT -- 本地主机可能仍在发送数据。
指示“发送积压工作”大小发生更改
发送积压工作大小可以是连接、接口带宽和其他参数的往返时间 (RTT) 的函数。 卸载目标用于计算发送积压工作大小的特定变量和算法特定于实现。 例如,卸载目标可以使用最小带宽延迟积和播发的接收窗口作为算法。 但请注意,发送积压工作大小不会因当前在连接上发布传输的数据字节数而异。卸载目标应实现限制机制,以确保如果 SendBacklogSize 的值更改过于频繁或太小,卸载目标不会指示 SendBacklogSize 事件。 这将防止发生事件指示的风暴。
要求
要求 | 值 |
---|---|
目标平台 | 通用 |
标头 | ndischimney.h (包括 Ndischimney.h) |
IRQL | DISPATCH_LEVEL |