176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* 276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Copyright (c) 2001-2004 Swedish Institute of Computer Science. 376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * All rights reserved. 476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Redistribution and use in source and binary forms, with or without modification, 676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * are permitted provided that the following conditions are met: 776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 1. Redistributions of source code must retain the above copyright notice, 976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * this list of conditions and the following disclaimer. 1076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 2. Redistributions in binary form must reproduce the above copyright notice, 1176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * this list of conditions and the following disclaimer in the documentation 1276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * and/or other materials provided with the distribution. 1376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 3. The name of the author may not be used to endorse or promote products 1476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * derived from this software without specific prior written permission. 1576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 1676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 1776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 1876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT 1976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 2076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT 2176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 2276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 2376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 2476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY 2576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * OF SUCH DAMAGE. 2676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 2776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This file is part of the lwIP TCP/IP stack. 2876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 2976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Author: Adam Dunkels <adam@sics.se> 3076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 3176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 3276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 3376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#ifndef __LWIP_PBUF_H__ 3476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define __LWIP_PBUF_H__ 3576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 3676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "lwip/opt.h" 3776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "lwip/err.h" 3876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 3976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#ifdef __cplusplus 4076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanextern "C" { 4176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif 4276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 4376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Currently, the pbuf_custom code is only needed for one specific configuration 4476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * of IP_FRAG */ 4576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define LWIP_SUPPORT_CUSTOM_PBUF (IP_FRAG && !IP_FRAG_USES_STATIC_BUF && !LWIP_NETIF_TX_SINGLE_PBUF) 4676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 4776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PBUF_TRANSPORT_HLEN 20 4876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PBUF_IP_HLEN 20 4976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 5076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef enum { 5176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman PBUF_TRANSPORT, 5276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman PBUF_IP, 5376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman PBUF_LINK, 5476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman PBUF_RAW 5576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} pbuf_layer; 5676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 5776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef enum { 5876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman PBUF_RAM, /* pbuf data is stored in RAM */ 5976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman PBUF_ROM, /* pbuf data is stored in ROM */ 6076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman PBUF_REF, /* pbuf comes from the pbuf pool */ 6176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman PBUF_POOL /* pbuf payload refers to RAM */ 6276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} pbuf_type; 6376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 6476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 6576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** indicates this packet's data should be immediately passed to the application */ 6676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PBUF_FLAG_PUSH 0x01U 6776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** indicates this is a custom pbuf: pbuf_free and pbuf_header handle such a 6876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman a pbuf differently */ 6976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PBUF_FLAG_IS_CUSTOM 0x02U 7076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** indicates this pbuf is UDP multicast to be looped back */ 7176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PBUF_FLAG_MCASTLOOP 0x04U 7276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 7376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct pbuf { 7476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** next pbuf in singly linked pbuf chain */ 7576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct pbuf *next; 7676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 7776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** pointer to the actual data in the buffer */ 7876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman void *payload; 7976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 8076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** 8176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * total length of this buffer and all next buffers in chain 8276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * belonging to the same packet. 8376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 8476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * For non-queue packet chains this is the invariant: 8576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * p->tot_len == p->len + (p->next? p->next->tot_len: 0) 8676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 8776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman u16_t tot_len; 8876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 8976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** length of this buffer */ 9076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman u16_t len; 9176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 9276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** pbuf_type as u8_t instead of enum to save space */ 9376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman u8_t /*pbuf_type*/ type; 9476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 9576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** misc flags */ 9676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman u8_t flags; 9776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 9876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** 9976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * the reference count always equals the number of pointers 10076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * that refer to this pbuf. This can be pointers from an application, 10176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * the stack itself, or pbuf->next pointers from a chain. 10276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 10376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman u16_t ref; 10476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}; 10576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 10676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#if LWIP_SUPPORT_CUSTOM_PBUF 10776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Prototype for a function to free a custom pbuf */ 10876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef void (*pbuf_free_custom_fn)(struct pbuf *p); 10976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 11076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** A custom pbuf: like a pbuf, but following a function pointer to free it. */ 11176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct pbuf_custom { 11276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** The actual pbuf */ 11376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct pbuf pbuf; 11476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** This function is called when pbuf_free deallocates this pbuf(_custom) */ 11576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman pbuf_free_custom_fn custom_free_function; 11676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}; 11776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif /* LWIP_SUPPORT_CUSTOM_PBUF */ 11876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 11976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Initializes the pbuf module. This call is empty for now, but may not be in future. */ 12076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define pbuf_init() 12176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 12276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct pbuf *pbuf_alloc(pbuf_layer l, u16_t length, pbuf_type type); 12376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#if LWIP_SUPPORT_CUSTOM_PBUF 12476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct pbuf *pbuf_alloced_custom(pbuf_layer l, u16_t length, pbuf_type type, 12576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct pbuf_custom *p, void *payload_mem, 12676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman u16_t payload_mem_len); 12776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif /* LWIP_SUPPORT_CUSTOM_PBUF */ 12876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid pbuf_realloc(struct pbuf *p, u16_t size); 12976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanu8_t pbuf_header(struct pbuf *p, s16_t header_size); 13076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid pbuf_ref(struct pbuf *p); 13176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanu8_t pbuf_free(struct pbuf *p); 13276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanu8_t pbuf_clen(struct pbuf *p); 13376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid pbuf_cat(struct pbuf *head, struct pbuf *tail); 13476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid pbuf_chain(struct pbuf *head, struct pbuf *tail); 13576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct pbuf *pbuf_dechain(struct pbuf *p); 13676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanerr_t pbuf_copy(struct pbuf *p_to, struct pbuf *p_from); 13776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanu16_t pbuf_copy_partial(struct pbuf *p, void *dataptr, u16_t len, u16_t offset); 13876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanerr_t pbuf_take(struct pbuf *buf, const void *dataptr, u16_t len); 13976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct pbuf *pbuf_coalesce(struct pbuf *p, pbuf_layer layer); 14076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#if LWIP_CHECKSUM_ON_COPY 14176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanerr_t pbuf_fill_chksum(struct pbuf *p, u16_t start_offset, const void *dataptr, 14276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman u16_t len, u16_t *chksum); 14376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif /* LWIP_CHECKSUM_ON_COPY */ 14476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 14576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanu8_t pbuf_get_at(struct pbuf* p, u16_t offset); 14676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanu16_t pbuf_memcmp(struct pbuf* p, u16_t offset, const void* s2, u16_t n); 14776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanu16_t pbuf_memfind(struct pbuf* p, const void* mem, u16_t mem_len, u16_t start_offset); 14876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanu16_t pbuf_strstr(struct pbuf* p, const char* substr); 14976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 15076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#ifdef __cplusplus 15176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 15276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif 15376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 15476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif /* __LWIP_PBUF_H__ */ 155