Propagating an I/O Operation

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

The following figure shows the propagation of a TCP chimney I/O operation through an intermediate driver.

diagram illustrating the propagation of a tcp chimney i/o operation through an intermediate driver

The host stack initiates an I/O operation by calling one of the following NDIS function

When calling an NdisOffloadTcpXxx function, the host stack passes in the following:

  • An NdisOffloadHandle parameter, which is a pointer to the NDIS_OFFLOAD_HANDLE structure in the host stack's Transmission Control Block (TCB). (For more information about how an offload target uses this handle, see Referencing Offloaded State Through an Intermediate Driver.

  • A pointer to a NET_BUFFER_LIST structure. This structure can be a stand-alone structure or the first structure in a linked list of such structures. Each NET_BUFFER_LIST structure in the list describes one NET_BUFFER structure. The NET_BUFFER structure maps to a chain of memory descriptor lists (MDLs).

In response to the host stack's call to an NdisOffloadTcpXxx function, NDIS calls the intermediate driver's corresponding MiniportTcpOffloadXxx function:

From the host stack's NDIS_OFFLOAD_HANDLE structure, NDIS extracts the MiniportOffloadContext pointer and passes it, as the MiniportOffloadContext parameter, to the underlying intermediate driver's MiniportTcpOffloadXxx function. This pointer references the intermediate driver's context (called the IM offload entry) for the offloaded TCP connection.

To propagate the I/O operation to the underlying driver or offload target, the intermediate driver calls the corresponding NdisOffloadTcpXxx function (the same function that the host stack called to initiate the I/O operation). To the NdisOffloadTcpXxx**** function, the intermediate driver passes:

  • An NdisOffloadHandle parameter that references the NDIS_OFFLOAD_HANDLE structure that is stored in the intermediate driver's context for the offloaded TCP connection.

  • The same PNET_BUFFER_LIST pointer that NDIS passed to the intermediate driver's MiniportTcpOffloadXxx function.

From the intermediate driver's NDIS_OFFLOAD_HANDLE structure, NDIS extracts the MiniportOffloadContext pointer and passes it, as the MiniportOffloadContext parameter, to the offload target's MiniportTcpOffloadXxx function. This pointer references the offload target's context for the offloaded TCP connection. NDIS also passes the same PNET_BUFFER_LIST pointer that the intermediate driver passed to the NdisOffloadTcpXxx function.