diff options
| author | dimitri staessens <dimitri.staessens@ugent.be> | 2017-04-12 16:57:48 +0200 | 
|---|---|---|
| committer | dimitri staessens <dimitri.staessens@ugent.be> | 2017-04-13 11:30:20 +0200 | 
| commit | fc10a7587b1a642748ae0fd69f08d92b4a902248 (patch) | |
| tree | e0b570cf30753a564855242c94d242f597b5c499 /include | |
| parent | a3d550ff972121641562d375f75bcf188fc7fe59 (diff) | |
| download | ouroboros-fc10a7587b1a642748ae0fd69f08d92b4a902248.tar.gz ouroboros-fc10a7587b1a642748ae0fd69f08d92b4a902248.zip  | |
lib, ipcpd, irmd: Register hash instead of name
All information passed over the IRMd/IPCP boundary for using IPC
services (flow allocation, registration) is now hashed. This
effectively fixes the shared namespace between DIFs and the IRMDs.
This PR also fixes some API issues (adding const identifiers),
shuffles the include headers a bit and some small bugs.
Diffstat (limited to 'include')
| -rw-r--r-- | include/ouroboros/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | include/ouroboros/btree.h | 47 | ||||
| -rw-r--r-- | include/ouroboros/endian.h | 2 | ||||
| -rw-r--r-- | include/ouroboros/errno.h | 6 | ||||
| -rw-r--r-- | include/ouroboros/hash.h | 41 | ||||
| -rw-r--r-- | include/ouroboros/ipcp-dev.h | 7 | ||||
| -rw-r--r-- | include/ouroboros/ipcp.h (renamed from include/ouroboros/irm_config.h) | 33 | ||||
| -rw-r--r-- | include/ouroboros/irm.h | 12 | ||||
| -rw-r--r-- | include/ouroboros/sha3.h | 86 | ||||
| -rw-r--r-- | include/ouroboros/sockets.h | 4 | ||||
| -rw-r--r-- | include/ouroboros/wrap/ouroboros.i | 4 | 
11 files changed, 214 insertions, 30 deletions
diff --git a/include/ouroboros/CMakeLists.txt b/include/ouroboros/CMakeLists.txt index a8589da1..748d5e2d 100644 --- a/include/ouroboros/CMakeLists.txt +++ b/include/ouroboros/CMakeLists.txt @@ -6,12 +6,10 @@ set(HEADER_FILES    cacep.h    cdap.h    dev.h -  endian.h    errno.h    fcntl.h    fqueue.h    irm.h -  irm_config.h    nsm.h    qos.h) diff --git a/include/ouroboros/btree.h b/include/ouroboros/btree.h new file mode 100644 index 00000000..f7c293c5 --- /dev/null +++ b/include/ouroboros/btree.h @@ -0,0 +1,47 @@ +/* + * Ouroboros - Copyright (C) 2016 - 2017 + * + * B-trees + * + *    Dimitri Staessens <dimitri.staessens@ugent.be> + *    Sander Vrijders   <sander.vrijders@ugent.be> + * + * 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_BTREE_H +#define OUROBOROS_LIB_BTREE_H + +#include <stddef.h> +#include <stdint.h> + +struct btree; + +/* Create a B-tree of order k */ +struct btree * btree_create(size_t k); + +void           btree_destroy(struct btree * tree); + +int            btree_insert(struct btree * tree, +                            uint32_t       key, +                            void *         val); + +int            btree_remove(struct btree * tree, +                            uint32_t       key); + +void *         btree_search(struct btree * tree, +                            uint32_t       key); + +#endif /* OUROBOROS_LIB_BTREE_H */ diff --git a/include/ouroboros/endian.h b/include/ouroboros/endian.h index d712b1b3..691e3f8b 100644 --- a/include/ouroboros/endian.h +++ b/include/ouroboros/endian.h @@ -84,5 +84,7 @@  #define hton32(x) htobe32(x)  #define ntoh64(x) betoh64(x)  #define noth32(x) betoh32(x) +#define hton16(x) htobe16(x) +#define ntoh16(x) betoh16(x)  #endif /* OUROBOROS_ENDIAN_H */ diff --git a/include/ouroboros/errno.h b/include/ouroboros/errno.h index d2117992..fa1a33f2 100644 --- a/include/ouroboros/errno.h +++ b/include/ouroboros/errno.h @@ -28,6 +28,8 @@  #define ENOTALLOC    1000 /* Flow is not allocated */  #define EIPCPTYPE    1001 /* Unknown IPCP type */ -#define EIRMD        1002 /* Failed to contact IRMD */ +#define EIRMD        1002 /* Failed to communicate with IRMD */ +#define EIPCP        1003 /* Failed to communicate with IPCP */ +#define EIPCPSTATE   1004 /* Target in wrong state */ -#endif +#endif /* OUROBOROS_ERRNO_H */ diff --git a/include/ouroboros/hash.h b/include/ouroboros/hash.h new file mode 100644 index 00000000..4779a9a6 --- /dev/null +++ b/include/ouroboros/hash.h @@ -0,0 +1,41 @@ +/* + * Ouroboros - Copyright (C) 2016 - 2017 + * + * Hashing functions + * + *    Dimitri Staessens <dimitri.staessens@ugent.be> + *    Sander Vrijders   <sander.vrijders@ugent.be> + * + * 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_HASH_H +#define OUROBOROS_LIB_HASH_H + +#include <ouroboros/sha3.h> +#include <ouroboros/crc32.h> + +#define HASH_FMT "%02x%02x%02x%02x" +#define HASH_VAL(hash)                                \ +        ((*(unsigned int *) hash) & 0xFF000000) >> 24, \ +        ((*(unsigned int *) hash) & 0x00FF0000) >> 16, \ +        ((*(unsigned int *) hash) & 0x0000FF00) >> 8,  \ +        ((*(unsigned int *) hash) & 0x000000FF) + +/* FIXME: Implement specifying algorithm */ +void get_hash(uint8_t      buf[], +              const char * name); + +#endif /* OUROBOROS_LIB_HASH_H */ diff --git a/include/ouroboros/ipcp-dev.h b/include/ouroboros/ipcp-dev.h index 89ef733b..571689ca 100644 --- a/include/ouroboros/ipcp-dev.h +++ b/include/ouroboros/ipcp-dev.h @@ -29,9 +29,10 @@  int  ipcp_create_r(pid_t api,                     int   result); -int  ipcp_flow_req_arr(pid_t     api, -                       char *    dst_name, -                       qoscube_t cube); +int  ipcp_flow_req_arr(pid_t           api, +                       const uint8_t * dst, +                       size_t          len, +                       qoscube_t       cube);  int  ipcp_flow_alloc_reply(int fd,                             int response); diff --git a/include/ouroboros/irm_config.h b/include/ouroboros/ipcp.h index 3dd55823..f439f29b 100644 --- a/include/ouroboros/irm_config.h +++ b/include/ouroboros/ipcp.h @@ -1,7 +1,7 @@  /*   * Ouroboros - Copyright (C) 2016 - 2017   * - * Configuration information for the IPC Resource Manager + * IPCP definitions and policies   *   *    Dimitri Staessens <dimitri.staessens@ugent.be>   *    Sander Vrijders   <sander.vrijders@ugent.be> @@ -21,25 +21,25 @@   * 02110-1301 USA   */ +#ifndef OUROBOROS_IPCP_H +#define OUROBOROS_IPCP_H +  #include <stdint.h>  #include <unistd.h>  #include <stdbool.h> -#ifndef OUROBOROS_IRM_CONFIG_H -#define OUROBOROS_IRM_CONFIG_H - -/* Name binding options */ - -#define BIND_AP_AUTO   0x01 -#define BIND_AP_UNIQUE 0x02 - +/* + * NOTE: the IRMd uses this order to select an IPCP + * for flow allocation + */  enum ipcp_type { -        IPCP_NORMAL = 0, -        IPCP_LOCAL, +        IPCP_LOCAL = 0, +        IPCP_SHIM_ETH_LLC,          IPCP_SHIM_UDP, -        IPCP_SHIM_ETH_LLC +        IPCP_NORMAL  }; +/* IPCP policies */  enum pol_addr_auth {          FLAT_RANDOM = 0  }; @@ -48,9 +48,10 @@ enum pol_gam {          COMPLETE = 0  }; -struct dif_config { -        char *         dif_name; -        enum ipcp_type type; +struct ipcp_config { +        char *             dif_name; +        enum ipcp_type     type; +        uint16_t           dir_hash_len;          /* Normal DIF */          uint8_t            addr_size; @@ -76,4 +77,4 @@ struct dif_config {          char *             if_name;  }; -#endif /* OUROBOROS_IRM_CONFIG_H */ +#endif /* OUROBOROS_IPCP_H */ diff --git a/include/ouroboros/irm.h b/include/ouroboros/irm.h index 9bd0c93b..d1aa5230 100644 --- a/include/ouroboros/irm.h +++ b/include/ouroboros/irm.h @@ -24,9 +24,15 @@  #ifndef OUROBOROS_IRM_H  #define OUROBOROS_IRM_H -#include <ouroboros/irm_config.h> +#include <ouroboros/ipcp.h> +  #include <sys/types.h> +/* Name binding options */ + +#define BIND_AP_AUTO   0x01 +#define BIND_AP_UNIQUE 0x02 +  pid_t   irm_create_ipcp(const char *   name,                          enum ipcp_type ipcp_type); @@ -39,8 +45,8 @@ ssize_t irm_list_ipcps(const char * name,  int     irm_enroll_ipcp(pid_t        api,                          const char * dif_name); -int     irm_bootstrap_ipcp(pid_t                     api, -                           const struct dif_config * conf); +int     irm_bootstrap_ipcp(pid_t                      api, +                           const struct ipcp_config * conf);  int     irm_bind_ap(const char * ap,                      const char * name, diff --git a/include/ouroboros/sha3.h b/include/ouroboros/sha3.h new file mode 100644 index 00000000..17888870 --- /dev/null +++ b/include/ouroboros/sha3.h @@ -0,0 +1,86 @@ +/* + * Ouroboros - Copyright (C) 2016 - 2017 + * + * SHA3 algorithm + * + *    Dimitri Staessens <dimitri.staessens@ugent.be> + *    Sander Vrijders   <sander.vrijders@ugent.be> + * + * This implementation is adapted and redistributed from the RHASH + * project implementation of the sha3 algorithm + * + * 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 + * + *    -- original license + * + * sha3.c - an implementation of Secure Hash Algorithm 3 (Keccak). + * based on the + * The Keccak SHA-3 submission. Submission to NIST (Round 3), 2011 + * by Guido Bertoni, Joan Daemen, Michaƫl Peeters and Gilles Van Assche + * + * Copyright: 2013 Aleksey Kravchenko <rhash.admin@gmail.com> + * + * Permission is hereby granted,  free of charge,  to any person  obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction,  including without limitation + * the rights to  use, copy, modify,  merge, publish, distribute, sublicense, + * and/or sell copies  of  the Software,  and to permit  persons  to whom the + * Software is furnished to do so. + * + * 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.  Use this program  at  your own risk! + */ + +#ifndef OUROBOROS_SHA3_H +#define OUROBOROS_SHA3_H + +#include <unistd.h> +#include <stdint.h> + +#define SHA3_224_HASH_LEN         28 +#define SHA3_256_HASH_LEN         32 +#define SHA3_384_HASH_LEN         48 +#define SHA3_512_HASH_LEN         64 +#define SHA3_MAX_PERMUTATION_SIZE 25 +#define SHA3_MAX_RATE_IN_QWORDS   24 + +struct sha3_ctx { +        /* 1600 bits algorithm hashing state */ +        uint64_t hash[SHA3_MAX_PERMUTATION_SIZE]; +        /* 1536-bit buffer for leftovers */ +        uint64_t message[SHA3_MAX_RATE_IN_QWORDS]; +        /* count of bytes in the message[] buffer */ +        unsigned rest; +        /* size of a message block processed at once */ +        unsigned block_size; +}; + +void rhash_sha3_224_init(struct sha3_ctx * ctx); + +void rhash_sha3_256_init(struct sha3_ctx * ctx); + +void rhash_sha3_384_init(struct sha3_ctx * ctx); + +void rhash_sha3_512_init(struct sha3_ctx * ctx); + +void rhash_sha3_update(struct sha3_ctx * ctx, +                       const void    *   msg, +                       size_t            size); + +void rhash_sha3_final(struct sha3_ctx * ctx, +                      uint8_t *         res); + +#endif /* OUROBOROS_SHA3_H */ diff --git a/include/ouroboros/sockets.h b/include/ouroboros/sockets.h index 8237efb6..bb8f6d87 100644 --- a/include/ouroboros/sockets.h +++ b/include/ouroboros/sockets.h @@ -26,8 +26,8 @@  #include <sys/types.h> -#include "dif_config.pb-c.h" -typedef DifConfigMsg dif_config_msg_t; +#include "ipcp_config.pb-c.h" +typedef IpcpConfigMsg ipcp_config_msg_t;  #include "irmd_messages.pb-c.h"  typedef IrmMsg irm_msg_t; diff --git a/include/ouroboros/wrap/ouroboros.i b/include/ouroboros/wrap/ouroboros.i index b156eb36..62a829e2 100644 --- a/include/ouroboros/wrap/ouroboros.i +++ b/include/ouroboros/wrap/ouroboros.i @@ -29,7 +29,7 @@  #include "ouroboros/fcntl.h"  #include "ouroboros/fqueue.h"  #include "ouroboros/irm.h" -#include "ouroboros/irm_config.h" +#include "ouroboros/ipcp.h"  #include "ouroboros/nsm.h"  #include "ouroboros/qos.h"  %} @@ -43,6 +43,6 @@ typedef int pid_t;  %include "ouroboros/fcntl.h"  %include "ouroboros/fqueue.h"  %include "ouroboros/irm.h" -%include "ouroboros/irm_config.h" +%include "ouroboros/ipcp.h"  %include "ouroboros/nsm.h"  %include "ouroboros/qos.h"  | 
