summaryrefslogtreecommitdiff
path: root/src/ipcpd/normal
diff options
context:
space:
mode:
Diffstat (limited to 'src/ipcpd/normal')
-rw-r--r--src/ipcpd/normal/CMakeLists.txt11
-rw-r--r--src/ipcpd/normal/addr_auth.c1
-rw-r--r--src/ipcpd/normal/connmgr.c164
-rw-r--r--src/ipcpd/normal/dht.c5
-rw-r--r--src/ipcpd/normal/dir.c3
-rw-r--r--src/ipcpd/normal/dt.c5
-rw-r--r--src/ipcpd/normal/dt_pci.c1
-rw-r--r--src/ipcpd/normal/enroll.c6
-rw-r--r--src/ipcpd/normal/fa.c5
-rw-r--r--src/ipcpd/normal/gam.c3
-rw-r--r--src/ipcpd/normal/main.c7
-rw-r--r--src/ipcpd/normal/neighbors.c3
-rw-r--r--src/ipcpd/normal/pff.c5
-rw-r--r--src/ipcpd/normal/pol/complete.c3
-rw-r--r--src/ipcpd/normal/pol/flat.c3
-rw-r--r--src/ipcpd/normal/pol/graph.c3
-rw-r--r--src/ipcpd/normal/pol/link_state.c3
-rw-r--r--src/ipcpd/normal/pol/tests/graph_test.c3
-rw-r--r--src/ipcpd/normal/ribmgr.c3
-rw-r--r--src/ipcpd/normal/routing.c3
-rw-r--r--src/ipcpd/normal/sdu_sched.c5
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>