diff options
Diffstat (limited to 'src/ipcpd')
| -rw-r--r-- | src/ipcpd/normal/CMakeLists.txt | 3 | ||||
| -rw-r--r-- | src/ipcpd/normal/fa.c | 130 | ||||
| -rw-r--r-- | src/ipcpd/normal/flow_alloc.proto | 38 | 
3 files changed, 54 insertions, 117 deletions
| diff --git a/src/ipcpd/normal/CMakeLists.txt b/src/ipcpd/normal/CMakeLists.txt index 087422d9..5ba0c4df 100644 --- a/src/ipcpd/normal/CMakeLists.txt +++ b/src/ipcpd/normal/CMakeLists.txt @@ -14,7 +14,6 @@ include_directories(${CMAKE_BINARY_DIR}/include)  set(IPCP_NORMAL_TARGET ipcpd-normal CACHE INTERNAL "") -protobuf_generate_c(FLOW_ALLOC_SRCS FLOW_ALLOC_HDRS flow_alloc.proto)  protobuf_generate_c(ENROLL_PROTO_SRCS ENROLL_PROTO_HDRS enroll.proto    ${CMAKE_SOURCE_DIR}/src/lib/ipcp_config.proto)  protobuf_generate_c(KAD_PROTO_SRCS KAD_PROTO_HDRS kademlia.proto) @@ -46,7 +45,7 @@ set(SOURCE_FILES    )  add_executable(ipcpd-normal ${SOURCE_FILES} ${IPCP_SOURCES} -  ${FLOW_ALLOC_SRCS} ${KAD_PROTO_SRCS} ${ENROLL_PROTO_SRCS}) +  ${KAD_PROTO_SRCS} ${ENROLL_PROTO_SRCS})  target_link_libraries(ipcpd-normal LINK_PUBLIC ouroboros-dev)  include(AddCompileFlags) diff --git a/src/ipcpd/normal/fa.c b/src/ipcpd/normal/fa.c index 6b8c65aa..42e4276e 100644 --- a/src/ipcpd/normal/fa.c +++ b/src/ipcpd/normal/fa.c @@ -43,11 +43,20 @@  #include <stdlib.h>  #include <string.h> -#include "flow_alloc.pb-c.h" -typedef FlowAllocMsg flow_alloc_msg_t; -  #define TIMEOUT 10000 /* nanoseconds */ +#define FLOW_REQ   0 +#define FLOW_REPLY 1 + +struct fa_msg { +        uint64_t s_addr; +        uint32_t r_fd; +        uint32_t s_fd; +        uint8_t  code; +        uint8_t  qc; +        int8_t   response; +} __attribute__((packed)); +  struct {          pthread_rwlock_t   flows_lock;          int                r_fd[PROG_MAX_FLOWS]; @@ -82,43 +91,36 @@ static void destroy_conn(int fd)  static void fa_post_sdu(void *               ae,                          struct shm_du_buff * sdb)  { -        struct timespec    ts  = {0, TIMEOUT * 1000}; -        struct timespec    abstime; -        int                fd; -        flow_alloc_msg_t * msg; +        struct timespec ts  = {0, TIMEOUT * 1000}; +        struct timespec abstime; +        int             fd; +        uint8_t *       buf; +        struct fa_msg * msg;          (void) ae;          assert(ae == &fa);          assert(sdb); +        buf = malloc(sizeof(*msg) + ipcp_dir_hash_len()); +        if (buf == NULL) +                return; + +        msg = (struct fa_msg *) buf; +          /* Depending on the message call the function in ipcp-dev.h */ -        msg = flow_alloc_msg__unpack(NULL, -                                     shm_du_buff_tail(sdb) - -                                     shm_du_buff_head(sdb), -                                     shm_du_buff_head(sdb)); +        memcpy(msg, shm_du_buff_head(sdb), +               shm_du_buff_tail(sdb) - shm_du_buff_head(sdb));          ipcp_sdb_release(sdb); -        if (msg == NULL) { -                log_err("Failed to unpack flow alloc message."); -                return; -        } -          switch (msg->code) { -        case FLOW_ALLOC_CODE__FLOW_REQ: +        case FLOW_REQ:                  clock_gettime(PTHREAD_COND_CLOCK, &abstime);                  pthread_mutex_lock(&ipcpi.alloc_lock); -                if (!msg->has_hash || !msg->has_s_fd || !msg->has_s_addr) { -                        log_err("Bad flow request."); -                        pthread_mutex_unlock(&ipcpi.alloc_lock); -                        flow_alloc_msg__free_unpacked(msg, NULL); -                        return; -                } -                  while (ipcpi.alloc_id != -1 &&                         ipcp_get_state() == IPCP_OPERATIONAL) {                          ts_add(&abstime, &ts, &abstime); @@ -130,20 +132,20 @@ static void fa_post_sdu(void *               ae,                  if (ipcp_get_state() != IPCP_OPERATIONAL) {                          log_dbg("Won't allocate over non-operational IPCP.");                          pthread_mutex_unlock(&ipcpi.alloc_lock); -                        flow_alloc_msg__free_unpacked(msg, NULL); +                        free(msg);                          return;                  }                  assert(ipcpi.alloc_id == -1);                  fd = ipcp_flow_req_arr(getpid(), -                                       msg->hash.data, +                                       (uint8_t *) (msg + 1),                                         ipcp_dir_hash_len(),                                         msg->qc);                  if (fd < 0) {                          pthread_mutex_unlock(&ipcpi.alloc_lock); -                        flow_alloc_msg__free_unpacked(msg, NULL);                          log_err("Failed to get fd for flow."); +                        free(msg);                          return;                  } @@ -160,7 +162,7 @@ static void fa_post_sdu(void *               ae,                  pthread_mutex_unlock(&ipcpi.alloc_lock);                  break; -        case FLOW_ALLOC_CODE__FLOW_REPLY: +        case FLOW_REPLY:                  pthread_rwlock_wrlock(&fa.flows_lock);                  fa.r_fd[msg->r_fd] = msg->s_fd; @@ -177,11 +179,10 @@ static void fa_post_sdu(void *               ae,                  break;          default:                  log_err("Got an unknown flow allocation message."); -                flow_alloc_msg__free_unpacked(msg, NULL); -                return; +                break;          } -        flow_alloc_msg__free_unpacked(msg, NULL); +        free(msg);  }  int fa_init(void) @@ -220,47 +221,26 @@ void fa_stop(void)          sdu_sched_destroy(fa.sdu_sched);  } -static struct shm_du_buff * create_fa_sdb(flow_alloc_msg_t * msg) -{ -        struct shm_du_buff * sdb; -        size_t len; - -        len = flow_alloc_msg__get_packed_size(msg); -        if (len == 0) -                return NULL; - -        if (ipcp_sdb_reserve(&sdb, len)) -                return NULL; - -        flow_alloc_msg__pack(msg, shm_du_buff_head(sdb)); - -        return sdb; -} -  int fa_alloc(int             fd,               const uint8_t * dst,               qoscube_t       qc)  { -        flow_alloc_msg_t     msg = FLOW_ALLOC_MSG__INIT; +        struct fa_msg *      msg;          uint64_t             addr;          struct shm_du_buff * sdb; +        if (ipcp_sdb_reserve(&sdb, sizeof(*msg) + ipcp_dir_hash_len())) +                return -1; +          addr = dir_query(dst); -        msg.code         = FLOW_ALLOC_CODE__FLOW_REQ; -        msg.has_hash     = true; -        msg.hash.len     = ipcp_dir_hash_len(); -        msg.hash.data    = (uint8_t *) dst; -        msg.has_qc       = true; -        msg.qc           = qc; -        msg.has_s_fd     = true; -        msg.s_fd         = fd; -        msg.has_s_addr   = true; -        msg.s_addr       = ipcpi.dt_addr; - -        sdb = create_fa_sdb(&msg); -        if (sdb == NULL) -                return -1; +        msg         = (struct fa_msg *) shm_du_buff_head(sdb); +        msg->code   = FLOW_REQ; +        msg->qc     = qc; +        msg->s_fd   = fd; +        msg->s_addr = ipcpi.dt_addr; + +        memcpy(msg + 1, dst, ipcp_dir_hash_len());          if (dt_write_sdu(addr, qc, fa.fd, sdb)) {                  ipcp_sdb_release(sdb); @@ -282,7 +262,7 @@ int fa_alloc_resp(int fd,  {          struct timespec      ts = {0, TIMEOUT * 1000};          struct timespec      abstime; -        flow_alloc_msg_t     msg = FLOW_ALLOC_MSG__INIT; +        struct fa_msg *      msg;          struct shm_du_buff * sdb;          qoscube_t            qc; @@ -307,23 +287,19 @@ int fa_alloc_resp(int fd,          pthread_mutex_unlock(&ipcpi.alloc_lock); -        pthread_rwlock_wrlock(&fa.flows_lock); - -        msg.code         = FLOW_ALLOC_CODE__FLOW_REPLY; -        msg.has_r_fd     = true; -        msg.r_fd         = fa.r_fd[fd]; -        msg.has_s_fd     = true; -        msg.s_fd         = fd; -        msg.response     = response; -        msg.has_response = true; - -        sdb = create_fa_sdb(&msg); -        if (sdb == NULL) { +        if (ipcp_sdb_reserve(&sdb, sizeof(*msg) + ipcp_dir_hash_len())) {                  destroy_conn(fd); -                pthread_rwlock_unlock(&fa.flows_lock);                  return -1;          } +        pthread_rwlock_wrlock(&fa.flows_lock); + +        msg           = (struct fa_msg *) shm_du_buff_head(sdb); +        msg->code     = FLOW_REPLY; +        msg->r_fd     = fa.r_fd[fd]; +        msg->s_fd     = fd; +        msg->response = response; +          if (response < 0) {                  destroy_conn(fd);                  ipcp_sdb_release(sdb); diff --git a/src/ipcpd/normal/flow_alloc.proto b/src/ipcpd/normal/flow_alloc.proto deleted file mode 100644 index 03a69fe0..00000000 --- a/src/ipcpd/normal/flow_alloc.proto +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Ouroboros - Copyright (C) 2016 - 2017 - * - * Flow allocation message - * - *    Dimitri Staessens <dimitri.staessens@ugent.be> - *    Sander Vrijders   <sander.vrijders@ugent.be> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * 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., http://www.fsf.org/about/contact/. - */ - -syntax = "proto2"; - -enum flow_alloc_code { -        FLOW_REQ   = 1; -        FLOW_REPLY = 2; -}; - -message flow_alloc_msg { -        required flow_alloc_code code = 1; -        optional bytes hash           = 2; -        optional uint32 qc            = 3; -        optional sint32 response      = 4; -        optional uint32 r_fd          = 5; -        optional uint32 s_fd          = 6; -        optional uint64 s_addr        = 7; -}; | 
