diff options
author | dimitri staessens <[email protected]> | 2017-04-12 16:57:48 +0200 |
---|---|---|
committer | dimitri staessens <[email protected]> | 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); |