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 连接执行中止断开连接或正常断开连接。

中止断开连接

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

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

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

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

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

正常断开连接

如果 Flags 设置为 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 段。 如果卸载目标在断开连接请求中失败,则主机堆栈以后不会重新发出断开连接请求。

释放连接资源

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

要求

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

另请参阅

MiniportInitializeEx

MiniportTerminateOffload

NET_BUFFER

NET_BUFFER_DATA

NET_BUFFER_LIST

NET_BUFFER_LIST_INFO

NdisAdvanceNetBufferDataStart

NdisMSetMiniportAttributes

NdisTcpOffloadDisconnectComplete

NdisTcpOffloadSendComplete