summaryrefslogtreecommitdiff
path: root/src/ipcpd/normal/routing.c
diff options
context:
space:
mode:
authorSander Vrijders <sander.vrijders@intec.ugent.be>2017-02-23 14:31:31 +0100
committerSander Vrijders <sander.vrijders@ugent.be>2017-03-03 11:20:40 +0100
commita409fd81dfc6d22f9a287f15394b86490dea5273 (patch)
treecec27d3c2064f0c0bcb564060d9d9012f819b22f /src/ipcpd/normal/routing.c
parent46c2f9d5363cdff2d99cf1b1c4a41c5bf97d2c03 (diff)
downloadouroboros-a409fd81dfc6d22f9a287f15394b86490dea5273.tar.gz
ouroboros-a409fd81dfc6d22f9a287f15394b86490dea5273.zip
ipcpd: normal: Refactor application entities and add neighbors struct
This refactors the different Application Entities of the normal IPCP. They all listen to and use the connection manager to establish new application connections. This commit also adds a neighbors struct to the normal IPCP. It contains neighbor structs that contain application connection. Notifiers can be registered in case a neighbor changes (added, removed, QoS changed). The flow manager has an instance of this neighbors struct and listens to these events to update its flow set. The routing component also listens to these events so that it can update the FSDB if needed. The flow manager now also creates the PFF instances and the routing instances per QoS cube. The RIB manager also uses this an instance of the neighbors struct and listens to neighbor events as well.
Diffstat (limited to 'src/ipcpd/normal/routing.c')
-rw-r--r--src/ipcpd/normal/routing.c132
1 files changed, 132 insertions, 0 deletions
diff --git a/src/ipcpd/normal/routing.c b/src/ipcpd/normal/routing.c
new file mode 100644
index 00000000..48c2c16d
--- /dev/null
+++ b/src/ipcpd/normal/routing.c
@@ -0,0 +1,132 @@
+/*
+ * Ouroboros - Copyright (C) 2016 - 2017
+ *
+ * Routing component of the IPCP
+ *
+ * Sander Vrijders <sander.vrijders@intec.ugent.be>
+ * Dimitri Staessens <dimitri.staessens@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.
+ */
+
+#define OUROBOROS_PREFIX "routing"
+
+#include <ouroboros/config.h>
+#include <ouroboros/errno.h>
+#include <ouroboros/list.h>
+#include <ouroboros/logs.h>
+
+#include "routing.h"
+#include "ribmgr.h"
+
+#include <assert.h>
+#include <stdlib.h>
+#include <inttypes.h>
+
+struct edge {
+ struct vertex * ep;
+ qosspec_t qs;
+};
+
+struct vertex {
+ struct list_head next;
+
+ uint64_t addr;
+
+ struct list_head edges;
+};
+
+struct routing {
+ struct pff * pff;
+ struct nbs * nbs;
+
+ struct nb_notifier nb_notifier;
+
+ struct list_head vertices;
+};
+
+static int routing_neighbor_event(enum nb_event event,
+ struct conn conn)
+{
+ (void) conn;
+
+ /* FIXME: React to events here */
+ switch (event) {
+ case NEIGHBOR_ADDED:
+ break;
+ case NEIGHBOR_REMOVED:
+ break;
+ case NEIGHBOR_QOS_CHANGE:
+ break;
+ default:
+ break;
+ }
+
+ return 0;
+}
+
+#if 0
+/* FIXME: If zeroed since it is not used currently */
+static int add_vertex(struct routing * instance,
+ uint64_t addr)
+{
+ struct vertex * vertex;
+
+ vertex = malloc(sizeof(*vertex));
+ if (vertex == NULL)
+ return -1;
+
+ list_head_init(&vertex->next);
+ list_head_init(&vertex->edges);
+ vertex->addr = addr;
+
+ list_add(&vertex->next, &instance->vertices);
+
+ return 0;
+}
+#endif
+
+struct routing * routing_create(struct pff * pff,
+ struct nbs * nbs)
+{
+ struct routing * tmp;
+
+ assert(pff);
+
+ tmp = malloc(sizeof(*tmp));
+ if (tmp == NULL)
+ return NULL;
+
+ tmp->pff = pff;
+ tmp->nbs = nbs;
+
+ list_head_init(&tmp->vertices);
+
+ tmp->nb_notifier.notify_call = routing_neighbor_event;
+ if (nbs_reg_notifier(tmp->nbs, &tmp->nb_notifier)) {
+ free(tmp);
+ return NULL;
+ }
+
+ return tmp;
+}
+
+void routing_destroy(struct routing * instance)
+{
+ assert(instance);
+
+ nbs_unreg_notifier(instance->nbs, &instance->nb_notifier);
+
+ free(instance);
+}