2.3.2.9 Packet and Buffer Functions
Miniport NIC drivers have a need to allocate buffers for receiving incoming data. The driver of a busmaster DMA device that indicates the entire incoming packet up to interested protocols must allocate and manage packets for this purpose. A NIC driver might need to allocate buffer space to stage data on a send if the packet it receives from an upper layer is small and fragmented. On a send, all miniport NIC drivers receive a complete packet and must call NDIS functions to manipulate those packets and extract the data to be sent. A miniport that transfers incoming data to an upper layer driver receives a packet from the upper layer and must manipulate the packet structure to fill it with received data. NDIS provides functions that miniport drivers can call to allocate, construct, and inspect packets.
NDIS defines a packet as a packet descriptor with a chain of one or more buffers containing the network packet data. The ndis library describes a packet descriptor by defining the NDIS_PACKET structure. The descriptor consists of two parts: a public component that a miniport driver can see, and a private component that is invisible to the driver. The public component allows a miniport driver to maintain context information about the packet. A miniport driver can use this component to link packets into data transfer queues.
Function | Definition |
NdisAllocatePacketPool | Allocates and initializes a block of nonpaged packet pool. The caller supplies the requested number of packet descriptors and the size in bytes of each fixed-size packet. |
NdisAllocatePacket | Allocates a fixed-size packet descriptor from the packet pool returned by NdisAllocatePacketPool. |
NdisAllocateBufferPool | Returns a handle with which the caller can allocate buffer descriptors with NdisAllocateBuffer. |
NdisAllocateBuffer | Creates a buffer descriptor mapping a specified virtual range within an already allocated, nonpaged memory block, given a handle returned by NdisAllocateBufferPool. |
NdisAdjustBufferLength | Modifies the length of the range specified in a given buffer descriptor. |
NdisCopyBuffer | Creates a buffer descriptor for a specified range, given a handle for a block of already allocated memory and a pointer to the buffer descriptor for the block. |
NdisCopyFromPacketToPacket | Copies a specified number of bytes from one packet to another, given a specified source packet and a destination packet and specified offsets in each. |
NdisCreateLookaheadBufferFromSharedMemory | Returns the virtual address of a buffer within a block of memory shared with a busmaster DMA NIC. Allows a driver to map a portion of received data to indicate up to interested protocols as a read-only lookahead buffer. |
NdisDestroyLookaheadBufferFromSharedMemory | Releases a buffer acquired by calling NdisCreateLookaheadBufferFromSharedMemory. |
NdisQueryPacket | Returns a set of information that describes a packet and a pointer to the initial buffer in the chain. |
NdisQueryBuffer | Returns the base virtual address and size of a buffer that is mapped by a given buffer descriptor. |
NdisQueryBufferOffset | Returns the base virtual address of the range specified in a given buffer descriptor. |
NdisGetFirstBufferFromPacket | Returns pointers to the buffer descriptor and base virtual address for the initial buffer chained to a given packet, along with the size of the initial buffer and full buffer, in case the buffer is fragmented. |
NdisGetNextBuffer | Returns the next buffer descriptor in a chain, given the current buffer descriptor. |
NdisGetPacketFlags | Returns the flags, if any, set by a protocol driver in a given packet. |
NdisFreePacketPool | Releases a block of nonpaged pool allocated by calling NdisAllocatePacketPool. |
NdisFreePacket | Releases a packet allocated by calling NdisAllocatePacket. |
NdisFreeBufferPool | Releases a handle obtained by calling NdisAllocateBufferPool. |
NdisFreeBuffer | Releases a buffer descriptor allocated by calling NdisAllocateBuffer. |
NdisChainBufferAtFront | Links a given buffer descriptor at the front of a chain of buffer descriptors for a given packet. |
NdisChainBufferAtBack | Links a given buffer descriptor at the end of a chain of buffer descriptors for a given packet. |
NdisUnchainBufferAtFront | Removes a given buffer descriptor from the front of a chain of buffer descriptors for a given packet and returns a pointer to that buffer descriptor. |
NdisUnchainBufferAtBack | Removes a given buffer descriptor from the back of a chain of buffer descriptors for a given packet and returns a pointer to that buffer descriptor. |
NdisReinitializePacket | Removes any chained buffers from a given packet and reinitializes it for reuse. |
NdisRecalculatePacketCounts | Resets the valid count for a given packet so that the next call to NdisQueryPacket recalculates the counts. |