diff options
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); | 
