diff options
-rw-r--r-- | include/ouroboros/da.h | 6 | ||||
-rw-r--r-- | include/ouroboros/dev.h | 12 | ||||
-rw-r--r-- | include/ouroboros/ipcp.h | 2 | ||||
-rw-r--r-- | include/ouroboros/rina_name.h | 14 | ||||
-rw-r--r-- | include/ouroboros/sockets.h | 31 | ||||
-rw-r--r-- | src/irmd/main.c | 6 | ||||
-rw-r--r-- | src/lib/da.c | 6 | ||||
-rw-r--r-- | src/lib/dev.c | 198 | ||||
-rw-r--r-- | src/lib/ipcp.c | 18 | ||||
-rw-r--r-- | src/lib/irm.c | 41 | ||||
-rw-r--r-- | src/lib/rina_name.c | 61 | ||||
-rw-r--r-- | src/lib/sockets.c | 285 | ||||
-rw-r--r-- | src/tools/echo/echo_client.c | 5 | ||||
-rw-r--r-- | src/tools/echo/echo_server.c | 4 | ||||
-rw-r--r-- | src/tools/irm/irm_bootstrap_ipcp.c | 6 | ||||
-rw-r--r-- | src/tools/irm/irm_create_ipcp.c | 4 | ||||
-rw-r--r-- | src/tools/irm/irm_destroy_ipcp.c | 6 | ||||
-rw-r--r-- | src/tools/irm/irm_enroll_ipcp.c | 4 | ||||
-rw-r--r-- | src/tools/irm/irm_register_ipcp.c | 4 | ||||
-rw-r--r-- | src/tools/irm/irm_unregister_ipcp.c | 4 | ||||
-rw-r--r-- | 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 <ouroboros/common.h> /* 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 <ouroboros/da.h> -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 <ouroboros/logs.h> #include <ouroboros/dev.h> +#include <ouroboros/sockets.h> -int ap_reg(char * ap_name, char * ae_name, - char ** difs, size_t difs_size) -{ - LOG_MISSING; +#include <stdlib.h> - 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 <ouroboros/sockets.h> #include <stdlib.h> -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; @@ -323,6 +418,83 @@ buffer_t * serialize_irm_msg(struct irm_msg * msg) } 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"); buffer_destroy(buf); @@ -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; @@ -413,6 +613,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"); free(msg); @@ -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 <application process name>\n" - " [api <application process instance>]\n" - " [ae <application entity name]\n" - " [aei <application entity instance>]\n"); + " [api <application process instance>]\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 <application process name>\n" " [api <application process instance>]\n" - " [ae <application entity name]\n" - " [aei <application entity instance>]\n" " type <ipc process 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 <application process name>\n" - " [api <application process instance>]\n" - " [ae <application entity name]\n" - " [aei <application entity instance>]\n"); + " [api <application process instance>]\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 <application process name>\n" " [api <application process instance>]\n" - " [ae <application entity name]\n" - " [aei <application entity instance>]\n" " dif <dif to enroll in>\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 <application process name>\n" " [api <application process instance>]\n" - " [ae <application entity name]\n" - " [aei <application entity instance>]\n" " dif <dif name to register with>\n" " [dif <dif name to register with>]\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 <application process name>\n" " [api <application process instance>]\n" - " [ae <application entity name]\n" - " [aei <application entity instance>]\n" " dif <dif name to unregister from>\n" " [dif <dif name to unregister from>]\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; |