From 21b304b46a347772c1338b22fba6a15291bb2945 Mon Sep 17 00:00:00 2001 From: dimitri staessens Date: Sun, 17 Apr 2016 12:08:49 +0200 Subject: ipcpd: initial IPC processes Basic functions for implementation of IPC processes, and implementation of core functions of the shim IPCP over UDP. Updates to the build system to compile these IPC processes, as well as some fixes in the irmd (rudimentary capturing exit signals) and some fixes in the library, mainly relating to the messaging. Basic implementation of creation / bootstrapping / deletion of the shim UDP. Placeholders for other functions. --- src/ipcpd/shim-udp/main.c | 323 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 323 insertions(+) create mode 100644 src/ipcpd/shim-udp/main.c (limited to 'src/ipcpd/shim-udp/main.c') diff --git a/src/ipcpd/shim-udp/main.c b/src/ipcpd/shim-udp/main.c new file mode 100644 index 00000000..1fb12dc0 --- /dev/null +++ b/src/ipcpd/shim-udp/main.c @@ -0,0 +1,323 @@ +/* + * Ouroboros - Copyright (C) 2016 + * + * Shim IPC process over UDP + * + * Dimitri Staessens + * + * 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 + +#include "ipcp.h" +#include +#include +#include +#include +#include +#include + +#define OUROBOROS_PREFIX "ipcpd/shim-udp" + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#define THIS_TYPE IPCP_SHIM_UDP + +#define shim_data(type) ((struct ipcp_udp_data *) type->data) + +/* global for trapping signal */ +int irmd_pid; + +/* this IPCP's data */ +#ifdef MAKE_CHECK +extern struct ipcp * _ipcp; /* defined in test */ +#else +struct ipcp * _ipcp; +#endif + +struct ipcp_udp_data { + /* IPCP_DATA STRUCT MUST BE FIRST!! */ + struct ipcp_data ipcp_data; + + uint32_t ip_addr; + uint32_t dns_addr; + + pthread_mutex_t lock; +}; + +struct udp_flow { + /* FLOW MUST BE FIRST !!!! */ + flow_t flow; + + uint16_t localport; + + struct sockaddr_in * remote; + int fd; +}; + +void ipcp_sig_handler(int sig, siginfo_t * info, void * c) +{ + switch(sig) { + case SIGINT: + case SIGTERM: + case SIGHUP: + LOG_DBG("Terminating by order of %d. Bye.", info->si_pid); + if (info->si_pid == irmd_pid) { + shm_du_map_close(_ipcp->data->dum); + exit(0); + } + default: + return; + } +} + +struct ipcp_udp_data * ipcp_udp_data_create(char * ap_name, + char * ap_id) +{ + struct ipcp_udp_data * udp_data; + struct ipcp_data * data; + instance_name_t * instance_name; + enum ipcp_type ipcp_type; + + instance_name = instance_name_create(); + if (instance_name == NULL) { + LOG_ERR("Failed to create instance name struct."); + return NULL; + } + + instance_name = instance_name_init_with( + instance_name, ap_name, (uint16_t)atoi(ap_id)); + + if (instance_name == NULL) { + LOG_ERR("Failed to create instance name struct."); + return NULL; + } + + udp_data= malloc (sizeof *udp_data); + if (udp_data == NULL) { + LOG_DBGF("Failed to allocate."); + return NULL; + } + + ipcp_type = THIS_TYPE; + data = (struct ipcp_data *) udp_data; + if (ipcp_data_init(data, instance_name, ipcp_type) == NULL) { + free(udp_data); + return NULL; + } + + return udp_data; +} + +int ipcp_udp_bootstrap(struct dif_config * conf) +{ + char ipstr[INET_ADDRSTRLEN]; + char dnsstr[INET_ADDRSTRLEN]; + + if (conf->type != THIS_TYPE) { + LOG_ERR("Config doesn't match IPCP type."); + return -1; + } + + if (_ipcp->state != IPCP_INIT) { + LOG_ERR("IPCP in wrong state."); + return -1; + } + + inet_ntop(AF_INET, + &conf->ip_addr, + ipstr, + INET_ADDRSTRLEN); + + if (conf->dns_addr != 0) + inet_ntop(AF_INET, + &conf->dns_addr, + dnsstr, + INET_ADDRSTRLEN); + else + strcpy(dnsstr, "not set"); + + shim_data(_ipcp)->ip_addr = conf->ip_addr; + shim_data(_ipcp)->dns_addr = conf->dns_addr; + + _ipcp->state = IPCP_ENROLLED; + + LOG_DBG("Bootstrapped shim IPCP over UDP %s-%d.", + _ipcp->data->iname->name, _ipcp->data->iname->id); + + LOG_DBG("Bound to IP address %s.", ipstr); + LOG_DBG("DNS server address is %s.", dnsstr); + + return 0; +} + +int ipcp_udp_ap_reg(char * ap_name, uint32_t reg_ap_id) +{ + LOG_DBG("Registering local ap %s, %u.", ap_name, reg_ap_id); + + if (_ipcp->state != IPCP_ENROLLED) { + LOG_DBGF("Won't register with non-enrolled IPCP."); + return -1; + } + + if (ipcp_data_add_reg_entry(_ipcp->data, ap_name, reg_ap_id)) { + LOG_ERR("Failed to add AP to local registry."); + return -1; + } + + LOG_MISSING; + + return 0; +} + +int ipcp_udp_ap_unreg(uint32_t reg_ap_id) +{ + char * name = strdup(ipcp_data_get_reg_ap_name(_ipcp->data, + reg_ap_id)); + LOG_DBG("Unregistering %s.", name); + + ipcp_data_del_reg_entry(_ipcp->data, reg_ap_id); + + /* we are using dns */ + LOG_MISSING; + + free (name); + + return 0; +} + +int ipcp_udp_flow_alloc(uint32_t port_id, + char * dst_ap_name, + char * src_ap_name, + char * src_ae_name, + struct qos_spec * qos) +{ + return 0; +} +int ipcp_udp_flow_alloc_resp(uint32_t port_id, + int result) +{ + return 0; +} + +int ipcp_udp_flow_dealloc(uint32_t port_id) +{ + return 0; +} + +int ipcp_udp_du_write(uint32_t port_id, + size_t map_index) +{ + return 0; +} + +int ipcp_udp_du_read(uint32_t port_id, + size_t map_index) +{ + return 0; +} + +struct ipcp * ipcp_udp_create(char * ap_name, char * i_id) +{ + struct ipcp * i; + struct ipcp_udp_data * data; + struct ipcp_ops * ops; + + i = malloc(sizeof *i); + if (i == NULL) + return NULL; + + data = ipcp_udp_data_create(ap_name, i_id); + if (data == NULL) { + free(i); + return NULL; + } + + ops = malloc (sizeof *ops); + if (ops == NULL) { + free(data); + free(i); + return NULL; + } + + ops->ipcp_bootstrap = ipcp_udp_bootstrap; + ops->ipcp_enroll = NULL; /* shim */ + ops->ipcp_reg = NULL; /* shim */ + ops->ipcp_unreg = NULL; /* shim */ + ops->ipcp_ap_reg = ipcp_udp_ap_reg; + ops->ipcp_ap_unreg = ipcp_udp_ap_unreg; + ops->ipcp_flow_alloc = ipcp_udp_flow_alloc; + ops->ipcp_flow_alloc_resp = ipcp_udp_flow_alloc_resp; + ops->ipcp_flow_dealloc = ipcp_udp_flow_dealloc; + ops->ipcp_du_read = ipcp_udp_du_read; + ops->ipcp_du_write = ipcp_udp_du_write; + + i->data = (struct ipcp_data *) data; + i->ops = ops; + + i->state = IPCP_INIT; + + return i; +} + +#ifndef MAKE_CHECK + +int main (int argc, char * argv[]) +{ + /* argument 1: pid of irmd ? */ + /* argument 2: ap name */ + /* argument 3: instance id */ + struct sigaction sig_act; + + /* FIXME: clean up argument checks */ + if (argc != 4) + LOG_ERR("Wrong arguments passed."); + + /* store the process id of the irmd */ + irmd_pid = atoi(argv[1]); + + /* init sig_act */ + memset (&sig_act, 0, sizeof sig_act); + + /* install signal traps */ + sig_act.sa_sigaction = &ipcp_sig_handler; + sig_act.sa_flags = SA_SIGINFO; + + sigaction(SIGINT, &sig_act, NULL); + sigaction(SIGTERM, &sig_act, NULL); + sigaction(SIGHUP, &sig_act, NULL); + + _ipcp = ipcp_udp_create(argv[2], argv[3]); + if (_ipcp == NULL) { + LOG_ERR("Won't."); + exit(1); + } + + ipcp_main_loop(_ipcp); + + exit(0); +} + +#endif /* MAKE_CHECK */ -- cgit v1.2.3 From b2acd622d6380724fa16ee66b9f0f4463f1cd477 Mon Sep 17 00:00:00 2001 From: dimitri staessens Date: Tue, 19 Apr 2016 09:42:42 +0200 Subject: ipcpd: added checks added missing NULL checks common argument check function for ipcps --- src/ipcpd/ipcp.c | 73 ++++++++++++++++++++++++++++++++++++----------- src/ipcpd/ipcp.h | 1 + src/ipcpd/shim-udp/main.c | 7 +++-- 3 files changed, 62 insertions(+), 19 deletions(-) (limited to 'src/ipcpd/shim-udp/main.c') diff --git a/src/ipcpd/ipcp.c b/src/ipcpd/ipcp.c index a1276769..0b652ff6 100644 --- a/src/ipcpd/ipcp.c +++ b/src/ipcpd/ipcp.c @@ -29,6 +29,23 @@ #define OUROBOROS_PREFIX "ipcpd/ipcp" #include +int ipcp_arg_check(int argc, char * argv[]) +{ + if (argc != 4) + return -1; + + /* argument 1: pid of irmd */ + if (atoi(argv[1]) == 0) + return -1; + + /* name conformity responsibility of NMS */ + + /* argument 2: ap name */ + /* argument 3: instance id */ + + return 0; +} + int ipcp_main_loop(struct ipcp * _ipcp) { int lsockfd; @@ -78,6 +95,10 @@ int ipcp_main_loop(struct ipcp * _ipcp) switch (msg->code) { case IPCP_MSG_CODE__IPCP_BOOTSTRAP: + if (_ipcp->ops->ipcp_bootstrap == NULL) { + LOG_ERR("Bootstrap unsupported."); + break; + } conf_msg = msg->conf; conf.type = conf_msg->ipcp_type; if (conf_msg->ipcp_type == IPCP_NORMAL) { @@ -102,45 +123,57 @@ int ipcp_main_loop(struct ipcp * _ipcp) break; case IPCP_MSG_CODE__IPCP_ENROLL: if (_ipcp->ops->ipcp_enroll == NULL) { - LOG_ERR("ipcp_enroll unsupported."); - } else { - ret_msg.has_result = true; - ret_msg.result = _ipcp->ops->ipcp_enroll( - msg->member_name, msg->n_1_dif); + LOG_ERR("Enroll unsupported."); + break; } + ret_msg.has_result = true; + ret_msg.result = _ipcp->ops->ipcp_enroll( + msg->member_name, msg->n_1_dif); + break; case IPCP_MSG_CODE__IPCP_REG: if (_ipcp->ops->ipcp_reg == NULL) { - LOG_ERR("ipcp_reg unsupported."); + LOG_ERR("Reg unsupported."); + break; - } else { - ret_msg.has_result = true; - ret_msg.result = _ipcp->ops->ipcp_reg( - msg->dif_names, msg->len); } + ret_msg.has_result = true; + ret_msg.result = _ipcp->ops->ipcp_reg( + msg->dif_names, msg->len); break; case IPCP_MSG_CODE__IPCP_UNREG: if (_ipcp->ops->ipcp_unreg == NULL) { - LOG_ERR("ipcp_unreg unsupported."); - - } else { - ret_msg.has_result = true; - ret_msg.result = _ipcp->ops->ipcp_unreg( - msg->dif_names, msg->len); + LOG_ERR("Unreg unsupported."); + break; } + ret_msg.has_result = true; + ret_msg.result = _ipcp->ops->ipcp_unreg( + msg->dif_names, msg->len); break; case IPCP_MSG_CODE__IPCP_AP_REG: + if (_ipcp->ops->ipcp_ap_reg == NULL) { + LOG_ERR("Ap_reg unsupported."); + break; + } ret_msg.has_result = true; ret_msg.result = _ipcp->ops->ipcp_ap_reg( msg->ap_name, msg->reg_ap_id); break; case IPCP_MSG_CODE__IPCP_AP_UNREG: + if (_ipcp->ops->ipcp_ap_unreg == NULL) { + LOG_ERR("Ap_unreg unsupported."); + break; + } ret_msg.has_result = true; ret_msg.result = _ipcp->ops->ipcp_ap_unreg( msg->reg_ap_id); break; case IPCP_MSG_CODE__IPCP_FLOW_ALLOC: + if (_ipcp->ops->ipcp_flow_alloc == NULL) { + LOG_ERR("Flow_alloc unsupported."); + break; + } ret_msg.has_result = true; ret_msg.result = _ipcp->ops->ipcp_flow_alloc( msg->port_id, @@ -150,11 +183,19 @@ int ipcp_main_loop(struct ipcp * _ipcp) NULL); break; case IPCP_MSG_CODE__IPCP_FLOW_ALLOC_RESP: + if (_ipcp->ops->ipcp_flow_alloc_resp == NULL) { + LOG_ERR("Flow_alloc_resp unsupported."); + break; + } ret_msg.has_result = true; ret_msg.result = _ipcp->ops->ipcp_flow_alloc_resp( msg->port_id, msg->result); break; case IPCP_MSG_CODE__IPCP_FLOW_DEALLOC: + if (_ipcp->ops->ipcp_flow_dealloc == NULL) { + LOG_ERR("Flow_dealloc unsupported."); + break; + } ret_msg.has_result = true; ret_msg.result = _ipcp->ops->ipcp_flow_dealloc( msg->port_id); diff --git a/src/ipcpd/ipcp.h b/src/ipcpd/ipcp.h index d6ddeb43..9decac8b 100644 --- a/src/ipcpd/ipcp.h +++ b/src/ipcpd/ipcp.h @@ -44,5 +44,6 @@ struct ipcp { }; int ipcp_main_loop(); +int ipcp_arg_check(int argc, char * argv[]); #endif diff --git a/src/ipcpd/shim-udp/main.c b/src/ipcpd/shim-udp/main.c index 1fb12dc0..45620ee9 100644 --- a/src/ipcpd/shim-udp/main.c +++ b/src/ipcpd/shim-udp/main.c @@ -291,9 +291,10 @@ int main (int argc, char * argv[]) /* argument 3: instance id */ struct sigaction sig_act; - /* FIXME: clean up argument checks */ - if (argc != 4) - LOG_ERR("Wrong arguments passed."); + if (ipcp_arg_check(argc, argv)) { + LOG_ERR("Wrong arguments."); + exit(1); + } /* store the process id of the irmd */ irmd_pid = atoi(argv[1]); -- cgit v1.2.3 From 34b8b6e39ec45080c89b62994cf3ba8d32e666a1 Mon Sep 17 00:00:00 2001 From: dimitri staessens Date: Tue, 19 Apr 2016 13:15:43 +0200 Subject: lib: moved flow header and source to ipcpd --- include/ouroboros/CMakeLists.txt | 1 - include/ouroboros/flow.h | 63 ----------------------------- src/ipcpd/CMakeLists.txt | 1 + src/ipcpd/flow.c | 87 ++++++++++++++++++++++++++++++++++++++++ src/ipcpd/flow.h | 63 +++++++++++++++++++++++++++++ src/ipcpd/ipcp-data.c | 1 - src/ipcpd/ipcp-data.h | 2 +- src/ipcpd/shim-udp/main.c | 2 +- src/lib/CMakeLists.txt | 1 - src/lib/flow.c | 87 ---------------------------------------- 10 files changed, 153 insertions(+), 155 deletions(-) delete mode 100644 include/ouroboros/flow.h create mode 100644 src/ipcpd/flow.c create mode 100644 src/ipcpd/flow.h delete mode 100644 src/lib/flow.c (limited to 'src/ipcpd/shim-udp/main.c') diff --git a/include/ouroboros/CMakeLists.txt b/include/ouroboros/CMakeLists.txt index fb4884b7..cfa299ca 100644 --- a/include/ouroboros/CMakeLists.txt +++ b/include/ouroboros/CMakeLists.txt @@ -10,7 +10,6 @@ set(HEADER_FILES dev.h dif_config.h du_buff.h - flow.h instance_name.h ipcp.h irm.h diff --git a/include/ouroboros/flow.h b/include/ouroboros/flow.h deleted file mode 100644 index 000de5ad..00000000 --- a/include/ouroboros/flow.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Ouroboros - Copyright (C) 2016 - * - * Flows - * - * Dimitri Staessens - * - * 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_FLOW_H -#define OUROBOROS_FLOW_H - -#include -#include -#include - -/* same values as fcntl.h */ -#define FLOW_O_RDONLY 00000000 -#define FLOW_O_WRONLY 00000001 -#define FLOW_O_RDWR 00000002 -#define FLOW_O_ACCMODE 00000003 - -#define FLOW_O_NONBLOCK 00004000 -#define FLOW_O_DEFAULT 00000002 - -#define FLOW_O_INVALID (FLOW_O_WRONLY | FLOW_O_RDWR) - -enum flow_state { - FLOW_NULL = 0, - FLOW_ALLOCATED, - FLOW_PENDING -}; - -typedef struct flow { - struct list_head list; - - int32_t port_id; - uint16_t oflags; - enum flow_state state; - - pthread_mutex_t lock; -} flow_t; - -flow_t * flow_create(int32_t port_id); -void flow_destroy(flow_t * flow); - -int flow_set_opts(flow_t * flow, uint16_t opts); -uint16_t flow_get_opts(const flow_t * flow); - -#endif /* OUROBOROS_FLOW_H */ diff --git a/src/ipcpd/CMakeLists.txt b/src/ipcpd/CMakeLists.txt index 6311e3dc..5a924ffe 100644 --- a/src/ipcpd/CMakeLists.txt +++ b/src/ipcpd/CMakeLists.txt @@ -1,5 +1,6 @@ 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 new file mode 100644 index 00000000..c436733b --- /dev/null +++ b/src/ipcpd/flow.c @@ -0,0 +1,87 @@ +/* + * Ouroboros - Copyright (C) 2016 + * + * Flows + * + * Dimitri Staessens + * + * 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 +#include "flow.h" + +#define OUROBOROS_PREFIX "ipcpd/flow" + +#include + +flow_t * flow_create(int32_t port_id) +{ + flow_t * 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->oflags = FLOW_O_DEFAULT; + flow->state = FLOW_NULL; + + pthread_mutex_init(&flow->lock, NULL); + + return flow; +} + +void flow_destroy(flow_t * flow) +{ + if (flow == NULL) + return; + free(flow); +} + +int flow_set_opts(flow_t * flow, uint16_t opts) +{ + if (flow == NULL) { + LOG_DBGF("Non-existing flow."); + return -1; + } + + pthread_mutex_lock(&flow->lock); + + if ((opts & FLOW_O_ACCMODE) == FLOW_O_ACCMODE) { + flow->oflags = FLOW_O_DEFAULT; + pthread_mutex_unlock(&flow->lock); + LOG_WARN("Invalid flow options. Setting default."); + return -1; + } + + flow->oflags = opts; + + pthread_mutex_unlock(&flow->lock); + + return 0; +} + +uint16_t flow_get_opts(const flow_t * flow) +{ + if (flow == NULL) { + LOG_DBGF("Non-existing flow."); + return FLOW_O_INVALID; + } + + return flow->oflags; +} diff --git a/src/ipcpd/flow.h b/src/ipcpd/flow.h new file mode 100644 index 00000000..000de5ad --- /dev/null +++ b/src/ipcpd/flow.h @@ -0,0 +1,63 @@ +/* + * Ouroboros - Copyright (C) 2016 + * + * Flows + * + * Dimitri Staessens + * + * 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_FLOW_H +#define OUROBOROS_FLOW_H + +#include +#include +#include + +/* same values as fcntl.h */ +#define FLOW_O_RDONLY 00000000 +#define FLOW_O_WRONLY 00000001 +#define FLOW_O_RDWR 00000002 +#define FLOW_O_ACCMODE 00000003 + +#define FLOW_O_NONBLOCK 00004000 +#define FLOW_O_DEFAULT 00000002 + +#define FLOW_O_INVALID (FLOW_O_WRONLY | FLOW_O_RDWR) + +enum flow_state { + FLOW_NULL = 0, + FLOW_ALLOCATED, + FLOW_PENDING +}; + +typedef struct flow { + struct list_head list; + + int32_t port_id; + uint16_t oflags; + enum flow_state state; + + pthread_mutex_t lock; +} flow_t; + +flow_t * flow_create(int32_t port_id); +void flow_destroy(flow_t * flow); + +int flow_set_opts(flow_t * flow, uint16_t opts); +uint16_t flow_get_opts(const flow_t * flow); + +#endif /* OUROBOROS_FLOW_H */ diff --git a/src/ipcpd/ipcp-data.c b/src/ipcpd/ipcp-data.c index 17649b42..2ed20943 100644 --- a/src/ipcpd/ipcp-data.c +++ b/src/ipcpd/ipcp-data.c @@ -22,7 +22,6 @@ */ #include "ipcp-data.h" -#include #include #include #include diff --git a/src/ipcpd/ipcp-data.h b/src/ipcpd/ipcp-data.h index d51f3730..a8db44f7 100644 --- a/src/ipcpd/ipcp-data.h +++ b/src/ipcpd/ipcp-data.h @@ -27,11 +27,11 @@ #include #include #include -#include #include #include #include "ipcp-ops.h" +#include "flow.h" struct ipcp_data { instance_name_t * iname; diff --git a/src/ipcpd/shim-udp/main.c b/src/ipcpd/shim-udp/main.c index 45620ee9..df731490 100644 --- a/src/ipcpd/shim-udp/main.c +++ b/src/ipcpd/shim-udp/main.c @@ -23,9 +23,9 @@ #include #include "ipcp.h" +#include "flow.h" #include #include -#include #include #include #include diff --git a/src/lib/CMakeLists.txt b/src/lib/CMakeLists.txt index c2d1bcc7..4922e07c 100644 --- a/src/lib/CMakeLists.txt +++ b/src/lib/CMakeLists.txt @@ -28,7 +28,6 @@ set(SOURCE_FILES da.c dev.c du_buff.c - flow.c instance_name.c ipcp.c irm.c diff --git a/src/lib/flow.c b/src/lib/flow.c deleted file mode 100644 index da0ca148..00000000 --- a/src/lib/flow.c +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Ouroboros - Copyright (C) 2016 - * - * Flows - * - * Dimitri Staessens - * - * 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 -#include - -#define OUROBOROS_PREFIX "ipcpd/flow" - -#include - -flow_t * flow_create(int32_t port_id) -{ - flow_t * 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->oflags = FLOW_O_DEFAULT; - flow->state = FLOW_NULL; - - pthread_mutex_init(&flow->lock, NULL); - - return flow; -} - -void flow_destroy(flow_t * flow) -{ - if (flow == NULL) - return; - free(flow); -} - -int flow_set_opts(flow_t * flow, uint16_t opts) -{ - if (flow == NULL) { - LOG_DBGF("Non-existing flow."); - return -1; - } - - pthread_mutex_lock(&flow->lock); - - if ((opts & FLOW_O_ACCMODE) == FLOW_O_ACCMODE) { - flow->oflags = FLOW_O_DEFAULT; - pthread_mutex_unlock(&flow->lock); - LOG_WARN("Invalid flow options. Setting default."); - return -1; - } - - flow->oflags = opts; - - pthread_mutex_unlock(&flow->lock); - - return 0; -} - -uint16_t flow_get_opts(const flow_t * flow) -{ - if (flow == NULL) { - LOG_DBGF("Non-existing flow."); - return FLOW_O_INVALID; - } - - return flow->oflags; -} -- cgit v1.2.3