diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/ipcpd/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | src/ipcpd/dt_const.h | 44 | ||||
| -rw-r--r-- | src/ipcpd/pci.c | 142 | ||||
| -rw-r--r-- | src/ipcpd/pci.h | 45 | ||||
| -rw-r--r-- | src/irmd/main.c | 97 | ||||
| -rw-r--r-- | src/lib/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | src/lib/du_buff.c | 48 | ||||
| -rw-r--r-- | src/lib/irm.c | 107 | ||||
| -rw-r--r-- | src/lib/sockets.c | 319 | ||||
| -rw-r--r-- | src/tools/irm/main.c | 15 | 
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;  } | 
