diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/ipcpd/CMakeLists.txt | 1 | ||||
-rw-r--r-- | src/ipcpd/flow.c | 54 | ||||
-rw-r--r-- | src/ipcpd/flow.h | 9 | ||||
-rw-r--r-- | src/ipcpd/local/main.c | 2 | ||||
-rw-r--r-- | src/lib/dev.c | 84 | ||||
-rw-r--r-- | src/lib/instance_name.c | 4 | ||||
-rw-r--r-- | src/lib/irm.c | 17 |
7 files changed, 71 insertions, 100 deletions
diff --git a/src/ipcpd/CMakeLists.txt b/src/ipcpd/CMakeLists.txt index 49bd49f2..bb482ed9 100644 --- a/src/ipcpd/CMakeLists.txt +++ b/src/ipcpd/CMakeLists.txt @@ -1,6 +1,5 @@ set(IPCP_SOURCES # Add source files here - ${CMAKE_CURRENT_SOURCE_DIR}/flow.c ${CMAKE_CURRENT_SOURCE_DIR}/ipcp.c ${CMAKE_CURRENT_SOURCE_DIR}/ipcp-data.c ) diff --git a/src/ipcpd/flow.c b/src/ipcpd/flow.c deleted file mode 100644 index 4ca61341..00000000 --- a/src/ipcpd/flow.c +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Ouroboros - Copyright (C) 2016 - * - * Flows - * - * Dimitri Staessens <dimitri.staessens@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 <stdlib.h> -#include "flow.h" - -#define OUROBOROS_PREFIX "ipcpd/flow" - -#include <ouroboros/logs.h> -#include <ouroboros/flow.h> - -struct flow * flow_create(int port_id) -{ - struct flow * flow = malloc(sizeof *flow); - if (flow == NULL) { - LOG_DBGF("Could not malloc flow."); - return NULL; - } - - INIT_LIST_HEAD(&flow->list); - - flow->port_id = port_id; - flow->state = FLOW_NULL; - - pthread_mutex_init(&flow->lock, NULL); - - return flow; -} - -void flow_destroy(struct flow * flow) -{ - if (flow == NULL) - return; - free(flow); -} diff --git a/src/ipcpd/flow.h b/src/ipcpd/flow.h index 6f50698e..e27882e2 100644 --- a/src/ipcpd/flow.h +++ b/src/ipcpd/flow.h @@ -24,21 +24,14 @@ #define OUROBOROS_IPCP_FLOW_H #include <ouroboros/list.h> -#include <ouroboros/flow.h> +#include <ouroboros/common.h> #include <ouroboros/shm_ap_rbuff.h> #include <pthread.h> struct flow { - struct list_head list; - int port_id; struct shm_ap_rbuff * rb; enum flow_state state; - - pthread_mutex_t lock; }; -struct flow * flow_create(int port_id); -void flow_destroy(struct flow * flow); - #endif /* OUROBOROS_FLOW_H */ diff --git a/src/ipcpd/local/main.c b/src/ipcpd/local/main.c index 1e033a21..06e2b0a4 100644 --- a/src/ipcpd/local/main.c +++ b/src/ipcpd/local/main.c @@ -31,7 +31,7 @@ #include <ouroboros/dif_config.h> #include <ouroboros/sockets.h> #include <ouroboros/bitmap.h> -#include <ouroboros/flow.h> +#include <ouroboros/common.h> #include <ouroboros/dev.h> #define OUROBOROS_PREFIX "ipcpd/local" diff --git a/src/lib/dev.c b/src/lib/dev.c index 1725cca3..d0f29ade 100644 --- a/src/lib/dev.c +++ b/src/lib/dev.c @@ -23,6 +23,7 @@ #define OUROBOROS_PREFIX "libouroboros-dev" #include <ouroboros/config.h> +#include <ouroboros/errno.h> #include <ouroboros/logs.h> #include <ouroboros/dev.h> #include <ouroboros/sockets.h> @@ -62,13 +63,13 @@ int ap_init(char * ap_name) _ap_instance = malloc(sizeof(struct ap_data)); if (_ap_instance == NULL) { - return -1; + return -ENOMEM; } _ap_instance->api = instance_name_create(); if (_ap_instance->api == NULL) { free(_ap_instance); - return -1; + return -ENOMEM; } if (instance_name_init_from(_ap_instance->api, @@ -76,14 +77,14 @@ int ap_init(char * ap_name) getpid()) == NULL) { instance_name_destroy(_ap_instance->api); free(_ap_instance); - return -1; + return -ENOMEM; } _ap_instance->fds = bmp_create(AP_MAX_FLOWS, 0); if (_ap_instance->fds == NULL) { instance_name_destroy(_ap_instance->api); free(_ap_instance); - return -1; + return -ENOMEM; } _ap_instance->dum = shm_du_map_open(); @@ -91,7 +92,7 @@ int ap_init(char * ap_name) instance_name_destroy(_ap_instance->api); bmp_destroy(_ap_instance->fds); free(_ap_instance); - return -1; + return -ENOSHM; } _ap_instance->rb = shm_ap_rbuff_create(); @@ -100,7 +101,7 @@ int ap_init(char * ap_name) shm_du_map_close(_ap_instance->dum); bmp_destroy(_ap_instance->fds); free(_ap_instance); - return -1; + return -ENOSHM; } for (i = 0; i < AP_MAX_FLOWS; ++i) { @@ -174,7 +175,7 @@ int flow_accept(char ** ae_name) recv_msg = send_recv_irm_msg(&msg); if (recv_msg == NULL) { - return -1; + return -EIRM; } if (!recv_msg->has_pid || !recv_msg->has_port_id) { @@ -199,7 +200,7 @@ int flow_accept(char ** ae_name) pthread_rwlock_unlock(&_ap_instance->flows_lock); pthread_rwlock_unlock(&_ap_instance->data_lock); irm_msg__free_unpacked(recv_msg, NULL); - return -1; + return -ENOSHM; } if (ae_name != NULL) { @@ -210,7 +211,7 @@ int flow_accept(char ** ae_name) pthread_rwlock_unlock(&_ap_instance->flows_lock); pthread_rwlock_unlock(&_ap_instance->data_lock); irm_msg__free_unpacked(recv_msg, NULL); - return -1; + return -ENOMEM; } } @@ -232,7 +233,7 @@ int flow_alloc_resp(int fd, irm_msg_t * recv_msg = NULL; int ret = -1; - if (fd < 0) + if (fd < 0 || fd >= AP_MAX_FLOWS) return -EBADF; msg.code = IRM_MSG_CODE__IRM_FLOW_ALLOC_RESP; @@ -243,6 +244,12 @@ int flow_alloc_resp(int fd, pthread_rwlock_rdlock(&_ap_instance->data_lock); pthread_rwlock_rdlock(&_ap_instance->flows_lock); + if (_ap_instance->flows[fd].port_id < 0) { + pthread_rwlock_unlock(&_ap_instance->flows_lock); + pthread_rwlock_unlock(&_ap_instance->data_lock); + return -ENOTALLOC; + } + msg.port_id = _ap_instance->flows[fd].port_id; pthread_rwlock_unlock(&_ap_instance->flows_lock); @@ -253,7 +260,7 @@ int flow_alloc_resp(int fd, recv_msg = send_recv_irm_msg(&msg); if (recv_msg == NULL) { pthread_rwlock_unlock(&_ap_instance->data_lock); - return -1; + return -EIRM; } if (!recv_msg->has_result) { @@ -298,7 +305,7 @@ int flow_alloc(char * dst_name, recv_msg = send_recv_irm_msg(&msg); if (recv_msg == NULL) { - return -1; + return -EIRM; } if (!recv_msg->has_pid || !recv_msg->has_port_id) { @@ -323,7 +330,7 @@ int flow_alloc(char * dst_name, pthread_rwlock_unlock(&_ap_instance->flows_lock); pthread_rwlock_unlock(&_ap_instance->data_lock); irm_msg__free_unpacked(recv_msg, NULL); - return -1; + return -ENOSHM; } _ap_instance->flows[fd].port_id = recv_msg->port_id; @@ -343,7 +350,7 @@ int flow_alloc_res(int fd) irm_msg_t * recv_msg = NULL; int result = 0; - if (fd < 0) + if (fd < 0 || fd >= AP_MAX_FLOWS) return -EBADF; msg.code = IRM_MSG_CODE__IRM_FLOW_ALLOC_RES; @@ -352,6 +359,12 @@ int flow_alloc_res(int fd) pthread_rwlock_rdlock(&_ap_instance->data_lock); pthread_rwlock_rdlock(&_ap_instance->flows_lock); + if (_ap_instance->flows[fd].port_id < 0) { + pthread_rwlock_unlock(&_ap_instance->flows_lock); + pthread_rwlock_unlock(&_ap_instance->data_lock); + return -ENOTALLOC; + } + msg.port_id = _ap_instance->flows[fd].port_id; pthread_rwlock_unlock(&_ap_instance->flows_lock); @@ -359,7 +372,7 @@ int flow_alloc_res(int fd) recv_msg = send_recv_irm_msg(&msg); if (recv_msg == NULL) { - return -1; + return -EIRM; } if (!recv_msg->has_result) { @@ -386,6 +399,12 @@ int flow_dealloc(int fd) pthread_rwlock_rdlock(&_ap_instance->data_lock); pthread_rwlock_wrlock(&_ap_instance->flows_lock); + if (_ap_instance->flows[fd].port_id < 0) { + pthread_rwlock_unlock(&_ap_instance->flows_lock); + pthread_rwlock_unlock(&_ap_instance->data_lock); + return -ENOTALLOC; + } + msg.port_id = _ap_instance->flows[fd].port_id; _ap_instance->flows[fd].port_id = -1; @@ -399,7 +418,7 @@ int flow_dealloc(int fd) recv_msg = send_recv_irm_msg(&msg); if (recv_msg == NULL) { pthread_rwlock_unlock(&_ap_instance->data_lock); - return -1; + return -EIRM; } if (!recv_msg->has_result) { @@ -421,12 +440,18 @@ int flow_cntl(int fd, int cmd, int oflags) { int old; - if (fd < 0) + if (fd < 0 || fd >= AP_MAX_FLOWS) return -EBADF; pthread_rwlock_rdlock(&_ap_instance->data_lock); pthread_rwlock_wrlock(&_ap_instance->flows_lock); + if (_ap_instance->flows[fd].port_id < 0) { + pthread_rwlock_unlock(&_ap_instance->flows_lock); + pthread_rwlock_unlock(&_ap_instance->data_lock); + return -ENOTALLOC; + } + old = _ap_instance->flows[fd].oflags; switch (cmd) { @@ -454,12 +479,18 @@ ssize_t flow_write(int fd, void * buf, size_t count) if (buf == NULL) return 0; - if (fd < 0) + if (fd < 0 || fd >= AP_MAX_FLOWS) return -EBADF; pthread_rwlock_rdlock(&_ap_instance->data_lock); pthread_rwlock_rdlock(&_ap_instance->flows_lock); + if (_ap_instance->flows[fd].port_id < 0) { + pthread_rwlock_unlock(&_ap_instance->flows_lock); + pthread_rwlock_unlock(&_ap_instance->data_lock); + return -ENOTALLOC; + } + if (_ap_instance->flows[fd].oflags & FLOW_O_NONBLOCK) { index = shm_create_du_buff(_ap_instance->dum, count + DU_BUFF_HEADSPACE + @@ -470,7 +501,7 @@ ssize_t flow_write(int fd, void * buf, size_t count) if (index == -1) { pthread_rwlock_unlock(&_ap_instance->flows_lock); pthread_rwlock_unlock(&_ap_instance->data_lock); - return -1; + return -EAGAIN; } e.index = index; @@ -480,7 +511,7 @@ ssize_t flow_write(int fd, void * buf, size_t count) shm_release_du_buff(_ap_instance->dum, index); pthread_rwlock_unlock(&_ap_instance->flows_lock); pthread_rwlock_unlock(&_ap_instance->data_lock); - return -EPIPE; + return -ENOSHM; } } else { /* blocking */ while ((index = shm_create_du_buff(_ap_instance->dum, @@ -510,7 +541,7 @@ ssize_t flow_read(int fd, void * buf, size_t count) int n; uint8_t * sdu; - if (fd < 0) + if (fd < 0 || fd >= AP_MAX_FLOWS) return -EBADF; pthread_rwlock_rdlock(&_ap_instance->data_lock); @@ -519,16 +550,17 @@ ssize_t flow_read(int fd, void * buf, size_t count) if (_ap_instance->flows[fd].port_id < 0) { pthread_rwlock_unlock(&_ap_instance->flows_lock); pthread_rwlock_unlock(&_ap_instance->data_lock); - return -1; + return -ENOTALLOC; } if (_ap_instance->flows[fd].oflags & FLOW_O_NONBLOCK) { idx = shm_ap_rbuff_read_port(_ap_instance->rb, _ap_instance->flows[fd].port_id); } else { /* block */ - while ((idx = shm_ap_rbuff_read_port( - _ap_instance->rb, - _ap_instance->flows[fd].port_id)) < 0) + while ((idx = + shm_ap_rbuff_read_port(_ap_instance->rb, + _ap_instance-> + flows[fd].port_id)) < 0) ; } @@ -536,7 +568,7 @@ ssize_t flow_read(int fd, void * buf, size_t count) if (idx < 0) { pthread_rwlock_unlock(&_ap_instance->data_lock); - return -1; + return -EAGAIN; } n = shm_du_map_read_sdu(&sdu, diff --git a/src/lib/instance_name.c b/src/lib/instance_name.c index 10a432d5..844bb924 100644 --- a/src/lib/instance_name.c +++ b/src/lib/instance_name.c @@ -106,11 +106,11 @@ int instance_name_cpy(instance_name_t * dst, instance_name_t * res; if (src == NULL || dst == NULL) - return -1; + return -EINVAL; res = instance_name_init_from(dst, src->name, src->id); if (res == NULL) - return -1; + return -ENOMEM; return 0; } diff --git a/src/lib/irm.c b/src/lib/irm.c index ff5c3237..01ee498c 100644 --- a/src/lib/irm.c +++ b/src/lib/irm.c @@ -22,6 +22,7 @@ #define OUROBOROS_PREFIX "libouroboros-irm" +#include <ouroboros/errno.h> #include <ouroboros/irm.h> #include <ouroboros/common.h> #include <ouroboros/logs.h> @@ -47,7 +48,7 @@ pid_t irm_create_ipcp(char * ipcp_name, recv_msg = send_recv_irm_msg(&msg); if (recv_msg == NULL) - return -1; + return -EIRM; if (recv_msg->has_result == false) { irm_msg__free_unpacked(recv_msg, NULL); @@ -76,7 +77,7 @@ int irm_destroy_ipcp(instance_name_t * api) recv_msg = send_recv_irm_msg(&msg); if (recv_msg == NULL) - return -1; + return -EIRM; if (recv_msg->has_result == false) { irm_msg__free_unpacked(recv_msg, NULL); @@ -143,12 +144,12 @@ int irm_bootstrap_ipcp(instance_name_t * api, config.if_name = conf->if_name; break; default: - return -1; + return -EIPCPTYPE; } recv_msg = send_recv_irm_msg(&msg); if (recv_msg == NULL) { - return -1; + return -EIRM; } if (recv_msg->has_result == false) { @@ -180,14 +181,14 @@ int irm_enroll_ipcp(instance_name_t * api, msg.dif_name = malloc(sizeof(*(msg.dif_name))); if (msg.dif_name == NULL) { LOG_ERR("Failed to malloc"); - return -1; + return -ENOMEM; } msg.dif_name[0] = dif_name; recv_msg = send_recv_irm_msg(&msg); if (recv_msg == NULL) { free(msg.dif_name); - return -1; + return -EIRM; } if (recv_msg->has_result == false) { @@ -238,7 +239,7 @@ int irm_reg(char * name, recv_msg = send_recv_irm_msg(&msg); if (recv_msg == NULL) - return -1; + return -EIRM; if (recv_msg->has_result == false) { irm_msg__free_unpacked(recv_msg, NULL); @@ -284,7 +285,7 @@ int irm_unreg(char * name, recv_msg = send_recv_irm_msg(&msg); if (recv_msg == NULL) - return -1; + return -EIRM; if (recv_msg->has_result == false) { irm_msg__free_unpacked(recv_msg, NULL); |