Placeholders, Linkers, and New Offloads

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

An NDIS_MINIPORT_OFFLOAD_BLOCK_LIST structure in a state tree can perform one of several functions.

The following figure shows the various functions that an NDIS_MINIPORT_OFFLOAD_BLOCK_LIST structure can perform in a state tree that is passed to an offload target's MiniportInitiateOffload function.

diagram illustrating the functions that an ndis-miniport-offload-block-list structure can perform in a state tree

An offload block list acts as a placeholder if it has a NULL value in the MiniportOffloadContext member. No offload state is associated with a placeholder, and the placeholder does not reference an offloaded state object. The placeholder simply provides a node to which dependent block lists are attached.

A placeholder is not required to point to a dependent block list. If there is no dependent block list, the miniport must complete the request with NDIS_STATUS_SUCCESS.

When traversing a tree, an offload target uses the links that are provided by a placeholder. Before returning from an initiate offload, query offload, invalidate offload, update offload, or terminate offload operation, an offload target must write a status value to the Status member of the placeholder block list (NDIS_MINIPORT_OFFLOAD_BLOCK_LIST).

An offload block list acts as a linker if its MiniportOffloadContext member has a non-NULL value that points to a memory location that contains a non-NULL PVOID. No offload state is associated with a linker block list, but the block list does reference an offloaded state object. A linker block list always points to a dependent block list that is used to convey new offload state. The offload target links the new offload state with the offloaded state object that the linker referenced.

An offload block list acts as an offload node if its MiniportOffloadContext member has a non-NULL value that points to a memory location that contains a NULL PVOID value. Such a block list is always followed by the state that is to be offloaded.

The following table summarizes the differences between placeholders, linkers, and new offload block lists.

Feature Placeholder Linker New offload block list

Value of MiniportOffloadContext

NULL

non-NULL

non-NULL

Value that is pointed to by

*MiniportOffloadContext

Not significant

non-NULL

NULL

Type

Not significant

Identifies the type of state

Identifies the type of state to be offloaded

Followed by offload state?

No

No

Yes

Completion status that is written by offload target

Always NDIS_STATUS_SUCCESS

If all dependent blocks successfully offloaded:

NDIS_STATUS_SUCCESS

If one or more dependent blocks failed to offload:

NDIS_STATUS_PARTIAL_SUCCESS

If all dependent blocks failed to offload: NDIS_STATUS_FAILURE

Depends on completion of offload operation