From 72abee4fc44e5e5092e215d5afee556e6e59347c Mon Sep 17 00:00:00 2001 From: Sander Vrijders Date: Thu, 24 Mar 2016 15:46:05 +0100 Subject: lib: Adds IRMd messages for the dev.h API calls This adds several messages for the dev.h API calls to communicate with the IRM daemon. The deserializing of these messages is still missing and the irmd hasn't been updated with them either. --- include/ouroboros/da.h | 6 +- include/ouroboros/dev.h | 12 +- include/ouroboros/ipcp.h | 2 +- include/ouroboros/rina_name.h | 14 +- include/ouroboros/sockets.h | 31 +++- src/irmd/main.c | 6 +- src/lib/da.c | 6 +- src/lib/dev.c | 198 +++++++++++++++++++++---- src/lib/ipcp.c | 18 +-- src/lib/irm.c | 41 +----- src/lib/rina_name.c | 61 +------- src/lib/sockets.c | 285 +++++++++++++++++++++++++++++++----- src/tools/echo/echo_client.c | 5 +- src/tools/echo/echo_server.c | 4 +- src/tools/irm/irm_bootstrap_ipcp.c | 6 +- src/tools/irm/irm_create_ipcp.c | 4 - src/tools/irm/irm_destroy_ipcp.c | 6 +- src/tools/irm/irm_enroll_ipcp.c | 4 - src/tools/irm/irm_register_ipcp.c | 4 - src/tools/irm/irm_unregister_ipcp.c | 4 - src/tools/irm/irm_utils.c | 4 - 21 files changed, 490 insertions(+), 231 deletions(-) diff --git a/include/ouroboros/da.h b/include/ouroboros/da.h index 2a046f6b..f678007d 100644 --- a/include/ouroboros/da.h +++ b/include/ouroboros/da.h @@ -26,12 +26,12 @@ #include "common.h" #include "rina_name.h" -rina_name_t * da_resolve_daf(char * daf_name); +char * da_resolve_daf(char * daf_name); /* * n_1_difs is an out parameter * The amount of n_1_difs is returned */ -ssize_t da_resolve_dap(rina_name_t * name, - char ** n_1_difs); +ssize_t da_resolve_dap(char * name, + char ** n_1_difs); #endif diff --git a/include/ouroboros/dev.h b/include/ouroboros/dev.h index 39194abd..b2507fbf 100644 --- a/include/ouroboros/dev.h +++ b/include/ouroboros/dev.h @@ -26,19 +26,17 @@ #include /* Returns file descriptor */ -int ap_reg(char * ap_name, char * ae_name, - char ** difs, size_t difs_size); -int ap_unreg(char * ap_name, char * ae_name, - char ** difs, size_t difs_size); +int ap_reg(char * ap_name, char ** difs, size_t difs_size); +int ap_unreg(char * ap_name, char ** difs, size_t difs_size); /* Returns file descriptor (> 0) and client name(s) */ int flow_accept(int fd, char * ap_name, char * ae_name); int flow_alloc_resp(int fd, int result); /* Returns file descriptor */ -int flow_alloc(char * dst_ap_name, char * dst_ae_name, - char * src_ap_name, char * src_ae_name, - struct qos_spec * qos, int oflags); +int flow_alloc(char * dst_ap_name, char * src_ap_name, + char * src_ae_name, struct qos_spec * qos, + int oflags); /* If flow is accepted returns a value > 0 */ int flow_alloc_res(int fd); diff --git a/include/ouroboros/ipcp.h b/include/ouroboros/ipcp.h index 5e3e7f8c..b8775fc0 100644 --- a/include/ouroboros/ipcp.h +++ b/include/ouroboros/ipcp.h @@ -46,7 +46,7 @@ int ipcp_bootstrap(pid_t pid, struct dif_config conf); int ipcp_enroll(pid_t pid, char * dif_name, - rina_name_t member, + char * member_name, char ** n_1_difs, ssize_t n_1_difs_size); diff --git a/include/ouroboros/rina_name.h b/include/ouroboros/rina_name.h index d802ae14..f8af00c2 100644 --- a/include/ouroboros/rina_name.h +++ b/include/ouroboros/rina_name.h @@ -27,8 +27,6 @@ typedef struct { char * ap_name; unsigned int api_id; - char * ae_name; - unsigned int aei_id; } rina_name_t; /* @@ -50,16 +48,12 @@ rina_name_t * name_create(); */ rina_name_t * name_init_from(rina_name_t * dst, const char * ap_name, - unsigned int api_id, - const char * ae_name, - unsigned int aei_id); + unsigned int api_id); /* Takes ownership of the passed parameters */ rina_name_t * name_init_with(rina_name_t * dst, char * ap_name, - unsigned int api_id, - char * ae_name, - unsigned int aei_id); + unsigned int api_id); /* * Finalize a name object, releasing all the embedded resources (without @@ -85,9 +79,7 @@ bool name_is_ok(const rina_name_t * n); #define NAME_CMP_APN 0x01 #define NAME_CMP_API 0x02 -#define NAME_CMP_AEN 0x04 -#define NAME_CMP_AEI 0x08 -#define NAME_CMP_ALL (NAME_CMP_APN | NAME_CMP_API | NAME_CMP_AEN | NAME_CMP_AEI) +#define NAME_CMP_ALL (NAME_CMP_APN | NAME_CMP_API) bool name_cmp(uint8_t flags, const rina_name_t * a, diff --git a/include/ouroboros/sockets.h b/include/ouroboros/sockets.h index 426e1006..45d7a27d 100644 --- a/include/ouroboros/sockets.h +++ b/include/ouroboros/sockets.h @@ -40,7 +40,21 @@ enum irm_msg_code { IRM_BOOTSTRAP_IPCP, IRM_ENROLL_IPCP, IRM_REG_IPCP, - IRM_UNREG_IPCP + IRM_UNREG_IPCP, + IRM_AP_REG, + IRM_AP_REG_R, + IRM_AP_UNREG, + IRM_FLOW_ACCEPT, + IRM_FLOW_ACCEPT_R, + IRM_FLOW_ALLOC_RESP, + IRM_FLOW_ALLOC, + IRM_FLOW_ALLOC_R, + IRM_FLOW_ALLOC_RES, + IRM_FLOW_ALLOC_RES_R, + IRM_FLOW_DEALLOC, + IRM_FLOW_CONTROL, + IRM_FLOW_WRITE, + IRM_FLOW_READ }; struct irm_msg { @@ -51,6 +65,14 @@ struct irm_msg { char * dif_name; char ** difs; size_t difs_size; + char * ap_name; + char * ae_name; + int fd; + int result; + struct qos_spec * qos; + int oflags; + char * dst_ap_name; + ssize_t count; }; enum ipcp_msg_code { @@ -64,7 +86,7 @@ struct ipcp_msg { enum ipcp_msg_code code; struct dif_config * conf; char * dif_name; - rina_name_t * member; + char * ap_name; char ** difs; size_t difs_size; }; @@ -72,8 +94,11 @@ struct ipcp_msg { /* Returns the full socket path of an IPCP */ char * ipcp_sock_path(pid_t pid); -int client_socket_open(char * file_name); int server_socket_open(char * file_name); +int client_socket_open(char * file_name); + +int send_irmd_msg(struct irm_msg * msg); +struct irm_msg * send_recv_irmd_msg(struct irm_msg * msg); /* Caller has to free the buffer */ buffer_t * serialize_irm_msg(struct irm_msg * msg); diff --git a/src/irmd/main.c b/src/irmd/main.c index 99896999..622b367d 100644 --- a/src/irmd/main.c +++ b/src/irmd/main.c @@ -143,7 +143,7 @@ static void enroll_ipcp(struct irm * instance, char * dif_name) { pid_t pid = 0; - rina_name_t * member; + char * member; char ** n_1_difs = NULL; ssize_t n_1_difs_size = 0; @@ -161,7 +161,7 @@ static void enroll_ipcp(struct irm * instance, n_1_difs_size = da_resolve_dap(member, n_1_difs); if (n_1_difs_size != 0) - if (ipcp_enroll(pid, dif_name, *member, + if (ipcp_enroll(pid, dif_name, member, n_1_difs, n_1_difs_size)) LOG_ERR("Could not enroll IPCP"); } @@ -231,7 +231,7 @@ int main() } count = read(cli_sockfd, buf, IRM_MSG_BUF_SIZE); - if (count) { + if (count > 0) { buffer.size = count; buffer.data = buf; msg = deserialize_irm_msg(&buffer); diff --git a/src/lib/da.c b/src/lib/da.c index ef59a409..8e7756d1 100644 --- a/src/lib/da.c +++ b/src/lib/da.c @@ -22,13 +22,13 @@ #include -rina_name_t * da_resolve_daf(char * daf_name) +char * da_resolve_daf(char * daf_name) { return NULL; } -ssize_t da_resolve_dap(rina_name_t * name, - char ** n_1_difs) +ssize_t da_resolve_dap(char * name, + char ** n_1_difs) { return 0; } diff --git a/src/lib/dev.c b/src/lib/dev.c index c072c5ef..7c0c8a15 100644 --- a/src/lib/dev.c +++ b/src/lib/dev.c @@ -24,65 +24,205 @@ #include #include +#include -int ap_reg(char * ap_name, char * ae_name, - char ** difs, size_t difs_size) -{ - LOG_MISSING; +#include - return -1; +int ap_reg(char * ap_name, + char ** difs, + size_t difs_size) +{ + struct irm_msg msg; + struct irm_msg * recv_msg = NULL; + int fd = 0; + + if (ap_name == NULL || + difs == NULL || + difs_size == 0) { + LOG_ERR("Invalid arguments"); + return -1; + } + + msg.code = IRM_AP_REG; + msg.ap_name = ap_name; + msg.difs = difs; + msg.difs_size = difs_size; + + recv_msg = send_recv_irmd_msg(&msg); + if (recv_msg == NULL) { + LOG_ERR("Failed to send and receive message"); + return -1; + } + + fd = recv_msg->fd; + free(recv_msg); + + return fd; } -int ap_unreg(char * ap_name, char * ae_name, - char ** difs, size_t difs_size) +int ap_unreg(char * ap_name, + char ** difs, + size_t difs_size) { - LOG_MISSING; - - return -1; + struct irm_msg msg; + + if (ap_name == NULL || + difs == NULL || + difs_size == 0) { + LOG_ERR("Invalid arguments"); + return -1; + } + + msg.code = IRM_AP_UNREG; + msg.ap_name = ap_name; + msg.difs = difs; + msg.difs_size = difs_size; + + if (send_irmd_msg(&msg)) { + LOG_ERR("Failed to send message to daemon"); + return -1; + } + + return 0; } -int flow_accept(int fd, char * ap_name, char * ae_name) +int flow_accept(int fd, + char * ap_name, + char * ae_name) { - LOG_MISSING; - - return -1; + struct irm_msg msg; + struct irm_msg * recv_msg = NULL; + int cli_fd = 0; + + if (ap_name == NULL) { + LOG_ERR("Invalid arguments"); + return -1; + } + + msg.code = IRM_FLOW_ACCEPT; + msg.fd = fd; + + recv_msg = send_recv_irmd_msg(&msg); + if (recv_msg == NULL) { + LOG_ERR("Failed to send and receive message"); + return -1; + } + + cli_fd = recv_msg->fd; + ap_name = recv_msg->ap_name; + if (ae_name == NULL) + ae_name = ""; + else + ae_name = recv_msg->ae_name; + free(recv_msg); + + return cli_fd; } -int flow_alloc_resp(int fd, int result) +int flow_alloc_resp(int fd, + int result) { - LOG_MISSING; + struct irm_msg msg; - return -1; + msg.code = IRM_FLOW_ALLOC_RESP; + msg.fd = fd; + msg.result = result; + + if (send_irmd_msg(&msg)) { + LOG_ERR("Failed to send message to daemon"); + return -1; + } + + return 0; } -int flow_alloc(char * dst_ap_name, char * dst_ae_name, - char * src_ap_name, char * src_ae_name, - struct qos_spec * qos, int oflags) +int flow_alloc(char * dst_ap_name, + char * src_ap_name, + char * src_ae_name, + struct qos_spec * qos, + int oflags) { - LOG_MISSING; - - return -1; + struct irm_msg msg; + struct irm_msg * recv_msg = NULL; + int fd = 0; + + if (dst_ap_name == NULL || + src_ap_name == NULL) { + LOG_ERR("Invalid arguments"); + return -1; + } + + msg.code = IRM_FLOW_ALLOC; + msg.dst_ap_name = dst_ap_name; + msg.ap_name = src_ap_name; + if (src_ae_name == NULL) + msg.ae_name = ""; + else + msg.ae_name = src_ae_name; + msg.qos = qos; + msg.oflags = oflags; + + recv_msg = send_recv_irmd_msg(&msg); + if (recv_msg == NULL) { + LOG_ERR("Failed to send and receive message"); + return -1; + } + + fd = recv_msg->fd; + free(recv_msg); + + return fd; } int flow_alloc_res(int fd) { - LOG_MISSING; + struct irm_msg msg; + struct irm_msg * recv_msg = NULL; + int result = 0; - return -1; + msg.code = IRM_FLOW_ALLOC_RES; + msg.fd = fd; + + recv_msg = send_recv_irmd_msg(&msg); + if (recv_msg == NULL) { + LOG_ERR("Failed to send and receive message"); + return -1; + } + + result = recv_msg->result; + free(recv_msg); + + return result; } int flow_dealloc(int fd) { - LOG_MISSING; + struct irm_msg msg; - return -1; + msg.code = IRM_FLOW_DEALLOC; + msg.fd = fd; + + if (send_irmd_msg(&msg)) { + LOG_ERR("Failed to send message to daemon"); + return -1; + } + + return 0; } int flow_cntl(int fd, int oflags) { - LOG_MISSING; + struct irm_msg msg; - return -1; + msg.fd = fd; + msg.oflags = oflags; + + if (send_irmd_msg(&msg)) { + LOG_ERR("Failed to send message to daemon"); + return -1; + } + + return 0; } ssize_t flow_write(int fd, diff --git a/src/lib/ipcp.c b/src/lib/ipcp.c index 6bc3c75f..53d717ba 100644 --- a/src/lib/ipcp.c +++ b/src/lib/ipcp.c @@ -83,7 +83,6 @@ pid_t ipcp_create(rina_name_t name, { pid_t pid = 0; char * api_id = NULL; - char * aei_id = NULL; size_t len = 0; char * ipcp_dir = "bin/ipcpd"; char * full_name = NULL; @@ -108,22 +107,13 @@ pid_t ipcp_create(rina_name_t name, } sprintf(api_id, "%d", name.api_id); - aei_id = malloc(n_digits(name.aei_id) + 1); - if (!aei_id) { - LOG_ERR("Failed to malloc"); - free(api_id); - exit(EXIT_FAILURE); - } - sprintf(aei_id, "%d", name.aei_id); - len += strlen(INSTALL_DIR); len += strlen(ipcp_dir); len += 2; full_name = malloc(len); - if (!full_name) { + if (full_name == NULL) { LOG_ERR("Failed to malloc"); free(api_id); - free(aei_id); exit(EXIT_FAILURE); } @@ -133,7 +123,6 @@ pid_t ipcp_create(rina_name_t name, char * argv[] = {full_name, name.ap_name, api_id, - name.ae_name, aei_id, ipcp_type, 0}; char * envp[] = {0}; @@ -144,7 +133,6 @@ pid_t ipcp_create(rina_name_t name, LOG_ERR("Failed to load IPCP daemon"); LOG_ERR("Make sure to run the installed version"); free(api_id); - free(aei_id); free(full_name); exit(EXIT_FAILURE); } @@ -226,7 +214,7 @@ int ipcp_bootstrap(pid_t pid, int ipcp_enroll(pid_t pid, char * dif_name, - rina_name_t member, + char * member_name, char ** n_1_difs, ssize_t n_1_difs_size) { @@ -240,7 +228,7 @@ int ipcp_enroll(pid_t pid, msg.code = IPCP_ENROLL; msg.dif_name = dif_name; - msg.member = &member; + msg.ap_name = member_name; msg.difs = n_1_difs; msg.difs_size = n_1_difs_size; diff --git a/src/lib/irm.c b/src/lib/irm.c index e4804074..9fd13d52 100644 --- a/src/lib/irm.c +++ b/src/lib/irm.c @@ -28,35 +28,6 @@ #include #include -static int send_irm_msg(struct irm_msg * msg) -{ - int sockfd; - buffer_t * buf; - - sockfd = client_socket_open(IRM_SOCK_PATH); - if (sockfd < 0) - return -1; - - buf = serialize_irm_msg(msg); - if (buf == NULL) { - close(sockfd); - return -1; - } - - if (write(sockfd, buf->data, buf->size) == -1) { - free(buf->data); - free(buf); - close(sockfd); - return -1; - } - - free(buf->data); - free(buf); - - close(sockfd); - return 0; -} - int irm_create_ipcp(rina_name_t name, char * ipcp_type) { @@ -74,7 +45,7 @@ int irm_create_ipcp(rina_name_t name, msg.name = &name; msg.ipcp_type = ipcp_type; - if (send_irm_msg(&msg)) { + if (send_irmd_msg(&msg)) { LOG_ERR("Failed to send message to daemon"); return -1; } @@ -94,7 +65,7 @@ int irm_destroy_ipcp(rina_name_t name) msg.code = IRM_DESTROY_IPCP; msg.name = &name; - if (send_irm_msg(&msg)) { + if (send_irmd_msg(&msg)) { LOG_ERR("Failed to send message to daemon"); return -1; } @@ -116,7 +87,7 @@ int irm_bootstrap_ipcp(rina_name_t name, msg.name = &name; msg.conf = &conf; - if (send_irm_msg(&msg)) { + if (send_irmd_msg(&msg)) { LOG_ERR("Failed to send message to daemon"); return -1; } @@ -138,7 +109,7 @@ int irm_enroll_ipcp(rina_name_t name, msg.name = &name; msg.dif_name = dif_name; - if (send_irm_msg(&msg)) { + if (send_irmd_msg(&msg)) { LOG_ERR("Failed to send message to daemon"); return -1; } @@ -162,7 +133,7 @@ int irm_reg_ipcp(rina_name_t name, msg.difs = difs; msg.difs_size = difs_size; - if (send_irm_msg(&msg)) { + if (send_irmd_msg(&msg)) { LOG_ERR("Failed to send message to daemon"); return -1; } @@ -186,7 +157,7 @@ int irm_unreg_ipcp(rina_name_t name, msg.difs = difs; msg.difs_size = difs_size; - if (send_irm_msg(&msg)) { + if (send_irmd_msg(&msg)) { LOG_ERR("Failed to send message to daemon"); return -1; } diff --git a/src/lib/rina_name.c b/src/lib/rina_name.c index 471f6fda..2dcfbb08 100644 --- a/src/lib/rina_name.c +++ b/src/lib/rina_name.c @@ -58,17 +58,13 @@ rina_name_t * name_create() tmp->ap_name = NULL; tmp->api_id = 0; - tmp->ae_name = NULL; - tmp->aei_id = 0; return tmp; } rina_name_t * name_init_from(rina_name_t * dst, const char * ap_name, - unsigned int api_id, - const char * ae_name, - unsigned int aei_id) + unsigned int api_id) { if (dst == NULL) return NULL; @@ -78,11 +74,8 @@ rina_name_t * name_init_from(rina_name_t * dst, dst->ap_name = strdup(ap_name); dst->api_id = api_id; - dst->ae_name = strdup(ae_name); - dst->aei_id = aei_id; - if (dst->ap_name == NULL || - dst->ae_name == NULL) { + if (dst->ap_name == NULL) { name_fini(dst); return NULL; } @@ -92,9 +85,7 @@ rina_name_t * name_init_from(rina_name_t * dst, rina_name_t * name_init_with(rina_name_t * dst, char * ap_name, - unsigned int api_id, - char * ae_name, - unsigned int aei_id) + unsigned int api_id) { if (dst == NULL) return NULL; @@ -104,8 +95,6 @@ rina_name_t * name_init_with(rina_name_t * dst, dst->ap_name = ap_name; dst->api_id = api_id; - dst->ae_name = ae_name; - dst->aei_id = aei_id; return dst; } @@ -119,11 +108,6 @@ void name_fini(rina_name_t * n) free(n->ap_name); n->ap_name = NULL; } - - if (n->ae_name != NULL) { - free(n->ae_name); - n->ae_name = NULL; - } } void name_destroy(rina_name_t * ptr) @@ -146,9 +130,7 @@ int name_cpy(const rina_name_t * src, res = name_init_from(dst, src->ap_name, - src->api_id, - src->ae_name, - src->aei_id); + src->api_id); if (res == NULL) return -1; @@ -182,8 +164,7 @@ rina_name_t * name_dup(const rina_name_t * src) bool name_is_ok(const rina_name_t * n) { return (n != NULL && n->ap_name != NULL && - strlen(n->ap_name) && - n->ae_name != NULL); } + strlen(n->ap_name)); } bool name_cmp(uint8_t flags, const rina_name_t * a, @@ -206,14 +187,6 @@ bool name_cmp(uint8_t flags, if (a->api_id != b->api_id) return false; - if (flags & NAME_CMP_AEN) - if (NAME_CMP_FIELD(a, b, ae_name)) - return false; - - if (flags & NAME_CMP_AEI) - if (a->aei_id != b->aei_id) - return false; - return true; } @@ -243,23 +216,13 @@ char * name_to_string(const rina_name_t * n) 1 : n_digits(n->api_id)); size += strlen(DELIMITER); - size += (n->ae_name != NULL ? - strlen(n->ae_name) : none_len); - size += strlen(DELIMITER); - - size += (n->aei_id == 0 ? - 1 : n_digits(n->aei_id)); - size += strlen(DELIMITER); - tmp = malloc(size); if (!tmp) return NULL; - if (sprintf(tmp, "%s%s%d%s%s%s%d", + if (sprintf(tmp, "%s%s%d", (n->ap_name != NULL ? n->ap_name : none), - DELIMITER, n->api_id, - DELIMITER, (n->ae_name != NULL ? n->ae_name : none), - DELIMITER, n->aei_id) + DELIMITER, n->api_id) != size - 1) { free(tmp); return NULL; @@ -276,9 +239,6 @@ rina_name_t * string_to_name(const char * s) char * tmp_ap = NULL; char * tmp_s_api = NULL; unsigned int tmp_api = 0; - char * tmp_ae = NULL; - char * tmp_s_aei = NULL; - unsigned int tmp_aei = 0; char * tmp2; if (s == NULL) @@ -293,10 +253,6 @@ rina_name_t * string_to_name(const char * s) tmp_s_api = strtok(NULL, DELIMITER); if (tmp_s_api != NULL) tmp_api = (unsigned int) strtol(tmp_s_api, &tmp2, 10); - tmp_ae = strtok(NULL, DELIMITER); - tmp_s_aei = strtok(NULL, DELIMITER); - if (tmp_s_aei != NULL) - tmp_aei = (unsigned int) strtol(tmp_s_aei, &tmp2, 10); name = name_create(); if (name == NULL) { @@ -305,8 +261,7 @@ rina_name_t * string_to_name(const char * s) return NULL; } - if (!name_init_from(name, tmp_ap, tmp_api, - tmp_ae, tmp_aei)) { + if (!name_init_from(name, tmp_ap, tmp_api)) { name_destroy(name); if (tmp1 != NULL) free(tmp1); diff --git a/src/lib/sockets.c b/src/lib/sockets.c index 425d0354..b157b628 100644 --- a/src/lib/sockets.c +++ b/src/lib/sockets.c @@ -96,6 +96,76 @@ int server_socket_open(char * file_name) return sockfd; } +int send_irmd_msg(struct irm_msg * msg) +{ + int sockfd; + buffer_t * buf; + + sockfd = client_socket_open(IRM_SOCK_PATH); + if (sockfd < 0) + return -1; + + buf = serialize_irm_msg(msg); + if (buf == NULL) { + close(sockfd); + return -1; + } + + if (write(sockfd, buf->data, buf->size) == -1) { + free(buf->data); + free(buf); + close(sockfd); + return -1; + } + + free(buf->data); + free(buf); + + close(sockfd); + return 0; +} + +struct irm_msg * send_recv_irmd_msg(struct irm_msg * msg) +{ + int sockfd; + buffer_t * buf; + ssize_t count = 0; + struct irm_msg * recv_msg = NULL; + + sockfd = client_socket_open(IRM_SOCK_PATH); + if (sockfd < 0) + return NULL; + + buf = serialize_irm_msg(msg); + if (buf == NULL) { + close(sockfd); + return NULL; + } + + if (write(sockfd, buf->data, buf->size) == -1) { + free(buf->data); + free(buf); + close(sockfd); + return NULL; + } + + count = read(sockfd, buf->data, IRM_MSG_BUF_SIZE); + if (count <= 0) { + free(buf->data); + free(buf); + close(sockfd); + return NULL; + } + + recv_msg = deserialize_irm_msg(buf); + + free(buf->data); + free(buf); + + close(sockfd); + return recv_msg; +} + char * ipcp_sock_path(pid_t pid) { char * full_name = NULL; @@ -154,10 +224,6 @@ static void ser_copy_name(rina_name_t * name, data, name->ap_name, offset); ser_copy_value(sizeof(int), data, &name->api_id, offset); - ser_copy_value(strlen(name->ae_name) + 1, - data, name->ae_name, offset); - ser_copy_value(sizeof(int), data, - &name->aei_id, offset); } static void deser_copy_value(size_t flen, @@ -217,13 +283,6 @@ static rina_name_t * deser_copy_name(uint8_t * data, deser_copy_int(data, &name->api_id, offset); - if (deser_copy_string(data, &name->ae_name, offset)) { - name_destroy(name); - return NULL; - } - - deser_copy_int(data, &name->aei_id, offset); - return name; } @@ -274,46 +333,82 @@ buffer_t * serialize_irm_msg(struct irm_msg * msg) ser_copy_value(sizeof(enum irm_msg_code), data, &msg->code, &offset); - if (!name_is_ok(msg->name)) { - LOG_ERR("Null pointer passed"); - buffer_destroy(buf); - return NULL; - } ser_copy_name(msg->name, data, &offset); switch (msg->code) { case IRM_CREATE_IPCP: - if (!msg->ipcp_type) { + if (msg->ipcp_type == NULL || + !name_is_ok(msg->name)) { LOG_ERR("Null pointer passed"); buffer_destroy(buf); return NULL; } - + ser_copy_name(msg->name, data, &offset); ser_copy_value(strlen(msg->ipcp_type) + 1, data, msg->ipcp_type, &offset); break; case IRM_DESTROY_IPCP: + if (!name_is_ok(msg->name)) { + LOG_ERR("Null pointer passed"); + buffer_destroy(buf); + return NULL; + } + ser_copy_name(msg->name, data, &offset); break; case IRM_BOOTSTRAP_IPCP: + if (!name_is_ok(msg->name)) { + LOG_ERR("Null pointer passed"); + buffer_destroy(buf); + return NULL; + } + ser_copy_name(msg->name, data, &offset); /* FIXME: Fields missing, need to define dif_conf properly */ break; case IRM_ENROLL_IPCP: - if (msg->dif_name == NULL) { + if (msg->dif_name == NULL || + !name_is_ok(msg->name)) { buffer_destroy(buf); return NULL; } + ser_copy_name(msg->name, data, &offset); ser_copy_value(strlen(msg->dif_name) + 1, data, msg->dif_name, &offset); break; case IRM_REG_IPCP: case IRM_UNREG_IPCP: - if (msg->difs == NULL || msg->difs[0] == NULL) { + if (msg->difs == NULL || + msg->difs[0] == NULL || + !name_is_ok(msg->name)) { buffer_destroy(buf); return NULL; } + ser_copy_name(msg->name, data, &offset); + + ser_copy_value(sizeof(size_t), data, &msg->difs_size, &offset); + + pos = msg->difs; + for (i = 0; i < msg->difs_size; i++) { + ser_copy_value(strlen(*pos) + 1, data, *pos, &offset); + pos++; + } + + break; + case IRM_AP_REG: + case IRM_AP_UNREG: + if (msg->ap_name == NULL || + msg->difs == NULL || + msg->difs[0] == NULL) { + LOG_ERR("Invalid arguments"); + buffer_destroy(buf); + return NULL; + } + + ser_copy_value(strlen(msg->ap_name) + 1, + data, msg->ap_name, &offset); + ser_copy_value(sizeof(size_t), data, &msg->difs_size, &offset); pos = msg->difs; @@ -322,6 +417,83 @@ buffer_t * serialize_irm_msg(struct irm_msg * msg) pos++; } + break; + case IRM_FLOW_ACCEPT: + if (msg->ap_name == NULL || + msg->ae_name == NULL) { + LOG_ERR("Invalid arguments"); + buffer_destroy(buf); + return NULL; + } + + ser_copy_value(sizeof(int), data, &msg->fd, &offset); + + ser_copy_value(strlen(msg->ap_name) + 1, + data, msg->ap_name, &offset); + + ser_copy_value(strlen(msg->ae_name) + 1, + data, msg->ae_name, &offset); + + break; + case IRM_FLOW_ALLOC_RESP: + ser_copy_value(sizeof(int), data, &msg->fd, &offset); + + ser_copy_value(sizeof(int), data, &msg->result, &offset); + + break; + case IRM_FLOW_ALLOC: + if (msg->ap_name == NULL || + msg->ae_name == NULL || + msg->dst_ap_name == NULL || + msg->qos == NULL) { + LOG_ERR("Invalid arguments"); + buffer_destroy(buf); + return NULL; + } + + ser_copy_value(strlen(msg->dst_ap_name) + 1, + data, msg->dst_ap_name, &offset); + + ser_copy_value(strlen(msg->ap_name) + 1, + data, msg->ap_name, &offset); + + ser_copy_value(strlen(msg->ae_name) + 1, + data, msg->ae_name, &offset); + + /* FIXME: Serialize qos spec here */ + + ser_copy_value(sizeof(int), data, &msg->oflags, &offset); + + break; + case IRM_FLOW_ALLOC_RES: + case IRM_FLOW_DEALLOC: + ser_copy_value(sizeof(int), data, &msg->fd, &offset); + break; + case IRM_FLOW_CONTROL: + ser_copy_value(sizeof(int), data, &msg->fd, &offset); + ser_copy_value(sizeof(int), data, &msg->oflags, &offset); + break; + case IRM_FLOW_WRITE: + LOG_MISSING; + break; + case IRM_FLOW_READ: + LOG_MISSING; + break; + case IRM_AP_REG_R: + case IRM_FLOW_ALLOC_R: + ser_copy_value(sizeof(int), data, &msg->fd, &offset); + break; + case IRM_FLOW_ACCEPT_R: + ser_copy_value(sizeof(int), data, &msg->fd, &offset); + + ser_copy_value(strlen(msg->ap_name) + 1, + data, msg->ap_name, &offset); + + ser_copy_value(strlen(msg->ae_name) + 1, + data, msg->ae_name, &offset); + break; + case IRM_FLOW_ALLOC_RES_R: + ser_copy_value(sizeof(int), data, &msg->result, &offset); break; default: LOG_ERR("Don't know that code"); @@ -355,15 +527,15 @@ struct irm_msg * deserialize_irm_msg(buffer_t * data) deser_copy_value(sizeof(enum irm_msg_code), &msg->code, data->data, &offset); - msg->name = deser_copy_name(data->data, &offset); - if (msg->name == NULL) { - LOG_ERR("Failed to reconstruct name"); - free(msg); - return NULL; - } - switch (msg->code) { case IRM_CREATE_IPCP: + msg->name = deser_copy_name(data->data, &offset); + if (msg->name == NULL) { + LOG_ERR("Failed to reconstruct name"); + free(msg); + return NULL; + } + if (deser_copy_string(data->data, &msg->ipcp_type, &offset)) { @@ -374,10 +546,31 @@ struct irm_msg * deserialize_irm_msg(buffer_t * data) break; case IRM_DESTROY_IPCP: + msg->name = deser_copy_name(data->data, &offset); + if (msg->name == NULL) { + LOG_ERR("Failed to reconstruct name"); + free(msg); + return NULL; + } + break; case IRM_BOOTSTRAP_IPCP: + msg->name = deser_copy_name(data->data, &offset); + if (msg->name == NULL) { + LOG_ERR("Failed to reconstruct name"); + free(msg); + return NULL; + } + break; case IRM_ENROLL_IPCP: + msg->name = deser_copy_name(data->data, &offset); + if (msg->name == NULL) { + LOG_ERR("Failed to reconstruct name"); + free(msg); + return NULL; + } + if (deser_copy_string(data->data, &msg->dif_name, &offset)) { @@ -389,6 +582,13 @@ struct irm_msg * deserialize_irm_msg(buffer_t * data) break; case IRM_REG_IPCP: case IRM_UNREG_IPCP: + msg->name = deser_copy_name(data->data, &offset); + if (msg->name == NULL) { + LOG_ERR("Failed to reconstruct name"); + free(msg); + return NULL; + } + deser_copy_size_t(data->data, &difs_size, &offset); msg->difs_size = difs_size; @@ -412,6 +612,22 @@ struct irm_msg * deserialize_irm_msg(buffer_t * data) } } + break; + case IRM_AP_REG: + case IRM_AP_REG_R: + case IRM_AP_UNREG: + case IRM_FLOW_ACCEPT: + case IRM_FLOW_ACCEPT_R: + case IRM_FLOW_ALLOC_RESP: + case IRM_FLOW_ALLOC: + case IRM_FLOW_ALLOC_R: + case IRM_FLOW_ALLOC_RES: + case IRM_FLOW_ALLOC_RES_R: + case IRM_FLOW_DEALLOC: + case IRM_FLOW_CONTROL: + case IRM_FLOW_WRITE: + case IRM_FLOW_READ: + LOG_MISSING; break; default: LOG_ERR("Don't know that code"); @@ -454,12 +670,13 @@ buffer_t * serialize_ipcp_msg(struct ipcp_msg * msg) ser_copy_value(strlen(msg->dif_name) + 1, data, msg->dif_name, &offset); - if (!name_is_ok(msg->member)) { + if (msg->ap_name == NULL) { LOG_ERR("Null pointer passed"); buffer_destroy(buf); return NULL; } - ser_copy_name(msg->member, data, &offset); + ser_copy_value(strlen(msg->ap_name) + 1, data, + msg->ap_name, &offset); /* All these operations end with a list of DIFs */ case IPCP_REG: @@ -520,8 +737,10 @@ struct ipcp_msg * deserialize_ipcp_msg(buffer_t * data) return NULL; } - msg->member = deser_copy_name(data->data, &offset); - if (msg->member == NULL) { + deser_copy_string(data->data, + &msg->ap_name, + &offset); + if (msg->ap_name == NULL) { LOG_ERR("Failed to reconstruct name"); free(msg->dif_name); free(msg); @@ -533,8 +752,8 @@ struct ipcp_msg * deserialize_ipcp_msg(buffer_t * data) msg->difs = malloc(sizeof(*(msg->difs)) * difs_size); if (msg->difs == NULL) { + free(msg->ap_name); free(msg->dif_name); - name_destroy(msg->member); free(msg); return NULL; } @@ -547,7 +766,7 @@ struct ipcp_msg * deserialize_ipcp_msg(buffer_t * data) free(msg->difs[j]); free(msg->dif_name); free(msg->difs); - name_destroy(msg->member); + free(msg->ap_name); free(msg); return NULL; } diff --git a/src/tools/echo/echo_client.c b/src/tools/echo/echo_client.c index 2f80a52a..196296f2 100644 --- a/src/tools/echo/echo_client.c +++ b/src/tools/echo/echo_client.c @@ -33,9 +33,8 @@ int client_main() char * message = "Client says hi!"; ssize_t count = 0; - fd = flow_alloc(SERVER_AP_NAME, NULL, - CLIENT_AP_NAME, NULL, - NULL, 0); + fd = flow_alloc(SERVER_AP_NAME, CLIENT_AP_NAME, + NULL, NULL, 0); if (fd < 0) { printf("Failed to allocate flow\n"); return -1; diff --git a/src/tools/echo/echo_server.c b/src/tools/echo/echo_server.c index f9682ab7..289f537a 100644 --- a/src/tools/echo/echo_server.c +++ b/src/tools/echo/echo_server.c @@ -34,7 +34,7 @@ void shutdown_server(int signo) { char * dif = DIF_NAME; - if (ap_unreg(SERVER_AP_NAME, NULL, &dif, 1)) { + if (ap_unreg(SERVER_AP_NAME, &dif, 1)) { printf("Failed to unregister application\n"); exit(EXIT_FAILURE); } @@ -59,7 +59,7 @@ int server_main() return -1; } - server_fd = ap_reg(SERVER_AP_NAME, NULL, &dif, 1); + server_fd = ap_reg(SERVER_AP_NAME, &dif, 1); if (server_fd < 0) { printf("Failed to register application\n"); return -1; diff --git a/src/tools/irm/irm_bootstrap_ipcp.c b/src/tools/irm/irm_bootstrap_ipcp.c index 8c64ba8f..89950069 100644 --- a/src/tools/irm/irm_bootstrap_ipcp.c +++ b/src/tools/irm/irm_bootstrap_ipcp.c @@ -32,9 +32,7 @@ static void usage() /* FIXME: Add dif_config stuff */ printf("Usage: irm bootstrap_ipcp\n" " ap \n" - " [api ]\n" - " [ae ]\n"); + " [api ]\n"); } @@ -47,8 +45,6 @@ int do_bootstrap_ipcp(int argc, char ** argv) name.ap_name = NULL; name.api_id = 0; - name.ae_name = ""; - name.aei_id = 0; while (argc > 0) { if (!parse_name(argv, &name)) { diff --git a/src/tools/irm/irm_create_ipcp.c b/src/tools/irm/irm_create_ipcp.c index 5c847988..854a15f9 100644 --- a/src/tools/irm/irm_create_ipcp.c +++ b/src/tools/irm/irm_create_ipcp.c @@ -35,8 +35,6 @@ static void usage() printf("Usage: irm create_ipcp\n" " ap \n" " [api ]\n" - " [ae ]\n" " type \n"); } @@ -47,8 +45,6 @@ int do_create_ipcp(int argc, char ** argv) name.ap_name = NULL; name.api_id = 0; - name.ae_name = ""; - name.aei_id = 0; while (argc > 0) { if (!parse_name(argv, &name)) { diff --git a/src/tools/irm/irm_destroy_ipcp.c b/src/tools/irm/irm_destroy_ipcp.c index 467d1b50..4f02f9cb 100644 --- a/src/tools/irm/irm_destroy_ipcp.c +++ b/src/tools/irm/irm_destroy_ipcp.c @@ -31,9 +31,7 @@ static void usage() { printf("Usage: irm destroy_ipcp\n" " ap \n" - " [api ]\n" - " [ae ]\n"); + " [api ]\n"); } int do_destroy_ipcp(int argc, char ** argv) @@ -42,8 +40,6 @@ int do_destroy_ipcp(int argc, char ** argv) name.ap_name = NULL; name.api_id = 0; - name.ae_name = ""; - name.aei_id = 0; while (argc > 0) { if (!parse_name(argv, &name)) { diff --git a/src/tools/irm/irm_enroll_ipcp.c b/src/tools/irm/irm_enroll_ipcp.c index 94f28f82..1dcdc919 100644 --- a/src/tools/irm/irm_enroll_ipcp.c +++ b/src/tools/irm/irm_enroll_ipcp.c @@ -32,8 +32,6 @@ static void usage() printf("Usage: irm enroll_ipcp\n" " ap \n" " [api ]\n" - " [ae ]\n" " dif \n"); } @@ -44,8 +42,6 @@ int do_enroll_ipcp(int argc, char ** argv) name.ap_name = NULL; name.api_id = 0; - name.ae_name = ""; - name.aei_id = 0; while (argc > 0) { if (!parse_name(argv, &name)) { diff --git a/src/tools/irm/irm_register_ipcp.c b/src/tools/irm/irm_register_ipcp.c index c69ad350..468ef28f 100644 --- a/src/tools/irm/irm_register_ipcp.c +++ b/src/tools/irm/irm_register_ipcp.c @@ -37,8 +37,6 @@ static void usage() printf("Usage: irm register_ipcp\n" " ap \n" " [api ]\n" - " [ae ]\n" " dif \n" " [dif ]\n" " [... (maximum %d difs)]\n", MAX_DIFS); @@ -53,8 +51,6 @@ int do_register_ipcp(int argc, char ** argv) name.ap_name = NULL; name.api_id = 0; - name.ae_name = ""; - name.aei_id = 0; while (argc > 0) { if (!parse_name(argv, &name)) { diff --git a/src/tools/irm/irm_unregister_ipcp.c b/src/tools/irm/irm_unregister_ipcp.c index a2dffc6c..0b669503 100644 --- a/src/tools/irm/irm_unregister_ipcp.c +++ b/src/tools/irm/irm_unregister_ipcp.c @@ -37,8 +37,6 @@ static void usage() printf("Usage: irm unregister_ipcp\n" " ap \n" " [api ]\n" - " [ae ]\n" " dif \n" " [dif ]\n" " [... (maximum %d difs)]\n", MAX_DIFS); @@ -53,8 +51,6 @@ int do_unregister_ipcp(int argc, char ** argv) name.ap_name = NULL; name.api_id = 0; - name.ae_name = ""; - name.aei_id = 0; while (argc > 0) { if (!parse_name(argv, &name)) { diff --git a/src/tools/irm/irm_utils.c b/src/tools/irm/irm_utils.c index 021227fd..04cb7242 100644 --- a/src/tools/irm/irm_utils.c +++ b/src/tools/irm/irm_utils.c @@ -47,10 +47,6 @@ bool parse_name(char ** argv, name->ap_name = *(argv + 1); else if (matches(*argv, "api") == 0) name->api_id = atoi(*(argv + 1)); - else if (matches(*argv, "ae") == 0) - name->ae_name = *(argv + 1); - else if (matches(*argv, "aei") == 0) - name->aei_id = atoi(*(argv + 1)); else found = false; -- cgit v1.2.3