summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ipcpd/CMakeLists.txt1
-rw-r--r--src/ipcpd/dt_const.h44
-rw-r--r--src/ipcpd/pci.c142
-rw-r--r--src/ipcpd/pci.h45
-rw-r--r--src/irmd/main.c97
-rw-r--r--src/lib/CMakeLists.txt2
-rw-r--r--src/lib/du_buff.c48
-rw-r--r--src/lib/irm.c107
-rw-r--r--src/lib/sockets.c319
-rw-r--r--src/tools/irm/main.c15
10 files changed, 793 insertions, 27 deletions
diff --git a/src/ipcpd/CMakeLists.txt b/src/ipcpd/CMakeLists.txt
index b16413cc..00ace9d5 100644
--- a/src/ipcpd/CMakeLists.txt
+++ b/src/ipcpd/CMakeLists.txt
@@ -7,6 +7,7 @@ include_directories(${CMAKE_BINARY_DIR}/include)
set(SOURCE_FILES
# Add source files here
main.c
+ pci.c
)
add_executable (ipcpd ${SOURCE_FILES})
diff --git a/src/ipcpd/dt_const.h b/src/ipcpd/dt_const.h
new file mode 100644
index 00000000..bc0c1466
--- /dev/null
+++ b/src/ipcpd/dt_const.h
@@ -0,0 +1,44 @@
+/*
+ * Ouroboros - Copyright (C) 2016
+ *
+ * Data Transfer Constants for the IPCP
+ *
+ * Dimitri Staessens <dimitri.staessens@intec.ugent.be>
+ * Sander Vrijders <sander.vrijders@intec.ugent.be>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#ifndef IPCP_DT_CONST_H
+#define IPCP_DT_CONST_H
+
+#include "ouroboros/common.h"
+
+struct ipcp_dtp_const {
+ /* sizes in octets */
+ uint8_t addr_size;
+ uint8_t cep_id_size;
+ uint8_t pdu_length_size;
+ uint8_t seqno_size;
+ uint8_t qos_id_size;
+ /* uint8_t ctrl_sqnum_sz; is this in the spec?? */
+};
+
+struct ipcp_dup_const {
+ uint8_t ttl_size;
+ uint8_t chk_size;
+};
+
+#endif /* IPCP_DT_CONST_H */
diff --git a/src/ipcpd/pci.c b/src/ipcpd/pci.c
new file mode 100644
index 00000000..19c42e53
--- /dev/null
+++ b/src/ipcpd/pci.c
@@ -0,0 +1,142 @@
+/*
+ * Ouroboros - Copyright (C) 2016
+ *
+ * Protocol Control Information
+ *
+ * Dimitri Staessens <dimitri.staessens@intec.ugent.be>
+ * Sander Vrijders <sander.vrijders@intec.ugent.be>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include "pci.h"
+#include <malloc.h>
+#include <errno.h>
+
+#define PCI_HEAD_SIZE(a, b) a.addr_size * 2 + \
+ a.cep_id_size * 2 + \
+ a.pdu_length_size + \
+ b.ttl_size + \
+ a.seqno_size + \
+ a.qos_id_size
+#define PCI_TAIL_SIZE(b) b.chk_size
+
+
+struct pci {
+ /* head */
+ uint8_t * dst_addr;
+ uint8_t * src_addr;
+ uint8_t * dst_cep_id;
+ uint8_t * src_cep_id;
+ uint8_t * pdu_length;
+ uint8_t * ttl;
+ uint8_t * seqno;
+ uint8_t * qos_id;
+
+ uint8_t * chk;
+
+ du_buff_t * dub;
+
+ struct ipcp_dtp_const dtpc;
+ struct ipcp_dup_const dupc;
+
+};
+
+pci_t * pci_create(du_buff_t * dub,
+ const struct ipcp_dtp_const * dtpc,
+ const struct ipcp_dup_const * dupc)
+{
+ struct pci * p;
+
+ if (dub == NULL) {
+ LOG_DBGF("Bogus input. Bugging out.");
+ return NULL;
+ }
+
+ p = malloc(sizeof *p);
+
+ if (p == NULL)
+ return NULL;
+
+ p->dub = dub;
+
+ p->dtpc = *dtpc;
+ p->dupc = *dupc;
+
+ p->dst_addr = NULL;
+ p->src_addr = NULL;
+ p->dst_cep_id = NULL;
+ p->src_cep_id = NULL;
+ p->pdu_length = NULL;
+ p->ttl = NULL;
+ p->seqno = NULL;
+ p->qos_id = NULL;
+ p->chk = NULL;
+
+ return p;
+}
+
+void pci_destroy(pci_t * pci)
+{
+ free(pci);
+}
+
+int pci_init(pci_t * pci)
+{
+ if (pci == NULL) {
+ LOG_DBGF("Bogus input. Bugging out.");
+ return -EINVAL;
+ }
+
+ uint8_t * pci_head = du_buff_head_alloc(pci->dub, PCI_HEAD_SIZE(
+ pci->dtpc,pci->dupc));
+ uint8_t * pci_tail = du_buff_tail_alloc(pci->dub, PCI_TAIL_SIZE(
+ pci->dupc));
+
+ if (pci_head == NULL) {
+ LOG_DBG("Failed to allocate space for PCI at head.");
+ return -ENOBUFS;
+ }
+
+ if (pci_tail == NULL) {
+ LOG_DBG("Failed to allocate space for PCI at tail.");
+ return -ENOBUFS;
+ }
+
+ pci->dst_addr = pci_head;
+ pci->src_addr = (pci_head += pci->dtpc.addr_size);
+ pci->dst_cep_id = (pci_head += pci->dtpc.addr_size);
+ pci->src_cep_id = (pci_head += pci->dtpc.cep_id_size);
+ pci->pdu_length = (pci_head += pci->dtpc.cep_id_size);
+ pci->ttl = (pci_head += pci->dtpc.pdu_length_size);
+ pci->seqno = (pci_head += pci->dupc.ttl_size);
+ pci->qos_id = (pci_head += pci->dtpc.seqno_size);
+
+ pci->chk = (pci_tail);
+
+ return 0;
+}
+
+void pci_release(pci_t * pci)
+{
+ if (pci == NULL)
+ return;
+
+ if (pci->dub == NULL)
+ return;
+
+ du_buff_head_release(pci->dub, PCI_HEAD_SIZE(pci->dtpc, pci->dupc));
+ du_buff_tail_release(pci->dub, PCI_TAIL_SIZE(pci->dupc));
+}
diff --git a/src/ipcpd/pci.h b/src/ipcpd/pci.h
new file mode 100644
index 00000000..c7095bbd
--- /dev/null
+++ b/src/ipcpd/pci.h
@@ -0,0 +1,45 @@
+/*
+ * Ouroboros - Copyright (C) 2016
+ *
+ * Protocol Control Information
+ *
+ * Dimitri Staessens <dimitri.staessens@intec.ugent.be>
+ * Sander Vrijders <sander.vrijders@intec.ugent.be>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#ifndef OUROBOROS_IPCP_PCI_H
+#define OUROBOROS_IPCP_PCI_H
+
+#define OUROBOROS_PREFIX "ipcp/pci"
+
+#include "ouroboros/du_buff.h"
+#include "ouroboros/logs.h"
+#include "dt_const.h"
+
+struct pci;
+
+typedef struct pci pci_t;
+
+pci_t * pci_create(du_buff_t * dub,
+ const struct ipcp_dtp_const * dtpc,
+ const struct ipcp_dup_const * dupc);
+void pci_destroy(pci_t * pci);
+
+int pci_init(pci_t * pci);
+void pci_release(pci_t * pci);
+
+#endif /* OUROBOROS_IPCP_PCI_H */
diff --git a/src/irmd/main.c b/src/irmd/main.c
index 8ab071e0..137b2b61 100644
--- a/src/irmd/main.c
+++ b/src/irmd/main.c
@@ -1,10 +1,103 @@
-#define OUROBOROS_PREFIX "irm"
+/*
+ * Ouroboros - Copyright (C) 2016
+ *
+ * The IPC Resource Manager
+ *
+ * Sander Vrijders <sander.vrijders@intec.ugent.be>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#define OUROBOROS_PREFIX "irmd"
#include <ouroboros/logs.h>
+#include <ouroboros/common.h>
+#include <ouroboros/sockets.h>
+#include <ouroboros/irm.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <stdlib.h>
+#include <errno.h>
+
+#define BUF_SIZE 256
+
+
+static void create_ipcp(rina_name_t * name,
+ char * ipcp_type)
+{
+ LOG_DBG("AP name is %s", name->ap_name);
+ LOG_DBG("AP instance id is %d", name->api_id);
+ LOG_DBG("AE name is %s", name->ae_name);
+ LOG_DBG("AE instance id is %d", name->aei_id);
+
+ LOG_DBG("IPCP type is %s", ipcp_type);
+
+ LOG_MISSING;
+}
int main()
{
- LOG_DBG("Test of the IRM");
+ int sockfd;
+ uint8_t * buf;
+
+ sockfd = server_socket_open(IRM_SOCK_PATH);
+ if (sockfd < 0)
+ return -1;
+
+ buf = malloc(sizeof(*buf) * BUF_SIZE);
+ if (buf == NULL) {
+ LOG_ERR("Cannot allocate memory");
+ return -ENOMEM;
+ }
+
+ while (true) {
+ int cli_sockfd;
+ struct irm_msg * msg;
+ ssize_t count;
+ buffer_t buffer;
+
+ cli_sockfd = accept(sockfd, 0, 0);
+ if (cli_sockfd < 0) {
+ LOG_ERR("Cannot accept new connection");
+ continue;
+ }
+
+ count = read(cli_sockfd, buf, BUF_SIZE);
+ if (count) {
+ buffer.size = count;
+ buffer.data = buf;
+ msg = deserialize_irm_msg(&buffer);
+ if (msg == NULL)
+ continue;
+
+ LOG_DBG("Got message code %d", msg->code);
+ switch (msg->code) {
+ case IRM_CREATE_IPCP:
+ create_ipcp(msg->msgs.create_ipcp.name,
+ msg->msgs.create_ipcp.ipcp_type);
+ break;
+ default:
+ LOG_ERR("Don't know that message code");
+ break;
+ }
+ }
+
+ close(cli_sockfd);
+ }
+
+ free(buf);
return 0;
}
diff --git a/src/lib/CMakeLists.txt b/src/lib/CMakeLists.txt
index 9a6f1946..2e0d6b6b 100644
--- a/src/lib/CMakeLists.txt
+++ b/src/lib/CMakeLists.txt
@@ -9,6 +9,8 @@ set(SOURCE_FILES
bitmap.c
cdap.c
du_buff.c
+ irm.c
+ sockets.c
)
add_library(ouroboros SHARED ${SOURCE_FILES})
diff --git a/src/lib/du_buff.c b/src/lib/du_buff.c
index ea6206f9..bfb33339 100644
--- a/src/lib/du_buff.c
+++ b/src/lib/du_buff.c
@@ -43,8 +43,8 @@ struct buffer {
struct du_buff {
struct buffer * buffer;
size_t size;
- size_t du_start;
- size_t du_end;
+ size_t du_head;
+ size_t du_tail;
};
void buffer_destroy(struct buffer * buf)
@@ -251,10 +251,10 @@ du_buff_t * du_buff_create(size_t size)
return NULL;
}
- dub->buffer = NULL;
- dub->size = size;
- dub->du_start = 0;
- dub->du_end = 0;
+ dub->buffer = NULL;
+ dub->size = size;
+ dub->du_head = 0;
+ dub->du_tail = 0;
return dub;
}
@@ -294,44 +294,44 @@ int du_buff_init(du_buff_t * dub,
if (dub->buffer == NULL)
return -ENOMEM;
- dub->du_start = start;
- dub->du_end = start + len;
+ dub->du_head = start;
+ dub->du_tail = start + len;
return buffer_copy_data(dub->buffer, start, data, len);
}
-int du_buff_head_alloc(du_buff_t * dub, size_t size)
+uint8_t * du_buff_head_alloc(du_buff_t * dub, size_t size)
{
if (dub == NULL) {
LOG_DBGF("Bogus input, bugging out.");
- return -EINVAL;
+ return NULL;
}
- if (dub->du_start - size < 0) {
+ if (dub->du_head - size < 0) {
LOG_WARN("Failed to allocate PCI headspace");
- return -ENOBUFS;
+ return NULL;
}
- dub->du_start -= size;
+ dub->du_head -= size;
- return 0;
+ return (buffer_seek_pos(dub->buffer, dub->du_head));
}
-int du_buff_tail_alloc(du_buff_t * dub, size_t size)
+uint8_t * du_buff_tail_alloc(du_buff_t * dub, size_t size)
{
if (dub == NULL) {
LOG_DBGF("Bogus input, bugging out.");
- return -EINVAL;
+ return NULL;
}
- if (dub->du_end + size >= dub->size) {
+ if (dub->du_tail + size >= dub->size) {
LOG_WARN("Failed to allocate PCI tailspace");
- return -ENOBUFS;
+ return NULL;
}
- dub->du_end += size;
+ dub->du_tail += size;
- return 0;
+ return (buffer_seek_pos(dub->buffer, dub->du_tail));
}
int du_buff_head_release(du_buff_t * dub, size_t size)
@@ -341,12 +341,12 @@ int du_buff_head_release(du_buff_t * dub, size_t size)
return -EINVAL;
}
- if (size > dub->du_end - dub->du_start) {
+ if (size > dub->du_tail - dub->du_head) {
LOG_WARN("Tried to release beyond sdu boundary");
return -EOVERFLOW;
}
- dub->du_start += size;
+ dub->du_head += size;
/* FIXME: copy some random crap to the buffer for security */
@@ -360,12 +360,12 @@ int du_buff_tail_release(du_buff_t * dub, size_t size)
return -EINVAL;
}
- if (size > dub->du_end - dub->du_start) {
+ if (size > dub->du_tail - dub->du_head) {
LOG_WARN("Tried to release beyond sdu boundary");
return -EOVERFLOW;
}
- dub->du_end -= size;
+ dub->du_tail -= size;
/* FIXME: copy some random crap to the buffer for security */
diff --git a/src/lib/irm.c b/src/lib/irm.c
new file mode 100644
index 00000000..69a98039
--- /dev/null
+++ b/src/lib/irm.c
@@ -0,0 +1,107 @@
+/*
+ * Ouroboros - Copyright (C) 2016
+ *
+ * The API to instruct the IRM
+ *
+ * Sander Vrijders <sander.vrijders@intec.ugent.be>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#define OUROBOROS_PREFIX "libouroboros-irm"
+
+#include <ouroboros/irm.h>
+#include <ouroboros/common.h>
+#include <ouroboros/logs.h>
+#include <ouroboros/sockets.h>
+
+int irm_create_ipcp(rina_name_t name,
+ char * ipcp_type)
+{
+ int sockfd;
+ struct irm_msg msg;
+ buffer_t * buf;
+
+ if (ipcp_type == NULL)
+ return -1;
+
+ sockfd = client_socket_open(IRM_SOCK_PATH);
+ if (sockfd < 0)
+ return -1;
+
+ msg.code = IRM_CREATE_IPCP;
+ msg.msgs.create_ipcp.name = &name;
+ msg.msgs.create_ipcp.ipcp_type = ipcp_type;
+
+ buf = serialize_irm_msg(&msg);
+ if (buf == NULL) {
+ close(sockfd);
+ return -1;
+ }
+
+ if (write(sockfd, buf->data, buf->size) == -1) {
+ close(sockfd);
+ return -1;
+ }
+
+ close(sockfd);
+ return 0;
+}
+
+int irm_destroy_ipcp(int ipcp_id)
+{
+
+ return 0;
+}
+
+int irm_bootstrap_ipcp(int ipcp_id,
+ struct dif_info info)
+{
+
+ return 0;
+}
+
+int irm_enroll_ipcp(int ipcp_id,
+ char * dif_name)
+{
+
+ return 0;
+}
+
+int irm_reg_ipcp(int ipcp_id,
+ char ** difs)
+{
+
+ return 0;
+}
+
+int irm_unreg_ipcp(int ipcp_id,
+ char ** difs)
+{
+
+ return 0;
+}
+
+char ** irm_list_ipcps()
+{
+
+ return 0;
+}
+
+char ** irm_list_ipcp_types()
+{
+
+ return 0;
+}
diff --git a/src/lib/sockets.c b/src/lib/sockets.c
new file mode 100644
index 00000000..ef4b3a47
--- /dev/null
+++ b/src/lib/sockets.c
@@ -0,0 +1,319 @@
+/*
+ * Ouroboros - Copyright (C) 2016
+ *
+ * The sockets layer to communicate between daemons
+ *
+ * Sander Vrijders <sander.vrijders@intec.ugent.be>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#define OUROBOROS_PREFIX "libouroboros-sockets"
+
+#include <ouroboros/logs.h>
+#include <ouroboros/common.h>
+#include <ouroboros/sockets.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <sys/stat.h>
+#include <string.h>
+#include <malloc.h>
+
+#define BUFFER_SIZE 256
+
+int client_socket_open(char * file_name)
+{
+ int sockfd;
+ struct sockaddr_un serv_addr;
+
+ sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
+ if (sockfd < 0) {
+ LOG_ERR("Failed to open socket");
+ return -1;
+ }
+
+ serv_addr.sun_family = AF_UNIX;
+ sprintf(serv_addr.sun_path, "%s", file_name);
+
+ if (connect(sockfd,
+ (struct sockaddr *) &serv_addr,
+ sizeof(serv_addr))) {
+ LOG_ERR("Failed to connect to server");
+ return -1;
+ }
+
+ return sockfd;
+}
+
+int server_socket_open(char * file_name)
+{
+ int sockfd;
+ struct sockaddr_un serv_addr;
+ struct stat sb;
+
+ if (!stat(file_name, &sb)) {
+ /* File exists */
+ if (unlink(file_name)) {
+ LOG_ERR("Failed to unlink filename: %s",
+ strerror(errno));
+ return -1;
+ }
+ }
+
+ sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
+ if (sockfd < 0) {
+ LOG_ERR("Failed to open socket");
+ return -1;
+ }
+
+ serv_addr.sun_family = AF_UNIX;
+ sprintf(serv_addr.sun_path, "%s", file_name);
+
+ if (bind(sockfd,
+ (struct sockaddr *) &serv_addr,
+ sizeof(serv_addr))) {
+ LOG_ERR("Failed to bind socket");
+ return -1;
+ }
+
+ if (listen(sockfd, 0)) {
+ LOG_ERR("Failed to listen to socket");
+ return -1;
+ }
+
+ 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 int deser_copy_string(uint8_t * data,
+ char ** dst,
+ int * offset)
+{
+ size_t flen;
+
+ flen = serialized_string_len(data + *offset);
+ *dst = malloc(sizeof(**dst) * (flen + 1));
+ if (*dst == NULL)
+ return -1;
+ deser_copy_value(flen, *dst, data, offset);
+ return 0;
+}
+
+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));
+ if (buf == NULL)
+ return NULL;
+
+ buf->data = malloc(BUFFER_SIZE);
+ if (buf->data == NULL) {
+ free(buf);
+ return NULL;
+ }
+
+ 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 == NULL ||
+ data->data == NULL) {
+ 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 == NULL) {
+ 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)));
+ if (!msg->msgs.create_ipcp.name) {
+ LOG_ERR("Failed to alloc memory");
+ free(msg);
+ return NULL;
+ }
+
+ if (deser_copy_string(data->data,
+ &msg->msgs.create_ipcp.name->ap_name,
+ &offset)) {
+ free(msg->msgs.create_ipcp.name);
+ free(msg);
+ return NULL;
+ }
+
+ deser_copy_int(data->data,
+ &msg->msgs.create_ipcp.name->api_id,
+ &offset);
+
+ if (deser_copy_string(data->data,
+ &msg->msgs.create_ipcp.name->ae_name,
+ &offset)) {
+ free(msg->msgs.create_ipcp.name->ap_name);
+ free(msg->msgs.create_ipcp.name);
+ free(msg);
+ return NULL;
+ }
+
+ deser_copy_int(data->data,
+ &msg->msgs.create_ipcp.name->aei_id,
+ &offset);
+
+ if (deser_copy_string(data->data,
+ &msg->msgs.create_ipcp.ipcp_type,
+ &offset)) {
+ free(msg->msgs.create_ipcp.name->ae_name);
+ free(msg->msgs.create_ipcp.name->ap_name);
+ free(msg->msgs.create_ipcp.name);
+ free(msg);
+ return NULL;
+ }
+ break;
+ default:
+ LOG_ERR("Don't know that code");
+ free(msg);
+ return NULL;
+ }
+
+ return msg;
+}
diff --git a/src/tools/irm/main.c b/src/tools/irm/main.c
index bad1000e..470a8166 100644
--- a/src/tools/irm/main.c
+++ b/src/tools/irm/main.c
@@ -23,10 +23,23 @@
#define OUROBOROS_PREFIX "irm"
#include <ouroboros/logs.h>
+#include <ouroboros/common.h>
+#include <ouroboros/irm.h>
int main () {
+ char * ap_name = "test";
+ char * ipcp_type = "normal-ipcp";
+ rina_name_t name;
+ name.ap_name = ap_name;
+ name.api_id = 1;
+ name.ae_name = "";
+ name.aei_id = 0;
+
+ if (irm_create_ipcp(name, ipcp_type)) {
+ LOG_ERR("Failed to create IPCP");
+ return -1;
+ }
- LOG_DBG("Test of the IRM tool");
return 0;
}