summaryrefslogtreecommitdiff
path: root/src/ipcpd/normal/pol/complete.c
diff options
context:
space:
mode:
authordimitri staessens <dimitri.staessens@intec.ugent.be>2017-02-06 16:05:44 +0100
committerdimitri staessens <dimitri.staessens@intec.ugent.be>2017-02-06 20:04:34 +0100
commit373efaf24d3600fe4dadf6bfaaee8d19e2ec32d7 (patch)
tree8711a4edbc2a6defaab63f0dcc2b0690252307b4 /src/ipcpd/normal/pol/complete.c
parent4b11f952c521315883f64571e1790389e8d20f64 (diff)
downloadouroboros-373efaf24d3600fe4dadf6bfaaee8d19e2ec32d7.tar.gz
ouroboros-373efaf24d3600fe4dadf6bfaaee8d19e2ec32d7.zip
ipcpd, lib: Revise normal IPCP
This PR updates the normal IPCP to use the new RIB. The old ribmgr is removed and replaced by a stub that needs to be implemented. All components (dir, fmgr, frct) were adapted to the new RIB API. A lot of functionality was moved outside of the ribmgr, such as the addr_auth, which is now a component of the IPCP. The address is also stored to the ipcpi struct. The irm tool has an option to set the gam policy of the rib manager.
Diffstat (limited to 'src/ipcpd/normal/pol/complete.c')
-rw-r--r--src/ipcpd/normal/pol/complete.c103
1 files changed, 47 insertions, 56 deletions
diff --git a/src/ipcpd/normal/pol/complete.c b/src/ipcpd/normal/pol/complete.c
index 89e1b91f..f85fd749 100644
--- a/src/ipcpd/normal/pol/complete.c
+++ b/src/ipcpd/normal/pol/complete.c
@@ -26,16 +26,14 @@
#include <ouroboros/logs.h>
#include <ouroboros/list.h>
#include <ouroboros/qos.h>
+#include <ouroboros/rib.h>
-#include "pathname.h"
-#include "ro.h"
#include "ipcp.h"
#include "gam.h"
#include <string.h>
#include <stdlib.h>
-
-#define RO_DIR "neighbors"
+#include <assert.h>
struct neighbor {
struct list_head next;
@@ -56,73 +54,39 @@ static void * allocator(void * o)
qosspec_t qs;
ssize_t len;
char ** children;
- int i;
- char * ro_name;
+ ssize_t i;
struct complete * complete = (struct complete *) o;
+ assert(complete);
+ assert(complete->gam);
+
qs.delay = 0;
qs.jitter = 0;
- ro_name = pathname_create(RO_DIR);
- if (ro_name == NULL)
- return (void *) -1;
-
- len = ro_children(ro_name, &children);
- if (len > 0) {
- for (i = 0; i < len; i++) {
- if (strcmp(children[i], ipcpi.name) == 0)
- continue;
+ /* FIXME: subscribe to members to keep the graph complete. */
+ len = rib_children("/" MEMBERS_NAME, &children);
+ for (i = 0; i < len; ++i) {
+ if (strcmp(children[i], ipcpi.name) < 0)
gam_flow_alloc(complete->gam, children[i], qs);
- }
+ free(children[i]);
}
- pathname_destroy(ro_name);
+ if (len > 0)
+ free(children);
return (void *) 0;
}
void * complete_create(struct gam * gam)
{
- struct ro_attr attr;
- char * ro_name;
struct complete * complete;
- ro_attr_init(&attr);
- attr.enrol_sync = true;
- attr.recv_set = ALL_MEMBERS;
+ assert(gam);
complete = malloc(sizeof(*complete));
if (complete == NULL)
return NULL;
- ro_name = pathname_create(RO_DIR);
- if (ro_name == NULL) {
- free(complete);
- return NULL;
- }
-
- if (!ro_exists(RO_DIR)) {
- if (ro_create(ro_name, &attr, NULL, 0)) {
- free(complete);
- pathname_destroy(ro_name);
- return NULL;
- }
- }
-
- ro_name = pathname_append(ro_name, ipcpi.name);
- if (ro_name == NULL) {
- free(complete);
- pathname_destroy(ro_name);
- return NULL;
- }
-
- if (ro_create(ro_name, &attr, NULL, 0)) {
- free(complete);
- pathname_destroy(ro_name);
- return NULL;
- }
- pathname_destroy(ro_name);
-
list_head_init(&complete->neighbors);
complete->gam = gam;
@@ -131,14 +95,34 @@ void * complete_create(struct gam * gam)
return NULL;
}
+ return (void *) complete;
+}
+
+int complete_start(void * o)
+{
+ struct complete * complete = (struct complete *) o;
+
+ assert(complete);
+ assert(complete->gam);
+
if (pthread_create(&complete->allocator, NULL,
allocator, (void *) complete)) {
- free(complete);
pthread_mutex_destroy(&complete->neighbors_lock);
- return NULL;
+ free(complete);
+ return -1;
}
- return (void *) complete;
+ /* FIXME: Handle flooding of the flow allocator before detaching.*/
+ pthread_join(complete->allocator, NULL);
+
+ return 0;
+}
+
+int complete_stop(void * o)
+{
+ (void) o;
+
+ return 0;
}
void complete_destroy(void * o)
@@ -147,15 +131,16 @@ void complete_destroy(void * o)
struct list_head * n = NULL;
struct complete * complete = (struct complete *) o;
- pthread_cancel(complete->allocator);
- pthread_join(complete->allocator, NULL);
-
list_for_each_safe(p, n, &complete->neighbors) {
struct neighbor * e = list_entry(p, struct neighbor, next);
list_del(&e->next);
free(e->neighbor);
free(e);
}
+
+ pthread_mutex_destroy(&complete->neighbors_lock);
+
+ free(complete);
}
int complete_accept_new_flow(void * o)
@@ -175,6 +160,8 @@ int complete_accept_flow(void * o,
(void) qs;
+ assert(complete);
+
pthread_mutex_lock(&complete->neighbors_lock);
list_for_each(pos, &complete->neighbors) {
@@ -183,6 +170,10 @@ int complete_accept_flow(void * o,
pthread_mutex_unlock(&complete->neighbors_lock);
return -1;
}
+
+ assert(complete);
+ assert(&complete->neighbors_lock);
+ assert(pos->nxt);
}
n = malloc(sizeof(*n));