diff options
-rw-r--r-- | src/ipcpd/normal/CMakeLists.txt | 10 | ||||
-rw-r--r-- | src/ipcpd/normal/flow_alloc.proto | 13 | ||||
-rw-r--r-- | src/ipcpd/normal/fmgr.c | 373 | ||||
-rw-r--r-- | src/ipcpd/normal/fmgr.h | 12 | ||||
-rw-r--r-- | src/ipcpd/normal/frct.c | 165 | ||||
-rw-r--r-- | src/ipcpd/normal/frct.h | 20 | ||||
-rw-r--r-- | src/ipcpd/normal/rmt.c | 52 | ||||
-rw-r--r-- | src/ipcpd/normal/rmt.h | 34 |
8 files changed, 646 insertions, 33 deletions
diff --git a/src/ipcpd/normal/CMakeLists.txt b/src/ipcpd/normal/CMakeLists.txt index 1e291d30..555260f1 100644 --- a/src/ipcpd/normal/CMakeLists.txt +++ b/src/ipcpd/normal/CMakeLists.txt @@ -12,26 +12,30 @@ include_directories(${CURRENT_BINARY_PARENT_DIR}) include_directories(${CMAKE_SOURCE_DIR}/include) include_directories(${CMAKE_BINARY_DIR}/include) -SET(IPCP_NORMAL_TARGET ipcpd-normal CACHE STRING "IPCP_NORMAL_TARGET") +set(IPCP_NORMAL_TARGET ipcpd-normal CACHE STRING "IPCP_NORMAL_TARGET") protobuf_generate_c(STATIC_INFO_SRCS STATIC_INFO_HDRS static_info.proto) +protobuf_generate_c(FLOW_ALLOC_SRCS FLOW_ALLOC_HDRS + flow_alloc.proto) + set(SOURCE_FILES # Add source files here main.c fmgr.c frct.c ribmgr.c + rmt.c ) add_executable (ipcpd-normal ${SOURCE_FILES} ${IPCP_SOURCES} - ${STATIC_INFO_SRCS}) + ${STATIC_INFO_SRCS} ${FLOW_ALLOC_SRCS}) target_link_libraries (ipcpd-normal LINK_PUBLIC ouroboros) include(MacroAddCompileFlags) if (CMAKE_BUILD_TYPE MATCHES Debug) - MACRO_ADD_COMPILE_FLAGS(ipcpd-normal -DCONFIG_OUROBOROS_DEBUG) + macro_add_compile_flags(ipcpd-normal -DCONFIG_OUROBOROS_DEBUG) endif (CMAKE_BUILD_TYPE MATCHES Debug) install(TARGETS ipcpd-normal RUNTIME DESTINATION sbin) diff --git a/src/ipcpd/normal/flow_alloc.proto b/src/ipcpd/normal/flow_alloc.proto new file mode 100644 index 00000000..b1ca7cb8 --- /dev/null +++ b/src/ipcpd/normal/flow_alloc.proto @@ -0,0 +1,13 @@ +enum flow_alloc_code { + FLOW_REQ = 1; + FLOW_REPLY = 2; + FLOW_DEALLOC = 3; +}; + +message flow_alloc_msg { + required flow_alloc_code code = 1; + optional string dst_name = 2; + optional string src_ae_name = 3; + optional uint32 qos_cube = 4; + optional sint32 response = 5; +}; diff --git a/src/ipcpd/normal/fmgr.c b/src/ipcpd/normal/fmgr.c index 1c8330a8..23d9514a 100644 --- a/src/ipcpd/normal/fmgr.c +++ b/src/ipcpd/normal/fmgr.c @@ -26,6 +26,7 @@ #include <ouroboros/logs.h> #include <ouroboros/dev.h> #include <ouroboros/list.h> +#include <ouroboros/ipcp.h> #include <stdlib.h> #include <stdbool.h> @@ -37,8 +38,19 @@ #include "frct.h" #include "ipcp.h" +#include "flow_alloc.pb-c.h" +typedef FlowAllocMsg flow_alloc_msg_t; + extern struct ipcp * _ipcp; +struct n_flow { + struct flow flow; + struct frct_i * frct_i; + enum qos_cube qos; + + struct list_head next; +}; + struct n_1_flow { int fd; char * ae_name; @@ -51,6 +63,9 @@ struct fmgr { struct list_head n_1_flows; pthread_mutex_t n_1_flows_lock; + struct list_head n_flows; + /* FIXME: Make this a read/write lock */ + pthread_mutex_t n_flows_lock; } * fmgr = NULL; static int add_n_1_fd(int fd, @@ -68,6 +83,8 @@ static int add_n_1_fd(int fd, tmp->fd = fd; tmp->ae_name = ae_name; + INIT_LIST_HEAD(&tmp->next); + pthread_mutex_lock(&fmgr->n_1_flows_lock); list_add(&tmp->next, &fmgr->n_1_flows); pthread_mutex_unlock(&fmgr->n_1_flows_lock); @@ -124,7 +141,8 @@ static void * fmgr_listen(void * o) } if (strcmp(ae_name, DT_AE) == 0) { - if (frct_dt_flow(fd)) { + /* FIXME: Pass correct QoS cube */ + if (frct_dt_flow(fd, 0)) { LOG_ERR("Failed to hand fd to FRCT."); flow_dealloc(fd); continue; @@ -148,13 +166,12 @@ int fmgr_init() return -1; INIT_LIST_HEAD(&fmgr->n_1_flows); + INIT_LIST_HEAD(&fmgr->n_flows); pthread_mutex_init(&fmgr->n_1_flows_lock, NULL); + pthread_mutex_init(&fmgr->n_flows_lock, NULL); - pthread_create(&fmgr->listen_thread, - NULL, - fmgr_listen, - NULL); + pthread_create(&fmgr->listen_thread, NULL, fmgr_listen, NULL); return 0; } @@ -186,11 +203,17 @@ int fmgr_mgmt_flow(char * dst_name) { int fd; int result; + char * ae_name; + + ae_name = strdup(MGMT_AE); + if (ae_name == NULL) + return -1; /* FIXME: Request retransmission. */ fd = flow_alloc(dst_name, MGMT_AE, NULL); if (fd < 0) { LOG_ERR("Failed to allocate flow to %s", dst_name); + free(ae_name); return -1; } @@ -198,29 +221,98 @@ int fmgr_mgmt_flow(char * dst_name) if (result < 0) { LOG_ERR("Result of flow allocation to %s is %d", dst_name, result); + free(ae_name); return -1; } if (ribmgr_add_flow(fd)) { LOG_ERR("Failed to hand file descriptor to RIB manager"); flow_dealloc(fd); + free(ae_name); + return -1; + } + + if (add_n_1_fd(fd, ae_name)) { + LOG_ERR("Failed to add file descriptor to list."); + flow_dealloc(fd); + return -1; + } + + return 0; +} + +int fmgr_dt_flow(char * dst_name, + enum qos_cube qos) +{ + int fd; + int result; + char * ae_name; + + ae_name = strdup(DT_AE); + if (ae_name == NULL) + return -1; + + /* FIXME: Map qos cube on correct QoS. */ + fd = flow_alloc(dst_name, DT_AE, NULL); + if (fd < 0) { + LOG_ERR("Failed to allocate flow to %s", dst_name); + free(ae_name); + return -1; + } + + result = flow_alloc_res(fd); + if (result < 0) { + LOG_ERR("Result of flow allocation to %s is %d", + dst_name, result); + free(ae_name); + return -1; + } + + if (frct_dt_flow(fd, qos)) { + LOG_ERR("Failed to hand file descriptor to FRCT"); + flow_dealloc(fd); + free(ae_name); return -1; } - if (add_n_1_fd(fd, strdup(MGMT_AE))) { + if (add_n_1_fd(fd, ae_name)) { LOG_ERR("Failed to add file descriptor to list."); flow_dealloc(fd); + free(ae_name); return -1; } return 0; } -int fmgr_dt_flow(char * dst_name) +/* Call under n_flows lock */ +static struct n_flow * get_n_flow_by_port_id(int port_id) { - LOG_MISSING; + struct list_head * pos = NULL; + + list_for_each(pos, &fmgr->n_flows) { + struct n_flow * e = + list_entry(pos, struct n_flow, next); + if (e->flow.port_id == port_id) + return e; + } + + return NULL; +} + +/* Call under n_flows lock */ +static struct n_flow * get_n_flow_by_frct_i(struct frct_i * frct_i) +{ + struct list_head * pos = NULL; + + list_for_each(pos, &fmgr->n_flows) { + struct n_flow * e = + list_entry(pos, struct n_flow, next); + if (e->frct_i == frct_i) + return e; + } - return -1; + return NULL; } int fmgr_flow_alloc(pid_t n_api, @@ -229,23 +321,274 @@ int fmgr_flow_alloc(pid_t n_api, char * src_ae_name, enum qos_cube qos) { - LOG_MISSING; + struct n_flow * flow; + struct frct_i * frct_i; + uint32_t address = 0; + buffer_t buf; + flow_alloc_msg_t msg = FLOW_ALLOC_MSG__INIT; + + flow = malloc(sizeof(*flow)); + if (flow == NULL) + return -1; + + /* FIXME: Obtain correct address here from DIF NSM */ - return -1; + msg.code = FLOW_ALLOC_CODE__FLOW_REQ; + msg.dst_name = dst_ap_name; + msg.src_ae_name = src_ae_name; + msg.qos_cube = qos; + msg.has_qos_cube = true; + + buf.len = flow_alloc_msg__get_packed_size(&msg); + if (buf.len == 0) { + free(flow); + return -1; + } + + buf.data = malloc(buf.len); + if (buf.data == NULL) { + free(flow); + return -1; + } + + flow_alloc_msg__pack(&msg, buf.data); + + pthread_mutex_lock(&fmgr->n_flows_lock); + + frct_i = frct_i_create(address, &buf, qos); + if (frct_i == NULL) { + free(buf.data); + free(flow); + pthread_mutex_unlock(&fmgr->n_flows_lock); + return -1; + } + + free(buf.data); + + flow->flow.rb = shm_ap_rbuff_open(n_api); + if (flow->flow.rb == NULL) { + pthread_mutex_unlock(&fmgr->n_flows_lock); + free(flow); + return -1; + } + + flow->flow.api = n_api; + flow->flow.port_id = port_id; + flow->flow.state = FLOW_PENDING; + flow->frct_i = frct_i; + flow->qos = qos; + + INIT_LIST_HEAD(&flow->next); + + list_add(&flow->next, &fmgr->n_flows); + + pthread_mutex_unlock(&fmgr->n_flows_lock); + + return 0; +} + +/* Call under n_flows lock */ +static int n_flow_dealloc(int port_id) +{ + struct n_flow * flow; + flow_alloc_msg_t msg = FLOW_ALLOC_MSG__INIT; + buffer_t buf; + int ret; + + flow = get_n_flow_by_port_id(port_id); + if (flow == NULL) + return -1; + + msg.code = FLOW_ALLOC_CODE__FLOW_DEALLOC; + + buf.len = flow_alloc_msg__get_packed_size(&msg); + if (buf.len == 0) + return -1; + + buf.data = malloc(buf.len); + if (buf.data == NULL) + return -1; + + flow_alloc_msg__pack(&msg, buf.data); + + ret = frct_i_destroy(flow->frct_i, &buf); + if (flow->flow.rb != NULL) + shm_ap_rbuff_close(flow->flow.rb); + list_del(&flow->next); + + free(flow); + free(buf.data); + + return ret; } int fmgr_flow_alloc_resp(pid_t n_api, int port_id, int response) { - LOG_MISSING; + struct n_flow * flow; + flow_alloc_msg_t msg = FLOW_ALLOC_MSG__INIT; + int ret; + buffer_t buf; + + pthread_mutex_lock(&fmgr->n_flows_lock); - return -1; + flow = get_n_flow_by_port_id(port_id); + if (flow == NULL) { + pthread_mutex_unlock(&fmgr->n_flows_lock); + return -1; + } + + if (flow->flow.state != FLOW_PENDING) { + pthread_mutex_unlock(&fmgr->n_flows_lock); + LOG_ERR("Flow is not pending."); + return -1; + } + + msg.code = FLOW_ALLOC_CODE__FLOW_REPLY; + msg.response = response; + msg.has_response = true; + + buf.len = flow_alloc_msg__get_packed_size(&msg); + if (buf.len == 0) { + pthread_mutex_unlock(&fmgr->n_flows_lock); + return -1; + } + + buf.data = malloc(buf.len); + if (buf.data == NULL) { + pthread_mutex_unlock(&fmgr->n_flows_lock); + return -1; + } + + flow_alloc_msg__pack(&msg, buf.data); + + if (response < 0) { + ret = frct_i_destroy(flow->frct_i, &buf); + free(buf.data); + list_del(&flow->next); + free(flow); + } else { + frct_i_accept(flow->frct_i, &buf); + flow->flow.state = FLOW_ALLOCATED; + flow->flow.api = n_api; + + flow->flow.rb = shm_ap_rbuff_open(n_api); + if (flow->flow.rb == NULL) { + ret = n_flow_dealloc(port_id); + pthread_mutex_unlock(&fmgr->n_flows_lock); + return ret; + } + } + + pthread_mutex_unlock(&fmgr->n_flows_lock); + + return ret; } int fmgr_flow_dealloc(int port_id) { - LOG_MISSING; + int ret; + + pthread_mutex_lock(&fmgr->n_flows_lock); + ret = n_flow_dealloc(port_id); + pthread_mutex_unlock(&fmgr->n_flows_lock); + + return ret; +} + +int fmgr_flow_alloc_msg(struct frct_i * frct_i, + buffer_t * buf) +{ + struct n_flow * flow; + int ret = 0; + int port_id; + flow_alloc_msg_t * msg; + + pthread_mutex_lock(&fmgr->n_flows_lock); + + /* Depending on what is in the message call the function in ipcp.h */ + + msg = flow_alloc_msg__unpack(NULL, buf->len, buf->data); + if (msg == NULL) { + pthread_mutex_unlock(&fmgr->n_flows_lock); + LOG_ERR("Failed to unpack flow alloc message"); + return -1; + } + + switch (msg->code) { + case FLOW_ALLOC_CODE__FLOW_REQ: + + flow = malloc(sizeof(*flow)); + if (flow == NULL) { + pthread_mutex_unlock(&fmgr->n_flows_lock); + flow_alloc_msg__free_unpacked(msg, NULL); + return -1; + } + + flow->flow.state = FLOW_PENDING; + flow->frct_i = frct_i; + flow->qos = msg->qos_cube; + flow->flow.rb = NULL; + flow->flow.api = 0; + + port_id = ipcp_flow_req_arr(getpid(), + msg->dst_name, + msg->src_ae_name); + if (port_id < 0) { + pthread_mutex_unlock(&fmgr->n_flows_lock); + free(flow); + flow_alloc_msg__free_unpacked(msg, NULL); + LOG_ERR("Failed to get port-id from IRMd."); + return -1; + } + + flow->flow.port_id = port_id; + + INIT_LIST_HEAD(&flow->next); + + list_add(&flow->next, &fmgr->n_flows); + break; + case FLOW_ALLOC_CODE__FLOW_REPLY: + flow = get_n_flow_by_frct_i(frct_i); + if (flow == NULL) { + pthread_mutex_unlock(&fmgr->n_flows_lock); + flow_alloc_msg__free_unpacked(msg, NULL); + LOG_ERR("No such flow in flow manager."); + return -1; + } + + ret = ipcp_flow_alloc_reply(getpid(), + flow->flow.port_id, + msg->response); + + if (msg->response < 0) { + shm_ap_rbuff_close(flow->flow.rb); + list_del(&flow->next); + free(flow); + } + + break; + case FLOW_ALLOC_CODE__FLOW_DEALLOC: + flow = get_n_flow_by_frct_i(frct_i); + if (flow == NULL) { + pthread_mutex_unlock(&fmgr->n_flows_lock); + flow_alloc_msg__free_unpacked(msg, NULL); + LOG_ERR("No such flow in flow manager."); + return -1; + } + + ret = ipcp_flow_dealloc(0, flow->flow.port_id); + break; + default: + LOG_ERR("Got an unknown flow allocation message."); + ret = -1; + break; + } + + pthread_mutex_unlock(&fmgr->n_flows_lock); + + flow_alloc_msg__free_unpacked(msg, NULL); - return -1; + return ret; } diff --git a/src/ipcpd/normal/fmgr.h b/src/ipcpd/normal/fmgr.h index dc88bbdf..342410ca 100644 --- a/src/ipcpd/normal/fmgr.h +++ b/src/ipcpd/normal/fmgr.h @@ -29,6 +29,8 @@ #include <stdint.h> #include <sys/types.h> +#include "frct.h" + #define MGMT_AE "Management" #define DT_AE "Data transfer" @@ -37,9 +39,10 @@ int fmgr_fini(); /* N-flow ops */ int fmgr_mgmt_flow(char * dst_name); -int fmgr_dt_flow(char * dst_name); +int fmgr_dt_flow(char * dst_name, + enum qos_cube qos); -/* N+1-flow ops */ +/* N+1-flow ops, local */ int fmgr_flow_alloc(pid_t n_api, int port_id, char * dst_ap_name, @@ -52,4 +55,9 @@ int fmgr_flow_alloc_resp(pid_t n_api, int fmgr_flow_dealloc(int port_id); +/* N+1-flow ops, remote */ +int fmgr_flow_alloc_msg(struct frct_i * frct_i, + buffer_t * buf); + + #endif diff --git a/src/ipcpd/normal/frct.c b/src/ipcpd/normal/frct.c index 2de9422d..7c2eba61 100644 --- a/src/ipcpd/normal/frct.c +++ b/src/ipcpd/normal/frct.c @@ -22,20 +22,67 @@ #define OUROBOROS_PREFIX "flow-rtx-control" -#include <stdlib.h> +#define IDS_SIZE 2048 +#include <ouroboros/config.h> #include <ouroboros/logs.h> +#include <ouroboros/bitmap.h> +#include <ouroboros/list.h> + +#include <stdlib.h> +#include <stdbool.h> +#include <pthread.h> #include "frct.h" + +enum conn_state { + CONN_PENDING = 0, + CONN_ESTABLISHED +}; + struct frct_i { + uint32_t cep_id; + uint32_t r_address; + uint32_t r_cep_id; + + enum conn_state state; + struct list_head next; }; struct frct { struct dt_const * dtc; uint32_t address; + + struct list_head instances; + pthread_mutex_t instances_lock; + + struct bmp * cep_ids; + pthread_mutex_t cep_ids_lock; } * frct = NULL; +static int next_cep_id() +{ + int ret; + + pthread_mutex_lock(&frct->cep_ids_lock); + ret = bmp_allocate(frct->cep_ids); + pthread_mutex_unlock(&frct->cep_ids_lock); + + return ret; +} + +static int release_cep_id(int id) +{ + int ret; + + pthread_mutex_lock(&frct->cep_ids_lock); + ret = bmp_release(frct->cep_ids, id); + pthread_mutex_unlock(&frct->cep_ids_lock); + + return ret; +} + int frct_init(struct dt_const * dtc, uint32_t address) { if (dtc == NULL) @@ -48,35 +95,133 @@ int frct_init(struct dt_const * dtc, uint32_t address) frct->dtc = dtc; frct->address = address; + INIT_LIST_HEAD(&frct->instances); + + if (pthread_mutex_init(&frct->cep_ids_lock, NULL)) { + free(frct); + return -1; + } + + if (pthread_mutex_init(&frct->instances_lock, NULL)) { + free(frct); + return -1; + } + + frct->cep_ids = bmp_create(IDS_SIZE, 0); + if (frct->cep_ids == NULL) { + free(frct); + return -1; + } + return 0; } int frct_fini() { - if (frct != NULL) - free(frct); + pthread_mutex_lock(&frct->cep_ids_lock); + bmp_destroy(frct->cep_ids); + pthread_mutex_unlock(&frct->cep_ids_lock); + free(frct); return 0; } -struct frct_i * frct_i_create(int port_id, - enum qos_cube cube) +int frct_dt_flow(int fd, + enum qos_cube qos) { LOG_MISSING; - return NULL; + return -1; } -int frct_i_destroy(struct frct_i * instance) +int frct_rmt_post() { LOG_MISSING; return -1; } -int frct_dt_flow(int fd) +/* Call under instances lock */ +static void destroy_frct_i(struct frct_i * instance) { - LOG_MISSING; + release_cep_id(instance->cep_id); + list_del(&instance->next); + free(instance); +} - return -1; +struct frct_i * frct_i_create(uint32_t address, + buffer_t * buf, + enum qos_cube cube) +{ + struct frct_i * instance; + + if (buf == NULL || + buf->data == NULL) + return NULL; + + instance = malloc(sizeof(*instance)); + if (instance == NULL) + return NULL; + + pthread_mutex_lock(&frct->instances_lock); + + instance->r_address = address; + instance->cep_id = next_cep_id(); + instance->state = CONN_PENDING; + + INIT_LIST_HEAD(&instance->next); + list_add(&instance->next, &frct->instances); + + pthread_mutex_unlock(&frct->instances_lock); + + /* FIXME: Pack into FRCT header and hand SDU to RMT */ + + return instance; +} + +int frct_i_accept(struct frct_i * instance, + buffer_t * buf) +{ + if (instance == NULL || buf == NULL || buf->data == NULL) + return -1; + + pthread_mutex_lock(&frct->instances_lock); + if (instance->state != CONN_PENDING) { + pthread_mutex_unlock(&frct->instances_lock); + return -1; + } + + instance->state = CONN_ESTABLISHED; + instance->cep_id = next_cep_id(); + + pthread_mutex_unlock(&frct->instances_lock); + + /* FIXME: Pack into FRCT header and hand SDU to RMT */ + + return 0; +} + +int frct_i_destroy(struct frct_i * instance, + buffer_t * buf) +{ + if (instance == NULL) + return -1; + + pthread_mutex_lock(&frct->instances_lock); + + if (!(instance->state == CONN_PENDING || + instance->state == CONN_ESTABLISHED)) { + pthread_mutex_unlock(&frct->instances_lock); + return -1; + } + + destroy_frct_i(instance); + pthread_mutex_unlock(&frct->instances_lock); + + if (buf != NULL && buf->data != NULL) { + + /* FIXME: Pack into FRCT header and hand SDU to RMT */ + } + + return 0; } diff --git a/src/ipcpd/normal/frct.h b/src/ipcpd/normal/frct.h index 2e965d38..91b2dfc7 100644 --- a/src/ipcpd/normal/frct.h +++ b/src/ipcpd/normal/frct.h @@ -24,6 +24,7 @@ #define OUROBOROS_IPCP_FRCT_H #include <ouroboros/shared.h> +#include <ouroboros/common.h> #include "dt_const.h" @@ -33,10 +34,23 @@ int frct_init(struct dt_const * dtc, uint32_t address); int frct_fini(); -struct frct_i * frct_i_create(int port_id, +int frct_dt_flow(int fd, + enum qos_cube qos); +/* + * FIXME: Will take the index in the DU map, + * possibly cep-ids and address + */ +int frct_rmt_post(); + +struct frct_i * frct_i_create(uint32_t address, + buffer_t * buf, enum qos_cube cube); -int frct_i_destroy(struct frct_i * instance); +/* FIXME: Hand QoS cube here too? We received it in the flow alloc message. */ +int frct_i_accept(struct frct_i * instance, + buffer_t * buf); +int frct_i_destroy(struct frct_i * instance, + buffer_t * buf); -int frct_dt_flow(int fd); +/* FIXME: Add read/write ops for frct instances */ #endif diff --git a/src/ipcpd/normal/rmt.c b/src/ipcpd/normal/rmt.c new file mode 100644 index 00000000..ee92c3e3 --- /dev/null +++ b/src/ipcpd/normal/rmt.c @@ -0,0 +1,52 @@ +/* + * Ouroboros - Copyright (C) 2016 + * + * The Relaying and Multiplexing task + * + * 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 "flow-manager" + +#include <ouroboros/config.h> +#include <ouroboros/logs.h> + +#include "rmt.h" + +struct rmt { +}; + +int rmt_init(struct dt_const * dtc) +{ + LOG_MISSING; + + return -1; +} + +int rmt_fini() +{ + LOG_MISSING; + + return -1; +} + +int rmt_frct_post() +{ + LOG_MISSING; + + return -1; +} diff --git a/src/ipcpd/normal/rmt.h b/src/ipcpd/normal/rmt.h new file mode 100644 index 00000000..cdd86a0b --- /dev/null +++ b/src/ipcpd/normal/rmt.h @@ -0,0 +1,34 @@ +/* + * Ouroboros - Copyright (C) 2016 + * + * The Relaying and Multiplexing task + * + * 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_RMT_H +#define OUROBOROS_IPCP_RMT_H + +#include "dt_const.h" + +int rmt_init(struct dt_const * dtc); +int rmt_fini(); + +/* FIXME: Will take index in DU map */ +int rmt_frct_post(); + +#endif |