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 段时,它必须:
  1. 在连接的内部状态中,将连接标记为已中止。
  2. 使用 TcpIndicateAbortEventType 调用 NdisTcpOffloadEventHandler 函数。
    注意 当微型端口指示 TcpIndicateAbort 事件时,主机 TCP/IP 堆栈将终止连接的卸载。 当 RST 段到达时,卸载目标可以随意指示 TcpIndicateAbort 事件。
     
  3. 使用 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 -- 本地主机可能仍在发送数据。
卸载目标可以请求终止已卸载到它的所有 TCP 连接。 有关详细信息,请参阅 NdisMOffloadEventIndicate

指示“发送积压工作”大小发生更改

发送积压工作大小可以是连接、接口带宽和其他参数的往返时间 (RTT) 的函数。 卸载目标用于计算发送积压工作大小的特定变量和算法特定于实现。 例如,卸载目标可以使用最小带宽延迟积和播发的接收窗口作为算法。 但请注意,发送积压工作大小不会因当前在连接上发布传输的数据字节数而异。

卸载目标应实现限制机制,以确保如果 SendBacklogSize 的值更改过于频繁或太小,卸载目标不会指示 SendBacklogSize 事件。 这将防止发生事件指示的风暴。

要求

要求
目标平台 通用
标头 ndischimney.h (包括 Ndischimney.h)
IRQL DISPATCH_LEVEL

另请参阅

指示 TCP Chimney-Specific 事件

MiniportInitiateOffload

MiniportTerminateOffload

NdisMOffloadEventIndicate

NdisTcpOffloadDisconnectComplete NdisTcpOffloadReceiveComplete

NdisTcpOffloadSendComplete

ProtocolTcpOffloadEvent

响应 FIN 或 RST 段的接收