pbuf API More...
|Main packet buffer struct. More...|
|Helper struct for const-correctness only. More...|
|#define||LWIP_SUPPORT_CUSTOM_PBUF ((IP_FRAG && !LWIP_NETIF_TX_SINGLE_PBUF) || (LWIP_IPV6 && LWIP_IPV6_FRAG))|
|LWIP_SUPPORT_CUSTOM_PBUF==1: Custom pbufs behave much like their pbuf type but they are allocated by external code (initialised by calling pbuf_alloced_custom()) and when pbuf_free gives up their last reference, they are freed by calling pbuf_custom->custom_free_function(). More...|
|#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. More...|
|Indicates that the payload directly follows the struct pbuf. More...|
|Indicates the data stored in this pbuf can change. More...|
|4 bits are reserved for 16 allocation sources (e.g. More...|
|Indicates this pbuf is used for RX (if not set, indicates use for TX). More...|
|Indicates the application needs the pbuf payload to be in one piece. More...|
|First pbuf allocation type for applications. More...|
|Last pbuf allocation type for applications. More...|
|indicates this packet's data should be immediately passed to the application More...|
|indicates this is a custom pbuf: pbuf_free calls pbuf_custom->custom_free_function() when the last reference is released (plus custom PBUF_RAM cannot be trimmed) More...|
|indicates this pbuf is UDP multicast to be looped back More...|
|indicates this pbuf was received as link-level broadcast More...|
|indicates this pbuf was received as link-level multicast More...|
|indicates this pbuf includes a TCP FIN flag More...|
|Define this to 0 to prevent freeing ooseq pbufs when the PBUF_POOL is empty. More...|
Definition in file pbuf.h.
|#define LWIP_SUPPORT_CUSTOM_PBUF ((IP_FRAG && !LWIP_NETIF_TX_SINGLE_PBUF) || (LWIP_IPV6 && LWIP_IPV6_FRAG))|
LWIP_SUPPORT_CUSTOM_PBUF==1: Custom pbufs behave much like their pbuf type but they are allocated by external code (initialised by calling pbuf_alloced_custom()) and when pbuf_free gives up their last reference, they are freed by calling pbuf_custom->custom_free_function().
Currently, the pbuf_custom code is only needed for one specific configuration of IP_FRAG, unless required by external driver/application code.
|#define PBUF_ALLOC_FLAG_DATA_CONTIGUOUS 0x0200|
|#define PBUF_ALLOC_FLAG_RX 0x0100|
|#define PBUF_FLAG_IS_CUSTOM 0x02U|
|#define PBUF_FLAG_LLBCAST 0x08U|
|#define PBUF_FLAG_LLMCAST 0x10U|
|#define PBUF_FLAG_MCASTLOOP 0x04U|
|#define PBUF_FLAG_PUSH 0x01U|
|#define PBUF_FLAG_TCP_FIN 0x20U|
|#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.
|#define PBUF_POOL_FREE_OOSEQ 1|
|#define PBUF_TYPE_ALLOC_SRC_MASK 0x0F|
|#define PBUF_TYPE_ALLOC_SRC_MASK_APP_MAX PBUF_TYPE_ALLOC_SRC_MASK|
|#define PBUF_TYPE_ALLOC_SRC_MASK_APP_MIN 0x03|
|#define PBUF_TYPE_FLAG_DATA_VOLATILE 0x40|
|#define PBUF_TYPE_FLAG_STRUCT_DATA_CONTIGUOUS 0x80|
Enumeration of pbuf layers.
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().
Includes spare room for IP header.
Use this if you intend to pass the pbuf to functions like raw_send().
Includes spare room for link layer header (ethernet header).
Use this if you intend to pass the pbuf to functions like ethernet_output().
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().
Use this for input packets in a netif driver when calling netif->input() in the most common case - ethernet-layer netif driver.
Enumeration of pbuf types.
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 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 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 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!