diff options
-rw-r--r-- | CMakeLists.txt | 5 | ||||
-rw-r--r-- | include/ouroboros/common.h | 35 | ||||
-rw-r--r-- | include/ouroboros/du_buff.h | 4 | ||||
-rw-r--r-- | include/ouroboros/sockets.h | 54 | ||||
-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 |
14 files changed, 877 insertions, 41 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 84a42eb9..a1f19cf3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.0.0) +cmake_minimum_required(VERSION 2.8.12.2) set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake") #set(CMAKE_VERBOSE_MAKEFILE ON) @@ -34,7 +34,7 @@ test_and_set_c_compiler_flag_global(-std=c89) test_and_set_c_compiler_flag_global(-Wall) test_and_set_c_compiler_flag_global(-Werror) test_and_set_c_compiler_flag_global(-Wundef) -test_and_set_c_compiler_flag_global(-fmax-errors=1) +test_and_set_c_compiler_flag_global(-fmax-errors=5) configure_file( "${CMAKE_CURRENT_SOURCE_DIR}/ouroboros.pc.in" @@ -54,6 +54,7 @@ if (CMAKE_BUILD_TYPE MATCHES Debug) MACRO_ADD_COMPILE_FLAGS(irmd -DCONFIG_OUROBOROS_DEBUG) MACRO_ADD_COMPILE_FLAGS(dad -DCONFIG_OUROBOROS_DEBUG) MACRO_ADD_COMPILE_FLAGS(irm -DCONFIG_OUROBOROS_DEBUG) + MACRO_ADD_COMPILE_FLAGS(ouroboros -DCONFIG_OUROBOROS_DEBUG) endif (CMAKE_BUILD_TYPE MATCHES Debug) #include(FeatureSummary) diff --git a/include/ouroboros/common.h b/include/ouroboros/common.h index 09900a1f..36f6171c 100644 --- a/include/ouroboros/common.h +++ b/include/ouroboros/common.h @@ -30,30 +30,45 @@ typedef uint32_t port_id_t; -/* FIXME: To be moved into a separate file */ typedef struct { - char * data; + uint8_t * data; size_t size; } buffer_t; typedef struct { char * ap_name; - int api_id; + int api_id; char * ae_name; - int aei_id; + int aei_id; } rina_name_t; /* FIXME: To be extended to have all QoS params */ struct qos_spec { - char * name; - char * dif_name; - double delay; - double jitter; + uint32_t delay; + uint32_t jitter; +}; + +struct dt_const { + /* dt field sizes in octets */ + uint8_t addr_size; + uint8_t cep_id_size; + uint8_t pdu_length_size; + uint8_t qos_id_size; + uint8_t seqno_size; + /* uint8_t ctrl_sqnum_sz; is this in the spec?? */ + + /* constants for dup */ + uint8_t ttl_size; + uint8_t chk_size; }; /* FIXME: What should be configurable in the DIF? */ struct dif_info { - int cep_id_size; + /* values, octets */ + uint32_t min_pdu_size; + uint32_t max_pdu_size; + + struct dt_const dtc; }; -#endif +#endif /* OUROBOROS_COMMON_H */ diff --git a/include/ouroboros/du_buff.h b/include/ouroboros/du_buff.h index 92d0609d..66904ca7 100644 --- a/include/ouroboros/du_buff.h +++ b/include/ouroboros/du_buff.h @@ -39,8 +39,8 @@ int du_buff_init(du_buff_t * dub, uint8_t * data, size_t len); -int du_buff_head_alloc(du_buff_t * dub, size_t size); -int du_buff_tail_alloc(du_buff_t * dub, size_t size); +uint8_t * du_buff_head_alloc(du_buff_t * dub, size_t size); +uint8_t * du_buff_tail_alloc(du_buff_t * dub, size_t size); int du_buff_head_release(du_buff_t * dub, size_t size); int du_buff_tail_release(du_buff_t * dub, size_t size); diff --git a/include/ouroboros/sockets.h b/include/ouroboros/sockets.h new file mode 100644 index 00000000..fe7ddb28 --- /dev/null +++ b/include/ouroboros/sockets.h @@ -0,0 +1,54 @@ +/* + * 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. + */ + +#ifndef OUROBOROS_SOCKETS_H +#define OUROBOROS_SOCKETS_H + +#define IRM_SOCK_PATH "/tmp/irm_sock" + +enum irm_msg_code { + IRM_CREATE_IPCP, + IRM_DESTROY_IPCP, + IRM_BOOTSTRAP_IPCP, + IRM_ENROLL_IPCP, + IRM_REG_IPCP, + IRM_UNREG_IPCP, + IRM_LIST_IPCPS +}; + +struct irm_msg { + enum irm_msg_code code; + union { + struct { + rina_name_t * name; + char * ipcp_type; + } create_ipcp; + } msgs; +}; + +int client_socket_open(char * file_name); +int server_socket_open(char * file_name); + +buffer_t * serialize_irm_msg(struct irm_msg * msg); +struct irm_msg * deserialize_irm_msg(buffer_t * data); + +#endif 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; } |