A version of LWIP, provided for backwards compatibility.

Dependents:   AA_DemoBoard DemoBoard HelloServerDemo DemoBoard_RangeIndicator ... more

Embed: (wiki syntax)

« Back to documentation index

pbuf.c File Reference

pbuf.c File Reference

Packet buffer management. More...

Go to the source code of this file.

Functions

static struct pbuf * alloc_pool_pbuf (void)
 Attempt to reclaim some memory from queued out-of-sequence TCP segments if we run out of pool pbufs.
struct pbuf * pbuf_alloc (pbuf_layer layer, u16_t length, pbuf_type type)
 Allocates a pbuf of the given type (possibly a chain for PBUF_POOL type).
void pbuf_realloc (struct pbuf *p, u16_t new_len)
 Shrink a pbuf chain to a desired length.
u8_t pbuf_header (struct pbuf *p, s16_t header_size_increment)
 Adjusts the payload pointer to hide or reveal headers in the payload.
u8_t pbuf_free (struct pbuf *p)
 Dereference a pbuf chain or queue and deallocate any no-longer-used pbufs at the head of this chain or queue.
u8_t pbuf_clen (struct pbuf *p)
 Count number of pbufs in a chain.
void pbuf_ref (struct pbuf *p)
 Increment the reference count of the pbuf.
void pbuf_cat (struct pbuf *h, struct pbuf *t)
 Concatenate two pbufs (each may be a pbuf chain) and take over the caller's reference of the tail pbuf.
void pbuf_chain (struct pbuf *h, struct pbuf *t)
 Chain two pbufs (or pbuf chains) together.
struct pbuf * pbuf_dechain (struct pbuf *p)
 Dechains the first pbuf from its succeeding pbufs in the chain.
err_t pbuf_copy (struct pbuf *p_to, struct pbuf *p_from)
 Create PBUF_RAM copies of pbufs.
u16_t pbuf_copy_partial (struct pbuf *buf, void *dataptr, u16_t len, u16_t offset)
 Copy (part of) the contents of a packet buffer to an application supplied buffer.
err_t pbuf_take (struct pbuf *buf, const void *dataptr, u16_t len)
 Copy application supplied data into a pbuf.
struct pbuf * pbuf_coalesce (struct pbuf *p, pbuf_layer layer)
 Creates a single pbuf out of a queue of pbufs.

Detailed Description

Packet buffer management.

Packets are built from the pbuf data structure. It supports dynamic memory allocation for packet contents or can reference externally managed packet contents both in RAM and ROM. Quick allocation for incoming packets is provided through pools with fixed sized pbufs.

A packet may span over multiple pbufs, chained as a singly linked list. This is called a "pbuf chain".

Multiple packets may be queued, also using this singly linked list. This is called a "packet queue".

So, a packet queue consists of one or more pbuf chains, each of which consist of one or more pbufs. CURRENTLY, PACKET QUEUES ARE NOT SUPPORTED!!! Use helper structs to queue multiple packets.

The differences between a pbuf chain and a packet queue are very precise but subtle.

The last pbuf of a packet has a ->tot_len field that equals the ->len field. It can be found by traversing the list. If the last pbuf of a packet has a ->next field other than NULL, more packets are on the queue.

Therefore, looping through a pbuf of a single packet, has an loop end condition (tot_len == p->len), NOT (next == NULL).

Definition in file trunk/Core/lwIP/core/pbuf.c.


Function Documentation

static struct pbuf* alloc_pool_pbuf ( void   ) [static, read]

Attempt to reclaim some memory from queued out-of-sequence TCP segments if we run out of pool pbufs.

It's better to give priority to new packets if we're running out.

Returns:
the allocated pbuf.

Definition at line 100 of file trunk/Core/lwIP/core/pbuf.c.

struct pbuf* pbuf_alloc ( pbuf_layer  layer,
u16_t  length,
pbuf_type  type 
) [read]

Allocates a pbuf of the given type (possibly a chain for PBUF_POOL type).

