Propagating the Completion of a State-Manipulation Operation
[The TCP chimney offload feature is deprecated and should not be used.]
The following figure shows the propagation of the completion of a state-manipulation operation through an intermediate driver.
An offload target completes a state-manipulation operation by calling one of the following functions:
When calling one of these functions, the underlying driver or offload target passes a pointer to an NDIS_MINIPORT_OFFLOAD_BLOCK_LIST structure. Any accompanying state immediately follows the NDIS_MINIPORT_OFFLOAD_BLOCK_LIST structure in memory.
In response to the underlying driver's or offload target's call to an NdisMXxxOffloadComplete function, NDIS calls the intermediate driver's corresponding ProtocolXxxOffloadComplete function:
NDIS converts the NDIS_MINIPORT_OFFLOAD_BLOCK_LIST structure that was supplied by the offload target to an NDIS_PROTOCOL_OFFLOAD_BLOCK_LIST structure. NDIS passes a pointer to the NDIS_PROTOCOL_OFFLOAD_BLOCK_LIST structure to the intermediate driver's ProtocolXxxOffloadComplete function.
To propagate the completion of the state-manipulation operation to the host stack, the intermediate driver calls the corresponding NdisMXxxOffloadComplete function. For example, if NDIS called the intermediate driver's ProtocolQueryOffloadComplete function, the intermediate driver calls the NdisMQueryOffloadStateComplete function.
Before calling the corresponding NDIS completion function, the intermediate driver converts the NDIS_PROTOCOL_OFFLOAD_BLOCK_LIST structure that was passed in by NDIS into a NDIS_MINIPORT_OFFLOAD_BLOCK_LIST structure. (For more information about this process, see Reusing an NDIS_MINIPORT_OFFLOAD_BLOCK_LIST Structure.) The intermediate driver passes a pointer to the stored NDIS_MINIPORT_OFFLOAD_BLOCK_LIST structure to the NdisMXxxOffloadComplete function.
In addition, the intermediate driver deallocates the memory for the IM call entry that it allocated for the state-manipulation operation. For more information about the IM call entry, see Reusing a NDIS_MINIPORT_OFFLOAD_BLOCK_LIST Structure.
In response to an intermediate driver's call to the NdisMXxxOffloadComplete function, NDIS calls the host stack's corresponding ProtocolXxxOffloadComplete function.
NDIS converts the NDIS_MINIPORT_OFFLOAD_BLOCK_LIST structure that was supplied by the intermediate driver to an NDIS_PROTOCOL_OFFLOAD_BLOCK_LIST structure. NDIS passes a pointer to the NDIS_PROTOCOL_OFFLOAD_BLOCK_LIST structure to the host stack's ProtocolXxxOffloadComplete function.