summaryrefslogtreecommitdiff
path: root/src/ipcpd/normal
diff options
context:
space:
mode:
Diffstat (limited to 'src/ipcpd/normal')
-rw-r--r--src/ipcpd/normal/graph.c38
-rw-r--r--src/ipcpd/normal/graph.h2
-rw-r--r--src/ipcpd/normal/routing.c4
3 files changed, 37 insertions, 7 deletions
diff --git a/src/ipcpd/normal/graph.c b/src/ipcpd/normal/graph.c
index 5fd6fcb6..5de7c15b 100644
--- a/src/ipcpd/normal/graph.c
+++ b/src/ipcpd/normal/graph.c
@@ -1,7 +1,7 @@
/*
* Ouroboros - Copyright (C) 2016 - 2017
*
- * Graph structure
+ * Undirected graph structure
*
* Dimitri Staessens <[email protected]>
* Sander Vrijders <[email protected]>
@@ -205,6 +205,7 @@ int graph_update_edge(struct graph * graph,
struct vertex * v;
struct edge * e;
struct vertex * nb;
+ struct edge * nb_e;
assert(graph);
@@ -237,9 +238,9 @@ int graph_update_edge(struct graph * graph,
e = add_edge(v, nb);
if (e == NULL) {
if (list_is_empty(&v->edges))
- del_vertex(graph, v);
+ del_vertex(graph, v);
if (list_is_empty(&nb->edges))
- del_vertex(graph, v);
+ del_vertex(graph, nb);
pthread_mutex_unlock(&graph->lock);
log_err("Failed to add edge.");
return -ENOMEM;
@@ -248,6 +249,23 @@ int graph_update_edge(struct graph * graph,
e->qs = qs;
+ nb_e = find_edge_by_addr(nb, s_addr);
+ if (nb_e == NULL) {
+ nb_e = add_edge(nb, v);
+ if (nb_e == NULL) {
+ del_edge(e);
+ if (list_is_empty(&v->edges))
+ del_vertex(graph, v);
+ if (list_is_empty(&nb->edges))
+ del_vertex(graph, nb);
+ pthread_mutex_unlock(&graph->lock);
+ log_err("Failed to add edge.");
+ return -ENOMEM;
+ }
+ }
+
+ nb_e->qs = qs;
+
pthread_mutex_unlock(&graph->lock);
return 0;
@@ -260,6 +278,7 @@ int graph_del_edge(struct graph * graph,
struct vertex * v;
struct edge * e;
struct vertex * nb;
+ struct edge * nb_e;
assert(graph);
@@ -286,14 +305,21 @@ int graph_del_edge(struct graph * graph,
return -1;
}
+ nb_e = find_edge_by_addr(nb, s_addr);
+ if (nb_e == NULL) {
+ pthread_mutex_unlock(&graph->lock);
+ log_err("No such edge.");
+ return -1;
+ }
+
del_edge(e);
+ del_edge(nb_e);
/* Removing vertex if it was the last edge */
if (list_is_empty(&v->edges))
- del_vertex(graph, v);
-
+ del_vertex(graph, v);
if (list_is_empty(&nb->edges))
- del_vertex(graph, v);
+ del_vertex(graph, nb);
pthread_mutex_unlock(&graph->lock);
diff --git a/src/ipcpd/normal/graph.h b/src/ipcpd/normal/graph.h
index 70be8626..44496bc3 100644
--- a/src/ipcpd/normal/graph.h
+++ b/src/ipcpd/normal/graph.h
@@ -1,7 +1,7 @@
/*
* Ouroboros - Copyright (C) 2016 - 2017
*
- * Graph structure
+ * Undirected graph structure
*
* Dimitri Staessens <[email protected]>
* Sander Vrijders <[email protected]>
diff --git a/src/ipcpd/normal/routing.c b/src/ipcpd/normal/routing.c
index bf736311..bd41b489 100644
--- a/src/ipcpd/normal/routing.c
+++ b/src/ipcpd/normal/routing.c
@@ -157,6 +157,10 @@ static int routing_neighbor_event(enum nb_event event,
size_t len;
uint8_t * data;
+ /* Only announce the flow if our address is bigger */
+ if (ipcpi.dt_addr < conn.conn_info.addr)
+ return 0;
+
path[0] = '\0';
sprintf(fso_name, "%" PRIu64 "-%" PRIu64,
ipcpi.dt_addr, conn.conn_info.addr);