From 9c92dd66d5e7fab3a3e243abbad9a20b29891fee Mon Sep 17 00:00:00 2001 From: dimitri staessens Date: Fri, 20 Jan 2017 12:59:17 +0100 Subject: lib: Add new version of Resource Information Base The new RIB is implemented as a tree with doubly linked nodes (parents keep a link to each child, each child keeps a link to its parent). An index is kept in a btree using CRC32 hashes of the path name in the RIB. Nodes keep an SHA3-256 hash value that is unique for the entire subtree. This allows quick checks to see if two RIB subtrees are in sync. The event system for the RIB is based on the event system for flows (fqueue), but implemented completely in dynamic memory using linked lists. An initial test is performed for the RIB. This PR does not modify existing code to use the new RIB. --- include/ouroboros/config.h.in | 1 + include/ouroboros/rib.h | 61 ++++++++++++++++++++++++++++++++++++ include/ouroboros/rqueue.h | 72 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 134 insertions(+) create mode 100644 include/ouroboros/rib.h create mode 100644 include/ouroboros/rqueue.h (limited to 'include') diff --git a/include/ouroboros/config.h.in b/include/ouroboros/config.h.in index 4b5943c5..5597bb0b 100644 --- a/include/ouroboros/config.h.in +++ b/include/ouroboros/config.h.in @@ -61,5 +61,6 @@ #define SOCKET_TIMEOUT 4000 #define CDAP_REPLY_TIMEOUT 1000 #define ENROLL_TIMEOUT 2000 +#define RIB_MAX_PATH_LEN 256 #endif diff --git a/include/ouroboros/rib.h b/include/ouroboros/rib.h new file mode 100644 index 00000000..5acf0330 --- /dev/null +++ b/include/ouroboros/rib.h @@ -0,0 +1,61 @@ +/* + * Ouroboros - Copyright (C) 2016 - 2017 + * + * Resource Information Base + * + * Sander Vrijders + * Dimitri Staessens + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * version 2.1 as published by the Free Software Foundation. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301 USA + */ + +#ifndef OUROBOROS_LIB_RIB_H +#define OUROBOROS_LIB_RIB_H + +#include +#include + +#define RIB_ROOT "" + +int rib_init(void); + +void rib_fini(void); + +int rib_add(const char * parent, + const char * name); + +int rib_del(char * path); + +ssize_t rib_read(const char * path, + void * data, + size_t len); + +int rib_write(const char * path, + const void * data, + size_t len); + +int rib_put(const char * path, + void * data, + size_t len); + +bool rib_has(const char * path); + +char * rib_path_append(char * path, + const char * name); + +char * rib_name_gen(void * data, + size_t len); + +#endif /* OUROBOROS_LIB_RIB_H */ diff --git a/include/ouroboros/rqueue.h b/include/ouroboros/rqueue.h new file mode 100644 index 00000000..7bfbfa8f --- /dev/null +++ b/include/ouroboros/rqueue.h @@ -0,0 +1,72 @@ +/* + * Ouroboros - Copyright (C) 2016 - 2017 + * + * RIB event queues + * + * Dimitri Staessens + * Sander Vrijders + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * version 2.1 as published by the Free Software Foundation. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301 USA + */ + +#ifndef OUROBOROS_RQUEUE_H +#define OUROBOROS_RQUEUE_H + +#include +#include +#include + +#define RO_READ 0x00000001 +#define RO_MODIFY 0x00000002 +#define RO_CREATE 0x00000004 +#define RO_DELETE 0x00000008 +#define RO_START 0x00000010 +#define RO_STOP 0x00000020 + +#define RO_NO_OPS 0x00000000 +#define RO_ALL_OPS 0xFFFFFFFF + +struct ro_set; + +struct rqueue; + +typedef struct ro_set ro_set_t; +typedef struct rqueue rqueue_t; + +ro_set_t * ro_set_create(void); + +void ro_set_destroy(ro_set_t * set); + +rqueue_t * rqueue_create(void); + +int rqueue_destroy(struct rqueue * rq); + +int ro_set_zero(ro_set_t * set); + +int ro_set_add(ro_set_t * set, + const char * path, + int32_t flags); + +int ro_set_del(ro_set_t * set, + const char * path); + +int32_t rqueue_next(rqueue_t * rq, + char * path); + +int rib_event_wait(ro_set_t * set, + rqueue_t * rq, + const struct timespec * timeout); + +#endif /* OUROBOROS_RQUEUE_H */ -- cgit v1.2.3