W_TCP_OFFLOAD_SEND_HANDLER回调函数 (ndischimney.h)
[TCP 烟囱卸载功能已弃用,不应使用。]
NDIS 调用 MiniportTcpOffloadSend 函数,以在卸载的 TCP 连接上传输数据。
语法
W_TCP_OFFLOAD_SEND_HANDLER WTcpOffloadSendHandler;
NDIS_STATUS WTcpOffloadSendHandler(
[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 连接状态对象时提供了此 PVOID 值。
[in] NetBufferList
指向 NET_BUFFER_LIST 结构的指针。 此结构可以是独立结构,也可以是NET_BUFFER_LIST结构链接列表中的第一个结构。 列表中的每个NET_BUFFER_LIST结构都描述 NET_BUFFER 结构的列表。 列表中的每个NET_BUFFER结构映射到内存描述符列表的链, (MDL) 。 MDL 包含要传输的数据。 NET_BUFFER_LIST和关联的结构被锁定,以便它们保留在物理内存中。 但是,它们不会映射到系统内存中。
返回值
NDIS_STATUS_PENDING是唯一允许的返回值。 卸载目标始终通过调用异步完成发送请求 NdisTcpOffloadSendComplete。
注解
卸载目标必须按先入先出 (FIFO) 顺序传输数据。 NDIS 在 NetBufferList 中传递NET_BUFFER_LIST结构的链接列表的顺序表示卸载目标必须传输网络数据的顺序。 此外,卸载目标应按数据发布顺序从多个调用收到的数据发送到 MiniportTcpOffloadSend 。
卸载目标必须接受对其 MiniportTcpOffloadSend 函数发出的所有发送请求。 如果卸载目标无法立即完成发送请求,则卸载目标必须将请求排队,直到可以完成该请求。 卸载目标应使用 NET_BUFFER_LIST 结构的 MiniportReserved 成员对发送请求进行排队。 当发送请求处于挂起状态时,卸载目标保留NET_BUFFER_LIST结构和与NET_BUFFER_LIST结构关联的所有资源的所有权。
主机堆栈根据每个连接序列化发送请求。 堆栈不会在该连接上的另一个发送请求正在进行时对连接发出发送请求。 这可确保卸载目标始终按正确顺序接收发送请求。
但请注意,主机堆栈可以在连接上调用 MiniportTcpOffloadSend 函数,然后卸载目标完成对同一连接上 MiniportTcpOffloadSend 函数的一个或多个先前调用。 另请注意,主机堆栈可以在一个连接上调用卸载目标的 MiniportTcpOffloadSend 函数,而对 MiniportTcpOffloadSend 函数的一个或多个调用在另一个连接上进行。
MiniportTcpOffloadSend 函数必须将对其内部网络数据队列的访问与卸载目标的其他 MiniportXxx 函数(访问相同队列)同步。 卸载目标可以使用旋转锁来同步对队列的访问。
卸载目标应 (,但不需要在每个NET_BUFFER_LIST边界上) 设置 PSH 位。 建议执行此操作的方法是在最后一个段中设置 PSH 位,该段根据与每个NET_BUFFER_LIST结构关联的数据 (即与NET_BUFFER_LIST结构关联的NET_BUFFER结构描述的数据) 。 或者,卸载目标可以在清空发送队列之前,在发送队列的最后一个剩余段中设置 PSH 位。
主机堆栈不会请求卸载目标发送紧急数据。
要求
要求 | 值 |
---|---|
目标平台 | Windows |
标头 | ndischimney.h (包括 Ndischimney.h) |
IRQL | 任何级别 |