diff options
Diffstat (limited to 'src/lib')
| -rw-r--r-- | src/lib/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | src/lib/du_buff.c | 380 | ||||
| -rw-r--r-- | src/lib/tests/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | src/lib/tests/du_buff_test.c | 70 | 
4 files changed, 0 insertions, 452 deletions
| diff --git a/src/lib/CMakeLists.txt b/src/lib/CMakeLists.txt index 410be6fe..ae46f5bc 100644 --- a/src/lib/CMakeLists.txt +++ b/src/lib/CMakeLists.txt @@ -26,7 +26,6 @@ set(SOURCE_FILES    bitmap.c    cdap.c    dev.c -  du_buff.c    ipcp.c    irm.c    list.c diff --git a/src/lib/du_buff.c b/src/lib/du_buff.c deleted file mode 100644 index 5f9d6f28..00000000 --- a/src/lib/du_buff.c +++ /dev/null @@ -1,380 +0,0 @@ -/* - * Ouroboros - Copyright (C) 2016 - * - * Data Unit Buffer - * - *    Dimitri Staessens <dimitri.staessens@intec.ugent.be> - *    Sander Vrijders   <sander.vrijders@intec.ugent.be> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include <stdlib.h> -#include <string.h> -#include <errno.h> - -#include <ouroboros/du_buff.h> -#include <ouroboros/list.h> - -#define OUROBOROS_PREFIX "du_buff" - -#include "ouroboros/logs.h" - -#define DU_BLOCK_DATA_SIZE (DU_BUFF_BLOCK_SIZE - sizeof (struct buffer)) - -struct buffer { -        uint8_t        * data; -        size_t           size; -        struct list_head list; -}; - -struct du_buff { -        struct buffer  * buffer; -        size_t           size; -        size_t           du_head; -        size_t           du_tail; -}; - -static void buffer_destroy(struct buffer * buf) -{ -        if (buf == NULL) { -                LOG_DBGF("Bogus input, bugging out."); -                return; -        } - -        free (buf->data); -        free (buf); -} - -static void buffer_destroy_list(struct buffer * head) -{ -        struct list_head * ptr; -        struct list_head * n; - -        if (head == NULL) { -                LOG_DBGF("Bogus input, bugging out."); -                return; -        } - -        list_for_each_safe(ptr, n, &(head->list)) { -                struct buffer * tmp = list_entry(ptr, struct buffer, list); -                list_del(ptr); -                buffer_destroy(tmp); -        } -        free(head); -} - -static struct buffer * buffer_create (size_t size, size_t headspace, size_t len) -{ -        struct buffer * head = NULL; -        size_t          remaining = size; -        size_t          ts = size - (headspace + len); - -        if (headspace > DU_BLOCK_DATA_SIZE || ts > DU_BLOCK_DATA_SIZE) { -                LOG_ERR("Illegal du_buff: Cannot fit PCI in DU_BUFF_BLOCK."); -                return NULL; -        } - -        head = malloc(sizeof *head); -        if (head == NULL) -                return NULL; - -        head->size = 0; -        head->data = NULL; - -        INIT_LIST_HEAD(&(head->list)); - -        while (remaining > 0) { -                struct buffer * buf; - -                size_t sz; - -                if (size > DU_BLOCK_DATA_SIZE -                           && remaining - ts <=  DU_BLOCK_DATA_SIZE -                           && remaining != ts) { -                        sz = remaining - ts; -                } else if (size > DU_BLOCK_DATA_SIZE && remaining == ts) { -                        sz = ts; -                } else { -                        sz = remaining < DU_BLOCK_DATA_SIZE ? -                                remaining : DU_BLOCK_DATA_SIZE; -                } - -                buf = malloc(sizeof *buf); -                if (buf == NULL) { -                        LOG_WARN("Could not allocate struct."); -                        free(head); -                        return NULL; -                } - -                if (sz > 0) { -                        buf->data = malloc(sz); -                        if (buf->data == NULL) { -                                LOG_WARN("Could not allocate memory block."); -                                buffer_destroy_list(head); -                                free(head); -                                free(buf); -                                return NULL; -                        } -                } else { -                        buf->data = NULL; -                } - -                buf->size = sz; - -                list_add_tail(&(buf->list), &(head->list)); - -                remaining -= buf->size; -        } - -        return head; -} - -static struct buffer * buffer_seek(const struct buffer * head, size_t pos) -{ -        struct list_head * ptr = NULL; -        size_t cur_buf_start   = 0; -        size_t cur_buf_end     = 0; - -        if (head == NULL) { -                LOG_DBGF("Bogus input, bugging out."); -                return NULL; -        } - -        list_for_each(ptr, &(head->list)) { -                struct buffer * tmp = list_entry(ptr, struct buffer, list); - -                cur_buf_end = cur_buf_start + tmp->size; -                if (cur_buf_end > pos) -                        return tmp; - -                cur_buf_start = cur_buf_end; -        } - -        return NULL; -} - -static uint8_t * buffer_seek_pos(const struct buffer * head, size_t pos) -{ -        struct list_head * ptr = NULL; -        size_t cur_buf_start   = 0; -        size_t cur_buf_end     = 0; - -        if (head == NULL) { -                LOG_DBGF("Bogus input, bugging out."); -                return NULL; -        } - -        list_for_each(ptr, &(head->list)) { -                struct buffer * tmp = list_entry(ptr, struct buffer, list); - -                cur_buf_end = cur_buf_start + tmp->size; - -                if (cur_buf_end > pos) -                        return tmp->data + (pos - cur_buf_start); - -                cur_buf_start = cur_buf_end; -        } - -        return NULL; -} - -static int buffer_copy_data(struct buffer * head, -                     size_t          pos, -                     const void    * src, -                     size_t          len) -{ -        struct list_head * ptr       = NULL; -        struct buffer    * buf_start = NULL; -        struct buffer    * buf_end   = NULL; -        uint8_t          * ptr_start = NULL; -        size_t             space_in_buf; -        size_t             bytes_remaining; -        uint8_t          * copy_pos  = NULL; - -        if (head == NULL || src == NULL) { -                LOG_DBGF("Bogus input, bugging out."); -                return -EINVAL; -        } - -        if (len == 0) { -                LOG_DBGF("Nothing to copy."); -                return 0; -        } - -        buf_start = buffer_seek(head, pos); -        buf_end   = buffer_seek(head, pos + len - 1); - -        if (buf_start == NULL || buf_end == NULL) { -                LOG_DBGF("Index out of bounds %lu, %lu", pos, pos + len); -                return -EINVAL; -        } - -        ptr_start = buffer_seek_pos(head, pos); - -        if (buf_start == buf_end) { -                memcpy(ptr_start, src, len); -                return 0; -        } - -        copy_pos = (uint8_t *)src; -        bytes_remaining = len; -        list_for_each(ptr, &(head->list)) { -                struct buffer * tmp = list_entry(ptr, struct buffer, list); -                if (tmp != buf_start) -                        continue; - -                space_in_buf = (tmp->data + tmp->size) - ptr_start; -                if (space_in_buf >= bytes_remaining) { -                        memcpy(ptr_start, copy_pos, bytes_remaining); -                        return 0; -                } -                else -                        memcpy(ptr_start, copy_pos, space_in_buf); -                bytes_remaining -= space_in_buf; -                copy_pos += space_in_buf; -        } - -        return 0; -} - -du_buff_t * du_buff_create(size_t size) -{ -        du_buff_t * dub = malloc(sizeof *dub); - -        if (dub == NULL) { -                LOG_DBGF("Bogus input, bugging out."); -                return NULL; -        } - -        dub->buffer  = NULL; -        dub->size    = size; -        dub->du_head = 0; -        dub->du_tail = 0; - -        return dub; -} - -void du_buff_destroy(du_buff_t * dub) -{ -        if (dub == NULL) { -                LOG_DBGF("Bogus input, bugging out."); -                return; -        } -        buffer_destroy_list(dub->buffer); -        free (dub); -} - -int du_buff_init(du_buff_t * dub, -                 size_t      start, -                 uint8_t   * data, -                 size_t      len) -{ -        if (dub == NULL || data == NULL) { -                LOG_DBGF("Bogus input, bugging out."); -                return -EINVAL; -        } - -        if (start >= dub->size) { -                LOG_DBGF("Index out of bounds %lu.", start); -                return -EINVAL; -        } - -        if (start + len > dub->size) { -                LOG_DBGF("Buffer too small for data."); -                return -EINVAL; -        } - -        dub->buffer = buffer_create(dub->size, start, len); -        if (dub->buffer == NULL) -                return -ENOMEM; - -        dub->du_head = start; -        dub->du_tail = start + len; - -        return buffer_copy_data(dub->buffer, start, data, len); -} - -uint8_t * du_buff_head_alloc(du_buff_t * dub, size_t size) -{ -        if (dub == NULL) { -                LOG_DBGF("Bogus input, bugging out."); -                return NULL; -        } - -        if ((long) (dub->du_head - size) < 0) { -                LOG_WARN("Failed to allocate PCI headspace."); -                return NULL; -        } - -        dub->du_head -= size; - -        return (buffer_seek_pos(dub->buffer, dub->du_head)); -} - -uint8_t * du_buff_tail_alloc(du_buff_t * dub, size_t size) -{ -        if (dub == NULL) { -                LOG_DBGF("Bogus input, bugging out."); -                return NULL; -        } - -        if (dub->du_tail + size >= dub->size) { -                LOG_WARN("Failed to allocate PCI tailspace."); -                return NULL; -        } - -        dub->du_tail += size; - -        return (buffer_seek_pos(dub->buffer, dub->du_tail)); -} - -int du_buff_head_release(du_buff_t * dub, size_t size) -{ -        if (dub == NULL) { -                LOG_DBGF("Bogus input, bugging out."); -                return -EINVAL; -        } - -        if (size > dub->du_tail - dub->du_head) { -                LOG_WARN("Tried to release beyond sdu boundary."); -                return -EOVERFLOW; -        } - -        dub->du_head += size; - -        /* FIXME: copy some random crap to the buffer for security */ - -        return 0; -} - -int du_buff_tail_release(du_buff_t * dub, size_t size) -{ -        if (dub == NULL) { -                LOG_DBGF("Bogus input, bugging out."); -                return -EINVAL; -        } - -        if (size > dub->du_tail - dub->du_head) { -                LOG_WARN("Tried to release beyond sdu boundary."); -                return -EOVERFLOW; -        } - -        dub->du_tail -= size; - -        /* FIXME: copy some random crap to the buffer for security */ - -        return 0; -} diff --git a/src/lib/tests/CMakeLists.txt b/src/lib/tests/CMakeLists.txt index e905c389..2135cb95 100644 --- a/src/lib/tests/CMakeLists.txt +++ b/src/lib/tests/CMakeLists.txt @@ -4,7 +4,6 @@ get_filename_component(PARENT_DIR ${PARENT_PATH} NAME)  create_test_sourcelist(${PARENT_DIR}_tests test_suite.c                         # Add new tests here                         bitmap_test.c -                       du_buff_test.c  )  add_executable(${PARENT_DIR}_test EXCLUDE_FROM_ALL ${${PARENT_DIR}_tests}) diff --git a/src/lib/tests/du_buff_test.c b/src/lib/tests/du_buff_test.c deleted file mode 100644 index bda1ca43..00000000 --- a/src/lib/tests/du_buff_test.c +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Ouroboros - Copyright (C) 2016 - * - * Test of the du_buff - * - *    Dimitri Staessens <dimitri.staessens@intec.ugent.be> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include <ouroboros/du_buff.h> -#include "du_buff.c" - -#define TEST_BUFF_SIZE 16 * DU_BLOCK_DATA_SIZE -#define MAX(a,b) (a > b ? a : b) -#define MIN(a,b) (a < b ? a : b) - -int du_buff_test(int argc, char ** argv) -{ -        int i, j, k; -        int i_inc, j_inc, k_inc; - -        uint8_t bits[TEST_BUFF_SIZE]; - -        for (i = 0; i < TEST_BUFF_SIZE; i++) -                bits[i] = 170; - -        i_inc = MAX(1, DU_BLOCK_DATA_SIZE / 4); -        j_inc = MAX(1, DU_BLOCK_DATA_SIZE / 8); -        k_inc = MAX(1, DU_BLOCK_DATA_SIZE / 16); - -        for (i = DU_BUFF_BLOCK_SIZE / 4; i <= TEST_BUFF_SIZE; i += i_inc) { -                for (j = 0; j < i; j += j_inc) { -                        for (k = 0; k < i - j; k += k_inc) { -                                du_buff_t * dub = du_buff_create(i); -                                if (dub == NULL) -                                        return -1; - -                                if (k > DU_BLOCK_DATA_SIZE) { -                                        du_buff_destroy (dub); -                                        continue; -                                } - -                                if (i - (j + k) > DU_BLOCK_DATA_SIZE)  { -                                        du_buff_destroy (dub); -                                        continue; -                                } - -                                if (du_buff_init(dub, k, bits, j) < 0) { -                                        du_buff_destroy (dub); -                                        return -1; -                                } -                                du_buff_destroy (dub); -                        } -                } -        } -        return 0; /* tests succeeded */ -} | 
