Skip to content

Commit

Permalink
Merge branch 'packetbuf2' into 6lowpan-fix-major
Browse files Browse the repository at this point in the history
  • Loading branch information
miri64 committed Sep 19, 2014
2 parents 58dd5f4 + fc74686 commit bad9cde
Show file tree
Hide file tree
Showing 3 changed files with 110 additions and 50 deletions.
91 changes: 79 additions & 12 deletions sys/net/crosslayer/pktbuf/pktbuf.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
*/

#include <errno.h>
#include <stdint.h>
#include <inttypes.h>
#include <stdlib.h>
#include <string.h>

Expand All @@ -34,7 +34,10 @@ static mutex_t _pktbuf_mutex = MUTEX_INIT;
/**
* @brief Get first element in packet buffer.
*/
#define _PKTBUF_HEAD ((_packet_t *) (&(_pktbuf[0])))
static inline _packet_t *_pktbuf_head(void)
{
return (_packet_t *)(&(_pktbuf[0]));
}

/**
* @brief Get data part (memory behind `_packet_t` descriptive header) of a packet
Expand Down Expand Up @@ -100,7 +103,7 @@ static inline size_t _pktbuf_end_idx(_packet_t *pkt)
static _packet_t *_pktbuf_find_with_prev(_packet_t **prev_ptr,
_packet_t **packet_ptr, const void *pkt)
{
_packet_t *packet = _PKTBUF_HEAD, *prev = NULL;
_packet_t *packet = _pktbuf_head(), *prev = NULL;

while (packet != NULL) {

Expand All @@ -122,7 +125,7 @@ static _packet_t *_pktbuf_find_with_prev(_packet_t **prev_ptr,

static _packet_t *_pktbuf_find(const void *pkt)
{
_packet_t *packet = _PKTBUF_HEAD;
_packet_t *packet = _pktbuf_head();

#ifdef DEVELHELP

Expand All @@ -146,7 +149,7 @@ static _packet_t *_pktbuf_find(const void *pkt)

static _packet_t *_pktbuf_alloc(size_t size)
{
_packet_t *packet = _PKTBUF_HEAD, *old_next;
_packet_t *packet = _pktbuf_head(), *old_next;

if ((size == 0) || (size > PKTBUF_SIZE)) {
return NULL;
Expand Down Expand Up @@ -205,7 +208,7 @@ static void _pktbuf_free(_packet_t *prev, _packet_t *packet)
return;
}

if (prev == NULL) { /* packet is _PKTBUF_HEAD */
if (prev == NULL) { /* packet is _pktbuf_head() */
packet->size = 0;
}
else {
Expand Down Expand Up @@ -340,7 +343,7 @@ int pktbuf_copy(void *pkt, const void *data, size_t data_len)

void pktbuf_hold(const void *pkt)
{
_packet_t *packet = _PKTBUF_HEAD;
_packet_t *packet = _pktbuf_head();

mutex_lock(&_pktbuf_mutex);

Expand All @@ -355,7 +358,7 @@ void pktbuf_hold(const void *pkt)

void pktbuf_release(const void *pkt)
{
_packet_t *packet = _PKTBUF_HEAD, *prev = NULL;
_packet_t *packet = _pktbuf_head(), *prev = NULL;

mutex_lock(&_pktbuf_mutex);

Expand All @@ -375,16 +378,76 @@ void pktbuf_release(const void *pkt)
mutex_unlock(&_pktbuf_mutex);
}

#ifdef DEVELHELP
#include <stdio.h>

void pktbuf_print(void)
{
_packet_t *packet = _pktbuf_head();
int i = 0;

mutex_lock(&_pktbuf_mutex);

printf("current pktbuf allocations:\n");
printf("===================================================\n");

while (packet != NULL) {
uint8_t *data = (uint8_t *)_pkt_data(packet);

printf("packet %d:\n", i);
printf(" size: %" PRIu32 "\n", (uint32_t)packet->size);
printf(" processing: %" PRIu8 "\n", packet->processing);

if (packet->next != NULL) {
printf(" free data after: %" PRIu32 "\n",
(uint32_t)(_pktbuf_start_idx((_packet_t *)(packet->next)) - _pktbuf_end_idx(packet) - 1));
}
else {
printf(" free data after: %" PRIu32 "\n", (uint32_t)(PKTBUF_SIZE - _pktbuf_end_idx(packet) - 1));

}

printf(" data:\n ");

if (packet->size > PKTBUF_SIZE) {
printf(" We have a problem: packet->size (%" PRIu32 ") > PKTBUF_SIZE (%" PRIu32 ")\n",
(uint32_t)(packet->size), (uint32_t)PKTBUF_SIZE);
}
else {
for (size_t j = 0; j < packet->size; j++) {
printf(" %02x", data[j]);

if (((j + 1) % 16) == 0) {
printf("\n ");
}
}

printf("\n\n");
}

packet = (_packet_t *)packet->next;
i++;
}

printf("===================================================\n");
printf("\n");

mutex_unlock(&_pktbuf_mutex);

}
#endif

#ifdef TEST_SUITES
size_t pktbuf_bytes_allocated(void)
{
_packet_t *packet = _PKTBUF_HEAD;
_packet_t *packet = _pktbuf_head();
size_t bytes = 0;

mutex_lock(&_pktbuf_mutex);

while (packet != NULL) {
bytes += packet->size;
packet = (_packet_t *)(packet->next);
}

mutex_unlock(&_pktbuf_mutex);
Expand All @@ -394,13 +457,17 @@ size_t pktbuf_bytes_allocated(void)

unsigned int pktbuf_packets_allocated(void)
{
_packet_t *packet = _PKTBUF_HEAD;
_packet_t *packet = _pktbuf_head();
unsigned int packets = 0;

mutex_lock(&_pktbuf_mutex);

while (packet != NULL) {
packets++;
if (packet != _pktbuf_head() || packet->size > 0) { /* ignore head if head->size == 0 */
packets++;
}

packet = (_packet_t *)(packet->next);
}

mutex_unlock(&_pktbuf_mutex);
Expand All @@ -410,7 +477,7 @@ unsigned int pktbuf_packets_allocated(void)

int pktbuf_is_empty(void)
{
return ((_PKTBUF_HEAD->next == NULL) && (_PKTBUF_HEAD->size == 0));
return ((_pktbuf_head()->next == NULL) && (_pktbuf_head()->size == 0));
}

void pktbuf_reset(void)
Expand Down
9 changes: 9 additions & 0 deletions sys/net/include/pktbuf.h
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,15 @@ void pktbuf_hold(const void *pkt);
*/
void pktbuf_release(const void *pkt);

#ifdef DEVELHELP
/**
* @brief Prints current packet buffer to stdout.
*/
void pktbuf_print(void);
#else
#define pktbuf_print() ;
#endif

/* for testing */
#ifdef TEST_SUITES
/**
Expand Down
60 changes: 22 additions & 38 deletions tests/unittests/tests-pktbuf/tests-pktbuf.c
Original file line number Diff line number Diff line change
Expand Up @@ -187,35 +187,7 @@ static void test_pktbuf_insert_success(void)
}
}

static void test_pktbuf_copy_no_alloc_before(void)
{
char data[] = "abcd";

TEST_ASSERT_EQUAL_INT(-EINVAL, pktbuf_copy(data, "ef", 0));
}

static void test_pktbuf_copy_invalid_ptr(void)
{
char data[] = "abcd";

TEST_ASSERT_NOT_NULL(pktbuf_alloc(25));
TEST_ASSERT_EQUAL_INT(-EINVAL, pktbuf_copy(data, "ef", 0));
}

static void test_pktbuf_copy_freed_ptr(void)
{
char *data;

TEST_ASSERT_NOT_NULL(pktbuf_alloc(25));
data = pktbuf_alloc(21);
TEST_ASSERT_NOT_NULL(data);
TEST_ASSERT_NOT_NULL(pktbuf_alloc(16));

pktbuf_release(data);

TEST_ASSERT_EQUAL_INT(-EINVAL, pktbuf_copy(data, "ef", 3));
}

#ifdef DEVELHELP
static void test_pktbuf_copy_efault(void)
{
char *data = (char *)pktbuf_insert("abcd", 5);
Expand All @@ -224,6 +196,7 @@ static void test_pktbuf_copy_efault(void)
TEST_ASSERT_EQUAL_INT(-EFAULT, pktbuf_copy(data, NULL, 3));
TEST_ASSERT_EQUAL_STRING("abcd", data);
}
#endif

static void test_pktbuf_copy_data_len_too_long(void)
{
Expand Down Expand Up @@ -279,10 +252,12 @@ static void test_pktbuf_hold_ptr_null(void)
TEST_ASSERT_NOT_NULL(data);
TEST_ASSERT_NOT_NULL(pktbuf_alloc(16));

TEST_ASSERT_EQUAL_INT(3, pktbuf_packets_allocated());

pktbuf_hold(NULL);
pktbuf_release(data);

TEST_ASSERT_EQUAL_INT(-EINVAL, pktbuf_copy(data, "ef", 3));
TEST_ASSERT_EQUAL_INT(2, pktbuf_packets_allocated());
TEST_ASSERT_EQUAL_STRING("abcd", data);
}

Expand All @@ -295,10 +270,12 @@ static void test_pktbuf_hold_wrong_ptr(void)
TEST_ASSERT_NOT_NULL(data);
TEST_ASSERT_NOT_NULL(pktbuf_alloc(16));

TEST_ASSERT_EQUAL_INT(3, pktbuf_packets_allocated());

pktbuf_hold(&wrong);
pktbuf_release(data);

TEST_ASSERT_EQUAL_INT(-EINVAL, pktbuf_copy(data, "ef", 3));
TEST_ASSERT_EQUAL_INT(2, pktbuf_packets_allocated());
TEST_ASSERT_EQUAL_STRING("abcd", data);
}

Expand Down Expand Up @@ -373,13 +350,15 @@ static void test_pktbuf_release_success(void)
TEST_ASSERT_NOT_NULL(data);
TEST_ASSERT_NOT_NULL(pktbuf_alloc(16));

TEST_ASSERT_EQUAL_INT(3, pktbuf_packets_allocated());

pktbuf_hold(data);
pktbuf_hold(data);
pktbuf_release(data + 3);
pktbuf_release(data + 4);
pktbuf_release(data + 2);

TEST_ASSERT_EQUAL_INT(-EINVAL, pktbuf_copy(data, "ef", 3));
TEST_ASSERT_EQUAL_INT(2, pktbuf_packets_allocated());
}

static void test_pktbuf_release_success2(void)
Expand All @@ -393,9 +372,11 @@ static void test_pktbuf_release_success2(void)
data3 = (char *)pktbuf_insert("ghijkl", 7);
TEST_ASSERT_NOT_NULL(data3);

TEST_ASSERT_EQUAL_INT(3, pktbuf_packets_allocated());

pktbuf_release(data2);

TEST_ASSERT_EQUAL_INT(-EINVAL, pktbuf_copy(data2, "m", 2));
TEST_ASSERT_EQUAL_INT(2, pktbuf_packets_allocated());
TEST_ASSERT_EQUAL_INT(2, pktbuf_copy(data1, "m", 2));
TEST_ASSERT_EQUAL_STRING("m", data1);
TEST_ASSERT_EQUAL_INT(4, pktbuf_copy(data3, "nop", 4));
Expand All @@ -413,9 +394,11 @@ static void test_pktbuf_release_success3(void)
data3 = (char *)pktbuf_insert("ghijkl", 7);
TEST_ASSERT_NOT_NULL(data3);

TEST_ASSERT_EQUAL_INT(3, pktbuf_packets_allocated());

pktbuf_release(data1);

TEST_ASSERT_EQUAL_INT(-EINVAL, pktbuf_copy(data1, "m", 2));
TEST_ASSERT_EQUAL_INT(2, pktbuf_packets_allocated());
TEST_ASSERT_EQUAL_INT(2, pktbuf_copy(data2, "m", 2));
TEST_ASSERT_EQUAL_STRING("m", data2);
TEST_ASSERT_EQUAL_INT(4, pktbuf_copy(data3, "nop", 4));
Expand All @@ -433,9 +416,11 @@ static void test_pktbuf_release_success4(void)
data3 = (char *)pktbuf_insert("ghijkl", 7);
TEST_ASSERT_NOT_NULL(data3);

TEST_ASSERT_EQUAL_INT(3, pktbuf_packets_allocated());

pktbuf_release(data3);

TEST_ASSERT_EQUAL_INT(-EINVAL, pktbuf_copy(data3, "m", 2));
TEST_ASSERT_EQUAL_INT(2, pktbuf_packets_allocated());
TEST_ASSERT_EQUAL_INT(2, pktbuf_copy(data1, "m", 2));
TEST_ASSERT_EQUAL_STRING("m", data1);
TEST_ASSERT_EQUAL_INT(1, pktbuf_copy(data2, "", 1));
Expand All @@ -461,10 +446,9 @@ Test *tests_pktbuf_tests(void)
new_TestFixture(test_pktbuf_insert_data_NULL),
new_TestFixture(test_pktbuf_insert_memfull),
new_TestFixture(test_pktbuf_insert_success),
new_TestFixture(test_pktbuf_copy_no_alloc_before),
new_TestFixture(test_pktbuf_copy_invalid_ptr),
new_TestFixture(test_pktbuf_copy_freed_ptr),
#ifdef DEVELHELP
new_TestFixture(test_pktbuf_copy_efault),
#endif
new_TestFixture(test_pktbuf_copy_data_len_too_long),
new_TestFixture(test_pktbuf_copy_data_len_too_long2),
new_TestFixture(test_pktbuf_copy_data_len_0),
Expand Down

0 comments on commit bad9cde

Please # to comment.