diff --git a/sys/net/gnrc/pktbuf_static/gnrc_pktbuf_static.c b/sys/net/gnrc/pktbuf_static/gnrc_pktbuf_static.c index d65243beee7f2d47359a8b6bc0f2fe3c26410825..eba560abb7f1eab5629031af85de812c70a75bde 100644 --- a/sys/net/gnrc/pktbuf_static/gnrc_pktbuf_static.c +++ b/sys/net/gnrc/pktbuf_static/gnrc_pktbuf_static.c @@ -33,7 +33,7 @@ #define ENABLE_DEBUG (0) #include "debug.h" -#define _ALIGNMENT_MASK (sizeof(void *) - 1) +#define _ALIGNMENT_MASK (sizeof(_unused_t) - 1) typedef struct _unused { struct _unused *next; @@ -108,8 +108,7 @@ gnrc_pktsnip_t *gnrc_pktbuf_mark(gnrc_pktsnip_t *pkt, size_t size, gnrc_nettype_ { gnrc_pktsnip_t *marked_snip; /* size required for chunk */ - size_t required_new_size = (size < sizeof(_unused_t)) ? - _align(sizeof(_unused_t)) : _align(size); + size_t required_new_size = _align(size); void *new_data_marked; mutex_lock(&_mutex); @@ -130,8 +129,7 @@ gnrc_pktsnip_t *gnrc_pktbuf_mark(gnrc_pktsnip_t *pkt, size_t size, gnrc_nettype_ } /* marked data would not fit _unused_t marker => move data around to allow * for proper free */ - if ((pkt->size != size) && - ((size < required_new_size) || ((pkt->size - size) < sizeof(_unused_t)))) { + if ((pkt->size != size) && (size < required_new_size)) { void *new_data_rest; new_data_marked = _pktbuf_alloc(size); if (new_data_marked == NULL) { @@ -169,8 +167,7 @@ gnrc_pktsnip_t *gnrc_pktbuf_mark(gnrc_pktsnip_t *pkt, size_t size, gnrc_nettype_ int gnrc_pktbuf_realloc_data(gnrc_pktsnip_t *pkt, size_t size) { - size_t aligned_size = (size < sizeof(_unused_t)) ? - _align(sizeof(_unused_t)) : _align(size); + size_t aligned_size = _align(size); mutex_lock(&_mutex); assert(pkt != NULL); @@ -189,8 +186,7 @@ int gnrc_pktbuf_realloc_data(gnrc_pktsnip_t *pkt, size_t size) pkt->data = NULL; } /* if new size is bigger than old size */ - else if ((size > pkt->size) || /* new size does not fit */ - ((pkt->size - aligned_size) < sizeof(_unused_t))) { /* resulting hole would not fit marker */ + else if (size > pkt->size) { /* new size does not fit */ void *new_data = _pktbuf_alloc(size); if (new_data == NULL) { DEBUG("pktbuf: error allocating new data section\n"); @@ -396,7 +392,7 @@ static void *_pktbuf_alloc(size_t size) { _unused_t *prev = NULL, *ptr = _first_unused; - size = (size < sizeof(_unused_t)) ? _align(sizeof(_unused_t)) : _align(size); + size = _align(size); while (ptr && (size > ptr->size)) { prev = ptr; ptr = ptr->next; @@ -466,11 +462,11 @@ static void _pktbuf_free(void *data, size_t size) ptr = ptr->next; } new->next = ptr; - new->size = (size < sizeof(_unused_t)) ? _align(sizeof(_unused_t)) : _align(size); + new->size = _align(size); /* calculate number of bytes between new _unused_t chunk and end of packet * buffer */ bytes_at_end = ((&_pktbuf[0] + GNRC_PKTBUF_SIZE) - (((uint8_t *)new) + new->size)); - if (bytes_at_end < _align(sizeof(_unused_t))) { + if (bytes_at_end < sizeof(_unused_t)) { /* new is very last segment and there is a little bit of memory left * that wouldn't fit _unused_t (cut of in _pktbuf_alloc()) => re-add it */ new->size += bytes_at_end; diff --git a/tests/gnrc_ndp/main.c b/tests/gnrc_ndp/main.c index b3b214979dbf8a7c7b68b8375c4a442badce4556..86452dcbff573eddf414fd49fe108e656df9a5df 100644 --- a/tests/gnrc_ndp/main.c +++ b/tests/gnrc_ndp/main.c @@ -79,7 +79,9 @@ static void set_up(void) static void fill_pktbuf(void) { gnrc_pktsnip_t *pkt = gnrc_pktbuf_add(NULL, NULL, - GNRC_PKTBUF_SIZE - sizeof(gnrc_pktsnip_t), + /* 24 = sizeof(gnrc_pktsnip_t) + + * potential alignment */ + GNRC_PKTBUF_SIZE - 24U, GNRC_NETTYPE_UNDEF); TEST_ASSERT_NOT_NULL(pkt); TEST_ASSERT(gnrc_pktbuf_is_sane());