1*5d5fbe79SDavid van Moolenbroek /** 2*5d5fbe79SDavid van Moolenbroek * @file 3*5d5fbe79SDavid van Moolenbroek * pbuf API 4*5d5fbe79SDavid van Moolenbroek */ 5*5d5fbe79SDavid van Moolenbroek 6*5d5fbe79SDavid van Moolenbroek /* 7*5d5fbe79SDavid van Moolenbroek * Copyright (c) 2001-2004 Swedish Institute of Computer Science. 8*5d5fbe79SDavid van Moolenbroek * All rights reserved. 9*5d5fbe79SDavid van Moolenbroek * 10*5d5fbe79SDavid van Moolenbroek * Redistribution and use in source and binary forms, with or without modification, 11*5d5fbe79SDavid van Moolenbroek * are permitted provided that the following conditions are met: 12*5d5fbe79SDavid van Moolenbroek * 13*5d5fbe79SDavid van Moolenbroek * 1. Redistributions of source code must retain the above copyright notice, 14*5d5fbe79SDavid van Moolenbroek * this list of conditions and the following disclaimer. 15*5d5fbe79SDavid van Moolenbroek * 2. Redistributions in binary form must reproduce the above copyright notice, 16*5d5fbe79SDavid van Moolenbroek * this list of conditions and the following disclaimer in the documentation 17*5d5fbe79SDavid van Moolenbroek * and/or other materials provided with the distribution. 18*5d5fbe79SDavid van Moolenbroek * 3. The name of the author may not be used to endorse or promote products 19*5d5fbe79SDavid van Moolenbroek * derived from this software without specific prior written permission. 20*5d5fbe79SDavid van Moolenbroek * 21*5d5fbe79SDavid van Moolenbroek * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 22*5d5fbe79SDavid van Moolenbroek * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 23*5d5fbe79SDavid van Moolenbroek * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT 24*5d5fbe79SDavid van Moolenbroek * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 25*5d5fbe79SDavid van Moolenbroek * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT 26*5d5fbe79SDavid van Moolenbroek * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 27*5d5fbe79SDavid van Moolenbroek * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 28*5d5fbe79SDavid van Moolenbroek * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 29*5d5fbe79SDavid van Moolenbroek * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY 30*5d5fbe79SDavid van Moolenbroek * OF SUCH DAMAGE. 31*5d5fbe79SDavid van Moolenbroek * 32*5d5fbe79SDavid van Moolenbroek * This file is part of the lwIP TCP/IP stack. 33*5d5fbe79SDavid van Moolenbroek * 34*5d5fbe79SDavid van Moolenbroek * Author: Adam Dunkels <adam@sics.se> 35*5d5fbe79SDavid van Moolenbroek * 36*5d5fbe79SDavid van Moolenbroek */ 37*5d5fbe79SDavid van Moolenbroek 38*5d5fbe79SDavid van Moolenbroek #ifndef LWIP_HDR_PBUF_H 39*5d5fbe79SDavid van Moolenbroek #define LWIP_HDR_PBUF_H 40*5d5fbe79SDavid van Moolenbroek 41*5d5fbe79SDavid van Moolenbroek #include "lwip/opt.h" 42*5d5fbe79SDavid van Moolenbroek #include "lwip/err.h" 43*5d5fbe79SDavid van Moolenbroek 44*5d5fbe79SDavid van Moolenbroek #ifdef __cplusplus 45*5d5fbe79SDavid van Moolenbroek extern "C" { 46*5d5fbe79SDavid van Moolenbroek #endif 47*5d5fbe79SDavid van Moolenbroek 48*5d5fbe79SDavid van Moolenbroek /** LWIP_SUPPORT_CUSTOM_PBUF==1: Custom pbufs behave much like their pbuf type 49*5d5fbe79SDavid van Moolenbroek * but they are allocated by external code (initialised by calling 50*5d5fbe79SDavid van Moolenbroek * pbuf_alloced_custom()) and when pbuf_free gives up their last reference, they 51*5d5fbe79SDavid van Moolenbroek * are freed by calling pbuf_custom->custom_free_function(). 52*5d5fbe79SDavid van Moolenbroek * Currently, the pbuf_custom code is only needed for one specific configuration 53*5d5fbe79SDavid van Moolenbroek * of IP_FRAG, unless required by external driver/application code. */ 54*5d5fbe79SDavid van Moolenbroek #ifndef LWIP_SUPPORT_CUSTOM_PBUF 55*5d5fbe79SDavid van Moolenbroek #define LWIP_SUPPORT_CUSTOM_PBUF ((IP_FRAG && !LWIP_NETIF_TX_SINGLE_PBUF) || (LWIP_IPV6 && LWIP_IPV6_FRAG)) 56*5d5fbe79SDavid van Moolenbroek #endif 57*5d5fbe79SDavid van Moolenbroek 58*5d5fbe79SDavid van Moolenbroek /** PBUF_NEEDS_COPY(p): return a boolean value indicating whether the given 59*5d5fbe79SDavid van Moolenbroek * pbuf needs to be copied in order to be kept around beyond the current call 60*5d5fbe79SDavid van Moolenbroek * stack without risking being corrupted. The default setting provides safety: 61*5d5fbe79SDavid van Moolenbroek * it will make a copy iof any pbuf chain that does not consist entirely of 62*5d5fbe79SDavid van Moolenbroek * PBUF_ROM type pbufs. For setups with zero-copy support, it may be redefined 63*5d5fbe79SDavid van Moolenbroek * to evaluate to true in all cases, for example. However, doing so also has an 64*5d5fbe79SDavid van Moolenbroek * effect on the application side: any buffers that are *not* copied must also 65*5d5fbe79SDavid van Moolenbroek * *not* be reused by the application after passing them to lwIP. For example, 66*5d5fbe79SDavid van Moolenbroek * when setting PBUF_NEEDS_COPY to (0), after using udp_send() with a PBUF_RAM 67*5d5fbe79SDavid van Moolenbroek * pbuf, the application must free the pbuf immediately, rather than reusing it 68*5d5fbe79SDavid van Moolenbroek * for other purposes. For more background information on this, see tasks #6735 69*5d5fbe79SDavid van Moolenbroek * and #7896, and bugs #11400 and #49914. */ 70*5d5fbe79SDavid van Moolenbroek #ifndef PBUF_NEEDS_COPY 71*5d5fbe79SDavid van Moolenbroek #define PBUF_NEEDS_COPY(p) ((p)->type != PBUF_ROM) 72*5d5fbe79SDavid van Moolenbroek #endif /* PBUF_NEEDS_COPY */ 73*5d5fbe79SDavid van Moolenbroek 74*5d5fbe79SDavid van Moolenbroek /* @todo: We need a mechanism to prevent wasting memory in every pbuf 75*5d5fbe79SDavid van Moolenbroek (TCP vs. UDP, IPv4 vs. IPv6: UDP/IPv4 packets may waste up to 28 bytes) */ 76*5d5fbe79SDavid van Moolenbroek 77*5d5fbe79SDavid van Moolenbroek #define PBUF_TRANSPORT_HLEN 20 78*5d5fbe79SDavid van Moolenbroek #if LWIP_IPV6 79*5d5fbe79SDavid van Moolenbroek #define PBUF_IP_HLEN 40 80*5d5fbe79SDavid van Moolenbroek #else 81*5d5fbe79SDavid van Moolenbroek #define PBUF_IP_HLEN 20 82*5d5fbe79SDavid van Moolenbroek #endif 83*5d5fbe79SDavid van Moolenbroek 84*5d5fbe79SDavid van Moolenbroek /** 85*5d5fbe79SDavid van Moolenbroek * @ingroup pbuf 86*5d5fbe79SDavid van Moolenbroek * Enumeration of pbuf layers 87*5d5fbe79SDavid van Moolenbroek */ 88*5d5fbe79SDavid van Moolenbroek typedef enum { 89*5d5fbe79SDavid van Moolenbroek /** Includes spare room for transport layer header, e.g. UDP header. 90*5d5fbe79SDavid van Moolenbroek * Use this if you intend to pass the pbuf to functions like udp_send(). 91*5d5fbe79SDavid van Moolenbroek */ 92*5d5fbe79SDavid van Moolenbroek PBUF_TRANSPORT, 93*5d5fbe79SDavid van Moolenbroek /** Includes spare room for IP header. 94*5d5fbe79SDavid van Moolenbroek * Use this if you intend to pass the pbuf to functions like raw_send(). 95*5d5fbe79SDavid van Moolenbroek */ 96*5d5fbe79SDavid van Moolenbroek PBUF_IP, 97*5d5fbe79SDavid van Moolenbroek /** Includes spare room for link layer header (ethernet header). 98*5d5fbe79SDavid van Moolenbroek * Use this if you intend to pass the pbuf to functions like ethernet_output(). 99*5d5fbe79SDavid van Moolenbroek * @see PBUF_LINK_HLEN 100*5d5fbe79SDavid van Moolenbroek */ 101*5d5fbe79SDavid van Moolenbroek PBUF_LINK, 102*5d5fbe79SDavid van Moolenbroek /** Includes spare room for additional encapsulation header before ethernet 103*5d5fbe79SDavid van Moolenbroek * headers (e.g. 802.11). 104*5d5fbe79SDavid van Moolenbroek * Use this if you intend to pass the pbuf to functions like netif->linkoutput(). 105*5d5fbe79SDavid van Moolenbroek * @see PBUF_LINK_ENCAPSULATION_HLEN 106*5d5fbe79SDavid van Moolenbroek */ 107*5d5fbe79SDavid van Moolenbroek PBUF_RAW_TX, 108*5d5fbe79SDavid van Moolenbroek /** Use this for input packets in a netif driver when calling netif->input() 109*5d5fbe79SDavid van Moolenbroek * in the most common case - ethernet-layer netif driver. */ 110*5d5fbe79SDavid van Moolenbroek PBUF_RAW 111*5d5fbe79SDavid van Moolenbroek } pbuf_layer; 112*5d5fbe79SDavid van Moolenbroek 113*5d5fbe79SDavid van Moolenbroek /** 114*5d5fbe79SDavid van Moolenbroek * @ingroup pbuf 115*5d5fbe79SDavid van Moolenbroek * Enumeration of pbuf types 116*5d5fbe79SDavid van Moolenbroek */ 117*5d5fbe79SDavid van Moolenbroek typedef enum { 118*5d5fbe79SDavid van Moolenbroek /** pbuf data is stored in RAM, used for TX mostly, struct pbuf and its payload 119*5d5fbe79SDavid van Moolenbroek are allocated in one piece of contiguous memory (so the first payload byte 120*5d5fbe79SDavid van Moolenbroek can be calculated from struct pbuf). 121*5d5fbe79SDavid van Moolenbroek pbuf_alloc() allocates PBUF_RAM pbufs as unchained pbufs (although that might 122*5d5fbe79SDavid van Moolenbroek change in future versions). 123*5d5fbe79SDavid van Moolenbroek This should be used for all OUTGOING packets (TX).*/ 124*5d5fbe79SDavid van Moolenbroek PBUF_RAM, 125*5d5fbe79SDavid van Moolenbroek /** pbuf data is stored in ROM, i.e. struct pbuf and its payload are located in 126*5d5fbe79SDavid van Moolenbroek totally different memory areas. Since it points to ROM, payload does not 127*5d5fbe79SDavid van Moolenbroek have to be copied when queued for transmission. */ 128*5d5fbe79SDavid van Moolenbroek PBUF_ROM, 129*5d5fbe79SDavid van Moolenbroek /** pbuf comes from the pbuf pool. Much like PBUF_ROM but payload might change 130*5d5fbe79SDavid van Moolenbroek so it has to be duplicated when queued before transmitting, depending on 131*5d5fbe79SDavid van Moolenbroek who has a 'ref' to it. */ 132*5d5fbe79SDavid van Moolenbroek PBUF_REF, 133*5d5fbe79SDavid van Moolenbroek /** pbuf payload refers to RAM. This one comes from a pool and should be used 134*5d5fbe79SDavid van Moolenbroek for RX. Payload can be chained (scatter-gather RX) but like PBUF_RAM, struct 135*5d5fbe79SDavid van Moolenbroek pbuf and its payload are allocated in one piece of contiguous memory (so 136*5d5fbe79SDavid van Moolenbroek the first payload byte can be calculated from struct pbuf). 137*5d5fbe79SDavid van Moolenbroek Don't use this for TX, if the pool becomes empty e.g. because of TCP queuing, 138*5d5fbe79SDavid van Moolenbroek you are unable to receive TCP acks! */ 139*5d5fbe79SDavid van Moolenbroek PBUF_POOL 140*5d5fbe79SDavid van Moolenbroek } pbuf_type; 141*5d5fbe79SDavid van Moolenbroek 142*5d5fbe79SDavid van Moolenbroek 143*5d5fbe79SDavid van Moolenbroek /** indicates this packet's data should be immediately passed to the application */ 144*5d5fbe79SDavid van Moolenbroek #define PBUF_FLAG_PUSH 0x01U 145*5d5fbe79SDavid van Moolenbroek /** indicates this is a custom pbuf: pbuf_free calls pbuf_custom->custom_free_function() 146*5d5fbe79SDavid van Moolenbroek when the last reference is released (plus custom PBUF_RAM cannot be trimmed) */ 147*5d5fbe79SDavid van Moolenbroek #define PBUF_FLAG_IS_CUSTOM 0x02U 148*5d5fbe79SDavid van Moolenbroek /** indicates this pbuf is UDP multicast to be looped back */ 149*5d5fbe79SDavid van Moolenbroek #define PBUF_FLAG_MCASTLOOP 0x04U 150*5d5fbe79SDavid van Moolenbroek /** indicates this pbuf was received as link-level broadcast */ 151*5d5fbe79SDavid van Moolenbroek #define PBUF_FLAG_LLBCAST 0x08U 152*5d5fbe79SDavid van Moolenbroek /** indicates this pbuf was received as link-level multicast */ 153*5d5fbe79SDavid van Moolenbroek #define PBUF_FLAG_LLMCAST 0x10U 154*5d5fbe79SDavid van Moolenbroek /** indicates this pbuf includes a TCP FIN flag */ 155*5d5fbe79SDavid van Moolenbroek #define PBUF_FLAG_TCP_FIN 0x20U 156*5d5fbe79SDavid van Moolenbroek 157*5d5fbe79SDavid van Moolenbroek /** Main packet buffer struct */ 158*5d5fbe79SDavid van Moolenbroek struct pbuf { 159*5d5fbe79SDavid van Moolenbroek /** next pbuf in singly linked pbuf chain */ 160*5d5fbe79SDavid van Moolenbroek struct pbuf *next; 161*5d5fbe79SDavid van Moolenbroek 162*5d5fbe79SDavid van Moolenbroek /** pointer to the actual data in the buffer */ 163*5d5fbe79SDavid van Moolenbroek void *payload; 164*5d5fbe79SDavid van Moolenbroek 165*5d5fbe79SDavid van Moolenbroek /** 166*5d5fbe79SDavid van Moolenbroek * total length of this buffer and all next buffers in chain 167*5d5fbe79SDavid van Moolenbroek * belonging to the same packet. 168*5d5fbe79SDavid van Moolenbroek * 169*5d5fbe79SDavid van Moolenbroek * For non-queue packet chains this is the invariant: 170*5d5fbe79SDavid van Moolenbroek * p->tot_len == p->len + (p->next? p->next->tot_len: 0) 171*5d5fbe79SDavid van Moolenbroek */ 172*5d5fbe79SDavid van Moolenbroek u16_t tot_len; 173*5d5fbe79SDavid van Moolenbroek 174*5d5fbe79SDavid van Moolenbroek /** length of this buffer */ 175*5d5fbe79SDavid van Moolenbroek u16_t len; 176*5d5fbe79SDavid van Moolenbroek 177*5d5fbe79SDavid van Moolenbroek /** pbuf_type as u8_t instead of enum to save space */ 178*5d5fbe79SDavid van Moolenbroek u8_t /*pbuf_type*/ type; 179*5d5fbe79SDavid van Moolenbroek 180*5d5fbe79SDavid van Moolenbroek /** misc flags */ 181*5d5fbe79SDavid van Moolenbroek u8_t flags; 182*5d5fbe79SDavid van Moolenbroek 183*5d5fbe79SDavid van Moolenbroek /** 184*5d5fbe79SDavid van Moolenbroek * the reference count always equals the number of pointers 185*5d5fbe79SDavid van Moolenbroek * that refer to this pbuf. This can be pointers from an application, 186*5d5fbe79SDavid van Moolenbroek * the stack itself, or pbuf->next pointers from a chain. 187*5d5fbe79SDavid van Moolenbroek */ 188*5d5fbe79SDavid van Moolenbroek LWIP_PBUF_REF_T ref; 189*5d5fbe79SDavid van Moolenbroek 190*5d5fbe79SDavid van Moolenbroek /** For incoming packets, this contains the input netif's index */ 191*5d5fbe79SDavid van Moolenbroek u8_t if_idx; 192*5d5fbe79SDavid van Moolenbroek }; 193*5d5fbe79SDavid van Moolenbroek 194*5d5fbe79SDavid van Moolenbroek 195*5d5fbe79SDavid van Moolenbroek /** Helper struct for const-correctness only. 196*5d5fbe79SDavid van Moolenbroek * The only meaning of this one is to provide a const payload pointer 197*5d5fbe79SDavid van Moolenbroek * for PBUF_ROM type. 198*5d5fbe79SDavid van Moolenbroek */ 199*5d5fbe79SDavid van Moolenbroek struct pbuf_rom { 200*5d5fbe79SDavid van Moolenbroek /** next pbuf in singly linked pbuf chain */ 201*5d5fbe79SDavid van Moolenbroek struct pbuf *next; 202*5d5fbe79SDavid van Moolenbroek 203*5d5fbe79SDavid van Moolenbroek /** pointer to the actual data in the buffer */ 204*5d5fbe79SDavid van Moolenbroek const void *payload; 205*5d5fbe79SDavid van Moolenbroek }; 206*5d5fbe79SDavid van Moolenbroek 207*5d5fbe79SDavid van Moolenbroek #if LWIP_SUPPORT_CUSTOM_PBUF 208*5d5fbe79SDavid van Moolenbroek /** Prototype for a function to free a custom pbuf */ 209*5d5fbe79SDavid van Moolenbroek typedef void (*pbuf_free_custom_fn)(struct pbuf *p); 210*5d5fbe79SDavid van Moolenbroek 211*5d5fbe79SDavid van Moolenbroek /** A custom pbuf: like a pbuf, but following a function pointer to free it. */ 212*5d5fbe79SDavid van Moolenbroek struct pbuf_custom { 213*5d5fbe79SDavid van Moolenbroek /** The actual pbuf */ 214*5d5fbe79SDavid van Moolenbroek struct pbuf pbuf; 215*5d5fbe79SDavid van Moolenbroek /** This function is called when pbuf_free deallocates this pbuf(_custom) */ 216*5d5fbe79SDavid van Moolenbroek pbuf_free_custom_fn custom_free_function; 217*5d5fbe79SDavid van Moolenbroek }; 218*5d5fbe79SDavid van Moolenbroek #endif /* LWIP_SUPPORT_CUSTOM_PBUF */ 219*5d5fbe79SDavid van Moolenbroek 220*5d5fbe79SDavid van Moolenbroek /** Define this to 0 to prevent freeing ooseq pbufs when the PBUF_POOL is empty */ 221*5d5fbe79SDavid van Moolenbroek #ifndef PBUF_POOL_FREE_OOSEQ 222*5d5fbe79SDavid van Moolenbroek #define PBUF_POOL_FREE_OOSEQ 1 223*5d5fbe79SDavid van Moolenbroek #endif /* PBUF_POOL_FREE_OOSEQ */ 224*5d5fbe79SDavid van Moolenbroek #if LWIP_TCP && TCP_QUEUE_OOSEQ && NO_SYS && PBUF_POOL_FREE_OOSEQ 225*5d5fbe79SDavid van Moolenbroek extern volatile u8_t pbuf_free_ooseq_pending; 226*5d5fbe79SDavid van Moolenbroek void pbuf_free_ooseq(void); 227*5d5fbe79SDavid van Moolenbroek /** When not using sys_check_timeouts(), call PBUF_CHECK_FREE_OOSEQ() 228*5d5fbe79SDavid van Moolenbroek at regular intervals from main level to check if ooseq pbufs need to be 229*5d5fbe79SDavid van Moolenbroek freed! */ 230*5d5fbe79SDavid van Moolenbroek #define PBUF_CHECK_FREE_OOSEQ() do { if(pbuf_free_ooseq_pending) { \ 231*5d5fbe79SDavid van Moolenbroek /* pbuf_alloc() reported PBUF_POOL to be empty -> try to free some \ 232*5d5fbe79SDavid van Moolenbroek ooseq queued pbufs now */ \ 233*5d5fbe79SDavid van Moolenbroek pbuf_free_ooseq(); }}while(0) 234*5d5fbe79SDavid van Moolenbroek #else /* LWIP_TCP && TCP_QUEUE_OOSEQ && NO_SYS && PBUF_POOL_FREE_OOSEQ */ 235*5d5fbe79SDavid van Moolenbroek /* Otherwise declare an empty PBUF_CHECK_FREE_OOSEQ */ 236*5d5fbe79SDavid van Moolenbroek #define PBUF_CHECK_FREE_OOSEQ() 237*5d5fbe79SDavid van Moolenbroek #endif /* LWIP_TCP && TCP_QUEUE_OOSEQ && NO_SYS && PBUF_POOL_FREE_OOSEQ*/ 238*5d5fbe79SDavid van Moolenbroek 239*5d5fbe79SDavid van Moolenbroek /* Initializes the pbuf module. This call is empty for now, but may not be in future. */ 240*5d5fbe79SDavid van Moolenbroek #define pbuf_init() 241*5d5fbe79SDavid van Moolenbroek 242*5d5fbe79SDavid van Moolenbroek struct pbuf *pbuf_alloc(pbuf_layer l, u16_t length, pbuf_type type); 243*5d5fbe79SDavid van Moolenbroek #if LWIP_SUPPORT_CUSTOM_PBUF 244*5d5fbe79SDavid van Moolenbroek struct pbuf *pbuf_alloced_custom(pbuf_layer l, u16_t length, pbuf_type type, 245*5d5fbe79SDavid van Moolenbroek struct pbuf_custom *p, void *payload_mem, 246*5d5fbe79SDavid van Moolenbroek u16_t payload_mem_len); 247*5d5fbe79SDavid van Moolenbroek #endif /* LWIP_SUPPORT_CUSTOM_PBUF */ 248*5d5fbe79SDavid van Moolenbroek void pbuf_realloc(struct pbuf *p, u16_t size); 249*5d5fbe79SDavid van Moolenbroek u8_t pbuf_header(struct pbuf *p, s16_t header_size); 250*5d5fbe79SDavid van Moolenbroek u8_t pbuf_header_force(struct pbuf *p, s16_t header_size); 251*5d5fbe79SDavid van Moolenbroek struct pbuf *pbuf_free_header(struct pbuf *q, u16_t size); 252*5d5fbe79SDavid van Moolenbroek void pbuf_ref(struct pbuf *p); 253*5d5fbe79SDavid van Moolenbroek u8_t pbuf_free(struct pbuf *p); 254*5d5fbe79SDavid van Moolenbroek u16_t pbuf_clen(const struct pbuf *p); 255*5d5fbe79SDavid van Moolenbroek void pbuf_cat(struct pbuf *head, struct pbuf *tail); 256*5d5fbe79SDavid van Moolenbroek void pbuf_chain(struct pbuf *head, struct pbuf *tail); 257*5d5fbe79SDavid van Moolenbroek struct pbuf *pbuf_dechain(struct pbuf *p); 258*5d5fbe79SDavid van Moolenbroek err_t pbuf_copy(struct pbuf *p_to, const struct pbuf *p_from); 259*5d5fbe79SDavid van Moolenbroek u16_t pbuf_copy_partial(const struct pbuf *p, void *dataptr, u16_t len, u16_t offset); 260*5d5fbe79SDavid van Moolenbroek void *pbuf_get_contiguous(const struct pbuf *p, void *buffer, size_t bufsize, u16_t len, u16_t offset); 261*5d5fbe79SDavid van Moolenbroek err_t pbuf_take(struct pbuf *buf, const void *dataptr, u16_t len); 262*5d5fbe79SDavid van Moolenbroek err_t pbuf_take_at(struct pbuf *buf, const void *dataptr, u16_t len, u16_t offset); 263*5d5fbe79SDavid van Moolenbroek struct pbuf *pbuf_skip(struct pbuf* in, u16_t in_offset, u16_t* out_offset); 264*5d5fbe79SDavid van Moolenbroek struct pbuf *pbuf_coalesce(struct pbuf *p, pbuf_layer layer); 265*5d5fbe79SDavid van Moolenbroek #if LWIP_CHECKSUM_ON_COPY 266*5d5fbe79SDavid van Moolenbroek err_t pbuf_fill_chksum(struct pbuf *p, u16_t start_offset, const void *dataptr, 267*5d5fbe79SDavid van Moolenbroek u16_t len, u16_t *chksum); 268*5d5fbe79SDavid van Moolenbroek #endif /* LWIP_CHECKSUM_ON_COPY */ 269*5d5fbe79SDavid van Moolenbroek #if LWIP_TCP && TCP_QUEUE_OOSEQ && LWIP_WND_SCALE 270*5d5fbe79SDavid van Moolenbroek void pbuf_split_64k(struct pbuf *p, struct pbuf **rest); 271*5d5fbe79SDavid van Moolenbroek #endif /* LWIP_TCP && TCP_QUEUE_OOSEQ && LWIP_WND_SCALE */ 272*5d5fbe79SDavid van Moolenbroek 273*5d5fbe79SDavid van Moolenbroek u8_t pbuf_get_at(const struct pbuf* p, u16_t offset); 274*5d5fbe79SDavid van Moolenbroek int pbuf_try_get_at(const struct pbuf* p, u16_t offset); 275*5d5fbe79SDavid van Moolenbroek void pbuf_put_at(struct pbuf* p, u16_t offset, u8_t data); 276*5d5fbe79SDavid van Moolenbroek u16_t pbuf_memcmp(const struct pbuf* p, u16_t offset, const void* s2, u16_t n); 277*5d5fbe79SDavid van Moolenbroek u16_t pbuf_memfind(const struct pbuf* p, const void* mem, u16_t mem_len, u16_t start_offset); 278*5d5fbe79SDavid van Moolenbroek u16_t pbuf_strstr(const struct pbuf* p, const char* substr); 279*5d5fbe79SDavid van Moolenbroek 280*5d5fbe79SDavid van Moolenbroek #ifdef __cplusplus 281*5d5fbe79SDavid van Moolenbroek } 282*5d5fbe79SDavid van Moolenbroek #endif 283*5d5fbe79SDavid van Moolenbroek 284*5d5fbe79SDavid van Moolenbroek #endif /* LWIP_HDR_PBUF_H */ 285