W_TCP_OFFLOAD_FORWARD_HANDLER回调函数 (ndischimney.h)

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

NDIS 调用 MiniportTcpOffloadForward 函数,将未确认的已接收 TCP 段转发到卸载目标。

语法

W_TCP_OFFLOAD_FORWARD_HANDLER WTcpOffloadForwardHandler;

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

参数

[in] MiniportAdapterContext

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

[in] MiniportOffloadContext

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

[in] NetBufferList

指向 NET_BUFFER_LIST 结构的指针。 此结构可以是独立结构,也可以是NET_BUFFER_LIST结构链接列表中的第一个结构。 列表中的每个NET_BUFFER_LIST结构都描述了一个 NET_BUFFER 结构。 每个NET_BUFFER结构映射到一个内存描述符链 (MDL) 。 与NET_BUFFER结构关联的 MDL 包含一个且只有一个要转发到卸载目标的 TCP 段。 第一个 MDL 的第一个字节是 TCP 标头的第一个字节。 NET_BUFFER_LIST和关联的结构被锁定,以便它们保留在物理内存中。 但是,它们不会映射到系统内存中。

返回值

NDIS_STATUS_PENDING是唯一允许的返回值。 卸载目标始终通过调用 异步完成转发请求 NdisTcpOffloadForwardComplete 函数。

注解

在以下情况下,主机堆栈转发已接收但未确认的一个或多个 TCP 段:

  • 主机堆栈接收了 TCP 连接上正在卸载到卸载目标的段。 由于连接未完全卸载,卸载目标当时无法处理 TCP 段。
  • 主机堆栈位于多宿主系统中,该系统在网络接口上接收段,而不是 TCP 连接卸载的网段。
  • 卸载目标之前指示接收的数据包设置了 IP 选项和/或需要重新组合的片段。 处理 IP 选项和/或成功重新组合数据包后,主机堆栈会将 TCP 段转发到卸载目标。
在以下情况下,主机堆栈从不尝试转发 TCP 连接的 TCP 段:
  • 正在卸载该连接。 主机堆栈始终等待连接卸载完成,然后转发该连接的任何数据包。 完成连接卸载后,主机堆栈会尽快转发 TCP 段。 但是,转发此类段没有时间限制。
  • 正在终止该连接的卸载。 在这种情况下,主机堆栈会缓冲数据,直到卸载终止完成,然后处理段。
主机堆栈将 TCP 段(而不是 IP 数据报)转发到卸载目标。 因此,主机堆栈为每个段提供的唯一标头是 TCP 标头,包括存在的任何 TCP 选项。 这是卸载目标处理接收的段所需的所有标头信息。

转发 TCP 段时,主机堆栈为每个NET_BUFFER结构传输一个 TCP 段。 主机堆栈仅将一个NET_BUFFER结构(因此一个转发的 TCP 段)与链接列表中的每个NET_BUFFER_LIST结构相关联。

主机堆栈分配 NDIS 传递给 MiniportTcpOffloadForward 函数的NET_BUFFER_LIST和相关结构。 卸载目标拥有这些资源,直到将资源传递给 NdisTcpOffloadForwardComplete 函数。 虽然它拥有这些资源,但卸载目标可以自由地将它们排队进行处理。

要求

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

另请参阅

MiniportInitializeEx

NET_BUFFER_LIST

NdisMSetMiniportAttributes

NdisTcpOffloadForwardComplete