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. 使用 EventType tcpIndicateAbort 调用 NdisTcpOffloadEventHandler 函数。
    注意 当微型端口指示 TcpIndicateAbort 事件时,主机 TCP/IP 堆栈将终止连接的卸载。 卸载目标可以自由指示在 RST 段到达后立即 TcpIndicateAbort 事件。
     
  3. 使用 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--本地主机可能仍在发送数据。
卸载目标可以请求终止已卸载到它的所有 TCP 连接。 有关详细信息,请参阅 NdisMOffloadEventIndicate

指示发送积压工作大小的更改

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

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

要求

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

另请参阅

指示 TCP Chimney-Specific 事件

MiniportInitiateOffload

MiniportTerminateOffload

NdisMOffloadEventIndicate

NdisTcpOffloadDisconnectComplete NdisTcpOffloadReceiveComplete

NdisTcpOffloadSendComplete

ProtocolTcpOffloadEvent

响应 FIN 或 RST 段的接收