4.4.2 Completion Options

MiniportSendPackets is passed an array of packets (although a single packet could be passed this way). The status must be set individually in the OOB data block for each packet descriptor in the array before returning.

For instance, the miniport might return NDIS_STATUS_PENDING for a packet in the array to indicate that the miniport is not done with such a packet. It is also possible for the miniport to reject one or more packets in an array due to a lack of available resources, such as transmit buffer space in the NIC. In this case, MiniportSendPackets sets the Status member for the first rejected packet in the array to NDIS_STATUS_RESOURCES before returning.

NDIS assumes that, if this status is set for one element, it is set in all subsequent array elements, and NDIS then requeues the packets for resubmission to the miniport later. In effect, the miniport relinquishes ownership, temporarily or permanently, of any packet in an array of packets for which it sets a Status other than NDIS_STATUS_PENDING before returning from MiniportSendPackets. Otherwise, the miniport owns those packet resources until it later relinquishes ownership by calling NdisMSendComplete, passing the final status of the send as a parameter to this call.

MiniportSend returns the status of the send operation as the status of the function. It relinquishes ownership of any packet for which it returns a status other than pending. As is true for MiniportSendPackets, if MiniportSend returns NDIS_STATUS_PENDING for any packet, the miniport must call NdisMSendComplete later when the send completes. In such a case, the status of the completed send is returned as the Status parameter to NdisMSendComplete.