From b398dbe5cfd12b928e00f9a22cd6826bbdfb18d7 Mon Sep 17 00:00:00 2001 From: dimitri staessens Date: Wed, 26 Apr 2017 20:31:39 +0200 Subject: ipcpd: Add capability reporting The IPCP will now report the DIF name and the hash value to the IRMd as a dif_info struct. This can later be extended to add further capability reporting. Some bugfixes in normal. Fixes #24 --- src/ipcpd/ipcp.c | 12 ++++++++++-- src/ipcpd/ipcp.h | 3 ++- src/ipcpd/normal/main.c | 29 +++++++++++++++++------------ 3 files changed, 29 insertions(+), 15 deletions(-) (limited to 'src/ipcpd') diff --git a/src/ipcpd/ipcp.c b/src/ipcpd/ipcp.c index d682309d..7f3ebc73 100644 --- a/src/ipcpd/ipcp.c +++ b/src/ipcpd/ipcp.c @@ -143,9 +143,10 @@ static void * ipcp_main_loop(void * o) ipcp_config_msg_t * conf_msg; struct ipcp_config conf; + struct dif_info info; struct timeval ltv = {(SOCKET_TIMEOUT / 1000), - (SOCKET_TIMEOUT % 1000) * 1000}; + (SOCKET_TIMEOUT % 1000) * 1000}; ssize_t id = (ssize_t) o; @@ -259,7 +260,14 @@ static void * ipcp_main_loop(void * o) break; } - ret_msg.result = ipcpi.ops->ipcp_enroll(msg->dst_name); + ret_msg.result = ipcpi.ops->ipcp_enroll(msg->dst_name, + &info); + + if (ret_msg.result == 0) { + ret_msg.has_dir_hash_algo = true; + ret_msg.dir_hash_algo = info.algo; + ret_msg.dif_name = info.dif_name; + } break; case IPCP_MSG_CODE__IPCP_REG: ret_msg.has_result = true; diff --git a/src/ipcpd/ipcp.h b/src/ipcpd/ipcp.h index c78aa5a6..3f5e1bd6 100644 --- a/src/ipcpd/ipcp.h +++ b/src/ipcpd/ipcp.h @@ -43,7 +43,8 @@ enum ipcp_state { struct ipcp_ops { int (* ipcp_bootstrap)(const struct ipcp_config * conf); - int (* ipcp_enroll)(const char * dst); + int (* ipcp_enroll)(const char * dst, + struct dif_info * info); int (* ipcp_reg)(const uint8_t * hash); diff --git a/src/ipcpd/normal/main.c b/src/ipcpd/normal/main.c index ab8cf387..9228f36b 100644 --- a/src/ipcpd/normal/main.c +++ b/src/ipcpd/normal/main.c @@ -116,21 +116,21 @@ static int boot_components(void) log_dbg("Starting ribmgr."); - if (ribmgr_init()) { - log_err("Failed to initialize RIB manager."); + if (dir_init()) { + log_err("Failed to initialize directory."); goto fail_addr_auth; } - if (dir_init()) { - log_err("Failed to initialize directory."); - goto fail_ribmgr; + if (ribmgr_init()) { + log_err("Failed to initialize RIB manager."); + goto fail_dir; } log_dbg("Ribmgr started."); if (frct_init()) { log_err("Failed to initialize FRCT."); - goto fail_dir; + goto fail_ribmgr; } if (fa_init()) { @@ -180,10 +180,10 @@ static int boot_components(void) fa_fini(); fail_frct: frct_fini(); - fail_dir: - dir_fini(); fail_ribmgr: ribmgr_fini(); + fail_dir: + dir_fini(); fail_addr_auth: addr_auth_fini(); fail_name: @@ -208,16 +208,17 @@ void shutdown_components(void) frct_fini(); - dir_fini(); - ribmgr_fini(); + dir_fini(); + addr_auth_fini(); free(ipcpi.dif_name); } -static int normal_ipcp_enroll(const char * dst) +static int normal_ipcp_enroll(const char * dst, + struct dif_info * info) { if (rib_add(RIB_ROOT, MEMBERS_NAME)) { log_err("Failed to create members."); @@ -237,7 +238,11 @@ static int normal_ipcp_enroll(const char * dst) log_dbg("Enrolled with " HASH_FMT, HASH_VAL(dst)); - return ipcpi.dir_hash_algo; + info->algo = ipcpi.dir_hash_algo; + + strcpy(info->dif_name, ipcpi.dif_name); + + return 0; } const struct ros { -- cgit v1.2.3