diff options
author | dimitri staessens <dimitri.staessens@intec.ugent.be> | 2016-06-29 15:54:23 +0200 |
---|---|---|
committer | dimitri staessens <dimitri.staessens@intec.ugent.be> | 2016-06-29 16:04:19 +0200 |
commit | d85f211d53a0cb35a756d0c44a2b28807eff4e5d (patch) | |
tree | 49db3603147bab26ba4d7a17efcf2839e381f71d | |
parent | 205690cb7ceb14de5f4478df721a6c1060536924 (diff) | |
download | ouroboros-d85f211d53a0cb35a756d0c44a2b28807eff4e5d.tar.gz ouroboros-d85f211d53a0cb35a756d0c44a2b28807eff4e5d.zip |
lib, ipcpd: removed du_buff and pci
Fixes #3
-rw-r--r-- | include/ouroboros/du_buff.h | 50 | ||||
-rw-r--r-- | src/ipcpd/normal/CMakeLists.txt | 1 | ||||
-rw-r--r-- | src/ipcpd/normal/pci.c | 146 | ||||
-rw-r--r-- | src/ipcpd/normal/pci.h | 42 | ||||
-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 |
8 files changed, 0 insertions, 691 deletions
diff --git a/include/ouroboros/du_buff.h b/include/ouroboros/du_buff.h deleted file mode 100644 index 5c97731e..00000000 --- a/include/ouroboros/du_buff.h +++ /dev/null @@ -1,50 +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. - */ - -#ifndef OUROBOROS_DU_BUFF_H -#define OUROBOROS_DU_BUFF_H - -#include "common.h" - -#ifndef DU_BUFF_BLOCK_SIZE -#define DU_BUFF_BLOCK_SIZE sysconf(_SC_PAGESIZE) -#endif - -struct du_buff; - -typedef struct du_buff du_buff_t; - -du_buff_t * du_buff_create(size_t size); -void du_buff_destroy(du_buff_t * dub); - -int du_buff_init(du_buff_t * dub, - size_t start, - uint8_t * data, - size_t len); - -uint8_t * du_buff_head_alloc(du_buff_t * dub, size_t size); -uint8_t * du_buff_tail_alloc(du_buff_t * dub, size_t size); -int du_buff_head_release(du_buff_t * dub, size_t size); -int du_buff_tail_release(du_buff_t * dub, size_t size); - -#endif /* OUROBOROS_DU_BUFF_H */ diff --git a/src/ipcpd/normal/CMakeLists.txt b/src/ipcpd/normal/CMakeLists.txt index 74bd19ec..5aefeabb 100644 --- a/src/ipcpd/normal/CMakeLists.txt +++ b/src/ipcpd/normal/CMakeLists.txt @@ -17,7 +17,6 @@ SET(IPCP_NORMAL_TARGET ipcpd-normal CACHE STRING "IPCP_NORMAL_TARGET") set(SOURCE_FILES # Add source files here main.c - pci.c ) add_executable (ipcpd-normal ${SOURCE_FILES} ${IPCP_SOURCES}) diff --git a/src/ipcpd/normal/pci.c b/src/ipcpd/normal/pci.c deleted file mode 100644 index d7df52b6..00000000 --- a/src/ipcpd/normal/pci.c +++ /dev/null @@ -1,146 +0,0 @@ -/* - * Ouroboros - Copyright (C) 2016 - * - * Protocol Control Information - * - * 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 "pci.h" -#include <stdlib.h> -#include <errno.h> - -#define OUROBOROS_PREFIX "ipcp/pci" - -#include <ouroboros/logs.h> - -#define PCI_HEAD_SIZE(a, b) a.addr_size * 2 + \ - a.cep_id_size * 2 + \ - a.pdu_length_size + \ - b.ttl_size + \ - a.seqno_size + \ - a.qos_id_size -#define PCI_TAIL_SIZE(b) b.chk_size - - -struct pci { - /* head */ - uint8_t * dst_addr; - uint8_t * src_addr; - uint8_t * dst_cep_id; - uint8_t * src_cep_id; - uint8_t * pdu_length; - uint8_t * ttl; - uint8_t * seqno; - uint8_t * qos_id; - - uint8_t * chk; - - du_buff_t * dub; - - struct ipcp_dtp_const dtpc; - struct ipcp_dup_const dupc; - -}; - -pci_t * pci_create(du_buff_t * dub, - const struct ipcp_dtp_const * dtpc, - const struct ipcp_dup_const * dupc) -{ - struct pci * p; - - if (dub == NULL) { - LOG_DBGF("Bogus input. Bugging out."); - return NULL; - } - - p = malloc(sizeof *p); - - if (p == NULL) - return NULL; - - p->dub = dub; - - p->dtpc = *dtpc; - p->dupc = *dupc; - - p->dst_addr = NULL; - p->src_addr = NULL; - p->dst_cep_id = NULL; - p->src_cep_id = NULL; - p->pdu_length = NULL; - p->ttl = NULL; - p->seqno = NULL; - p->qos_id = NULL; - p->chk = NULL; - - return p; -} - -void pci_destroy(pci_t * pci) -{ - free(pci); -} - -int pci_init(pci_t * pci) -{ - if (pci == NULL) { - LOG_DBGF("Bogus input. Bugging out."); - return -EINVAL; - } - - uint8_t * pci_head = du_buff_head_alloc(pci->dub, PCI_HEAD_SIZE( - pci->dtpc,pci->dupc)); - uint8_t * pci_tail = du_buff_tail_alloc(pci->dub, PCI_TAIL_SIZE( - pci->dupc)); - - if (pci_head == NULL) { - LOG_DBG("Failed to allocate space for PCI at head."); - return -ENOBUFS; - } - - if (pci_tail == NULL) { - LOG_DBG("Failed to allocate space for PCI at tail."); - return -ENOBUFS; - } - - pci->dst_addr = pci_head; - pci->src_addr = (pci_head += pci->dtpc.addr_size); - pci->dst_cep_id = (pci_head += pci->dtpc.addr_size); - pci->src_cep_id = (pci_head += pci->dtpc.cep_id_size); - pci->pdu_length = (pci_head += pci->dtpc.cep_id_size); - pci->ttl = (pci_head += pci->dtpc.pdu_length_size); - pci->seqno = (pci_head += pci->dupc.ttl_size); - pci->qos_id = (pci_head += pci->dtpc.seqno_size); - - pci->chk = (pci_tail); - - return 0; -} - -void pci_release(pci_t * pci) -{ - if (pci == NULL) - return; - - if (pci->dub == NULL) - return; - - du_buff_head_release(pci->dub, PCI_HEAD_SIZE(pci->dtpc, pci->dupc)); - du_buff_tail_release(pci->dub, PCI_TAIL_SIZE(pci->dupc)); -} diff --git a/src/ipcpd/normal/pci.h b/src/ipcpd/normal/pci.h deleted file mode 100644 index 3c011723..00000000 --- a/src/ipcpd/normal/pci.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Ouroboros - Copyright (C) 2016 - * - * Protocol Control Information - * - * 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. - */ - -#ifndef OUROBOROS_IPCP_PCI_H -#define OUROBOROS_IPCP_PCI_H - -#include "ouroboros/du_buff.h" -#include "dt_const.h" - -struct pci; - -typedef struct pci pci_t; - -pci_t * pci_create(du_buff_t * dub, - const struct ipcp_dtp_const * dtpc, - const struct ipcp_dup_const * dupc); -void pci_destroy(pci_t * pci); - -int pci_init(pci_t * pci); -void pci_release(pci_t * pci); - -#endif /* OUROBOROS_IPCP_PCI_H */ 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 */ -} |