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 /src/irmd | |
| 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 'src/irmd')
| -rw-r--r-- | src/irmd/apn_table.c | 2 | ||||
| -rw-r--r-- | src/irmd/ipcp.c | 113 | ||||
| -rw-r--r-- | src/irmd/ipcp.h | 42 | ||||
| -rw-r--r-- | src/irmd/main.c | 188 | ||||
| -rw-r--r-- | src/irmd/registry.c | 57 | ||||
| -rw-r--r-- | src/irmd/registry.h | 22 | 
6 files changed, 253 insertions, 171 deletions
| diff --git a/src/irmd/apn_table.c b/src/irmd/apn_table.c index d265e2f0..c77e7128 100644 --- a/src/irmd/apn_table.c +++ b/src/irmd/apn_table.c @@ -21,7 +21,7 @@   */  #include <ouroboros/errno.h> -#include <ouroboros/irm_config.h> +#include <ouroboros/irm.h>  #include "apn_table.h"  #include "utils.h" diff --git a/src/irmd/ipcp.c b/src/irmd/ipcp.c index eb0c2de0..f0e57dc8 100644 --- a/src/irmd/ipcp.c +++ b/src/irmd/ipcp.c @@ -104,15 +104,15 @@ ipcp_msg_t * send_recv_ipcp_msg(pid_t        api,         return recv_msg;  } -pid_t ipcp_create(char *         name, +pid_t ipcp_create(const char *   name,                    enum ipcp_type ipcp_type)  { -        pid_t api = -1; -        char irmd_api[10]; -        size_t len = 0; -        char * ipcp_dir = "/sbin/"; +        pid_t  api       = -1; +        size_t len       = 0; +        char * ipcp_dir  = "/sbin/";          char * full_name = NULL;          char * exec_name = NULL; +        char   irmd_api[10];          char * argv[5];          sprintf(irmd_api, "%u", getpid()); @@ -157,13 +157,11 @@ pid_t ipcp_create(char *         name,          /* log_file to be placed at the end */          argv[0] = full_name;          argv[1] = irmd_api; -        argv[2] = name; -        if (log_syslog) { +        argv[2] = (char *) name; +        if (log_syslog)                  argv[3] = "1"; -                argv[4] = NULL; -        } else { +        else                  argv[3] = NULL; -        }          argv[4] = NULL; @@ -187,7 +185,7 @@ int ipcp_destroy(pid_t api)  }  int ipcp_bootstrap(pid_t              api, -                   dif_config_msg_t * conf) +                   ipcp_config_msg_t * conf)  {          ipcp_msg_t msg = IPCP_MSG__INIT;          ipcp_msg_t * recv_msg = NULL; @@ -201,11 +199,11 @@ int ipcp_bootstrap(pid_t              api,          recv_msg = send_recv_ipcp_msg(api, &msg);          if (recv_msg == NULL) -                return -1; +                return -EIPCP;          if (recv_msg->has_result == false) {                  ipcp_msg__free_unpacked(recv_msg, NULL); -                return -1; +                return -EIPCP;          }          ret = recv_msg->result; @@ -214,26 +212,26 @@ int ipcp_bootstrap(pid_t              api,          return ret;  } -int ipcp_enroll(pid_t  api, -                char * dif_name) +int ipcp_enroll(pid_t        api, +                const char * dst)  {          ipcp_msg_t msg = IPCP_MSG__INIT;          ipcp_msg_t * recv_msg = NULL;          int ret = -1; -        if (dif_name == NULL) +        if (dst == NULL)                  return -EINVAL; -        msg.code     = IPCP_MSG_CODE__IPCP_ENROLL; -        msg.dif_name = dif_name; +        msg.code = IPCP_MSG_CODE__IPCP_ENROLL; +        msg.dst_name = (char *) dst;          recv_msg = send_recv_ipcp_msg(api, &msg);          if (recv_msg == NULL) -                return -1; +                return -EIPCP;          if (recv_msg->has_result == false) {                  ipcp_msg__free_unpacked(recv_msg, NULL); -                return -1; +                return -EIPCP;          }          ret = recv_msg->result; @@ -242,26 +240,28 @@ int ipcp_enroll(pid_t  api,          return ret;  } -int ipcp_name_reg(pid_t  api, -                  char * name) +int ipcp_reg(pid_t           api, +             const uint8_t * hash, +             size_t          len)  {          ipcp_msg_t msg = IPCP_MSG__INIT;          ipcp_msg_t * recv_msg = NULL;          int ret = -1; -        if (name == NULL) -                return -1; +        assert(hash); -        msg.code = IPCP_MSG_CODE__IPCP_NAME_REG; -        msg.name = name; +        msg.code      = IPCP_MSG_CODE__IPCP_REG; +        msg.has_hash  = true; +        msg.hash.len  = len; +        msg.hash.data = (uint8_t *)hash;          recv_msg = send_recv_ipcp_msg(api, &msg);          if (recv_msg == NULL) -                return -1; +                return -EIPCP;          if (recv_msg->has_result == false) {                  ipcp_msg__free_unpacked(recv_msg, NULL); -                return -1; +                return -EIPCP;          }          ret = recv_msg->result; @@ -270,23 +270,26 @@ int ipcp_name_reg(pid_t  api,          return ret;  } -int ipcp_name_unreg(pid_t  api, -                    char * name) +int ipcp_unreg(pid_t           api, +               const uint8_t * hash, +               size_t          len)  {          ipcp_msg_t msg = IPCP_MSG__INIT;          ipcp_msg_t * recv_msg = NULL;          int ret = -1; -        msg.code = IPCP_MSG_CODE__IPCP_NAME_UNREG; -        msg.name = name; +        msg.code      = IPCP_MSG_CODE__IPCP_UNREG; +        msg.has_hash  = true; +        msg.hash.len  = len; +        msg.hash.data = (uint8_t *) hash;          recv_msg = send_recv_ipcp_msg(api, &msg);          if (recv_msg == NULL) -                return -1; +                return -EIPCP;          if (recv_msg->has_result == false) {                  ipcp_msg__free_unpacked(recv_msg, NULL); -                return -1; +                return -EIPCP;          }          ret = recv_msg->result; @@ -295,23 +298,26 @@ int ipcp_name_unreg(pid_t  api,          return ret;  } -int ipcp_name_query(pid_t api, -                    char * name) +int ipcp_query(pid_t           api, +               const uint8_t * hash, +               size_t          len)  {          ipcp_msg_t msg = IPCP_MSG__INIT;          ipcp_msg_t * recv_msg = NULL;          int ret = -1; -        msg.code = IPCP_MSG_CODE__IPCP_NAME_QUERY; -        msg.name = name; +        msg.code      = IPCP_MSG_CODE__IPCP_QUERY; +        msg.has_hash  = true; +        msg.hash.len  = len; +        msg.hash.data = (uint8_t *) hash;          recv_msg = send_recv_ipcp_msg(api, &msg);          if (recv_msg == NULL) -                return -1; +                return -EIPCP;          if (recv_msg->has_result == false) {                  ipcp_msg__free_unpacked(recv_msg, NULL); -                return -1; +                return -EIPCP;          }          ret = recv_msg->result; @@ -320,35 +326,37 @@ int ipcp_name_query(pid_t api,          return ret;  } -int ipcp_flow_alloc(pid_t     api, -                    int       port_id, -                    pid_t     n_api, -                    char *    dst_name, -                    qoscube_t cube) +int ipcp_flow_alloc(pid_t           api, +                    int             port_id, +                    pid_t           n_api, +                    const uint8_t * dst, +                    size_t          len, +                    qoscube_t       cube)  {          ipcp_msg_t msg = IPCP_MSG__INIT;          ipcp_msg_t * recv_msg = NULL;          int ret = -1; -        if (dst_name == NULL) -                return -EINVAL; +        assert(dst);          msg.code         = IPCP_MSG_CODE__IPCP_FLOW_ALLOC;          msg.has_port_id  = true;          msg.port_id      = port_id;          msg.has_api      = true;          msg.api          = n_api; -        msg.dst_name     = dst_name; +        msg.has_hash     = true; +        msg.hash.len     = len; +        msg.hash.data    = (uint8_t *) dst;          msg.has_qoscube  = true;          msg.qoscube      = cube;          recv_msg = send_recv_ipcp_msg(api, &msg);          if (recv_msg == NULL) -                return -1; +                return -EIPCP;          if (!recv_msg->has_result) {                  ipcp_msg__free_unpacked(recv_msg, NULL); -                return -1; +                return -EIPCP;          }          ret = recv_msg->result; @@ -376,11 +384,11 @@ int ipcp_flow_alloc_resp(pid_t api,          recv_msg = send_recv_ipcp_msg(api, &msg);          if (recv_msg == NULL) -                return -1; +                return -EIPCP;          if (recv_msg->has_result == false) {                  ipcp_msg__free_unpacked(recv_msg, NULL); -                return -1; +                return -EIPCP;          }          ret = recv_msg->result; @@ -392,7 +400,6 @@ int ipcp_flow_alloc_resp(pid_t api,  int ipcp_flow_dealloc(pid_t api,                        int   port_id)  { -          ipcp_msg_t msg = IPCP_MSG__INIT;          ipcp_msg_t * recv_msg = NULL;          int ret = -1; diff --git a/src/irmd/ipcp.h b/src/irmd/ipcp.h index bb868191..11adad7d 100644 --- a/src/irmd/ipcp.h +++ b/src/irmd/ipcp.h @@ -20,40 +20,44 @@   * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.   */ -#include <ouroboros/irm_config.h> +#include <ouroboros/ipcp.h>  #include <ouroboros/sockets.h>  #include <ouroboros/shared.h>  #include <sys/types.h> -#ifndef OUROBOROS_IPCP_H -#define OUROBOROS_IPCP_H +#ifndef OUROBOROS_IRMD_IPCP_H +#define OUROBOROS_IRMD_IPCP_H -pid_t ipcp_create(char *         name, +pid_t ipcp_create(const char *   name,                    enum ipcp_type ipcp_type);  int   ipcp_destroy(pid_t api); -int   ipcp_enroll(pid_t  api, -                  char * dif_name); +int   ipcp_enroll(pid_t        api, +                  const char * dst);  int   ipcp_bootstrap(pid_t              api, -                     dif_config_msg_t * conf); +                     ipcp_config_msg_t * conf); -int   ipcp_name_reg(pid_t  api, -                    char * name); +int   ipcp_reg(pid_t           api, +               const uint8_t * hash, +               size_t          len); -int   ipcp_name_unreg(pid_t  api, -                      char * name); +int   ipcp_unreg(pid_t           api, +                 const uint8_t * hash, +                 size_t          len); -int   ipcp_name_query(pid_t  api, -                      char * name); +int   ipcp_query(pid_t           api, +                 const uint8_t * hash, +                 size_t          len); -int   ipcp_flow_alloc(pid_t     api, -                      int       port_id, -                      pid_t     n_api, -                      char *    dst_name, -                      qoscube_t qos); +int   ipcp_flow_alloc(pid_t           api, +                      int             port_id, +                      pid_t           n_api, +                      const uint8_t * dst, +                      size_t          len, +                      qoscube_t       qos);  int   ipcp_flow_alloc_resp(pid_t api,                             int   port_id, @@ -63,4 +67,4 @@ int   ipcp_flow_alloc_resp(pid_t api,  int   ipcp_flow_dealloc(pid_t api,                          int   port_id); -#endif /* OUROBOROS_IPCP_H */ +#endif /* OUROBOROS_IRMD_IPCP_H */ diff --git a/src/irmd/main.c b/src/irmd/main.c index 5e5039b1..125061fb 100644 --- a/src/irmd/main.c +++ b/src/irmd/main.c @@ -27,7 +27,8 @@  #include <ouroboros/sockets.h>  #include <ouroboros/list.h>  #include <ouroboros/utils.h> -#include <ouroboros/irm_config.h> +#include <ouroboros/hash.h> +#include <ouroboros/irm.h>  #include <ouroboros/lockfile.h>  #include <ouroboros/shm_flow_set.h>  #include <ouroboros/shm_rbuff.h> @@ -36,6 +37,7 @@  #include <ouroboros/qos.h>  #include <ouroboros/time_utils.h>  #include <ouroboros/logs.h> +#include <ouroboros/sha3.h>  #include "utils.h"  #include "registry.h" @@ -62,6 +64,8 @@ struct ipcp_entry {          char *           name;          pid_t            api;          enum ipcp_type   type; +        uint16_t         dir_hash_len; +        /* FIXME: add an enum to specify hash algo */          char *           dif_name;          pthread_cond_t   init_cond; @@ -223,48 +227,33 @@ static struct ipcp_entry * get_ipcp_entry_by_name(const char * name)          return NULL;  } -/* Check if the name exists anywhere in a DIF. */ -static pid_t get_ipcp_by_dst_name(char * dst_name) +/* + * Check if the hash is reachable anywhere in a DIF. + * FIXME: specify algorithm used + */ +static struct ipcp_entry * get_ipcp_by_dst_name(const char * name)  {          struct list_head * p = NULL; +        uint8_t * hash;          list_for_each(p, &irmd.ipcps) {                  struct ipcp_entry * e =                          list_entry(p, struct ipcp_entry, next); -                if (e->type == IPCP_LOCAL) { -                        if (ipcp_name_query(e->api, dst_name) == 0) -                                return e->api; -                } -        } +                hash = malloc(e->dir_hash_len); +                if  (hash == NULL) +                        return NULL; -        list_for_each(p, &irmd.ipcps) { -                struct ipcp_entry * e = -                        list_entry(p, struct ipcp_entry, next); -                if (e->type == IPCP_NORMAL) { -                        if (ipcp_name_query(e->api, dst_name) == 0) -                                return e->api; -                } -        } +                get_hash(hash, name); -        list_for_each(p, &irmd.ipcps) { -                struct ipcp_entry * e = -                        list_entry(p, struct ipcp_entry, next); -                if (e->type == IPCP_SHIM_ETH_LLC) { -                        if (ipcp_name_query(e->api, dst_name) == 0) -                                return e->api; +                if (ipcp_query(e->api, hash, e->dir_hash_len) == 0) { +                        free(hash); +                        return e;                  } -        } -        list_for_each(p, &irmd.ipcps) { -                struct ipcp_entry * e = -                        list_entry(p, struct ipcp_entry, next); -                if (e->type == IPCP_SHIM_UDP) { -                        if (ipcp_name_query(e->api, dst_name) == 0) -                                return e->api; -                } +                free(hash);          } -        return -1; +        return NULL;  }  static pid_t create_ipcp(char *         name, @@ -317,14 +306,16 @@ static pid_t create_ipcp(char *         name,          tmp->dif_name = NULL;          tmp->type = ipcp_type;          tmp->init = false; +        /* FIXME: ipcp dir_hash_len should be configurable */ +        tmp->dir_hash_len = SHA3_256_HASH_LEN;          list_for_each(p, &irmd.ipcps) {                  struct ipcp_entry * e = list_entry(p, struct ipcp_entry, next); -                if (e->type < ipcp_type) +                if (e->type > ipcp_type)                          break;          } -        list_add(&tmp->next, &irmd.ipcps); +        list_add_tail(&tmp->next, &irmd.ipcps);          list_add(&api->next, &irmd.spawned_apis); @@ -411,7 +402,7 @@ static int destroy_ipcp(pid_t api)  }  static int bootstrap_ipcp(pid_t              api, -                          dif_config_msg_t * conf) +                          ipcp_config_msg_t * conf)  {          struct ipcp_entry * entry = NULL; @@ -709,16 +700,18 @@ static ssize_t list_ipcps(char *   name,          return count;  } -static int name_reg(char *  name, -                    char ** difs, -                    size_t  len) +static int name_reg(const char *  name, +                    char **       difs, +                    size_t        len)  {          size_t i;          int ret = 0;          struct list_head * p = NULL; -        if (name == NULL || difs == NULL || len == 0 || difs[0] == NULL) -                return -EINVAL; +        assert(name); +        assert(len); +        assert(difs); +        assert(difs[0]);          pthread_rwlock_wrlock(&irmd.reg_lock); @@ -729,7 +722,7 @@ static int name_reg(char *  name,          if (!registry_has_name(&irmd.registry, name)) {                  struct reg_entry * re = -                        registry_add_name(&irmd.registry, strdup(name)); +                        registry_add_name(&irmd.registry, name);                  if (re == NULL) {                          log_err("Failed creating registry entry for %s.", name);                          pthread_rwlock_unlock(&irmd.reg_lock); @@ -768,12 +761,21 @@ static int name_reg(char *  name,                          continue;                  for (i = 0; i < len; ++i) { +                        uint8_t * hash; +                          if (wildcard_match(difs[i], e->dif_name))                                  continue; -                        if (ipcp_name_reg(e->api, name)) { -                                log_err("Could not register %s in DIF %s.", -                                        name, e->dif_name); +                        hash = malloc(e->dir_hash_len); +                        if  (hash == NULL) +                                break; + +                        get_hash(hash, name); + +                        if (ipcp_reg(e->api, hash, e->dir_hash_len)) { +                                log_err("Could not register " HASH_FMT +                                        " in DIF %s.", +                                        HASH_VAL(hash), e->dif_name);                          } else {                                  if (registry_add_name_to_dif(&irmd.registry,                                                               name, @@ -782,10 +784,12 @@ static int name_reg(char *  name,                                          log_warn("Registered unbound name %s. "                                                   "Registry may be corrupt.",                                                   name); -                                log_info("Registered %s in %s as %s.", -                                         name, e->dif_name, name); +                                log_info("Registered %s in %s as " HASH_FMT ".", +                                         name, e->dif_name, HASH_VAL(hash));                                  ++ret;                          } + +                        free(hash);                  }          } @@ -794,16 +798,18 @@ static int name_reg(char *  name,          return (ret > 0 ? 0 : -1);  } -static int name_unreg(char *  name, -                      char ** difs, -                      size_t  len) +static int name_unreg(const char *  name, +                      char **       difs, +                      size_t        len)  {          size_t i;          int ret = 0;          struct list_head * pos = NULL; -        if (name == NULL || len == 0 || difs == NULL || difs[0] == NULL) -                return -1; +        assert(name); +        assert(len); +        assert(difs); +        assert(difs[0]);          pthread_rwlock_wrlock(&irmd.reg_lock); @@ -815,10 +821,18 @@ static int name_unreg(char *  name,                          continue;                  for (i = 0; i < len; ++i) { +                        uint8_t * hash; +                          if (wildcard_match(difs[i], e->dif_name))                                  continue; -                        if (ipcp_name_unreg(e->api, name)) { +                        hash = malloc(e->dir_hash_len); +                        if  (hash == NULL) +                                break; + +                        get_hash(hash, name); + +                        if (ipcp_unreg(e->api, hash, e->dir_hash_len)) {                                  log_err("Could not unregister %s in DIF %s.",                                          name, e->dif_name);                          } else { @@ -829,6 +843,8 @@ static int name_unreg(char *  name,                                           name, e->dif_name);                                  ++ret;                          } + +                        free(hash);                  }          } @@ -1038,22 +1054,23 @@ static int flow_accept(pid_t              api,  }  static int flow_alloc(pid_t              api, -                      char *             dst_name, +                      const char *       dst,                        qoscube_t          cube,                        struct timespec *  timeo,                        struct irm_flow ** e)  { -        struct irm_flow * f; -        pid_t             ipcp; -        int               port_id; -        int               state; +        struct irm_flow *   f; +        struct ipcp_entry * ipcp; +        int                 port_id; +        int                 state; +        uint8_t *           hash;          pthread_rwlock_rdlock(&irmd.reg_lock); -        ipcp = get_ipcp_by_dst_name(dst_name); -        if (ipcp == -1) { +        ipcp = get_ipcp_by_dst_name(dst); +        if (ipcp == NULL) {                  pthread_rwlock_unlock(&irmd.reg_lock); -                log_info("Destination unreachable."); +                log_info("Destination %s unreachable.", dst);                  return -1;          } @@ -1066,7 +1083,7 @@ static int flow_alloc(pid_t              api,                  return -EBADF;          } -        f = irm_flow_create(api, ipcp, port_id, cube); +        f = irm_flow_create(api, ipcp->api, port_id, cube);          if (f == NULL) {                  bmp_release(irmd.port_ids, port_id);                  pthread_rwlock_unlock(&irmd.flows_lock); @@ -1080,12 +1097,24 @@ static int flow_alloc(pid_t              api,          assert(irm_flow_get_state(f) == FLOW_ALLOC_PENDING); -        if (ipcp_flow_alloc(ipcp, port_id, api, dst_name, cube)) { +        hash = malloc(ipcp->dir_hash_len); +        if  (hash == NULL) { +                /* sanitizer cleans this */ +                return -ENOMEM; +        } + +        get_hash(hash, dst); + +        if (ipcp_flow_alloc(ipcp->api, port_id, api, hash, +                            ipcp->dir_hash_len, cube)) {                  /* sanitizer cleans this */                  log_info("Flow_allocation failed."); +                free(hash);                  return -EAGAIN;          } +        free(hash); +          state = irm_flow_wait_state(f, FLOW_ALLOCATED, timeo);          if (state != FLOW_ALLOCATED) {                  if (state == -ETIMEDOUT) { @@ -1093,7 +1122,7 @@ static int flow_alloc(pid_t              api,                          return -ETIMEDOUT;                  } -                log_info("Pending flow to %s torn down.", dst_name); +                log_info("Pending flow to %s torn down.", dst);                  return -EPIPE;          } @@ -1191,38 +1220,49 @@ static pid_t auto_execute(char ** argv)          exit(EXIT_FAILURE);  } -static struct irm_flow * flow_req_arr(pid_t     api, -                                      char *    dst_name, -                                      qoscube_t cube) +static struct irm_flow * flow_req_arr(pid_t           api, +                                      const uint8_t * hash, +                                      qoscube_t       cube)  {          struct reg_entry * re = NULL;          struct apn_entry * a  = NULL;          struct api_entry * e  = NULL;          struct irm_flow *  f  = NULL; -        struct pid_el * c_api; -        pid_t h_api = -1; -        int port_id = -1; +        struct pid_el *     c_api; +        struct ipcp_entry * ipcp; +        pid_t               h_api   = -1; +        int                 port_id = -1;          struct timespec wt = {IRMD_REQ_ARR_TIMEOUT / 1000,                                (IRMD_REQ_ARR_TIMEOUT % 1000) * MILLION}; -        log_dbg("Flow req arrived from IPCP %d for %s.", api, dst_name); +        log_dbg("Flow req arrived from IPCP %d for " HASH_FMT ".", +                api, HASH_VAL(hash));          pthread_rwlock_rdlock(&irmd.reg_lock); -        re = registry_get_entry(&irmd.registry, dst_name); +        ipcp = get_ipcp_entry_by_api(api); +        if (ipcp == NULL) { +                log_err("IPCP died."); +                return NULL; +        } + +        re = registry_get_entry_by_hash(&irmd.registry, hash, +                                        ipcp->dir_hash_len);          if (re == NULL) {                  pthread_rwlock_unlock(&irmd.reg_lock); -                log_err("Unknown name: %s.", dst_name); +                log_err("Unknown hash: " HASH_FMT ".", HASH_VAL(hash));                  return NULL;          } +        log_info("Flow request arrived for %s.", re->name); +          pthread_rwlock_unlock(&irmd.reg_lock);          /* Give the AP a bit of slop time to call accept */          if (reg_entry_leave_state(re, REG_NAME_IDLE, &wt) == -1) { -                log_err("No APs for %s.", dst_name); +                log_err("No APs for " HASH_FMT ".", HASH_VAL(hash));                  return NULL;          } @@ -1231,7 +1271,7 @@ static struct irm_flow * flow_req_arr(pid_t     api,          switch (reg_entry_get_state(re)) {          case REG_NAME_IDLE:                  pthread_rwlock_unlock(&irmd.reg_lock); -                log_err("No APs for %s.", dst_name); +                log_err("No APs for " HASH_FMT ".", HASH_VAL(hash));                  return NULL;          case REG_NAME_AUTO_ACCEPT:                  c_api = malloc(sizeof(*c_api)); @@ -1830,7 +1870,7 @@ void * mainloop(void * o)                          break;                  case IRM_MSG_CODE__IPCP_FLOW_REQ_ARR:                          e = flow_req_arr(msg->api, -                                         msg->dst_name, +                                         msg->hash.data,                                           msg->qoscube);                          ret_msg.has_result = true;                          if (e == NULL) { diff --git a/src/irmd/registry.c b/src/irmd/registry.c index 53be77cd..71e6ea8a 100644 --- a/src/irmd/registry.c +++ b/src/irmd/registry.c @@ -25,8 +25,9 @@  #include <ouroboros/config.h>  #include <ouroboros/errno.h>  #include <ouroboros/logs.h> -#include <ouroboros/irm_config.h> +#include <ouroboros/irm.h>  #include <ouroboros/time_utils.h> +#include <ouroboros/hash.h>  #include "registry.h"  #include "utils.h" @@ -145,7 +146,8 @@ static void reg_entry_destroy(struct reg_entry * e)          free(e);  } -static bool reg_entry_is_local_in_dif(struct reg_entry * e, char * dif_name) +static bool reg_entry_is_local_in_dif(struct reg_entry * e, +                                      const char *       dif_name)  {          struct list_head * p = NULL; @@ -159,7 +161,7 @@ static bool reg_entry_is_local_in_dif(struct reg_entry * e, char * dif_name)  }  static int reg_entry_add_local_in_dif(struct reg_entry * e, -                                      char *             dif_name, +                                      const char *       dif_name,                                        enum ipcp_type     type)  {          if (!reg_entry_is_local_in_dif(e, dif_name)) { @@ -176,7 +178,7 @@ static int reg_entry_add_local_in_dif(struct reg_entry * e,  }  static void reg_entry_del_local_from_dif(struct reg_entry * e, -                                         char *             dif_name) +                                         const char *       dif_name)  {          struct list_head * p = NULL;          struct list_head * h = NULL; @@ -192,7 +194,7 @@ static void reg_entry_del_local_from_dif(struct reg_entry * e,  }  static bool reg_entry_has_apn(struct reg_entry * e, -                              char *             apn) +                              const char *       apn)  {          struct list_head * p; @@ -242,7 +244,7 @@ int reg_entry_add_apn(struct reg_entry * e,  }  void reg_entry_del_apn(struct reg_entry * e, -                       char *             apn) +                       const char *       apn)  {          struct list_head * p = NULL;          struct list_head * h = NULL; @@ -504,9 +506,9 @@ int reg_entry_wait_state(struct reg_entry *  e,  }  struct reg_entry * registry_get_entry(struct list_head * registry, -                                      char *             name) +                                      const char *       name)  { -        struct list_head * p   = NULL; +        struct list_head * p = NULL;          assert(registry); @@ -519,8 +521,33 @@ struct reg_entry * registry_get_entry(struct list_head * registry,          return NULL;  } +struct reg_entry * registry_get_entry_by_hash(struct list_head * registry, +                                              const uint8_t *    hash, +                                              size_t             len) +{ +        struct list_head * p = NULL; +        uint8_t * thash; + +        thash = malloc(len); +        if (thash == NULL) +                return NULL; + +        assert(registry); + +        list_for_each(p, registry) { +                struct reg_entry * e = list_entry(p, struct reg_entry, next); +                get_hash(thash, e->name); +                if (memcmp(thash, hash, len) == 0) { +                        free(thash); +                        return e; +                } +        } + +        return NULL; +} +  struct reg_entry * registry_add_name(struct list_head * registry, -                                     char *             name) +                                     const char *       name)  {          struct reg_entry * e = NULL; @@ -538,7 +565,7 @@ struct reg_entry * registry_add_name(struct list_head * registry,                  return NULL;          } -        e = reg_entry_init(e, name); +        e = reg_entry_init(e, strdup(name));          if (e == NULL) {                  log_dbg("Could not initialize registry entry.");                  reg_entry_destroy(e); @@ -551,7 +578,7 @@ struct reg_entry * registry_add_name(struct list_head * registry,  }  void registry_del_name(struct list_head * registry, -                       char *             name) +                       const char *       name)  {          struct reg_entry * e = registry_get_entry(registry, name);          if (e == NULL) @@ -583,8 +610,8 @@ void registry_del_api(struct list_head * registry,  }  int registry_add_name_to_dif(struct list_head * registry, -                             char *             name, -                             char *             dif_name, +                             const char *       name, +                             const char *       dif_name,                               enum ipcp_type     type)  {          struct reg_entry * re = registry_get_entry(registry, name); @@ -595,8 +622,8 @@ int registry_add_name_to_dif(struct list_head * registry,  }  void registry_del_name_from_dif(struct list_head * registry, -                                char *             name, -                                char *             dif_name) +                                const char *       name, +                                const char *       dif_name)  {          struct reg_entry * re = registry_get_entry(registry, name);          if (re == NULL) diff --git a/src/irmd/registry.h b/src/irmd/registry.h index 08e78019..771ca83c 100644 --- a/src/irmd/registry.h +++ b/src/irmd/registry.h @@ -24,8 +24,8 @@  #define OUROBOROS_IRMD_REGISTRY_H  #include <ouroboros/config.h> +#include <ouroboros/ipcp.h>  #include <ouroboros/list.h> -#include <ouroboros/irm_config.h>  #include <ouroboros/shared.h>  #include "api_table.h" @@ -71,7 +71,7 @@ int                 reg_entry_add_apn(struct reg_entry * e,                                        struct apn_entry * a);  void                reg_entry_del_apn(struct reg_entry * e, -                                      char *             apn); +                                      const char *       apn);  char *              reg_entry_get_apn(struct reg_entry * e); @@ -101,10 +101,10 @@ int                 reg_entry_wait_state(struct reg_entry *   e,                                           struct timespec *    timeout);  struct reg_entry *  registry_add_name(struct list_head * registry, -                                      char *             name); +                                      const char *       name);  void                registry_del_name(struct list_head * registry, -                                      char *             name); +                                      const char *       name);  void                registry_del_api(struct list_head * registry,                                       pid_t              api); @@ -112,16 +112,20 @@ void                registry_del_api(struct list_head * registry,  void                registry_sanitize_apis(struct list_head * registry);  struct reg_entry *  registry_get_entry(struct list_head * registry, -                                       char *             name); +                                       const char *       name); + +struct reg_entry *  registry_get_entry_by_hash(struct list_head * registry, +                                               const uint8_t *    hash, +                                               size_t             len);  int                 registry_add_name_to_dif(struct list_head * registry, -                                             char *             name, -                                             char *             dif_name, +                                             const char *       name, +                                             const char *       dif_name,                                               enum ipcp_type     type);  void                registry_del_name_from_dif(struct list_head * registry, -                                               char *             name, -                                               char *             dif_name); +                                               const char *       name, +                                               const char *       dif_name);  void                registry_destroy(struct list_head * registry); | 
