Handling Outstanding Send Data During and After an Offload Operation
When the host stack initiates the offload of a TCP connection, there might be outstanding send data on the connection. This data can include:
Data that the host stack has sent but that has not yet been acknowledged by the remote host.
Data that the host stack has not yet sent.
When offloading a TCP connection when there is outstanding send data on the connection, the host stack specifies a pointer in the NetBufferListChain member of the NDIS_MINIPORT_OFFLOAD_BLOCK_LIST structure that immediately precedes the delegated TCP state for that TCP connection. NetBufferListChain points to a NET_BUFFER_LIST structure that can be stand-alone or the first structure in a linked list of NET_BUFFER_LIST structures. Each NET_BUFFER_LIST structure in the linked list describes one NET_BUFFER structure. The memory descriptor lists (MDLs) that are associated with the NET_BUFFER structures in the list contain the send data.
The TCP_OFFLOAD_STATE_DELEGATED structure that is offloaded for the connection contains a pointer in the SendDataHead member and a pointer in the SendDataTail member. Each of these pointers points to a single NET_BUFFER_LIST structure in the linked list that is referenced by NetBufferListChain :
The pointer in SendDataHead points to the first NET_BUFFER_LIST structure whose NET_BUFFER structure has send data associated with it.
The pointer in SendDataTail points to the last NET_BUFFER_LIST structure whose NET_BUFFER structure has send data associated with it.
Note that the offload target does not have to copy the send data into its own buffers. The offload target can transmit the send data directly from the buffers that are supplied by the host stack.
In the TCP delegated state (the TCP_OFFLOAD_STATE_DELEGATED structure) for the connection that is being offloaded, the host stack also specifies the following members that are related to send data. For more information, see Send Data That Contains Data to Be Retransmitted.
The sequence number for the first byte of unacknowledged data (see SND.UNA in RFC 793).
The sequence number for the next byte to send on the connection (see SND.NEXT in RFC 793).
The maximum sequence number that has been sent on the connection.