Some quick code to use UDP-only (no TCP) with mBed. Echos received packets and sends packets when a button is pressed

Dependencies:   mbed

Committer:
pehrhovey
Date:
Sun Mar 14 00:54:12 2010 +0000
Revision:
0:a548a085de55

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
pehrhovey 0:a548a085de55 1 /**
pehrhovey 0:a548a085de55 2 * @file
pehrhovey 0:a548a085de55 3 * Dynamic pool memory manager
pehrhovey 0:a548a085de55 4 *
pehrhovey 0:a548a085de55 5 * lwIP has dedicated pools for many structures (netconn, protocol control blocks,
pehrhovey 0:a548a085de55 6 * packet buffers, ...). All these pools are managed here.
pehrhovey 0:a548a085de55 7 */
pehrhovey 0:a548a085de55 8
pehrhovey 0:a548a085de55 9 /*
pehrhovey 0:a548a085de55 10 * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
pehrhovey 0:a548a085de55 11 * All rights reserved.
pehrhovey 0:a548a085de55 12 *
pehrhovey 0:a548a085de55 13 * Redistribution and use in source and binary forms, with or without modification,
pehrhovey 0:a548a085de55 14 * are permitted provided that the following conditions are met:
pehrhovey 0:a548a085de55 15 *
pehrhovey 0:a548a085de55 16 * 1. Redistributions of source code must retain the above copyright notice,
pehrhovey 0:a548a085de55 17 * this list of conditions and the following disclaimer.
pehrhovey 0:a548a085de55 18 * 2. Redistributions in binary form must reproduce the above copyright notice,
pehrhovey 0:a548a085de55 19 * this list of conditions and the following disclaimer in the documentation
pehrhovey 0:a548a085de55 20 * and/or other materials provided with the distribution.
pehrhovey 0:a548a085de55 21 * 3. The name of the author may not be used to endorse or promote products
pehrhovey 0:a548a085de55 22 * derived from this software without specific prior written permission.
pehrhovey 0:a548a085de55 23 *
pehrhovey 0:a548a085de55 24 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
pehrhovey 0:a548a085de55 25 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
pehrhovey 0:a548a085de55 26 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
pehrhovey 0:a548a085de55 27 * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
pehrhovey 0:a548a085de55 28 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
pehrhovey 0:a548a085de55 29 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
pehrhovey 0:a548a085de55 30 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
pehrhovey 0:a548a085de55 31 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
pehrhovey 0:a548a085de55 32 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
pehrhovey 0:a548a085de55 33 * OF SUCH DAMAGE.
pehrhovey 0:a548a085de55 34 *
pehrhovey 0:a548a085de55 35 * This file is part of the lwIP TCP/IP stack.
pehrhovey 0:a548a085de55 36 *
pehrhovey 0:a548a085de55 37 * Author: Adam Dunkels <adam@sics.se>
pehrhovey 0:a548a085de55 38 *
pehrhovey 0:a548a085de55 39 */
pehrhovey 0:a548a085de55 40
pehrhovey 0:a548a085de55 41 #include "lwip/opt.h"
pehrhovey 0:a548a085de55 42
pehrhovey 0:a548a085de55 43 #include "lwip/memp.h"
pehrhovey 0:a548a085de55 44 #include "lwip/pbuf.h"
pehrhovey 0:a548a085de55 45 #include "lwip/udp.h"
pehrhovey 0:a548a085de55 46 #include "lwip/raw.h"
pehrhovey 0:a548a085de55 47 #include "lwip/tcp.h"
pehrhovey 0:a548a085de55 48 #include "lwip/igmp.h"
pehrhovey 0:a548a085de55 49 #include "lwip/api.h"
pehrhovey 0:a548a085de55 50 #include "lwip/api_msg.h"
pehrhovey 0:a548a085de55 51 #include "lwip/tcpip.h"
pehrhovey 0:a548a085de55 52 #include "lwip/sys.h"
pehrhovey 0:a548a085de55 53 #include "lwip/stats.h"
pehrhovey 0:a548a085de55 54 #include "netif/etharp.h"
pehrhovey 0:a548a085de55 55 #include "lwip/ip_frag.h"
pehrhovey 0:a548a085de55 56
pehrhovey 0:a548a085de55 57 #include <string.h>
pehrhovey 0:a548a085de55 58
pehrhovey 0:a548a085de55 59 #if !MEMP_MEM_MALLOC /* don't build if not configured for use in lwipopts.h */
pehrhovey 0:a548a085de55 60
pehrhovey 0:a548a085de55 61 struct memp {
pehrhovey 0:a548a085de55 62 struct memp *next;
pehrhovey 0:a548a085de55 63 #if MEMP_OVERFLOW_CHECK
pehrhovey 0:a548a085de55 64 const char *file;
pehrhovey 0:a548a085de55 65 int line;
pehrhovey 0:a548a085de55 66 #endif /* MEMP_OVERFLOW_CHECK */
pehrhovey 0:a548a085de55 67 };
pehrhovey 0:a548a085de55 68
pehrhovey 0:a548a085de55 69 #if MEMP_OVERFLOW_CHECK
pehrhovey 0:a548a085de55 70 /* if MEMP_OVERFLOW_CHECK is turned on, we reserve some bytes at the beginning
pehrhovey 0:a548a085de55 71 * and at the end of each element, initialize them as 0xcd and check
pehrhovey 0:a548a085de55 72 * them later. */
pehrhovey 0:a548a085de55 73 /* If MEMP_OVERFLOW_CHECK is >= 2, on every call to memp_malloc or memp_free,
pehrhovey 0:a548a085de55 74 * every single element in each pool is checked!
pehrhovey 0:a548a085de55 75 * This is VERY SLOW but also very helpful. */
pehrhovey 0:a548a085de55 76 /* MEMP_SANITY_REGION_BEFORE and MEMP_SANITY_REGION_AFTER can be overridden in
pehrhovey 0:a548a085de55 77 * lwipopts.h to change the amount reserved for checking. */
pehrhovey 0:a548a085de55 78 #ifndef MEMP_SANITY_REGION_BEFORE
pehrhovey 0:a548a085de55 79 #define MEMP_SANITY_REGION_BEFORE 16
pehrhovey 0:a548a085de55 80 #endif /* MEMP_SANITY_REGION_BEFORE*/
pehrhovey 0:a548a085de55 81 #if MEMP_SANITY_REGION_BEFORE > 0
pehrhovey 0:a548a085de55 82 #define MEMP_SANITY_REGION_BEFORE_ALIGNED LWIP_MEM_ALIGN_SIZE(MEMP_SANITY_REGION_BEFORE)
pehrhovey 0:a548a085de55 83 #else
pehrhovey 0:a548a085de55 84 #define MEMP_SANITY_REGION_BEFORE_ALIGNED 0
pehrhovey 0:a548a085de55 85 #endif /* MEMP_SANITY_REGION_BEFORE*/
pehrhovey 0:a548a085de55 86 #ifndef MEMP_SANITY_REGION_AFTER
pehrhovey 0:a548a085de55 87 #define MEMP_SANITY_REGION_AFTER 16
pehrhovey 0:a548a085de55 88 #endif /* MEMP_SANITY_REGION_AFTER*/
pehrhovey 0:a548a085de55 89 #if MEMP_SANITY_REGION_AFTER > 0
pehrhovey 0:a548a085de55 90 #define MEMP_SANITY_REGION_AFTER_ALIGNED LWIP_MEM_ALIGN_SIZE(MEMP_SANITY_REGION_AFTER)
pehrhovey 0:a548a085de55 91 #else
pehrhovey 0:a548a085de55 92 #define MEMP_SANITY_REGION_AFTER_ALIGNED 0
pehrhovey 0:a548a085de55 93 #endif /* MEMP_SANITY_REGION_AFTER*/
pehrhovey 0:a548a085de55 94
pehrhovey 0:a548a085de55 95 /* MEMP_SIZE: save space for struct memp and for sanity check */
pehrhovey 0:a548a085de55 96 #define MEMP_SIZE (LWIP_MEM_ALIGN_SIZE(sizeof(struct memp)) + MEMP_SANITY_REGION_BEFORE_ALIGNED)
pehrhovey 0:a548a085de55 97 #define MEMP_ALIGN_SIZE(x) (LWIP_MEM_ALIGN_SIZE(x) + MEMP_SANITY_REGION_AFTER_ALIGNED)
pehrhovey 0:a548a085de55 98
pehrhovey 0:a548a085de55 99 #else /* MEMP_OVERFLOW_CHECK */
pehrhovey 0:a548a085de55 100
pehrhovey 0:a548a085de55 101 /* No sanity checks
pehrhovey 0:a548a085de55 102 * We don't need to preserve the struct memp while not allocated, so we
pehrhovey 0:a548a085de55 103 * can save a little space and set MEMP_SIZE to 0.
pehrhovey 0:a548a085de55 104 */
pehrhovey 0:a548a085de55 105 #define MEMP_SIZE 0
pehrhovey 0:a548a085de55 106 #define MEMP_ALIGN_SIZE(x) (LWIP_MEM_ALIGN_SIZE(x))
pehrhovey 0:a548a085de55 107
pehrhovey 0:a548a085de55 108 #endif /* MEMP_OVERFLOW_CHECK */
pehrhovey 0:a548a085de55 109
pehrhovey 0:a548a085de55 110 /** This array holds the first free element of each pool.
pehrhovey 0:a548a085de55 111 * Elements form a linked list. */
pehrhovey 0:a548a085de55 112 static struct memp *memp_tab[MEMP_MAX];
pehrhovey 0:a548a085de55 113
pehrhovey 0:a548a085de55 114 #else /* MEMP_MEM_MALLOC */
pehrhovey 0:a548a085de55 115
pehrhovey 0:a548a085de55 116 #define MEMP_ALIGN_SIZE(x) (LWIP_MEM_ALIGN_SIZE(x))
pehrhovey 0:a548a085de55 117
pehrhovey 0:a548a085de55 118 #endif /* MEMP_MEM_MALLOC */
pehrhovey 0:a548a085de55 119
pehrhovey 0:a548a085de55 120 /** This array holds the element sizes of each pool. */
pehrhovey 0:a548a085de55 121 #if !MEM_USE_POOLS && !MEMP_MEM_MALLOC
pehrhovey 0:a548a085de55 122 static
pehrhovey 0:a548a085de55 123 #endif
pehrhovey 0:a548a085de55 124 const u16_t memp_sizes[MEMP_MAX] = {
pehrhovey 0:a548a085de55 125 #define LWIP_MEMPOOL(name,num,size,desc) LWIP_MEM_ALIGN_SIZE(size),
pehrhovey 0:a548a085de55 126 #include "lwip/memp_std.h"
pehrhovey 0:a548a085de55 127 };
pehrhovey 0:a548a085de55 128
pehrhovey 0:a548a085de55 129 #if !MEMP_MEM_MALLOC /* don't build if not configured for use in lwipopts.h */
pehrhovey 0:a548a085de55 130
pehrhovey 0:a548a085de55 131 /** This array holds the number of elements in each pool. */
pehrhovey 0:a548a085de55 132 static const u16_t memp_num[MEMP_MAX] = {
pehrhovey 0:a548a085de55 133 #define LWIP_MEMPOOL(name,num,size,desc) (num),
pehrhovey 0:a548a085de55 134 #include "lwip/memp_std.h"
pehrhovey 0:a548a085de55 135 };
pehrhovey 0:a548a085de55 136
pehrhovey 0:a548a085de55 137 /** This array holds a textual description of each pool. */
pehrhovey 0:a548a085de55 138 #ifdef LWIP_DEBUG
pehrhovey 0:a548a085de55 139 static const char *memp_desc[MEMP_MAX] = {
pehrhovey 0:a548a085de55 140 #define LWIP_MEMPOOL(name,num,size,desc) (desc),
pehrhovey 0:a548a085de55 141 #include "lwip/memp_std.h"
pehrhovey 0:a548a085de55 142 };
pehrhovey 0:a548a085de55 143 #endif /* LWIP_DEBUG */
pehrhovey 0:a548a085de55 144
pehrhovey 0:a548a085de55 145 /** This is the actual memory used by the pools. */
pehrhovey 0:a548a085de55 146 static u8_t memp_memory[MEM_ALIGNMENT - 1
pehrhovey 0:a548a085de55 147 #define LWIP_MEMPOOL(name,num,size,desc) + ( (num) * (MEMP_SIZE + MEMP_ALIGN_SIZE(size) ) )
pehrhovey 0:a548a085de55 148 #include "lwip/memp_std.h"
pehrhovey 0:a548a085de55 149 ];
pehrhovey 0:a548a085de55 150
pehrhovey 0:a548a085de55 151 #if MEMP_SANITY_CHECK
pehrhovey 0:a548a085de55 152 /**
pehrhovey 0:a548a085de55 153 * Check that memp-lists don't form a circle
pehrhovey 0:a548a085de55 154 */
pehrhovey 0:a548a085de55 155 static int
pehrhovey 0:a548a085de55 156 memp_sanity(void)
pehrhovey 0:a548a085de55 157 {
pehrhovey 0:a548a085de55 158 s16_t i, c;
pehrhovey 0:a548a085de55 159 struct memp *m, *n;
pehrhovey 0:a548a085de55 160
pehrhovey 0:a548a085de55 161 for (i = 0; i < MEMP_MAX; i++) {
pehrhovey 0:a548a085de55 162 for (m = memp_tab[i]; m != NULL; m = m->next) {
pehrhovey 0:a548a085de55 163 c = 1;
pehrhovey 0:a548a085de55 164 for (n = memp_tab[i]; n != NULL; n = n->next) {
pehrhovey 0:a548a085de55 165 if (n == m && --c < 0) {
pehrhovey 0:a548a085de55 166 return 0;
pehrhovey 0:a548a085de55 167 }
pehrhovey 0:a548a085de55 168 }
pehrhovey 0:a548a085de55 169 }
pehrhovey 0:a548a085de55 170 }
pehrhovey 0:a548a085de55 171 return 1;
pehrhovey 0:a548a085de55 172 }
pehrhovey 0:a548a085de55 173 #endif /* MEMP_SANITY_CHECK*/
pehrhovey 0:a548a085de55 174 #if MEMP_OVERFLOW_CHECK
pehrhovey 0:a548a085de55 175 /**
pehrhovey 0:a548a085de55 176 * Check if a memp element was victim of an overflow
pehrhovey 0:a548a085de55 177 * (e.g. the restricted area after it has been altered)
pehrhovey 0:a548a085de55 178 *
pehrhovey 0:a548a085de55 179 * @param p the memp element to check
pehrhovey 0:a548a085de55 180 * @param memp_size the element size of the pool p comes from
pehrhovey 0:a548a085de55 181 */
pehrhovey 0:a548a085de55 182 static void
pehrhovey 0:a548a085de55 183 memp_overflow_check_element(struct memp *p, u16_t memp_size)
pehrhovey 0:a548a085de55 184 {
pehrhovey 0:a548a085de55 185 u16_t k;
pehrhovey 0:a548a085de55 186 u8_t *m;
pehrhovey 0:a548a085de55 187 #if MEMP_SANITY_REGION_BEFORE_ALIGNED > 0
pehrhovey 0:a548a085de55 188 m = (u8_t*)p + MEMP_SIZE - MEMP_SANITY_REGION_BEFORE_ALIGNED;
pehrhovey 0:a548a085de55 189 for (k = 0; k < MEMP_SANITY_REGION_BEFORE_ALIGNED; k++) {
pehrhovey 0:a548a085de55 190 if (m[k] != 0xcd) {
pehrhovey 0:a548a085de55 191 LWIP_ASSERT("detected memp underflow!", 0);
pehrhovey 0:a548a085de55 192 }
pehrhovey 0:a548a085de55 193 }
pehrhovey 0:a548a085de55 194 #endif
pehrhovey 0:a548a085de55 195 #if MEMP_SANITY_REGION_AFTER_ALIGNED > 0
pehrhovey 0:a548a085de55 196 m = (u8_t*)p + MEMP_SIZE + memp_size;
pehrhovey 0:a548a085de55 197 for (k = 0; k < MEMP_SANITY_REGION_AFTER_ALIGNED; k++) {
pehrhovey 0:a548a085de55 198 if (m[k] != 0xcd) {
pehrhovey 0:a548a085de55 199 LWIP_ASSERT("detected memp overflow!", 0);
pehrhovey 0:a548a085de55 200 }
pehrhovey 0:a548a085de55 201 }
pehrhovey 0:a548a085de55 202 #endif
pehrhovey 0:a548a085de55 203 }
pehrhovey 0:a548a085de55 204
pehrhovey 0:a548a085de55 205 /**
pehrhovey 0:a548a085de55 206 * Do an overflow check for all elements in every pool.
pehrhovey 0:a548a085de55 207 *
pehrhovey 0:a548a085de55 208 * @see memp_overflow_check_element for a description of the check
pehrhovey 0:a548a085de55 209 */
pehrhovey 0:a548a085de55 210 static void
pehrhovey 0:a548a085de55 211 memp_overflow_check_all(void)
pehrhovey 0:a548a085de55 212 {
pehrhovey 0:a548a085de55 213 u16_t i, j;
pehrhovey 0:a548a085de55 214 struct memp *p;
pehrhovey 0:a548a085de55 215
pehrhovey 0:a548a085de55 216 p = LWIP_MEM_ALIGN(memp_memory);
pehrhovey 0:a548a085de55 217 for (i = 0; i < MEMP_MAX; ++i) {
pehrhovey 0:a548a085de55 218 p = p;
pehrhovey 0:a548a085de55 219 for (j = 0; j < memp_num[i]; ++j) {
pehrhovey 0:a548a085de55 220 memp_overflow_check_element(p, memp_sizes[i]);
pehrhovey 0:a548a085de55 221 p = (struct memp*)((u8_t*)p + MEMP_SIZE + memp_sizes[i] + MEMP_SANITY_REGION_AFTER_ALIGNED);
pehrhovey 0:a548a085de55 222 }
pehrhovey 0:a548a085de55 223 }
pehrhovey 0:a548a085de55 224 }
pehrhovey 0:a548a085de55 225
pehrhovey 0:a548a085de55 226 /**
pehrhovey 0:a548a085de55 227 * Initialize the restricted areas of all memp elements in every pool.
pehrhovey 0:a548a085de55 228 */
pehrhovey 0:a548a085de55 229 static void
pehrhovey 0:a548a085de55 230 memp_overflow_init(void)
pehrhovey 0:a548a085de55 231 {
pehrhovey 0:a548a085de55 232 u16_t i, j;
pehrhovey 0:a548a085de55 233 struct memp *p;
pehrhovey 0:a548a085de55 234 u8_t *m;
pehrhovey 0:a548a085de55 235
pehrhovey 0:a548a085de55 236 p = LWIP_MEM_ALIGN(memp_memory);
pehrhovey 0:a548a085de55 237 for (i = 0; i < MEMP_MAX; ++i) {
pehrhovey 0:a548a085de55 238 p = p;
pehrhovey 0:a548a085de55 239 for (j = 0; j < memp_num[i]; ++j) {
pehrhovey 0:a548a085de55 240 #if MEMP_SANITY_REGION_BEFORE_ALIGNED > 0
pehrhovey 0:a548a085de55 241 m = (u8_t*)p + MEMP_SIZE - MEMP_SANITY_REGION_BEFORE_ALIGNED;
pehrhovey 0:a548a085de55 242 memset(m, 0xcd, MEMP_SANITY_REGION_BEFORE_ALIGNED);
pehrhovey 0:a548a085de55 243 #endif
pehrhovey 0:a548a085de55 244 #if MEMP_SANITY_REGION_AFTER_ALIGNED > 0
pehrhovey 0:a548a085de55 245 m = (u8_t*)p + MEMP_SIZE + memp_sizes[i];
pehrhovey 0:a548a085de55 246 memset(m, 0xcd, MEMP_SANITY_REGION_AFTER_ALIGNED);
pehrhovey 0:a548a085de55 247 #endif
pehrhovey 0:a548a085de55 248 p = (struct memp*)((u8_t*)p + MEMP_SIZE + memp_sizes[i] + MEMP_SANITY_REGION_AFTER_ALIGNED);
pehrhovey 0:a548a085de55 249 }
pehrhovey 0:a548a085de55 250 }
pehrhovey 0:a548a085de55 251 }
pehrhovey 0:a548a085de55 252 #endif /* MEMP_OVERFLOW_CHECK */
pehrhovey 0:a548a085de55 253
pehrhovey 0:a548a085de55 254 /**
pehrhovey 0:a548a085de55 255 * Initialize this module.
pehrhovey 0:a548a085de55 256 *
pehrhovey 0:a548a085de55 257 * Carves out memp_memory into linked lists for each pool-type.
pehrhovey 0:a548a085de55 258 */
pehrhovey 0:a548a085de55 259 void
pehrhovey 0:a548a085de55 260 memp_init(void)
pehrhovey 0:a548a085de55 261 {
pehrhovey 0:a548a085de55 262 struct memp *memp;
pehrhovey 0:a548a085de55 263 u16_t i, j;
pehrhovey 0:a548a085de55 264
pehrhovey 0:a548a085de55 265 for (i = 0; i < MEMP_MAX; ++i) {
pehrhovey 0:a548a085de55 266 MEMP_STATS_AVAIL(used, i, 0);
pehrhovey 0:a548a085de55 267 MEMP_STATS_AVAIL(max, i, 0);
pehrhovey 0:a548a085de55 268 MEMP_STATS_AVAIL(err, i, 0);
pehrhovey 0:a548a085de55 269 MEMP_STATS_AVAIL(avail, i, memp_num[i]);
pehrhovey 0:a548a085de55 270 }
pehrhovey 0:a548a085de55 271
pehrhovey 0:a548a085de55 272 memp = LWIP_MEM_ALIGN(memp_memory);
pehrhovey 0:a548a085de55 273 /* for every pool: */
pehrhovey 0:a548a085de55 274 for (i = 0; i < MEMP_MAX; ++i) {
pehrhovey 0:a548a085de55 275 memp_tab[i] = NULL;
pehrhovey 0:a548a085de55 276 /* create a linked list of memp elements */
pehrhovey 0:a548a085de55 277 for (j = 0; j < memp_num[i]; ++j) {
pehrhovey 0:a548a085de55 278 memp->next = memp_tab[i];
pehrhovey 0:a548a085de55 279 memp_tab[i] = memp;
pehrhovey 0:a548a085de55 280 memp = (struct memp *)((u8_t *)memp + MEMP_SIZE + memp_sizes[i]
pehrhovey 0:a548a085de55 281 #if MEMP_OVERFLOW_CHECK
pehrhovey 0:a548a085de55 282 + MEMP_SANITY_REGION_AFTER_ALIGNED
pehrhovey 0:a548a085de55 283 #endif
pehrhovey 0:a548a085de55 284 );
pehrhovey 0:a548a085de55 285 }
pehrhovey 0:a548a085de55 286 }
pehrhovey 0:a548a085de55 287 #if MEMP_OVERFLOW_CHECK
pehrhovey 0:a548a085de55 288 memp_overflow_init();
pehrhovey 0:a548a085de55 289 /* check everything a first time to see if it worked */
pehrhovey 0:a548a085de55 290 memp_overflow_check_all();
pehrhovey 0:a548a085de55 291 #endif /* MEMP_OVERFLOW_CHECK */
pehrhovey 0:a548a085de55 292 }
pehrhovey 0:a548a085de55 293
pehrhovey 0:a548a085de55 294 /**
pehrhovey 0:a548a085de55 295 * Get an element from a specific pool.
pehrhovey 0:a548a085de55 296 *
pehrhovey 0:a548a085de55 297 * @param type the pool to get an element from
pehrhovey 0:a548a085de55 298 *
pehrhovey 0:a548a085de55 299 * the debug version has two more parameters:
pehrhovey 0:a548a085de55 300 * @param file file name calling this function
pehrhovey 0:a548a085de55 301 * @param line number of line where this function is called
pehrhovey 0:a548a085de55 302 *
pehrhovey 0:a548a085de55 303 * @return a pointer to the allocated memory or a NULL pointer on error
pehrhovey 0:a548a085de55 304 */
pehrhovey 0:a548a085de55 305 void *
pehrhovey 0:a548a085de55 306 #if !MEMP_OVERFLOW_CHECK
pehrhovey 0:a548a085de55 307 memp_malloc(memp_t type)
pehrhovey 0:a548a085de55 308 #else
pehrhovey 0:a548a085de55 309 memp_malloc_fn(memp_t type, const char* file, const int line)
pehrhovey 0:a548a085de55 310 #endif
pehrhovey 0:a548a085de55 311 {
pehrhovey 0:a548a085de55 312 struct memp *memp;
pehrhovey 0:a548a085de55 313 SYS_ARCH_DECL_PROTECT(old_level);
pehrhovey 0:a548a085de55 314
pehrhovey 0:a548a085de55 315 LWIP_ERROR("memp_malloc: type < MEMP_MAX", (type < MEMP_MAX), return NULL;);
pehrhovey 0:a548a085de55 316
pehrhovey 0:a548a085de55 317 SYS_ARCH_PROTECT(old_level);
pehrhovey 0:a548a085de55 318 #if MEMP_OVERFLOW_CHECK >= 2
pehrhovey 0:a548a085de55 319 memp_overflow_check_all();
pehrhovey 0:a548a085de55 320 #endif /* MEMP_OVERFLOW_CHECK >= 2 */
pehrhovey 0:a548a085de55 321
pehrhovey 0:a548a085de55 322 memp = memp_tab[type];
pehrhovey 0:a548a085de55 323
pehrhovey 0:a548a085de55 324 if (memp != NULL) {
pehrhovey 0:a548a085de55 325 memp_tab[type] = memp->next;
pehrhovey 0:a548a085de55 326 #if MEMP_OVERFLOW_CHECK
pehrhovey 0:a548a085de55 327 memp->next = NULL;
pehrhovey 0:a548a085de55 328 memp->file = file;
pehrhovey 0:a548a085de55 329 memp->line = line;
pehrhovey 0:a548a085de55 330 #endif /* MEMP_OVERFLOW_CHECK */
pehrhovey 0:a548a085de55 331 MEMP_STATS_INC_USED(used, type);
pehrhovey 0:a548a085de55 332 LWIP_ASSERT("memp_malloc: memp properly aligned",
pehrhovey 0:a548a085de55 333 ((mem_ptr_t)memp % MEM_ALIGNMENT) == 0);
pehrhovey 0:a548a085de55 334 memp = (struct memp*)((u8_t*)memp + MEMP_SIZE);
pehrhovey 0:a548a085de55 335 } else {
pehrhovey 0:a548a085de55 336 LWIP_DEBUGF(MEMP_DEBUG | 2, ("memp_malloc: out of memory in pool %s\n", memp_desc[type]));
pehrhovey 0:a548a085de55 337 MEMP_STATS_INC(err, type);
pehrhovey 0:a548a085de55 338 }
pehrhovey 0:a548a085de55 339
pehrhovey 0:a548a085de55 340 SYS_ARCH_UNPROTECT(old_level);
pehrhovey 0:a548a085de55 341
pehrhovey 0:a548a085de55 342 return memp;
pehrhovey 0:a548a085de55 343 }
pehrhovey 0:a548a085de55 344
pehrhovey 0:a548a085de55 345 /**
pehrhovey 0:a548a085de55 346 * Put an element back into its pool.
pehrhovey 0:a548a085de55 347 *
pehrhovey 0:a548a085de55 348 * @param type the pool where to put mem
pehrhovey 0:a548a085de55 349 * @param mem the memp element to free
pehrhovey 0:a548a085de55 350 */
pehrhovey 0:a548a085de55 351 void
pehrhovey 0:a548a085de55 352 memp_free(memp_t type, void *mem)
pehrhovey 0:a548a085de55 353 {
pehrhovey 0:a548a085de55 354 struct memp *memp;
pehrhovey 0:a548a085de55 355 SYS_ARCH_DECL_PROTECT(old_level);
pehrhovey 0:a548a085de55 356
pehrhovey 0:a548a085de55 357 if (mem == NULL) {
pehrhovey 0:a548a085de55 358 return;
pehrhovey 0:a548a085de55 359 }
pehrhovey 0:a548a085de55 360 LWIP_ASSERT("memp_free: mem properly aligned",
pehrhovey 0:a548a085de55 361 ((mem_ptr_t)mem % MEM_ALIGNMENT) == 0);
pehrhovey 0:a548a085de55 362
pehrhovey 0:a548a085de55 363 memp = (struct memp *)((u8_t*)mem - MEMP_SIZE);
pehrhovey 0:a548a085de55 364
pehrhovey 0:a548a085de55 365 SYS_ARCH_PROTECT(old_level);
pehrhovey 0:a548a085de55 366 #if MEMP_OVERFLOW_CHECK
pehrhovey 0:a548a085de55 367 #if MEMP_OVERFLOW_CHECK >= 2
pehrhovey 0:a548a085de55 368 memp_overflow_check_all();
pehrhovey 0:a548a085de55 369 #else
pehrhovey 0:a548a085de55 370 memp_overflow_check_element(memp, memp_sizes[type]);
pehrhovey 0:a548a085de55 371 #endif /* MEMP_OVERFLOW_CHECK >= 2 */
pehrhovey 0:a548a085de55 372 #endif /* MEMP_OVERFLOW_CHECK */
pehrhovey 0:a548a085de55 373
pehrhovey 0:a548a085de55 374 MEMP_STATS_DEC(used, type);
pehrhovey 0:a548a085de55 375
pehrhovey 0:a548a085de55 376 memp->next = memp_tab[type];
pehrhovey 0:a548a085de55 377 memp_tab[type] = memp;
pehrhovey 0:a548a085de55 378
pehrhovey 0:a548a085de55 379 #if MEMP_SANITY_CHECK
pehrhovey 0:a548a085de55 380 LWIP_ASSERT("memp sanity", memp_sanity());
pehrhovey 0:a548a085de55 381 #endif /* MEMP_SANITY_CHECK */
pehrhovey 0:a548a085de55 382
pehrhovey 0:a548a085de55 383 SYS_ARCH_UNPROTECT(old_level);
pehrhovey 0:a548a085de55 384 }
pehrhovey 0:a548a085de55 385
pehrhovey 0:a548a085de55 386 #endif /* MEMP_MEM_MALLOC */