From 63633c57b1e2573890fa627dd63f7c79ee5777b8 Mon Sep 17 00:00:00 2001 From: Sander Vrijders Date: Thu, 25 Feb 2016 19:14:26 +0100 Subject: lib, irmd, tools: Support to create IPCPs Provides the initial support to create IPCPs via a command-line tool. It extends the socket layer with a message that is sent over a socket to the irmd when the irm_create_ipcp library function is called from a program. --- src/lib/irm.c | 14 ++-- src/lib/sockets.c | 193 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 203 insertions(+), 4 deletions(-) (limited to 'src/lib') diff --git a/src/lib/irm.c b/src/lib/irm.c index da229d3e..1af8ed2c 100644 --- a/src/lib/irm.c +++ b/src/lib/irm.c @@ -31,7 +31,8 @@ int irm_create_ipcp(rina_name_t name, char * ipcp_type) { int sockfd; - struct irm_msg_sock msg; + struct irm_msg msg; + buffer_t * buf; if (!ipcp_type) return -1; @@ -41,10 +42,15 @@ int irm_create_ipcp(rina_name_t name, return -1; msg.code = IRM_CREATE_IPCP; - msg.irm_msg.create_ipcp.name = name; - msg.irm_msg.create_ipcp.ipcp_type = ipcp_type; + msg.msgs.create_ipcp.name = &name; + msg.msgs.create_ipcp.ipcp_type = ipcp_type; + + buf = serialize_irm_msg(&msg); + if (!buf) + return -1; + + write(sockfd, buf->data, buf->size); - write(sockfd, &msg, sizeof(msg)); close(sockfd); return 0; diff --git a/src/lib/sockets.c b/src/lib/sockets.c index 8917f55a..9985cd56 100644 --- a/src/lib/sockets.c +++ b/src/lib/sockets.c @@ -29,6 +29,9 @@ #include #include #include +#include + +#define BUFFER_SIZE 256 int client_socket_open(char * file_name) { @@ -92,3 +95,193 @@ int server_socket_open(char * file_name) return sockfd; } + +static int serialized_string_len(uint8_t * data) +{ + uint8_t * seek = data; + + while (*seek != '\0') + seek++; + + return seek - data + 1; +} + +static void ser_copy_value(size_t flen, + void * dst, + void * src, + int * offset) +{ + memcpy(dst + *offset, src, flen); + *offset += flen; +} + +static void deser_copy_value(size_t flen, + void * dst, + void * src, + int * offset) +{ + memcpy(dst, src + *offset, flen); + *offset += flen; +} + +static void deser_copy_string(uint8_t * data, + char ** dst, + int * offset) +{ + size_t flen; + + flen = serialized_string_len(data + *offset); + *dst = malloc(flen + 1); + deser_copy_value(flen, *dst, data, offset); +} + +static void deser_copy_int(uint8_t * data, + int * dst, + int * offset) +{ + *dst = 0; + deser_copy_value(sizeof(int), dst, data, offset); +} + +static void deser_copy_enum(uint8_t * data, + enum irm_msg_code * dst, + int * offset) +{ + *dst = 0; + deser_copy_value(sizeof(enum irm_msg_code), dst, data, offset); +} + +buffer_t * serialize_irm_msg(struct irm_msg * msg) +{ + buffer_t * buf; + uint8_t * data; + int offset = 0; + int i; + char buffer[BUFFER_SIZE]; + + buf = malloc(sizeof(buf)); + buf->data = malloc(BUFFER_SIZE); + data = buf->data; + + ser_copy_value(sizeof(enum irm_msg_code), + data, + &msg->code, + &offset); + + switch (msg->code) { + case IRM_CREATE_IPCP: + if (!msg->msgs.create_ipcp.name || + !msg->msgs.create_ipcp.name->ap_name || + !msg->msgs.create_ipcp.name->ae_name || + !msg->msgs.create_ipcp.ipcp_type) { + LOG_ERR("Null pointer passed"); + free(buf->data); + free(buf); + return NULL; + } + + ser_copy_value(strlen(msg->msgs.create_ipcp.name->ap_name) + 1, + data, + msg->msgs.create_ipcp.name->ap_name, + &offset); + + ser_copy_value(sizeof(int), + data, + &msg->msgs.create_ipcp.name->api_id, + &offset); + + ser_copy_value(strlen(msg->msgs.create_ipcp.name->ae_name) + 1, + data, + msg->msgs.create_ipcp.name->ae_name, + &offset); + + ser_copy_value(sizeof(int), + data, + &msg->msgs.create_ipcp.name->aei_id, + &offset); + + ser_copy_value(strlen(msg->msgs.create_ipcp.ipcp_type) + 1, + data, + msg->msgs.create_ipcp.ipcp_type, + &offset); + break; + default: + LOG_ERR("Don't know that code"); + free(buf->data); + free(buf); + return NULL; + } + + buf->size = offset; + + for (i = 0; i < buf->size; i++) { + if (i > 0) sprintf(buffer + strlen(buffer), ":"); + sprintf(buffer + strlen(buffer), "%02X", data[i]); + } + LOG_DBGF("Serialized buffer to %s", buffer); + + return buf; +} + +struct irm_msg * deserialize_irm_msg(buffer_t * data) +{ + struct irm_msg * msg; + char buffer[BUFFER_SIZE]; + int i; + int offset = 0; + + if (!data || !data->data) { + LOG_ERR("Got a null pointer"); + return NULL; + } + + memset(buffer, 0, sizeof(buffer)); + for (i = 0; i < data->size; i++) { + if (i > 0) sprintf(buffer + strlen(buffer), ":"); + sprintf(buffer + strlen(buffer), "%02X", data->data[i]); + } + LOG_DBGF("Got buffer %s", buffer); + + msg = malloc(sizeof(msg)); + if (!msg) { + LOG_ERR("Failed to allocate memory"); + return NULL; + } + + deser_copy_enum(data->data, + &msg->code, + &offset); + + switch (msg->code) { + case IRM_CREATE_IPCP: + msg->msgs.create_ipcp.name = + malloc(sizeof(msg->msgs.create_ipcp.name)); + + deser_copy_string(data->data, + &msg->msgs.create_ipcp.name->ap_name, + &offset); + + deser_copy_int(data->data, + &msg->msgs.create_ipcp.name->api_id, + &offset); + + deser_copy_string(data->data, + &msg->msgs.create_ipcp.name->ae_name, + &offset); + + deser_copy_int(data->data, + &msg->msgs.create_ipcp.name->aei_id, + &offset); + + deser_copy_string(data->data, + &msg->msgs.create_ipcp.ipcp_type, + &offset); + break; + default: + LOG_ERR("Don't know that code"); + free(msg); + return NULL; + } + + return msg; +} -- cgit v1.2.3