W_TCP_OFFLOAD_DISCONNECT_HANDLER回调函数 (ndischimney.h)

[TCP 烟囱卸载功能已弃用,不应使用。

MiniportTcpOffloadDisconnect 函数关闭卸载 TCP 连接的发送一半。 此外,如果要执行的断开连接是正常断开连接,NDIS 可以向 MiniportTcpOffloadDisconnect 函数提供应用程序数据,该函数在发送 FIN 段之前必须传输。

语法

W_TCP_OFFLOAD_DISCONNECT_HANDLER WTcpOffloadDisconnectHandler;

NDIS_STATUS WTcpOffloadDisconnectHandler(
  [in] IN NDIS_HANDLE MiniportAdapterContext,
  [in] IN PVOID MiniportOffloadContext,
  [in] IN PNET_BUFFER_LIST NetBufferList,
  [in] IN ULONG Flags
)
{...}

参数

[in] MiniportAdapterContext

卸载目标分配的上下文区域的句柄,卸载目标在其中维护有关此适配器实例的状态信息。 卸载目标在调用 NDIS 时向 NDIS 提供了此句柄 NdisMSetMiniportAttributes MiniportInitializeEx 函数。

[in] MiniportOffloadContext

指向包含 PVOID 值的内存位置的指针。 此 PVOID 值引用微型端口卸载上下文,该上下文包含要断开连接的 TCP 连接的状态对象。 卸载目标卸载 TCP 连接状态对象时提供了此 PVOID 值。

[in] NetBufferList

指向单个 NET_BUFFER_LIST 结构的指针。 只有一个 NET_BUFFER 结构与此NET_BUFFER_LIST结构相关联。

[in] Flags

作为以下值之一,卸载目标必须执行的断开连接类型:

TCP_DISCONNECT_ABORTIVE_CLOSE

卸载目标必须通过发送 RST 段来执行中止断开连接。

TCP_DISCONNECT_GRACEFUL_CLOSE

卸载目标必须通过发送 FIN 段来执行正常断开连接。

返回值

MiniportTcpOffloadDisconnect 函数始终返回NDIS_STATUS_PENDING。 卸载目标通过调用异步完成断开连接请求 NdisTcpOffloadDisconnectComplete

言论

根据 标志 设置,MiniportTcpOffloadDisconnect 函数对指定的 TCP 连接执行中止断开连接或正常断开连接。

中止断开连接

如果 标志 设置为 TCP_DISCONNECT_ABORTIVE_CLOSE,卸载目标将通过在指定的 TCP 连接上发送 RST 段来执行中止断开连接。

注意 这是卸载目标可以发送 RST 段的唯一实例。
 
在调用 NdisTcpOffloadDisconnectComplete 函数来完成中止断开连接,卸载目标必须在连接上完成所有未完成的发送请求,状态值为 NDIS_STATUS_REQUEST_ABORTED。 卸载目标将此状态值写入链接列表中的每个NET_BUFFER_LIST结构 状态 成员,并将其传递给 NdisTcpOffloadSendComplete 函数。

卸载目标在发送 RST 段之前或之后终止未完成的发送请求并不重要。

如果连接上存在未完成的接收指示或事件指示,则卸载目标不得等待这些指示在发送 RST 段之前完成。 卸载目标必须立即停止处理连接上的接收段,并且不确认任何接收段,包括客户端应用程序未使用的指示接收数据。

标志 = TCP_DISCONNECT_ABORTIVE_CLOSE时,与 NetBufferList 指针引用的NET_BUFFER_LIST结构关联的NET_BUFFER结构不包含任何数据。 也就是说,NET_BUFFER结构的 NetBufferHeaderNET_BUFFER_DATA 结构的 DataLength 成员为零。

正常断开连接

如果 标志 设置为 TCP_DISCONNECT_GRACEFUL_CLOSE,则卸载目标通过在指定的 TCP 连接上发送 FIN 段来执行正常断开连接。

如果没有在 FIN 段之前发送用户数据,则与 NetBufferList 指针引用的NET_BUFFER_LIST结构关联的NET_BUFFER结构不包含任何数据。 如果有要发送的用户数据,则与NET_BUFFER结构关联的内存描述符列表(MDL)包含要发送的用户数据。

卸载目标不应在发送 FIN 段之前等待已传输的用户数据的确认。 卸载目标可以在传输用户数据后发送单独的 FIN 段,或者卸载目标可以在它发送的最后一段用户数据的 TCP 标头中设置 FIN 位。

从卸载目标的角度来看,发送 FIN 段会关闭连接的发送一半。 但是,发送 FIN 段不会关闭连接的接收一半。 远程主机通过将以下任一项发送到卸载目标来终止连接的接收一半:

  • FIN 段,请求正常断开连接。
  • 请求中止断开连接的 RST 段。
发送 FIN 段后,卸载目标可以接收连接上的段,直到远程主机启动正常或中止断开连接,或者本地主机终止连接的卸载或启动中止断开连接。

卸载目标调用之前 NdisTcpOffloadDisconnectComplete,它必须按照传送到卸载目标的顺序完成连接上所有未完成的发送请求。

对断开连接请求的强制响应

卸载目标不得失败断开连接请求,除非正在上传或中止指定的 TCP 连接(例如,因为远程主机在连接上发送了 RST 段)。 如果卸载目标失败,则主机堆栈不会在以后重新发出断开连接请求。

释放连接资源

卸载目标不得释放其发出中止或正常断开连接的连接的资源,直到主机堆栈终止连接的卸载。

要求

要求 价值
目标平台 窗户
标头 ndischimney.h (包括 Ndischimney.h)
IRQL 任何级别

另请参阅

MiniportInitializeEx

MiniportTerminateOffload

NET_BUFFER

NET_BUFFER_DATA

NET_BUFFER_LIST

NET_BUFFER_LIST_INFO

NdisAdvanceNetBufferDataStart

NdisMSetMiniportAttributes

NdisTcpOffloadDisconnectComplete

NdisTcpOffloadSendComplete