ConOpSys V2970
P004.07
ANVILEX control operating system
|
Macros | |
#define | PBUF_NEEDS_COPY(p) ((p)->type_internal & PBUF_TYPE_FLAG_DATA_VOLATILE) |
Enumerations | |
enum | pbuf_layer { PBUF_TRANSPORT = PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN + PBUF_IP_HLEN + PBUF_TRANSPORT_HLEN , PBUF_IP = PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN + PBUF_IP_HLEN , PBUF_LINK = PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN , PBUF_RAW_TX = PBUF_LINK_ENCAPSULATION_HLEN , PBUF_RAW = 0 } |
enum | pbuf_type { PBUF_RAM = (PBUF_ALLOC_FLAG_DATA_CONTIGUOUS | PBUF_TYPE_FLAG_STRUCT_DATA_CONTIGUOUS | PBUF_TYPE_ALLOC_SRC_MASK_STD_HEAP) , PBUF_ROM = PBUF_TYPE_ALLOC_SRC_MASK_STD_MEMP_PBUF , PBUF_REF = (PBUF_TYPE_FLAG_DATA_VOLATILE | PBUF_TYPE_ALLOC_SRC_MASK_STD_MEMP_PBUF) , PBUF_POOL = (PBUF_ALLOC_FLAG_RX | PBUF_TYPE_FLAG_STRUCT_DATA_CONTIGUOUS | PBUF_TYPE_ALLOC_SRC_MASK_STD_MEMP_PBUF_POOL) } |
Functions | |
struct pbuf * | pbuf_alloc (pbuf_layer layer, u16_t length, pbuf_type type) |
struct pbuf * | pbuf_alloc_reference (void *payload, u16_t length, pbuf_type type) |
void | pbuf_realloc (struct pbuf *p, u16_t new_len) |
u8_t | pbuf_free (struct pbuf *p) |
void | pbuf_ref (struct pbuf *p) |
void | pbuf_cat (struct pbuf *h, struct pbuf *t) |
void | pbuf_chain (struct pbuf *h, struct pbuf *t) |
err_t | pbuf_copy (struct pbuf *p_to, const struct pbuf *p_from) |
u16_t | pbuf_copy_partial (const struct pbuf *buf, void *dataptr, u16_t len, u16_t offset) |
void * | pbuf_get_contiguous (const struct pbuf *p, void *buffer, size_t bufsize, u16_t len, u16_t offset) |
struct pbuf * | pbuf_skip (struct pbuf *in, u16_t in_offset, u16_t *out_offset) |
err_t | pbuf_take (struct pbuf *buf, const void *dataptr, u16_t len) |
err_t | pbuf_take_at (struct pbuf *buf, const void *dataptr, u16_t len, u16_t offset) |
struct pbuf * | pbuf_coalesce (struct pbuf *p, pbuf_layer layer) |
struct pbuf * | pbuf_clone (pbuf_layer layer, pbuf_type type, struct pbuf *p) |
u8_t | pbuf_get_at (const struct pbuf *p, u16_t offset) |
int | pbuf_try_get_at (const struct pbuf *p, u16_t offset) |
void | pbuf_put_at (struct pbuf *p, u16_t offset, u8_t data) |
u16_t | pbuf_memcmp (const struct pbuf *p, u16_t offset, const void *s2, u16_t n) |
u16_t | pbuf_memfind (const struct pbuf *p, const void *mem, u16_t mem_len, u16_t start_offset) |
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).
Example of custom pbuf usage: zerocopyrx
#define PBUF_NEEDS_COPY | ( | p | ) | ((p)->type_internal & PBUF_TYPE_FLAG_DATA_VOLATILE) |
PBUF_NEEDS_COPY(p): return a boolean value indicating whether the given pbuf needs to be copied in order to be kept around beyond the current call stack without risking being corrupted. The default setting provides safety: it will make a copy iof any pbuf chain that does not consist entirely of PBUF_ROM type pbufs. For setups with zero-copy support, it may be redefined to evaluate to true in all cases, for example. However, doing so also has an effect on the application side: any buffers that are not copied must also not be reused by the application after passing them to lwIP. For example, when setting PBUF_NEEDS_COPY to (0), after using udp_send() with a PBUF_RAM pbuf, the application must free the pbuf immediately, rather than reusing it for other purposes. For more background information on this, see tasks #6735 and #7896, and bugs #11400 and #49914.
enum pbuf_layer |
Enumeration of pbuf layers
Enumerator | |
---|---|
PBUF_TRANSPORT | Includes spare room for transport layer header, e.g. UDP header. Use this if you intend to pass the pbuf to functions like udp_send(). |
PBUF_IP | Includes spare room for IP header. Use this if you intend to pass the pbuf to functions like raw_send(). |
PBUF_LINK | Includes spare room for link layer header (ethernet header). Use this if you intend to pass the pbuf to functions like ethernet_output().
|
PBUF_RAW_TX | Includes spare room for additional encapsulation header before ethernet headers (e.g. 802.11). Use this if you intend to pass the pbuf to functions like netif->linkoutput().
|
PBUF_RAW | Use this for input packets in a netif driver when calling netif->input() in the most common case - ethernet-layer netif driver. |
enum pbuf_type |
Enumeration of pbuf types
Enumerator | |
---|---|
PBUF_RAM | pbuf data is stored in RAM, used for TX mostly, struct pbuf and its payload are allocated in one piece of contiguous memory (so the first payload byte can be calculated from struct pbuf). pbuf_alloc() allocates PBUF_RAM pbufs as unchained pbufs (although that might change in future versions). This should be used for all OUTGOING packets (TX). |
PBUF_ROM | pbuf data is stored in ROM, i.e. struct pbuf and its payload are located in totally different memory areas. Since it points to ROM, payload does not have to be copied when queued for transmission. |
PBUF_REF | pbuf comes from the pbuf pool. Much like PBUF_ROM but payload might change so it has to be duplicated when queued before transmitting, depending on who has a 'ref' to it. |
PBUF_POOL | pbuf payload refers to RAM. This one comes from a pool and should be used for RX. Payload can be chained (scatter-gather RX) but like PBUF_RAM, struct pbuf and its payload are allocated in one piece of contiguous memory (so the first payload byte can be calculated from struct pbuf). Don't use this for TX, if the pool becomes empty e.g. because of TCP queuing, you are unable to receive TCP acks! |
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).
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).
layer | header size |
length | size of the pbuf's payload |
type | this parameter decides how and where the pbuf should be allocated as follows: |
References LWIP_ASSERT, LWIP_DBG_TRACE, LWIP_DEBUGF, LWIP_MEM_ALIGN, LWIP_MEM_ALIGN_SIZE, LWIP_MIN, MEM_ALIGNMENT, mem_malloc(), memp_malloc(), next, NULL, payload, pbuf_alloc_reference(), PBUF_DEBUG, pbuf_free(), pbuf_init_alloced_pbuf(), PBUF_POOL, PBUF_POOL_BUFSIZE_ALIGNED, PBUF_POOL_IS_EMPTY, PBUF_RAM, PBUF_REF, PBUF_ROM, SIZEOF_STRUCT_PBUF, and U16_F.
Referenced by low_level_input(), pbuf_clone(), and slipif_rxbyte().
Allocates a pbuf for referenced data. Referenced data can be volatile (PBUF_REF) or long-lived (PBUF_ROM).
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).
payload | referenced payload |
length | size of the pbuf's payload |
type | this parameter decides how and where the pbuf should be allocated as follows: |
References LWIP_ASSERT, LWIP_DBG_LEVEL_SERIOUS, LWIP_DEBUGF, memp_malloc(), NULL, payload, PBUF_DEBUG, pbuf_init_alloced_pbuf(), PBUF_REF, and PBUF_ROM.
Referenced by pbuf_alloc().
Concatenate two pbufs (each may be a pbuf chain) and take over the caller's reference of the tail pbuf.
This function explicitly does not check for tot_len overflow to prevent failing to queue too long pbufs. This can produce invalid pbufs, so handle with care!
References len, LWIP_ASSERT, LWIP_ERROR, next, NULL, and tot_len.
Referenced by pbuf_chain(), and slipif_rxbyte().
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.
h | head pbuf (chain) |
t | tail pbuf (chain) |
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.
References LWIP_DBG_TRACE, LWIP_DEBUGF, pbuf_cat(), PBUF_DEBUG, and pbuf_ref().
struct pbuf* pbuf_clone | ( | pbuf_layer | layer, |
pbuf_type | type, | ||
struct pbuf * | p | ||
) |
Allocates a new pbuf of same length (via pbuf_alloc()) and copies the source pbuf into this new pbuf (using pbuf_copy()).
layer | pbuf_layer of the new pbuf |
type | this parameter decides how and where the pbuf should be allocated ( |
p | the source pbuf |
References ERR_OK, LWIP_ASSERT, LWIP_UNUSED_ARG, NULL, pbuf_alloc(), pbuf_copy(), and tot_len.
Referenced by pbuf_coalesce().
struct pbuf* pbuf_coalesce | ( | struct pbuf * | p, |
pbuf_layer | layer | ||
) |
Creates a single pbuf out of a queue of pbufs.
p | the source pbuf |
layer | pbuf_layer of the new pbuf |
References next, NULL, pbuf_clone(), pbuf_free(), and PBUF_RAM.
Create PBUF_RAM copies of pbufs.
Used to queue packets on behalf of the lwIP stack, such as ARP based queueing.
p_to | pbuf destination of the copy |
p_from | pbuf source of the copy |
References ERR_ARG, ERR_OK, ERR_VAL, len, LWIP_ASSERT, LWIP_DBG_TRACE, LWIP_DEBUGF, LWIP_ERROR, MEMCPY, next, NULL, payload, PBUF_DEBUG, and tot_len.
Referenced by pbuf_clone().
Copy (part of) the contents of a packet buffer to an application supplied buffer.
buf | the pbuf from which to copy data |
dataptr | the application supplied buffer |
len | length of data to copy (dataptr must be big enough). No more than buf->tot_len will be copied, irrespective of len |
offset | offset into the packet buffer from where to begin copying len bytes |
References len, LWIP_ERROR, MEMCPY, next, NULL, and payload.
Referenced by pbuf_get_contiguous().
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.
p | The pbuf (chain) to be dereferenced. |
References LWIP_ASSERT, LWIP_DBG_LEVEL_SERIOUS, LWIP_DBG_TRACE, LWIP_DEBUGF, LWIP_PBUF_REF_T, mem_free(), memp_free(), next, NULL, PBUF_DEBUG, PBUF_FLAG_IS_CUSTOM, pbuf_get_allocsrc, PBUF_TYPE_ALLOC_SRC_MASK_STD_HEAP, PBUF_TYPE_ALLOC_SRC_MASK_STD_MEMP_PBUF, PBUF_TYPE_ALLOC_SRC_MASK_STD_MEMP_PBUF_POOL, PERF_START, PERF_STOP, ref, SYS_ARCH_DECL_PROTECT, SYS_ARCH_PROTECT, SYS_ARCH_UNPROTECT, and U16_F.
Referenced by ethernetif_input(), pbuf_alloc(), pbuf_coalesce(), pbuf_dechain(), pbuf_free_header(), pbuf_free_int(), pbuf_realloc(), slipif_rxbyte_input(), and tcpip_thread_handle_msg().
Get one byte from the specified position in a pbuf WARNING: returns zero for offset >= p->tot_len
p | pbuf to parse |
offset | offset into p of the byte to return |
References pbuf_try_get_at().
Referenced by pbuf_memcmp().
void* pbuf_get_contiguous | ( | const struct pbuf * | p, |
void * | buffer, | ||
size_t | bufsize, | ||
u16_t | len, | ||
u16_t | offset | ||
) |
Get part of a pbuf's payload as contiguous memory. The returned memory is either a pointer into the pbuf's payload or, if split over multiple pbufs, a copy into the user-supplied buffer.
p | the pbuf from which to copy data |
buffer | the application supplied buffer |
bufsize | size of the application supplied buffer |
len | length of data to copy (dataptr must be big enough). No more than buf->tot_len will be copied, irrespective of len |
offset | offset into the packet buffer from where to begin copying len bytes |
References len, LWIP_ERROR, NULL, payload, pbuf_copy_partial(), and pbuf_skip_const().
Compare pbuf contents at specified offset with memory s2, both of length n
p | pbuf to compare |
offset | offset into p at which to start comparing |
s2 | buffer to compare |
n | length of buffer to compare |
References len, LWIP_MIN, next, NULL, pbuf_get_at(), and tot_len.
Referenced by pbuf_memfind().
Find occurrence of mem (with length mem_len) in pbuf p, starting at offset start_offset.
p | pbuf to search, maximum length is 0xFFFE since 0xFFFF is used as return value 'not found' |
mem | search for the contents of this buffer |
mem_len | length of 'mem' |
start_offset | offset into p at which to start searching |
References pbuf_memcmp(), and tot_len.
Referenced by pbuf_strstr().
Put one byte to the specified position in a pbuf WARNING: silently ignores offset >= p->tot_len
p | pbuf to fill |
offset | offset into p of the byte to write |
data | byte to write at an offset into p |
References len, NULL, payload, and pbuf_skip().
Shrink a pbuf chain to a desired length.
p | pbuf to shrink. |
new_len | desired 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.
References flags, len, LWIP_ASSERT, LWIP_SUPPORT_CUSTOM_PBUF, mem_trim(), next, NULL, payload, PBUF_FLAG_IS_CUSTOM, pbuf_free(), pbuf_match_allocsrc, PBUF_TYPE_ALLOC_SRC_MASK_STD_HEAP, and tot_len.
Referenced by slipif_rxbyte().
void pbuf_ref | ( | struct pbuf * | p | ) |
Increment the reference count of the pbuf.
p | pbuf to increase reference counter of |
References LWIP_ASSERT, LWIP_PBUF_REF_T, NULL, ref, and SYS_ARCH_SET.
Referenced by pbuf_chain().
Skip a number of bytes at the start of a pbuf
in | input pbuf |
in_offset | offset to skip |
out_offset | resulting offset in the returned pbuf |
References LWIP_CONST_CAST, and pbuf_skip_const().
Referenced by pbuf_put_at(), and pbuf_take_at().
Copy application supplied data into a pbuf. This function can only be used to copy the equivalent of buf->tot_len data.
buf | pbuf to fill with data |
dataptr | application supplied data buffer |
len | length of the application supplied data buffer |
References ERR_ARG, ERR_MEM, ERR_OK, len, LWIP_ASSERT, LWIP_ERROR, MEMCPY, next, NULL, payload, and tot_len.
Referenced by pbuf_take_at().
Same as pbuf_take() but puts data at an offset
buf | pbuf to fill with data |
dataptr | application supplied data buffer |
len | length of the application supplied data buffer |
offset | offset in pbuf where to copy dataptr to |
References ERR_MEM, ERR_OK, len, LWIP_ASSERT, LWIP_MIN, MEMCPY, next, NULL, payload, pbuf_skip(), pbuf_take(), and tot_len.
Get one byte from the specified position in a pbuf
p | pbuf to parse |
offset | offset into p of the byte to return |
References len, NULL, payload, and pbuf_skip_const().
Referenced by pbuf_get_at().