From 24ae159ad312144c552455fbae445ed62a9fec2f Mon Sep 17 00:00:00 2001 From: Sander Vrijders Date: Wed, 17 Feb 2016 17:19:08 +0100 Subject: include: Add bitmap implementation This adds a bitmap implementation loosely based on the one found in the Linux kernel. The functions in the header file actually act as a wrapper around the actual bitmap implementation for portability reasons. --- src/lib/bitmap.c | 194 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 194 insertions(+) create mode 100644 src/lib/bitmap.c (limited to 'src') diff --git a/src/lib/bitmap.c b/src/lib/bitmap.c new file mode 100644 index 00000000..3e1ba049 --- /dev/null +++ b/src/lib/bitmap.c @@ -0,0 +1,194 @@ +/* + * Ouroboros - Copyright (C) 2016 + * + * Bitmap implementation - taken partly from Linux kernel + * + * Sander Vrijders + * Francesco Salvestrini + * + * 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 +#include +#include +#include +#include + +#define BITS_PER_BYTE 8 + +#define BITS_PER_LONG (sizeof(long) * BITS_PER_BYTE) + +#define BIT_WORD(nr) ((nr) / BITS_PER_LONG) + +#define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d)) + +#define BITS_TO_LONGS(nr) \ + DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(long)) + +#define BITS_IN_BITMAP ((2 << BITS_PER_BYTE) * sizeof(size_t)) + +static unsigned long find_next_zero_bit(const unsigned long * addr, + unsigned long nbits) +{ + unsigned long tmp; + unsigned long start = 0; + unsigned long pos = 0; + unsigned long mask; + + /* First find correct word */ + tmp = ~addr[start]; + while (!tmp) { + start++; + if (start >= (nbits / BITS_PER_LONG)) + return nbits; + + tmp = ~addr[start]; + } + + /* Find the free bit in the word */ + mask = 1UL; + while (!(tmp ^ mask)) { + pos++; + mask = 1UL << pos; + } + + return (start * BITS_PER_LONG) + pos; +} + +static void bitmap_zero(unsigned long * dst, + unsigned int nbits) +{ + unsigned int len = BITS_TO_LONGS(nbits) * sizeof(unsigned long); + memset(dst, 0, len); +} + +static void bitmap_clear(unsigned long * map, + unsigned int start) +{ + unsigned long * p = map + BIT_WORD(start); + unsigned long mask = ~(1UL << (start % (BITS_PER_LONG - 1))); + + *p &= mask; +} + + +static void bitmap_set(unsigned long * map, + unsigned int start) +{ + unsigned long * p = map + BIT_WORD(start); + unsigned long mask = 1UL << (start % (BITS_PER_LONG - 1)); + + *p |= mask; +} + +struct rbmp { + ssize_t offset; + size_t size; + + unsigned long bitmap[BITS_TO_LONGS(BITS_IN_BITMAP)]; +}; + +struct rbmp * rbmp_create(size_t bits, ssize_t offset) +{ + struct rbmp * tmp; + + if (bits == 0) + return NULL; + + tmp = malloc(sizeof(*tmp)); + if (!tmp) + return NULL; + + tmp->size = bits; + tmp->offset = offset; + bitmap_zero(tmp->bitmap, BITS_IN_BITMAP); + + return tmp; +} + + +int rbmp_destroy(struct rbmp * b) +{ + if (!b) + return -1; + + free(b); + + return 0; +} + +static ssize_t bad_id(struct rbmp * b) +{ + assert(b); + + return b->offset - 1; +} + +ssize_t rbmp_allocate(struct rbmp * b) +{ + ssize_t id; + + if (!b) + return bad_id(b); + + id = (ssize_t) find_next_zero_bit(b->bitmap, + BITS_IN_BITMAP); + + if (id == BITS_IN_BITMAP) + return bad_id(b); + + bitmap_set(b->bitmap, id); + + return id + b->offset; +} + +static bool is_id_ok(struct rbmp * b, + ssize_t id) +{ + assert(b); + + if ((id < b->offset) || (id > (b->offset + b->size))) + return false; + + return true; +} + +bool rbmp_is_id_ok(struct rbmp * b, + ssize_t id) +{ + if (!b) + return false; + + return is_id_ok(b, id); +} + +int rbmp_release(struct rbmp * b, + ssize_t id) +{ + ssize_t rid; + + if (!b) + return -1; + + if (!is_id_ok(b, id)) + return -1; + + rid = id - b->offset; + + bitmap_clear(b->bitmap, id); + + return 0; +} -- cgit v1.2.3 From 4251bbb496e64aeeceb70ab1a6716201051769e1 Mon Sep 17 00:00:00 2001 From: Sander Vrijders Date: Wed, 17 Feb 2016 17:23:06 +0100 Subject: lib: Update CMakeLists.txt Forgot to include the updated CMakeLists.txt file with the bitmap implementation. --- src/lib/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) (limited to 'src') diff --git a/src/lib/CMakeLists.txt b/src/lib/CMakeLists.txt index 5099fa48..5c0e6bbe 100644 --- a/src/lib/CMakeLists.txt +++ b/src/lib/CMakeLists.txt @@ -6,6 +6,7 @@ include_directories(${CMAKE_BINARY_DIR}/include) set(SOURCE_FILES # Add source files here + bitmap.c cdap.c ) -- cgit v1.2.3 From 9fb8dff10efc9869264e55da64b64c4aadf805a6 Mon Sep 17 00:00:00 2001 From: Sander Vrijders Date: Mon, 22 Feb 2016 17:34:21 +0100 Subject: src: Rename daemons and add tools folder This renames the daemons to end with a 'd', as is common for UNIX daemons. It also adds a tools folder, that will hold the tools of the Ouroboros prototype. Examples are a simple echo application, an application to instruct the IRM ... --- CMakeLists.txt | 6 ++++-- src/CMakeLists.txt | 7 ++++--- src/da/CMakeLists.txt | 16 ---------------- src/da/main.c | 10 ---------- src/dad/CMakeLists.txt | 16 ++++++++++++++++ src/dad/main.c | 10 ++++++++++ src/ipcp/CMakeLists.txt | 16 ---------------- src/ipcp/main.c | 10 ---------- src/ipcpd/CMakeLists.txt | 16 ++++++++++++++++ src/ipcpd/main.c | 10 ++++++++++ src/irm/CMakeLists.txt | 16 ---------------- src/irm/main.c | 10 ---------- src/irmd/CMakeLists.txt | 16 ++++++++++++++++ src/irmd/main.c | 10 ++++++++++ src/tools/CMakeLists.txt | 1 + src/tools/irm/CMakeLists.txt | 16 ++++++++++++++++ src/tools/irm/main.c | 32 ++++++++++++++++++++++++++++++++ 17 files changed, 135 insertions(+), 83 deletions(-) delete mode 100644 src/da/CMakeLists.txt delete mode 100644 src/da/main.c create mode 100644 src/dad/CMakeLists.txt create mode 100644 src/dad/main.c delete mode 100644 src/ipcp/CMakeLists.txt delete mode 100644 src/ipcp/main.c create mode 100644 src/ipcpd/CMakeLists.txt create mode 100644 src/ipcpd/main.c delete mode 100644 src/irm/CMakeLists.txt delete mode 100644 src/irm/main.c create mode 100644 src/irmd/CMakeLists.txt create mode 100644 src/irmd/main.c create mode 100644 src/tools/CMakeLists.txt create mode 100644 src/tools/irm/CMakeLists.txt create mode 100644 src/tools/irm/main.c (limited to 'src') diff --git a/CMakeLists.txt b/CMakeLists.txt index 6685dc2f..1ca05c95 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -46,11 +46,13 @@ add_subdirectory(include) add_subdirectory(src) add_subdirectory(tests) +# We may have to move this to the subdirs include(MacroAddCompileFlags) if (CMAKE_BUILD_TYPE MATCHES Debug) - MACRO_ADD_COMPILE_FLAGS(ipcp -DCONFIG_OUROBOROS_DEBUG) + MACRO_ADD_COMPILE_FLAGS(ipcpd -DCONFIG_OUROBOROS_DEBUG) + MACRO_ADD_COMPILE_FLAGS(irmd -DCONFIG_OUROBOROS_DEBUG) + MACRO_ADD_COMPILE_FLAGS(dad -DCONFIG_OUROBOROS_DEBUG) MACRO_ADD_COMPILE_FLAGS(irm -DCONFIG_OUROBOROS_DEBUG) - MACRO_ADD_COMPILE_FLAGS(da -DCONFIG_OUROBOROS_DEBUG) endif (CMAKE_BUILD_TYPE MATCHES Debug) include(FeatureSummary) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index ca434d8a..b0732f08 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,4 +1,5 @@ -add_subdirectory(ipcp) -add_subdirectory(irm) -add_subdirectory(da) +add_subdirectory(ipcpd) +add_subdirectory(irmd) +add_subdirectory(dad) add_subdirectory(lib) +add_subdirectory(tools) diff --git a/src/da/CMakeLists.txt b/src/da/CMakeLists.txt deleted file mode 100644 index 050b0f80..00000000 --- a/src/da/CMakeLists.txt +++ /dev/null @@ -1,16 +0,0 @@ -include_directories(${CMAKE_CURRENT_SOURCE_DIR}) -include_directories(${CMAKE_CURRENT_BINARY_DIR}) - -include_directories(${CMAKE_SOURCE_DIR}/include) -include_directories(${CMAKE_BINARY_DIR}/include) - -set(SOURCE_FILES - # Add source files here - main.c -) - -add_executable (da ${SOURCE_FILES}) - -target_link_libraries (da LINK_PUBLIC ouroboros) - -install(TARGETS da RUNTIME DESTINATION ${CMAKE_INSTALL_FULL_BINDIR}) diff --git a/src/da/main.c b/src/da/main.c deleted file mode 100644 index e2971dca..00000000 --- a/src/da/main.c +++ /dev/null @@ -1,10 +0,0 @@ -#define OUROBOROS_PREFIX "da" - -#include - -int main() -{ - LOG_DBG("Test of the DA"); - - return 0; -} diff --git a/src/dad/CMakeLists.txt b/src/dad/CMakeLists.txt new file mode 100644 index 00000000..3d4b8ea7 --- /dev/null +++ b/src/dad/CMakeLists.txt @@ -0,0 +1,16 @@ +include_directories(${CMAKE_CURRENT_SOURCE_DIR}) +include_directories(${CMAKE_CURRENT_BINARY_DIR}) + +include_directories(${CMAKE_SOURCE_DIR}/include) +include_directories(${CMAKE_BINARY_DIR}/include) + +set(SOURCE_FILES + # Add source files here + main.c +) + +add_executable (dad ${SOURCE_FILES}) + +target_link_libraries (dad LINK_PUBLIC ouroboros) + +install(TARGETS dad RUNTIME DESTINATION ${CMAKE_INSTALL_FULL_BINDIR}) diff --git a/src/dad/main.c b/src/dad/main.c new file mode 100644 index 00000000..e2971dca --- /dev/null +++ b/src/dad/main.c @@ -0,0 +1,10 @@ +#define OUROBOROS_PREFIX "da" + +#include + +int main() +{ + LOG_DBG("Test of the DA"); + + return 0; +} diff --git a/src/ipcp/CMakeLists.txt b/src/ipcp/CMakeLists.txt deleted file mode 100644 index 845f5b7b..00000000 --- a/src/ipcp/CMakeLists.txt +++ /dev/null @@ -1,16 +0,0 @@ -include_directories(${CMAKE_CURRENT_SOURCE_DIR}) -include_directories(${CMAKE_CURRENT_BINARY_DIR}) - -include_directories(${CMAKE_SOURCE_DIR}/include) -include_directories(${CMAKE_BINARY_DIR}/include) - -set(SOURCE_FILES - # Add source files here - main.c -) - -add_executable (ipcp ${SOURCE_FILES}) - -target_link_libraries (ipcp LINK_PUBLIC ouroboros) - -install(TARGETS ipcp RUNTIME DESTINATION ${CMAKE_INSTALL_FULL_BINDIR}) diff --git a/src/ipcp/main.c b/src/ipcp/main.c deleted file mode 100644 index b67b0af9..00000000 --- a/src/ipcp/main.c +++ /dev/null @@ -1,10 +0,0 @@ -#define OUROBOROS_PREFIX "ipcp" - -#include - -int main() -{ - LOG_DBG("Test of the IPCP"); - - return 0; -} diff --git a/src/ipcpd/CMakeLists.txt b/src/ipcpd/CMakeLists.txt new file mode 100644 index 00000000..b16413cc --- /dev/null +++ b/src/ipcpd/CMakeLists.txt @@ -0,0 +1,16 @@ +include_directories(${CMAKE_CURRENT_SOURCE_DIR}) +include_directories(${CMAKE_CURRENT_BINARY_DIR}) + +include_directories(${CMAKE_SOURCE_DIR}/include) +include_directories(${CMAKE_BINARY_DIR}/include) + +set(SOURCE_FILES + # Add source files here + main.c +) + +add_executable (ipcpd ${SOURCE_FILES}) + +target_link_libraries (ipcpd LINK_PUBLIC ouroboros) + +install(TARGETS ipcpd RUNTIME DESTINATION ${CMAKE_INSTALL_FULL_BINDIR}) diff --git a/src/ipcpd/main.c b/src/ipcpd/main.c new file mode 100644 index 00000000..b67b0af9 --- /dev/null +++ b/src/ipcpd/main.c @@ -0,0 +1,10 @@ +#define OUROBOROS_PREFIX "ipcp" + +#include + +int main() +{ + LOG_DBG("Test of the IPCP"); + + return 0; +} diff --git a/src/irm/CMakeLists.txt b/src/irm/CMakeLists.txt deleted file mode 100644 index 82c73e38..00000000 --- a/src/irm/CMakeLists.txt +++ /dev/null @@ -1,16 +0,0 @@ -include_directories(${CMAKE_CURRENT_SOURCE_DIR}) -include_directories(${CMAKE_CURRENT_BINARY_DIR}) - -include_directories(${CMAKE_SOURCE_DIR}/include) -include_directories(${CMAKE_BINARY_DIR}/include) - -set(SOURCE_FILES - # Add source files here - main.c -) - -add_executable (irm ${SOURCE_FILES}) - -target_link_libraries (irm LINK_PUBLIC ouroboros) - -install(TARGETS irm RUNTIME DESTINATION ${CMAKE_INSTALL_FULL_BINDIR}) diff --git a/src/irm/main.c b/src/irm/main.c deleted file mode 100644 index 8ab071e0..00000000 --- a/src/irm/main.c +++ /dev/null @@ -1,10 +0,0 @@ -#define OUROBOROS_PREFIX "irm" - -#include - -int main() -{ - LOG_DBG("Test of the IRM"); - - return 0; -} diff --git a/src/irmd/CMakeLists.txt b/src/irmd/CMakeLists.txt new file mode 100644 index 00000000..bda793b7 --- /dev/null +++ b/src/irmd/CMakeLists.txt @@ -0,0 +1,16 @@ +include_directories(${CMAKE_CURRENT_SOURCE_DIR}) +include_directories(${CMAKE_CURRENT_BINARY_DIR}) + +include_directories(${CMAKE_SOURCE_DIR}/include) +include_directories(${CMAKE_BINARY_DIR}/include) + +set(SOURCE_FILES + # Add source files here + main.c +) + +add_executable (irmd ${SOURCE_FILES}) + +target_link_libraries (irmd LINK_PUBLIC ouroboros) + +install(TARGETS irmd RUNTIME DESTINATION ${CMAKE_INSTALL_FULL_BINDIR}) diff --git a/src/irmd/main.c b/src/irmd/main.c new file mode 100644 index 00000000..8ab071e0 --- /dev/null +++ b/src/irmd/main.c @@ -0,0 +1,10 @@ +#define OUROBOROS_PREFIX "irm" + +#include + +int main() +{ + LOG_DBG("Test of the IRM"); + + return 0; +} diff --git a/src/tools/CMakeLists.txt b/src/tools/CMakeLists.txt new file mode 100644 index 00000000..6e00c17b --- /dev/null +++ b/src/tools/CMakeLists.txt @@ -0,0 +1 @@ +add_subdirectory(irm) diff --git a/src/tools/irm/CMakeLists.txt b/src/tools/irm/CMakeLists.txt new file mode 100644 index 00000000..82c73e38 --- /dev/null +++ b/src/tools/irm/CMakeLists.txt @@ -0,0 +1,16 @@ +include_directories(${CMAKE_CURRENT_SOURCE_DIR}) +include_directories(${CMAKE_CURRENT_BINARY_DIR}) + +include_directories(${CMAKE_SOURCE_DIR}/include) +include_directories(${CMAKE_BINARY_DIR}/include) + +set(SOURCE_FILES + # Add source files here + main.c +) + +add_executable (irm ${SOURCE_FILES}) + +target_link_libraries (irm LINK_PUBLIC ouroboros) + +install(TARGETS irm RUNTIME DESTINATION ${CMAKE_INSTALL_FULL_BINDIR}) diff --git a/src/tools/irm/main.c b/src/tools/irm/main.c new file mode 100644 index 00000000..bad1000e --- /dev/null +++ b/src/tools/irm/main.c @@ -0,0 +1,32 @@ +/* + * Ouroboros - Copyright (C) 2016 + * + * A tool to instruct the IRM + * + * Sander Vrijders + * + * 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. + */ + +#define OUROBOROS_PREFIX "irm" + +#include + +int main () { + + LOG_DBG("Test of the IRM tool"); + + return 0; +} -- cgit v1.2.3 From 7cd377ad7cb8c636262a27b31341b8c54dd797fb Mon Sep 17 00:00:00 2001 From: Sander Vrijders Date: Mon, 22 Feb 2016 17:36:10 +0100 Subject: include: Fix common includes common.h will now include stdbool and several other useful includes (size_t for instance). --- include/ouroboros/common.h | 2 ++ src/lib/CMakeLists.txt | 1 + src/lib/bitmap.c | 1 - 3 files changed, 3 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/include/ouroboros/common.h b/include/ouroboros/common.h index f2be815f..90431208 100644 --- a/include/ouroboros/common.h +++ b/include/ouroboros/common.h @@ -24,6 +24,8 @@ #define OUROBOROS_COMMON_H #include +#include +#include typedef uint32_t port_id_t; diff --git a/src/lib/CMakeLists.txt b/src/lib/CMakeLists.txt index 5c0e6bbe..11183716 100644 --- a/src/lib/CMakeLists.txt +++ b/src/lib/CMakeLists.txt @@ -8,6 +8,7 @@ set(SOURCE_FILES # Add source files here bitmap.c cdap.c + irm.c ) add_library(ouroboros SHARED ${SOURCE_FILES}) diff --git a/src/lib/bitmap.c b/src/lib/bitmap.c index 3e1ba049..cb414e7f 100644 --- a/src/lib/bitmap.c +++ b/src/lib/bitmap.c @@ -22,7 +22,6 @@ */ #include -#include #include #include #include -- cgit v1.2.3 From f5f5dcc60316d4f0a6ffb4ebff143f7eaa12894f Mon Sep 17 00:00:00 2001 From: Sander Vrijders Date: Mon, 22 Feb 2016 18:02:27 +0100 Subject: lib: Remove irm.c from CMakeLists.txt This removes the source file irm.c from CMakeLists.txt, as it is not yet in the repo. --- src/lib/CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) (limited to 'src') diff --git a/src/lib/CMakeLists.txt b/src/lib/CMakeLists.txt index 11183716..5c0e6bbe 100644 --- a/src/lib/CMakeLists.txt +++ b/src/lib/CMakeLists.txt @@ -8,7 +8,6 @@ set(SOURCE_FILES # Add source files here bitmap.c cdap.c - irm.c ) add_library(ouroboros SHARED ${SOURCE_FILES}) -- cgit v1.2.3 From f128b07498d22d5bc0cea0270e960b2b7c66248c Mon Sep 17 00:00:00 2001 From: Dimitri Staessens Date: Tue, 23 Feb 2016 00:06:35 +0100 Subject: Initial du_buff code Compiles but untested. Expect bugs. --- CMakeLists.txt | 2 +- include/ouroboros/du_buff.h | 65 +++++++++ src/lib/CMakeLists.txt | 1 + src/lib/du_buff.c | 333 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 400 insertions(+), 1 deletion(-) create mode 100644 include/ouroboros/du_buff.h create mode 100644 src/lib/du_buff.c (limited to 'src') diff --git a/CMakeLists.txt b/CMakeLists.txt index 1ca05c95..efbc3706 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.1.0) +cmake_minimum_required(VERSION 3.0.0) set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake") #set(CMAKE_VERBOSE_MAKEFILE ON) diff --git a/include/ouroboros/du_buff.h b/include/ouroboros/du_buff.h new file mode 100644 index 00000000..1d7b260a --- /dev/null +++ b/include/ouroboros/du_buff.h @@ -0,0 +1,65 @@ +/* + * Ouroboros - Copyright (C) 2016 + * + * Data Unit Buffer + * + * Dimitri Staessens + * Sander Vrijders + * + * 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 +#include +#include + +#include "list.h" + +/*FIXME: to be defined inside du_buff_t */ + +struct buffer { + uint8_t * data; + size_t size; + struct list_head list; +} buffer; + +typedef struct { + struct buffer * buffer; + size_t size; + size_t du_start; + size_t du_end; + struct list_head list; +} 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_data_ptr_start(du_buff_t * dub); +uint8_t * du_buff_data_ptr_end(du_buff_t * dub); + +int du_buff_head_alloc(du_buff_t * dub, size_t size); +int 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/lib/CMakeLists.txt b/src/lib/CMakeLists.txt index 5c0e6bbe..9a6f1946 100644 --- a/src/lib/CMakeLists.txt +++ b/src/lib/CMakeLists.txt @@ -8,6 +8,7 @@ set(SOURCE_FILES # Add source files here bitmap.c cdap.c + du_buff.c ) add_library(ouroboros SHARED ${SOURCE_FILES}) diff --git a/src/lib/du_buff.c b/src/lib/du_buff.c new file mode 100644 index 00000000..1944634d --- /dev/null +++ b/src/lib/du_buff.c @@ -0,0 +1,333 @@ +/* + * Ouroboros - Copyright (C) 2016 + * + * Data Unit Buffer + * + * Dimitri Staessens + * Sander Vrijders + * + * 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 +#include +#include +#include "ouroboros/du_buff.h" + +#define OUROBOROS_PREFIX "du_buff" + +#include "ouroboros/logs.h" + +void buffer_destroy (struct buffer * buf) +{ + if (buf == NULL) { + LOG_DBG("buffer_destroy: Bogus input, bugging out."); + return; + } + + list_del(&(buf->list)); + + free (&(buf->data)); + + free (buf); +} + + +void buffer_destroy_list(struct buffer * buf) +{ + struct list_head * ptr; + struct list_head * n; + + if (buf == NULL) { + LOG_DBG("buffer_destroy_list: Bogus input, bugging out."); + return; + } + + list_for_each_safe(ptr, n, &(buf->list)) { + struct buffer * tmp = list_entry(ptr, struct buffer, list); + list_del(ptr); + buffer_destroy(tmp); + } +} + +struct buffer * buffer_create (size_t size) +{ + struct buffer * head = NULL; + size_t remaining = size; + const size_t page_size = sysconf(_SC_PAGESIZE); + + while (remaining > 0) { + struct buffer * buf; + size_t sz = remaining < page_size ? remaining : page_size; + + buf = (struct buffer *)malloc(sizeof(struct buffer)); + if (buf == NULL) { + LOG_WARN("buffer_create: could not allocate struct."); + return NULL; + } + + buf->data=(uint8_t *)malloc(sz); + if (buf->data == NULL) { + LOG_WARN("buffer_create: allocate memblock failed."); + buffer_destroy_list(head); + return NULL; + } + + buf->size = sz; + INIT_LIST_HEAD(&(buf->list)); + + if (head == NULL) + head = buf; + else + list_add_tail(&(buf->list), &(head->list)); + + remaining -= buf->size; + } + + return head; +} + +struct buffer * buffer_seek(const struct buffer * head, size_t pos) +{ + struct list_head * ptr = NULL; + struct buffer * hit = NULL; + size_t cur_buf_start = 0; + size_t cur_buf_end = 0; + + if (head = NULL) { + LOG_DBG("buffer_seek: 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; +} + +uint8_t * buffer_seek_pos(const struct buffer * head, size_t pos) +{ + struct list_head * ptr = NULL; + struct buffer * hit = NULL; + size_t cur_buf_start = 0; + size_t cur_buf_end = 0; + + if (head = NULL) { + LOG_DBG("buffer_seek_pos: 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; +} + +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_DBG("buffer_copy_data: Bogus input, bugging out."); + return -EINVAL; + } + + buf_start = buffer_seek(head, pos); + buf_end = buffer_seek(head, pos + len); + + if (buf_start == NULL || buf_end == NULL) { + LOG_DBG("buffer_copy_data: Index out of bounds %d, %d", + 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, &(buf_start->list)) { + struct buffer * tmp = list_entry(ptr, struct buffer, list); + 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; + } + + return 0; +} + +du_buff_t * du_buff_create(size_t size) +{ + du_buff_t * dub = (du_buff_t *)malloc(sizeof(du_buff_t)); + + if (dub == NULL) { + LOG_DBG("create: Bogus input, bugging out."); + return NULL; + } + + dub->buffer = buffer_create(size); + if (dub->buffer == NULL) { + free (dub); + return NULL; + } + + dub->size = size; + dub->du_start = 0; + dub->du_end = 0; + + INIT_LIST_HEAD(&(dub->list)); + + return dub; +} + +void du_buff_destroy(du_buff_t * dub) +{ + if (dub == NULL) { + LOG_DBG("destroy: Bogus input, bugging out."); + return; + } + buffer_destroy_list(dub->buffer); + + list_del(&(dub->list)); + + 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_DBG("init: Bogus input, bugging out."); + return -EINVAL; + } + + if (start + len > dub->size) { + LOG_DBG("init: Index out of bounds %d", start); + return -EINVAL; + } + + dub->du_start = start; + dub->du_end = start + len; + + return buffer_copy_data(dub->buffer, start, data, len); + +} + +uint8_t * du_buff_data_ptr_start(du_buff_t * dub) +{ + if (dub == NULL) { + LOG_DBG("data_ptr_start: Bogus input, bugging out."); + return NULL; + } + return buffer_seek_pos(dub->buffer, dub->du_start); +} + +uint8_t * du_buff_data_ptr_end(du_buff_t * dub) +{ + if (dub == NULL) { + LOG_DBG("data_ptr_end: Bogus input, bugging out."); + return NULL; + } + return buffer_seek_pos(dub->buffer, dub->du_end); +} + +int du_buff_head_alloc(du_buff_t * dub, size_t size) +{ + if (dub->du_start - size < 0) { + LOG_WARN("head_alloc: failed to allocate PCI headspace"); + return -1; + } + + dub->du_start -= size; + + return 0; +} +int du_buff_tail_alloc(du_buff_t * dub, size_t size) +{ + if (dub->du_end + size >= dub->size) { + LOG_WARN("tail_alloc: failed to allocate PCI tailspace"); + return -1; + } + + dub->du_end += size; + + return 0; + +} + +int du_buff_head_release(du_buff_t * dub, size_t size) +{ + if (size > dub->du_end - dub->du_start) { + LOG_WARN("head_release: tried to release beyond sdu boundary"); + return -1; + } + + dub->du_start += 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 (size > dub->du_end - dub->du_start) { + LOG_WARN("tail_release: tried to release beyond sdu boundary"); + return -1; + } + + dub->du_end -= size; + + /* FIXME: copy some random crap to the buffer for security */ + + return 0; +} -- cgit v1.2.3 From 95c7e9a6a298702ae217b22d3f95313c0b1020af Mon Sep 17 00:00:00 2001 From: Dimitri Staessens Date: Tue, 23 Feb 2016 10:46:44 +0100 Subject: lib: cleanup of du_buff du_buff.h : moved struct buffer to source du_buff.c : fixed formatting LOG_DBGF used --- include/ouroboros/du_buff.h | 15 ++-------- src/lib/du_buff.c | 68 +++++++++++++++++++++++++++++++-------------- 2 files changed, 50 insertions(+), 33 deletions(-) (limited to 'src') diff --git a/include/ouroboros/du_buff.h b/include/ouroboros/du_buff.h index 1d7b260a..522733f8 100644 --- a/include/ouroboros/du_buff.h +++ b/include/ouroboros/du_buff.h @@ -24,19 +24,10 @@ #ifndef OUROBOROS_DU_BUFF_H #define OUROBOROS_DU_BUFF_H -#include -#include -#include - +#include "common.h" #include "list.h" -/*FIXME: to be defined inside du_buff_t */ - -struct buffer { - uint8_t * data; - size_t size; - struct list_head list; -} buffer; +struct buffer; typedef struct { struct buffer * buffer; @@ -51,7 +42,7 @@ void du_buff_destroy(du_buff_t * dub); int du_buff_init(du_buff_t * dub, size_t start, - uint8_t * data, + uint8_t * data, size_t len); uint8_t * du_buff_data_ptr_start(du_buff_t * dub); diff --git a/src/lib/du_buff.c b/src/lib/du_buff.c index 1944634d..53d9c3e4 100644 --- a/src/lib/du_buff.c +++ b/src/lib/du_buff.c @@ -30,10 +30,16 @@ #include "ouroboros/logs.h" -void buffer_destroy (struct buffer * buf) +struct buffer { + uint8_t * data; + size_t size; + struct list_head list; +} buffer; + +void buffer_destroy(struct buffer * buf) { if (buf == NULL) { - LOG_DBG("buffer_destroy: Bogus input, bugging out."); + LOG_DBGF("Bogus input, bugging out."); return; } @@ -51,7 +57,7 @@ void buffer_destroy_list(struct buffer * buf) struct list_head * n; if (buf == NULL) { - LOG_DBG("buffer_destroy_list: Bogus input, bugging out."); + LOG_DBGF("Bogus input, bugging out."); return; } @@ -72,15 +78,15 @@ struct buffer * buffer_create (size_t size) struct buffer * buf; size_t sz = remaining < page_size ? remaining : page_size; - buf = (struct buffer *)malloc(sizeof(struct buffer)); + buf = (struct buffer *) malloc(sizeof(struct buffer)); if (buf == NULL) { - LOG_WARN("buffer_create: could not allocate struct."); + LOG_WARN("Could not allocate struct."); return NULL; } - buf->data=(uint8_t *)malloc(sz); + buf->data = (uint8_t *) malloc(sz); if (buf->data == NULL) { - LOG_WARN("buffer_create: allocate memblock failed."); + LOG_WARN("Could not allocate memory block."); buffer_destroy_list(head); return NULL; } @@ -107,7 +113,7 @@ struct buffer * buffer_seek(const struct buffer * head, size_t pos) size_t cur_buf_end = 0; if (head = NULL) { - LOG_DBG("buffer_seek: Bogus input, bugging out."); + LOG_DBGF("Bogus input, bugging out."); return NULL; } @@ -133,7 +139,7 @@ uint8_t * buffer_seek_pos(const struct buffer * head, size_t pos) size_t cur_buf_end = 0; if (head = NULL) { - LOG_DBG("buffer_seek_pos: Bogus input, bugging out."); + LOG_DBGF("Bogus input, bugging out."); return NULL; } @@ -165,7 +171,7 @@ int buffer_copy_data(struct buffer * head, uint8_t * copy_pos = NULL; if (head == NULL || src == NULL) { - LOG_DBG("buffer_copy_data: Bogus input, bugging out."); + LOG_DBGF("Bogus input, bugging out."); return -EINVAL; } @@ -173,7 +179,7 @@ int buffer_copy_data(struct buffer * head, buf_end = buffer_seek(head, pos + len); if (buf_start == NULL || buf_end == NULL) { - LOG_DBG("buffer_copy_data: Index out of bounds %d, %d", + LOG_DBGF("Index out of bounds %d, %d", pos, pos+len); return -EINVAL; @@ -208,7 +214,7 @@ du_buff_t * du_buff_create(size_t size) du_buff_t * dub = (du_buff_t *)malloc(sizeof(du_buff_t)); if (dub == NULL) { - LOG_DBG("create: Bogus input, bugging out."); + LOG_DBGF("Bogus input, bugging out."); return NULL; } @@ -230,7 +236,7 @@ du_buff_t * du_buff_create(size_t size) void du_buff_destroy(du_buff_t * dub) { if (dub == NULL) { - LOG_DBG("destroy: Bogus input, bugging out."); + LOG_DBGF("Bogus input, bugging out."); return; } buffer_destroy_list(dub->buffer); @@ -246,12 +252,12 @@ int du_buff_init(du_buff_t * dub, size_t len) { if (dub == NULL || data == NULL) { - LOG_DBG("init: Bogus input, bugging out."); + LOG_DBG("Bogus input, bugging out."); return -EINVAL; } if (start + len > dub->size) { - LOG_DBG("init: Index out of bounds %d", start); + LOG_DBGF("Index out of bounds %d", start); return -EINVAL; } @@ -265,7 +271,7 @@ int du_buff_init(du_buff_t * dub, uint8_t * du_buff_data_ptr_start(du_buff_t * dub) { if (dub == NULL) { - LOG_DBG("data_ptr_start: Bogus input, bugging out."); + LOG_DBGF("Bogus input, bugging out."); return NULL; } return buffer_seek_pos(dub->buffer, dub->du_start); @@ -274,7 +280,7 @@ uint8_t * du_buff_data_ptr_start(du_buff_t * dub) uint8_t * du_buff_data_ptr_end(du_buff_t * dub) { if (dub == NULL) { - LOG_DBG("data_ptr_end: Bogus input, bugging out."); + LOG_DBG("Bogus input, bugging out."); return NULL; } return buffer_seek_pos(dub->buffer, dub->du_end); @@ -282,8 +288,13 @@ uint8_t * du_buff_data_ptr_end(du_buff_t * dub) int du_buff_head_alloc(du_buff_t * dub, size_t size) { + if (dub == NULL) { + LOG_DBGF("Bogus input, bugging out."); + return -EINVAL; + } + if (dub->du_start - size < 0) { - LOG_WARN("head_alloc: failed to allocate PCI headspace"); + LOG_WARN("Failed to allocate PCI headspace"); return -1; } @@ -293,8 +304,13 @@ int du_buff_head_alloc(du_buff_t * dub, size_t size) } int du_buff_tail_alloc(du_buff_t * dub, size_t size) { + if (dub == NULL) { + LOG_DBGF("Bogus input, bugging out."); + return -EINVAL; + } + if (dub->du_end + size >= dub->size) { - LOG_WARN("tail_alloc: failed to allocate PCI tailspace"); + LOG_WARN("Failed to allocate PCI tailspace"); return -1; } @@ -306,8 +322,13 @@ int du_buff_tail_alloc(du_buff_t * dub, size_t size) 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_end - dub->du_start) { - LOG_WARN("head_release: tried to release beyond sdu boundary"); + LOG_WARN("Tried to release beyond sdu boundary"); return -1; } @@ -320,8 +341,13 @@ int du_buff_head_release(du_buff_t * dub, size_t size) 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_end - dub->du_start) { - LOG_WARN("tail_release: tried to release beyond sdu boundary"); + LOG_WARN("Tried to release beyond sdu boundary"); return -1; } -- cgit v1.2.3 From c36daed13ba47edf59aa47e27aeffa35b3030f0e Mon Sep 17 00:00:00 2001 From: Dimitri Staessens Date: Tue, 23 Feb 2016 12:06:03 +0100 Subject: du_buff: Restructured for information hiding Moved struct buffer and struct du_buff definitions to the source file. --- include/ouroboros/du_buff.h | 12 +++--------- src/lib/du_buff.c | 10 +++++++++- 2 files changed, 12 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/include/ouroboros/du_buff.h b/include/ouroboros/du_buff.h index 522733f8..d23f4b09 100644 --- a/include/ouroboros/du_buff.h +++ b/include/ouroboros/du_buff.h @@ -27,15 +27,9 @@ #include "common.h" #include "list.h" -struct buffer; - -typedef struct { - struct buffer * buffer; - size_t size; - size_t du_start; - size_t du_end; - struct list_head list; -} du_buff_t; +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); diff --git a/src/lib/du_buff.c b/src/lib/du_buff.c index 53d9c3e4..84bf528c 100644 --- a/src/lib/du_buff.c +++ b/src/lib/du_buff.c @@ -34,7 +34,15 @@ struct buffer { uint8_t * data; size_t size; struct list_head list; -} buffer; +}; + +struct du_buff { + struct buffer * buffer; + size_t size; + size_t du_start; + size_t du_end; + struct list_head list; +}; void buffer_destroy(struct buffer * buf) { -- cgit v1.2.3