Partial Offloads and Offload Failures

[The TCP chimney offload feature is deprecated and should not be used.]

When a MiniportInitiateOffload request fails, the stack expects the offload target to set the Status member of the NDIS_MINIPORT_OFFLOAD_BLOCK_LIST structure. The offload target must not modify the Status member of any of the NET_BUFFER_LIST structures in the NetBufferListChain member of the NDIS_MINIPORT_OFFLOAD_BLOCK_LIST structure. The offload target must not call NdisTcpOffloadSendComplete to complete the outstanding send data.

The following figure shows a partial offload and an offload failure.

diagram illustrating a partial offload and an offload failure

When failing a MiniportInitiateOffload request the stack expects the offload target to set the Status member of the NDIS_MINIPORT_OFFLOAD_BLOCK_LIST structure. The offload target must not modify the Status member of any of the NET_BUFFER_LIST structures in the NetBufferListChain member of the NDIS_MINIPORT_OFFLOAD_BLOCK_LIST structure. The offload target must not complete the outstanding send data by calling NdisTcpOffloadSendComplete.

In the offload sequence that is shown in the preceding figure, the offload target:

  1. Offloads the Neighbor1 state object.

  2. Offloads the Path1 state object.

  3. Offloads the TCP1 state object.

  4. Fails to offload the TCP2 state object because of a resource constraint.

  5. Fails to offload the Path2 state object for a reason other than a resource constraint.

  6. Stops traversing the state tree and does not attempt to offload the TCP3 state object.

Note that, if the offload target cannot offload the state that is associated with the root block list, it stops traversing the tree.

For each state object in the preceding figure, the offload target writes the following value to the Status member of the NDIS_MINIPORT_OFFLOAD_BLOCK_LIST structure that is associated with the state object:

State Object Value in Status Member Description

Neighbor1

NDIS_STATUS_OFFLOAD_PARTIAL_SUCCESS

Neighbor1 and Path1 were successfully offloaded. However, Path2 was not offloaded.

Path1

NDIS_STATUS_OFFLOAD_PARTIAL_SUCCESS

Path1 and TCP1 were successfully offloaded. However, TCP2 was not offloaded.

TCP1

NDIS_STATUS_SUCCESS

TCP1 was successfully offloaded. There are no dependent state objects.

TCP2

NDIS_STATUS_RESOURCES

TCP2 was not offloaded because of resource constraints.

Path2

NDIS_STATUS_FAILURE

Path2 was not offloaded. The problem was not a resource constraint.

TCP3

NDIS_STATUS_FAILURE

TCP3 was not offloaded. The problem was not a resource constraint.