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.
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 |