diff options
Diffstat (limited to 'src/ipcpd/normal')
| -rw-r--r-- | src/ipcpd/normal/CMakeLists.txt | 11 | ||||
| -rw-r--r-- | src/ipcpd/normal/addr_auth.c | 1 | ||||
| -rw-r--r-- | src/ipcpd/normal/connmgr.c | 164 | ||||
| -rw-r--r-- | src/ipcpd/normal/dht.c | 5 | ||||
| -rw-r--r-- | src/ipcpd/normal/dir.c | 3 | ||||
| -rw-r--r-- | src/ipcpd/normal/dt.c | 5 | ||||
| -rw-r--r-- | src/ipcpd/normal/dt_pci.c | 1 | ||||
| -rw-r--r-- | src/ipcpd/normal/enroll.c | 6 | ||||
| -rw-r--r-- | src/ipcpd/normal/fa.c | 5 | ||||
| -rw-r--r-- | src/ipcpd/normal/gam.c | 3 | ||||
| -rw-r--r-- | src/ipcpd/normal/main.c | 7 | ||||
| -rw-r--r-- | src/ipcpd/normal/neighbors.c | 3 | ||||
| -rw-r--r-- | src/ipcpd/normal/pff.c | 5 | ||||
| -rw-r--r-- | src/ipcpd/normal/pol/complete.c | 3 | ||||
| -rw-r--r-- | src/ipcpd/normal/pol/flat.c | 3 | ||||
| -rw-r--r-- | src/ipcpd/normal/pol/graph.c | 3 | ||||
| -rw-r--r-- | src/ipcpd/normal/pol/link_state.c | 3 | ||||
| -rw-r--r-- | src/ipcpd/normal/pol/tests/graph_test.c | 3 | ||||
| -rw-r--r-- | src/ipcpd/normal/ribmgr.c | 3 | ||||
| -rw-r--r-- | src/ipcpd/normal/routing.c | 3 | ||||
| -rw-r--r-- | src/ipcpd/normal/sdu_sched.c | 5 | 
21 files changed, 157 insertions, 88 deletions
diff --git a/src/ipcpd/normal/CMakeLists.txt b/src/ipcpd/normal/CMakeLists.txt index 8c2d4efc..7a40e94c 100644 --- a/src/ipcpd/normal/CMakeLists.txt +++ b/src/ipcpd/normal/CMakeLists.txt @@ -12,7 +12,7 @@ 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 INTERNAL "")  protobuf_generate_c(FLOW_ALLOC_SRCS FLOW_ALLOC_HDRS flow_alloc.proto)  protobuf_generate_c(KAD_PROTO_SRCS KAD_PROTO_HDRS kademlia.proto) @@ -20,6 +20,10 @@ protobuf_generate_c(KAD_PROTO_SRCS KAD_PROTO_HDRS kademlia.proto)  # Add GPB sources of policies last  protobuf_generate_c(FSO_SRCS FSO_HDRS pol/fso.proto) +math(EXPR PFT_EXPR "1 << 12") +set(PFT_SIZE ${PFT_EXPR} CACHE STRING +  "Size of the PDU forwarding table") +  set(SOURCE_FILES    # Add source files here    addr_auth.c @@ -56,4 +60,7 @@ endif (CMAKE_BUILD_TYPE MATCHES Debug)  install(TARGETS ipcpd-normal RUNTIME DESTINATION sbin)  add_subdirectory(pol/tests) -add_subdirectory(tests) + +if (NOT GNU) +  add_subdirectory(tests) +endif () diff --git a/src/ipcpd/normal/addr_auth.c b/src/ipcpd/normal/addr_auth.c index 56b41384..e327e2fa 100644 --- a/src/ipcpd/normal/addr_auth.c +++ b/src/ipcpd/normal/addr_auth.c @@ -22,7 +22,6 @@  #define OUROBOROS_PREFIX "addr_auth" -#include <ouroboros/config.h>  #include <ouroboros/logs.h>  #include "addr_auth.h" diff --git a/src/ipcpd/normal/connmgr.c b/src/ipcpd/normal/connmgr.c index 1513c12a..a83d71c3 100644 --- a/src/ipcpd/normal/connmgr.c +++ b/src/ipcpd/normal/connmgr.c @@ -20,14 +20,16 @@   * Foundation, Inc., http://www.fsf.org/about/contact/.   */ +#define _POSIX_C_SOURCE 200112L +  #define OUROBOROS_PREFIX "normal-ipcp" -#include <ouroboros/config.h> -#include <ouroboros/logs.h>  #include <ouroboros/dev.h>  #include <ouroboros/cacep.h>  #include <ouroboros/cdap.h>  #include <ouroboros/errno.h> +#include <ouroboros/list.h> +#include <ouroboros/logs.h>  #include "ae.h"  #include "connmgr.h" @@ -58,15 +60,39 @@ struct {          pthread_t        acceptor;          struct list_head aes; -        pthread_mutex_t  aes_lock; +        pthread_rwlock_t aes_lock;  } connmgr; -static int add_ae_conn(struct ae *        ae, + +static int get_info_by_name(const char *       name, +                            struct conn_info * info) +{ +        struct list_head * p; + +        pthread_rwlock_rdlock(&connmgr.aes_lock); + +        list_for_each(p, &connmgr.aes) { +                struct ae * ae = list_entry(p, struct ae, next); +                if (strcmp(ae->info.ae_name, name) == 0) { +                        memcpy(info, &ae->info, sizeof(*info)); +                        pthread_rwlock_unlock(&connmgr.aes_lock); +                        return 0; +                } +        } + +        pthread_rwlock_unlock(&connmgr.aes_lock); + +        return -1; +} + +static int add_ae_conn(const char *       name,                         int                fd,                         qosspec_t          qs,                         struct conn_info * rcv_info)  { -        struct ae_conn * ae_conn = NULL; +        struct ae_conn *   ae_conn; +        struct list_head * p; +        struct ae *        ae = NULL;          ae_conn = malloc(sizeof(*ae_conn));          if (ae_conn == NULL) { @@ -74,40 +100,45 @@ static int add_ae_conn(struct ae *        ae,                  return -1;          } -        ae_conn->conn.conn_info = *rcv_info; +        ae_conn->conn.conn_info    = *rcv_info;          ae_conn->conn.flow_info.fd = fd;          ae_conn->conn.flow_info.qs = qs;          list_head_init(&ae_conn->next); +        pthread_rwlock_wrlock(&connmgr.aes_lock); + +        list_for_each(p, &connmgr.aes) { +                ae = list_entry(p, struct ae, next); +                if (strcmp(ae->info.ae_name, name) == 0) +                        break; +        } + +        /* Check if entry was removed during allocation. */ +        if (ae == NULL || strcmp(ae->info.ae_name, name) != 0) { +                pthread_rwlock_unlock(&connmgr.aes_lock); +                return -1; +        } +          pthread_mutex_lock(&ae->conn_lock); +          list_add(&ae_conn->next, &ae->conn_list);          pthread_cond_signal(&ae->conn_cond); -        pthread_mutex_unlock(&ae->conn_lock); -        return 0; -} +        pthread_mutex_unlock(&ae->conn_lock); -static struct ae * find_ae_by_name(char * name) -{ -        struct list_head * p = NULL; +        pthread_rwlock_unlock(&connmgr.aes_lock); -        list_for_each(p, &connmgr.aes) { -                struct ae * ae = list_entry(p, struct ae, next); -                if (strcmp(ae->info.ae_name, name) == 0) -                        return ae; -        } - -        return NULL; +        return 0;  }  static void * flow_acceptor(void * o)  {          int               fd;          qosspec_t         qs; +        struct conn_info  snd_info;          struct conn_info  rcv_info;          struct conn_info  fail_info; -        struct ae *       ae = NULL;          (void) o; @@ -132,25 +163,23 @@ static void * flow_acceptor(void * o)                          continue;                  } -                pthread_mutex_lock(&connmgr.aes_lock); -                ae = find_ae_by_name(rcv_info.ae_name); -                pthread_mutex_unlock(&connmgr.aes_lock); - -                if (ae != NULL) { -                        if (cacep_snd(fd, &ae->info)) { -                                log_err("Failed to respond to req."); -                                flow_dealloc(fd); -                                continue; -                        } - -                        if (add_ae_conn(ae, fd, qs, &rcv_info)) { -                                log_err("Failed to add ae conn."); -                                flow_dealloc(fd); -                                continue; -                        } -                } else { +                if (get_info_by_name(rcv_info.ae_name, &snd_info)) { +                        log_err("Failed to get info for %s.", rcv_info.ae_name);                          cacep_snd(fd, &fail_info);                          flow_dealloc(fd); +                        continue; +                } + +                if (cacep_snd(fd, &snd_info)) { +                        log_err("Failed to respond to request."); +                        flow_dealloc(fd); +                        continue; +                } + +                if (add_ae_conn(rcv_info.ae_name, fd, qs, &rcv_info)) { +                        log_err("Failed to add new connection."); +                        flow_dealloc(fd); +                        continue;                  }          } @@ -159,11 +188,11 @@ static void * flow_acceptor(void * o)  int connmgr_init(void)  { -        list_head_init(&connmgr.aes); - -        if (pthread_mutex_init(&connmgr.aes_lock, NULL)) +        if (pthread_rwlock_init(&connmgr.aes_lock, NULL))                  return -1; +        list_head_init(&connmgr.aes); +          return 0;  } @@ -178,13 +207,12 @@ int connmgr_start(void)  void connmgr_stop(void)  {          pthread_cancel(connmgr.acceptor); -        pthread_join(connmgr.acceptor, NULL);  }  static void destroy_ae(struct ae * ae)  { -        struct list_head * p = NULL; -        struct list_head * h = NULL; +        struct list_head * p; +        struct list_head * h;          pthread_mutex_lock(&ae->conn_lock); @@ -204,20 +232,22 @@ static void destroy_ae(struct ae * ae)  void connmgr_fini(void)  { -        struct list_head * p = NULL; -        struct list_head * n = NULL; +        struct list_head * p; +        struct list_head * h; + +        pthread_join(connmgr.acceptor, NULL); -        pthread_mutex_lock(&connmgr.aes_lock); +        pthread_rwlock_wrlock(&connmgr.aes_lock); -        list_for_each_safe(p, n, &connmgr.aes) { +        list_for_each_safe(p, h, &connmgr.aes) {                  struct ae * e = list_entry(p, struct ae, next);                  list_del(&e->next);                  destroy_ae(e);          } -        pthread_mutex_unlock(&connmgr.aes_lock); +        pthread_rwlock_unlock(&connmgr.aes_lock); -        pthread_mutex_destroy(&connmgr.aes_lock); +        pthread_rwlock_destroy(&connmgr.aes_lock);  }  struct ae * connmgr_ae_create(struct conn_info info) @@ -226,42 +256,46 @@ struct ae * connmgr_ae_create(struct conn_info info)          ae = malloc(sizeof(*ae));          if (ae == NULL) -                return NULL; +                goto fail_malloc;          list_head_init(&ae->next);          list_head_init(&ae->conn_list);          ae->info = info; -        if (pthread_mutex_init(&ae->conn_lock, NULL)) { -                free(ae); -                return NULL; -        } +        if (pthread_mutex_init(&ae->conn_lock, NULL)) +                goto fail_mutex_init; -        if (pthread_cond_init(&ae->conn_cond, NULL)) { -                pthread_mutex_destroy(&ae->conn_lock); -                free(ae); -                return NULL; -        } +        if (pthread_cond_init(&ae->conn_cond, NULL)) +                goto fail_cond_init; + +        pthread_rwlock_wrlock(&connmgr.aes_lock); -        pthread_mutex_lock(&connmgr.aes_lock);          list_add(&ae->next, &connmgr.aes); -        pthread_mutex_unlock(&connmgr.aes_lock); + +        pthread_rwlock_unlock(&connmgr.aes_lock);          return ae; + + fail_cond_init: +        pthread_mutex_destroy(&ae->conn_lock); + fail_mutex_init: +        free(ae); + fail_malloc: +        return NULL;  }  void connmgr_ae_destroy(struct ae * ae)  {          assert(ae); -        pthread_mutex_lock(&connmgr.aes_lock); +        pthread_rwlock_wrlock(&connmgr.aes_lock);          list_del(&ae->next); -        destroy_ae(ae); +        pthread_rwlock_unlock(&connmgr.aes_lock); -        pthread_mutex_unlock(&connmgr.aes_lock); +        destroy_ae(ae);  }  int connmgr_alloc(struct ae *   ae, @@ -311,7 +345,7 @@ int connmgr_alloc(struct ae *   ae,  int connmgr_wait(struct ae *   ae,                   struct conn * conn)  { -        struct ae_conn * ae_conn = NULL; +        struct ae_conn * ae_conn;          assert(ae);          assert(conn); diff --git a/src/ipcpd/normal/dht.c b/src/ipcpd/normal/dht.c index f41541d2..65e26406 100644 --- a/src/ipcpd/normal/dht.c +++ b/src/ipcpd/normal/dht.c @@ -20,9 +20,12 @@   * Foundation, Inc., http://www.fsf.org/about/contact/.   */ +#define _POSIX_C_SOURCE 200112L + +#include "config.h" +  #define OUROBOROS_PREFIX "dht" -#include <ouroboros/config.h>  #include <ouroboros/hash.h>  #include <ouroboros/bitmap.h>  #include <ouroboros/errno.h> diff --git a/src/ipcpd/normal/dir.c b/src/ipcpd/normal/dir.c index 231ba110..feae7013 100644 --- a/src/ipcpd/normal/dir.c +++ b/src/ipcpd/normal/dir.c @@ -20,9 +20,10 @@   * Foundation, Inc., http://www.fsf.org/about/contact/.   */ +#define _POSIX_C_SOURCE 200112L +  #define OUROBOROS_PREFIX "directory" -#include <ouroboros/config.h>  #include <ouroboros/endian.h>  #include <ouroboros/errno.h>  #include <ouroboros/logs.h> diff --git a/src/ipcpd/normal/dt.c b/src/ipcpd/normal/dt.c index 290c409d..173266f4 100644 --- a/src/ipcpd/normal/dt.c +++ b/src/ipcpd/normal/dt.c @@ -20,9 +20,12 @@   * Foundation, Inc., http://www.fsf.org/about/contact/.   */ +#define _POSIX_C_SOURCE 200112L + +#include "config.h" +  #define OUROBOROS_PREFIX "dt-ae" -#include <ouroboros/config.h>  #include <ouroboros/bitmap.h>  #include <ouroboros/errno.h>  #include <ouroboros/logs.h> diff --git a/src/ipcpd/normal/dt_pci.c b/src/ipcpd/normal/dt_pci.c index e139cf91..9e6dfa89 100644 --- a/src/ipcpd/normal/dt_pci.c +++ b/src/ipcpd/normal/dt_pci.c @@ -20,7 +20,6 @@   * Foundation, Inc., http://www.fsf.org/about/contact/.   */ -#include <ouroboros/config.h>  #include <ouroboros/errno.h>  #include <ouroboros/rib.h> diff --git a/src/ipcpd/normal/enroll.c b/src/ipcpd/normal/enroll.c index be1596d0..a33239a0 100644 --- a/src/ipcpd/normal/enroll.c +++ b/src/ipcpd/normal/enroll.c @@ -19,9 +19,11 @@   * along with this program; if not, write to the Free Software   * Foundation, Inc., http://www.fsf.org/about/contact/.   */ + +#define _POSIX_C_SOURCE 199309L +  #define OUROBOROS_PREFIX "enrollment" -#include <ouroboros/config.h>  #include <ouroboros/endian.h>  #include <ouroboros/errno.h>  #include <ouroboros/cdap.h> @@ -322,6 +324,7 @@ int enroll_init(void)  void enroll_fini(void)  { +        pthread_join(enroll.listener, NULL);          cdap_destroy(enroll.cdap);          connmgr_ae_destroy(enroll.ae);  } @@ -337,5 +340,4 @@ int enroll_start(void)  void enroll_stop(void)  {          pthread_cancel(enroll.listener); -        pthread_join(enroll.listener, NULL);  } diff --git a/src/ipcpd/normal/fa.c b/src/ipcpd/normal/fa.c index 2488f017..682dc5c6 100644 --- a/src/ipcpd/normal/fa.c +++ b/src/ipcpd/normal/fa.c @@ -20,9 +20,12 @@   * Foundation, Inc., http://www.fsf.org/about/contact/.   */ +#define _POSIX_C_SOURCE 200112L + +#include "config.h" +  #define OUROBOROS_PREFIX "flow-allocator" -#include <ouroboros/config.h>  #include <ouroboros/logs.h>  #include <ouroboros/fqueue.h>  #include <ouroboros/rib.h> diff --git a/src/ipcpd/normal/gam.c b/src/ipcpd/normal/gam.c index 9997506c..3b4cc5de 100644 --- a/src/ipcpd/normal/gam.c +++ b/src/ipcpd/normal/gam.c @@ -20,9 +20,10 @@   * Foundation, Inc., http://www.fsf.org/about/contact/.   */ +#define _POSIX_C_SOURCE 200112L +  #define OUROBOROS_PREFIX "dt-gam" -#include <ouroboros/config.h>  #include <ouroboros/cdap.h>  #include <ouroboros/dev.h>  #include <ouroboros/logs.h> diff --git a/src/ipcpd/normal/main.c b/src/ipcpd/normal/main.c index 27fefdb6..53762415 100644 --- a/src/ipcpd/normal/main.c +++ b/src/ipcpd/normal/main.c @@ -20,9 +20,12 @@   * Foundation, Inc., http://www.fsf.org/about/contact/.   */ +#define _POSIX_C_SOURCE 200809L + +#include "config.h" +  #define OUROBOROS_PREFIX "normal-ipcp" -#include <ouroboros/config.h>  #include <ouroboros/endian.h>  #include <ouroboros/logs.h>  #include <ouroboros/ipcp-dev.h> @@ -156,6 +159,7 @@ static int boot_components(void)          ipcp_set_state(IPCP_OPERATIONAL);          if (connmgr_start()) { +                ipcp_set_state(IPCP_INIT);                  log_err("Failed to start AP connection manager.");                  goto fail_connmgr_start;          } @@ -163,7 +167,6 @@ static int boot_components(void)          return 0;   fail_connmgr_start: -        ipcp_set_state(IPCP_INIT);          enroll_stop();   fail_enroll_start:          dir_fini(); diff --git a/src/ipcpd/normal/neighbors.c b/src/ipcpd/normal/neighbors.c index 0ac5e958..5da0f0df 100644 --- a/src/ipcpd/normal/neighbors.c +++ b/src/ipcpd/normal/neighbors.c @@ -20,9 +20,10 @@   * Foundation, Inc., http://www.fsf.org/about/contact/.   */ +#define _POSIX_C_SOURCE 199309L +  #define OUROBOROS_PREFIX "neighbors" -#include <ouroboros/config.h>  #include <ouroboros/qoscube.h>  #include <ouroboros/ipcp-dev.h>  #include <ouroboros/errno.h> diff --git a/src/ipcpd/normal/pff.c b/src/ipcpd/normal/pff.c index acf4db1a..d6c9ddee 100644 --- a/src/ipcpd/normal/pff.c +++ b/src/ipcpd/normal/pff.c @@ -20,9 +20,12 @@   * Foundation, Inc., http://www.fsf.org/about/contact/.   */ +#define _POSIX_C_SOURCE 200112L + +#include "config.h" +  #define OUROBOROS_PREFIX "pff" -#include <ouroboros/config.h>  #include <ouroboros/logs.h>  #include <ouroboros/hashtable.h>  #include <ouroboros/errno.h> diff --git a/src/ipcpd/normal/pol/complete.c b/src/ipcpd/normal/pol/complete.c index e31f345a..6c6e7372 100644 --- a/src/ipcpd/normal/pol/complete.c +++ b/src/ipcpd/normal/pol/complete.c @@ -20,9 +20,10 @@   * Foundation, Inc., http://www.fsf.org/about/contact/.   */ +#define _POSIX_C_SOURCE 200112L +  #define OUROBOROS_PREFIX "complete" -#include <ouroboros/config.h>  #include <ouroboros/qoscube.h>  #include <ouroboros/rib.h>  #include <ouroboros/dev.h> diff --git a/src/ipcpd/normal/pol/flat.c b/src/ipcpd/normal/pol/flat.c index 966d0d03..1fece07f 100644 --- a/src/ipcpd/normal/pol/flat.c +++ b/src/ipcpd/normal/pol/flat.c @@ -20,9 +20,10 @@   * Foundation, Inc., http://www.fsf.org/about/contact/.   */ +#define _POSIX_C_SOURCE 200112L +  #define OUROBOROS_PREFIX "flat-addr-auth" -#include <ouroboros/config.h>  #include <ouroboros/logs.h>  #include <ouroboros/errno.h>  #include <ouroboros/time_utils.h> diff --git a/src/ipcpd/normal/pol/graph.c b/src/ipcpd/normal/pol/graph.c index 7ec9c035..3611f0b0 100644 --- a/src/ipcpd/normal/pol/graph.c +++ b/src/ipcpd/normal/pol/graph.c @@ -20,9 +20,10 @@   * Foundation, Inc., http://www.fsf.org/about/contact/.   */ +#define _POSIX_C_SOURCE 200112L +  #define OUROBOROS_PREFIX "graph" -#include <ouroboros/config.h>  #include <ouroboros/logs.h>  #include <ouroboros/errno.h>  #include <ouroboros/list.h> diff --git a/src/ipcpd/normal/pol/link_state.c b/src/ipcpd/normal/pol/link_state.c index 322b22d7..9dfed5c0 100644 --- a/src/ipcpd/normal/pol/link_state.c +++ b/src/ipcpd/normal/pol/link_state.c @@ -20,9 +20,10 @@   * Foundation, Inc., http://www.fsf.org/about/contact/.   */ +#define _POSIX_C_SOURCE 200112L +  #define OUROBOROS_PREFIX "link-state-routing" -#include <ouroboros/config.h>  #include <ouroboros/errno.h>  #include <ouroboros/list.h>  #include <ouroboros/logs.h> diff --git a/src/ipcpd/normal/pol/tests/graph_test.c b/src/ipcpd/normal/pol/tests/graph_test.c index 30201800..87574187 100644 --- a/src/ipcpd/normal/pol/tests/graph_test.c +++ b/src/ipcpd/normal/pol/tests/graph_test.c @@ -20,7 +20,8 @@   * Foundation, Inc., http://www.fsf.org/about/contact/.   */ -#include <ouroboros/config.h> +#define _POSIX_C_SOURCE 200112L +  #include <ouroboros/utils.h>  #include <stdio.h> diff --git a/src/ipcpd/normal/ribmgr.c b/src/ipcpd/normal/ribmgr.c index ee81581f..ab2aa430 100644 --- a/src/ipcpd/normal/ribmgr.c +++ b/src/ipcpd/normal/ribmgr.c @@ -20,9 +20,10 @@   * Foundation, Inc., http://www.fsf.org/about/contact/.   */ +#define _POSIX_C_SOURCE 200112L +  #define OUROBOROS_PREFIX "rib-manager" -#include <ouroboros/config.h>  #include <ouroboros/logs.h>  #include <ouroboros/cdap.h>  #include <ouroboros/list.h> diff --git a/src/ipcpd/normal/routing.c b/src/ipcpd/normal/routing.c index 5bf985fb..c00ec67c 100644 --- a/src/ipcpd/normal/routing.c +++ b/src/ipcpd/normal/routing.c @@ -20,9 +20,10 @@   * Foundation, Inc., http://www.fsf.org/about/contact/.   */ +#define _POSIX_C_SOURCE 200112L +  #define OUROBOROS_PREFIX "routing" -#include <ouroboros/config.h>  #include <ouroboros/logs.h>  #include "routing.h" diff --git a/src/ipcpd/normal/sdu_sched.c b/src/ipcpd/normal/sdu_sched.c index b46f2563..f3550d5c 100644 --- a/src/ipcpd/normal/sdu_sched.c +++ b/src/ipcpd/normal/sdu_sched.c @@ -20,9 +20,12 @@   * Foundation, Inc., http://www.fsf.org/about/contact/.   */ +#define _POSIX_C_SOURCE 199309L + +#include "config.h" +  #define OUROBOROS_PREFIX "sdu-scheduler" -#include <ouroboros/config.h>  #include <ouroboros/logs.h>  #include <ouroboros/errno.h>  | 
