Fix weight comparison in edge BFS
[tinc] / src / graph.c
index 4de9181..c100a93 100644 (file)
@@ -64,7 +64,7 @@
 static void mst_kruskal(void) {
        /* Clear MST status on connections */
 
-       for list_each(connection_t, c, connection_list) {
+       for list_each(connection_t, c, &connection_list) {
                c->status.mst = false;
        }
 
@@ -72,13 +72,13 @@ static void mst_kruskal(void) {
 
        /* Clear visited status on nodes */
 
-       for splay_each(node_t, n, node_tree) {
+       for splay_each(node_t, n, &node_tree) {
                n->status.visited = false;
        }
 
        /* Starting point */
 
-       for splay_each(edge_t, e, edge_weight_tree) {
+       for splay_each(edge_t, e, &edge_weight_tree) {
                if(e->from->status.reachable) {
                        e->from->status.visited = true;
                        break;
@@ -89,7 +89,7 @@ static void mst_kruskal(void) {
 
        bool skipped = false;
 
-       for splay_each(edge_t, e, edge_weight_tree) {
+       for splay_each(edge_t, e, &edge_weight_tree) {
                if(!e->reverse || (e->from->status.visited == e->to->status.visited)) {
                        skipped = true;
                        continue;
@@ -110,21 +110,23 @@ static void mst_kruskal(void) {
 
                if(skipped) {
                        skipped = false;
-                       next = edge_weight_tree->head;
+                       next = edge_weight_tree.head;
                }
        }
 }
 
+// Not putting it into header, the outside world doesn't need to know about it.
+extern void sssp_bfs(void);
+
 /* Implementation of a simple breadth-first search algorithm.
    Running time: O(E)
 */
-
-static void sssp_bfs(void) {
+void sssp_bfs(void) {
        list_t *todo_list = list_alloc(NULL);
 
        /* Clear visited status on nodes */
 
-       for splay_each(node_t, n, node_tree) {
+       for splay_each(node_t, n, &node_tree) {
                n->status.visited = false;
                n->status.indirect = true;
                n->distance = -1;
@@ -149,7 +151,7 @@ static void sssp_bfs(void) {
                        abort();
                }
 
-               for splay_each(edge_t, e, n->edge_tree) {       /* "e" is the edge connected to "from" */
+               for splay_each(edge_t, e, &n->edge_tree) {       /* "e" is the edge connected to "from" */
                        if(!e->reverse || e->to == myself) {
                                continue;
                        }
@@ -181,7 +183,7 @@ static void sssp_bfs(void) {
 
                        // Only update nexthop if it doesn't increase the path length
 
-                       if(!e->to->status.visited || (e->to->distance == n->distance + 1 && e->weight >= e->to->prevedge->weight)) {
+                       if(!e->to->status.visited || (e->to->distance == n->distance + 1 && e->weight < e->to->prevedge->weight)) {
                                e->to->nexthop = (n->nexthop == myself) ? e->to : n->nexthop;
                        }
 
@@ -213,7 +215,7 @@ static void check_reachability(void) {
        int became_reachable_count = 0;
        int became_unreachable_count = 0;
 
-       for splay_each(node_t, n, node_tree) {
+       for splay_each(node_t, n, &node_tree) {
                if(n->status.visited != n->status.reachable) {
                        n->status.reachable = !n->status.reachable;
                        n->last_state_change = now.tv_sec;
@@ -307,7 +309,7 @@ static void check_reachability(void) {
 }
 
 void graph(void) {
-       subnet_cache_flush();
+       subnet_cache_flush_tables();
        sssp_bfs();
        check_reachability();
        mst_kruskal();