The actual memory allocated for the pbuf is determined by the layer at which the pbuf is allocated and the requested size (from the size parameter).

Parameters:
layerflag to define header size
lengthsize of the pbuf's payload
typethis parameter decides how and where the pbuf should be allocated as follows:
  • PBUF_RAM: buffer memory for pbuf is allocated as one large chunk. This includes protocol headers as well.
  • PBUF_ROM: no buffer memory is allocated for the pbuf, even for protocol headers. Additional headers must be prepended by allocating another pbuf and chain in to the front of the ROM pbuf. It is assumed that the memory used is really similar to ROM in that it is immutable and will not be changed. Memory which is dynamic should generally not be attached to PBUF_ROM pbufs. Use PBUF_REF instead.
  • PBUF_REF: no buffer memory is allocated for the pbuf, even for protocol headers. It is assumed that the pbuf is only being used in a single thread. If the pbuf gets queued, then pbuf_take should be called to copy the buffer.
  • PBUF_POOL: the pbuf is allocated as a pbuf chain, with pbufs from the pbuf pool that is allocated during pbuf_init().
Returns:
the allocated pbuf. If multiple pbufs where allocated, this is the first pbuf of a pbuf chain.

Definition at line 152 of file trunk/Core/lwIP/core/pbuf.c.

void pbuf_cat ( struct pbuf *  h,
struct pbuf *  t 
)

Concatenate two pbufs (each may be a pbuf chain) and take over the caller's reference of the tail pbuf.

Note:
The caller MAY NOT reference the tail pbuf afterwards. Use pbuf_chain() for that purpose.
See also:
pbuf_chain()

Definition at line 614 of file trunk/Core/lwIP/core/pbuf.c.

void pbuf_chain ( struct pbuf *  h,
struct pbuf *  t 
)

Chain two pbufs (or pbuf chains) together.

The caller MUST call pbuf_free(t) once it has stopped using it. Use pbuf_cat() instead if you no longer use t.

Parameters:
hhead pbuf (chain)
ttail pbuf (chain)
Note:
The pbufs MUST belong to the same packet.
MAY NOT be called on a packet queue.

The ->tot_len fields of all pbufs of the head chain are adjusted. The ->next field of the last pbuf of the head chain is adjusted. The ->ref field of the first pbuf of the tail chain is adjusted.

Definition at line 655 of file trunk/Core/lwIP/core/pbuf.c.

u8_t pbuf_clen ( struct pbuf *  p )

Count number of pbufs in a chain.

Parameters:
pfirst pbuf of chain
Returns:
the number of pbufs in a chain

Definition at line 573 of file trunk/Core/lwIP/core/pbuf.c.

struct pbuf* pbuf_coalesce ( struct pbuf *  p,
pbuf_layer  layer 
) [read]

Creates a single pbuf out of a queue of pbufs.

Remarks:
: The source pbuf 'p' is not freed by this function because that can be illegal in some places!
Parameters:
pthe source pbuf
layerpbuf_layer of the new pbuf
Returns:
a new, single pbuf (p->next is NULL) or the old pbuf if allocation fails

Definition at line 879 of file trunk/Core/lwIP/core/pbuf.c.

err_t pbuf_copy ( struct pbuf *  p_to,
struct pbuf *  p_from 
)

Create PBUF_RAM copies of pbufs.

Used to queue packets on behalf of the lwIP stack, such as ARP based queueing.

Note:
You MUST explicitly use p = pbuf_take(p);
Only one packet is copied, no packet queue!
Parameters:
p_topbuf destination of the copy
p_frompbuf source of the copy
Returns:
ERR_OK if pbuf was copied ERR_ARG if one of the pbufs is NULL or p_to is not big enough to hold p_from

Definition at line 721 of file trunk/Core/lwIP/core/pbuf.c.

u16_t pbuf_copy_partial ( struct pbuf *  buf,
void *  dataptr,
u16_t  len,
u16_t  offset 
)

