diff options
Diffstat (limited to 'src/ipcpd/raptor')
| -rw-r--r-- | src/ipcpd/raptor/CMakeLists.txt | 60 | ||||
| -rw-r--r-- | src/ipcpd/raptor/main.c | 713 | ||||
| -rw-r--r-- | src/ipcpd/raptor/raptor_messages.proto | 39 | 
3 files changed, 377 insertions, 435 deletions
| diff --git a/src/ipcpd/raptor/CMakeLists.txt b/src/ipcpd/raptor/CMakeLists.txt index 2cb86a76..03411941 100644 --- a/src/ipcpd/raptor/CMakeLists.txt +++ b/src/ipcpd/raptor/CMakeLists.txt @@ -12,26 +12,40 @@ include_directories(${CURRENT_BINARY_PARENT_DIR})  include_directories(${CMAKE_SOURCE_DIR}/include)  include_directories(${CMAKE_BINARY_DIR}/include) -protobuf_generate_c(RAPTOR_PROTO_SRCS RAPTOR_PROTO_HDRS -  raptor_messages.proto) - -set(IPCP_RAPTOR_TARGET ipcpd-raptor -  CACHE STRING "IPCP_RAPTOR_TARGET") - -set(RAPTOR_SOURCES -  # Add source files here -  ${CMAKE_CURRENT_SOURCE_DIR}/main.c) - -add_executable(ipcpd-raptor ${RAPTOR_SOURCES} ${IPCP_SOURCES} -  ${RAPTOR_PROTO_SRCS}) -target_link_libraries(ipcpd-raptor LINK_PUBLIC ouroboros -  ${PROTOBUF_C_LIBRARY}) - -test_and_set_c_compiler_flag_global(-std=c99) - -include(AddCompileFlags) -if (CMAKE_BUILD_TYPE MATCHES Debug) -  add_compile_flags(ipcpd-raptor -DCONFIG_OUROBOROS_DEBUG) -endif (CMAKE_BUILD_TYPE MATCHES Debug) - -install(TARGETS ipcpd-raptor RUNTIME DESTINATION sbin) +if (CMAKE_SYSTEM_NAME STREQUAL "Linux") +  find_path(RAPTOR_KERNEL_MODULE +    NAMES +    raptor.ko +    raptor.ko.gz +    HINTS +    /lib/modules/${CMAKE_SYSTEM_VERSION}/ +    /lib/modules/${CMAKE_SYSTEM_VERSION}/extramodules/ +  ) + +  mark_as_advanced(RAPTOR_KERNEL_MODULE) + +  if (RAPTOR_KERNEL_MODULE) +    set(DISABLE_RAPTOR FALSE CACHE BOOL +      "Disable support for raptor devices") +    if (NOT DISABLE_RAPTOR) +      message(STATUS "Kernel module for raptor found. Building raptor.") +      set(IPCP_RAPTOR_TARGET ipcpd-raptor CACHE INTERNAL "") + +      set(RAPTOR_SOURCES +      # Add source files here +      ${CMAKE_CURRENT_SOURCE_DIR}/main.c) + +      add_executable(ipcpd-raptor ${RAPTOR_SOURCES} ${IPCP_SOURCES}) +      target_link_libraries(ipcpd-raptor LINK_PUBLIC ouroboros-dev) + +      include(AddCompileFlags) +      if (CMAKE_BUILD_TYPE MATCHES "Debug*") +        add_compile_flags(ipcpd-raptor -DCONFIG_OUROBOROS_DEBUG) +      endif () + +      install(TARGETS ipcpd-raptor RUNTIME DESTINATION sbin) +    else () +      message(STATUS "Raptor support disabled by user") +    endif () +  endif () +endif () diff --git a/src/ipcpd/raptor/main.c b/src/ipcpd/raptor/main.c index be66bd9a..d0790321 100644 --- a/src/ipcpd/raptor/main.c +++ b/src/ipcpd/raptor/main.c @@ -23,9 +23,10 @@  #define _DEFAULT_SOURCE +#include "config.h" +  #define OUROBOROS_PREFIX "ipcpd/raptor" -#include <ouroboros/config.h>  #include <ouroboros/hash.h>  #include <ouroboros/errno.h>  #include <ouroboros/list.h> @@ -39,7 +40,7 @@  #include <ouroboros/time_utils.h>  #include "ipcp.h" -#include "raptor_messages.pb-c.h" +#include "shim-data.h"  #include <net/if.h>  #include <signal.h> @@ -62,49 +63,58 @@  #include <poll.h>  #include <sys/mman.h> -typedef RaptorMsg raptor_msg_t; - -#define THIS_TYPE IPCP_RAPTOR -#define MGMT_SAP 0x01 -#define MAC_SIZE 6 -#define MAX_SAPS 64 +#define THIS_TYPE          IPCP_RAPTOR +#define MGMT_SAP           0x01 +#define MAC_SIZE           6 +#define MAX_SAPS           64 -#define EVENT_WAIT_TIMEOUT 100 /* us */ +#define EVENT_WAIT_TIMEOUT 100  /* us */  #define NAME_QUERY_TIMEOUT 2000 /* ms */ -#define MGMT_TIMEOUT 100 /* ms */ +#define MGMT_TIMEOUT       100  /* ms */ -#define IOCTL_SEND 0xAD420000 -#define IOCTL_RECV 0xAD430000 -#define IOCTL_SEND_DONE 0xAD440000 -#define IOCTL_RECV_DONE 0xAD450000 -#define IOCTL_RECV_NEED 0xAD460000 +#define IOCTL_SEND         0xAD420000 +#define IOCTL_RECV         0xAD430000 +#define IOCTL_SEND_DONE    0xAD440000 +#define IOCTL_RECV_DONE    0xAD450000 +#define IOCTL_RECV_NEED    0xAD460000 -#define RAPTOR_PAGE ((1 << 12) - 200) /* 4kB - 200 */ +#define RAPTOR_PAGE        ((1 << 12) - 200) /* 4kB - 200 */ +#define RAPTOR_PAGE_MASK   (~0xFFF) -#define RAPTOR_PAGE_MASK (~0xFFF) +#define RAPTOR_BATCH       100 +#define RAPTOR_HEADER      3 -#define RAPTOR_BATCH 100 +#define FLOW_REQ           0 +#define FLOW_REPLY         1 +#define NAME_QUERY_REQ     2 +#define NAME_QUERY_REPLY   3 -#define RAPTOR_HEADER 3 +struct mgmt_msg { +        uint8_t code; +        uint8_t ssap; +        uint8_t dsap; +        uint8_t qoscube; +        int8_t  response; +} __attribute__((packed));  struct ef {          int8_t  sap;          int8_t  r_sap; -        uint8_t r_addr[MAC_SIZE];  };  struct mgmt_frame {          struct list_head next; -        uint8_t          r_addr[MAC_SIZE];          uint8_t          buf[RAPTOR_PAGE];          size_t           len;  };  struct { +        struct shim_data * shim_data; +          int                ioctl_fd;          struct bmp *       saps; -        flow_set_t *       np1_flows; +        fset_t *           np1_flows;          fqueue_t *         fq;          int *              ef_to_fd;          struct ef *        fd_to_ef; @@ -126,119 +136,113 @@ struct {  static int raptor_data_init(void)  {          int                i; -        int                ret = -1; +        int                ret = -ENOMEM;          pthread_condattr_t cattr; -        log_info("%s", __FUNCTION__); - -        raptor_data.fd_to_ef = malloc(sizeof(struct ef) * IRMD_MAX_FLOWS); +        raptor_data.fd_to_ef = +                malloc(sizeof(*raptor_data.fd_to_ef) * SYS_MAX_FLOWS);          if (raptor_data.fd_to_ef == NULL) -                return -ENOMEM; +                goto fail_fd_to_ef; -        raptor_data.ef_to_fd = malloc(sizeof(struct ef) * MAX_SAPS); -        if (raptor_data.ef_to_fd == NULL) { -                ret = -ENOMEM; -                goto free_fd_to_ef; -        } +        raptor_data.ef_to_fd = +                malloc(sizeof(*raptor_data.ef_to_fd) * MAX_SAPS); +        if (raptor_data.ef_to_fd == NULL) +                goto fail_ef_to_fd;          raptor_data.saps = bmp_create(MAX_SAPS, 2); -        if (raptor_data.saps == NULL) { -                ret = -ENOMEM; -                goto free_ef_to_fd; -        } +        if (raptor_data.saps == NULL) +                goto fail_saps; -        raptor_data.np1_flows = flow_set_create(); -        if (raptor_data.np1_flows == NULL) { -                ret = -ENOMEM; -                goto bmp_destroy; -        } +        raptor_data.np1_flows = fset_create(); +        if (raptor_data.np1_flows == NULL) +                goto fail_np1_flows;          raptor_data.fq = fqueue_create(); -        if (raptor_data.fq == NULL) { -                ret = -ENOMEM; -                goto flow_set_destroy; -        } +        if (raptor_data.fq == NULL) +                goto fail_fq;          for (i = 0; i < MAX_SAPS; ++i)                  raptor_data.ef_to_fd[i] = -1; -        for (i = 0; i < IRMD_MAX_FLOWS; ++i) { +        for (i = 0; i < SYS_MAX_FLOWS; ++i) {                  raptor_data.fd_to_ef[i].sap   = -1;                  raptor_data.fd_to_ef[i].r_sap = -1; -                memset(&raptor_data.fd_to_ef[i].r_addr, 0, MAC_SIZE);          } +        raptor_data.shim_data = shim_data_create(); +        if (raptor_data.shim_data == NULL) +                goto fail_shim_data; + +        ret = -1; +          if (pthread_rwlock_init(&raptor_data.flows_lock, NULL)) -                goto fqueue_destroy; +                goto fail_flows_lock;          if (pthread_mutex_init(&raptor_data.mgmt_lock, NULL)) -                goto flow_lock_destroy; +                goto fail_mgmt_lock;          if (pthread_condattr_init(&cattr)) -                goto mgmt_lock_destroy;; +                goto fail_condattr;  #ifndef __APPLE__          pthread_condattr_setclock(&cattr, PTHREAD_COND_CLOCK);  #endif          if (pthread_cond_init(&raptor_data.mgmt_cond, &cattr)) -                goto mgmt_lock_destroy; +                goto fail_mgmt_cond; + +        pthread_condattr_destroy(&cattr);          list_head_init(&raptor_data.mgmt_frames);          return 0; - mgmt_lock_destroy: + fail_mgmt_cond: +        pthread_condattr_destroy(&cattr); + fail_condattr:          pthread_mutex_destroy(&raptor_data.mgmt_lock); - flow_lock_destroy: + fail_mgmt_lock:          pthread_rwlock_destroy(&raptor_data.flows_lock); - fqueue_destroy: + fail_flows_lock: +        shim_data_destroy(raptor_data.shim_data); + fail_shim_data:          fqueue_destroy(raptor_data.fq); - flow_set_destroy: -        flow_set_destroy(raptor_data.np1_flows); - bmp_destroy: + fail_fq: +        fset_destroy(raptor_data.np1_flows); + fail_np1_flows:          bmp_destroy(raptor_data.saps); - free_ef_to_fd: + fail_saps:          free(raptor_data.ef_to_fd); - free_fd_to_ef: + fail_ef_to_fd:          free(raptor_data.fd_to_ef); - + fail_fd_to_ef:          return ret;  } -void raptor_data_fini(void) +static void raptor_data_fini(void)  { -        log_info("%s", __FUNCTION__); -          close(raptor_data.ioctl_fd);          pthread_cond_destroy(&raptor_data.mgmt_cond);          pthread_mutex_destroy(&raptor_data.mgmt_lock);          pthread_rwlock_destroy(&raptor_data.flows_lock);          fqueue_destroy(raptor_data.fq); -        flow_set_destroy(raptor_data.np1_flows); +        fset_destroy(raptor_data.np1_flows);          bmp_destroy(raptor_data.saps);          free(raptor_data.fd_to_ef);          free(raptor_data.ef_to_fd);  } -static int raptor_ipcp_send_frame(struct shm_du_buff * sdb, -                                  uint8_t              dsap) +static int raptor_send_frame(struct shm_du_buff * sdb, +                             uint8_t              dsap)  { -        /* length (16b) + dsap (8b) */ -          uint8_t * frame; -        size_t frame_len; +        size_t    frame_len;          uint8_t * payload; -        size_t len; +        size_t    len;          payload = shm_du_buff_head(sdb);          len = shm_du_buff_tail(sdb) - shm_du_buff_head(sdb); -        if (payload == NULL) { -                log_err("Payload was NULL."); -                return -1; -        } -          frame_len = RAPTOR_HEADER + len;          if (frame_len >= RAPTOR_PAGE) { @@ -247,7 +251,6 @@ static int raptor_ipcp_send_frame(struct shm_du_buff * sdb,          }          frame = memalign(1 << 12, 1 << 12); -          if (frame == NULL) {                  log_err("frame == NULL");                  return -1; @@ -264,99 +267,82 @@ static int raptor_ipcp_send_frame(struct shm_du_buff * sdb,          memcpy(&frame[RAPTOR_HEADER], payload, len); -        ipcp_sdb_release(sdb); -          if (ioctl(raptor_data.ioctl_fd, IOCTL_SEND | 1, &frame) != 1) {                  log_err("Ioctl send failed.");                  free(frame);                  return -1;          } +          return 0;  } -static int raptor_ipcp_send_mgmt_frame(raptor_msg_t * msg, -                                        const uint8_t *      dst_addr) +static int raptor_sap_alloc(uint8_t         ssap, +                            const uint8_t * hash, +                            qoscube_t       cube)  { -        size_t    len; -        uint8_t * buf; +        struct mgmt_msg *    msg;          struct shm_du_buff * sdb; -        (void)dst_addr; - -        log_info("%s", __FUNCTION__); - -        len = raptor_msg__get_packed_size(msg); -        if (len == 0) -                return -1; - -        if (ipcp_sdb_reserve(&sdb, len) < 0) { +        if (ipcp_sdb_reserve(&sdb, sizeof(*msg) + ipcp_dir_hash_len()) < 0) {                  log_err("failed to reserve sdb for management frame.");                  return -1;          } -        buf = shm_du_buff_head(sdb); +        msg          = (struct mgmt_msg *) shm_du_buff_head(sdb); +        msg->code    = FLOW_REQ; +        msg->ssap    = ssap; +        msg->qoscube = cube; -        raptor_msg__pack(msg, buf); +        memcpy(msg + 1, hash, ipcp_dir_hash_len()); -        if (raptor_ipcp_send_frame(sdb, MGMT_SAP)) { +        if (raptor_send_frame(sdb, MGMT_SAP)) {                  log_err("Failed to send management frame."); +                ipcp_sdb_release(sdb);                  return -1;          } + +        ipcp_sdb_release(sdb); +          return 0;  } -static int raptor_ipcp_sap_alloc(const uint8_t * dst_addr, -                                  uint8_t         ssap, -                                  const uint8_t * hash, -                                  qoscube_t       cube) +static int raptor_sap_alloc_resp(uint8_t   ssap, +                                 uint8_t   dsap, +                                 int       response)  { -        raptor_msg_t msg = RAPTOR_MSG__INIT; - -        log_info("%s", __FUNCTION__); - -        msg.code        = RAPTOR_MSG_CODE__FLOW_REQ; -        msg.has_ssap    = true; -        msg.ssap        = ssap; -        msg.has_hash    = true; -        msg.hash.len    = ipcp_dir_hash_len(); -        msg.hash.data   = (uint8_t *) hash; -        msg.has_qoscube = true; -        msg.qoscube     = cube; +        struct mgmt_msg * msg; +        struct shm_du_buff * sdb; -        return raptor_ipcp_send_mgmt_frame(&msg, dst_addr); -} +        if (ipcp_sdb_reserve(&sdb, sizeof(*msg)) < 0) { +                log_err("failed to reserve sdb for management frame."); +                return -1; +        } -static int raptor_ipcp_sap_alloc_resp(uint8_t * dst_addr, -                                       uint8_t   ssap, -                                       uint8_t   dsap, -                                       int       response) -{ -        raptor_msg_t msg = RAPTOR_MSG__INIT; +        msg           = (struct mgmt_msg *) shm_du_buff_head(sdb); +        msg->code     = FLOW_REPLY; +        msg->ssap     = ssap; +        msg->dsap     = dsap; +        msg->response = response; -        log_info("%s", __FUNCTION__); +        if (raptor_send_frame(sdb, MGMT_SAP)) { +                log_err("Failed to send management frame."); +                ipcp_sdb_release(sdb); +                return -1; +        } -        msg.code         = RAPTOR_MSG_CODE__FLOW_REPLY; -        msg.has_ssap     = true; -        msg.ssap         = ssap; -        msg.has_dsap     = true; -        msg.dsap         = dsap; -        msg.has_response = true; -        msg.response     = response; +        ipcp_sdb_release(sdb); -        return raptor_ipcp_send_mgmt_frame(&msg, dst_addr); +        return 0;  } -static int raptor_ipcp_sap_req(uint8_t         r_sap, -                                uint8_t *       r_addr, -                                const uint8_t * dst, -                                qoscube_t       cube) +static int raptor_sap_req(uint8_t         r_sap, +                          const uint8_t * dst, +                          qoscube_t       cube)  {          struct timespec ts = {0, EVENT_WAIT_TIMEOUT * 1000};          struct timespec abstime;          int             fd; -        log_info("%s", __FUNCTION__); -          clock_gettime(PTHREAD_COND_CLOCK, &abstime);          pthread_mutex_lock(&ipcpi.alloc_lock); @@ -385,7 +371,6 @@ static int raptor_ipcp_sap_req(uint8_t         r_sap,          pthread_rwlock_wrlock(&raptor_data.flows_lock);          raptor_data.fd_to_ef[fd].r_sap = r_sap; -        memcpy(raptor_data.fd_to_ef[fd].r_addr, r_addr, MAC_SIZE);          ipcpi.alloc_id = fd;          pthread_cond_broadcast(&ipcpi.alloc_cond); @@ -398,16 +383,13 @@ static int raptor_ipcp_sap_req(uint8_t         r_sap,          return 0;  } -static int raptor_ipcp_sap_alloc_reply(uint8_t   ssap, -                                        uint8_t * r_addr, -                                        int       dsap, -                                        int       response) +static int raptor_sap_alloc_reply(uint8_t ssap, +                                  int     dsap, +                                  int     response)  {          int ret = 0;          int fd = -1; -        log_info("%s", __FUNCTION__); -          pthread_rwlock_wrlock(&raptor_data.flows_lock);          fd = raptor_data.ef_to_fd[dsap]; @@ -417,12 +399,10 @@ static int raptor_ipcp_sap_alloc_reply(uint8_t   ssap,                  return -1; /* -EFLOWNOTFOUND */          } -        if (response) { +        if (response)                  bmp_release(raptor_data.saps, raptor_data.fd_to_ef[fd].sap); -        } else { +        else                  raptor_data.fd_to_ef[fd].r_sap = ssap; -                memcpy(raptor_data.fd_to_ef[fd].r_addr, r_addr, MAC_SIZE); -        }          pthread_rwlock_unlock(&raptor_data.flows_lock); @@ -435,96 +415,93 @@ static int raptor_ipcp_sap_alloc_reply(uint8_t   ssap,  } -static int raptor_ipcp_name_query_req(const uint8_t * hash, -                                       uint8_t *       r_addr) +static int raptor_name_query_req(const uint8_t * hash)  { -        raptor_msg_t msg = RAPTOR_MSG__INIT; +        struct mgmt_msg *    msg; +        struct shm_du_buff * sdb; + +        if (!shim_data_reg_has(raptor_data.shim_data, hash)) +                return 0; + +        if (ipcp_sdb_reserve(&sdb, sizeof(*msg) + ipcp_dir_hash_len()) < 0) { +                log_err("failed to reserve sdb for management frame."); +                return -1; +        } -        log_info("%s", __FUNCTION__); +        msg          = (struct mgmt_msg *) shm_du_buff_head(sdb); +        msg->code    = NAME_QUERY_REPLY; -        if (shim_data_reg_has(ipcpi.shim_data, hash)) { -                msg.code      = RAPTOR_MSG_CODE__NAME_QUERY_REPLY; -                msg.has_hash  = true; -                msg.hash.len  = ipcp_dir_hash_len(); -                msg.hash.data = (uint8_t *) hash; +        memcpy(msg + 1, hash, ipcp_dir_hash_len()); -                raptor_ipcp_send_mgmt_frame(&msg, r_addr); +        if (raptor_send_frame(sdb, MGMT_SAP)) { +                log_err("Failed to send management frame."); +                ipcp_sdb_release(sdb); +                return -1;          } +        ipcp_sdb_release(sdb); +          return 0;  } -static int raptor_ipcp_name_query_reply(const uint8_t * hash, -                                         uint8_t *       r_addr) +static int raptor_name_query_reply(const uint8_t * hash)  { -        uint64_t           address = 0; -        struct list_head * pos; - -        log_info("%s", __FUNCTION__); - -        memcpy(&address, r_addr, MAC_SIZE); +        shim_data_dir_add_entry(raptor_data.shim_data, hash, 0); -        shim_data_dir_add_entry(ipcpi.shim_data, hash, address); - -        pthread_mutex_lock(&ipcpi.shim_data->dir_queries_lock); -        list_for_each(pos, &ipcpi.shim_data->dir_queries) { -                struct dir_query * e = -                        list_entry(pos, struct dir_query, next); -                if (memcmp(e->hash, hash, ipcp_dir_hash_len()) == 0) { -                        shim_data_dir_query_respond(e); -                } -        } -        pthread_mutex_unlock(&ipcpi.shim_data->dir_queries_lock); +        shim_data_dir_query_respond(raptor_data.shim_data, hash);          return 0;  } -static int raptor_ipcp_mgmt_frame(const uint8_t * buf, -                                   size_t          len, -                                   uint8_t *       r_addr) +static int raptor_mgmt_frame(const uint8_t * buf, +                             size_t          len)  { -        raptor_msg_t * msg; - -        log_info("%s", __FUNCTION__); - -        msg = raptor_msg__unpack(NULL, len, buf); -        if (msg == NULL) { -                log_err("Failed to unpack."); -                return -1; -        } +        struct mgmt_msg * msg = (struct mgmt_msg *) buf; +        uint8_t * hash = (uint8_t *) (msg + 1);          switch (msg->code) { -        case RAPTOR_MSG_CODE__FLOW_REQ: -                if (shim_data_reg_has(ipcpi.shim_data, msg->hash.data)) { -                        raptor_ipcp_sap_req(msg->ssap, -                                             r_addr, -                                             msg->hash.data, -                                             msg->qoscube); +        case FLOW_REQ: +                if (len != sizeof(*msg) + ipcp_dir_hash_len()) { +                        log_err("Corrupt message received."); +                        return -1;                  } + +                if (shim_data_reg_has(raptor_data.shim_data, hash)) +                        raptor_sap_req(msg->ssap, hash, msg->qoscube);                  break; -        case RAPTOR_MSG_CODE__FLOW_REPLY: -                raptor_ipcp_sap_alloc_reply(msg->ssap, -                                             r_addr, -                                             msg->dsap, -                                             msg->response); +        case FLOW_REPLY: +                if (len != sizeof(*msg)) { +                        log_err("Corrupt message received."); +                        return -1; +                } + +                raptor_sap_alloc_reply(msg->ssap, msg->dsap, msg->response);                  break; -        case RAPTOR_MSG_CODE__NAME_QUERY_REQ: -                raptor_ipcp_name_query_req(msg->hash.data, r_addr); +        case NAME_QUERY_REQ: +                if (len != sizeof(*msg) + ipcp_dir_hash_len()) { +                        log_err("Corrupt message received."); +                        return -1; +                } + +                raptor_name_query_req(hash);                  break; -        case RAPTOR_MSG_CODE__NAME_QUERY_REPLY: -                raptor_ipcp_name_query_reply(msg->hash.data, r_addr); +        case NAME_QUERY_REPLY: +                if (len != sizeof(*msg) + ipcp_dir_hash_len()) { +                        log_err("Corrupt message received."); +                        return -1; +                } + +                raptor_name_query_reply(hash);                  break;          default:                  log_err("Unknown message received %d.", msg->code); -                raptor_msg__free_unpacked(msg, NULL);                  return -1;          } -        raptor_msg__free_unpacked(msg, NULL);          return 0;  } -static void * raptor_ipcp_mgmt_handler(void * o) +static void * raptor_mgmt_handler(void * o)  {          int                 ret;          struct timespec     timeout = {(MGMT_TIMEOUT / 1000), @@ -534,10 +511,6 @@ static void * raptor_ipcp_mgmt_handler(void * o)          (void) o; -        log_info("%s", __FUNCTION__); - -        log_info("Mgmt handler started."); -          while (true) {                  ret = 0; @@ -570,44 +543,43 @@ static void * raptor_ipcp_mgmt_handler(void * o)                  list_del(&frame->next);                  pthread_mutex_unlock(&raptor_data.mgmt_lock); -                raptor_ipcp_mgmt_frame(frame->buf, frame->len, frame->r_addr); +                raptor_mgmt_frame(frame->buf, frame->len);                  free(frame);          } -        log_info("Mgmt handler stopped.");          return NULL;  } -static void raptor_ipcp_recv_frame(uint8_t* frame) +static void raptor_recv_frame(uint8_t * frame)  { -        uint8_t dsap; -        uint8_t* payload; -        size_t frame_len; -        size_t length; -        int fd; -        struct mgmt_frame * mgmt_frame; +        uint8_t              dsap; +        uint8_t *            payload; +        size_t               frame_len; +        size_t               length; +        int                  fd; +        struct mgmt_frame *  mgmt_frame;          struct shm_du_buff * sdb; -        size_t idx; +        size_t               idx; -        sdb = (struct shm_du_buff*)((uint64_t)frame & RAPTOR_PAGE_MASK); +        sdb = (struct shm_du_buff *)((uint64_t) frame & RAPTOR_PAGE_MASK);          idx = shm_du_buff_get_idx(sdb);          frame_len = frame[0] | (frame[1] << 8); -          if (frame_len < RAPTOR_HEADER) {                  log_err("Received packet smaller than header alone.");                  ipcp_sdb_release(sdb);                  return;          } +          if (frame_len >= RAPTOR_PAGE) {                  log_err("Received packet too large.");                  ipcp_sdb_release(sdb);                  return;          } -        dsap = frame[2]; +        dsap    = frame[2];          payload = &frame[RAPTOR_HEADER]; -        length = frame_len - RAPTOR_HEADER; +        length  = frame_len - RAPTOR_HEADER;          shm_du_buff_head_release(sdb, RAPTOR_HEADER);          shm_du_buff_tail_release(sdb, RAPTOR_PAGE - frame_len); @@ -623,7 +595,6 @@ static void raptor_ipcp_recv_frame(uint8_t* frame)                  }                  memcpy(mgmt_frame->buf, payload, length); -                memset(mgmt_frame->r_addr, 0, MAC_SIZE);                  mgmt_frame->len = length;                  list_add(&mgmt_frame->next, &raptor_data.mgmt_frames);                  pthread_cond_signal(&raptor_data.mgmt_cond); @@ -646,34 +617,32 @@ static void raptor_ipcp_recv_frame(uint8_t* frame)          }  } -static void * raptor_ipcp_recv_done_thread(void * o) +static void * raptor_recv_done_thread(void * o)  {          uint8_t * frames[RAPTOR_BATCH]; -        int count; -        int i; +        int       count; +        int       i; -        (void)o; - -        log_info("Recv_done thread started."); +        (void) o;          while (true) {                  if (ipcp_get_state() != IPCP_OPERATIONAL)                          break; -                count = ioctl(raptor_data.ioctl_fd, IOCTL_RECV_DONE | RAPTOR_BATCH, frames); +                count = ioctl(raptor_data.ioctl_fd, +                              IOCTL_RECV_DONE | RAPTOR_BATCH, frames);                  if (count <= 0)                          continue;                  for (i = 0; i < count; i++) -                        raptor_ipcp_recv_frame(frames[i]); +                        raptor_recv_frame(frames[i]);          } -        log_info("Recv_done thread stopped.");          return NULL;  } -static void * raptor_ipcp_send_thread(void * o) +static void * raptor_send_thread(void * o)  {          struct timespec      timeout = {0, EVENT_WAIT_TIMEOUT * 1000};          int                  fd; @@ -682,12 +651,7 @@ static void * raptor_ipcp_send_thread(void * o)          (void) o; -        log_info("Send thread started."); - -        while (flow_event_wait(raptor_data.np1_flows, -                               raptor_data.fq, -                               &timeout)) { - +        while (fevent(raptor_data.np1_flows, raptor_data.fq, &timeout)) {                  if (ipcp_get_state() != IPCP_OPERATIONAL)                          break; @@ -700,80 +664,75 @@ static void * raptor_ipcp_send_thread(void * o)                          dsap = raptor_data.fd_to_ef[fd].r_sap; -                        raptor_ipcp_send_frame(sdb, dsap); +                        raptor_send_frame(sdb, dsap);                  }                  pthread_rwlock_unlock(&raptor_data.flows_lock);          } -        log_info("Send thread stopped.");          return NULL;  } -static void * raptor_ipcp_send_done_thread(void * o) +static void * raptor_send_done_thread(void * o)  {          uint8_t * frames[RAPTOR_BATCH]; -        int count; -        int i; +        int       count; +        int       i; -        (void)o; - -        log_info("Send_done thread started."); +        (void) o;          while (true) {                  if (ipcp_get_state() != IPCP_OPERATIONAL)                          break; -                count = ioctl(raptor_data.ioctl_fd, IOCTL_SEND_DONE | RAPTOR_BATCH, frames); +                count = ioctl(raptor_data.ioctl_fd, +                              IOCTL_SEND_DONE | RAPTOR_BATCH, frames);                  if (count <= 0)                          continue; -                for (i = 0; i < count; i++) { +                for (i = 0; i < count; i++)                          free(frames[i]); -                }          } -        log_info("Send_done thread stopped.");          return NULL;  } -static void * raptor_ipcp_recv_thread(void * o) +static void * raptor_recv_thread(void * o)  {          struct shm_du_buff * sdb; -        uint8_t * frames[RAPTOR_BATCH]; -        uint8_t ** head; -        int needed = 0; -        int count; -        int i; - -        (void)o; +        uint8_t *            frames[RAPTOR_BATCH]; +        uint8_t **           head; +        int                  needed = 0; +        int                  count; +        int                  i; -        log_info("Recv thread started."); +        (void) o;          while (true) {                  if (ipcp_get_state() != IPCP_OPERATIONAL)                          break; -                needed = ioctl(raptor_data.ioctl_fd, IOCTL_RECV_NEED | RAPTOR_BATCH, NULL); +                needed = ioctl(raptor_data.ioctl_fd, +                               IOCTL_RECV_NEED | RAPTOR_BATCH, NULL);                  if (needed <= 0)                          continue;                  for (i = 0; i < needed; i++) {                          if (ipcp_sdb_reserve(&sdb, RAPTOR_PAGE) < 0) { -                                log_err("Recv thread: reserve sdb failed. Stopping thread."); +                                log_err("Recv thread: reserve sdb failed.");                                  return NULL;                          }                          if ((uint64_t)sdb & (~RAPTOR_PAGE_MASK)) { -                                log_err("Recv thread: sdb not at offset 0 in page. Stopping thread."); +                                log_err("Recv thread: sdb not at offset 0.");                                  return NULL;                          }                          frames[i] = shm_du_buff_head(sdb);                          if ((uint64_t)frames[i] & 0x7) { -                                log_err("Recv thread: frame not 64bit aligned. Stopping thread."); +                                log_err("Recv thread: frame not aligned.");                                  return NULL;                          }                  } @@ -781,8 +740,8 @@ static void * raptor_ipcp_recv_thread(void * o)                  head = frames;                  do { -                        count = ioctl(raptor_data.ioctl_fd, IOCTL_RECV | needed, head); - +                        count = ioctl(raptor_data.ioctl_fd, +                                      IOCTL_RECV | needed, head);                          if (count <= 0)                                  continue; @@ -794,69 +753,93 @@ static void * raptor_ipcp_recv_thread(void * o)                  } while (needed > 0 && ipcp_get_state() == IPCP_OPERATIONAL);          } -        log_info("Recv thread stopped.");          return NULL;  } -static int raptor_ipcp_bootstrap(const struct ipcp_config * conf) +static int raptor_bootstrap(const struct ipcp_config * conf)  {          assert(conf);          assert(conf->type == THIS_TYPE); -        log_info("%s", __FUNCTION__); +        (void) conf;          raptor_data.ioctl_fd = open("/dev/raptor", 0); -          if (raptor_data.ioctl_fd < 0) {                  log_err("Failed to open /dev/raptor."); -                return -1; +                goto fail_ioctl;          }          ipcp_set_state(IPCP_OPERATIONAL); -        pthread_create(&raptor_data.mgmt_handler, -                       NULL, -                       raptor_ipcp_mgmt_handler, -                       NULL); +        if (pthread_create(&raptor_data.mgmt_handler, +                           NULL, +                           raptor_mgmt_handler, +                           NULL)) { +                ipcp_set_state(IPCP_INIT); +                goto fail_mgmt_handler; +        } -        pthread_create(&raptor_data.send_thread, -                       NULL, -                       raptor_ipcp_send_thread, -                       NULL); +        if (pthread_create(&raptor_data.send_thread, +                           NULL, +                           raptor_send_thread, +                           NULL)) { +                ipcp_set_state(IPCP_INIT); +                goto fail_send_thread; +        } -        pthread_create(&raptor_data.recv_thread, -                       NULL, -                       raptor_ipcp_recv_thread, -                       NULL); +        if (pthread_create(&raptor_data.recv_thread, +                           NULL, +                           raptor_recv_thread, +                           NULL)) { +                ipcp_set_state(IPCP_INIT); +                goto fail_recv_thread; +        } -        pthread_create(&raptor_data.send_done_thread, -                       NULL, -                       raptor_ipcp_send_done_thread, -                       NULL); +        if (pthread_create(&raptor_data.send_done_thread, +                           NULL, +                           raptor_send_done_thread, +                           NULL)) { +                ipcp_set_state(IPCP_INIT); +                goto fail_send_done_thread; +        } -        pthread_create(&raptor_data.recv_done_thread, -                       NULL, -                       raptor_ipcp_recv_done_thread, -                       NULL); +        if (pthread_create(&raptor_data.recv_done_thread, +                           NULL, +                           raptor_recv_done_thread, +                           NULL)) { +                ipcp_set_state(IPCP_INIT); +                goto fail_recv_done_thread; +        }          log_dbg("Bootstrapped raptor IPCP with api %d.", getpid());          return 0; + + fail_recv_done_thread: +        pthread_join(raptor_data.send_done_thread, NULL); + fail_send_done_thread: +        pthread_join(raptor_data.recv_thread, NULL); + fail_recv_thread: +        pthread_join(raptor_data.send_thread, NULL); + fail_send_thread: +        pthread_join(raptor_data.mgmt_handler, NULL); + fail_mgmt_handler: +        close(raptor_data.ioctl_fd); + fail_ioctl: +        return -1;  } -static int raptor_ipcp_reg(const uint8_t * hash) +static int raptor_reg(const uint8_t * hash)  {          uint8_t * hash_dup; -        log_info("%s", __FUNCTION__); -          hash_dup = ipcp_hash_dup(hash);          if (hash_dup == NULL) {                  log_err("Failed to duplicate hash.");                  return -ENOMEM;          } -        if (shim_data_reg_add_entry(ipcpi.shim_data, hash_dup)) { +        if (shim_data_reg_add_entry(raptor_data.shim_data, hash_dup)) {                  log_err("Failed to add " HASH_FMT " to local registry.",                          HASH_VAL(hash));                  free(hash_dup); @@ -868,65 +851,59 @@ static int raptor_ipcp_reg(const uint8_t * hash)          return 0;  } -static int raptor_ipcp_unreg(const uint8_t * hash) +static int raptor_unreg(const uint8_t * hash)  { -        log_info("%s", __FUNCTION__); - -        shim_data_reg_del_entry(ipcpi.shim_data, hash); +        shim_data_reg_del_entry(raptor_data.shim_data, hash);          return 0;  } -static int raptor_ipcp_query(const uint8_t * hash) +static int raptor_query(const uint8_t * hash)  { -        uint8_t            r_addr[MAC_SIZE]; -        struct timespec    timeout = {(NAME_QUERY_TIMEOUT / 1000), -                                      (NAME_QUERY_TIMEOUT % 1000) * MILLION}; -        raptor_msg_t msg = RAPTOR_MSG__INIT; -        struct dir_query * query; -        int                ret; - -        log_info("%s", __FUNCTION__); +        struct timespec      timeout = {(NAME_QUERY_TIMEOUT / 1000), +                                        (NAME_QUERY_TIMEOUT % 1000) * MILLION}; +        struct mgmt_msg *    msg; +        struct dir_query *   query; +        int                  ret; +        struct shm_du_buff * sdb; -        if (shim_data_dir_has(ipcpi.shim_data, hash)) +        if (shim_data_dir_has(raptor_data.shim_data, hash))                  return 0; -        msg.code      = RAPTOR_MSG_CODE__NAME_QUERY_REQ; -        msg.has_hash  = true; -        msg.hash.len  = ipcp_dir_hash_len(); -        msg.hash.data = (uint8_t *) hash; +        if (ipcp_sdb_reserve(&sdb, sizeof(*msg) + ipcp_dir_hash_len()) < 0) { +                log_err("failed to reserve sdb for management frame."); +                return -1; +        } + +        msg       = (struct mgmt_msg *) shm_du_buff_head(sdb); +        msg->code = NAME_QUERY_REQ; -        memset(r_addr, 0xff, MAC_SIZE); +        memcpy(msg + 1, hash, ipcp_dir_hash_len()); -        query = shim_data_dir_query_create(hash); -        if (query == NULL) +        query = shim_data_dir_query_create(raptor_data.shim_data, hash); +        if (query == NULL) { +                ipcp_sdb_release(sdb);                  return -1; +        } -        pthread_mutex_lock(&ipcpi.shim_data->dir_queries_lock); -        list_add(&query->next, &ipcpi.shim_data->dir_queries); -        pthread_mutex_unlock(&ipcpi.shim_data->dir_queries_lock); - -        raptor_ipcp_send_mgmt_frame(&msg, r_addr); +        if (raptor_send_frame(sdb, MGMT_SAP)) { +                log_err("Failed to send management frame."); +                ipcp_sdb_release(sdb); +                return -1; +        }          ret = shim_data_dir_query_wait(query, &timeout); -        pthread_mutex_lock(&ipcpi.shim_data->dir_queries_lock); -        list_del(&query->next); -        shim_data_dir_query_destroy(query); -        pthread_mutex_unlock(&ipcpi.shim_data->dir_queries_lock); +        shim_data_dir_query_destroy(raptor_data.shim_data, query);          return ret;  } -static int raptor_ipcp_flow_alloc(int             fd, -                                   const uint8_t * hash, -                                   qoscube_t       cube) +static int raptor_flow_alloc(int             fd, +                             const uint8_t * hash, +                             qoscube_t       cube)  {          uint8_t  ssap = 0; -        uint8_t  r_addr[MAC_SIZE]; -        uint64_t addr = 0; - -        log_info("%s", __FUNCTION__);          log_dbg("Allocating flow to " HASH_FMT ".", HASH_VAL(hash)); @@ -937,11 +914,10 @@ static int raptor_ipcp_flow_alloc(int             fd,                  return -1;          } -        if (!shim_data_dir_has(ipcpi.shim_data, hash)) { +        if (!shim_data_dir_has(raptor_data.shim_data, hash)) {                  log_err("Destination unreachable.");                  return -1;          } -        addr = shim_data_dir_get_addr(ipcpi.shim_data, hash);          pthread_rwlock_wrlock(&raptor_data.flows_lock); @@ -956,9 +932,7 @@ static int raptor_ipcp_flow_alloc(int             fd,          pthread_rwlock_unlock(&raptor_data.flows_lock); -        memcpy(r_addr, &addr, MAC_SIZE); - -        if (raptor_ipcp_sap_alloc(r_addr, ssap, hash, cube) < 0) { +        if (raptor_sap_alloc(ssap, hash, cube) < 0) {                  pthread_rwlock_wrlock(&raptor_data.flows_lock);                  bmp_release(raptor_data.saps, raptor_data.fd_to_ef[fd].sap);                  raptor_data.fd_to_ef[fd].sap = -1; @@ -967,23 +941,20 @@ static int raptor_ipcp_flow_alloc(int             fd,                  return -1;          } -        flow_set_add(raptor_data.np1_flows, fd); +        fset_add(raptor_data.np1_flows, fd);          log_dbg("Pending flow with fd %d on SAP %d.", fd, ssap);          return 0;  } -static int raptor_ipcp_flow_alloc_resp(int fd, -                                        int response) +static int raptor_flow_alloc_resp(int fd, +                                  int response)  {          struct timespec ts    = {0, EVENT_WAIT_TIMEOUT * 1000};          struct timespec abstime;          uint8_t         ssap  = 0;          uint8_t         r_sap = 0; -        uint8_t         r_addr[MAC_SIZE]; - -        log_info("%s", __FUNCTION__);          clock_gettime(PTHREAD_COND_CLOCK, &abstime); @@ -1015,45 +986,39 @@ static int raptor_ipcp_flow_alloc_resp(int fd,          }          raptor_data.fd_to_ef[fd].sap = ssap; -        memcpy(r_addr, raptor_data.fd_to_ef[fd].r_addr, MAC_SIZE);          r_sap = raptor_data.fd_to_ef[fd].r_sap;          raptor_data.ef_to_fd[ssap] = fd;          pthread_rwlock_unlock(&raptor_data.flows_lock); -        if (raptor_ipcp_sap_alloc_resp(r_addr, ssap, r_sap, response) < 0) { +        if (raptor_sap_alloc_resp(ssap, r_sap, response) < 0) {                  pthread_rwlock_wrlock(&raptor_data.flows_lock);                  bmp_release(raptor_data.saps, raptor_data.fd_to_ef[fd].sap);                  pthread_rwlock_unlock(&raptor_data.flows_lock);                  return -1;          } -        flow_set_add(raptor_data.np1_flows, fd); +        fset_add(raptor_data.np1_flows, fd);          log_dbg("Accepted flow, fd %d, SAP %d.", fd, (uint8_t)ssap);          return 0;  } -static int raptor_ipcp_flow_dealloc(int fd) +static int raptor_flow_dealloc(int fd)  {          uint8_t sap; -        uint8_t addr[MAC_SIZE]; - -        log_info("%s", __FUNCTION__);          ipcp_flow_fini(fd);          pthread_rwlock_wrlock(&raptor_data.flows_lock); -        flow_set_del(raptor_data.np1_flows, fd); +        fset_del(raptor_data.np1_flows, fd);          sap = raptor_data.fd_to_ef[fd].sap; -        memcpy(addr, raptor_data.fd_to_ef[fd].r_addr, MAC_SIZE);          bmp_release(raptor_data.saps, sap);          raptor_data.fd_to_ef[fd].sap = -1;          raptor_data.fd_to_ef[fd].r_sap = -1; -        memset(&raptor_data.fd_to_ef[fd].r_addr, 0, MAC_SIZE);          raptor_data.ef_to_fd[sap] = -1; @@ -1067,46 +1032,38 @@ static int raptor_ipcp_flow_dealloc(int fd)  }  static struct ipcp_ops raptor_ops = { -        .ipcp_bootstrap       = raptor_ipcp_bootstrap, +        .ipcp_bootstrap       = raptor_bootstrap,          .ipcp_enroll          = NULL, -        .ipcp_reg             = raptor_ipcp_reg, -        .ipcp_unreg           = raptor_ipcp_unreg, -        .ipcp_query           = raptor_ipcp_query, -        .ipcp_flow_alloc      = raptor_ipcp_flow_alloc, -        .ipcp_flow_alloc_resp = raptor_ipcp_flow_alloc_resp, -        .ipcp_flow_dealloc    = raptor_ipcp_flow_dealloc +        .ipcp_reg             = raptor_reg, +        .ipcp_unreg           = raptor_unreg, +        .ipcp_query           = raptor_query, +        .ipcp_flow_alloc      = raptor_flow_alloc, +        .ipcp_flow_alloc_resp = raptor_flow_alloc_resp, +        .ipcp_flow_dealloc    = raptor_flow_dealloc  };  int main(int    argc,           char * argv[])  { -        if (ipcp_init(argc, argv, THIS_TYPE, &raptor_ops) < 0) { -                ipcp_create_r(getpid(), -1); -                exit(EXIT_FAILURE); +        if (ipcp_init(argc, argv, &raptor_ops) < 0) { +                log_err("Failed to init IPCP."); +                goto fail_init;          }          if (raptor_data_init() < 0) {                  log_err("Failed to init shim-eth-llc data."); -                ipcp_create_r(getpid(), -1); -                ipcp_fini(); -                exit(EXIT_FAILURE); +                goto fail_data_init;          }          if (ipcp_boot() < 0) {                  log_err("Failed to boot IPCP."); -                ipcp_create_r(getpid(), -1); -                raptor_data_fini(); -                ipcp_fini(); -                exit(EXIT_FAILURE); +                goto fail_boot;          }          if (ipcp_create_r(getpid(), 0)) {                  log_err("Failed to notify IRMd we are initialized.");                  ipcp_set_state(IPCP_NULL); -                ipcp_shutdown(); -                raptor_data_fini(); -                ipcp_fini(); -                exit(EXIT_FAILURE); +                goto fail_create_r;          }          log_info("Raptor created."); @@ -1126,4 +1083,14 @@ int main(int    argc,          ipcp_fini();          exit(EXIT_SUCCESS); + + fail_create_r: +        ipcp_shutdown(); + fail_boot: +        raptor_data_fini(); + fail_data_init: +        ipcp_fini(); + fail_init: +        ipcp_create_r(getpid(), -1); +        exit(EXIT_FAILURE);  } diff --git a/src/ipcpd/raptor/raptor_messages.proto b/src/ipcpd/raptor/raptor_messages.proto deleted file mode 100644 index 6891b154..00000000 --- a/src/ipcpd/raptor/raptor_messages.proto +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Ouroboros - Copyright (C) 2016 - 2017 - * - * Raptor messages - * - *    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 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., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -syntax = "proto2"; - -enum raptor_msg_code { -        FLOW_REQ         = 1; -        FLOW_REPLY       = 2; -        NAME_QUERY_REQ   = 3; -        NAME_QUERY_REPLY = 4; -}; - -message raptor_msg { -        required raptor_msg_code code  = 1; -        optional bytes hash            = 2; -        optional uint32 ssap           = 3; -        optional uint32 dsap           = 4; -        optional uint32 qoscube        = 5; -        optional sint32 response       = 6; -}; | 
