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 段时,它必须:- 在连接的内部状态中,将连接标记为已中止。
-
使用 EventType tcpIndicateAbort 调用 NdisTcpOffloadEventHandler 函数。注意 当微型端口指示 TcpIndicateAbort 事件时,主机 TCP/IP 堆栈将终止连接的卸载。 卸载目标可以自由指示在 RST 段到达后立即 TcpIndicateAbort 事件。
- 使用 NDIS_STATUS_REQUEST_ABORTED 完成所有未完成的发送请求并断开连接请求。 卸载目标将此状态值写入链接列表中的每个 NET_BUFFER_LIST 结构 状态 成员,并将其传递给 NdisTcpOffloadSendComplete 函数或 NdisTcpOffloadDisconnectComplete 函数。
请求终止 TCP 连接
卸载目标将终止请求指定为 EventSpecificInformation 参数中终止请求 TCP_UPLOAD_REASON 值的原因,该参数传递给 NdisTcpOffloadEventHandler 函数。 作为响应,主机堆栈调用卸载目标的 MiniportTerminateOffload 函数。卸载目标每个调用只能请求终止一个 TCP 连接,NdisTcpOffloadEventHandler。 卸载目标无法请求终止邻居状态对象或路径状态对象。 只有主机堆栈可以启动邻居或路径状态对象的终止。
下表描述了可能导致卸载目标请求终止 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 |
另请参阅
指示 TCP Chimney-Specific 事件 的
NdisTcpOffloadDisconnectComplete NdisTcpOffloadReceiveComplete