NdisMIndicateReceivePacket

VOID
    NdisMIndicateReceivePacket(
        IN NDIS_HANDLE  MiniportAdapterHandle,
        IN PPNDIS_PACKET  ReceivePackets,
        IN UINT  NumberOfPackets
        ); 

NdisMIndicateReceivePacket notifies NDIS that an array of received packets is available to be forwarded to the appropriate bound protocol driver(s).

Parameters

MiniportAdapterHandle
Specifies the handle originally input to MiniportInitialize.
ReceivePackets
Points to an array of packet descriptor pointers, with each descriptor set up by the caller to specify the received data.
NumberOfPackets
Specifies how many pointers are in the array at ReceivePackets. The value must be at least one.

Comments

Drivers of busmaster DMA NICs are most likely to show significant gains in performance by making multipacket receive indications with NdisMIndicateReceivePacket. However, drivers that indicate out-of-band data with receive packets, such as packet priority and/or timestamps, also can call this function with a single packet at a time.

When a miniport calls NdisMIndicateReceivePacket, NDIS passes each pointer at ReceivePackets separately, in the miniport-determined order, to the ProtocolReceivePacket function(s) of bound protocol(s) that export this function. To other bound protocols, NDIS passes each packet pointer to the ProtocolReceive function(s).

If the miniport did not designate its NIC’s medium as a type for which the system supplies a filter package in response to the OID_GEN_MEDIA_IN_USE query, NDIS forwards that driver’s receive indications to all bound protocol drivers that export a ProtocolReceivePackets function. Otherwise, NDIS automatically applies the appropriate filter library to the miniport’s receive indications.

Any caller of NdisMIndicateReceivePacket must first set up the packet array, as follows:

The miniport should use NDIS_GET_PACKET_STATUS to determine whether it has regained ownership of indicated packets when NdisMIndicateReceivePackets returns control.

When the miniport regains ownership of an indicated packet descriptor, it can prepare the associated out-of-band data block for reuse by passing the pointer returned by NDIS_OOB_DATA_FROM_PACKET to NdisZeroMemory. As an alternative, the miniport can simply reset the relevant member(s) at the subsequent receive with the NDIS_SET_PACKET_XXX macro(s) or with the pointer returned by NDIS_OOB_DATA_FROM_PACKET.

A miniport must not pass a packet descriptor pointer to NdisZeroMemory. Doing this destroys the packet descriptor, rendering it unusable for subsequent indications. To clear the associated out-of-band data block, the driver must pass the pointer returned by NDIS_OOB_DATA_FROM_PACKET.

Packet arrays passed to NdisMIndicateReceivePacket can be allocated on the stack, which cannot be paged out in the NDIS library’s receive-indication code path.

When NDIS calls the ProtocolReceive function of a driver that exports a ProtocolReceivePacket function, ProtocolReceive can call NdisQueryReceiveInformation to retrieve the out-of-band information associated with an incoming packet that was indicated as part of a packet array.

Any miniport that calls NdisMIndicateReceivePacket must indicate full packets. Consequently, such a driver has no MiniportTransferData function.

Callers of NdisMIndicateReceivePacket can run at IRQL <= DISPATCH_LEVEL, but usually callers are running at DISPATCH_LEVEL.

See Also

MiniportHandleInterrupt, MiniportInitialize, MiniportQueryInformation, MiniportReturnPacket, MiniportTimer, NdisAdjustBufferLength, NdisAllocateBuffer, NdisAllocatePacket, NdisChainBufferAtBack, NdisChainBufferAtFront, NdisGetCurrentSystemTime, NDIS_GET_PACKET_STATUS, NdisMAllocateSharedMemoryAsync, NDIS_OOB_DATA_FROM_PACKET, NdisQueryReceiveInformation, NDIS_PACKET, NDIS_PACKET_OOB_DATA, NDIS_SET_PACKET_TIME_RECEIVED, NDIS_SET_PACKET_TIME_SENT, NdisZeroMemory, ProtocolReceive, ProtocolReceivePacket