diff options
Diffstat (limited to 'src/lib')
-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 |
6 files changed, 441 insertions, 168 deletions
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; } |