Copy (part of) the contents of a packet buffer to an application supplied buffer.

Parameters:
bufthe pbuf from which to copy data
dataptrthe application supplied buffer
lenlength of data to copy (dataptr must be big enough). No more than buf->tot_len will be copied, irrespective of len
offsetoffset into the packet buffer from where to begin copying len bytes
Returns:
the number of bytes copied, or 0 on failure

Definition at line 787 of file trunk/Core/lwIP/core/pbuf.c.

struct pbuf* pbuf_dechain ( struct pbuf *  p ) [read]

Dechains the first pbuf from its succeeding pbufs in the chain.

Makes p->tot_len field equal to p->len.

Parameters:
ppbuf to dechain
Returns:
remainder of the pbuf chain, or NULL if it was de-allocated.
Note:
May not be called on a packet queue.

Definition at line 672 of file trunk/Core/lwIP/core/pbuf.c.

u8_t pbuf_free ( struct pbuf *  p )

Dereference a pbuf chain or queue and deallocate any no-longer-used pbufs at the head of this chain or queue.

Decrements the pbuf reference count. If it reaches zero, the pbuf is deallocated.

For a pbuf chain, this is repeated for each pbuf in the chain, up to the first pbuf which has a non-zero reference count after decrementing. So, when all reference counts are one, the whole chain is free'd.

Parameters:
pThe pbuf (chain) to be dereferenced.
Returns:
the number of pbufs that were de-allocated from the head of the chain.
Note:
MUST NOT be called on a packet queue (Not verified to work yet).
the reference counter of a pbuf equals the number of pointers that refer to the pbuf (or into the pbuf).

Definition at line 498 of file trunk/Core/lwIP/core/pbuf.c.

u8_t pbuf_header ( struct pbuf *  p,
s16_t  header_size_increment 
)

Adjusts the payload pointer to hide or reveal headers in the payload.

Adjusts the ->payload pointer so that space for a header (dis)appears in the pbuf payload.

The ->payload, ->tot_len and ->len fields are adjusted.

Parameters:
ppbuf to change the header size.
header_size_incrementNumber of bytes to increment header size which increases the size of the pbuf. New space is on the front. (Using a negative value decreases the header size.) If hdr_size_inc is 0, this function does nothing and returns succesful.

PBUF_ROM and PBUF_REF type buffers cannot have their sizes increased, so the call will fail. A check is made that the increase in header size does not move the payload pointer in front of the start of the buffer.

Returns:
non-zero on failure, zero on success.

Definition at line 391 of file trunk/Core/lwIP/core/pbuf.c.

void pbuf_realloc ( struct pbuf *  p,
u16_t  new_len 
)

Shrink a pbuf chain to a desired length.

Parameters:
ppbuf to shrink.
new_lendesired new length of pbuf chain

Depending on the desired length, the first few pbufs in a chain might be skipped and left unchanged. The new last pbuf in the chain will be resized, and any remaining pbufs will be freed.

Note:
If the pbuf is ROM/REF, only the ->tot_len and ->len fields are adjusted.
May not be called on a packet queue.
Despite its name, pbuf_realloc cannot grow the size of a pbuf (chain).

Definition at line 310 of file trunk/Core/lwIP/core/pbuf.c.

void pbuf_ref ( struct pbuf *  p )

Increment the reference count of the pbuf.

Parameters:
ppbuf to increase reference counter of

Definition at line 592 of file trunk/Core/lwIP/core/pbuf.c.

err_t pbuf_take ( struct pbuf *  buf,
const void *  dataptr,
u16_t  len 
)

Copy application supplied data into a pbuf.

This function can only be used to copy the equivalent of buf->tot_len data.

Parameters:
bufpbuf to fill with data
dataptrapplication supplied data buffer
lenlength of the application supplied data buffer
Returns:
ERR_OK if successful, ERR_MEM if the pbuf is not big enough

Definition at line 835 of file trunk/Core/lwIP/core/pbuf.c.